@qwen-code/qwen-code 0.18.1 → 0.18.3-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 (74) hide show
  1. package/README.md +2 -1
  2. package/bundled/qc-helper/docs/common-workflow.md +4 -4
  3. package/bundled/qc-helper/docs/configuration/model-providers.md +1 -1
  4. package/bundled/qc-helper/docs/configuration/settings.md +77 -77
  5. package/bundled/qc-helper/docs/features/channels/feishu.md +16 -0
  6. package/bundled/qc-helper/docs/features/mcp.md +1 -1
  7. package/bundled/qc-helper/docs/features/sub-agents.md +3 -3
  8. package/bundled/qc-helper/docs/qwen-serve.md +24 -12
  9. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +30 -30
  10. package/bundled/review/SKILL.md +10 -4
  11. package/bundled/simplify/SKILL.md +1 -1
  12. package/chunks/{agent-XT7NHZ5H.js → agent-X42UKL4M.js} +5 -5
  13. package/chunks/{agent-headless-LNRE63ZL.js → agent-headless-7FQ7NX6G.js} +5 -5
  14. package/chunks/{anthropicContentGenerator-DCI26OQF.js → anthropicContentGenerator-KLBHYGH6.js} +1 -1
  15. package/chunks/{askUserQuestion-ITYUTWLR.js → askUserQuestion-QPZXR3UO.js} +1 -1
  16. package/chunks/{chunk-BXYRCW2C.js → chunk-3U2ZIZDP.js} +10 -5
  17. package/chunks/{chunk-XZTNBSMW.js → chunk-6X6PTTH3.js} +1 -1
  18. package/chunks/{chunk-7KPZFE5A.js → chunk-C64WAJOC.js} +1 -1
  19. package/chunks/{chunk-WJ3SND6W.js → chunk-JHSQY3J5.js} +2 -2
  20. package/chunks/{chunk-3NRO6NHX.js → chunk-MN5RAXVB.js} +3 -3
  21. package/chunks/{chunk-RON7LFNH.js → chunk-P5CE42XM.js} +6 -6
  22. package/chunks/{chunk-Y7KMDUEP.js → chunk-QP4R5FTG.js} +1 -1
  23. package/chunks/{chunk-QILTEBWS.js → chunk-RTTAC5VW.js} +1 -1
  24. package/chunks/{chunk-IS7UA4W3.js → chunk-U62OHNQR.js} +4 -4
  25. package/chunks/{chunk-6T7Y7USE.js → chunk-VFW7VM7A.js} +1354 -1028
  26. package/chunks/{chunk-HQUWWSSP.js → chunk-VIEIRAK3.js} +1 -1
  27. package/chunks/{chunk-HED55F43.js → chunk-VU6A2OBJ.js} +15 -5
  28. package/chunks/{chunk-DHZREJTG.js → chunk-YJDVHAGL.js} +1 -1
  29. package/chunks/{chunk-A2ZIEEGJ.js → chunk-ZNUMXPNK.js} +592 -43
  30. package/chunks/{computer-use-4YX3JGBV.js → computer-use-WHPP33BI.js} +5 -5
  31. package/chunks/{contextCommand-KS2H7MW5.js → contextCommand-WP7BU7IY.js} +7 -7
  32. package/chunks/{cron-create-CAPUKK7I.js → cron-create-DQKRQMCP.js} +1 -1
  33. package/chunks/{cron-delete-G3KAR26Q.js → cron-delete-DOFPHFTI.js} +1 -1
  34. package/chunks/{cron-list-ZA4ZIUS5.js → cron-list-RCVOO3CB.js} +1 -1
  35. package/chunks/{dist-VEGFONCF.js → dist-2UCAYOX7.js} +2 -2
  36. package/chunks/{dist-X4EXN7W6.js → dist-33LHH26D.js} +1 -1
  37. package/chunks/{dist-YLS6NI7H.js → dist-KF43SZZV.js} +1 -1
  38. package/chunks/{dist-7YWFWOCJ.js → dist-UH7CYT7F.js} +2 -2
  39. package/chunks/{edit-2ARPEO4B.js → edit-V22UFE4F.js} +7 -9
  40. package/chunks/{enter-worktree-IXNXNAW5.js → enter-worktree-HYS5U3QO.js} +5 -5
  41. package/chunks/{enterPlanMode-TAKAGAYP.js → enterPlanMode-UR2KPB4Y.js} +5 -5
  42. package/chunks/{exit-worktree-LHTRV7ML.js → exit-worktree-JNIUZIZ3.js} +5 -5
  43. package/chunks/{exitPlanMode-MK5UAITL.js → exitPlanMode-NJY3Y6XQ.js} +11 -9
  44. package/chunks/{geminiContentGenerator-HFJIGO77.js → geminiContentGenerator-SDUMCYHD.js} +1 -1
  45. package/chunks/{glob-I2USLUSC.js → glob-Z6UYFZCH.js} +5 -5
  46. package/chunks/{grep-WBIF7THR.js → grep-WHWDB2HD.js} +5 -5
  47. package/chunks/{ls-2R5RHLX5.js → ls-TRD77UTS.js} +1 -1
  48. package/chunks/{lsp-XKH6ZIAN.js → lsp-2VFWQPZS.js} +1 -1
  49. package/chunks/{monitor-WU7UFATU.js → monitor-F4V4YEE4.js} +5 -5
  50. package/chunks/{notebook-edit-KUHYPXEM.js → notebook-edit-P45433KC.js} +6 -6
  51. package/chunks/{openaiContentGenerator-5PLHYJQL.js → openaiContentGenerator-DRXB5MSN.js} +5 -5
  52. package/chunks/{qwenContentGenerator-TSKW73KY.js → qwenContentGenerator-3XZMXLHX.js} +7 -7
  53. package/chunks/{read-file-VIPF2PS6.js → read-file-WQPROSSJ.js} +3 -3
  54. package/chunks/{ripGrep-XLIZTYE7.js → ripGrep-EAE7GW6T.js} +5 -5
  55. package/chunks/{scheduler-O66SLJGU.js → scheduler-WCMRRLYM.js} +5 -5
  56. package/chunks/{send-message-CTME7DXD.js → send-message-QZOC5GA2.js} +1 -1
  57. package/chunks/{serve-BWOLYT62.js → serve-BVDNMP5D.js} +709 -26
  58. package/chunks/{shell-XE7UYKOO.js → shell-W4LWEOQL.js} +5 -5
  59. package/chunks/{skill-RZWM6XMC.js → skill-VTJI4OPM.js} +3 -3
  60. package/chunks/{src-L5P7K4MH.js → src-E42UOH5I.js} +11 -5
  61. package/chunks/{syntheticOutput-ZJGSU7OQ.js → syntheticOutput-WJSUK4SZ.js} +2 -2
  62. package/chunks/{task-create-EE6JEM7G.js → task-create-GGSC27HO.js} +2 -2
  63. package/chunks/{task-list-EESYAC65.js → task-list-EDHHHSK4.js} +1 -1
  64. package/chunks/{task-stop-XZVCFFYY.js → task-stop-WR5PDVZY.js} +1 -1
  65. package/chunks/{task-update-EIO4HNE3.js → task-update-UR7NUHBV.js} +2 -2
  66. package/chunks/{team-create-R2H7Y3SG.js → team-create-OAGMFFDJ.js} +5 -5
  67. package/chunks/{team-delete-A7LXPGV7.js → team-delete-FC33URJK.js} +1 -1
  68. package/chunks/{todoWrite-VRKSGAWM.js → todoWrite-GO2ME7ZV.js} +1 -1
  69. package/chunks/{tool-search-USSQMTMS.js → tool-search-XZPD5EPI.js} +3 -3
  70. package/chunks/{web-fetch-GHAZUA54.js → web-fetch-NLLATYIL.js} +2 -2
  71. package/chunks/{workflow-5LNNLNUR.js → workflow-AIC3XOX5.js} +249 -24
  72. package/chunks/{write-file-2I7HP24C.js → write-file-6GIRRW43.js} +6 -6
  73. package/cli.js +1320 -536
  74. package/package.json +2 -2
