Skip to content

Commit e6698c0

Browse files
author
SqlRush
committed
Index native session files
1 parent d9a0f0a commit e6698c0

8 files changed

Lines changed: 278 additions & 4 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1456,7 +1456,7 @@ M7 补充:terminal input parser 和 configurable keybinding name parser 现在
14561456
- Chrome/computer-use/voice/native integrations。
14571457
- enterprise/gated/platform-specific behavior。
14581458

1459-
当前状态:已新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容,并已有安全 JSONL 读取、类型/模型过滤、汇总统计、deterministic trace/span id、JSON summary export 和 headless `/status show telemetry` trace/span 审计地基;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload、按文件替换 snapshot、按 LSP 空 diagnostics 语义清空旧文件诊断;同时会写出 session-scoped LSP manager status,按默认或显式 server definitions 解析 workspace/root marker/file extension 命中情况,将已匹配但未启动的 server 标为 `not_started`,并可通过 headless `/status show lsp` 审计 diagnostics 与 manager runtime state;LSP Content-Length framed JSON-RPC reader/writer 与 diagnostics stream processor 已能持续消费 `textDocument/publishDiagnostics` notification、捕获 initialize response capabilities 并更新 session snapshot;LSP server process lifecycle API 已可启动配置命令、消费 stdout framed diagnostics stream,并把 `running`/`exited`/`failed`、PID 和时间戳写回 manager status;LSP client handshake send path 已可向 server stdin 写入 `initialize`、`initialized` 和 `textDocument/didOpen` framed JSON-RPC,支持 root/client/document metadata 和 file URI/language 默认推断;conversation runner 在 `advanced.lsp=true` 且显式提供 server definitions 时,会自动启动 workspace 命中的 LSP server、发送 handshake/startup documents,并复用 session diagnostics/manager status 生命周期;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,提供 command/display/alias 安全解析,并可通过 headless `/status show bridge` 审计;bridge direct HTTP handler 已可复用同一 manifest/registry,提供 `/health`、`/manifest`、`/resolve` 和 `/execute` JSON 端点,执行前强制 bridge-safe 白名单并默认不回传展开后的 prompt 正文;bridge loopback-only direct listener 已有可嵌入启动/关闭 API,默认 `127.0.0.1:0`、拒绝非 loopback 地址,并支持可选 bearer/`X-Bridge-Token` token guard;bridge direct websocket JSON channel 已可通过 `/ws` 执行 `resolve`/`execute` 消息并复用同一白名单、token guard 和 prompt 正文不泄露策略;`advanced.nativeIntegrations=true` 时会写出 session-scoped native capability manifest,记录平台和安全能力状态,并可通过 headless `/status show native` 审计;任一 `advanced.chrome`/`advanced.voice`/`advanced.computerUse=true` 时会写出 session-scoped integrations manifest,将 Chrome/voice/computer-use 的 enabled 与 `runtime_state` 分开记录,当前启用项明确标为 `not_wired`,并可通过 headless `/status show integrations` 审计;未启用时仍不注册或泄露 gated 工具 schema。实际 session websocket/direct connect 外部接入、默认 LSP server 自动发现启动策略、telemetry external exporter/backend、Chrome/voice/computer-use/native runtime 仍未完成。
1459+
当前状态:已新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容,并已有安全 JSONL 读取、类型/模型过滤、汇总统计、deterministic trace/span id、JSON summary export 和 headless `/status show telemetry` trace/span 审计地基;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload、按文件替换 snapshot、按 LSP 空 diagnostics 语义清空旧文件诊断;同时会写出 session-scoped LSP manager status,按默认或显式 server definitions 解析 workspace/root marker/file extension 命中情况,将已匹配但未启动的 server 标为 `not_started`,并可通过 headless `/status show lsp` 审计 diagnostics 与 manager runtime state;LSP Content-Length framed JSON-RPC reader/writer 与 diagnostics stream processor 已能持续消费 `textDocument/publishDiagnostics` notification、捕获 initialize response capabilities 并更新 session snapshot;LSP server process lifecycle API 已可启动配置命令、消费 stdout framed diagnostics stream,并把 `running`/`exited`/`failed`、PID 和时间戳写回 manager status;LSP client handshake send path 已可向 server stdin 写入 `initialize`、`initialized` 和 `textDocument/didOpen` framed JSON-RPC,支持 root/client/document metadata 和 file URI/language 默认推断;conversation runner 在 `advanced.lsp=true` 且显式提供 server definitions 时,会自动启动 workspace 命中的 LSP server、发送 handshake/startup documents,并复用 session diagnostics/manager status 生命周期;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,提供 command/display/alias 安全解析,并可通过 headless `/status show bridge` 审计;bridge direct HTTP handler 已可复用同一 manifest/registry,提供 `/health`、`/manifest`、`/resolve` 和 `/execute` JSON 端点,执行前强制 bridge-safe 白名单并默认不回传展开后的 prompt 正文;bridge loopback-only direct listener 已有可嵌入启动/关闭 API,默认 `127.0.0.1:0`、拒绝非 loopback 地址,并支持可选 bearer/`X-Bridge-Token` token guard;bridge direct websocket JSON channel 已可通过 `/ws` 执行 `resolve`/`execute` 消息并复用同一白名单、token guard 和 prompt 正文不泄露策略;`advanced.nativeIntegrations=true` 时会写出 session-scoped native capability manifest 和 native file index,只记录路径/大小/mtime 等文件元数据、跳过常见 runtime/vendor 目录,并可通过 headless `/status show native` 审计 index 路径与文件数量;任一 `advanced.chrome`/`advanced.voice`/`advanced.computerUse=true` 时会写出 session-scoped integrations manifest,将 Chrome/voice/computer-use 的 enabled 与 `runtime_state` 分开记录,当前启用项明确标为 `not_wired`,并可通过 headless `/status show integrations` 审计;未启用时仍不注册或泄露 gated 工具 schema。实际 session websocket/direct connect 外部接入、默认 LSP server 自动发现启动策略、telemetry external exporter/backend、Chrome/voice/computer-use runtime,以及 native clipboard/color diff 等平台 runtime 仍未完成。
14601460

