zcode-acp-server 0.1.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/README.md +192 -9
  2. package/README.zh-CN.md +143 -8
  3. package/dist/backend/client.d.ts +12 -4
  4. package/dist/backend/client.d.ts.map +1 -1
  5. package/dist/backend/client.js +72 -7
  6. package/dist/backend/client.js.map +1 -1
  7. package/dist/backend/credentials.d.ts.map +1 -1
  8. package/dist/backend/credentials.js +2 -1
  9. package/dist/backend/credentials.js.map +1 -1
  10. package/dist/backend/listener.d.ts +12 -4
  11. package/dist/backend/listener.d.ts.map +1 -1
  12. package/dist/backend/listener.js +68 -12
  13. package/dist/backend/listener.js.map +1 -1
  14. package/dist/backend/types.d.ts +1 -1
  15. package/dist/backend/types.d.ts.map +1 -1
  16. package/dist/bin/hub.d.ts +16 -0
  17. package/dist/bin/hub.d.ts.map +1 -0
  18. package/dist/bin/hub.js +41 -0
  19. package/dist/bin/hub.js.map +1 -0
  20. package/dist/bin/quota.d.ts +54 -0
  21. package/dist/bin/quota.d.ts.map +1 -0
  22. package/dist/bin/quota.js +333 -0
  23. package/dist/bin/quota.js.map +1 -0
  24. package/dist/config/auto-compact.d.ts +23 -0
  25. package/dist/config/auto-compact.d.ts.map +1 -0
  26. package/dist/config/auto-compact.js +67 -0
  27. package/dist/config/auto-compact.js.map +1 -0
  28. package/dist/config/mcp-discovery.d.ts +34 -0
  29. package/dist/config/mcp-discovery.d.ts.map +1 -0
  30. package/dist/config/mcp-discovery.js +153 -0
  31. package/dist/config/mcp-discovery.js.map +1 -0
  32. package/dist/config/model-cache.d.ts +12 -1
  33. package/dist/config/model-cache.d.ts.map +1 -1
  34. package/dist/config/model-cache.js +30 -8
  35. package/dist/config/model-cache.js.map +1 -1
  36. package/dist/config/options.d.ts +87 -9
  37. package/dist/config/options.d.ts.map +1 -1
  38. package/dist/config/options.js +248 -45
  39. package/dist/config/options.js.map +1 -1
  40. package/dist/config/plugin-commands.d.ts +24 -0
  41. package/dist/config/plugin-commands.d.ts.map +1 -0
  42. package/dist/config/plugin-commands.js +107 -0
  43. package/dist/config/plugin-commands.js.map +1 -0
  44. package/dist/config/provider-registry.d.ts +60 -0
  45. package/dist/config/provider-registry.d.ts.map +1 -0
  46. package/dist/config/provider-registry.js +128 -0
  47. package/dist/config/provider-registry.js.map +1 -0
  48. package/dist/config/runtime-model.d.ts +54 -18
  49. package/dist/config/runtime-model.d.ts.map +1 -1
  50. package/dist/config/runtime-model.js +105 -61
  51. package/dist/config/runtime-model.js.map +1 -1
  52. package/dist/config/skill-discovery.d.ts +35 -0
  53. package/dist/config/skill-discovery.d.ts.map +1 -0
  54. package/dist/config/skill-discovery.js +188 -0
  55. package/dist/config/skill-discovery.js.map +1 -0
  56. package/dist/handlers/account.d.ts +43 -0
  57. package/dist/handlers/account.d.ts.map +1 -0
  58. package/dist/handlers/account.js +59 -0
  59. package/dist/handlers/account.js.map +1 -0
  60. package/dist/handlers/background-tasks.d.ts +72 -0
  61. package/dist/handlers/background-tasks.d.ts.map +1 -0
  62. package/dist/handlers/background-tasks.js +330 -0
  63. package/dist/handlers/background-tasks.js.map +1 -0
  64. package/dist/handlers/dispatch.d.ts.map +1 -1
  65. package/dist/handlers/dispatch.js +134 -22
  66. package/dist/handlers/dispatch.js.map +1 -1
  67. package/dist/handlers/extensions.d.ts +15 -0
  68. package/dist/handlers/extensions.d.ts.map +1 -1
  69. package/dist/handlers/extensions.js +43 -27
  70. package/dist/handlers/extensions.js.map +1 -1
  71. package/dist/handlers/io.d.ts +31 -3
  72. package/dist/handlers/io.d.ts.map +1 -1
  73. package/dist/handlers/io.js +108 -9
  74. package/dist/handlers/io.js.map +1 -1
  75. package/dist/handlers/replay.d.ts +79 -0
  76. package/dist/handlers/replay.d.ts.map +1 -0
  77. package/dist/handlers/replay.js +252 -0
  78. package/dist/handlers/replay.js.map +1 -0
  79. package/dist/handlers/server-requests.d.ts +20 -4
  80. package/dist/handlers/server-requests.d.ts.map +1 -1
  81. package/dist/handlers/server-requests.js +293 -63
  82. package/dist/handlers/server-requests.js.map +1 -1
  83. package/dist/handlers/session.d.ts +113 -10
  84. package/dist/handlers/session.d.ts.map +1 -1
  85. package/dist/handlers/session.js +932 -277
  86. package/dist/handlers/session.js.map +1 -1
  87. package/dist/handlers/slash.d.ts +37 -1
  88. package/dist/handlers/slash.d.ts.map +1 -1
  89. package/dist/handlers/slash.js +143 -8
  90. package/dist/handlers/slash.js.map +1 -1
  91. package/dist/index.js +76 -12
  92. package/dist/index.js.map +1 -1
  93. package/dist/interaction/adapter.d.ts +19 -33
  94. package/dist/interaction/adapter.d.ts.map +1 -1
  95. package/dist/interaction/adapter.js +80 -79
  96. package/dist/interaction/adapter.js.map +1 -1
  97. package/dist/lazy-sessions.d.ts +35 -0
  98. package/dist/lazy-sessions.d.ts.map +1 -0
  99. package/dist/lazy-sessions.js +98 -0
  100. package/dist/lazy-sessions.js.map +1 -0
  101. package/dist/quota/cache.d.ts +18 -0
  102. package/dist/quota/cache.d.ts.map +1 -0
  103. package/dist/quota/cache.js +32 -0
  104. package/dist/quota/cache.js.map +1 -0
  105. package/dist/quota/client.d.ts +30 -0
  106. package/dist/quota/client.d.ts.map +1 -0
  107. package/dist/quota/client.js +57 -0
  108. package/dist/quota/client.js.map +1 -0
  109. package/dist/quota/color.d.ts +58 -0
  110. package/dist/quota/color.d.ts.map +1 -0
  111. package/dist/quota/color.js +95 -0
  112. package/dist/quota/color.js.map +1 -0
  113. package/dist/quota/combined.d.ts +66 -0
  114. package/dist/quota/combined.d.ts.map +1 -0
  115. package/dist/quota/combined.js +179 -0
  116. package/dist/quota/combined.js.map +1 -0
  117. package/dist/quota/format.d.ts +105 -0
  118. package/dist/quota/format.d.ts.map +1 -0
  119. package/dist/quota/format.js +219 -0
  120. package/dist/quota/format.js.map +1 -0
  121. package/dist/quota/index.d.ts +23 -0
  122. package/dist/quota/index.d.ts.map +1 -0
  123. package/dist/quota/index.js +42 -0
  124. package/dist/quota/index.js.map +1 -0
  125. package/dist/quota/opencode-go/cache.d.ts +17 -0
  126. package/dist/quota/opencode-go/cache.d.ts.map +1 -0
  127. package/dist/quota/opencode-go/cache.js +31 -0
  128. package/dist/quota/opencode-go/cache.js.map +1 -0
  129. package/dist/quota/opencode-go/client.d.ts +28 -0
  130. package/dist/quota/opencode-go/client.d.ts.map +1 -0
  131. package/dist/quota/opencode-go/client.js +48 -0
  132. package/dist/quota/opencode-go/client.js.map +1 -0
  133. package/dist/quota/opencode-go/config.d.ts +37 -0
  134. package/dist/quota/opencode-go/config.d.ts.map +1 -0
  135. package/dist/quota/opencode-go/config.js +58 -0
  136. package/dist/quota/opencode-go/config.js.map +1 -0
  137. package/dist/quota/opencode-go/format.d.ts +36 -0
  138. package/dist/quota/opencode-go/format.d.ts.map +1 -0
  139. package/dist/quota/opencode-go/format.js +87 -0
  140. package/dist/quota/opencode-go/format.js.map +1 -0
  141. package/dist/quota/opencode-go/index.d.ts +30 -0
  142. package/dist/quota/opencode-go/index.d.ts.map +1 -0
  143. package/dist/quota/opencode-go/index.js +108 -0
  144. package/dist/quota/opencode-go/index.js.map +1 -0
  145. package/dist/quota/opencode-go/parse.d.ts +41 -0
  146. package/dist/quota/opencode-go/parse.d.ts.map +1 -0
  147. package/dist/quota/opencode-go/parse.js +75 -0
  148. package/dist/quota/opencode-go/parse.js.map +1 -0
  149. package/dist/quota/opencode-go/types.d.ts +48 -0
  150. package/dist/quota/opencode-go/types.d.ts.map +1 -0
  151. package/dist/quota/opencode-go/types.js +11 -0
  152. package/dist/quota/opencode-go/types.js.map +1 -0
  153. package/dist/quota/parse.d.ts +33 -0
  154. package/dist/quota/parse.d.ts.map +1 -0
  155. package/dist/quota/parse.js +200 -0
  156. package/dist/quota/parse.js.map +1 -0
  157. package/dist/quota/types.d.ts +72 -0
  158. package/dist/quota/types.d.ts.map +1 -0
  159. package/dist/quota/types.js +10 -0
  160. package/dist/quota/types.js.map +1 -0
  161. package/dist/remote/broadcast.d.ts +47 -0
  162. package/dist/remote/broadcast.d.ts.map +1 -0
  163. package/dist/remote/broadcast.js +121 -0
  164. package/dist/remote/broadcast.js.map +1 -0
  165. package/dist/remote/config.d.ts +32 -0
  166. package/dist/remote/config.d.ts.map +1 -0
  167. package/dist/remote/config.js +65 -0
  168. package/dist/remote/config.js.map +1 -0
  169. package/dist/remote/endpoint.d.ts +30 -0
  170. package/dist/remote/endpoint.d.ts.map +1 -0
  171. package/dist/remote/endpoint.js +213 -0
  172. package/dist/remote/endpoint.js.map +1 -0
  173. package/dist/remote/hub-server.d.ts +41 -0
  174. package/dist/remote/hub-server.d.ts.map +1 -0
  175. package/dist/remote/hub-server.js +346 -0
  176. package/dist/remote/hub-server.js.map +1 -0
  177. package/dist/server.d.ts +139 -1
  178. package/dist/server.d.ts.map +1 -1
  179. package/dist/server.js +179 -4
  180. package/dist/server.js.map +1 -1
  181. package/dist/tasks-index.d.ts +14 -4
  182. package/dist/tasks-index.d.ts.map +1 -1
  183. package/dist/tasks-index.js +145 -46
  184. package/dist/tasks-index.js.map +1 -1
  185. package/dist/translators/event-translator.d.ts +33 -0
  186. package/dist/translators/event-translator.d.ts.map +1 -1
  187. package/dist/translators/event-translator.js +101 -0
  188. package/dist/translators/event-translator.js.map +1 -1
  189. package/dist/translators/index.d.ts +1 -1
  190. package/dist/translators/index.d.ts.map +1 -1
  191. package/dist/translators/index.js +1 -1
  192. package/dist/translators/index.js.map +1 -1
  193. package/dist/translators/projection-differ.d.ts +8 -0
  194. package/dist/translators/projection-differ.d.ts.map +1 -1
  195. package/dist/translators/projection-differ.js +19 -9
  196. package/dist/translators/projection-differ.js.map +1 -1
  197. package/dist/translators/tool-helpers.d.ts +28 -0
  198. package/dist/translators/tool-helpers.d.ts.map +1 -1
  199. package/dist/translators/tool-helpers.js +104 -0
  200. package/dist/translators/tool-helpers.js.map +1 -1
  201. package/dist/translators/types.d.ts +38 -1
  202. package/dist/translators/types.d.ts.map +1 -1
  203. package/dist/translators/types.js.map +1 -1
  204. package/dist/utils.d.ts +36 -7
  205. package/dist/utils.d.ts.map +1 -1
  206. package/dist/utils.js +69 -5
  207. package/dist/utils.js.map +1 -1
  208. package/docs/ARCHITECTURE.md +130 -40
  209. package/docs/BACKLOG.md +59 -0
  210. package/docs/DEVELOPMENT.md +31 -0
  211. package/docs/PROTOCOL.md +328 -23
  212. package/docs/REMOTE-CLIENTS.md +260 -0
  213. package/docs/REPLAY-GUIDE.md +131 -0
  214. package/docs/TROUBLESHOOTING.md +131 -14
  215. package/docs/adr/0001-bridge-lifetime-follows-primary-client.md +14 -0
  216. package/docs/adr/0002-stateless-hub-over-per-bridge-acp-endpoints.md +23 -0
  217. package/docs/adr/0003-tail-replay-meta-and-cursor-pagination.md +40 -0
  218. package/docs/agents/domain.md +51 -0
  219. package/docs/agents/issue-tracker.md +22 -0
  220. package/docs/agents/triage-labels.md +15 -0
  221. package/docs/proposals/0001-tail-session-replay.md +136 -0
  222. package/docs/proposals/0002-plan-quota-usage.md +81 -0
  223. package/package.json +10 -6
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # zcode-acp-server
2
2
 