@@ -43,8 +43,9 @@ The first npm release of `qwen serve` (v0.16-alpha) is intentionally narrow —
43
43
  - ✅ Boot-time security gate (refuses non-loopback bind without a token, [PR 15 / #4236](https://github.com/QwenLM/qwen-code/pull/4236))
44
44
  - ✅ Mutation-route auth gate, session-scoped permission routing (Wave 4 PRs)
45
45
  - ✅ MCP guardrails + multi-client permission coordination (F2 / F3)
46
- - ⏸️ **Prompt absolute deadline + SSE writer idle timeout** — current AbortSignal + 15s heartbeat + `res.on('error')` cleanup is sufficient for local dev; explicit application-layer deadlines defer to v0.16.x once a remote / long-running scenario lands.
47
- - ⏸️ **Rate limiting + observability + load test harness** — defers to v0.17 F4 Phase-1 scale instrumentation when 30-50 active sessions becomes a real target.
46
+ - **Prompt absolute deadline + SSE writer idle timeout** — opt-in via `--prompt-deadline-ms` and `--writer-idle-timeout-ms`; advertised through `prompt_absolute_deadline` and `writer_idle_timeout` when enabled.
47
+ - **HTTP rate limiting** — opt-in via `--rate-limit` and per-tier thresholds; advertised through `rate_limit` when enabled.
48
+ - ⏸️ **Prometheus metrics + load test harness** — defers to v0.17 F4 Phase-1 scale instrumentation when 30-50 active sessions becomes a real target.
48
49
  - ⏸️ **`--max-body-size` CLI flag** — daemon enforces `express.json({ limit: '10mb' })` by default which comfortably covers text-only prompts (model context windows are well under 10 MiB of chars). Tunable via flag in v0.16.x.
49
50
 
50
51
  For the deeper "what we won't fix in Stage 1" enumeration (single-host session-state mutation model + N-parallel-sessions sharing one ACP child), see [Stage 1 scope boundaries](#stage-1-scope-boundaries--what-we-wont-fix-in-stage-15) below.
@@ -69,18 +70,29 @@ curl http://127.0.0.1:4170/health
69
70
  # → {"status":"ok"}
70
71
 
71
72
  curl http://127.0.0.1:4170/capabilities
72
- # → {"v":1,"mode":"http-bridge","features":["health","capabilities","session_create",...],"workspaceCwd":"/path/to/your-project"}
73
+ # → {"v":1,"mode":"http-bridge","features":["health","daemon_status","capabilities","session_create",...],"workspaceCwd":"/path/to/your-project"}
74
+
75
+ curl http://127.0.0.1:4170/daemon/status
76
+ # → {"v":1,"detail":"summary","status":"ok","runtime":{...}}
73
77
  ```
74
78
 
75
79
  The `workspaceCwd` field surfaces the bound workspace so clients can pre-flight check + omit `cwd` on `POST /session`.
76
80
  The `limits.maxPendingPromptsPerSession` field advertises the active per-session prompt admission cap; `null` means the cap is disabled.
77
81
 
78
- The daemon also exposes read-only runtime snapshots for client UIs:
79
- `GET /workspace/mcp`, `GET /workspace/skills`, `GET /workspace/providers`,
80
- `GET /workspace/env`, `GET /workspace/preflight`,
82
+ The daemon also exposes read-only runtime snapshots for client UIs and
83
+ operators: `GET /daemon/status`, `GET /workspace/mcp`,
84
+ `GET /workspace/skills`, `GET /workspace/providers`, `GET /workspace/env`,
85
+ `GET /workspace/preflight`,
81
86
  `GET /session/:id/context`, `GET /session/:id/supported-commands`, and
82
87
  `GET /session/:id/tasks`.
83
88
 
89
+ `GET /daemon/status` is the consolidated troubleshooting snapshot. The default
90
+ `detail=summary` reads only in-memory daemon state (sessions, permissions,
91
+ SSE/ACP transport counts, rate limit rejects, process memory, resolved limits)
92
+ and does not start the ACP child. Use `GET /daemon/status?detail=full` for
93
+ per-session diagnostics, ACP connection details, auth device-flow counts, and
94
+ workspace status sections when you are actively investigating a problem.
95
+
84
96
  `GET /workspace/mcp`, `GET /workspace/skills`, and `GET /workspace/providers`
85
97
  report the live ACP runtime and do not start the ACP child when idle; an
86
98
  idle daemon returns `initialized: false` with an empty snapshot. Once a
@@ -317,12 +329,12 @@ To handle multiple **users** (each with their own quota, audit log, sandbox) or
317
329
 
318
330
  ## Loading and resuming a persisted session
319
331
 
320
- The daemon exposes ACP's `session/load` and `session/unstable_resumeSession` over HTTP via two routes:
332
+ The daemon exposes ACP's `session/load` and resume flow over HTTP via two routes:
321
333
 
322
- | Route | Use when |
323
- | -------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
324
- | `POST /session/:id/load` | The client has **no** history rendered (cold reconnect, picker-then-open). The daemon replays every persisted turn through SSE so subscribers see the full transcript. Capability tag: `session_load`. |
325
- | `POST /session/:id/resume` | The client already has the turns on screen and only needs the daemon-side handle back. Model context is restored on the agent side without UI replay — the SSE stream stays clean. Capability tag: `unstable_session_resume`. |
334
+ | Route | Use when |
335
+ | -------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
336
+ | `POST /session/:id/load` | The client has **no** history rendered (cold reconnect, picker-then-open). The daemon replays every persisted turn through SSE so subscribers see the full transcript. Capability tag: `session_load`. |
337
+ | `POST /session/:id/resume` | The client already has the turns on screen and only needs the daemon-side handle back. Model context is restored on the agent side without UI replay — the SSE stream stays clean. Capability tag: `session_resume` (`unstable_session_resume` remains a deprecated alias for older clients). |
326
338
 
327
339
  The TypeScript SDK exposes both as static factories on `DaemonSessionClient`:
328
340
 
@@ -343,7 +355,7 @@ for await (const event of session.events()) {
343
355
  }
344
356
  ```
345
357
 
346
- Pre-flight `caps.features.session_load` / `caps.features.unstable_session_resume` before calling — older daemons return `404`. Concurrent same-action requests for the same id coalesce; cross-action races (a `load` racing a `resume`) get `409 restore_in_progress` with `Retry-After: 5`. See the [protocol reference](../developers/qwen-serve-protocol.md) for the full error envelope.
358
+ Pre-flight `caps.features.session_load` / `caps.features.session_resume` before calling — older daemons return `404`. `unstable_session_resume` is still advertised as a deprecated compatibility alias. Concurrent same-action requests for the same id coalesce; cross-action races (a `load` racing a `resume`) get `409 restore_in_progress` with `Retry-After: 5`. See the [protocol reference](../developers/qwen-serve-protocol.md) for the full error envelope.
347
359
 
348
360
  Note: history replay is bounded by the SSE ring (default 4000 frames). Long histories with chatty turns can exceed that — earliest frames are dropped silently. For very long sessions, prefer `resume` and rely on the client's local persisted UI.
349
361
 
@@ -15,39 +15,39 @@ This document lists the available keyboard shortcuts in Qwen Code.
15
15
  | `Ctrl+T` | Toggle the display of tool descriptions. |
16
16
  | `Ctrl+B` | While a foreground shell command is running: promote it to a background task. The child keeps running, the agent's turn unblocks, and the shell appears in `/tasks` + the Background tasks dialog. No-op when no shell is executing — Ctrl+B then falls through to its prompt-area binding (cursor-left). |
17
17
  | `Alt/Option+M` | Toggle Markdown output between rich rendered previews and raw/source mode. On macOS, the terminal must send Option as Meta. |
18
- | `Shift+Tab` (`Tab` on Windows) | Cycle approval modes (`plan` → `default` → `auto-edit` → `yolo`) |
18
+ | `Shift+Tab` (`Tab` on Windows) | Cycle approval modes (`plan` → `default` → `auto-edit` → `auto` → `yolo`) |
19
19
 
20
20
  ## Input Prompt
21
21
 
22
- | Shortcut | Description |
23
- | -------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
24
- | `!` | Toggle shell mode when the input is empty. |
25
- | `?` | Toggle keyboard shortcuts display when the input is empty. |
26
- | `\` (at end of line) + `Enter` | Insert a newline. |
27
- | `Down Arrow` | Row down, then snap to end, then history next. |
28
- | `Enter` | Submit the current prompt. |
29
- | `Meta+Delete` / `Ctrl+Delete` | Delete the word to the right of the cursor. |
30
- | `Tab` | Autocomplete the current suggestion if one exists. |
31
- | `Up Arrow` | Row up, then snap to start, then history prev. |
32
- | `Ctrl+A` / `Home` | Move the cursor to the beginning of the line. |
33
- | `Ctrl+B` / `Left Arrow` | Move the cursor one character to the left. |
34
- | `Ctrl+C` | Clear the input prompt |
35
- | `Esc` (double press) | Clear the input prompt. |
36
- | `Ctrl+D` / `Delete` | Delete the character to the right of the cursor. |
37
- | `Ctrl+E` / `End` | Move the cursor to the end of the line. |
38
- | `Ctrl+F` / `Right Arrow` | Move the cursor one character to the right. |
39
- | `Ctrl+H` / `Backspace` | Delete the character to the left of the cursor. |
40
- | `Ctrl+K` | Delete from the cursor to the end of the line. |
41
- | `Ctrl+Left Arrow` / `Meta+Left Arrow` / `Meta+B` | Move the cursor one word to the left. |
42
- | `Ctrl+N` | Row down, then snap to end, then history next. |
43
- | `Ctrl+P` | Row up, then snap to start, then history prev. |
44
- | `Ctrl+R` | Reverse search through input/shell history. |
45
- | `Ctrl+Y` | Retry the last failed request. |
46
- | `Ctrl+Right Arrow` / `Meta+Right Arrow` / `Meta+F` | Move the cursor one word to the right. |
47
- | `Ctrl+U` | Delete from the cursor to the beginning of the line. |
48
- | `Ctrl+V` (Windows: `Alt+V`) | Paste clipboard content. If the clipboard contains an image, it will be saved and a reference to it will be inserted in the prompt. |
49
- | `Ctrl+W` / `Meta+Backspace` / `Ctrl+Backspace` | Delete the word to the left of the cursor. |
50
- | `Ctrl+X` / `Meta+Enter` | Open the current input in an external editor. |
22
+ | Shortcut | Description |
23
+ | ----------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------- |
24
+ | `!` | Toggle shell mode when the input is empty. |
25
+ | `?` | Toggle keyboard shortcuts display when the input is empty. |
26
+ | `Ctrl+Enter` / `Cmd+Enter` / `Shift+Enter` / `Ctrl+J` | Insert a newline. |
27
+ | `Down Arrow` | Row down, then snap to end, then history next. |
28
+ | `Enter` | Submit the current prompt. |
29
+ | `Meta+Delete` / `Ctrl+Delete` | Delete the word to the right of the cursor. |
30
+ | `Tab` | Autocomplete the current suggestion if one exists. |
31
+ | `Up Arrow` | Row up, then snap to start, then history prev. |
32
+ | `Ctrl+A` / `Home` | Move the cursor to the beginning of the line. |
33
+ | `Ctrl+B` / `Left Arrow` | Move the cursor one character to the left. |
34
+ | `Ctrl+C` | Clear the input prompt |
35
+ | `Esc` (double press) | Clear the input prompt. |
36
+ | `Ctrl+D` / `Delete` | Delete the character to the right of the cursor. |
37
+ | `Ctrl+E` / `End` | Move the cursor to the end of the line. |
38
+ | `Ctrl+F` / `Right Arrow` | Move the cursor one character to the right. |
39
+ | `Ctrl+H` / `Backspace` | Delete the character to the left of the cursor. |
40
+ | `Ctrl+K` | Delete from the cursor to the end of the line. |
41
+ | `Ctrl+Left Arrow` / `Meta+Left Arrow` / `Meta+B` | Move the cursor one word to the left. |
42
+ | `Ctrl+N` | Row down, then snap to end, then history next. |
43
+ | `Ctrl+P` | Row up, then snap to start, then history prev. |
44
+ | `Ctrl+R` | Reverse search through input/shell history. |
45
+ | `Ctrl+Y` | Retry the last failed request. |
46
+ | `Ctrl+Right Arrow` / `Meta+Right Arrow` / `Meta+F` | Move the cursor one word to the right. |
47
+ | `Ctrl+U` | Delete from the cursor to the beginning of the line. |
48
+ | `Ctrl+V` (Windows: `Alt+V`) | Paste clipboard content. If the clipboard contains an image, it will be saved and a reference to it will be inserted in the prompt. |
49
+ | `Ctrl+W` / `Meta+Backspace` / `Ctrl+Backspace` | Delete the word to the left of the cursor. |
50
+ | `Ctrl+X` / `Meta+Enter` | Open the current input in an external editor. |
51
51
 
52
52
  ## Suggestions
53
53
 
@@ -159,7 +159,9 @@ Assign severity based on the tool's own categorization:
159
159
 
160
160
  ## Step 4: Parallel multi-dimensional review
161
161
 
162
- Launch review agents by invoking all `task` tools in a **single response**. The runtime executes agent tools concurrently — they will run in parallel. You MUST include all tool calls in one response; do NOT send them one at a time. Launch **9 agents** for same-repo reviews (Agent 6 has three persona variants 6a/6b/6c that each count as a separate parallel agent), or **8 agents** (skip Agent 7: Build & Test) for cross-repo lightweight mode since there is no local codebase to build/test. Each agent should focus exclusively on its dimension.
162
+ Launch review agents by invoking all `agent` tools in a **single response**. The runtime executes agent tools concurrently — they will run in parallel. You MUST include all tool calls in one response; do NOT send them one at a time. Launch **9 agents** for same-repo reviews (Agent 6 has three persona variants 6a/6b/6c that each count as a separate parallel agent), or **8 agents** (skip Agent 7: Build & Test) for cross-repo lightweight mode since there is no local codebase to build/test. Each agent should focus exclusively on its dimension.
163
+
164
+ **Every agent MUST be an awaitable subagent: set `subagent_type: "general-purpose"` on every `agent` call.** Do NOT fork them — do not omit `subagent_type`, and never set `subagent_type: "fork"`. A fork runs fire-and-forget and its findings never come back to you, so the review would stall in Step 5 with nothing to aggregate. You need every agent's findings returned to you inline.
163
165
 
164
166
  **IMPORTANT**: Keep each agent's prompt **short** (under 200 words) to fit all tool calls in one response. Do NOT paste the full diff — give each agent:
165
167
 
@@ -571,20 +573,24 @@ gh api repos/{owner}/{repo}/pulls/{pr_number}/reviews \
571
573
  --input .qwen/tmp/qwen-review-{target}-review.json
572
574
  ```
573
575
 
574
- If there are **no confirmed findings**, submit a single-line review. Use `event=APPROVE` by default; if the presubmit JSON has `downgradeApprove=true`, use `event=COMMENT` and prepend the downgrade reasons to the body:
576
+ If there are **no confirmed findings**, submit a short summary review. Use `event=APPROVE` by default; if the presubmit JSON has `downgradeApprove=true`, use `event=COMMENT` and prepend the downgrade reasons to the body. Separate the footer from the body with a blank line so it renders on its own line — `-f body` does not interpret `\n`, so use a real line break inside the quotes:
575
577
 
576
578
  ```bash
577
579
  # downgradeApprove=false (non-self PR, green CI):
578
580
  gh api repos/{owner}/{repo}/pulls/{pr_number}/reviews \
579
581
  -f commit_id="{commit_sha}" \
580
582
  -f event="APPROVE" \
581
- -f body="No issues found. LGTM! ✅ _— YOUR_MODEL_ID via Qwen Code /review_"
583
+ -f body="No issues found. LGTM! ✅
584
+
585
+ _— YOUR_MODEL_ID via Qwen Code /review_"
582
586
 
583
587
  # downgradeApprove=true (self-PR, CI failing, or CI still running):
584
588
  gh api repos/{owner}/{repo}/pulls/{pr_number}/reviews \
585
589
  -f commit_id="{commit_sha}" \
586
590
  -f event="COMMENT" \
587
- -f body="No review findings. Downgraded from Approve to Comment: <downgradeReasons joined with '; '>. _— YOUR_MODEL_ID via Qwen Code /review_"
591
+ -f body="No review findings. Downgraded from Approve to Comment: <downgradeReasons joined with '; '>.
592
+
593
+ _— YOUR_MODEL_ID via Qwen Code /review_"
588
594
  ```
589
595
 
590
596
  Clean up the JSON file in Step 11.
@@ -39,7 +39,7 @@ Use `git diff HEAD` whenever staged changes exist. Otherwise use `git diff`.
39
39
 
40
40
  ## Step 2: Launch three review passes in parallel
41
41
 
42
- Use the `agent` tool and launch all review passes in a single response so they run concurrently. Each pass must receive the same review scope and diff command. These passes are read-only: each one inspects and reports findings only and must not modify files — all edits happen later in Step 4.
42
+ Use the `agent` tool and launch all review passes in a single response so they run concurrently. **Set `subagent_type: "general-purpose"` on every call — each pass must be an awaitable subagent whose findings return to you inline. Do NOT fork them: do not omit `subagent_type`, and never set `subagent_type: "fork"`. A fork runs fire-and-forget and never returns its findings, so there would be nothing to aggregate in Step 3.** Each pass must receive the same review scope and diff command. These passes are read-only: each one inspects and reports findings only and must not modify files — all edits happen later in Step 4.
43
43
 
44
44
  Keep each review prompt short and focused. Do not paste the full diff into the prompt. Tell each pass to read the diff itself and inspect only files relevant to its findings.
45
45
 
@@ -7,9 +7,9 @@ import {
7
7
  hasRebuiltToolRegistry,
8
8
  rebuildToolRegistryOnOverride,
9
9
  resolveSubagentApprovalMode
10
- } from "./chunk-6T7Y7USE.js";
10
+ } from "./chunk-VFW7VM7A.js";
11
11
  import "./chunk-K5PGHDBN.js";
12
- import "./chunk-HQUWWSSP.js";
12
+ import "./chunk-VIEIRAK3.js";
13
13
  import "./chunk-O4PICXES.js";
14
14
  import "./chunk-TW522KN6.js";
15
15
  import "./chunk-BJ5HQ23U.js";
@@ -23,14 +23,14 @@ import "./chunk-CPVI5J2L.js";
23
23
  import "./chunk-ZMIBJS45.js";
24
24
  import "./chunk-77WXWU44.js";
25
25
  import "./chunk-B4ZF2KSI.js";
26
- import "./chunk-RON7LFNH.js";
26
+ import "./chunk-P5CE42XM.js";
27
27
  import "./chunk-3PJXIDKI.js";
28
28
  import "./chunk-UWCTAVOD.js";
29
29
  import "./chunk-OFEVLU4C.js";
30
30
  import "./chunk-IQHSD7K5.js";
31
31
  import "./chunk-LYRSMKLS.js";
32
- import "./chunk-QILTEBWS.js";
33
- import "./chunk-A2ZIEEGJ.js";
32
+ import "./chunk-RTTAC5VW.js";
33
+ import "./chunk-ZNUMXPNK.js";
34
34
  import "./chunk-IDYDPBBN.js";
35
35
  import "./chunk-FIQECJTQ.js";
36
36
  import "./chunk-64WXLC72.js";
@@ -4,9 +4,9 @@ import {
4
4
  AgentHeadless,
5
5
  ContextState,
6
6
  templateString
7
- } from "./chunk-6T7Y7USE.js";
7
+ } from "./chunk-VFW7VM7A.js";
8
8
  import "./chunk-K5PGHDBN.js";
9
- import "./chunk-HQUWWSSP.js";
9
+ import "./chunk-VIEIRAK3.js";
10
10
  import "./chunk-O4PICXES.js";
11
11
  import "./chunk-TW522KN6.js";
12
12
  import "./chunk-BJ5HQ23U.js";
@@ -20,14 +20,14 @@ import "./chunk-CPVI5J2L.js";
20
20
  import "./chunk-ZMIBJS45.js";
21
21
  import "./chunk-77WXWU44.js";
22
22
  import "./chunk-B4ZF2KSI.js";
23
- import "./chunk-RON7LFNH.js";
23
+ import "./chunk-P5CE42XM.js";
24
24
  import "./chunk-3PJXIDKI.js";
25
25
  import "./chunk-UWCTAVOD.js";
26
26
  import "./chunk-OFEVLU4C.js";
27
27
  import "./chunk-IQHSD7K5.js";
28
28
  import "./chunk-LYRSMKLS.js";
29
- import "./chunk-QILTEBWS.js";
30
- import "./chunk-A2ZIEEGJ.js";
29
+ import "./chunk-RTTAC5VW.js";
30
+ import "./chunk-ZNUMXPNK.js";
31
31
  import "./chunk-IDYDPBBN.js";
32
32
  import "./chunk-FIQECJTQ.js";
33
33
  import "./chunk-64WXLC72.js";
@@ -6,7 +6,7 @@ import {
6
6
  } from "./chunk-KQIKOTQJ.js";
7
7
  import {
8
8
  RequestTokenizer
9
- } from "./chunk-3NRO6NHX.js";
9
+ } from "./chunk-MN5RAXVB.js";
10
10
  import {
11
11
  Blob,
12
12
  File,
@@ -9,7 +9,7 @@ import {
9
9
  BaseToolInvocation,
10
10
  ToolDisplayNames,
11
11
  ToolNames
12
- } from "./chunk-A2ZIEEGJ.js";
12
+ } from "./chunk-ZNUMXPNK.js";
13
13
  import {
14
14
  createDebugLogger
15
15
  } from "./chunk-HA2UEYZP.js";
