glm-acp-agent 1.11.0 → 1.13.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 (161) hide show
  1. package/README.md +39 -6
  2. package/dist/index.js +50 -12
  3. package/dist/index.js.map +1 -1
  4. package/dist/llm/glm-client.d.ts +15 -2
  5. package/dist/llm/glm-client.d.ts.map +1 -1
  6. package/dist/llm/glm-client.js +118 -12
  7. package/dist/llm/glm-client.js.map +1 -1
  8. package/dist/llm/stream-state.d.ts +10 -0
  9. package/dist/llm/stream-state.d.ts.map +1 -0
  10. package/dist/llm/stream-state.js +29 -0
  11. package/dist/llm/stream-state.js.map +1 -0
  12. package/dist/package-version.d.ts +2 -0
  13. package/dist/package-version.d.ts.map +1 -0
  14. package/dist/package-version.js +4 -0
  15. package/dist/package-version.js.map +1 -0
  16. package/dist/protocol/agent.d.ts +49 -0
  17. package/dist/protocol/agent.d.ts.map +1 -1
  18. package/dist/protocol/agent.js +893 -325
  19. package/dist/protocol/agent.js.map +1 -1
  20. package/dist/protocol/connection.d.ts +12 -0
  21. package/dist/protocol/connection.d.ts.map +1 -1
  22. package/dist/protocol/connection.js +19 -2
  23. package/dist/protocol/connection.js.map +1 -1
  24. package/dist/protocol/context-budget.d.ts +36 -0
  25. package/dist/protocol/context-budget.d.ts.map +1 -0
  26. package/dist/protocol/context-budget.js +211 -0
  27. package/dist/protocol/context-budget.js.map +1 -0
  28. package/dist/protocol/image-preprocessor.d.ts.map +1 -1
  29. package/dist/protocol/image-preprocessor.js +83 -55
  30. package/dist/protocol/image-preprocessor.js.map +1 -1
  31. package/dist/protocol/model-transition.d.ts +10 -0
  32. package/dist/protocol/model-transition.d.ts.map +1 -0
  33. package/dist/protocol/model-transition.js +12 -0
  34. package/dist/protocol/model-transition.js.map +1 -0
  35. package/dist/protocol/session-lifecycle.d.ts +20 -0
  36. package/dist/protocol/session-lifecycle.d.ts.map +1 -0
  37. package/dist/protocol/session-lifecycle.js +41 -0
  38. package/dist/protocol/session-lifecycle.js.map +1 -0
  39. package/dist/protocol/session-store.d.ts +14 -10
  40. package/dist/protocol/session-store.d.ts.map +1 -1
  41. package/dist/protocol/session-store.js +115 -54
  42. package/dist/protocol/session-store.js.map +1 -1
  43. package/dist/tools/argument-validation.d.ts +14 -0
  44. package/dist/tools/argument-validation.d.ts.map +1 -0
  45. package/dist/tools/argument-validation.js +167 -0
  46. package/dist/tools/argument-validation.js.map +1 -0
  47. package/dist/tools/definitions.js +3 -3
  48. package/dist/tools/definitions.js.map +1 -1
  49. package/dist/tools/executor.d.ts +14 -1
  50. package/dist/tools/executor.d.ts.map +1 -1
  51. package/dist/tools/executor.js +367 -180
  52. package/dist/tools/executor.js.map +1 -1
  53. package/dist/tools/file-reader.d.ts +18 -0
  54. package/dist/tools/file-reader.d.ts.map +1 -0
  55. package/dist/tools/file-reader.js +105 -0
  56. package/dist/tools/file-reader.js.map +1 -0
  57. package/dist/tools/mcp-pagination.d.ts +25 -0
  58. package/dist/tools/mcp-pagination.d.ts.map +1 -0
  59. package/dist/tools/mcp-pagination.js +67 -0
  60. package/dist/tools/mcp-pagination.js.map +1 -0
  61. package/dist/tools/mcp-response-limit.d.ts +16 -0
  62. package/dist/tools/mcp-response-limit.d.ts.map +1 -0
  63. package/dist/tools/mcp-response-limit.js +52 -0
  64. package/dist/tools/mcp-response-limit.js.map +1 -0
  65. package/dist/tools/process-supervisor.d.ts +24 -0
  66. package/dist/tools/process-supervisor.d.ts.map +1 -0
  67. package/dist/tools/process-supervisor.js +196 -0
  68. package/dist/tools/process-supervisor.js.map +1 -0
  69. package/dist/tools/resource-limits.d.ts +16 -0
  70. package/dist/tools/resource-limits.d.ts.map +1 -0
  71. package/dist/tools/resource-limits.js +25 -0
  72. package/dist/tools/resource-limits.js.map +1 -0
  73. package/dist/tools/session-mcp-client.d.ts +35 -7
  74. package/dist/tools/session-mcp-client.d.ts.map +1 -1
  75. package/dist/tools/session-mcp-client.js +315 -73
  76. package/dist/tools/session-mcp-client.js.map +1 -1
  77. package/dist/tools/tool-output.d.ts +5 -0
  78. package/dist/tools/tool-output.d.ts.map +1 -0
  79. package/dist/tools/tool-output.js +62 -0
  80. package/dist/tools/tool-output.js.map +1 -0
  81. package/dist/tools/vision-mcp-client.d.ts +6 -2
  82. package/dist/tools/vision-mcp-client.d.ts.map +1 -1
  83. package/dist/tools/vision-mcp-client.js +109 -12
  84. package/dist/tools/vision-mcp-client.js.map +1 -1
  85. package/dist/tools/zai-mcp-client.d.ts +7 -1
  86. package/dist/tools/zai-mcp-client.d.ts.map +1 -1
  87. package/dist/tools/zai-mcp-client.js +56 -17
  88. package/dist/tools/zai-mcp-client.js.map +1 -1
  89. package/package.json +8 -2
  90. package/dist/tests/agent.test.d.ts +0 -2
  91. package/dist/tests/agent.test.d.ts.map +0 -1
  92. package/dist/tests/agent.test.js +0 -2873
  93. package/dist/tests/agent.test.js.map +0 -1
  94. package/dist/tests/cli-args.test.d.ts +0 -2
  95. package/dist/tests/cli-args.test.d.ts.map +0 -1
  96. package/dist/tests/cli-args.test.js +0 -57
  97. package/dist/tests/cli-args.test.js.map +0 -1
  98. package/dist/tests/command-limits.test.d.ts +0 -2
  99. package/dist/tests/command-limits.test.d.ts.map +0 -1
  100. package/dist/tests/command-limits.test.js +0 -229
  101. package/dist/tests/command-limits.test.js.map +0 -1
  102. package/dist/tests/credentials.test.d.ts +0 -2
  103. package/dist/tests/credentials.test.d.ts.map +0 -1
  104. package/dist/tests/credentials.test.js +0 -124
  105. package/dist/tests/credentials.test.js.map +0 -1
  106. package/dist/tests/executor.test.d.ts +0 -2
  107. package/dist/tests/executor.test.d.ts.map +0 -1
  108. package/dist/tests/executor.test.js +0 -1382
  109. package/dist/tests/executor.test.js.map +0 -1
  110. package/dist/tests/glm-client.test.d.ts +0 -2
  111. package/dist/tests/glm-client.test.d.ts.map +0 -1
  112. package/dist/tests/glm-client.test.js +0 -534
  113. package/dist/tests/glm-client.test.js.map +0 -1
  114. package/dist/tests/image-preprocessor.test.d.ts +0 -2
  115. package/dist/tests/image-preprocessor.test.d.ts.map +0 -1
  116. package/dist/tests/image-preprocessor.test.js +0 -133
  117. package/dist/tests/image-preprocessor.test.js.map +0 -1
  118. package/dist/tests/integration.test.d.ts +0 -2
  119. package/dist/tests/integration.test.d.ts.map +0 -1
  120. package/dist/tests/integration.test.js +0 -381
  121. package/dist/tests/integration.test.js.map +0 -1
  122. package/dist/tests/logger.test.d.ts +0 -2
  123. package/dist/tests/logger.test.d.ts.map +0 -1
  124. package/dist/tests/logger.test.js +0 -14
  125. package/dist/tests/logger.test.js.map +0 -1
  126. package/dist/tests/mcp-arg-remap.test.d.ts +0 -2
  127. package/dist/tests/mcp-arg-remap.test.d.ts.map +0 -1
  128. package/dist/tests/mcp-arg-remap.test.js +0 -65
  129. package/dist/tests/mcp-arg-remap.test.js.map +0 -1
  130. package/dist/tests/prompt-lifecycle.test.d.ts +0 -2
  131. package/dist/tests/prompt-lifecycle.test.d.ts.map +0 -1
  132. package/dist/tests/prompt-lifecycle.test.js +0 -321
  133. package/dist/tests/prompt-lifecycle.test.js.map +0 -1
  134. package/dist/tests/session-context.test.d.ts +0 -2
  135. package/dist/tests/session-context.test.d.ts.map +0 -1
  136. package/dist/tests/session-context.test.js +0 -213
  137. package/dist/tests/session-context.test.js.map +0 -1
  138. package/dist/tests/session-mcp-client.test.d.ts +0 -2
  139. package/dist/tests/session-mcp-client.test.d.ts.map +0 -1
  140. package/dist/tests/session-mcp-client.test.js +0 -414
  141. package/dist/tests/session-mcp-client.test.js.map +0 -1
  142. package/dist/tests/session-store.test.d.ts +0 -2
  143. package/dist/tests/session-store.test.d.ts.map +0 -1
  144. package/dist/tests/session-store.test.js +0 -263
  145. package/dist/tests/session-store.test.js.map +0 -1
  146. package/dist/tests/slash-commands.test.d.ts +0 -2
  147. package/dist/tests/slash-commands.test.d.ts.map +0 -1
  148. package/dist/tests/slash-commands.test.js +0 -216
  149. package/dist/tests/slash-commands.test.js.map +0 -1
  150. package/dist/tests/sync-manifest.test.d.ts +0 -2
  151. package/dist/tests/sync-manifest.test.d.ts.map +0 -1
  152. package/dist/tests/sync-manifest.test.js +0 -172
  153. package/dist/tests/sync-manifest.test.js.map +0 -1
  154. package/dist/tests/vision-mcp-client.test.d.ts +0 -2
  155. package/dist/tests/vision-mcp-client.test.d.ts.map +0 -1
  156. package/dist/tests/vision-mcp-client.test.js +0 -286
  157. package/dist/tests/vision-mcp-client.test.js.map +0 -1
  158. package/dist/tests/zai-mcp-client.test.d.ts +0 -2
  159. package/dist/tests/zai-mcp-client.test.d.ts.map +0 -1
  160. package/dist/tests/zai-mcp-client.test.js +0 -386
  161. package/dist/tests/zai-mcp-client.test.js.map +0 -1