3
- [![CI](https://github.com/zcode-org/zcode-acp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/zcode-org/zcode-acp-server/actions/workflows/ci.yml)
3
+ [![CI](https://github.com/william0wang/zcode-acp/actions/workflows/ci.yml/badge.svg)](https://github.com/william0wang/zcode-acp/actions/workflows/ci.yml)
4
4
  [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
5
5
 
6
6
  English | **[简体中文](README.zh-CN.md)**
@@ -11,7 +11,9 @@ The server launches the ZCode headless app-server (`zcode app-server --stdio`) a
11
11
 
12
12
  ## Status
13
13
 
14
- Early in-development. Core scaffolding is in place; features are landing incrementally. See the project board for progress.
14
+ In active development. Core bridging, slash commands and ZCode extensions,
15
+ auto-compaction, remote access for mobile/web clients, and the quota APIs are
16
+ in place; see the project board for what's next.
15
17
 
16
18
  ## Requirements
17
19
 
@@ -79,13 +81,173 @@ automatically. Point `ZCODE_BIN` at the bundled `zcode.cjs`:
79
81
 
80
82
  ## Environment variables
81
83
 
82
- | Variable | Default | Purpose |
83
- | ----------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
84
- | `ZCODE_BIN` | `zcode` | Path to the ZCode CLI binary or its `.cjs` entry |
85
- | `ZCODE_NODE` | _(discovered)_ | Explicit Node binary to run `ZCODE_BIN` with (must support `node:sqlite`) |
86
- | `ZCODE_MODEL` | _(from config)_ | Override the active model id |
87
- | `ZCODE_BASE_URL` | _(from config)_ | Override the provider base URL |
88
- | `ZCODE_ACP_DEBUG` | _(unset)_ | Set to `1` to enable verbose diagnostic logs (event flow, probe loops, status updates). Default is quiet only warnings (backend pipe errors, command/permission failures, lock timeouts) are emitted. Enable this when diagnosing bridge issues; the logs appear in `Zed.log` prefixed with `[zcode-acp]`. |
84
+ | Variable | Default | Purpose |
85
+ | ---------------------------------- | --------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
86
+ | `ZCODE_BIN` | `zcode` | Path to the ZCode CLI binary or its `.cjs` entry |
87
+ | `ZCODE_NODE` | _(discovered)_ | Explicit Node binary to run `ZCODE_BIN` with (must support `node:sqlite`) |
88
+ | `ZCODE_MODEL` | _(from config)_ | Override the active model id |
89
+ | `ZCODE_BASE_URL` | _(from config)_ | Override the provider base URL |
90
+ | `ZCODE_ACP_AUTO_COMPACT_THRESHOLD` | _(unset)_ | Absolute token count that triggers automatic context compaction. After each successful turn (`end_turn`), if `contextUsed >= threshold`, the server invokes `session/compact` to free up context before the next prompt. Set to `0` or leave unset to disable (default). Example: `240000` triggers compaction at 240K tokens. The compaction target itself is decided by the ZCode backend. |
91
+ | `ZCODE_ACP_DEBUG` | _(unset)_ | Set to `1` to enable verbose diagnostic logs (event flow, probe loops, status updates). Default is quiet — only warnings (backend pipe errors, command/permission failures, lock timeouts) are emitted. Enable this when diagnosing bridge issues; the logs appear in `Zed.log` prefixed with `[zcode-acp]`. |
92
+ | `ZCODE_ACP_REMOTE` | _(unset)_ | Set to `1` to enable [remote access](#remote-access) — serve the same sessions to additional ACP clients over WebSocket. |
93
+ | `ZCODE_ACP_REMOTE_TOKEN` | _(unset)_ | Auth token for remote access. **Mandatory** when `ZCODE_ACP_REMOTE=1`; remote stays disabled without it. |
94
+ | `ZCODE_ACP_HUB_PORT` | `8377` | Port of the machine-level `zcode-acp-hub`. Map exactly this one port in your tunnel. |
95
+ | `ZCODE_ACP_HUB_HOST` | `127.0.0.1` | Hub bind address. `0.0.0.0` exposes a token-only, unencrypted surface — only for a containerized tunnel agent on a private interface (see [Remote Access](#remote-access)). |
96
+ | `ZCODE_ACP_REMOTE_PORT` | `8378` | First loopback port for the bridge's ACP endpoint. Each bridge (each editor window) auto-increments to the next free port. |
97
+
98
+ ## Remote Access
99
+
100
+ With `ZCODE_ACP_REMOTE=1` the bridge additionally accepts ACP connections over
101
+ WebSocket, so a phone or browser can watch and drive the **same sessions** as
102
+ your editor. Zed (or any ACP editor over stdio) remains the primary client and
103
+ owns the process: when the editor disconnects, the bridge — and every remote
104
+ attachment — exits with it.
105
+
106
+ ```text
107
+ phone / browser ──WS── tunnel ── hub (127.0.0.1:8377, single entry)
108
+ │ byte-level proxy
109
+
110
+ bridge ACP endpoint (127.0.0.1:8378+n)
111
+ │ same AgentApp as stdio
112
+ Zed ──────── stdio ────────────────┘
113
+ ```
114
+
115
+ Enable it per-agent in Zed's settings (Zed merges these into the agent's
116
+ environment):
117
+
118
+ ```json
119
+ "agents": {
120
+ "ZCode": {
121
+ "command": "zcode-acp-server",
122
+ "env": {
123
+ "ZCODE_ACP_REMOTE": "1",
124
+ "ZCODE_ACP_REMOTE_TOKEN": "<a-long-random-secret>"
125
+ }
126
+ }
127
+ }
128
+ ```
129
+
130
+ **Hub.** The first bridge with remote enabled spawns `zcode-acp-hub` as a
131
+ detached, machine-level singleton on `ZCODE_ACP_HUB_PORT` (it can also be run
132
+ manually). It does three things only: token auth, instance discovery, and
133
+ byte-level WebSocket proxying — no session state, no ACP semantics. It exits
134
+ after ~10 idle minutes and is re-spawned on demand. Each bridge registers
135
+ every 10s as a heartbeat and drops out of discovery ~30s after it stops.
136
+
137
+ **Discovery API** (for client authors; fields are additive-only):
138
+
139
+ ```text
140
+ GET /api/instances → [{"id","port","pid","startedAt","workspace",
141
+ "sessions":[{"sessionId","title?","updatedAt"}]}]
142
+ GET /api/instances?probe=1 → same list, but unreachable bridges are pruned first
143
+ WS /acp?instance=<id> → proxied to that bridge's endpoint
144
+ ```
145
+
146
+ Auth is `Authorization: Bearer <token>` or `?token=` (browsers cannot set WS
147
+ headers); `/api/*` sends `Access-Control-Allow-Origin: *` — the token is the
148
+ security boundary. A proxied connection stays bound to one instance; switching
149
+ instances means reconnecting. Remote clients can also pull plan quota via the
150
+ non-standard `account/usage_stats` ACP method (no session required).
151
+
152
+ Building a remote client — web, mobile, or CLI? The full integration contract
153
+ (endpoints, framing, lifecycle timings, failure recovery, platform notes)
154
+ lives in [docs/REMOTE-CLIENTS.md](docs/REMOTE-CLIENTS.md).
155
+
156
+ **Semantics.** All agent notifications are broadcast to every client.
157
+ Permission / elicitation requests go to every client and the **first answer
158
+ wins**; losing clients receive `$/cancel_request` so their dialogs close.
159
+ Concurrent prompts for one session are serialized exactly as they are for a
160
+ single editor. Capabilities declared by any client are OR-merged.
161
+
162
+ **Tunnels.** Designed for one-port tunnels (Cloudflare Tunnel, frp): map the
163
+ hub port only. frp's `tcp` mode passes WebSocket as-is; Cloudflare Tunnel
164
+ drops idle WebSocket connections, so the hub sends 30s keepalive pings on both
165
+ legs. The bridge endpoint itself is loopback-only and never exposed.
166
+
167
+ **Binding beyond loopback.** The hub speaks plain HTTP/WS — the token travels
168
+ and authorizes in cleartext, so `ZCODE_ACP_HUB_HOST=0.0.0.0` (needed only when
169
+ the tunnel agent runs in its own container) is exactly as safe as the network
170
+ it lands on. Keep the bind loopback unless that interface is private to the
171
+ tunnel agent, and put TLS in front before mapping it anywhere untrusted.
172
+
173
+ ## Standalone Quota CLI
174
+
175
+ Besides the ACP server, the package ships a `zcode-quota` bin that queries
176
+ your usage **from the terminal** — no editor or running server needed. By
177
+ default it shows both **GLM Coding Plan** and **Opencode Go** in one card;
178
+ pass a provider to focus on one.
179
+
180
+ GLM credentials are read from `~/.zcode/v2/config.json`. Opencode Go
181
+ credentials come from environment variables (the dashboard needs a browser
182
+ cookie — see [Opencode Go setup](#opencode-go-setup) below).
183
+
184
+ ```bash
185
+ # Both providers (default): GLM + Opencode Go in one card
186
+ zcode-quota
187
+
188
+ # Focus on one provider
189
+ zcode-quota glm # GLM Coding Plan only
190
+ zcode-quota go # Opencode Go only (rolling + weekly + monthly)
191
+
192
+ # Live monitor: clear the screen and refresh every 30s (default)
193
+ zcode-quota -w
194
+ zcode-quota go -w # watch Opencode Go only
195
+
196
+ # Refresh at a custom interval (seconds; minimum 10)
197
+ zcode-quota --watch --interval 60
198
+
199
+ # Plain monochrome bars (color is the default on a terminal)
200
+ zcode-quota --plain
201
+ ```
202
+
203
+ By default the CLI renders heat-colored (green→yellow→red) progress bars with
204
+ the usage numbers overlaid inside the bar, so each line stays short. Pass
205
+ `--plain` (or `-p`) for the classic monochrome `█`/`░` layout. Color is also
206
+ disabled automatically when stdout is piped or redirected, so captured output
207
+ stays clean.
208
+
209
+ The watch mode clears and redraws the card in place, like `top`/`htop`. Press
210
+ `Ctrl-C` to exit. The 10s minimum exists because the quota API is cached for
211
+ 10s internally — a shorter interval would just keep returning the stale cached
212
+ value.
213
+
214
+ When the package isn't globally installed, run the built file directly:
215
+
216
+ ```bash
217
+ node dist/bin/quota.js -w
218
+ ```
219
+
220
+ ### Opencode Go setup
221
+
222
+ Opencode Go has no JSON API for subscription usage — the CLI scrapes the
223
+ authenticated dashboard at `opencode.ai/workspace/<id>/go`, so it needs your
224
+ browser `auth` cookie. Credentials are read from two sources, **merged
225
+ field-by-field with environment variables taking precedence** over the config
226
+ file:
227
+
228
+ - **Config file**: `~/.pi/agent/opencode-go.json` — same convention as the
229
+ `@beyona/pi-zai-usage` Pi extension, so if you already configured it there
230
+ you're done.
231
+ ```json
232
+ { "workspaceId": "wrk_your_workspace_id", "authCookie": "Fe26.2**your_cookie_value" }
233
+ ```
234
+ - **Environment variables** (override the matching file field):
235
+ ```bash
236
+ export OPENCODE_GO_WORKSPACE_ID="wrk_your_workspace_id"
237
+ export OPENCODE_GO_AUTH_COOKIE="Fe26.2**your_cookie_value"
238
+ ```
239
+
240
+ How to get the values:
241
+
242
+ 1. **Workspace ID** — open `https://opencode.ai`, navigate to your Go
243
+ workspace, and copy the `wrk_…` id from the URL
244
+ (`https://opencode.ai/workspace/<wrk_…>/go`).
245
+ 2. **Auth cookie** — open browser DevTools (F12) → Application → Cookies →
246
+ `opencode.ai` → copy the value of the cookie named `auth` (it starts with
247
+ `Fe26.2**`).
248
+
249
+ Without credentials, the default dual-provider mode silently shows GLM only
250
+ (no error). Running `zcode-quota go` without credentials prints a setup hint.
89
251
 
90
252
  ## ACP Registry
91
253
 
@@ -121,6 +283,8 @@ The server is organised in layers that mirror the ACP protocol:
121
283
  - `interaction/` — bridge ZCode `interaction/*` server requests to ACP, preferring `elicitation/create` and falling back to `session/request_permission` (tool auth, ExitPlanMode, AskUserQuestion)
122
284
  - `handlers/` — ACP method handlers (`session/new`, `session/prompt`, ...) and the turn engine
123
285
  - `config/` — model / mode / thought-level configOptions and runtime model switching
286
+ - `remote/` — opt-in remote access: loopback ACP endpoint, multi-client broadcast, `zcode-acp-hub` registration
287
+ - `quota/` — GLM Coding Plan / Opencode Go usage API client (`/quota` command, `zcode-quota` bin)
124
288
  - `server.ts` — shared state and handler registration
125
289
  - `index.ts` — stdio wiring via the ACP SDK
126
290
 
@@ -138,6 +302,8 @@ See [docs/ARCHITECTURE.md](docs/ARCHITECTURE.md) for the full architecture docum
138
302
 
139
303
  - [Architecture](docs/ARCHITECTURE.md) — event stream, dual-path deduplication, module responsibilities
140
304
  - [Protocol](docs/PROTOCOL.md) — ZCode JSON-RPC protocol details
305
+ - [Remote Clients](docs/REMOTE-CLIENTS.md) — remote access integration contract (discovery, transport, recovery)
306
+ - [Replay Guide](docs/REPLAY-GUIDE.md) — building a client UI on tail replay
141
307
  - [Development](docs/DEVELOPMENT.md) — local development, debugging, adding extension methods
142
308
  - [Troubleshooting](docs/TROUBLESHOOTING.md) — common-issue troubleshooting
143
309
 
@@ -157,6 +323,23 @@ recorded in [CHANGELOG.md](CHANGELOG.md).
157
323
  - [ZCode](https://zcode.z.ai) / [Zhipu Z.AI](https://z.ai) — the GLM model and ZCode CLI
158
324
  - [zcode-open-bridge](https://github.com/tizerluo/zcode-open-bridge) — reference implementation that informed this server's design
159
325
 
326
+ ## Privacy
327
+
328
+ **No telemetry or tracking** — the server reports nothing to anyone. The only
329
+ runtime dependency beyond the ACP SDK is `zod`.
330
+
331
+ Your prompts, code, and file contents are relayed between the editor and the
332
+ ZCode backend over **local pipes**; that data reaches the GLM cloud API only
333
+ because the ZCode backend itself sends it there for inference — this server
334
+ adds no extra destinations.
335
+
336
+ | Concern | What & why |
337
+ | ----------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
338
+ | Network | Only one outbound request in the whole codebase: the quota GET (`open.bigmodel.cn` / `api.z.ai`), carrying just your API key — needed to fetch your usage numbers, sends no user content |
339
+ | Credentials | API key read from `~/.zcode/v2/config.json` to authenticate the ZCode subprocess and quota request. Never logged, never written elsewhere. OAuth handled entirely by the ZCode subprocess |
340
+ | Disk | No new files created. Writes only to the existing `~/.zcode/v2/tasks-index.sqlite` — this **syncs sessions to the ZCode app** so they appear in its history list and full-text search (stores the session title and first prompt) |
341
+ | Logging | Diagnostics to stderr for troubleshooting bridge issues. Even with `ZCODE_ACP_DEBUG=1`, no prompts/code/keys are ever logged |
342
+
160
343
  ## License
161
344
 
162
345
  Apache-2.0. This project follows the same license as the upstream ACP specification.
package/README.zh-CN.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # zcode-acp-server
2
2
 
3
- [![CI](https://github.com/zcode-org/zcode-acp-server/actions/workflows/ci.yml/badge.svg)](https://github.com/zcode-org/zcode-acp-server/actions/workflows/ci.yml)
3
+ [![CI](https://github.com/william0wang/zcode-acp/actions/workflows/ci.yml/badge.svg)](https://github.com/william0wang/zcode-acp/actions/workflows/ci.yml)
4
4
  [![License: Apache-2.0](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](LICENSE)
5
5
 
6
6
  **[English](README.md)** | 简体中文
@@ -78,13 +78,133 @@ ZCode CLI 内置于桌面应用中,默认不会加到 `PATH`。用 `ZCODE_BIN`
78
78
 
79
79
  ## 环境变量
80
80
 
81
- | 变量 | 默认值 | 用途 |
82
- | ----------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
83
- | `ZCODE_BIN` | `zcode` | ZCode CLI 二进制文件路径或其 `.cjs` 入口 |
84
- | `ZCODE_NODE` | _(自动发现)_ | 显式指定运行 `ZCODE_BIN` 的 Node 二进制(必须支持 `node:sqlite`) |
85
- | `ZCODE_MODEL` | _(来自 config) | 覆盖当前使用的模型 id |
86
- | `ZCODE_BASE_URL` | _(来自 config) | 覆盖 provider 的 base URL |
87
- | `ZCODE_ACP_DEBUG` | _(未设置) | 设为 `1` 可开启详细诊断日志(事件流、探测循环、状态更新)。默认安静——只输出警告类日志(后端管道错误、命令/权限失败、锁等待超时)。诊断桥接问题时开启;日志出现在 `Zed.log` 中,前缀为 `[zcode-acp]`。 |
81
+ | 变量 | 默认值 | 用途 |
82
+ | ---------------------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
83
+ | `ZCODE_BIN` | `zcode` | ZCode CLI 二进制文件路径或其 `.cjs` 入口 |
84
+ | `ZCODE_NODE` | _(自动发现)_ | 显式指定运行 `ZCODE_BIN` 的 Node 二进制(必须支持 `node:sqlite`) |
85
+ | `ZCODE_MODEL` | _(来自 config) | 覆盖当前使用的模型 id |
86
+ | `ZCODE_BASE_URL` | _(来自 config) | 覆盖 provider 的 base URL |
87
+ | `ZCODE_ACP_AUTO_COMPACT_THRESHOLD` | _(未设置) | 触发自动压缩的绝对 token 阈值。每次回合成功完成后(`end_turn`),若 `contextUsed >= 阈值`,服务端会自动调用 `session/compact` 压缩上下文,为下一个 prompt 腾出空间。设为 `0` 或不设置则禁用(默认)。例如 `240000` 表示上下文达 24 万 token 时触发压缩。压缩目标由 ZCode 后端决定。 |
88
+ | `ZCODE_ACP_DEBUG` | _(未设置) | 设为 `1` 可开启详细诊断日志(事件流、探测循环、状态更新)。默认安静——只输出警告类日志(后端管道错误、命令/权限失败、锁等待超时)。诊断桥接问题时开启;日志出现在 `Zed.log` 中,前缀为 `[zcode-acp]`。 |
89
+ | `ZCODE_ACP_REMOTE` | _(未设置)_ | 设为 `1` 启用[远程访问](#远程访问)——通过 WebSocket 向更多 ACP 客户端提供相同会话。 |
90
+ | `ZCODE_ACP_REMOTE_TOKEN` | _(未设置)_ | 远程访问的鉴权 token。启用 `ZCODE_ACP_REMOTE=1` 时**必填**;缺失则远程保持禁用。 |
91
+ | `ZCODE_ACP_HUB_PORT` | `8377` | 机器级 `zcode-acp-hub` 的端口。隧道只映射这一个端口。 |
92
+ | `ZCODE_ACP_HUB_HOST` | `127.0.0.1` | hub 绑定地址。`0.0.0.0` 会暴露仅 token 保护的明文面——只用于容器化隧道 agent 所在的私网接口(见[远程访问](#远程访问))。 |
93
+ | `ZCODE_ACP_REMOTE_PORT` | `8378` | bridge ACP 端点的起始回环端口。每个 bridge(每个编辑器窗口)自动递增取下一个空闲端口。 |
94
+
95
+ ## 远程访问
96
+
97
+ 设置 `ZCODE_ACP_REMOTE=1` 后,bridge 会额外通过 WebSocket 接收 ACP 连接,
98
+ 手机或浏览器即可观看并驱动与编辑器**相同的会话**。Zed(或任何 stdio ACP
99
+ 编辑器)仍是主客户端并拥有进程:编辑器断开时,bridge 连同所有远程连接
100
+ 一起退出。
101
+
102
+ ```text
103
+ phone / browser ──WS── 隧道 ── hub (127.0.0.1:8377, 唯一入口)
104
+ │ 字节级代理
105
+
106
+ bridge ACP 端点 (127.0.0.1:8378+n)
107
+ │ 与 stdio 同一个 AgentApp
108
+ Zed ──────── stdio ────────────┘
109
+ ```
110
+
111
+ 启用方式:在上文「配置 Zed」的 `env` 里追加(Zed 会把这些合并进 agent
112
+ 的环境变量):
113
+
114
+ ```json
115
+ "ZCODE_ACP_REMOTE": "1",
116
+ "ZCODE_ACP_REMOTE_TOKEN": "<一段足够长的随机密钥>"
117
+ ```
118
+
119
+ 相关环境变量(详见上文表格):`ZCODE_ACP_REMOTE`(开关)、
120
+ `ZCODE_ACP_REMOTE_TOKEN`(必填 token)、`ZCODE_ACP_HUB_PORT`(hub 端口,
121
+ 默认 8377)、`ZCODE_ACP_HUB_HOST`(hub 绑定地址)、
122
+ `ZCODE_ACP_REMOTE_PORT`(bridge 端点起始端口,默认 8378)。
123
+
124
+ **Hub。** 第一个启用远程的 bridge 会以 detached 方式拉起机器级单例
125
+ `zcode-acp-hub`(监听 `ZCODE_ACP_HUB_PORT`,也可手动运行)。它只做三件事:
126
+ token 鉴权、实例发现、字节级 WebSocket 代理——不保存会话状态、不解析 ACP。
127
+ 空闲约 10 分钟后退出,需要时再被拉起。每个 bridge 每 10 秒注册一次作为
128
+ 心跳,心跳停止约 30 秒后从发现列表移除;客户端刷新时也可调用
129
+ `GET /api/instances?probe=1` 主动探测,立即清理不可达的实例。
130
+
131
+ **语义。** 所有 agent 通知广播给每个已连接客户端;权限 / elicitation 请求
132
+ 发给所有客户端,**先应答者生效**,其余客户端收到 `$/cancel_request` 关闭
133
+ 对话框。同一会话的并发 prompt 与单编辑器一样串行化。任一客户端声明的能力
134
+ 按 OR 合并。
135
+
136
+ **隧道。** 面向单端口隧道(Cloudflare Tunnel、frp)设计:只映射 hub 端口。
137
+ frp 的 `tcp` 模式原样透传 WebSocket;Cloudflare Tunnel 会断开空闲连接,
138
+ hub 因此在两段链路上每 30 秒发送 keepalive ping。bridge 端点本身只监听
139
+ 回环地址,永不直接暴露。
140
+
141
+ 要构建远程客户端(Web、移动端或 CLI)?完整的集成契约(端点、帧格式、
142
+ 生命周期时序、故障恢复、平台注意事项)见
143
+ [docs/REMOTE-CLIENTS.md](docs/REMOTE-CLIENTS.md)。
144
+
145
+ ## 独立配额查询 CLI(zcode-quota)
146
+
147
+ 除了 ACP server,本包还附带一个 `zcode-quota` 命令,可在**终端**里直接查询
148
+ 用量——无需编辑器,也无需 server 运行。默认在一张卡片里同时显示
149
+ **GLM Coding Plan** 和 **Opencode Go**;传入 provider 参数可只看其中一个。
150
+
151
+ GLM 凭证读取自 `~/.zcode/v2/config.json`。Opencode Go 凭证来自环境变量
152
+ (dashboard 需要浏览器 cookie——见下方 [Opencode Go 配置](#opencode-go-配置))。
153
+
154
+ ```bash
155
+ # 双平台(默认):GLM + Opencode Go 合并为一张卡片
156
+ zcode-quota
157
+
158
+ # 只看某一个 provider
159
+ zcode-quota glm # 仅 GLM Coding Plan
160
+ zcode-quota go # 仅 Opencode Go(rolling + weekly + monthly 三窗口)
161
+
162
+ # 常驻监控:清屏并每 30s 刷新(默认)
163
+ zcode-quota -w
164
+ zcode-quota go -w # 只监控 Opencode Go
165
+
166
+ # 自定义刷新间隔(秒,最小 10)
167
+ zcode-quota --watch --interval 60
168
+
169
+ # 纯文本单色进度条(终端默认是彩色)
170
+ zcode-quota --plain
171
+ ```
172
+
173
+ 默认情况下 CLI 会渲染热力配色(绿→黄→红)的进度条,并把用量数字叠在条内,
174
+ 这样每行更紧凑。传 `--plain`(或 `-p`)切回经典的 `█`/`░` 单色布局。当 stdout
175
+ 被管道或重定向时,彩色也会自动关闭,保证捕获到的输出干净。
176
+
177
+ watch 模式会原地清屏重绘卡片,效果类似 `top`/`htop`。按 `Ctrl-C` 退出。
178
+ 之所以设最小间隔 10s,是因为配额 API 内部有 10s 缓存——更短的间隔只会一直
179
+ 返回过期的缓存值,没有意义。
180
+
181
+ 未全局安装时,可直接运行构建产物:
182
+
183
+ ```bash
184
+ node dist/bin/quota.js -w
185
+ ```
186
+
187
+ ### Opencode Go 配置
188
+
189
+ Opencode Go 订阅用量没有 JSON API——CLI 抓取的是登录后的 dashboard 页面
190
+ `opencode.ai/workspace/<id>/go`,因此需要你的浏览器 `auth` cookie。设置两个
191
+ 环境变量:
192
+
193
+ ```bash
194
+ export OPENCODE_GO_WORKSPACE_ID="wrk_你的工作区id"
195
+ export OPENCODE_GO_AUTH_COOKIE="Fe26.2**你的cookie值"
196
+ ```
197
+
198
+ 获取方式:
199
+
200
+ 1. **Workspace ID**——打开 `https://opencode.ai`,进入你的 Go 工作区,从 URL
201
+ 里复制 `wrk_…` id(`https://opencode.ai/workspace/<wrk_…>/go`)。
202
+ 2. **Auth cookie**——打开浏览器开发者工具(F12)→ Application → Cookies →
203
+ `opencode.ai` → 复制名为 `auth` 的 cookie 值(以 `Fe26.2**` 开头)。
204
+
205
+ 未设置这两个变量时,默认的双平台模式会**静默退化为只显示 GLM**(不报错)。
206
+ 若明确运行 `zcode-quota go` 但未配置,会打印一条配置提示。把它们加到 shell
207
+ 配置文件(`~/.zshrc` / `~/.bashrc`)即可持久化。
88
208
 
89
209
  ## ACP Registry
90
210
 
@@ -154,6 +274,21 @@ commit 约定和 PR 检查清单。重要变更记录在 [CHANGELOG.md](CHANGELO
154
274
  - [ZCode](https://zcode.z.ai) / [智谱 Z.AI](https://z.ai) —— GLM 模型与 ZCode CLI
155
275
  - [zcode-open-bridge](https://github.com/tizerluo/zcode-open-bridge) —— 参考实现,本项目的设计借鉴了它的桥接架构
156
276
 
277
+ ## 隐私
278
+
279
+ **无遥测、无追踪** —— 本服务端不向任何方上报任何信息。除 ACP SDK 外唯一运行时依赖是
280
+ `zod`。
281
+
282
+ 你的提示词、代码、文件内容通过**本地管道**在编辑器与 ZCode 后端之间中转;这些数据会到达
283
+ GLM 云端 API,仅因 ZCode 后端本身为推理而发送——本服务端不增加任何额外去向。
284
+
285
+ | 方面 | 做什么 & 为什么 |
286
+ | ---- | ------------------------------------------------------------------------------------------------------------------------------------------------------------- |
287
+ | 网络 | 全代码库仅一处对外请求:配额 GET(`open.bigmodel.cn` / `api.z.ai`),只带 API key —— 为查询用量数字,不发送用户内容 |
288
+ | 凭据 | API key 从 `~/.zcode/v2/config.json` 读取,用于认证 ZCode 子进程和配额请求。从不记录日志、从不写入别处。OAuth 完全由 ZCode 子进程处理 |
289
+ | 磁盘 | 不创建任何新文件。只写入已存在的 `~/.zcode/v2/tasks-index.sqlite` —— 这是**将会话同步到 ZCode App**,使其出现在历史列表和全文搜索中(存会话标题和首条提示词) |
290
+ | 日志 | 诊断信息输出到 stderr,用于排查桥接问题。即使开启 `ZCODE_ACP_DEBUG=1`,也绝不记录提示词/代码/密钥 |
291
+
157
292
  ## 许可证
158
293
 
159
294
  Apache-2.0。本项目沿用上游 ACP 规范的同一许可证。
@@ -18,7 +18,7 @@ import { type ChildProcess } from "node:child_process";
18
18
  import type { ZcodeEvent, ZcodeInteractionPermissionParams, ZcodeInteractionUserInputParams, ZcodeResponse } from "./types.js";
19
19
  /** A server→client request that we must reply to. */
20
20
  export interface ServerRequest {
21
- id: number;
21
+ id: number | string;
22
22
  method: string;
23
23
  params: ZcodeInteractionPermissionParams | ZcodeInteractionUserInputParams | Record<string, unknown>;
24
24
  }
@@ -57,16 +57,24 @@ export declare class ZcodeBackend {
57
57
  private startWatchdog;
58
58
  private startReader;
59
59
  private route;
60
+ /** Deliver a ZcodeEvent to every listener registered for its session. */
61
+ private dispatchEvent;
60
62
  private resolvePending;
61
63
  private markReaderDead;
62
64
  registerEventListener(zcodeSid: string, listener: EventListener): void;
63
- unregisterEventListener(zcodeSid: string): void;
65
+ unregisterEventListener(zcodeSid: string, listener: EventListener): void;
64
66
  /** Non-blocking drain of pending server→client requests. */
65
67
  pollServerRequests(): ServerRequest[];
68
+ /**
69
+ * Re-queue server→client requests that belong to a different session (prepended
70
+ * to preserve arrival order). Used by `handleServerRequests` to put back
71
+ * requests it popped but doesn't own.
72
+ */
73
+ requeueServerRequests(reqs: ServerRequest[]): void;
66
74
  /** Reply to a zcode server→client request with a result (id + result). */
67
- sendReply(id: number, result: unknown): void;
75
+ sendReply(id: number | string, result: unknown): void;
68
76
  /** Reply to a zcode server→client request with an error. */
69
- sendError(id: number, code: number, message: string): void;
77
+ sendError(id: number | string, code: number, message: string): void;
70
78
  /** Fire-and-forget notification to ZCode (no id, no response). */
71
79
  notify(method: string, params?: Record<string, unknown>): void;
72
80
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/backend/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,KAAK,EACV,UAAU,EAEV,gCAAgC,EAChC,+BAA+B,EAC/B,aAAa,EACd,MAAM,YAAY,CAAC;AAQpB,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,CAAC;IACX,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EACJ,gCAAgC,GAAG,+BAA+B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChG;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACtC;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IACtD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAoC;IAC9D,OAAO,CAAC,UAAU,CAAS;IAC3B;sEACkE;IAClE,OAAO,CAAC,aAAa,CAAiB;IACtC,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU;IAmBlD;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,KAAK;IAiCb,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAgBtB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAItE,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI/C,4DAA4D;IAC5D,kBAAkB,IAAI,aAAa,EAAE;IAKrC,0EAA0E;IAC1E,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAY5C,4DAA4D;IAC5D,SAAS,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAW1D,kEAAkE;IAClE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAS9D;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAU5D;;;;;;OAMG;IACG,OAAO,CACX,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,SAAQ,GAChB,OAAO,CAAC,aAAa,CAAC;IA+BzB;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B,6DAA6D;IAC7D,OAAO,CAAC,YAAY;IAapB,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/backend/client.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAS,KAAK,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAK9D,OAAO,KAAK,EACV,UAAU,EAEV,gCAAgC,EAChC,+BAA+B,EAC/B,aAAa,EACd,MAAM,YAAY,CAAC;AAQpB,qDAAqD;AACrD,MAAM,WAAW,aAAa;IAC5B,EAAE,EAAE,MAAM,GAAG,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EACJ,gCAAgC,GAAG,+BAA+B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CAChG;AAED,8DAA8D;AAC9D,MAAM,WAAW,aAAa;IAC5B,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACtC;AAED,qBAAa,YAAY;IACvB,QAAQ,CAAC,IAAI,EAAE,YAAY,CAAC;IAC5B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAqC;IAC7D,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAuB;IAItD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAyC;IACnE,OAAO,CAAC,UAAU,CAAS;IAC3B;sEACkE;IAClE,OAAO,CAAC,aAAa,CAAiB;IACtC,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAA6B;gBAEjC,IAAI,EAAE,MAAM,EAAE,EAAE,GAAG,EAAE,MAAM,CAAC,UAAU;IAmBlD;;;;;;;;;;;;;;;OAeG;IACH,OAAO,CAAC,aAAa;IA+BrB,OAAO,CAAC,WAAW;IAqBnB,OAAO,CAAC,KAAK;IAwDb,yEAAyE;IACzE,OAAO,CAAC,aAAa;IAkBrB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,cAAc;IAgBtB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAStE,uBAAuB,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOxE,4DAA4D;IAC5D,kBAAkB,IAAI,aAAa,EAAE;IAKrC;;;;OAIG;IACH,qBAAqB,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI;IAKlD,0EAA0E;IAC1E,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAYrD,4DAA4D;IAC5D,SAAS,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI;IAWnE,kEAAkE;IAClE,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAS9D;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI;IAU5D;;;;;;OAMG;IACG,OAAO,CACX,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,MAAM,EACd,MAAM,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAChC,SAAS,SAAQ,GAChB,OAAO,CAAC,aAAa,CAAC;IA+BzB;;;;;;;;;OASG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAsC5B,6DAA6D;IAC7D,OAAO,CAAC,YAAY;IAapB,IAAI,MAAM,IAAI,OAAO,CAEpB;CACF"}
@@ -22,6 +22,9 @@ export class ZcodeBackend {
22
22
  proc;
23
23
  pending = new Map();
24
24
  serverRequests = [];
25
+ // Per-session listener SET so a long-lived session listener (e.g. background
26
+ // task monitor) can coexist with a per-turn EventStreamListener. Each event
27
+ // is delivered to every registered listener for the session.
25
28
  listeners = new Map();
26
29
  readerDead = false;
27
30
  /** Monotonic id for fire-and-forget sends (send()). Uses a high range to
@@ -128,6 +131,19 @@ export class ZcodeBackend {
128
131
  if (this.pending.has(id)) {
129
132
  this.resolvePending(id, msg);
130
133
  }
134
+ else if (method === "session/requestRuntimePreferences") {
135
+ // Newer app-servers block `session/create` until this handshake is
136
+ // answered. Reply with defaults — no editor interaction needed.
137
+ // Keep askUserQuestionAutoResolutionEnabled false so AskUserQuestion
138
+ // still flows through the bridge's interaction path instead of being
139
+ // auto-resolved server-side. Without this reply, create hangs.
140
+ log(`backend: auto-replying ${method} (id=${String(id)}) with default preferences`);
141
+ this.sendReply(id, {
142
+ nativeSearchEnhancementsEnabled: false,
143
+ memoryEnabled: false,
144
+ askUserQuestionAutoResolutionEnabled: false,
145
+ });
146
+ }
131
147
  else {
132
148
  this.serverRequests.push({
133
149
  id,
@@ -141,11 +157,40 @@ export class ZcodeBackend {
141
157
  // Notification.
142
158
  if (method === "session/event") {
143
159
  const ev = (msg.params ?? {});
144
- const sid = ev.sessionId;
145
- const listener = sid ? this.listeners.get(sid) : undefined;
146
- listener?.handleEvent(ev);
160
+ this.dispatchEvent(ev);
161
+ }
162
+ else if (method === "state.updated") {
163
+ // Session settings changed (model/mode/thoughtLevel switch, incl.
164
+ // mid-turn). The params carry the authoritative full settings patch:
165
+ // { patch: {mode, model, thoughtLevel, …}, reason, revision, sessionId }
166
+ // Wrap as a ZcodeEvent so it flows through the same listener pipeline.
167
+ const params = (msg.params ?? {});
168
+ const ev = {
169
+ sessionId: String(params.sessionId ?? ""),
170
+ seq: 0,
171
+ type: "state.updated",
172
+ payload: params,
173
+ };
174
+ this.dispatchEvent(ev);
175
+ }
176
+ // Other notifications are currently ignored (process/resourceSample, …).
177
+ }
178
+ }
179
+ /** Deliver a ZcodeEvent to every listener registered for its session. */
180
+ dispatchEvent(ev) {
181
+ const sid = ev.sessionId;
182
+ const set = sid ? this.listeners.get(sid) : undefined;
183
+ if (set) {
184
+ // Iterate a snapshot so a listener that (un)registers during dispatch
185
+ // doesn't mutate the set under us.
186
+ for (const listener of [...set]) {
187
+ try {
188
+ listener.handleEvent(ev);
189
+ }
190
+ catch (e) {
191
+ warn(`backend: listener.handleEvent threw: ${e instanceof Error ? e.message : String(e)}`);
192
+ }
147
193
  }
148
- // Other notifications are currently ignored (state.updated, etc.).
149
194
  }
150
195
  }
151
196
  resolvePending(id, resp) {
@@ -172,10 +217,20 @@ export class ZcodeBackend {
172
217
  }
173
218
  // ---------- listeners / server requests ----------
174
219
  registerEventListener(zcodeSid, listener) {
175
- this.listeners.set(zcodeSid, listener);
220
+ let set = this.listeners.get(zcodeSid);
221
+ if (!set) {
222
+ set = new Set();
223
+ this.listeners.set(zcodeSid, set);
224
+ }
225
+ set.add(listener);
176
226
  }
177
- unregisterEventListener(zcodeSid) {
178
- this.listeners.delete(zcodeSid);
227
+ unregisterEventListener(zcodeSid, listener) {
228
+ const set = this.listeners.get(zcodeSid);
229
+ if (!set)
230
+ return;
231
+ set.delete(listener);
232
+ if (set.size === 0)
233
+ this.listeners.delete(zcodeSid);
179
234
  }
180
235
  /** Non-blocking drain of pending server→client requests. */
181
236
  pollServerRequests() {
@@ -183,6 +238,16 @@ export class ZcodeBackend {
183
238
  return [];
184
239
  return this.serverRequests.splice(0, this.serverRequests.length);
185
240
  }
241
+ /**
242
+ * Re-queue server→client requests that belong to a different session (prepended
243
+ * to preserve arrival order). Used by `handleServerRequests` to put back
244
+ * requests it popped but doesn't own.
245
+ */
246
+ requeueServerRequests(reqs) {
247
+ if (reqs.length === 0)
248
+ return;
249
+ this.serverRequests.unshift(...reqs);
250
+ }
186
251
  /** Reply to a zcode server→client request with a result (id + result). */
187
252
  sendReply(id, result) {
188
253
  const stdin = this.proc.stdin;
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/backend/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/backend/client.ts"],"names":[],"mappings":"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"}