@@ -6,7 +6,7 @@ import {
6
6
  getLanguageSettingsOptions,
7
7
  t,
8
8
  writeStderrLine
9
- } from "./chunk-XZTNBSMW.js";
9
+ } from "./chunk-6X6PTTH3.js";
10
10
  import {
11
11
  DEFAULT_STOP_HOOK_BLOCK_CAP,
12
12
  DEFAULT_TOOL_OUTPUT_BATCH_BUDGET,
@@ -17,11 +17,11 @@ import {
17
17
  SkillError,
18
18
  ideContextStore,
19
19
  require_main
20
- } from "./chunk-6T7Y7USE.js";
20
+ } from "./chunk-VFW7VM7A.js";
21
21
  import {
22
22
  isWithinRoot,
23
23
  stripRuntimeSnapshotPrefix
24
- } from "./chunk-RON7LFNH.js";
24
+ } from "./chunk-P5CE42XM.js";
25
25
  import {
26
26
  atomicWriteFileSync
27
27
  } from "./chunk-LXYWINWF.js";
@@ -19966,7 +19966,7 @@ __name(getPackageJson, "getPackageJson");
19966
19966
  // packages/cli/src/utils/version.ts
19967
19967
  async function getCliVersion() {
19968
19968
  const pkgJson = await getPackageJson();
19969
- return "0.18.1";
19969
+ return "0.18.3-preview.0";
19970
19970
  }