14611461
## Recommended Next Steps
14621462

docs/claude-code-go-rewrite-plan.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,7 @@ test/parity/ # golden tests against TS/official behavior
745745
- 每个 gated feature 独立开关测试。
746746
- 不启用 feature 时二进制行为和可见 schema 不泄露 gated 工具/命令。
747747

748-
- 本轮补充:新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容,并已有安全 JSONL 读取、类型/模型过滤、汇总统计、deterministic trace/span id、JSON summary export 和 headless `/status show telemetry` trace/span 审计地基;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload、按文件替换 snapshot、按 LSP 空 diagnostics 语义清空旧文件诊断;同时会写出 session-scoped LSP manager status,按默认或显式 server definitions 解析 workspace/root marker/file extension 命中情况,将已匹配但未启动的 server 标为 `not_started`,并可通过 headless `/status show lsp` 审计 diagnostics 与 manager runtime state;LSP Content-Length framed JSON-RPC reader/writer 与 diagnostics stream processor 已能持续消费 `textDocument/publishDiagnostics` notification、捕获 initialize response capabilities 并更新 session snapshot;LSP server process lifecycle API 已可启动配置命令、消费 stdout framed diagnostics stream,并把 `running`/`exited`/`failed`、PID 和时间戳写回 manager status;LSP client handshake send path 已可向 server stdin 写入 `initialize`、`initialized` 和 `textDocument/didOpen` framed JSON-RPC,支持 root/client/document metadata 和 file URI/language 默认推断;conversation runner 在 `advanced.lsp=true` 且显式提供 server definitions 时,会自动启动 workspace 命中的 LSP server、发送 handshake/startup documents,并复用 session diagnostics/manager status 生命周期;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,提供 command/display/alias 安全解析,并可通过 headless `/status show bridge` 审计;bridge direct HTTP handler 已可复用同一 manifest/registry,提供 `/health`、`/manifest`、`/resolve` 和 `/execute` JSON 端点,执行前强制 bridge-safe 白名单并默认不回传展开后的 prompt 正文;bridge loopback-only direct listener 已有可嵌入启动/关闭 API,默认 `127.0.0.1:0`、拒绝非 loopback 地址,并支持可选 bearer/`X-Bridge-Token` token guard;bridge direct websocket JSON channel 已可通过 `/ws` 执行 `resolve`/`execute` 消息并复用同一白名单、token guard 和 prompt 正文不泄露策略;`advanced.nativeIntegrations=true` 时会写出 session-scoped native capability manifest,记录平台和安全能力状态,并可通过 headless `/status show native` 审计;任一 `advanced.chrome`/`advanced.voice`/`advanced.computerUse=true` 时会写出 session-scoped integrations manifest,将 Chrome/voice/computer-use 的 enabled 与 `runtime_state` 分开记录,当前启用项明确标为 `not_wired`,并可通过 headless `/status show integrations` 审计;未启用时仍不注册或泄露 gated 工具 schema。实际 session websocket/direct connect 外部接入、默认 LSP server 自动发现启动策略、telemetry external exporter/backend、Chrome/voice/computer-use/native runtime 仍未完成。
748+
- 本轮补充:新增 `advanced` settings gate 地基,覆盖 bridge/LSP/telemetry/Chrome/voice/computer-use/native integrations 的独立 bool 开关解析、settings merge、headless `/config show advanced` 和 `/config search` 审计;`advanced.telemetry=true` 时会在 session 目录写入安全摘要 JSONL 诊断事件,记录事件类型、session/model、tool/progress keys、token/compact/error 摘要,不写入用户/助手正文或工具结果内容,并已有安全 JSONL 读取、类型/模型过滤、汇总统计、deterministic trace/span id、JSON summary export 和 headless `/status show telemetry` trace/span 审计地基;`advanced.lsp=true` 时才向模型暴露只读 `LSPDiagnostics` 工具,用于读取 session-scoped diagnostics snapshot,并支持 file/severity/limit 过滤,底层已能解析 LSP `textDocument/publishDiagnostics` params/notification payload、按文件替换 snapshot、按 LSP 空 diagnostics 语义清空旧文件诊断;同时会写出 session-scoped LSP manager status,按默认或显式 server definitions 解析 workspace/root marker/file extension 命中情况,将已匹配但未启动的 server 标为 `not_started`,并可通过 headless `/status show lsp` 审计 diagnostics 与 manager runtime state;LSP Content-Length framed JSON-RPC reader/writer 与 diagnostics stream processor 已能持续消费 `textDocument/publishDiagnostics` notification、捕获 initialize response capabilities 并更新 session snapshot;LSP server process lifecycle API 已可启动配置命令、消费 stdout framed diagnostics stream,并把 `running`/`exited`/`failed`、PID 和时间戳写回 manager status;LSP client handshake send path 已可向 server stdin 写入 `initialize`、`initialized` 和 `textDocument/didOpen` framed JSON-RPC,支持 root/client/document metadata 和 file URI/language 默认推断;conversation runner 在 `advanced.lsp=true` 且显式提供 server definitions 时,会自动启动 workspace 命中的 LSP server、发送 handshake/startup documents,并复用 session diagnostics/manager status 生命周期;`advanced.bridge=true` 时会写出 session-scoped bridge manifest,列出 bridge-safe slash/local command 元数据,提供 command/display/alias 安全解析,并可通过 headless `/status show bridge` 审计;bridge direct HTTP handler 已可复用同一 manifest/registry,提供 `/health`、`/manifest`、`/resolve` 和 `/execute` JSON 端点,执行前强制 bridge-safe 白名单并默认不回传展开后的 prompt 正文;bridge loopback-only direct listener 已有可嵌入启动/关闭 API,默认 `127.0.0.1:0`、拒绝非 loopback 地址,并支持可选 bearer/`X-Bridge-Token` token guard;bridge direct websocket JSON channel 已可通过 `/ws` 执行 `resolve`/`execute` 消息并复用同一白名单、token guard 和 prompt 正文不泄露策略;`advanced.nativeIntegrations=true` 时会写出 session-scoped native capability manifest 和 native file index,只记录路径/大小/mtime 等文件元数据、跳过常见 runtime/vendor 目录,并可通过 headless `/status show native` 审计 index 路径与文件数量;任一 `advanced.chrome`/`advanced.voice`/`advanced.computerUse=true` 时会写出 session-scoped integrations manifest,将 Chrome/voice/computer-use 的 enabled 与 `runtime_state` 分开记录,当前启用项明确标为 `not_wired`,并可通过 headless `/status show integrations` 审计;未启用时仍不注册或泄露 gated 工具 schema。实际 session websocket/direct connect 外部接入、默认 LSP server 自动发现启动策略、telemetry external exporter/backend、Chrome/voice/computer-use runtime,以及 native clipboard/color diff 等平台 runtime 仍未完成。
749749

