Skip to content

Commit 26ba025

Browse files
author
SqlRush
committed
Add remote service registration state
1 parent 6efb538 commit 26ba025

11 files changed

Lines changed: 490 additions & 7 deletions

File tree

docs/cc-100-roadmap.md

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
| 文件工具 M5 初版 | 已完成文本版 `Read`、image Read 初版、notebook Read 初版、Read 大文本预算截断/落盘、`Write``Edit`,含读前写、mtime stale guard、`replace_all`、structured diff、`.claude/settings*.json` 写前校验、team-memory secret guard、Read 去重 |
3131
| M6 初始上下文层 | 已完成 CLAUDE.md/memdir 扫描、memory manifest、team-memory secret guard、compact threshold/prompt/runner/boundary plan、conversation auto-compact 接入、失败熔断、microcompact/cache 初版、persistent cached microcompact 初版、cache digest structural/rich-content metadata 覆盖、cache version/TTL/prune、in-memory micro cache prune、memory-cache write-through 到磁盘、atomic cache write、坏缓存默认 fail-open、session memory summary/frontmatter aliases/recall 初版、model-ranked recall session-id selection 和 invalid-selection fallback 初版、recall agent alternate/camel response keys/fenced-prose JSON extraction/scalar id parsing/nested/wrapped/collection-alias selection parsing、resume context model-assisted recall 接入、session memory rollup/prune compaction、rollup archive exclusion/merge、rune-safe rollup truncation、resume context + session memory recall、conversation recall 注入、deterministic/model-backed memory extraction 初版、extraction agent fenced-prose JSON/wrapped facts/provider-style response wrapper/alternate/structured field/nested source object/nested response/fact kind alias parsing、turn-end memory extraction 落盘、prompt history lock/buffered flush/field aliases、official subagent transcript layout、agent metadata sidecar/field aliases、sidechain runtime start/append/finish/cancel/fail 和 parent-chain append/finish 初版、sidechain manager orchestration 初版、sidechain manifest 聚合、sidechain state/list/resume/content-field aliases 初版、sidechain resume context builder、sidechain conversation/content-replacement reconstruction、transcript tail/window/metadata/index loaders、byte-budget transcript tail loader、agent-scoped content replacement metadata/record field-alias loading、session-scoped metadata reappend including AI-title/last-prompt/task-summary、transcript line offset index/window/byte-budget-window/parent-chain/resume/tail/byte-budget-tail loaders、extended transcript metadata entries/type/field aliases、transcript message/session UUID field aliases including top-level `messageUuid`/`messageId`/`id` record IDs and `role`/`entry_type`/`messageType`/`createdAt` timestamp aliases、transcript tombstone metadata delete/relink、transcript resume conversation builder、index 文本预览和 AI-title/last-prompt/task metadata 字段、流式 transcript 搜索、session list pagination/search/title、remote history token refresh、remote history 全量分页抓取/page-field/event-list/records/entries/eventList/sessionEvents/last-id/cursor/event-id/has-next alias/wrapped-data/links/paging/bare-array/keyed event map/connection/eventConnection/sessionEventsConnection wrapper response/edge-cursor fallback/max-pages 截断状态/before_id 续抓、remote event transcript materialization/fallback field fill/去重追加/duplicate parent guard、remote history 一步 sync 到 transcript |
3232
| M7 初始 TUI 层 | 已完成轻量 terminal frame renderer、PromptInput 状态机、history 导航、ctrl-p/ctrl-n history navigation、shift-enter 多行输入、多行 prompt 行内 ctrl-a/ctrl-e/ctrl-u/ctrl-k 和 wrap/render/cursor、共享 kill ring、ctrl-b/ctrl-f/ctrl-u/ctrl-k/ctrl-w 行编辑、alt-b/alt-f/alt-d/alt-backspace word 编辑、ctrl-left/ctrl-right/alt-left/alt-right word motion、ctrl-y yank 和 alt-y yank-pop 初版、reverse-search cursor/word 编辑/kill/yank/yank-pop 初版、ctrl-c interrupt/双击退出事件、ctrl-d delete-forward/空输入双击退出事件、ctrl-l 重绘事件、ctrl-o/ctrl-t 全局切换事件、ctrl-g/ctrl-s/ctrl-x chord chat 事件、reverse-search 状态/渲染/脚本断言/空结果/选择回填/cursor 断言、paste/image hint 输入和 OSC ST/base64 filename 兼容、text/image pasted-content 引用/metadata 脚本断言/提交展开/history entry restoration、SGR mouse 解析、alternate terminal navigation key sequences including modified Home/End/Delete/PageUp/PageDown、滚轮滚动、修饰键滚轮/左键、左键拖动选择、viewport 半页/顶部/底部可配置滚动、viewport 点击选择和 dialog action 点击、focus/blur 事件、resize 视口保持、keybinding resolver/config/chord pending/null-unbind/key/action camelCase alias、JSON config loader 和 focus/mouse/paste/image key name 覆盖、vim insert/normal/j/k/word/WORD/ge/gE/line-local ^/$/0/|/I/A/D/quote/bracket text-object/yank/register/paste/delete/count/replace/undo/find/till/repeat/matching-pair %/dot-repeat/G/gg/toggle/join/open-line/indent/substitute 动作、normal-mode arrow/backspace/delete 映射和 operator linewise/字符范围、REPL screen、permission/task dialog builder、dialog kind/id routing/runtime/status line、runtime 到 REPL screen 的 dialog/status 同步、runtime-aware interaction script runner、prompt text/cursor/expanded/vim mode/register/task state/dialog result/runtime mutation/task bulk-cancel/permission cancel/keybinding mutation/status negative/snapshot negative/screen size/event-sequence/event-count/no-event/dialog-result-count/no-dialog-result 脚本断言、viewport 脚本断言、named-key 脚本输入、script JSON/JSONL/wrapper loader、script file runner 和 runtime/task camel field aliases、stale dialog race guard、cancel active、permission id/all cancellation、queued permission promotion、active task dialog refresh、task lifecycle/bulk-cancel 初版、idempotent alternate screen lifecycle/reset/reassert interactive 初版、mouse/focus/bracketed-paste terminal mode lifecycle/reconciliation、ANSI snapshot 基础、snapshot corpus write/compare/script-file compare/missing-baseline/diff/batch/strict unexpected-baseline 状态、scripted interaction runner/assertions/multi-key/text/paste/image/pasted-content metadata 初版、status/dialog/message components、viewport/selection |
33-
| M10 Agents/tasks/worktree/remote | 已有 Task/TaskOutput/KillTask/SendMessage/TeamCreate/TeamDelete/TeamOutput/TeamSendMessage/TeamDispatch/TeamSchedule/TeamAutoSchedule/TeamCoordinate/ResumeTask/Sleep/Brief/ScheduleCron/RemoteTrigger 入口、sidechain metadata/lifecycle、task progress event、显式与 settings 默认 owned worktree 创建/清理、sparse/symlink settings 应用、`run:true` subagent nested tool loop、agent permission mode/allowlist 过滤,以及 session-scoped team/schedule/remote trigger manifest、daemon heartbeat CLI/state/status/stop/tick/start/restart 控制面审计和跨 session state discovery、remote service manifest 与 `/status show remote` discovery、ScheduleCron manual trigger/run_due/turn-start due tick、team coordinator_task_id 元数据、TeamOutput coordinator status、TeamSendMessage target routing、TeamDispatch individualized assignments、TeamSchedule deterministic member assignments、TeamAutoSchedule coordinator briefing + member assignments、coordinator briefing、structured handoff brief、remote trigger injection/event_id dedupe、bridge direct `/remote-trigger`/`/remote-service` HTTP endpoint、WebSocket `remote_trigger`/`remote_status`/`hello`/`health`/`manifest` action 和 remote_trigger/remote_service/websocket_protocol manifest capability;完整 CCR 云端长连接服务、多 agent 后台调度循环和模型驱动团队自动调度仍未完成 |
33+
| M10 Agents/tasks/worktree/remote | 已有 Task/TaskOutput/KillTask/SendMessage/TeamCreate/TeamDelete/TeamOutput/TeamSendMessage/TeamDispatch/TeamSchedule/TeamAutoSchedule/TeamCoordinate/ResumeTask/Sleep/Brief/ScheduleCron/RemoteTrigger 入口、sidechain metadata/lifecycle、task progress event、显式与 settings 默认 owned worktree 创建/清理、sparse/symlink settings 应用、`run:true` subagent nested tool loop、agent permission mode/allowlist 过滤,以及 session-scoped team/schedule/remote trigger manifest、daemon heartbeat CLI/state/status/stop/tick/start/restart 控制面审计和跨 session state discovery、remote service manifest 与 `/status show remote` discovery、remote registrationUrl/authToken 注册状态文件、ScheduleCron manual trigger/run_due/turn-start due tick、team coordinator_task_id 元数据、TeamOutput coordinator status、TeamSendMessage target routing、TeamDispatch individualized assignments、TeamSchedule deterministic member assignments、TeamAutoSchedule coordinator briefing + member assignments、coordinator briefing、structured handoff brief、remote trigger injection/event_id dedupe、bridge direct `/remote-trigger`/`/remote-service` HTTP endpoint、WebSocket `remote_trigger`/`remote_status`/`hello`/`health`/`manifest` action 和 remote_trigger/remote_service/websocket_protocol manifest capability;完整 CCR 云端长连接服务、多 agent 后台调度循环和模型驱动团队自动调度仍未完成 |
3434
| 全量测试 | 当前 `go test ./...` 通过 |
3535