package/README.md CHANGED
@@ -4,6 +4,10 @@ An [Agent Client Protocol (ACP)](https://agentclientprotocol.com) agent written
4
4
 
5
5
  The agent connects to any ACP-compatible IDE or client over **stdio**, streams responses back in real time, and can call a rich set of tools to interact with the user's file system, terminal, and the web.
6
6
 
7
+ Streaming responses must include a supported terminal finish reason. An early connection close is reported as an interrupted response, with received text retained for session replay. Tool calls run only after a complete `tool_calls` response; calls in output-limit (`length`) or filtered (`content_filter`) responses are discarded and the corresponding stop reason is preserved.
8
+
9
+ Completed provider reasoning is retained unchanged in conversation history and saved sessions for subsequent model calls, even when thought display is disabled. `ACP_GLM_STREAM_THINKING=false` controls client display only. Reasoning from cancelled, incomplete, or output-limited responses is not replayed as a completed reasoning chain.
10
+
7
11
  ---
8
12
 
9
13
  ## Coding Plan Only
@@ -65,7 +69,25 @@ ACP Client (IDE plugin, CLI, …)
65
69
 
66
70
  The agent process needs network access to `api.z.ai` for chat completions and Web MCP, plus `npx` available on `PATH` so it can launch `@z_ai/mcp-server` for vision. Filesystem and shell operations use paths resolved against the ACP session working directory. When the client advertises `fs.writeTextFile`, writes and edits are routed through the ACP client so they render as native diffs. When it advertises both `fs.readTextFile` and `fs.writeTextFile`, `read_file` and edit-file reads also use the editor buffer; otherwise those reads fall back to the agent process filesystem. Writes and arbitrary shell commands still go through ACP `session/request_permission`, and the permission payload is always the **full** tool arguments — the user approves exactly what will run.
67
71
 
68
- Client-facing tool cards stay compact: long strings in `rawInput`/`rawOutput` (and in the `read_file` content preview) are elided to a short head plus a character count, while the model keeps receiving complete payloads through the tool-result channel. Progress narration lives in the `todowrite` task list rather than prose, and reasoning tokens are only forwarded as `agent_thought_chunk` when `ACP_GLM_STREAM_THINKING` is not `false` (the default preserves streaming).
72
+ Client-facing tool cards stay compact: long strings in `rawInput`/`rawOutput` are elided to a short head plus a character count, and every completed or failed card's visible text — including the `read_file` content preview — is bounded to an aggregate 16 KiB UTF-8 budget; oversized previews end with `[… N bytes elided in preview; full result sent to model]` and card titles are elided to 240 characters. The model still receives the full tool result, capped at 256 KiB by `ACP_GLM_TOOL_RESULT_LIMIT_BYTES`; write payloads and permission requests remain complete. Progress narration lives in the `todowrite` task list rather than prose, and reasoning tokens are only forwarded as `agent_thought_chunk` when `ACP_GLM_STREAM_THINKING` is not `false` (the default preserves streaming).
73
+
74
+ ## Client MCP, context, and trust boundary
75
+
76
+ All MCP transports share an 8 MiB response cap (`MCP_RESPONSE_LIMIT_BYTES`): HTTP response bodies are read incrementally and a larger body cancels the read and fails the tool call, while an oversized or newline-less stdio JSON-RPC frame fails the connection, rejecting pending requests and terminating the child process. The cap applies to client-provided servers and to the built-in Web MCP and Vision MCP clients.
77
+
78
+ ### Client-provided MCP servers
79
+
80
+ ACP clients may attach MCP server definitions when creating or loading a session. The agent supports client-configured **stdio** and **HTTP** MCP servers. **SSE is unsupported and rejected** when the agent tries to connect. In the ACP SDK capability schema, `mcpCapabilities.http` advertises HTTP support and `mcpCapabilities.sse` advertises SSE support. This agent advertises only `http: true` and does not advertise SSE; the capability object has no stdio flag.
81
+
82
+ A stdio MCP child starts with a copy of the agent process environment, then the server's configured environment entries override matching inherited values. This can pass credentials such as `Z_AI_API_KEY` to that child. Review client-supplied MCP commands and environment values as trusted code/configuration.
83
+
84
+ ### Context compaction
85
+
86
+ Before provider requests, the agent estimates context use with a heuristic rather than the provider's tokenizer. When history exceeds the model budget, it can remove older complete exchanges and shorten tool results; the system context and latest user request are retained. If those, the tool schemas, and reserved output/safety space still exceed the model's context window, the request fails with guidance to narrow it or choose a larger-context model. Earlier conversation details may therefore not remain verbatim in model context.
87
+
88
+ ### Trust boundary
89
+
90
+ The agent does not run tools inside an OS or container sandbox. Shell commands and local filesystem fallbacks run with the agent process's OS-user permissions; shell children inherit its environment, and commands can access the network available to that user. ACP permission prompts and session modes govern consent behavior but do not provide process isolation. Treat workspaces, prompts, and MCP configurations as trusted, and use external OS/container isolation when you need a stronger boundary.
69
91
 
70
92
  ---
71
93
 
@@ -73,11 +95,11 @@ Client-facing tool cards stay compact: long strings in `rawInput`/`rawOutput` (a
73
95
 
74
96
  | Tool | Runs on | Permission behavior | Description |
75
97
  |------|---------|---------------------|-------------|
76
- | `read_file` | ACP client when both fs read/write capabilities are advertised, otherwise agent process | Always silent | Read a text file or editor buffer, paginated by offset/limit (default 2000 lines, capped at 5000); the result reports the shown range, advertises the next offset only while lines remain, and reports EOF past the last line |
98
+ | `read_file` | ACP client when both fs read/write capabilities are advertised, otherwise agent process | Always silent | Read a text file or editor buffer, paginated by offset/limit (default 2000 lines, capped at 5000). Local scans are byte-bounded; totals can be unknown and an incomplete line is never given a next offset. |
77
99
  | `write_file` | Agent process (ACP client `fs` when advertised) | Mode-dependent | Write or overwrite a text file. Silent in `accept_edits` and `bypass_permissions`. |
78
- | `edit_file` | Agent process (ACP client `fs` when advertised) | Mode-dependent | Replace one exact, unique snippet in an existing file — a surgical edit instead of a full rewrite. Re-reads and re-validates after the permission prompt so concurrent edits are not overwritten. Silent in `accept_edits` and `bypass_permissions`. |
100
+ | `edit_file` | Agent process (ACP client `fs` when advertised) | Mode-dependent | Replace one exact, unique snippet in an existing file. It refuses an input or editor buffer over the read/edit budget, and re-validates after permission so concurrent edits are not overwritten. Silent in `accept_edits` and `bypass_permissions`. |
79
101
  | `todowrite` | Agent process | Always silent | Create or replace the session's structured task list so multi-step progress is tracked instead of narrated in chat. Each call replaces the list; the tool result renders it back to the model. |
80
- | `list_files` | Agent process | Always silent | List a directory using Node filesystem APIs |
102
+ | `list_files` | Agent process | Always silent | List a directory through a bounded iterator; a truncated result is a disclosed subset. |
81
103
  | `run_command` | Agent process | Mode-dependent | Run an arbitrary shell command; cancelling a turn terminates its shell process group, while intentionally backgrounded processes survive a normal shell exit. Silent only in `bypass_permissions`. |
82
104
  | `web_search` | Agent (Z.AI Coding Plan MCP) | Always silent | Search the web — returns titles, URLs, and summaries |
83
105
  | `web_reader` | Agent (Z.AI Coding Plan MCP) | Always silent | Fetch and parse a web page (markdown or plain text) |
@@ -95,6 +117,8 @@ Clients can use `session/set_mode` to drive the permission policy:
95
117
 
96
118
  Reads, listings, and MCP tool calls are always silent across all modes.
97
119
 
120
+ Permission prompts always carry the full, unelided tool arguments, so the user approves exactly what will run. The prompt offers exactly `allow` and `reject`, and a tool runs only when the response selects `allow` with outcome `selected`; anything else — a missing or unrecognised option id, an unknown outcome string, or a null/absent response — is treated as reject. An explicit `cancelled` outcome remains distinct from rejection.
121
+
98
122
  ---
99
123
 
100
124
  ## Slash commands
@@ -179,12 +203,17 @@ The agent reads its configuration from environment variables, plus an optional c
179
203
  | `ACP_GLM_MODEL` | No | `glm-5.3` | Default GLM model for new sessions |
180
204
  | `ACP_GLM_AVAILABLE_MODELS` | No | built-in list | Comma-separated list of model ids advertised in `session/set_model` |
181
205
  | `ACP_GLM_BASE_URL` | No | `https://api.z.ai/api/coding/paas/v4` | Override the API base URL |
182
- | `ACP_GLM_MAX_TOKENS` | No | `32768` | Cap on `max_tokens` for each completion |
206
+ | `ACP_GLM_MAX_TOKENS` | No | `32768` | Cap on `max_tokens` for each completion. Invalid values fall back to the default with a stderr warning. |
183
207
  | `ACP_GLM_MAX_TURNS` | No | `100` | Max model/tool turns per prompt (also settable via `--max-turns`) |
184
208
  | `ACP_GLM_COMMAND_TIMEOUT_MS` | No | `120000` | Deadline for each `run_command`, in milliseconds. Invalid values fall back to the default with a stderr warning. |
185
209
  | `ACP_GLM_COMMAND_OUTPUT_LIMIT_BYTES` | No | `65536` | Maximum combined bytes captured from each `run_command` stdout and stderr. Further output is drained and reported as truncated. Invalid values fall back to the default with a stderr warning. |
210
+ | `ACP_GLM_TOOL_RESULT_LIMIT_BYTES` | No | `262144` | Inclusive UTF-8 byte limit for every model-facing tool result. It preserves a prefix and suffix with an omitted-bytes marker; values below 128 fall back with a stderr warning. |
211
+ | `ACP_GLM_READ_FILE_LIMIT_BYTES` | No | `8388608` | Maximum local bytes consumed while reading a page or whole file for `edit_file`. A bounded scan may not know the total line count. |
212
+ | `ACP_GLM_LIST_FILES_MAX_ENTRIES` | No | `2000` | Maximum entries collected by `list_files`; larger directories return a disclosed subset. |
213
+ | `ACP_GLM_LIST_FILES_LIMIT_BYTES` | No | `262144` | Maximum bytes assembled for a `list_files` result before its truncation marker. |
186
214
  | `ACP_GLM_THINKING` | No | auto-detected | Force thinking mode `true` / `false` |
187
215
  | `ACP_GLM_STREAM_THINKING` | No | `true` | Forward reasoning tokens to the client as `agent_thought_chunk`; set `false` to keep reasoning off the wire (the model still thinks — only the client-side stream is silenced) |
216
+ | `ACP_GLM_STREAM_IDLE_TIMEOUT_MS` | No | `300000` | Idle deadline in milliseconds for a stalled model-provider stream read; invalid values fall back to the default with a stderr warning. |
188
217
  | `ACP_GLM_SESSION_DIR` | No | `$XDG_STATE_HOME/glm-acp-agent/sessions` | Where session JSON files are persisted |
189
218
  | `ACP_GLM_DEBUG` | No | — | Set to `true` or `1` to enable verbose debug logging to stderr (shows model selection, API key resolution, tool calls, and usage stats) |
190
219
  | `XDG_CONFIG_HOME` | No | `~/.config` | Where the credentials file is read/written |
@@ -224,6 +253,8 @@ Vision-only chat models (`glm-4v-plus` etc.) are **not** advertised. `glm-5.3-fl
224
253
 
225
254
  When the model name matches `glm-4.5`, `glm-4.6`, `glm-4.7`, or the `glm-5` family, the agent enables Z.AI's `thinking: { type: "enabled" }` extension and forwards reasoning tokens to the client as `agent_thought_chunk` blocks. This includes `glm-5.3-flash` and `glm-5v-turbo`. `ACP_GLM_THINKING=false` asks for plain completions on models that still accept `thinking.type: "disabled"` (GLM-4.7, GLM-5 Turbo). On GLM-5.3 and GLM-5.3-Flash the flag is a no-op: those models reject `disabled`, so the agent leaves thinking enabled rather than sending it (see [Thought level](#thought-level-reasoning-effort) below).
226
255
 
256
+ The provider stream itself is guarded against stalls. The Z.AI SDK's HTTP timeout only covers waiting for response headers — a response whose body stops mid-stream would otherwise hang the turn forever. The agent therefore aborts a provider stream read that produces no data for `ACP_GLM_STREAM_IDLE_TIMEOUT_MS` milliseconds (default `300000`; invalid values for the variable fall back to the default with a stderr warning). On timeout, whatever partial output already reached the user is kept, an `[error]` message is appended as an agent message, the turn ends, and the last valid on-disk session checkpoint is preserved. A slow ACP client back-pressuring chunks it already received does not trip the watchdog — only silence from the provider between reads does.
257
+
227
258
  #### Thought level (reasoning effort)
228
259
 
229
260
  The agent advertises a `thought_level` [SessionConfigOption](https://agentclientprotocol.com) so clients that support config options (e.g. a "Thinking" selector) can control reasoning effort per session. The available levels depend on the active model:
@@ -242,6 +273,8 @@ The endpoint validates `reasoning_effort` against `none | minimal | low | medium
242
273
 
243
274
  `ACP_GLM_PROMPT_IMAGES=false` still hides the image-attachment capability at session startup. With that flag set, clients should not offer image attachments at all.
244
275
 
276
+ Switching to a text-only model is rejected while retained conversation history contains native images. Keep an image-capable model or start a text-only session with a textual description; images are never silently discarded or analyzed as part of a model switch. During an active prompt on a native-image model, wait for the turn to finish before switching to text-only capability. Other compatible selections affect subsequent model calls, while an in-flight call keeps its captured model and reasoning level. Restored histories receive the same compatibility check before a provider request.
277
+
245
278
  ### Vision MCP
246
279
 
247
280
  For `glm-5.3-flash` (built-in) and `glm-5v-turbo` (opt-in via `ACP_GLM_AVAILABLE_MODELS`), pasted ACP image blocks with `image/jpeg`, `image/jpg`, or `image/png` are sent directly to chat completions as `image_url` content parts. HTTPS image URLs are forwarded as URLs; inline base64 data is sent as a `data:<mime>;base64,...` URI. Unsupported image MIME types are rejected client-side with an inline `<image_unsupported_format>` annotation so the prompt can continue without a provider 4xx.
@@ -372,7 +405,7 @@ If `Z_AI_API_KEY` is set in the environment **and** a credentials file exists, t
372
405
  2. Open the **agent panel** (use the command palette: `agent panel: toggle focus`).
373
406
  3. In the agent picker, select **glm** — Zed labels external agents by their `agent_servers` key.
374
407
  4. Start a new thread and send a small prompt that exercises a tool, e.g. `Read package.json and tell me the project name.`
375
- 5. You should see streaming text, a `read_file` tool call awaiting permission, and (with a thinking-capable model like `glm-5.3`) reasoning surfaced as a separate thought block.
408
+ 5. You should see streaming text, a `read_file` tool call that runs without a permission prompt, and (with a thinking-capable model like `glm-5.3`) reasoning surfaced as a separate thought block. Writes and shell commands require approval in the default mode.
376
409
 
377
410
  #### 5. Iterating on the agent
378
411
 
package/dist/index.js CHANGED
@@ -11,10 +11,11 @@
11
11
  * falls back to the credentials file written by --setup.
12
12
  * ACP_GLM_MODEL - (optional) Override the default model (default: glm-5.3)
13
13
  * ACP_GLM_MAX_TURNS - (optional) Max model/tool turns per prompt (default: 100)
14
+ * ACP_GLM_STREAM_IDLE_TIMEOUT_MS - (optional) Model stream idle deadline in milliseconds (default: 300000)
14
15
  * ACP_GLM_COMMAND_TIMEOUT_MS - (optional) run_command deadline in milliseconds (default: 120000)
15
16
  * ACP_GLM_COMMAND_OUTPUT_LIMIT_BYTES - (optional) combined run_command stdout/stderr capture limit (default: 65536)
16
17
  */
17
- import { startConnection } from "./protocol/connection.js";
18
+ import { startAgentRuntime } from "./protocol/connection.js";
18
19
  import { parseMaxTurnsFlag } from "./cli-args.js";
19
20
  import { runSetup } from "./setup.js";
20
21
  const args = process.argv.slice(2);
@@ -48,6 +49,7 @@ else if (args.includes("--help") || args.includes("-h")) {
48
49
  " ACP_GLM_MAX_TOKENS Per-call max output tokens (default 32768)",
49
50
  " ACP_GLM_THINKING Force thinking mode (true / false)",
50
51
  " ACP_GLM_STREAM_THINKING Forward reasoning to the client as thought chunks (default true)",
52
+ " ACP_GLM_STREAM_IDLE_TIMEOUT_MS Model stream idle deadline in milliseconds (default 300000)",
51
53
  " ACP_GLM_SESSION_DIR Where to persist sessions (default: ~/.local/state/glm-acp-agent/sessions)",
52
54
  " ACP_GLM_DEBUG Enable verbose stderr logging (true or 1)",
53
55
  " XDG_CONFIG_HOME Where to read/write credentials.json (default: ~/.config)",
@@ -56,16 +58,52 @@ else if (args.includes("--help") || args.includes("-h")) {
56
58
  process.exit(0);
57
59
  }
58
60
  else {
59
- const connection = startConnection({ maxTurns: parseMaxTurnsFlag(args) });
60
- // Keep the process alive until the connection closes
61
- connection.closed
62
- .then(() => {
63
- process.exit(0);
64
- })
65
- .catch((err) => {
66
- const message = err instanceof Error ? err.message : String(err);
67
- process.stderr.write(`Fatal error: ${message}\n`);
68
- process.exit(1);
69
- });
61
+ const runtime = startAgentRuntime({ maxTurns: parseMaxTurnsFlag(args) });
62
+ let finishing = null;
63
+ let signalExitCode = null;
64
+ const finish = (reason, exitCode) => {
65
+ if (reason === "sigterm" || reason === "sigint")
66
+ signalExitCode = exitCode;
67
+ if (finishing)
68
+ return finishing;
69
+ finishing = (async () => {
70
+ const clean = await settlesWithin(runtime.shutdown(reason), 5_000);
71
+ if (clean) {
72
+ runtime.closeTransport();
73
+ process.exitCode = signalExitCode ?? exitCode;
74
+ return;
75
+ }
76
+ process.stderr.write("glm-acp-agent: shutdown deadline exceeded; forcing active command cleanup\n");
77
+ await settlesWithin(runtime.forceShutdown(), 1_000);
78
+ process.exitCode = signalExitCode ?? 1;
79
+ // An unresolved client/MCP handle would otherwise keep the CLI alive
80
+ // indefinitely after the documented deadline. Command cleanup had its
81
+ // forced attempt above; report the incomplete shutdown as nonzero.
82
+ process.exit(process.exitCode);
83
+ })().catch((err) => {
84
+ const message = err instanceof Error ? err.message : String(err);
85
+ process.stderr.write(`Fatal shutdown error: ${message}\n`);
86
+ process.exitCode = signalExitCode ?? 1;
87
+ });
88
+ return finishing;
89
+ };
90
+ void runtime.connection.closed
91
+ .then(() => finish("disconnect", 0))
92
+ .catch(() => finish("fatal", 1));
93
+ process.on("SIGINT", () => { void finish("sigint", 130); });
94
+ process.on("SIGTERM", () => { void finish("sigterm", 143); });
95
+ }
96
+ async function settlesWithin(promise, timeoutMs) {
97
+ let timer;
98
+ try {
99
+ return await Promise.race([
100
+ promise.then(() => true, () => false),
101
+ new Promise((resolve) => { timer = setTimeout(() => resolve(false), timeoutMs); }),
102
+ ]);
103
+ }
104
+ finally {
105
+ if (timer)
106
+ clearTimeout(timer);
107
+ }
70
108
  }
71
109
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AACH,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IAC7B,QAAQ,EAAE;SACP,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,OAAO,IAAI,CAAC,CAAC;QACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC;KAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;IAC1D,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB;QACE,uDAAuD;QACvD,EAAE;QACF,QAAQ;QACR,2EAA2E;QAC3E,yEAAyE;QACzE,kEAAkE;QAClE,6CAA6C;QAC7C,EAAE;QACF,wBAAwB;QACxB,6EAA6E;QAC7E,kEAAkE;QAClE,gFAAgF;QAChF,wFAAwF;QACxF,yGAAyG;QACzG,4EAA4E;QAC5E,iEAAiE;QACjE,6EAA6E;QAC7E,qEAAqE;QACrE,mGAAmG;QACnG,6GAA6G;QAC7G,4EAA4E;QAC5E,4FAA4F;QAC5F,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;IACF,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;KAAM,CAAC;IACN,MAAM,UAAU,GAAG,eAAe,CAAC,EAAE,QAAQ,EAAE,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAE1E,qDAAqD;IACrD,UAAU,CAAC,MAAM;SACd,IAAI,CAAC,GAAG,EAAE;QACT,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;QACtB,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QACjE,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,gBAAgB,OAAO,IAAI,CAAC,CAAC;QAClD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import type { ChatCompletionMessageParam } from "openai/resources/index.js";
1
+ import type { ChatCompletionAssistantMessageParam, ChatCompletionMessageParam } from "openai/resources/index.js";
2
2
  import type { ModelInfo, Usage } from "@agentclientprotocol/sdk";
3
3
  import { type ToolDefinition } from "../tools/definitions.js";
4
4
  /**
@@ -37,7 +37,10 @@ export declare function resolveThoughtLevel(model: string, level: ThoughtLevel):
37
37
  /**
38
38
  * A single message in the GLM conversation history.
39
39
  */
40
- export type GlmMessage = ChatCompletionMessageParam;
40
+ export type GlmAssistantMessage = ChatCompletionAssistantMessageParam & {
41
+ reasoning_content?: string;
42
+ };
43
+ export type GlmMessage = Exclude<ChatCompletionMessageParam, ChatCompletionAssistantMessageParam> | GlmAssistantMessage;
41
44
  /**
42
45
  * A streamed chunk from the GLM API.
43
46
  */
@@ -67,6 +70,12 @@ export interface StreamChatOptions {
67
70
  tools?: ToolDefinition[];
68
71
  /** Reasoning effort for this call, or undefined to use the model defaults. */
69
72
  reasoningEffort?: ThoughtLevel;
73
+ /** Maximum silence while awaiting one provider stream item. */
74
+ idleTimeoutMs?: number;
75
+ }
76
+ /** A provider stream stopped yielding while its next item was being read. */
77
+ export declare class ModelStreamIdleTimeoutError extends Error {
78
+ name: string;
70
79
  }
71
80
  /** Default GLM model when neither client nor user has chosen one. */
72
81
  export declare const DEFAULT_MODEL = "glm-5.3";
@@ -99,7 +108,11 @@ export declare function getDefaultModel(): string;
99
108
  export declare class GlmClient {
100
109
  private client;
101
110
  private maxTokens;
111
+ /** Resolved once at construction; later env changes cannot affect a running client. */
112
+ private readonly streamIdleTimeoutMs;
102
113
  constructor();
114
+ /** The same resolved reservation used in the outgoing `max_tokens` field. */
115
+ getMaxOutputTokens(): number;
103
116
  /**
104
117
  * Stream a chat completion from the GLM model, yielding chunks as they arrive.
105
118
  *
@@ -1 +1 @@
1
- {"version":3,"file":"glm-client.d.ts","sourceRoot":"","sources":["../../src/llm/glm-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,0BAA0B,EAAsB,MAAM,2BAA2B,CAAC;AAChG,OAAO,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,EAAoB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAIhF;;;;;;;;;;GAUG;AACH,MAAM,MAAM,YAAY,GACpB,MAAM,GACN,IAAI,GACJ,SAAS,GACT,KAAK,GACL,QAAQ,GACR,MAAM,GACN,OAAO,GACP,KAAK,CAAC;AAuDV,uEAAuE;AACvE,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,YAAY,CAEnE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,MAAM,GAAG,YAAY,EAAE,CAG9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,YAAY,GAAG,YAAY,CASpF;AAED;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG,0BAA0B,CAAC;AAEpD;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,iCAAiC;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,6DAA6D;IAC7D,QAAQ,CAAC,EAAE;QACT,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,oDAAoD;IACpD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,kCAAkC;IAClC,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4BAA4B;IAC5B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,qDAAqD;AACrD,MAAM,WAAW,iBAAiB;IAChC,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,8EAA8E;IAC9E,eAAe,CAAC,EAAE,YAAY,CAAC;CAChC;AAKD,qEAAqE;AACrE,eAAO,MAAM,aAAa,YAAY,CAAC;AAwCvC;;;GAGG;AACH,eAAO,MAAM,oBAAoB,OAAO,CAAC;AA0BzC,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAE5D;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAExD;AAED;;;GAGG;AACH,wBAAgB,kBAAkB,IAAI,SAAS,EAAE,CAYhD;AAED,uEAAuE;AACvE,wBAAgB,eAAe,IAAI,MAAM,CAExC;AAED;;;;;;;GAOG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;;IAoB1B;;;;;;OAMG;IACI,UAAU,CACf,QAAQ,EAAE,UAAU,EAAE,EACtB,MAAM,CAAC,EAAE,WAAW,EACpB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,cAAc,CAAC,cAAc,CAAC;CA0IlC;AA+BD;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,MAAM,EACb,MAAM,CAAC,EAAE,YAAY,GACpB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CA0CzB"}
1
+ {"version":3,"file":"glm-client.d.ts","sourceRoot":"","sources":["../../src/llm/glm-client.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,8 @@
1
1
  import OpenAI from "openai";
2
2
  import { TOOL_DEFINITIONS } from "../tools/definitions.js";
3
3
  import { resolveApiKey } from "./credentials.js";
4
- import { debug, error } from "./logger.js";
4
+ import { debug, error, warn } from "./logger.js";
5
+ import { IncompleteModelStreamError, validateStreamCompletion } from "./stream-state.js";
5
6
  /**
6
7
  * Levels shown for the models that honour `reasoning_effort` — the endpoint's
7
8
  * full validated ladder minus `none`.
@@ -88,8 +89,13 @@ export function resolveThoughtLevel(model, level) {
88
89
  }
89
90
  return valid[valid.length - 1];
90
91
  }
92
+ /** A provider stream stopped yielding while its next item was being read. */
93
+ export class ModelStreamIdleTimeoutError extends Error {
94
+ name = "ModelStreamIdleTimeoutError";
95
+ }
91
96
  /** Default base URL for the Z.AI / Zhipu OpenAI-compatible API (Coding endpoint). */
92
97
  const DEFAULT_BASE_URL = "https://api.z.ai/api/coding/paas/v4";
98
+ const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 300_000;
93
99
  /** Default GLM model when neither client nor user has chosen one. */
94
100
  export const DEFAULT_MODEL = "glm-5.3";
95
101
  /**
@@ -200,6 +206,8 @@ export function getDefaultModel() {
200
206
  export class GlmClient {
201
207
  client;
202
208
  maxTokens;
209
+ /** Resolved once at construction; later env changes cannot affect a running client. */
210
+ streamIdleTimeoutMs;
203
211
  constructor() {
204
212
  const apiKey = resolveApiKey();
205
213
  if (!apiKey) {
@@ -211,8 +219,16 @@ export class GlmClient {
211
219
  // the actual content and trips finish_reason=length ("output limit
212
220
  // reached"). Override with ACP_GLM_MAX_TOKENS.
213
221
  this.maxTokens = parseIntEnv("ACP_GLM_MAX_TOKENS", 32_768);
222
+ // Default silence bound for one provider stream item (see
223
+ // StreamChatOptions.idleTimeoutMs). Resolved once at construction so
224
+ // env re-reads cannot change behaviour mid-session.
225
+ this.streamIdleTimeoutMs = parseIntEnv("ACP_GLM_STREAM_IDLE_TIMEOUT_MS", DEFAULT_STREAM_IDLE_TIMEOUT_MS);
214
226
  this.client = new OpenAI({ apiKey, baseURL });
215
227
  }
228
+ /** The same resolved reservation used in the outgoing `max_tokens` field. */
229
+ getMaxOutputTokens() {
230
+ return this.maxTokens;
231
+ }
216
232
  /**
217
233
  * Stream a chat completion from the GLM model, yielding chunks as they arrive.
218
234
  *
@@ -255,10 +271,23 @@ export class GlmClient {
255
271
  error(`streamChat request failed: status=${status}`, JSON.stringify(body) ?? String(err));
256
272
  throw err;
257
273
  }
274
+ const requestedIdleTimeout = options?.idleTimeoutMs;
275
+ const idleTimeoutMs = requestedIdleTimeout !== undefined && requestedIdleTimeout > 0
276
+ ? requestedIdleTimeout
277
+ : this.streamIdleTimeoutMs;
278
+ const idleBoundedStream = readWithIdleTimeout(stream, signal, idleTimeoutMs);
258
279
  // Tool call deltas arrive interleaved across chunks; assemble by index.
259
280
  const pendingToolCalls = new Map();
260
281
  let lastFinishReason;
261
- for await (const chunk of stream) {
282
+ let terminalChoiceSeen = false;
283
+ for await (const rawChunk of idleBoundedStream) {
284
+ const chunk = rawChunk;
285
+ if (chunk.choices.length > 1) {
286
+ throw new IncompleteModelStreamError("Incomplete model stream: received multiple model choices for one completion.");
287
+ }
288
+ if (terminalChoiceSeen && chunk.choices.length > 0) {
289
+ throw new IncompleteModelStreamError("Incomplete model stream: received a model frame after terminal completion.");
290
+ }
262
291
  const choice = chunk.choices[0];
263
292
  if (choice) {
264
293
  const delta = choice.delta;
@@ -291,6 +320,7 @@ export class GlmClient {
291
320
  }
292
321
  if (choice.finish_reason) {
293
322
  lastFinishReason = choice.finish_reason;
323
+ terminalChoiceSeen = true;
294
324
  }
295
325
  }
296
326
  // The final chunk on most providers (GLM included when
@@ -312,24 +342,100 @@ export class GlmClient {
312
342
  yield { usage };
313
343
  }
314
344
  }
315
- // Flush any assembled tool calls and emit a final done chunk. Only emit
316
- // calls that have both an id and a name – partial entries can be left
317
- // behind by upstream errors and would just confuse the agent loop.
318
- for (const [, tc] of pendingToolCalls) {
319
- if (tc.id && tc.name)
320
- yield { toolCall: tc };
345
+ signal?.throwIfAborted();
346
+ const calls = [...pendingToolCalls.entries()].sort(([a], [b]) => a - b).map(([, call]) => call);
347
+ const stopReason = validateStreamCompletion(lastFinishReason, calls);
348
+ if (stopReason === "tool_calls") {
349
+ for (const call of calls)
350
+ yield { toolCall: call };
321
351
  }
322
- pendingToolCalls.clear();
323
- yield { done: true, stopReason: lastFinishReason };
352
+ yield { done: true, stopReason };
324
353
  }
325
354
  }
326
- /** Parse an integer environment variable, falling back to a default. */
355
+ /**
356
+ * Parse an integer environment variable, falling back to a default. A set but
357
+ * invalid value (not a finite positive integer) logs a stderr warning first, so
358
+ * a typo never silently changes behaviour.
359
+ */
327
360
  function parseIntEnv(name, fallback) {
328
361
  const raw = process.env[name];
329
362
  if (!raw)
330
363
  return fallback;
331
364
  const n = Number.parseInt(raw, 10);
332
- return Number.isFinite(n) && n > 0 ? n : fallback;
365
+ if (Number.isFinite(n) && n > 0)
366
+ return n;
367
+ warn(`invalid ${name} value "${raw}"; falling back to ${fallback}`);
368
+ return fallback;
369
+ }
370
+ /** Bound only provider reads; yielded items leave the timer stopped during ACP backpressure. */
371
+ async function* readWithIdleTimeout(stream, signal, timeoutMs) {
372
+ const iterator = stream[Symbol.asyncIterator]();
373
+ let completed = false;
374
+ try {
375
+ while (true) {
376
+ if (signal?.aborted)
377
+ throw abortError(signal);
378
+ const next = Promise.resolve().then(() => iterator.next());
379
+ const result = await new Promise((resolve, reject) => {
380
+ let settled = false;
381
+ const cleanup = () => {
382
+ clearTimeout(timer);
383
+ signal?.removeEventListener("abort", onAbort);
384
+ };
385
+ const rejectForAbort = () => settleReject(abortError(signal));
386
+ const settleResolve = (value) => {
387
+ if (settled)
388
+ return;
389
+ settled = true;
390
+ cleanup();
391
+ if (signal?.aborted)
392
+ reject(abortError(signal));
393
+ else
394
+ resolve(value);
395
+ };
396
+ const settleReject = (reason) => {
397
+ if (settled)
398
+ return;
399
+ settled = true;
400
+ cleanup();
401
+ reject(signal?.aborted ? abortError(signal) : reason);
402
+ };
403
+ const onAbort = () => rejectForAbort();
404
+ const timer = setTimeout(() => {
405
+ if (signal?.aborted) {
406
+ rejectForAbort();
407
+ return;
408
+ }
409
+ settleReject(new ModelStreamIdleTimeoutError(`No provider stream data for ${timeoutMs}ms`));
410
+ }, timeoutMs);
411
+ signal?.addEventListener("abort", onAbort, { once: true });
412
+ if (signal?.aborted)
413
+ rejectForAbort();
414
+ next.then(settleResolve, settleReject);
415
+ });
416
+ if (result.done) {
417
+ completed = true;
418
+ return;
419
+ }
420
+ yield result.value;
421
+ }
422
+ }
423
+ finally {
424
+ if (!completed) {
425
+ stream.controller?.abort();
426
+ try {
427
+ const cleanup = iterator.return?.();
428
+ if (cleanup)
429
+ void Promise.resolve(cleanup).catch(() => undefined);
430
+ }
431
+ catch {
432
+ // Stream cancellation is best-effort while unwinding an error or abort.
433
+ }
434
+ }
435
+ }
436
+ }
437
+ function abortError(signal) {
438
+ return signal.reason ?? new Error("Model stream aborted");
333
439
  }
334
440
  /**
335
441
  * Decide whether a model supports GLM "thinking" mode based on its name
@@ -1 +1 @@
1
- {"version":3,"file":"glm-client.js","sourceRoot":"","sources":["../../src/llm/glm-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"glm-client.js","sourceRoot":"","sources":["../../src/llm/glm-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** A transport EOF is not proof that a provider completed its response. */
2
+ export declare class IncompleteModelStreamError extends Error {
3
+ name: string;
4
+ }
5
+ export type TerminalReason = "stop" | "tool_calls" | "length" | "content_filter";
6
+ export declare function validateStreamCompletion(reason: string | undefined, calls: ReadonlyArray<{
7
+ id: string;
8
+ name: string;
9
+ }>): TerminalReason;
10
+ //# sourceMappingURL=stream-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-state.d.ts","sourceRoot":"","sources":["../../src/llm/stream-state.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qBAAa,0BAA2B,SAAQ,KAAK;IAC1C,IAAI,SAAgC;CAC9C;AAED,MAAM,MAAM,cAAc,GAAG,MAAM,GAAG,YAAY,GAAG,QAAQ,GAAG,gBAAgB,CAAC;AAEjF,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,MAAM,GAAG,SAAS,EAC1B,KAAK,EAAE,aAAa,CAAC;IAAE,EAAE,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,GACjD,cAAc,CAqBhB"}
@@ -0,0 +1,29 @@
1
+ /** A transport EOF is not proof that a provider completed its response. */
2
+ export class IncompleteModelStreamError extends Error {
3
+ name = "IncompleteModelStreamError";
4
+ }
5
+ export function validateStreamCompletion(reason, calls) {
6
+ if (reason !== "stop" && reason !== "tool_calls" && reason !== "length" && reason !== "content_filter") {
7
+ throw new IncompleteModelStreamError("Incomplete model stream: no supported terminal reason.");
8
+ }
9
+ // Truncated/filtered calls are never executable, even when their arguments
10
+ // happen to look complete. Their fragments are intentionally discarded.
11
+ if (reason === "length" || reason === "content_filter")
12
+ return reason;
13
+ if (reason === "stop" && calls.length > 0) {
14
+ throw new IncompleteModelStreamError("Inconsistent model stream: stop with tool-call fragments.");
15
+ }
16
+ if (reason === "tool_calls") {
17
+ const ids = new Set();
18
+ if (calls.length === 0)
19
+ throw new IncompleteModelStreamError("Incomplete model tool-call batch.");
20
+ for (const call of calls) {
21
+ if (!call.id.trim() || !call.name.trim() || ids.has(call.id)) {
22
+ throw new IncompleteModelStreamError("Incomplete or duplicate model tool-call batch.");
23
+ }
24
+ ids.add(call.id);
25
+ }
26
+ }
27
+ return reason;
28
+ }
29
+ //# sourceMappingURL=stream-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stream-state.js","sourceRoot":"","sources":["../../src/llm/stream-state.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,MAAM,OAAO,0BAA2B,SAAQ,KAAK;IAC1C,IAAI,GAAG,4BAA4B,CAAC;CAC9C;AAID,MAAM,UAAU,wBAAwB,CACtC,MAA0B,EAC1B,KAAkD;IAElD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,YAAY,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,gBAAgB,EAAE,CAAC;QACvG,MAAM,IAAI,0BAA0B,CAAC,wDAAwD,CAAC,CAAC;IACjG,CAAC;IACD,2EAA2E;IAC3E,wEAAwE;IACxE,IAAI,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,gBAAgB;QAAE,OAAO,MAAM,CAAC;IACtE,IAAI,MAAM,KAAK,MAAM,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,0BAA0B,CAAC,2DAA2D,CAAC,CAAC;IACpG,CAAC;IACD,IAAI,MAAM,KAAK,YAAY,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;QAC9B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,0BAA0B,CAAC,mCAAmC,CAAC,CAAC;QAClG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;gBAC7D,MAAM,IAAI,0BAA0B,CAAC,gDAAgD,CAAC,CAAC;YACzF,CAAC;YACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const PACKAGE_VERSION: string;
2
+ //# sourceMappingURL=package-version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.d.ts","sourceRoot":"","sources":["../src/package-version.ts"],"names":[],"mappings":"AAUA,eAAO,MAAM,eAAe,QAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { readFileSync } from "node:fs";
2
+ const packageMetadata = JSON.parse(readFileSync(new URL("../package.json", import.meta.url), "utf8"));
3
+ export const PACKAGE_VERSION = packageMetadata.version;
4
+ //# sourceMappingURL=package-version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"package-version.js","sourceRoot":"","sources":["../src/package-version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAMvC,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,YAAY,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC,CAC/C,CAAC;AAErB,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC,OAAO,CAAC"}