19971
19971
  __name(getCliVersion, "getCliVersion");
19972
19972
 
@@ -20108,6 +20108,10 @@ function createLoadedSettingsAdapter(settings, scope) {
20108
20108
  }
20109
20109
  __name(createLoadedSettingsAdapter, "createLoadedSettingsAdapter");
20110
20110
 
20111
+ // packages/acp-bridge/src/bridgeTypes.ts
20112
+ init_esbuild_shims();
20113
+ var MID_TURN_QUEUE_DRAIN_METHOD = "craft/drainMidTurnQueue";
20114
+
20111
20115
  // packages/cli/src/utils/systemInfo.ts
20112
20116
  init_esbuild_shims();
20113
20117
  import process4 from "node:process";
@@ -20116,7 +20120,7 @@ import { execFile } from "node:child_process";
20116
20120
 
20117
20121
  // packages/cli/src/generated/git-commit.ts
20118
20122
  init_esbuild_shims();
20119
- var GIT_COMMIT_INFO = "40697db8e";
20123
+ var GIT_COMMIT_INFO = "33b70f028";
20120
20124
 
20121
20125
  // packages/cli/src/utils/systemInfo.ts
20122
20126
  var debugLogger4 = createDebugLogger("STATUS");
@@ -20379,6 +20383,7 @@ export {
20379
20383
  ACP_PREFLIGHT_KINDS,
20380
20384
  createIdleAcpPreflightCells,
20381
20385
  mapDomainErrorToErrorKind,
20386
+ MID_TURN_QUEUE_DRAIN_METHOD,
20382
20387
  formatMemoryUsage,
20383
20388
  formatRelativeTime,
20384
20389
  formatTokenCount,
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  resolveBundleDir
5
- } from "./chunk-6T7Y7USE.js";
5
+ } from "./chunk-VFW7VM7A.js";
6
6
  import {
7
7
  Storage
8
8
  } from "./chunk-HA2UEYZP.js";
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  ToolNames
5
- } from "./chunk-A2ZIEEGJ.js";
5
+ } from "./chunk-ZNUMXPNK.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -2,12 +2,12 @@
2
2
  "use strict";
