@qwen-code/qwen-code 0.15.12-preview.3 → 0.16.0-preview.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 (64) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +20 -24
  2. package/bundled/qc-helper/docs/qwen-serve.md +29 -10
  3. package/chunks/{agent-LIAWUWAO.js → agent-ZNQPH67I.js} +15 -15
  4. package/chunks/{anthropicContentGenerator-4QE6LTVV.js → anthropicContentGenerator-ICBDZ6R2.js} +4 -4
  5. package/chunks/{askUserQuestion-QFSCBTUO.js → askUserQuestion-WQILGUSQ.js} +2 -2
  6. package/chunks/{chunk-SQNQIOD5.js → chunk-2B7UBDY5.js} +2 -2
  7. package/chunks/chunk-3MBY4GKN.js +350 -0
  8. package/chunks/{chunk-GC5RXNL2.js → chunk-7QXHXMC6.js} +23 -7
  9. package/chunks/{chunk-XLQ4E5PS.js → chunk-C3LHPHN2.js} +11 -11
  10. package/chunks/{chunk-UXW7MYAW.js → chunk-CW44BRRA.js} +1 -1
  11. package/chunks/{chunk-G27O2LD2.js → chunk-D5NTAHYL.js} +1 -1
  12. package/chunks/{chunk-CBVB66WY.js → chunk-EDYSNFEM.js} +1 -1
  13. package/chunks/{chunk-OCC4MZRS.js → chunk-F23NCRJ2.js} +1 -1
  14. package/chunks/{chunk-FYMSCRHM.js → chunk-FZIUV27X.js} +1 -1
  15. package/chunks/{chunk-5QQ5FGTU.js → chunk-G7YTSRES.js} +1 -1
  16. package/chunks/{chunk-AOJ3BBY7.js → chunk-JHMX4QTD.js} +9 -9
  17. package/chunks/{chunk-TPGOGCWM.js → chunk-JYQUJ5DS.js} +1 -1
  18. package/chunks/{chunk-FKVKVE6N.js → chunk-KXZ4TJB4.js} +1 -1
  19. package/chunks/{chunk-AJSOD5IR.js → chunk-MNPZ2WO6.js} +535 -141
  20. package/chunks/{chunk-BXNCPI75.js → chunk-NAID3ZWF.js} +2 -2
  21. package/chunks/{chunk-JMZQICAL.js → chunk-PPHYLJSS.js} +1 -1
  22. package/chunks/{chunk-CM2IESUE.js → chunk-PR4T27R7.js} +1 -1
  23. package/chunks/{chunk-CAWKL3UC.js → chunk-VTPOO6GV.js} +1 -1
  24. package/chunks/{chunk-GJXIKCKL.js → chunk-XP27SJMH.js} +76 -5
  25. package/chunks/{chunk-B7ZL7HUA.js → chunk-XVHR7ATJ.js} +1 -1
  26. package/chunks/{contextCommand-SVLAZMQL.js → contextCommand-IGBCEXI4.js} +16 -16
  27. package/chunks/{cron-create-WUTD5ZTH.js → cron-create-AVI3Q267.js} +2 -2
  28. package/chunks/{cron-delete-N3UQYCRA.js → cron-delete-ZCEGDXXV.js} +2 -2
  29. package/chunks/{cron-list-Z6RJJ4YH.js → cron-list-VN653OK5.js} +2 -2
  30. package/chunks/{edit-VNAZBIZR.js → edit-74Q4AFHQ.js} +16 -16
  31. package/chunks/{en-NRN4QBAT.js → en-FIUWJSZR.js} +1 -0
  32. package/chunks/{enter-worktree-FOF5YZIV.js → enter-worktree-H72HXC7D.js} +15 -15
  33. package/chunks/{exit-worktree-Y6QVAO3C.js → exit-worktree-FGIQO3S3.js} +15 -15
  34. package/chunks/{exitPlanMode-QZKO7GH7.js → exitPlanMode-NBR2PK2D.js} +15 -15
  35. package/chunks/{geminiContentGenerator-DYHZPKJX.js → geminiContentGenerator-33RP4WKD.js} +3 -3
  36. package/chunks/{glob-G7XATELV.js → glob-WEE3CJL6.js} +15 -15
  37. package/chunks/{grep-4SETMY47.js → grep-DZKSBFZK.js} +15 -15
  38. package/chunks/{keychain-token-storage-DMFP5IJM.js → keychain-token-storage-335UOLJ6.js} +2 -2
  39. package/chunks/{ls-SUILOZZB.js → ls-6F3VSP6S.js} +3 -3
  40. package/chunks/{lsp-6TQBWVMZ.js → lsp-67Y7DJN5.js} +2 -2
  41. package/chunks/{monitor-JTLJBJ7H.js → monitor-EDZWEZVS.js} +15 -15
  42. package/chunks/{openaiContentGenerator-3H7XOZBW.js → openaiContentGenerator-5NQG3W64.js} +10 -10
  43. package/chunks/{qwenContentGenerator-FAU3QPYO.js → qwenContentGenerator-4DPUUS6R.js} +17 -17
  44. package/chunks/{qwenOAuth2-JSQ7EPR3.js → qwenOAuth2-JE7H47TE.js} +3 -3
  45. package/chunks/{read-file-WWUQVNCZ.js → read-file-CQOF7BQ2.js} +7 -7
  46. package/chunks/{ripGrep-WCOAIWL6.js → ripGrep-KR5LKGTI.js} +15 -15
  47. package/chunks/{send-message-Q2JRAC3J.js → send-message-GB4AQZNC.js} +2 -2
  48. package/chunks/{serve-VJEEEXA6.js → serve-GAD2PEST.js} +501 -286
  49. package/chunks/{shell-IAOKGIJ6.js → shell-E2HMCBGR.js} +15 -15
  50. package/chunks/{skill-NHW6222K.js → skill-KDZH6UZ6.js} +9 -9
  51. package/chunks/{src-OWV5HVQQ.js → src-LY4RU5AI.js} +17 -15
  52. package/chunks/{syntheticOutput-S4DRGMQM.js → syntheticOutput-HFL3DE7R.js} +3 -3
  53. package/chunks/{task-stop-7THHVAQS.js → task-stop-ZQF26RXS.js} +2 -2
  54. package/chunks/{todoWrite-WKUGUTPX.js → todoWrite-U4SC643O.js} +3 -3
  55. package/chunks/{tool-search-MSJ6SXLI.js → tool-search-U4XQVLFU.js} +7 -7
  56. package/chunks/{web-fetch-OZE6ZQUF.js → web-fetch-BRWZ4WSE.js} +4 -4
  57. package/chunks/{write-file-RKCENFZ5.js → write-file-NBLRMNGB.js} +16 -16
  58. package/chunks/{zh-TW-XZEHEV5S.js → zh-TW-552S24LR.js} +1 -0
  59. package/chunks/{zh-RN3JULHO.js → zh-V32QONGV.js} +1 -0
  60. package/cli.js +598 -59
  61. package/locales/en.js +2 -0
  62. package/locales/zh-TW.js +1 -0
  63. package/locales/zh.js +1 -0
  64. package/package.json +2 -2