3636
M10 补充:plugin command/agent 的 allowed tool frontmatter 解析现在只在顶层逗号或空白处分隔,保留括号、方括号和引号内的逗号/空白,避免 `Bash(git commit -m "x,y")` 这类 tool pattern 被误拆。
@@ -111,6 +111,8 @@ M10 补充:bridge direct WebSocket JSON 通道新增 `hello`/`health`/`manifes
111111

112112
M10 补充:bridge direct server 新增 `GET /remote-service` discovery endpoint 和 WebSocket `remote_status` action,返回同一份 session-scoped remote service manifest;bridge manifest、direct `/manifest` 响应和 `/status show bridge` 同步暴露 `remote_service` capability,远端控制端可通过 HTTP 或已鉴权 WebSocket 查询 bridge/daemon 服务状态。完整 CCR 云端注册和消息泵仍未完成。
113113

114+
M10 补充:remote settings 新增 `registrationUrl`/`authToken``advanced.bridge=true` 写出 remote service manifest 后会把 manifest POST 到注册 URL,并将 registered/failed/disabled、HTTP status、远端 session/websocket/poll 信息写入 session-scoped `remote-registration.json``/status show remote` 可审计注册状态且不泄露 token/query。完整 CCR 云端长连接和消息泵仍未完成。
115+
114116
M7 补充:interaction script paste payload 现在接受 ClipboardItem 风格的 `items[].getAsString`/`get_as_string` 以及 `stringData`/`textData` 文本字段,DOM clipboard 录制脚本可直接恢复 pasted text。
115117

116118
M7 补充:scripted task runtime payload 和 task expectation 现在接受 `taskID``jobId``runId``label``displayName``phase``taskState``message``currentStep``percent`/`percentage`/`pct` 等相邻字段,并支持数字 task ID 与数字字符串 progress。
@@ -1468,7 +1470,7 @@ M7 补充:terminal input parser 和 configurable keybinding name parser 现在
14681470
- remote CCR agent、team/swarm/coordinator。
14691471
- Task*
14701472

1471-
当前状态:已有 Task/TaskOutput/KillTask/SendMessage/TeamCreate/TeamDelete/TeamOutput/TeamSendMessage/TeamDispatch/TeamSchedule/TeamAutoSchedule/TeamCoordinate/ResumeTask/Sleep/Brief/ScheduleCron/RemoteTrigger 入口、sidechain metadata/lifecycle、team manifest、schedule manifest、remote trigger receipt manifest、daemon heartbeat CLI/state/status 审计、ScheduleCron manual trigger/run_due/turn-start due tick、team coordinator_task_id 元数据、TeamOutput coordinator status、TeamSendMessage target routing、TeamDispatch individualized assignments、TeamSchedule deterministic member assignments、TeamAutoSchedule coordinator briefing + member assignments、TeamCoordinate coordinator briefing、structured handoff brief、remote trigger injection/event_id dedupe、bridge direct `/remote-trigger`/`/remote-service` HTTP endpoint、WebSocket `remote_trigger`/`remote_status`/`hello`/`health`/`manifest` action、remote_trigger/remote_service/websocket_protocol manifest capability、task progress event、显式与 settings 默认 owned worktree 创建/清理、sparse/symlink settings 应用、`run:true` subagent nested tool loop、agent permission mode 应用、agent tool allowlist registry/permission pattern 过滤,以及 completed/failed/cancelled 终态 owned worktree 自动清理;完整远端连接服务、daemon 托管调度循环、多 agent 后台调度循环和模型驱动团队自动调度仍未完成。
1473+
当前状态:已有 Task/TaskOutput/KillTask/SendMessage/TeamCreate/TeamDelete/TeamOutput/TeamSendMessage/TeamDispatch/TeamSchedule/TeamAutoSchedule/TeamCoordinate/ResumeTask/Sleep/Brief/ScheduleCron/RemoteTrigger 入口、sidechain metadata/lifecycle、team manifest、schedule manifest、remote trigger receipt manifest、daemon heartbeat CLI/state/status 审计、ScheduleCron manual trigger/run_due/turn-start due tick、team coordinator_task_id 元数据、TeamOutput coordinator status、TeamSendMessage target routing、TeamDispatch individualized assignments、TeamSchedule deterministic member assignments、TeamAutoSchedule coordinator briefing + member assignments、TeamCoordinate coordinator briefing、structured handoff brief、remote trigger injection/event_id dedupe、remote service manifest、remote registrationUrl/authToken POST 注册状态、bridge direct `/remote-trigger`/`/remote-service` HTTP endpoint、WebSocket `remote_trigger`/`remote_status`/`hello`/`health`/`manifest` action、remote_trigger/remote_service/websocket_protocol manifest capability、task progress event、显式与 settings 默认 owned worktree 创建/清理、sparse/symlink settings 应用、`run:true` subagent nested tool loop、agent permission mode 应用、agent tool allowlist registry/permission pattern 过滤,以及 completed/failed/cancelled 终态 owned worktree 自动清理;完整远端连接服务、daemon 托管调度循环、多 agent 后台调度循环和模型驱动团队自动调度仍未完成。
14721474

14731475
### M11: Bridge, LSP, Telemetry, Advanced Integrations
14741476

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -744,6 +744,7 @@ test/parity/ # golden tests against TS/official behavior
744744
- 本轮补充:bridge manifest 新增 `remote_trigger` capability,声明 `/remote-trigger` HTTP path 和 `remote_trigger` WebSocket action;runner 写出的 session-scoped bridge manifest、direct `/manifest` 响应和 `/status show bridge` 都会暴露该能力,方便远端控制端发现可用入口。完整 CCR 能力协商仍未完成。
745745
- 本轮补充:bridge direct WebSocket JSON 通道新增 `hello`/`health`/`manifest` action,`hello` 会返回 protocol version、session、command count、capabilities 和可用 action 列表;bridge manifest 同时暴露 `websocket_protocol` capability,远端长连接客户端可在同一连接内完成能力握手。完整 CCR 云端长连接服务仍未完成。
746746
- 本轮补充:bridge direct server 新增 `GET /remote-service` discovery endpoint 和 WebSocket `remote_status` action,返回同一份 session-scoped remote service manifest;bridge manifest、direct `/manifest` 响应和 `/status show bridge` 同步暴露 `remote_service` capability,远端控制端可通过 HTTP 或已鉴权 WebSocket 查询 bridge/daemon 服务状态。完整 CCR 云端注册和消息泵仍未完成。
747+
- 本轮补充:remote settings 新增 `registrationUrl`/`authToken``advanced.bridge=true` 写出 remote service manifest 后会把 manifest POST 到注册 URL,并将 registered/failed/disabled、HTTP status、远端 session/websocket/poll 信息写入 session-scoped `remote-registration.json``/status show remote` 可审计注册状态且不泄露 token/query。完整 CCR 云端长连接和消息泵仍未完成。
747748

748749
### M11: Bridge 和高级集成
749750

internal/config/settings.go

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -220,8 +220,7 @@ func MergeSettings(settings ...contracts.Settings) contracts.Settings {
220220
}
221221
}
222222
if s.Remote != nil {
223-
cp := *s.Remote
224-
out.Remote = &cp
223+
out.Remote = mergeRemoteSetting(out.Remote, s.Remote)
225224
}
226225
if s.Advanced != nil {
227226
out.Advanced = mergeAdvancedSetting(out.Advanced, s.Advanced)
@@ -256,6 +255,30 @@ func cloneTelemetryExportSetting(setting *contracts.TelemetryExportSetting) *con
256255
return &cp
257256
}
258257

258+
func mergeRemoteSetting(base *contracts.RemoteSetting, override *contracts.RemoteSetting) *contracts.RemoteSetting {
259+
if override == nil {
260+
if base == nil {
261+
return nil
262+
}
263+
cp := *base
264+
return &cp
265+
}
266+
var out contracts.RemoteSetting
267+
if base != nil {
268+
out = *base
269+
}
270+
if override.DefaultEnvironmentID != "" {
271+
out.DefaultEnvironmentID = override.DefaultEnvironmentID
272+
}
273+
if override.RegistrationURL != "" {
274+
out.RegistrationURL = override.RegistrationURL
275+
}
276+
if override.AuthToken != "" {
277+
out.AuthToken = override.AuthToken
278+
}
279+
return &out
280+
}
281+
259282
func MergeSettingsSources(sources ...SourceSettings) contracts.Settings {
260283
settings := make([]contracts.Settings, 0, len(sources))
261284
for _, source := range sources {

internal/config/settings_test.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,10 @@ func TestMergeSettings(t *testing.T) {
116116
"X-Old": "old",
117117
},
118118
},
119+
Remote: &contracts.RemoteSetting{
120+
DefaultEnvironmentID: "env-base",
121+
AuthToken: "base-token",
122+
},
119123
}
120124
b := contracts.Settings{
121125
Env: map[string]string{"A": "2", "B": "3"},
@@ -139,6 +143,9 @@ func TestMergeSettings(t *testing.T) {
139143
"X-New": "new",
140144
},
141145
},
146+
Remote: &contracts.RemoteSetting{
147+
RegistrationURL: "https://example.com/register",
148+
},
142149
}
143150
merged := MergeSettings(a, b)
144151
if merged.Env["A"] != "2" || merged.Env["B"] != "3" {
@@ -169,6 +176,12 @@ func TestMergeSettings(t *testing.T) {
169176
merged.TelemetryExport.Headers["X-Old"] != "" {
170177
t.Fatalf("telemetry export = %#v", merged.TelemetryExport)
171178
}
179+
if merged.Remote == nil ||
180+
merged.Remote.DefaultEnvironmentID != "env-base" ||
181+
merged.Remote.RegistrationURL != "https://example.com/register" ||
182+
merged.Remote.AuthToken != "base-token" {
183+
t.Fatalf("remote = %#v", merged.Remote)
184+
}
172185
}
173186

174187
func TestMergeSettingsPreservesSandboxSettings(t *testing.T) {

internal/contracts/settings.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,8 @@ type PluginConfig struct {
114114

115115
type RemoteSetting struct {
116116
DefaultEnvironmentID string `json:"defaultEnvironmentId,omitempty"`
117+
RegistrationURL string `json:"registrationUrl,omitempty"`
118+
AuthToken string `json:"authToken,omitempty"`
117119
}
118120

119121
type TelemetryExportSetting struct {

internal/contracts/settings_json_test.go

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ func TestSettingsPreservesUnknownFields(t *testing.T) {
3232
}
3333

3434
func TestSettingsParsesAdvancedFeatureGates(t *testing.T) {
35-
input := []byte(`{"advanced":{"bridge":true,"lsp":false,"telemetry":true,"computerUse":true},"telemetryExport":{"path":"/tmp/events.jsonl","url":"https://example.com/telemetry","headers":{"Authorization":"Bearer token"}}}`)
35+
input := []byte(`{"advanced":{"bridge":true,"lsp":false,"telemetry":true,"computerUse":true},"telemetryExport":{"path":"/tmp/events.jsonl","url":"https://example.com/telemetry","headers":{"Authorization":"Bearer token"}},"remote":{"defaultEnvironmentId":"env-prod","registrationUrl":"https://example.com/register","authToken":"remote-token"}}`)
3636
var settings Settings
3737
if err := json.Unmarshal(input, &settings); err != nil {
3838
t.Fatal(err)
@@ -58,6 +58,15 @@ func TestSettingsParsesAdvancedFeatureGates(t *testing.T) {
5858
if settings.Extra["telemetryExport"] != nil {
5959
t.Fatalf("telemetryExport should be a known setting, extra = %#v", settings.Extra)
6060
}
61+
if settings.Remote == nil ||
62+
settings.Remote.DefaultEnvironmentID != "env-prod" ||
63+
settings.Remote.RegistrationURL != "https://example.com/register" ||
64+
settings.Remote.AuthToken != "remote-token" {
65+
t.Fatalf("remote = %#v", settings.Remote)
66+
}
67+
if settings.Extra["remote"] != nil {
68+
t.Fatalf("remote should be a known setting, extra = %#v", settings.Extra)
69+
}
6170
}
6271

6372
func TestSettingsParsesOfficialMCPPolicyEntries(t *testing.T) {

0 commit comments

Comments
 (0)