3
3
  import {
4
4
  RequestTokenizer
5
- } from "./chunk-3NRO6NHX.js";
5
+ } from "./chunk-MN5RAXVB.js";
6
6
  import {
7
7
  OpenAIContentConverter,
8
8
  TaggedThinkingParser,
9
9
  openaiRequestCaptureContext
10
- } from "./chunk-RON7LFNH.js";
10
+ } from "./chunk-P5CE42XM.js";
11
11
  import {
12
12
  createChildAbortController
13
13
  } from "./chunk-64WXLC72.js";
@@ -307,11 +307,11 @@ var ImageTokenizer = class _ImageTokenizer {
307
307
  if (entryOffset + 12 > buffer.length) break;
308
308
  const tag = isLittleEndian ? buffer.readUInt16LE(entryOffset) : buffer.readUInt16BE(entryOffset);
309
309
  const type = isLittleEndian ? buffer.readUInt16LE(entryOffset + 2) : buffer.readUInt16BE(entryOffset + 2);
310
- const value = isLittleEndian ? buffer.readUInt32LE(entryOffset + 8) : buffer.readUInt32BE(entryOffset + 8);
310
+ const value = type === 3 ? isLittleEndian ? buffer.readUInt16LE(entryOffset + 8) : buffer.readUInt16BE(entryOffset + 8) : isLittleEndian ? buffer.readUInt32LE(entryOffset + 8) : buffer.readUInt32BE(entryOffset + 8);
311
311
  if (tag === 256) {
312
- width = type === 3 ? value : value;
312
+ width = value;
313
313
  } else if (tag === 257) {
314
- height = type === 3 ? value : value;
314
+ height = value;
315
315
  }
316
316
  if (width > 0 && height > 0) break;
317
317
  }