750750
### M12: Parity hardening
751751

internal/conversation/run.go

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,6 +798,13 @@ func (r Runner) maybeWriteNativeManifest() {
798798
return
799799
}
800800
_ = nativepkg.WriteManifest(path, nativepkg.BuildManifest(r.SessionID, r.WorkingDirectory))
801+
indexPath := nativepkg.SessionFileIndexPath(r.SessionPath, r.SessionID)
802+
if indexPath == "" || strings.TrimSpace(r.WorkingDirectory) == "" {
803+
return
804+
}
805+
if index, err := nativepkg.BuildFileIndex(r.SessionID, r.WorkingDirectory, nativepkg.FileIndexOptions{}); err == nil {
806+
_ = nativepkg.WriteFileIndex(indexPath, index)
807+
}
801808
}
802809

803810
func (r Runner) maybeWriteLSPManagerStatus() {
@@ -921,6 +928,19 @@ func (r Runner) formatStatusNative() string {
921928
fmt.Sprintf("Capabilities: %d", len(manifest.Capabilities)),
922929
fmt.Sprintf("Available capabilities: %d", nativepkg.CountAvailable(manifest.Capabilities)),
923930
)
931+
indexPath := nativepkg.SessionFileIndexPath(r.SessionPath, r.SessionID)
932+
if indexPath != "" {
933+
index, err := nativepkg.LoadFileIndex(indexPath)
934+
if err == nil && index.GeneratedAt != "" {
935+
lines = append(lines,
936+
"File index path: "+indexPath,
937+
fmt.Sprintf("Indexed files: %d", len(index.Files)),
938+
)
939+
if index.Truncated {
940+
lines = append(lines, "File index truncated: yes")
941+
}
942+
}
943+
}
924944
if manifest.Terminal != "" {
925945
lines = append(lines, "Terminal: "+manifest.Terminal)
926946
}

internal/conversation/run_test.go

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1918,6 +1918,9 @@ func TestRunnerStartsConfiguredLSPServer(t *testing.T) {
19181918
func TestRunnerWritesGatedNativeManifest(t *testing.T) {
19191919
client := &fakeClient{}
19201920
dir := t.TempDir()
1921+
if err := os.WriteFile(filepath.Join(dir, "main.go"), []byte("package main\n"), 0o644); err != nil {
1922+
t.Fatal(err)
1923+
}
19211924
transcriptPath := filepath.Join(dir, "session.jsonl")
19221925
nativeEnabled := true
19231926
runner := Runner{
@@ -1943,6 +1946,19 @@ func TestRunnerWritesGatedNativeManifest(t *testing.T) {
19431946
if len(manifest.Capabilities) == 0 || nativepkg.CountAvailable(manifest.Capabilities) == 0 {
19441947
t.Fatalf("manifest capabilities = %#v", manifest.Capabilities)
19451948
}
1949+
if !nativeCapabilityAvailable(manifest.Capabilities, "native_file_index", true) {
1950+
t.Fatalf("manifest capabilities = %#v", manifest.Capabilities)
1951+
}
1952+
index, err := nativepkg.LoadFileIndex(nativepkg.SessionFileIndexPath(transcriptPath, "sess_native"))
1953+
if err != nil {
1954+
t.Fatal(err)
1955+
}
1956+
if index.SessionID != "sess_native" || index.WorkingDirectory != dir || index.GeneratedAt == "" {
1957+
t.Fatalf("file index metadata = %#v", index)
1958+
}
1959+
if !nativeIndexHasPath(index.Files, "main.go") {
1960+
t.Fatalf("file index entries = %#v", index.Files)
1961+
}
19461962
}
19471963

19481964
func TestRunnerIntegrationsManifestDisabledByDefault(t *testing.T) {
@@ -5292,6 +5308,24 @@ func integrationHasState(integrations []integrationspkg.Integration, name string
52925308
return false
52935309
}
52945310

5311+
func nativeCapabilityAvailable(capabilities []nativepkg.Capability, name string, available bool) bool {
5312+
for _, capability := range capabilities {
5313+
if capability.Name == name && capability.Available == available {
5314+
return true
5315+
}
5316+
}
5317+
return false
5318+
}
5319+
5320+
func nativeIndexHasPath(files []nativepkg.FileEntry, path string) bool {
5321+
for _, file := range files {
5322+
if file.Path == path {
5323+
return true
5324+
}
5325+
}
5326+
return false
5327+
}
5328+
52955329
func lspServerStatus(servers []lsppkg.ServerStatus, name string) lsppkg.ServerStatus {
52965330
for _, server := range servers {
52975331
if server.Name == name {

0 commit comments

Comments
 (0)