@@ -73,13 +73,7 @@ When both legacy settings are present with different values, the migration follo
73
73
 
74
74
  ### Available settings in `settings.json`
75
75
 
76
- Settings are organized into categories. Most settings should be placed within their corresponding top-level category object in your `settings.json` file. A few compatibility settings, such as `proxy`, are top-level keys.
77
-
78
- #### top-level
79
-
80
- | Setting | Type | Description | Default |
81
- | ------- | ------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------- |
82
- | `proxy` | string | Proxy URL for CLI HTTP requests. Precedence is `--proxy` > `proxy` in `settings.json` > `HTTPS_PROXY` / `https_proxy` / `HTTP_PROXY` / `http_proxy` environment variables. | `undefined` |
76
+ Settings are organized into categories. Most settings should be placed within their corresponding top-level category object in your `settings.json` file. A few top-level settings like `proxy` and `plansDirectory` remain direct root keys for compatibility.
83
77
 
84
78
  #### general
85
79
 
@@ -145,17 +139,17 @@ Settings are organized into categories. Most settings should be placed within th
145
139
 
146
140
  #### model
147
141
 
148
- | Setting | Type | Description | Default |
149
- | -------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- |
150
- | `model.name` | string | The Qwen model to use for conversations. | `undefined` |
151
- | `model.maxSessionTurns` | number | Maximum number of user/model/tool turns to keep in a session. -1 means unlimited. | `-1` |
152
- | `model.generationConfig` | object | Advanced overrides passed to the underlying content generator. Supports request controls such as `timeout`, `maxRetries`, `enableCacheControl`, `splitToolMedia` (set `true` for strict OpenAI-compatible servers like LM Studio that reject non-text content on `role: "tool"` messages — splits media into a follow-up user message), `contextWindowSize` (override model's context window size), `modalities` (override auto-detected input modalities), `customHeaders` (custom HTTP headers for API requests), `extra_body` (additional body parameters for OpenAI-compatible API requests only), and `reasoning` (`{ effort: 'low' \| 'medium' \| 'high' \| 'max', budget_tokens?: number }` to control thinking intensity, or `false` to disable; `'max'` is a DeepSeek extension — see [Reasoning / thinking configuration](./model-providers.md#reasoning--thinking-configuration) for per-provider behavior. **Note:** when `samplingParams` is set on an OpenAI-compatible provider, the pipeline ships those keys verbatim and the separate top-level `reasoning` field is dropped — put `reasoning_effort` inside `samplingParams` (or `extra_body`) instead in that case), along with fine-tuning knobs under `samplingParams` (for example `temperature`, `top_p`, `max_tokens`). Leave unset to rely on provider defaults. | `undefined` |
153
- | `model.chatCompression.contextPercentageThreshold` | number | Sets the threshold for chat history compression as a percentage of the model's total token limit. This is a value between 0 and 1 that applies to both automatic compression and the manual `/compress` command. For example, a value of `0.6` will trigger compression when the chat history exceeds 60% of the token limit. Use `0` to disable compression entirely. | `0.7` |
154
- | `model.skipNextSpeakerCheck` | boolean | Skip the next speaker check. | `false` |
155
- | `model.skipLoopDetection` | boolean | Disables loop detection checks. Loop detection prevents infinite loops in AI responses but can generate false positives that interrupt legitimate workflows. Enable this option if you experience frequent false positive loop detection interruptions. | `false` |
156
- | `model.skipStartupContext` | boolean | Skips sending the startup workspace context (environment summary and acknowledgement) at the beginning of each session. Enable this if you prefer to provide context manually or want to save tokens on startup. | `false` |
157
- | `model.enableOpenAILogging` | boolean | Enables logging of OpenAI API calls for debugging and analysis. When enabled, API requests and responses are logged to JSON files. | `false` |
158
- | `model.openAILoggingDir` | string | Custom directory path for OpenAI API logs. If not specified, defaults to `logs/openai` in the current working directory. Supports absolute paths, relative paths (resolved from current working directory), and `~` expansion (home directory). | `undefined` |
142
+ | Setting | Type | Description | Default |
143
+ | -------------------------------------------------- | ------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ----------- |
144
+ | `model.name` | string | The Qwen model to use for conversations. | `undefined` |
145
+ | `model.maxSessionTurns` | number | Maximum number of user/model/tool turns to keep in a session. -1 means unlimited. | `-1` |
146
+ | `model.generationConfig` | object | Advanced overrides passed to the underlying content generator. Supports request controls such as `timeout`, `maxRetries`, `enableCacheControl`, `splitToolMedia` (set `true` for strict OpenAI-compatible servers like LM Studio that reject non-text content on `role: "tool"` messages — splits media into a follow-up user message), `contextWindowSize` (override model's context window size), `modalities` (override auto-detected input modalities), `customHeaders` (custom HTTP headers for API requests), and `extra_body` (additional body parameters for OpenAI-compatible API requests only), along with fine-tuning knobs under `samplingParams` (for example `temperature`, `top_p`, `max_tokens`). Leave unset to rely on provider defaults. | `undefined` |
147
+ | `model.chatCompression.contextPercentageThreshold` | number | Sets the threshold for chat history compression as a percentage of the model's total token limit. This is a value between 0 and 1 that applies to both automatic compression and the manual `/compress` command. For example, a value of `0.6` will trigger compression when the chat history exceeds 60% of the token limit. Use `0` to disable compression entirely. | `0.7` |
148
+ | `model.skipNextSpeakerCheck` | boolean | Skip the next speaker check. | `false` |
149
+ | `model.skipLoopDetection` | boolean | Disables loop detection checks. Loop detection prevents infinite loops in AI responses but can generate false positives that interrupt legitimate workflows. Enable this option if you experience frequent false positive loop detection interruptions. | `false` |
150
+ | `model.skipStartupContext` | boolean | Skips sending the startup workspace context (environment summary and acknowledgement) at the beginning of each session. Enable this if you prefer to provide context manually or want to save tokens on startup. | `false` |
151
+ | `model.enableOpenAILogging` | boolean | Enables logging of OpenAI API calls for debugging and analysis. When enabled, API requests and responses are logged to JSON files. | `false` |
152
+ | `model.openAILoggingDir` | string | Custom directory path for OpenAI API logs. If not specified, defaults to `logs/openai` in the current working directory. Supports absolute paths, relative paths (resolved from current working directory), and `~` expansion (home directory). | `undefined` |
159
153
 
160
154
  **Example model.generationConfig:**
161
155
 
@@ -440,12 +434,13 @@ LSP server configuration is done through `.lsp.json` files in your project root
440
434
 
441
435
  #### advanced
442
436
 
443
- | Setting | Type | Description | Default |
444
- | ------------------------------ | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
445
- | `advanced.autoConfigureMemory` | boolean | Automatically configure Node.js memory limits. | `false` |
446
- | `advanced.dnsResolutionOrder` | string | The DNS resolution order. | `undefined` |
447
- | `advanced.excludedEnvVars` | array of strings | Environment variables to exclude from project context. Specifies environment variables that should be excluded from being loaded from project `.env` files. This prevents project-specific environment variables (like `DEBUG=true`) from interfering with the CLI behavior. Variables from `.qwen/.env` files are never excluded. | `["DEBUG","DEBUG_MODE"]` |
448
- | `advanced.bugCommand` | object | Configuration for the bug report command. Overrides the default URL for the `/bug` command. Properties: `urlTemplate` (string): A URL that can contain `{title}` and `{info}` placeholders. Example: `"bugCommand": { "urlTemplate": "https://bug.example.com/new?title={title}&info={info}" }` | `undefined` |
437
+ | Setting | Type | Description | Default |
438
+ | ------------------------------ | ---------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------ |
439
+ | `advanced.autoConfigureMemory` | boolean | Automatically configure Node.js memory limits. | `false` |
440
+ | `advanced.dnsResolutionOrder` | string | The DNS resolution order. | `undefined` |
441
+ | `advanced.excludedEnvVars` | array of strings | Environment variables to exclude from project context. Specifies environment variables that should be excluded from being loaded from project `.env` files. This prevents project-specific environment variables (like `DEBUG=true`) from interfering with the CLI behavior. Variables from `.qwen/.env` files are never excluded. | `["DEBUG","DEBUG_MODE"]` |
442
+ | `advanced.bugCommand` | object | Configuration for the bug report command. Overrides the default URL for the `/bug` command. Properties: `urlTemplate` (string): A URL that can contain `{title}` and `{info}` placeholders. Example: `"bugCommand": { "urlTemplate": "https://bug.example.com/new?title={title}&info={info}" }` | `undefined` |
443
+ | `plansDirectory` | string | Custom directory for approved Plan Mode files. Relative paths are resolved from the project root, and the resolved path must stay within the project root. If unset, plan files are stored in `~/.qwen/plans`. **Requires restart.** If the directory is inside the project root, add it to `.gitignore` to avoid committing plan files. | `undefined` |
449
444
 
450
445
  #### mcpServers
451
446
 
@@ -487,6 +482,7 @@ Here is an example of a `settings.json` file with the nested structure, new as o
487
482
  ```
488
483
  {
489
484
  "proxy": "http://localhost:7890",
485
+ "plansDirectory": "./.qwen/plans",
490
486
  "general": {
491
487
  "vimMode": true,
492
488
  "preferredEditor": "code"
@@ -38,6 +38,12 @@ curl http://127.0.0.1:4170/capabilities
38
38
 
39
39
  The `workspaceCwd` field surfaces the bound workspace so clients can pre-flight check + omit `cwd` on `POST /session`.
40
40
 
41
+ The daemon also exposes read-only runtime snapshots for client UIs:
42
+ `GET /workspace/mcp`, `GET /workspace/skills`, `GET /workspace/providers`,
43
+ `GET /session/:id/context`, and `GET /session/:id/supported-commands`. The
44
+ workspace routes report the live daemon runtime and do not start the ACP child
45
+ when idle; an idle daemon returns `initialized: false` with an empty snapshot.
46
+
41
47
  ### 3. Open a session
42
48
 
43
49
  ```bash
@@ -97,6 +103,17 @@ qwen serve --hostname 0.0.0.0 --port 4170
97
103
 
98
104
  Clients then send `Authorization: Bearer $QWEN_SERVER_TOKEN` on every request. `/health` is exempted **only on loopback binds** so k8s/Compose liveness probes inside the pod (where the daemon listens on `127.0.0.1`) don't need credentials. On non-loopback binds (`--hostname 0.0.0.0` etc.) `/health` requires the token like every other route — otherwise an attacker can probe arbitrary addresses to confirm the daemon's existence. Use `/capabilities` to verify your token is correct end-to-end (it always requires auth):
99
105
 
106
+ > **Hardened loopback (`--require-auth`).** The default loopback no-token behavior is fine for a single-user laptop but unsafe on shared dev hosts, CI runners, or multi-tenant workstations where any local user can `curl 127.0.0.1:4170`. Pass `--require-auth` to make the bearer token mandatory on every route — including `/health` and `/capabilities` — even when bound to `127.0.0.1`. Boot fails without a token. With the flag on, an **unauthenticated** client can't read `/capabilities` to discover that auth is required; the discovery surface is the 401 response body itself. Once authenticated, the `caps.features.require_auth` tag is a post-auth confirmation that the deployment is hardened (useful for audit / compliance UIs):
107
+ >
108
+ > ```bash
109
+ > qwen serve --require-auth --token "$(openssl rand -hex 32)"
110
+ > # → /health, /capabilities, /session, … all require Authorization: Bearer …
111
+ > curl http://127.0.0.1:4170/health
112
+ > # → 401
113
+ > curl -H "Authorization: Bearer $TOKEN" http://127.0.0.1:4170/capabilities | jq '.features | index("require_auth")'
114
+ > # → 13 (or whatever index — non-null after authenticating means the tag is present)
115
+ > ```
116
+
100
117
  ```bash
101
118
  curl -H "Authorization: Bearer $QWEN_SERVER_TOKEN" http://your-host:4170/capabilities
102
119
  # → {"v":1,"mode":"http-bridge","features":[...],"modelServices":[],"workspaceCwd":"/path/to/your-project"}
@@ -107,15 +124,17 @@ The token comparison is constant-time (SHA-256 + `crypto.timingSafeEqual`); 401
107
124
 
108
125
  ## CLI flags
109
126
 
110
- | Flag | Default | Purpose |
111
- | ----------------------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
112
- | `--port <n>` | `4170` | TCP port. `0` = OS-assigned ephemeral port. |
113
- | `--hostname <addr>` | `127.0.0.1` | Bind interface. Anything beyond loopback requires a token. |
114
- | `--token <str>` | — | Bearer token. Falls back to `QWEN_SERVER_TOKEN` env var (with leading/trailing whitespace stripped — handy for `$(cat token.txt)`). |
115
- | `--max-sessions <n>` | `20` | Cap on concurrent live sessions. New `POST /session` requests that would spawn a fresh child return `503` (with `Retry-After: 5`) when the cap is hit; attaches to existing sessions are NOT counted. Set to `0` to disable. Sized for single-user / small-team usage; raise it if your deployment has the RAM/FD headroom (~30–50 MB per session). |
116
- | `--workspace <path>` | `process.cwd()` | Absolute workspace path this daemon binds to (per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02 1 daemon = 1 workspace). `POST /session` requests with a mismatched `cwd` return `400 workspace_mismatch`. For multi-workspace deployments, run one `qwen serve` per workspace on separate ports. |
117
- | `--max-connections <n>` | `256` | Listener-level TCP connection cap (`server.maxConnections`). Bounds raw socket count irrespective of session count slow / phantom SSE clients get rejected at accept time once full. Raise alongside `--max-sessions` if your deployment expects many SSE subscribers per session. |
118
- | `--http-bridge` | `true` | Stage 1 mode: one `qwen --acp` child per daemon (bound to one workspace at boot, per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02); N sessions multiplex onto that child via ACP `newSession()`. Stage 2 native in-process becomes available later. |
127
+ | Flag | Default | Purpose |
128
+ | ----------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
129
+ | `--port <n>` | `4170` | TCP port. `0` = OS-assigned ephemeral port. |
130
+ | `--hostname <addr>` | `127.0.0.1` | Bind interface. Anything beyond loopback requires a token. |
131
+ | `--token <str>` | — | Bearer token. Falls back to `QWEN_SERVER_TOKEN` env var (with leading/trailing whitespace stripped — handy for `$(cat token.txt)`). |
132
+ | `--require-auth` | `false` | Refuse to start without a bearer token, even on loopback. Hardens the `127.0.0.1` developer default for shared dev hosts / CI runners / multi-tenant workstations where any local user can hit the listener. Boots only with `--token` or `QWEN_SERVER_TOKEN` set; gates `/health` behind the bearer too. |
133
+ | `--max-sessions <n>` | `20` | Cap on concurrent live sessions. New `POST /session` requests that would spawn a fresh child return `503` (with `Retry-After: 5`) when the cap is hit; attaches to existing sessions are NOT counted. Set to `0` to disable. Sized for single-user / small-team usage; raise it if your deployment has the RAM/FD headroom (~30–50 MB per session). |
134
+ | `--workspace <path>` | `process.cwd()` | Absolute workspace path this daemon binds to (per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02 1 daemon = 1 workspace). `POST /session` requests with a mismatched `cwd` return `400 workspace_mismatch`. For multi-workspace deployments, run one `qwen serve` per workspace on separate ports. |
135
+ | `--max-connections <n>` | `256` | Listener-level TCP connection cap (`server.maxConnections`). Bounds raw socket count irrespective of session count slow / phantom SSE clients get rejected at accept time once full. Raise alongside `--max-sessions` if your deployment expects many SSE subscribers per session. |
136
+ | `--event-ring-size <n>` | `8000` | Per-session SSE replay ring depth (#3803 §02 target). Sets the backlog available to `GET /session/:id/events` with `Last-Event-ID: N`. Larger = more reconnect headroom at the cost of a few hundred KB extra RAM per session. SDK clients can additionally request a larger per-subscriber backlog cap on a specific subscription via `?maxQueued=N` (range `[16, 2048]`, default 256). Daemons also emit a non-terminal `slow_client_warning` SSE frame at 75% queue fill so clients can drain / reconnect before getting evicted. Pre-flight `caps.features.slow_client_warning`. |
137
+ | `--http-bridge` | `true` | Stage 1 mode: one `qwen --acp` child per daemon (bound to one workspace at boot, per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02); N sessions multiplex onto that child via ACP `newSession()`. Stage 2 native in-process becomes available later. |
119
138
 
120
139
  > **Sizing the load knobs.** `--max-sessions` is the **new-child** cap.
121
140
  > Three other layers also limit load — when sizing for a high-concurrency
@@ -227,7 +246,7 @@ Stage 1's contract is sized for prototyping. Per [#3889 chiga0 downstream-consum
227
246
 
228
247
  **Reliability baseline:**
229
248
 
230
- 3. **Client-initiated heartbeat path**distinguish "agent thinking" from "daemon dead" without waiting for the 15s server heartbeat.
249
+ 3. ~~**Client-initiated heartbeat path**~~shipped via [#4175](https://github.com/QwenLM/qwen-code/issues/4175) PR 9. `POST /session/:id/heartbeat` records last-seen timestamps on the daemon (capability tag `client_heartbeat`); SDK helpers are `DaemonClient.heartbeat()` / `DaemonSessionClient.heartbeat()`.
231
250
  4. **`permission_already_resolved` event** when a vote loses the first-responder race — currently UIs have to infer state from a `404`.
232
251
  5. **Larger / per-session-configurable replay ring** — default 4000 covers short drops; mobile / chatty-turn workloads need 8000+ or per-session config.
233
252
  6. **`slow_client_warning` event before `client_evicted`** — soft backpressure so well-behaved slow clients can self-throttle (trim render depth, drop chunks) before being terminated.
@@ -7,32 +7,32 @@ import {
7
7
  hasRebuiltToolRegistry,
8
8
  rebuildToolRegistryOnOverride,
9
9
  resolveSubagentApprovalMode
10
- } from "./chunk-AJSOD5IR.js";
10
+ } from "./chunk-MNPZ2WO6.js";
11
11
  import "./chunk-5P5XGNYH.js";
12
12
  import "./chunk-K5PGHDBN.js";
13
13
  import "./chunk-O4PICXES.js";
14
14
  import "./chunk-TW522KN6.js";
15
15
  import "./chunk-MLZQVCF3.js";
16
- import "./chunk-JMZQICAL.js";
17
- import "./chunk-5QQ5FGTU.js";
18
- import "./chunk-B7ZL7HUA.js";
16
+ import "./chunk-PPHYLJSS.js";
17
+ import "./chunk-G7YTSRES.js";
18
+ import "./chunk-XVHR7ATJ.js";
19
19
  import "./chunk-77WXWU44.js";
20
- import "./chunk-OCC4MZRS.js";
21
- import "./chunk-CAWKL3UC.js";
22
- import "./chunk-XLQ4E5PS.js";
20
+ import "./chunk-F23NCRJ2.js";
21
+ import "./chunk-VTPOO6GV.js";
22
+ import "./chunk-C3LHPHN2.js";
23
23
  import "./chunk-SYCJMSIJ.js";
24
24
  import "./chunk-UWCTAVOD.js";
25
25
  import "./chunk-OFEVLU4C.js";
26
- import "./chunk-CM2IESUE.js";
27
- import "./chunk-UXW7MYAW.js";
28
- import "./chunk-G27O2LD2.js";
26
+ import "./chunk-PR4T27R7.js";
27
+ import "./chunk-CW44BRRA.js";
28
+ import "./chunk-D5NTAHYL.js";
29
29
  import "./chunk-T4VD6OJ4.js";
30
30
  import "./chunk-RDYWTWEM.js";
31
- import "./chunk-TPGOGCWM.js";
32
- import "./chunk-FYMSCRHM.js";
33
- import "./chunk-SQNQIOD5.js";
34
- import "./chunk-FKVKVE6N.js";
35
- import "./chunk-GJXIKCKL.js";
31
+ import "./chunk-JYQUJ5DS.js";
32
+ import "./chunk-FZIUV27X.js";
33
+ import "./chunk-2B7UBDY5.js";
34
+ import "./chunk-KXZ4TJB4.js";
35
+ import "./chunk-XP27SJMH.js";
36
36
  import "./chunk-E7E2MFYM.js";
37
37
  import "./chunk-ZERZSAZL.js";
38
38
  import "./chunk-QN5NZ3UQ.js";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-KQIKOTQJ.js";
7
7
  import {
8
8
  RequestTokenizer
9
- } from "./chunk-BXNCPI75.js";
9
+ } from "./chunk-NAID3ZWF.js";
10
10
  import {
11
11
  Blob,
12
12
  File,
@@ -16,7 +16,7 @@ import {
16
16
  import {
17
17
  buildRuntimeFetchOptions,
18
18
  redactProxyError
19
- } from "./chunk-CAWKL3UC.js";
19
+ } from "./chunk-VTPOO6GV.js";
20
20
  import {
21
21
  CAPPED_DEFAULT_MAX_TOKENS,
22
22
  DEFAULT_TIMEOUT,
@@ -24,7 +24,7 @@ import {
24
24
  hasExplicitOutputLimit,
25
25
  safeJsonParse,
26
26
  tokenLimit
27
- } from "./chunk-UXW7MYAW.js";
27
+ } from "./chunk-CW44BRRA.js";
28
28
  import {
29
29
  FinishReason,
30
30
  GenerateContentResponse
@@ -32,7 +32,7 @@ import {
32
32
  import "./chunk-RDYWTWEM.js";
33
33
  import {
34
34
  createDebugLogger
35
- } from "./chunk-GJXIKCKL.js";
35
+ } from "./chunk-XP27SJMH.js";
36
36
  import "./chunk-E7E2MFYM.js";
37
37
  import {
38
38
  require_ms
@@ -6,10 +6,10 @@ import {
6
6
  BaseToolInvocation,
7
7
  ToolDisplayNames,
8
8
  ToolNames
9
- } from "./chunk-FYMSCRHM.js";
9
+ } from "./chunk-FZIUV27X.js";
10
10
  import {
11
11
  createDebugLogger
12
- } from "./chunk-GJXIKCKL.js";
12
+ } from "./chunk-XP27SJMH.js";
13
13
  import "./chunk-QWSRH265.js";
14
14
  import {
15
15
  init_esbuild_shims
@@ -2,11 +2,11 @@
2
2
  "use strict";
3
3
  import {
4
4
  formatFetchErrorForUser
5
- } from "./chunk-FKVKVE6N.js";
5
+ } from "./chunk-KXZ4TJB4.js";
6
6
  import {
7
7
  Storage,
8
8
  createDebugLogger
9
- } from "./chunk-GJXIKCKL.js";
9
+ } from "./chunk-XP27SJMH.js";
10
10
  import {
11
11
  init_esbuild_shims
12
12
  } from "./chunk-A4BMJM77.js";