@@ -26,13 +26,13 @@ import {
26
26
  } from "./chunk-LYRSMKLS.js";
27
27
  import {
28
28
  STRUCTURED_OUTPUT_REDACTED_ARGS
29
- } from "./chunk-QILTEBWS.js";
29
+ } from "./chunk-RTTAC5VW.js";
30
30
  import {
31
31
  BaseDeclarativeTool,
32
32
  BaseToolInvocation,
33
33
  ToolDisplayNames,
34
34
  ToolNames
35
- } from "./chunk-A2ZIEEGJ.js";
35
+ } from "./chunk-ZNUMXPNK.js";
36
36
  import {
37
37
  atomicWriteFile
38
38
  } from "./chunk-LXYWINWF.js";
@@ -72004,11 +72004,11 @@ async function createContentGenerator(generatorConfig, config, isInitialAuth) {
72004
72004
  let baseGenerator;
72005
72005
  try {
72006
72006
  if (authType === "openai" /* USE_OPENAI */) {
72007
- const { createOpenAIContentGenerator } = await import("./openaiContentGenerator-5PLHYJQL.js");
72007
+ const { createOpenAIContentGenerator } = await import("./openaiContentGenerator-DRXB5MSN.js");
72008
72008
  baseGenerator = createOpenAIContentGenerator(generatorConfig, config);
72009
72009
  } else if (authType === "qwen-oauth" /* QWEN_OAUTH */) {
72010
72010
  const { getQwenOAuthClient: getQwenOauthClient } = await import("./qwenOAuth2-KK433U33.js");
72011
- const { QwenContentGenerator } = await import("./qwenContentGenerator-TSKW73KY.js");
72011
+ const { QwenContentGenerator } = await import("./qwenContentGenerator-3XZMXLHX.js");
72012
72012
  try {
72013
72013
  const qwenClient = await getQwenOauthClient(
72014
72014
  config,
@@ -72026,10 +72026,10 @@ async function createContentGenerator(generatorConfig, config, isInitialAuth) {
72026
72026
  throw new Error(error instanceof Error ? error.message : String(error));
72027
72027
  }
72028
72028
  } else if (authType === "anthropic" /* USE_ANTHROPIC */) {
72029
- const { createAnthropicContentGenerator } = await import("./anthropicContentGenerator-DCI26OQF.js");
72029
+ const { createAnthropicContentGenerator } = await import("./anthropicContentGenerator-KLBHYGH6.js");
72030
72030
  baseGenerator = createAnthropicContentGenerator(generatorConfig, config);
72031
72031
  } else if (authType === "gemini" /* USE_GEMINI */ || authType === "vertex-ai" /* USE_VERTEX_AI */) {
72032
- const { createGeminiContentGenerator } = await import("./geminiContentGenerator-HFJIGO77.js");
72032
+ const { createGeminiContentGenerator } = await import("./geminiContentGenerator-SDUMCYHD.js");
72033
72033
  baseGenerator = createGeminiContentGenerator(generatorConfig, config);
72034
72034
  } else {
72035
72035
  throw new Error(
@@ -2,7 +2,7 @@
2
2
  "use strict";
3
3
  import {
4
4
  getGlobalQwenDir
5
- } from "./chunk-HED55F43.js";
5
+ } from "./chunk-VU6A2OBJ.js";
6
6
  import {
7
7
  init_esbuild_shims
8
8
  } from "./chunk-A4BMJM77.js";
@@ -5,7 +5,7 @@ import {
5
5
  BaseToolInvocation,
6
6
  ToolDisplayNames,
7
7
  ToolNames
8
- } from "./chunk-A2ZIEEGJ.js";
8
+ } from "./chunk-ZNUMXPNK.js";
9
9
  import {
10
10
  init_esbuild_shims
11
11
  } from "./chunk-A4BMJM77.js";
@@ -2,21 +2,21 @@
2
2
  "use strict";
3
3
  import {
4
4
  t
5
- } from "./chunk-XZTNBSMW.js";
5
+ } from "./chunk-6X6PTTH3.js";
6
6
  import {
7
7
  computeThresholds,
8
8
  getCoreSystemPrompt
9
- } from "./chunk-6T7Y7USE.js";
9
+ } from "./chunk-VFW7VM7A.js";
10
10
  import {
11
11
  buildSkillLlmContent
12
12
  } from "./chunk-CPVI5J2L.js";
13
13
  import {
14
14
  DiscoveredMCPTool,
15
15
  uiTelemetryService
16
- } from "./chunk-RON7LFNH.js";
16
+ } from "./chunk-P5CE42XM.js";
17
17
  import {
18
18
  ToolNames
19
- } from "./chunk-A2ZIEEGJ.js";
19
+ } from "./chunk-ZNUMXPNK.js";
20
20
  import {
21
21
  DEFAULT_TOKEN_LIMIT
22
22
  } from "./chunk-LYSND7KR.js";