@qwen-code/qwen-code 0.19.3 → 0.19.4-nightly.20260702.46814e4f1
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.
- package/bundled/loop/SKILL.md +22 -3
- package/bundled/loop/SKILL.test.ts +20 -0
- package/bundled/loop/autonomous-loop.test.ts +59 -0
- package/bundled/loop/autonomous-loop.ts +102 -0
- package/bundled/loop/loop-task-file.test.ts +1064 -0
- package/bundled/loop/loop-task-file.ts +404 -0
- package/bundled/loop/loop-tick-resolver.test.ts +906 -0
- package/bundled/loop/loop-tick-resolver.ts +416 -0
- package/bundled/qc-helper/SKILL.md +12 -5
- package/bundled/qc-helper/docs/configuration/auth.md +1 -1
- package/bundled/qc-helper/docs/configuration/settings.md +62 -32
- package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
- package/bundled/qc-helper/docs/features/auto-mode.md +40 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +81 -18
- package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
- package/bundled/qc-helper/docs/features/code-review.md +17 -61
- package/bundled/qc-helper/docs/features/commands.md +42 -40
- package/bundled/qc-helper/docs/features/headless.md +19 -18
- package/bundled/qc-helper/docs/features/hooks.md +6 -1
- package/bundled/qc-helper/docs/features/mcp.md +3 -1
- package/bundled/qc-helper/docs/features/memory.md +1 -1
- package/bundled/qc-helper/docs/features/scheduled-tasks.md +10 -0
- package/bundled/qc-helper/docs/features/status-line.md +3 -3
- package/bundled/qc-helper/docs/ide-integration/ide-integration.md +4 -4
- package/bundled/qc-helper/docs/qwen-serve.md +53 -0
- package/bundled/qc-helper/docs/support/troubleshooting.md +11 -0
- package/bundled/review/DESIGN.md +21 -26
- package/bundled/review/SKILL.md +45 -129
- package/chunks/MaxSizedBox-GHGRQ2OS.js +69 -0
- package/chunks/{StandaloneSessionPicker-Z52JTYST.js → StandaloneSessionPicker-G7YTTM27.js} +49 -42
- package/chunks/{acpAgent-7RZUOWOM.js → acpAgent-SDOILBSU.js} +1325 -365
- package/chunks/{agent-4FG7WTHJ.js → agent-NTSXGV4L.js} +31 -25
- package/chunks/agent-headless-WYURMSAB.js +62 -0
- package/chunks/{anthropicContentGenerator-PFITVL7Y.js → anthropicContentGenerator-WL3LJOUB.js} +110 -31
- package/chunks/{artifact-tool-D2X7G3C3.js → artifact-tool-W76WC2JX.js} +3 -3
- package/chunks/{askUserQuestion-UGETICJQ.js → askUserQuestion-J3P6TH3V.js} +2 -2
- package/chunks/bridge-AMOL4W4P.js +73 -0
- package/chunks/{ca-IUFWESZL.js → ca-HCMB2I54.js} +10 -9
- package/chunks/channel-worker-supervisor-C3IB63V7.js +659 -0
- package/chunks/{chunk-STUWFKGD.js → chunk-26JIREA5.js} +466 -543
- package/chunks/{chunk-SLNKLLEO.js → chunk-2MRV62AU.js} +37 -8
- package/chunks/{chunk-ODLIHNOY.js → chunk-2U4HUMOL.js} +1 -1
- package/chunks/{chunk-CKQA6AWF.js → chunk-4D73HUOP.js} +1 -1
- package/chunks/{chunk-M2U5NM24.js → chunk-54YZOP7P.js} +309 -72
- package/chunks/{chunk-J7FA27RO.js → chunk-5LKL3PAU.js} +3 -3
- package/chunks/chunk-5P5XGNYH.js +93 -0
- package/chunks/{chunk-UFLGERMB.js → chunk-6JE32BRB.js} +178 -124
- package/chunks/{chunk-FKAVULLM.js → chunk-75AVTQJ2.js} +74 -10
- package/chunks/{chunk-I2LYBGNI.js → chunk-7IOMIYOE.js} +1 -1
- package/chunks/{chunk-4LUZAKMK.js → chunk-7KXAGQJ2.js} +1 -1
- package/chunks/{chunk-BXSHL2SF.js → chunk-7LUOQJ3D.js} +1 -1
- package/chunks/{chunk-YAINVQ3Q.js → chunk-A5OPLHFM.js} +18693 -17055
- package/chunks/chunk-AHNXYU4O.js +24 -0
- package/chunks/{chunk-UX4SGCGN.js → chunk-AVQDCKNF.js} +96 -22
- package/chunks/{chunk-HYCC3XM3.js → chunk-B236XPGF.js} +1 -1
- package/chunks/chunk-B6SZLQAZ.js +3523 -0
- package/chunks/{chunk-5DWXLGOM.js → chunk-BJBWRCSK.js} +1 -1
- package/chunks/chunk-BPFJQGY7.js +193 -0
- package/chunks/{chunk-SKQZZVAV.js → chunk-BZHLWC6T.js} +2 -2
- package/chunks/{chunk-U3KSMM7G.js → chunk-D5KISTLW.js} +339 -383
- package/chunks/{chunk-GT2FGICD.js → chunk-DE7YXUR7.js} +1 -1
- package/chunks/{chunk-BUUQ5HPX.js → chunk-DG573EOO.js} +1 -1
- package/chunks/{chunk-VVLOGDB6.js → chunk-DX3TKXNT.js} +2 -2
- package/chunks/chunk-E5A7LHNN.js +51 -0
- package/chunks/{chunk-3PJXIDKI.js → chunk-E6US47KI.js} +3 -27
- package/chunks/{chunk-QBZ22PQX.js → chunk-EWALXUAD.js} +3 -1
- package/chunks/{chunk-PDE7CSDS.js → chunk-FXKI7OW6.js} +2 -2
- package/chunks/{chunk-F3ZYSEY6.js → chunk-FY4TT4L4.js} +3 -3
- package/chunks/{chunk-QLDPRILK.js → chunk-G7OQ3RFJ.js} +3 -3
- package/chunks/{chunk-R2BXK7SX.js → chunk-GHOTR7HL.js} +6 -1
- package/chunks/{chunk-KMGMKW5Q.js → chunk-GLPV75ES.js} +9 -3
- package/chunks/{chunk-LD2XBG6Z.js → chunk-GO6LNQXT.js} +1 -39
- package/chunks/{chunk-CNLEDYE3.js → chunk-H6TNLOLM.js} +5 -5
- package/chunks/{chunk-JVHEVCAU.js → chunk-HLW4EGKR.js} +31 -6
- package/chunks/{chunk-I4H7PRWQ.js → chunk-HTWHAN44.js} +1 -1
- package/chunks/{chunk-QE6KJYLT.js → chunk-IPYE5BIS.js} +123 -25
- package/chunks/{chunk-EJYJYJZ2.js → chunk-IRJWHZWU.js} +3 -70
- package/chunks/{chunk-EDMZZFDU.js → chunk-J3YPTTNL.js} +930 -798
- package/chunks/{chunk-GGBIN5K7.js → chunk-JGAJMIJZ.js} +1 -1
- package/chunks/{chunk-N4EJFBN5.js → chunk-JVLP5US5.js} +427 -263
- package/chunks/{chunk-R5OP2ATH.js → chunk-JZG7VB6C.js} +11 -11
- package/chunks/{chunk-QI7GOGJR.js → chunk-KKQWC6WS.js} +1 -1
- package/chunks/{chunk-ADCIHOQZ.js → chunk-KX5QZRW2.js} +142 -30
- package/chunks/{chunk-SBBN4BWR.js → chunk-L7OJ3ZO3.js} +1 -1
- package/chunks/{chunk-NDOC6M5S.js → chunk-L7QPM2YD.js} +2 -2
- package/chunks/{chunk-BVSVIN45.js → chunk-LKWAVAB5.js} +3 -3
- package/chunks/{chunk-T4T2FNV4.js → chunk-LOW52WYZ.js} +2 -2
- package/chunks/{chunk-4QK3O43S.js → chunk-LU7BIVWC.js} +4 -4
- package/chunks/{chunk-ZP6UKOPB.js → chunk-LWGLBVWA.js} +1 -1
- package/chunks/{chunk-L7OKCI7T.js → chunk-M7BLWURA.js} +15 -1
- package/chunks/{chunk-PR32FRT6.js → chunk-MIM62IXS.js} +3 -3
- package/chunks/{chunk-RD6YJJJ6.js → chunk-MOUXUCXQ.js} +1 -1
- package/chunks/{chunk-VBZ452JT.js → chunk-MSNGFH6L.js} +494 -114
- package/chunks/{chunk-BX5YO7UW.js → chunk-MTNTVOJR.js} +542 -370
- package/chunks/chunk-MX2YXRER.js +44 -0
- package/chunks/chunk-NIOPRZNN.js +27 -0
- package/chunks/{chunk-SMYQZVZ3.js → chunk-NOGSPTLJ.js} +1 -1
- package/chunks/{chunk-DDMOU62Q.js → chunk-NPQWQYU6.js} +1 -1
- package/chunks/{chunk-MNF6S5PR.js → chunk-P5THQV6A.js} +4 -4
- package/chunks/{chunk-6V4NZFUS.js → chunk-PCYOT4PK.js} +5 -5
- package/chunks/{chunk-CF6BB3LT.js → chunk-PPFWEV7G.js} +10 -1
- package/chunks/{chunk-FXKVLFFY.js → chunk-PSFDB5FZ.js} +3 -3
- package/chunks/{chunk-XJYUPHRC.js → chunk-QOMAHFYI.js} +3 -3
- package/chunks/{chunk-J37FGIOA.js → chunk-QXPI7FEC.js} +38 -4
- package/chunks/{chunk-RRFZXMYP.js → chunk-QZDBHNMV.js} +691 -164
- package/chunks/{chunk-S7AKE7HL.js → chunk-R6RI2HIC.js} +63 -9
- package/chunks/{chunk-HZT4UCFB.js → chunk-RB7S52NJ.js} +4 -4
- package/chunks/{chunk-J33ZR6OJ.js → chunk-RK22ACPP.js} +16 -16
- package/chunks/chunk-RM3PGSGL.js +66 -0
- package/chunks/chunk-RNBYOUGV.js +42 -0
- package/chunks/chunk-S6RLAIUR.js +23 -0
- package/chunks/{chunk-3TV3HUWZ.js → chunk-SCYK2YLI.js} +81 -30
- package/chunks/{chunk-HPZTOP4I.js → chunk-SEKRT4SD.js} +133 -23
- package/chunks/chunk-SEZC2725.js +36 -0
- package/chunks/chunk-SIUQ3YYX.js +78 -0
- package/chunks/{chunk-O2VBQ3Y2.js → chunk-SJBIFVD2.js} +2 -2
- package/chunks/chunk-SYCJMSIJ.js +82 -0
- package/chunks/{chunk-JE5FVRPC.js → chunk-T22H4V4R.js} +48 -23
- package/chunks/{chunk-3227DZO4.js → chunk-T42ACHFI.js} +1 -1
- package/chunks/{chunk-UO5GVXQE.js → chunk-TENOUWY2.js} +3 -3
- package/chunks/{chunk-JOLIREYR.js → chunk-TOAUDIS7.js} +1 -1
- package/chunks/{chunk-QNKBEJO2.js → chunk-UA6XBZT7.js} +2776 -1289
- package/chunks/{chunk-O75BHFQW.js → chunk-UQTYK5SS.js} +2 -2
- package/chunks/{chunk-Y6YMRS3U.js → chunk-UY2TCIZS.js} +17 -3
- package/chunks/{chunk-FNJ7BDPH.js → chunk-UY7ZAYTY.js} +10 -7
- package/chunks/{chunk-UYT3MWEB.js → chunk-UYHWM24C.js} +30 -2
- package/chunks/{chunk-SMXULRAN.js → chunk-VXGPYF7U.js} +1 -1
- package/chunks/{chunk-BTLJ2MF5.js → chunk-W7CG5HPC.js} +3 -3
- package/chunks/{chunk-JJXWTVSK.js → chunk-XHZKDN7M.js} +34 -1
- package/chunks/{chunk-K5XU6E4T.js → chunk-XKSCTXPK.js} +2 -2
- package/chunks/chunk-Y4LITCRB.js +367 -0
- package/chunks/chunk-YHTNWGRR.js +239 -0
- package/chunks/{chunk-BKXBARJZ.js → chunk-YPCPZSZB.js} +1 -1
- package/chunks/{chunk-QWFNTRH4.js → chunk-YSM24SCE.js} +1 -1
- package/chunks/chunk-YTFBURQD.js +313 -0
- package/chunks/{chunk-NL4C3H6C.js → chunk-YXK4GPYO.js} +1 -1
- package/chunks/{chunk-RYLJU2DY.js → chunk-ZN5T4BHI.js} +1 -1
- package/chunks/{computer-use-JGB36FDW.js → computer-use-MTSVPLPY.js} +34 -28
- package/chunks/contextCommand-VGJ3BPTK.js +67 -0
- package/chunks/{cron-create-SKEY55RG.js → cron-create-6YTCOX6P.js} +4 -4
- package/chunks/{cron-delete-I3NAT32Z.js → cron-delete-E3NIFSUK.js} +4 -4
- package/chunks/{cron-list-6XRRL6TH.js → cron-list-Q64MNQNE.js} +4 -4
- package/chunks/daemon-EEB2RYOL.js +8453 -0
- package/chunks/daemon-status-provider-H5SNMK42.js +71 -0
- package/chunks/{de-EOW5PVHF.js → de-PLLFDERI.js} +10 -9
- package/chunks/{dist-NHEYYB2B.js → dist-ADMIQGHI.js} +2 -2
- package/chunks/{dist-J37VXPLD.js → dist-BCQ7INM7.js} +40 -15
- package/chunks/{dist-663NZ6MI.js → dist-KNZFCY5F.js} +116 -11
- package/chunks/{dist-LB6OGPVM.js → dist-LHUWC3K6.js} +26 -5
- package/chunks/{dist-PQPZ5Q4N.js → dist-WBBZ76JZ.js} +20 -9
- package/chunks/{earlyInputCapture-44RISVVJ.js → earlyInputCapture-U4ZIQSQU.js} +32 -26
- package/chunks/{edit-NN6GM5DT.js → edit-SYIQ2KBI.js} +41 -38
- package/chunks/{en-HPWEJBTR.js → en-M4EBUBNU.js} +32 -10
- package/chunks/{enter-worktree-PB3O2C7D.js → enter-worktree-HPPOO244.js} +31 -25
- package/chunks/{enterPlanMode-YQFNNSUA.js → enterPlanMode-56YYO52U.js} +41 -25
- package/chunks/{errors-LS7XU5DZ.js → errors-EO4SXCFP.js} +33 -27
- package/chunks/{exit-worktree-E2FTNSBK.js → exit-worktree-UDM7E6XH.js} +31 -25
- package/chunks/{exitPlanMode-GLYK2BUB.js → exitPlanMode-M6P3AWLJ.js} +149 -33
- package/chunks/{fast-path-WQ6M7LI7.js → fast-path-42P4QYWI.js} +33 -14
- package/chunks/{fast-path-settings-OAGU3X5H.js → fast-path-settings-UQLRFDQP.js} +2 -2
- package/chunks/{fr-BN5NKSAC.js → fr-MBMNQSQ6.js} +10 -9
- package/chunks/{gemini-2YFLVA2M.js → gemini-NRLXS5J7.js} +84 -70
- package/chunks/{geminiContentGenerator-XV6SV6CD.js → geminiContentGenerator-DLJPYYPA.js} +41 -5
- package/chunks/{glob-2H6CDDMK.js → glob-JPY3F74Y.js} +31 -25
- package/chunks/{grep-VXIUXM3C.js → grep-HW23YES5.js} +31 -25
- package/chunks/initializer-HWOZTC4A.js +67 -0
- package/chunks/{ja-7DEUB2TS.js → ja-HFV5QCHR.js} +10 -9
- package/chunks/{keychain-token-storage-YLMDLKXT.js → keychain-token-storage-GPAKRDKQ.js} +2 -2
- package/chunks/list-OZGAGRDG.js +71 -0
- package/chunks/loadedSettingsAdapter-RUTZVVIA.js +66 -0
- package/chunks/{loop-wakeup-CITGGQHA.js → loop-wakeup-G2EHBRGR.js} +5 -5
- package/chunks/{ls-R5WP4BGZ.js → ls-IDHUVSAG.js} +4 -4
- package/chunks/{lsp-GSICJMMW.js → lsp-FSRYXGFT.js} +2 -2
- package/chunks/{monitor-HKLRS2HQ.js → monitor-QVWEIXU3.js} +33 -26
- package/chunks/nonInteractiveCli-RV2WYPML.js +109 -0
- package/chunks/{notebook-edit-Y6SKSGTT.js → notebook-edit-B26W3FFH.js} +37 -34
- package/chunks/{openaiContentGenerator-J7G2FYJT.js → openaiContentGenerator-6TH7AZGQ.js} +15 -13
- package/chunks/pidfile-KW2QQJZI.js +73 -0
- package/chunks/{pt-TNZRNLQB.js → pt-2THT3YHA.js} +10 -9
- package/chunks/{qwenContentGenerator-5XIEM5GV.js → qwenContentGenerator-5IQAC7RN.js} +33 -27
- package/chunks/{qwenOAuth2-AG3PFFLZ.js → qwenOAuth2-LWLA6MQG.js} +5 -4
- package/chunks/{read-file-J7D552ZJ.js → read-file-CWFAHOI2.js} +11 -10
- package/chunks/{read-mcp-resource-DQQW7H7T.js → read-mcp-resource-PIJF24RO.js} +2 -2
- package/chunks/ripGrep-FTZGDKY4.js +60 -0
- package/chunks/{ru-NIAUBKCN.js → ru-Z67YJHBG.js} +10 -9
- package/chunks/{run-qwen-serve-SGEEVMXD.js → run-qwen-serve-FN2SW5ZI.js} +545 -97
- package/chunks/{scheduler-7CQI3S4Q.js → scheduler-BMS23O3I.js} +31 -25
- package/chunks/{send-message-EE4TWKVU.js → send-message-33PYFMCT.js} +20 -4
- package/chunks/serve-PXFYKL65.js +71 -0
- package/chunks/{server-4QMUWXPW.js → server-BRKALJ4F.js} +4132 -1175
- package/chunks/{session-NRO7UFOY.js → session-AQMISBP4.js} +205 -64
- package/chunks/{settings-SGWRDQSC.js → settings-JCPVUZMB.js} +35 -29
- package/chunks/{shell-62ANGIHL.js → shell-POHCRVN2.js} +31 -25
- package/chunks/{skill-VWAQAWW6.js → skill-QPEVHS6H.js} +13 -12
- package/chunks/spawnChannel-V3QT62TE.js +69 -0
- package/chunks/{src-KUV5J5Q2.js → src-IZSP7L6Y.js} +127 -32
- package/chunks/{startInteractiveUI-6EYJN3JV.js → startInteractiveUI-63KATISO.js} +16762 -16075
- package/chunks/{syntheticOutput-T5YHQ6S2.js → syntheticOutput-YOSWIHDJ.js} +3 -3
- package/chunks/{task-create-BLY7RHXX.js → task-create-NHS2NGB3.js} +9 -7
- package/chunks/{task-list-3QUYNVYR.js → task-list-5UIB564R.js} +7 -6
- package/chunks/{task-stop-U4RATK2V.js → task-stop-HGXZ2VZ3.js} +2 -2
- package/chunks/{task-update-U54O7KJX.js → task-update-IYYWUILG.js} +40 -7
- package/chunks/{team-create-LPOGCPM7.js → team-create-E5O2F3CA.js} +31 -25
- package/chunks/{team-delete-LKBYPASD.js → team-delete-FEKJCU4P.js} +7 -6
- package/chunks/team-plan-approval-2TU4YROB.js +202 -0
- package/chunks/theme-manager-37KOGPJL.js +64 -0
- package/chunks/{todoWrite-OYXKTVYN.js → todoWrite-TKMVZ2HT.js} +4 -4
- package/chunks/{tool-search-YPUFJ3ZQ.js → tool-search-4ZTGNSFI.js} +38 -11
- package/chunks/{trustedFolders-5B24TMEA.js → trustedFolders-RJ5WXJ6L.js} +32 -26
- package/chunks/{validateNonInterActiveAuth-BTDTYOVT.js → validateNonInterActiveAuth-ZWMHZAOK.js} +66 -55
- package/chunks/{web-fetch-EEB5LZYU.js → web-fetch-J4PIW36Q.js} +5 -4
- package/chunks/{workflow-LAWIW5LI.js → workflow-6PG2PC5M.js} +68 -39
- package/chunks/workspace-providers-status-4QIZN2W4.js +68 -0
- package/chunks/workspace-service-CYMCOEIO.js +78 -0
- package/chunks/{write-file-PCV226DJ.js → write-file-R354LGQF.js} +41 -40
- package/chunks/{zh-5EUYXASN.js → zh-SLZNSSZB.js} +32 -10
- package/chunks/{zh-TW-TR3XYGE5.js → zh-TW-P53C2SL5.js} +32 -10
- package/cli.js +6 -6
- package/locales/ca.js +15 -13
- package/locales/de.js +15 -13
- package/locales/en.js +52 -15
- package/locales/fr.js +15 -14
- package/locales/ja.js +15 -14
- package/locales/pt.js +15 -13
- package/locales/ru.js +15 -13
- package/locales/zh-TW.js +50 -14
- package/locales/zh.js +50 -14
- package/node_modules/@qwen-code/audio-capture/package.json +1 -1
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
- package/package.json +15 -6
- package/patches/chrome-devtools-mcp+1.4.0.patch +31 -0
- package/postinstall.js +50 -0
- package/web-shell/assets/{arc-DA7r8Ueo.js → arc-Bd3048nX.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-ZDUxPtZ2.js → architectureDiagram-3BPJPVTR-DyzbzABx.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-vrtOf1kJ.js → blockDiagram-GPEHLZMM-CTjxm9Sy.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-BHFjzIi4.js → c4Diagram-AAUBKEIU-DSOFWNU6.js} +1 -1
- package/web-shell/assets/channel-oVoup_Ci.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-mdeQVz59.js → chunk-2J33WTMH-D_PFdjo2.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BkKMlwBX.js → chunk-4BX2VUAB-52eG6wOT.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-B7bnXNfu.js → chunk-55IACEB6-CGTZfKkC.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DGz8Mm6i.js → chunk-727SXJPM-CZ-qfRUm.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-BQAydUNk.js → chunk-AQP2D5EJ-B2dSDcqM.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-GHr2LN_p.js → chunk-FMBD7UC4-Cfy3tyA0.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-7R91lnUx.js → chunk-ND2GUHAM-CApNUpUq.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-aTJD3lSQ.js → chunk-QZHKN3VN-CVBG8kgg.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-B8WsaT2G.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-B8WsaT2G.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BTf8t1RL.js → cose-bilkent-S5V4N54A-URd77-_-.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-_sgp3WuA.js → dagre-BM42HDAG-C07H4G9-.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-CROtRy1w.js → diagram-2AECGRRQ-CYbpXrSn.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-BqGRzwSc.js → diagram-5GNKFQAL-SI8s6fjX.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-CMrcEtA7.js → diagram-KO2AKTUF-mBkC4RTW.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-BRydGNW5.js → diagram-LMA3HP47-CyBPDzWJ.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-D0ilgNjV.js → diagram-OG6HWLK6-DwK7kBCu.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-2lnQeJUM.js → erDiagram-TEJ5UH35-Ds1StEUd.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-C_ZMdQiC.js → flowDiagram-I6XJVG4X-BDC4-jHO.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-Dw9V_Ny0.js → ganttDiagram-6RSMTGT7-CV2aHQqf.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-HDXI-F1B.js → gitGraphDiagram-PVQCEYII-B8RcuV_L.js} +1 -1
- package/web-shell/assets/index-B5WZ0qP1.js +717 -0
- package/web-shell/assets/index-CYE1IMd1.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-CuB8Ebua.js → infoDiagram-5YYISTIA-DUPoTf50.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D_tyhVwh.js → ishikawaDiagram-YF4QCWOH-FDYOx9rf.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-CgCwJQNU.js → journeyDiagram-JHISSGLW-C5_ohMRp.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-PZUtcbPx.js → kanban-definition-UN3LZRKU-Bn4UnOMG.js} +1 -1
- package/web-shell/assets/{linear-CZqRdJIU.js → linear-Bl0pKQtY.js} +1 -1
- package/web-shell/assets/{mermaid.core-CPW_4UEF.js → mermaid.core-sevQFoji.js} +72 -72
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-D_Y75ID7.js → mindmap-definition-RKZ34NQL-DSH4JZF9.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-Q4dTyLeF.js → pieDiagram-4H26LBE5-acWvdQTD.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-ckw329Ft.js → quadrantDiagram-W4KKPZXB-DlggX4Sm.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-DbVDm4It.js → requirementDiagram-4Y6WPE33--mMqwmV8.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-CHuZ_ecH.js → sankeyDiagram-5OEKKPKP-BtV9tZ77.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DU2YSpq-.js → sequenceDiagram-3UESZ5HK-iDQzPFlj.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-CA9PEBUo.js → stateDiagram-AJRCARHV-CsCyQLZ3.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-CPapECG9.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Bhlo4WVc.js → timeline-definition-PNZ67QCA-Dl0rnKvr.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-6xtPLsyl.js → vennDiagram-CIIHVFJN-qF7nTZzA.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-3eozmXPf.js → wardley-L42UT6IY-fWoK9i7F.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BOn6hKss.js → wardleyDiagram-YWT4CUSO-pHGfkMnc.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-BsP4-I_y.js → xychartDiagram-2RQKCTM6-3Doc4Trz.js} +1 -1
- package/web-shell/index.html +18 -2
- package/chunks/MaxSizedBox-QNF3EIGU.js +0 -63
- package/chunks/agent-headless-RQ5BTX3G.js +0 -56
- package/chunks/bridge-JL2PMCIW.js +0 -66
- package/chunks/chunk-5GOVVXEV.js +0 -73
- package/chunks/chunk-BC3C4F3Q.js +0 -40
- package/chunks/chunk-BW4KCQFD.js +0 -1103
- package/chunks/chunk-RKIZXJMB.js +0 -13
- package/chunks/contextCommand-WYU6OQ2F.js +0 -61
- package/chunks/daemon-status-provider-HH2EC5FI.js +0 -65
- package/chunks/headlessSafetyWarnings-TBE35GJ4.js +0 -55
- package/chunks/initializer-2Y7SLOKV.js +0 -61
- package/chunks/list-ZAFHZ7OS.js +0 -65
- package/chunks/loadedSettingsAdapter-6KJXD6M3.js +0 -60
- package/chunks/nonInteractiveCli-5W4GIZQM.js +0 -96
- package/chunks/ripGrep-IEIFIWP4.js +0 -54
- package/chunks/serve-V6GVZR6U.js +0 -65
- package/chunks/spawnChannel-3VHW5EPY.js +0 -63
- package/chunks/theme-manager-LYLGAERF.js +0 -58
- package/chunks/workspace-providers-status-PIAFVYHA.js +0 -62
- package/chunks/workspace-service-YAIOD4HG.js +0 -71
- package/web-shell/assets/channel-iRo68q4Q.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-iHF24a8X.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-iHF24a8X.js +0 -1
- package/web-shell/assets/index-CHmzAWys.css +0 -5
- package/web-shell/assets/index-w6GTOHh1.js +0 -713
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-t1LRI0oY.js +0 -1
|
@@ -28,8 +28,7 @@ The `/review` command runs a multi-stage pipeline:
|
|
|
28
28
|
```
|
|
29
29
|
Step 1: Determine scope (local diff / PR worktree / file)
|
|
30
30
|
Step 2: Load project review rules
|
|
31
|
-
Step 3:
|
|
32
|
-
Step 4: 9 parallel review agents [9 LLM calls]
|
|
31
|
+
Step 3: 9 parallel review agents [9 LLM calls]
|
|
33
32
|
|-- Agent 1: Correctness
|
|
34
33
|
|-- Agent 2: Security
|
|
35
34
|
|-- Agent 3: Code Quality
|
|
@@ -37,13 +36,12 @@ Step 4: 9 parallel review agents [9 LLM calls]
|
|
|
37
36
|
|-- Agent 5: Test Coverage
|
|
38
37
|
|-- Agent 6: Undirected Audit (3 personas: 6a/6b/6c)
|
|
39
38
|
'-- Agent 7: Build & Test (runs shell commands)
|
|
40
|
-
Step
|
|
41
|
-
Step
|
|
42
|
-
Step
|
|
43
|
-
Step
|
|
44
|
-
Step
|
|
45
|
-
Step
|
|
46
|
-
Step 11: Clean up (remove worktree + temp files)
|
|
39
|
+
Step 4: Deduplicate --> Batch verify --> Aggregate [1 LLM call]
|
|
40
|
+
Step 5: Iterative reverse audit (1-3 rounds, gap finding) [1-3 LLM calls]
|
|
41
|
+
Step 6: Present findings + verdict
|
|
42
|
+
Step 7: Submit PR review (inline comments, if requested)
|
|
43
|
+
Step 8: Save report + incremental cache
|
|
44
|
+
Step 9: Clean up (remove worktree + temp files)
|
|
47
45
|
```
|
|
48
46
|
|
|
49
47
|
### Review Agents
|
|
@@ -60,29 +58,6 @@ Step 11: Clean up (remove worktree + temp files)
|
|
|
60
58
|
|
|
61
59
|
All agents run in parallel (Agent 6 launches 3 persona variants concurrently, totaling 9 parallel tasks for same-repo reviews). Findings from Agents 1-6 are verified in a **single batch verification pass** (one agent reviews all findings at once, keeping verification cost fixed regardless of finding count). After verification, **iterative reverse audit** runs 1-3 rounds of gap-finding — each round receives the cumulative finding list from prior rounds, so successive rounds focus on whatever's left undiscovered. The loop stops as soon as a round returns "No issues found", or after 3 rounds (hard cap). Reverse audit findings skip verification (the agent already has full context) and are included as high-confidence results.
|
|
62
60
|
|
|
63
|
-
## Deterministic Analysis
|
|
64
|
-
|
|
65
|
-
Before the LLM agents run, `/review` automatically runs your project's existing linters and type checkers:
|
|
66
|
-
|
|
67
|
-
| Language | Tools detected |
|
|
68
|
-
| --------------------- | ---------------------------------------------------------------- |
|
|
69
|
-
| TypeScript/JavaScript | `tsc --noEmit`, `npm run lint`, `eslint` |
|
|
70
|
-
| Python | `ruff`, `mypy`, `flake8` |
|
|
71
|
-
| Rust | `cargo clippy` |
|
|
72
|
-
| Go | `go vet`, `golangci-lint` |
|
|
73
|
-
| Java | `mvn compile`, `checkstyle`, `spotbugs`, `pmd` |
|
|
74
|
-
| C/C++ | `clang-tidy` (if `compile_commands.json` available) |
|
|
75
|
-
| Other | Auto-discovered from CI config (`.github/workflows/*.yml`, etc.) |
|
|
76
|
-
|
|
77
|
-
For projects that don't match standard patterns (e.g., OpenJDK), `/review` reads CI configuration files to discover what lint/check commands the project uses. No user configuration needed.
|
|
78
|
-
|
|
79
|
-
Deterministic findings are tagged with `[linter]` or `[typecheck]` and skip LLM verification — they are ground truth.
|
|
80
|
-
|
|
81
|
-
- **Errors** → Critical severity
|
|
82
|
-
- **Warnings** → Nice to have (terminal only, not posted as PR comments)
|
|
83
|
-
|
|
84
|
-
If a tool is not installed or times out, it is skipped with an informational note.
|
|
85
|
-
|
|
86
61
|
## Severity Levels
|
|
87
62
|
|
|
88
63
|
| Severity | Meaning | Posted as PR comment? |
|
|
@@ -93,26 +68,12 @@ If a tool is not installed or times out, it is skipped with an informational not
|
|
|
93
68
|
|
|
94
69
|
Low-confidence findings appear in a separate "Needs Human Review" section in the terminal and are never posted as PR comments.
|
|
95
70
|
|
|
96
|
-
## Autofix
|
|
97
|
-
|
|
98
|
-
After presenting findings, `/review` offers to auto-apply fixes for Critical and Suggestion findings that have clear solutions:
|
|
99
|
-
|
|
100
|
-
```
|
|
101
|
-
Found 3 issues with auto-fixable suggestions. Apply auto-fixes? (y/n)
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
- Fixes are applied using the `edit` tool (targeted replacements, not full-file rewrites)
|
|
105
|
-
- Per-file linter checks run after fixes to verify they don't introduce new issues
|
|
106
|
-
- For PR reviews, fixes are committed and pushed from the worktree automatically — your working tree stays clean
|
|
107
|
-
- Nice to have and low-confidence findings are never auto-fixed
|
|
108
|
-
- PR review submission always uses the **pre-fix verdict** (e.g., "Request changes") since the remote PR hasn't been updated until the autofix push completes
|
|
109
|
-
|
|
110
71
|
## Worktree Isolation
|
|
111
72
|
|
|
112
73
|
When reviewing a PR, `/review` creates a temporary git worktree (`.qwen/tmp/review-pr-<number>`) instead of switching your current branch. This means:
|
|
113
74
|
|
|
114
75
|
- Your working tree, staged changes, and current branch are **never touched**
|
|
115
|
-
- Dependencies are installed in the worktree (`npm ci`, etc.) so
|
|
76
|
+
- Dependencies are installed in the worktree (`npm ci`, etc.) so build/test work
|
|
116
77
|
- Build and test commands run in isolation without polluting your local build cache
|
|
117
78
|
- If anything goes wrong, your environment is unaffected — just delete the worktree
|
|
118
79
|
- The worktree is automatically cleaned up after the review completes
|
|
@@ -127,15 +88,13 @@ You can review PRs from other repositories by passing the full URL:
|
|
|
127
88
|
/review https://github.com/other-org/other-repo/pull/456
|
|
128
89
|
```
|
|
129
90
|
|
|
130
|
-
This runs in **lightweight mode** — no worktree, no
|
|
91
|
+
This runs in **lightweight mode** — no worktree, no build/test. The review is based on the diff text only (fetched via GitHub API). PR comments can still be posted if you have write access.
|
|
131
92
|
|
|
132
93
|
| Capability | Same-repo | Cross-repo |
|
|
133
94
|
| ---------------------------------------------------------- | --------- | ----------------------------- |
|
|
134
95
|
| LLM review (Agents 1-6 + verify + iterative reverse audit) | ✅ | ✅ |
|
|
135
96
|
| Agent 7: Build & test | ✅ | ❌ (no local codebase) |
|
|
136
|
-
| Deterministic analysis (linter/typecheck) | ✅ | ❌ |
|
|
137
97
|
| Cross-file impact analysis | ✅ | ❌ |
|
|
138
|
-
| Autofix | ✅ | ❌ |
|
|
139
98
|
| PR inline comments | ✅ | ✅ (if you have write access) |
|
|
140
99
|
| Incremental review cache | ✅ | ❌ |
|
|
141
100
|
|
|
@@ -158,7 +117,7 @@ Or, after running `/review 123`, type `post comments` to publish findings withou
|
|
|
158
117
|
|
|
159
118
|
**What stays terminal-only:**
|
|
160
119
|
|
|
161
|
-
- Nice to have findings
|
|
120
|
+
- Nice to have findings
|
|
162
121
|
- Low-confidence findings
|
|
163
122
|
|
|
164
123
|
**Self-authored PRs:** GitHub does not allow you to submit `APPROVE` or `REQUEST_CHANGES` reviews on your own pull request — both fail with HTTP 422. When `/review` detects that the PR author matches the current authenticated user, it automatically downgrades the API event to `COMMENT` regardless of verdict, so the submission still succeeds. The terminal still shows the honest verdict ("Approve" / "Request changes" / "Comment") — only the GitHub-side review event is neutralized. The actual findings still appear as inline comments on specific lines, so substantive feedback is unchanged.
|
|
@@ -178,7 +137,7 @@ After the review, context-aware tips appear as ghost text. Press Tab to accept:
|
|
|
178
137
|
| PR review, zero findings | `post comments` | Approves the PR on GitHub (LGTM) |
|
|
179
138
|
| Local review, all clear | `commit` | Commits your changes |
|
|
180
139
|
|
|
181
|
-
Note: `fix these issues` is only available for local reviews. For PR reviews
|
|
140
|
+
Note: `fix these issues` is only available for local reviews. For PR reviews the worktree is cleaned up after the review, so post-review interactive fixing is not possible — use `--comment` or `post comments` to publish findings instead.
|
|
182
141
|
|
|
183
142
|
## Project Review Rules
|
|
184
143
|
|
|
@@ -241,7 +200,7 @@ For same-repo reviews, results are saved as a Markdown file in your project's `.
|
|
|
241
200
|
.qwen/reviews/2026-04-06-150510-local.md
|
|
242
201
|
```
|
|
243
202
|
|
|
244
|
-
Reports include: timestamp, diff stats,
|
|
203
|
+
Reports include: timestamp, diff stats, build/test results, all findings with verification status, and the verdict.
|
|
245
204
|
|
|
246
205
|
## Cross-file Impact Analysis
|
|
247
206
|
|
|
@@ -260,10 +219,9 @@ The review pipeline uses a bounded number of LLM calls regardless of how many fi
|
|
|
260
219
|
|
|
261
220
|
| Stage | LLM calls | Notes |
|
|
262
221
|
| -------------------------------- | ----------------- | --------------------------------------------------- |
|
|
263
|
-
|
|
|
264
|
-
|
|
|
265
|
-
|
|
|
266
|
-
| Iterative reverse audit (Step 6) | 1-3 | Loops until "No issues found" or 3-round cap |
|
|
222
|
+
| Review agents (Step 3) | 9 (or 8) | Run in parallel; Agent 7 skipped in cross-repo mode |
|
|
223
|
+
| Batch verification (Step 4) | 1 | Single agent verifies all findings at once |
|
|
224
|
+
| Iterative reverse audit (Step 5) | 1-3 | Loops until "No issues found" or 3-round cap |
|
|
267
225
|
| **Total** | **11-13 (10-12)** | Same-repo: 11-13; cross-repo: 10-12 (no Agent 7) |
|
|
268
226
|
|
|
269
227
|
Most PRs converge to the lower end of the range (1 reverse audit round); the cap prevents runaway cost on pathological cases.
|
|
@@ -273,8 +231,7 @@ Most PRs converge to the lower end of the range (1 reverse audit round); the cap
|
|
|
273
231
|
The review intentionally excludes:
|
|
274
232
|
|
|
275
233
|
- Pre-existing issues in unchanged code (focus on the diff only)
|
|
276
|
-
- Style
|
|
277
|
-
- Issues a linter or type checker would catch (handled by deterministic analysis)
|
|
234
|
+
- Style or formatting a formatter would auto-normalize, or naming matching your codebase conventions — but NOT substantive issues a linter or type checker would flag (unused variables, unreachable code, type errors), which are in scope
|
|
278
235
|
- Subjective "consider doing X" suggestions without a real problem
|
|
279
236
|
- Minor refactoring that doesn't fix a bug or risk
|
|
280
237
|
- Missing documentation unless the logic is genuinely confusing
|
|
@@ -285,7 +242,6 @@ The review intentionally excludes:
|
|
|
285
242
|
> **Silence is better than noise.** Every comment should be worth the reader's time.
|
|
286
243
|
|
|
287
244
|
- If unsure whether something is a problem → don't report it
|
|
288
|
-
- Linter/typecheck issues are handled by tools, not LLM guesses
|
|
289
245
|
- Same pattern across N files → aggregated into one finding
|
|
290
246
|
- PR comments are high-confidence only
|
|
291
|
-
-
|
|
247
|
+
- Cosmetic style/formatting matching codebase conventions is excluded
|
|
@@ -76,40 +76,42 @@ Commands specifically for controlling interface and output language.
|
|
|
76
76
|
|
|
77
77
|
Commands for managing AI tools and models.
|
|
78
78
|
|
|
79
|
-
| Command
|
|
80
|
-
|
|
|
81
|
-
| `/mcp`
|
|
82
|
-
| `/import-config`
|
|
83
|
-
| `/tools`
|
|
84
|
-
| `/skills`
|
|
85
|
-
| `/plan`
|
|
86
|
-
| `/approval-mode`
|
|
87
|
-
| → `plan`
|
|
88
|
-
| → `default`
|
|
89
|
-
| → `auto-edit`
|
|
90
|
-
| → `auto`
|
|
91
|
-
| → `yolo`
|
|
92
|
-
| `/model`
|
|
93
|
-
| `/model --fast`
|
|
94
|
-
| `/model --voice`
|
|
95
|
-
| `/
|
|
96
|
-
|
|
|
97
|
-
|
|
|
98
|
-
| → `
|
|
99
|
-
| → `
|
|
100
|
-
|
|
|
101
|
-
|
|
|
102
|
-
| `/
|
|
103
|
-
| `/
|
|
104
|
-
| `/
|
|
105
|
-
| `/
|
|
106
|
-
| `/
|
|
107
|
-
| `/
|
|
108
|
-
| `/
|
|
109
|
-
| `/
|
|
110
|
-
| `/
|
|
111
|
-
| `/
|
|
112
|
-
| `/
|
|
79
|
+
| Command | Description | Usage Examples |
|
|
80
|
+
| ----------------- | -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- |
|
|
81
|
+
| `/mcp` | List configured MCP servers and tools | `/mcp`, `/mcp desc`, `/mcp nodesc`, `/mcp schema` |
|
|
82
|
+
| `/import-config` | Import MCP servers from Claude configs | `/import-config all`, `/import-config claude-code`, `/import-config claude-desktop --scope user\|project` |
|
|
83
|
+
| `/tools` | Display currently available tool list | `/tools`, `/tools desc` |
|
|
84
|
+
| `/skills` | List and run available skills | `/skills`, `/skills <name>` |
|
|
85
|
+
| `/plan` | Switch to plan mode or exit plan mode | `/plan`, `/plan <task>`, `/plan exit` |
|
|
86
|
+
| `/approval-mode` | Change the tool-approval mode (current session only) | `/approval-mode`, `/approval-mode auto-edit` |
|
|
87
|
+
| → `plan` | Analysis only, no execution (secure review) | `/approval-mode plan` |
|
|
88
|
+
| → `default` | Require approval for edits (daily use) | `/approval-mode default` |
|
|
89
|
+
| → `auto-edit` | Auto-approve edits (trusted environment) | `/approval-mode auto-edit` |
|
|
90
|
+
| → `auto` | Classifier-evaluated approval (autonomous) | `/approval-mode auto` |
|
|
91
|
+
| → `yolo` | Auto-approve everything (quick prototyping) | `/approval-mode yolo` |
|
|
92
|
+
| `/model` | Switch model used in current session | `/model`, `/model <model-id>` (switch immediately) |
|
|
93
|
+
| `/model --fast` | Set a lighter model for prompt suggestions | `/model --fast qwen3-coder-flash` |
|
|
94
|
+
| `/model --voice` | Set the model used for voice transcription | `/model --voice <model-id>` |
|
|
95
|
+
| `/model --vision` | Set the vision-bridge model used to transcribe images for a text-only main model | `/model --vision <model-id>` |
|
|
96
|
+
| `/effort` | Set reasoning effort for thinking-capable models | `/effort` (opens picker), `/effort high` (low/medium/high/xhigh/max; mapped & clamped per provider) |
|
|
97
|
+
| `/extensions` | Manage extensions | `/extensions list`, `/extensions manage` |
|
|
98
|
+
| → `list` | List installed extensions | `/extensions list` |
|
|
99
|
+
| → `manage` | Manage installed extensions (interactive) | `/extensions manage` |
|
|
100
|
+
| → `explore` | Open extensions page in browser | `/extensions explore <Gemini\|ClaudeCode>` |
|
|
101
|
+
| → `install` | Install an extension from a git repo or path | `/extensions install <repo-or-path>` |
|
|
102
|
+
| `/memory` | Open the Memory Manager dialog | `/memory` |
|
|
103
|
+
| `/remember` | Save a durable memory | `/remember Prefer terse responses` |
|
|
104
|
+
| `/forget` | Remove matching entries from auto-memory | `/forget <query>` |
|
|
105
|
+
| `/dream` | Manually run auto-memory consolidation | `/dream` |
|
|
106
|
+
| `/hooks` | Manage Qwen Code hooks | `/hooks`, `/hooks list` |
|
|
107
|
+
| `/permissions` | Manage permission rules | `/permissions` |
|
|
108
|
+
| `/agents` | Manage subagents | `/agents manage`, `/agents create` |
|
|
109
|
+
| `/arena` | Manage Arena sessions | `/arena start`, `/arena stop`, `/arena status`, `/arena select` (alias `choose`) |
|
|
110
|
+
| `/goal` | Set a goal — keep working until condition met | `/goal <condition>`, `/goal clear` |
|
|
111
|
+
| `/tasks` | List background tasks | `/tasks` |
|
|
112
|
+
| `/workflows` | Inspect workflow runs | `/workflows`, `/workflows <runId>` |
|
|
113
|
+
| `/lsp` | Show LSP server status | `/lsp` |
|
|
114
|
+
| `/trust` | Manage folder trust settings | `/trust` |
|
|
113
115
|
|
|
114
116
|
> [!warning]
|
|
115
117
|
>
|
|
@@ -127,12 +129,12 @@ Commands for managing AI tools and models.
|
|
|
127
129
|
|
|
128
130
|
These commands invoke bundled skills that provide specialized workflows.
|
|
129
131
|
|
|
130
|
-
| Command | Description
|
|
131
|
-
| ------------ |
|
|
132
|
-
| `/review` | Review code changes with
|
|
133
|
-
| `/loop` | Run a prompt on a recurring schedule
|
|
134
|
-
| `/simplify` | Review recent changes and apply safe cleanup edits directly
|
|
135
|
-
| `/qc-helper` | Answer questions about Qwen Code usage and configuration
|
|
132
|
+
| Command | Description | Usage Examples |
|
|
133
|
+
| ------------ | ----------------------------------------------------------- | ------------------------------------------------- |
|
|
134
|
+
| `/review` | Review code changes with 9 parallel review agents | `/review`, `/review 123`, `/review 123 --comment` |
|
|
135
|
+
| `/loop` | Run a prompt on a recurring schedule | `/loop 5m check the build` |
|
|
136
|
+
| `/simplify` | Review recent changes and apply safe cleanup edits directly | `/simplify`, `/simplify focus on duplication` |
|
|
137
|
+
| `/qc-helper` | Answer questions about Qwen Code usage and configuration | `/qc-helper how do I configure MCP?` |
|
|
136
138
|
|
|
137
139
|
See [Code Review](./code-review.md) for full `/review` documentation.
|
|
138
140
|
|
|
@@ -223,24 +223,25 @@ qwen -p "Write code" --output-format stream-json --include-partial-messages | jq
|
|
|
223
223
|
|
|
224
224
|
Key command-line options for headless usage:
|
|
225
225
|
|
|
226
|
-
| Option | Description
|
|
227
|
-
| ---------------------------- |
|
|
228
|
-
| `--prompt`, `-p` | Run in headless mode
|
|
229
|
-
| `--output-format`, `-o` | Specify output format (text, json, stream-json)
|
|
230
|
-
| `--input-format` | Specify input format (text, stream-json)
|
|
231
|
-
| `--include-partial-messages` | Include partial messages in stream-json output
|
|
232
|
-
| `--system-prompt` | Override the main session system prompt for this run
|
|
233
|
-
| `--append-system-prompt` | Append extra instructions to the main session system prompt for this run
|
|
234
|
-
| `--debug`, `-d` | Enable debug mode
|
|
235
|
-
| `--
|
|
236
|
-
| `--
|
|
237
|
-
| `--
|
|
238
|
-
| `--
|
|
239
|
-
| `--
|
|
240
|
-
| `--
|
|
241
|
-
| `--
|
|
242
|
-
| `--max-
|
|
243
|
-
| `--max-
|
|
226
|
+
| Option | Description | Example |
|
|
227
|
+
| ---------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
|
|
228
|
+
| `--prompt`, `-p` | Run in headless mode | `qwen -p "query"` |
|
|
229
|
+
| `--output-format`, `-o` | Specify output format (text, json, stream-json) | `qwen -p "query" --output-format json` |
|
|
230
|
+
| `--input-format` | Specify input format (text, stream-json) | `qwen --input-format text --output-format stream-json` |
|
|
231
|
+
| `--include-partial-messages` | Include partial messages in stream-json output | `qwen -p "query" --output-format stream-json --include-partial-messages` |
|
|
232
|
+
| `--system-prompt` | Override the main session system prompt for this run | `qwen -p "query" --system-prompt "You are a terse reviewer."` |
|
|
233
|
+
| `--append-system-prompt` | Append extra instructions to the main session system prompt for this run | `qwen -p "query" --append-system-prompt "Focus on concrete findings."` |
|
|
234
|
+
| `--debug`, `-d` | Enable debug mode | `qwen -p "query" --debug` |
|
|
235
|
+
| `--safe-mode` | Disable all customizations — context files, hooks, extensions, skills, MCP servers, custom subagents (only built-in subagents load), permission rules, settings-sourced approval mode overrides, memory features, and sandbox settings — to isolate problems; the CLI flags `--yolo` and `--approval-mode` still take effect. See [Troubleshooting](../support/troubleshooting). Also settable via `QWEN_CODE_SAFE_MODE=true`. | `qwen -p "query" --safe-mode` |
|
|
236
|
+
| `--all-files`, `-a` | Include all files in context | `qwen -p "query" --all-files` |
|
|
237
|
+
| `--include-directories` | Include additional directories | `qwen -p "query" --include-directories src,docs` |
|
|
238
|
+
| `--yolo`, `-y` | Auto-approve all actions | `qwen -p "query" --yolo` |
|
|
239
|
+
| `--approval-mode` | Set approval mode | `qwen -p "query" --approval-mode auto_edit` |
|
|
240
|
+
| `--continue` | Resume the most recent session for this project | `qwen --continue -p "Pick up where we left off"` |
|
|
241
|
+
| `--resume [sessionId]` | Resume a specific session (or choose interactively) | `qwen --resume 123e... -p "Finish the refactor"` |
|
|
242
|
+
| `--max-session-turns` | Cap the number of user/model/tool turns in the run | `qwen -p "..." --max-session-turns 30` |
|
|
243
|
+
| `--max-wall-time` | Wall-clock budget; accepts `90` (s), `30s`, `5m`, `1h`, `1.5h` | `qwen -p "..." --max-wall-time 10m` |
|
|
244
|
+
| `--max-tool-calls` | Cumulative tool-call budget for the run | `qwen -p "..." --max-tool-calls 50` |
|
|
244
245
|
|
|
245
246
|
For complete details on all available configuration options, settings files, and environment variables, see the [Configuration Guide](../configuration/settings).
|
|
246
247
|
|
|
@@ -566,10 +566,15 @@ Hook output supports three categories of fields:
|
|
|
566
566
|
```json
|
|
567
567
|
{
|
|
568
568
|
"stop_hook_active": "boolean indicating if stop hook is active",
|
|
569
|
-
"last_assistant_message": "the last message from the assistant"
|
|
569
|
+
"last_assistant_message": "the last message from the assistant",
|
|
570
|
+
"context_usage": "ratio of context window used (may exceed 1 when tokens exceed window; optional)",
|
|
571
|
+
"context_limit": "context window size in tokens (optional)",
|
|
572
|
+
"input_tokens": "prompt token count (may include output tokens depending on provider; optional)"
|
|
570
573
|
}
|
|
571
574
|
```
|
|
572
575
|
|
|
576
|
+
The `context_usage`, `context_limit`, and `input_tokens` fields allow hook scripts to observe context usage and implement custom compact strategies — for example, a script that prints a reminder to run `/compact` when usage exceeds a custom threshold.
|
|
577
|
+
|
|
573
578
|
**Output Options**:
|
|
574
579
|
|
|
575
580
|
- `decision`: "allow", "deny", "block", or "ask"
|
|
@@ -381,12 +381,14 @@ The `mcp` object in your `settings.json` defines global rules for all MCP server
|
|
|
381
381
|
- `mcp.allowed`: allow-list of MCP server names (keys in `mcpServers`)
|
|
382
382
|
- `mcp.excluded`: deny-list of MCP server names
|
|
383
383
|
|
|
384
|
+
Both lists support glob patterns: `*` matches any sequence of characters and `?` matches a single character (for example, `"*puppeteer*"` matches every server whose name contains `puppeteer`). Entries without glob characters are matched exactly. When a server matches both lists, `mcp.excluded` takes precedence.
|
|
385
|
+
|
|
384
386
|
Example:
|
|
385
387
|
|
|
386
388
|
```json
|
|
387
389
|
{
|
|
388
390
|
"mcp": {
|
|
389
|
-
"allowed": ["my-trusted-server"],
|
|
391
|
+
"allowed": ["my-trusted-server", "*-internal"],
|
|
390
392
|
"excluded": ["experimental-server"]
|
|
391
393
|
}
|
|
392
394
|
}
|
|
@@ -99,7 +99,7 @@ Everything saved is plain markdown — you can open, edit, or delete any file at
|
|
|
99
99
|
|
|
100
100
|
Qwen periodically goes through its saved memories to remove duplicates and clean up outdated entries. This runs automatically in the background once a day after enough sessions have accumulated. You can trigger it manually with `/dream` if you want it to run now.
|
|
101
101
|
|
|
102
|
-
|
|
102
|
+
Your session continues normally while cleanup runs in the background.
|
|
103
103
|
|
|
104
104
|
### Turning it on or off
|
|
105
105
|
|
|
@@ -40,6 +40,16 @@ The scheduled prompt can itself be a command or skill invocation. This is useful
|
|
|
40
40
|
|
|
41
41
|
Each time the job fires, Qwen Code runs `/review-pr 1234` as if you had typed it.
|
|
42
42
|
|
|
43
|
+
### Autonomous mode
|
|
44
|
+
|
|
45
|
+
Running `/loop` with **no prompt** starts an autonomous loop instead of repeating a fixed prompt. Qwen Code acts as a steward of the work already established in the conversation — it keeps your work moving while you're away:
|
|
46
|
+
|
|
47
|
+
```text
|
|
48
|
+
/loop
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
A bare `/loop` (no prompt, no interval) runs a self-paced autonomous loop; `/loop <interval>` with no prompt runs the same autonomous loop on a fixed cadence (e.g. `/loop 10m`). On each fire it advances what the conversation already set up — finishing things you started, maintaining an in-progress PR (addressing review threads, fixing failing CI, resolving conflicts), and honoring follow-up commitments. It only acts on work the transcript already established: it never invents new work or makes irreversible changes (push, delete, send) without clear authorization, and it stops once everything is quiet.
|
|
52
|
+
|
|
43
53
|
### Manage loops
|
|
44
54
|
|
|
45
55
|
`/loop` also supports two subcommands for managing existing jobs:
|
|
@@ -10,18 +10,18 @@ The status line shows session-aware information — model name, token usage, git
|
|
|
10
10
|
```
|
|
11
11
|
Single-line status (default approval mode — 1 row):
|
|
12
12
|
┌─────────────────────────────────────────────────────────────────┐
|
|
13
|
-
│ user@host ~/project (main) ctx:34%
|
|
13
|
+
│ user@host ~/project (main) ctx:34% docker | Debug | 67% │ ← status line
|
|
14
14
|
└─────────────────────────────────────────────────────────────────┘
|
|
15
15
|
|
|
16
16
|
Multi-line status (up to 2 lines — 2 rows):
|
|
17
17
|
┌─────────────────────────────────────────────────────────────────┐
|
|
18
|
-
│ user@host ~/project (main) ctx:34%
|
|
18
|
+
│ user@host ~/project (main) ctx:34% docker | Debug | 67% │ ← status line 1
|
|
19
19
|
│ ████████░░░░░░░░░░ 34% context │ ← status line 2
|
|
20
20
|
└─────────────────────────────────────────────────────────────────┘
|
|
21
21
|
|
|
22
22
|
Multi-line status + non-default mode (3 rows max):
|
|
23
23
|
┌─────────────────────────────────────────────────────────────────┐
|
|
24
|
-
│ user@host ~/project (main) ctx:34%
|
|
24
|
+
│ user@host ~/project (main) ctx:34% docker | Debug | 67% │ ← status line 1
|
|
25
25
|
│ ████████░░░░░░░░░░ 34% context │ ← status line 2
|
|
26
26
|
│ auto-accept edits (shift + tab to cycle) │ ← mode indicator
|
|
27
27
|
└─────────────────────────────────────────────────────────────────┘
|
|
@@ -113,23 +113,23 @@ If you encounter issues with IDE integration, here are some common error message
|
|
|
113
113
|
|
|
114
114
|
### Connection Errors
|
|
115
115
|
|
|
116
|
-
- **Message:**
|
|
116
|
+
- **Message:** `● Disconnected: Failed to connect to IDE companion extension for [IDE Name]. Please ensure the extension is running and try restarting your terminal. To install the extension, run /ide install.`
|
|
117
117
|
- **Cause:** Qwen Code could not find the necessary environment variables (`QWEN_CODE_IDE_WORKSPACE_PATH` or `QWEN_CODE_IDE_SERVER_PORT`) to connect to the IDE. This usually means the IDE companion extension is not running or did not initialize correctly.
|
|
118
118
|
- **Solution:**
|
|
119
119
|
1. Make sure you have installed the **Qwen Code Companion** extension in your IDE and that it is enabled.
|
|
120
120
|
2. Open a new terminal window in your IDE to ensure it picks up the correct environment.
|
|
121
121
|
|
|
122
|
-
- **Message:**
|
|
122
|
+
- **Message:** `● Disconnected: IDE connection error. The connection was lost unexpectedly. Please try reconnecting by running /ide enable`
|
|
123
123
|
- **Cause:** The connection to the IDE companion was lost.
|
|
124
124
|
- **Solution:** Run `/ide enable` to try and reconnect. If the issue continues, open a new terminal window or restart your IDE.
|
|
125
125
|
|
|
126
126
|
### Configuration Errors
|
|
127
127
|
|
|
128
|
-
- **Message:**
|
|
128
|
+
- **Message:** `● Disconnected: Directory mismatch. Qwen Code is running in a different location than the open workspace in [IDE Name]. Please run the CLI from the same directory as your project's root folder.`
|
|
129
129
|
- **Cause:** The CLI's current working directory is outside the folder or workspace you have open in your IDE.
|
|
130
130
|
- **Solution:** `cd` into the same directory that is open in your IDE and restart the CLI.
|
|
131
131
|
|
|
132
|
-
- **Message:**
|
|
132
|
+
- **Message:** `● Disconnected: To use this feature, please open a workspace folder in [IDE Name] and try again.`
|
|
133
133
|
- **Cause:** You have no workspace open in your IDE.
|
|
134
134
|
- **Solution:** Open a workspace in your IDE and restart the CLI.
|
|
135
135
|
|
|
@@ -15,6 +15,7 @@ Run Qwen Code as a local HTTP daemon so multiple clients (IDE plugins, web UIs,
|
|
|
15
15
|
- **Reconnect-safe streaming** — SSE with `Last-Event-ID` reconnect lets a client drop and pick up exactly where it left off (within the ring's replay window).
|
|
16
16
|
- **First-responder permissions** — when the agent asks for permission to run a tool, every connected client sees the request; whichever client answers first wins.
|
|
17
17
|
- **One daemon, one workspace** — each `qwen serve` process binds to exactly one workspace at boot (per [#3803](https://github.com/QwenLM/qwen-code/issues/3803) §02). Multi-workspace deployments run one daemon per workspace on separate ports (or behind an orchestrator).
|
|
18
|
+
- **Experimental daemon-managed channels** — `qwen serve --channel <name>` starts a channel worker owned by the daemon lifecycle. The worker is a separate process, connects back to the daemon through the SDK, and reports its state in `GET /daemon/status`.
|
|
18
19
|
- **Remote runtime control** ([#4175](https://github.com/QwenLM/qwen-code/issues/4175) PR 17) — change a session's approval mode (`POST /session/:id/approval-mode`), toggle a tool per workspace (`POST /workspace/tools/:name/enable`), scaffold an empty `QWEN.md` (`POST /workspace/init`, mechanical only — does NOT call the model; for AI-fill, follow up with `POST /session/:id/prompt`), restart a single MCP server with a budget pre-check (`POST /workspace/mcp/:server/restart`), or add/remove MCP servers at runtime without a daemon restart (`POST /workspace/mcp/servers`, `DELETE /workspace/mcp/servers/:name`). All strict-gated — configure `--token` first.
|
|
19
20
|
- **Session recap** ([#4175](https://github.com/QwenLM/qwen-code/issues/4175) follow-up) — fetch a one-sentence "where did I leave off" summary of an active session (`POST /session/:id/recap`). Wraps core's `generateSessionRecap` as a side-query against the fast model; pollutes neither the main chat history nor the SSE stream. Non-strict gate (same posture as `/prompt`); SDK helper `client.recapSession(sessionId)`.
|
|
20
21
|
- **Known limit — token-cost amplification:** the route is a pure-cost endpoint (each call is an LLM side-query, no state benefit) and the daemon has no per-route rate limit in v1. On a no-token loopback default a buggy or malicious local client can spam it to burn tokens. Configure `--token` (and optionally `--require-auth`) on shared dev hosts before exposing the daemon.
|
|
@@ -82,6 +83,23 @@ curl http://127.0.0.1:4170/daemon/status
|
|
|
82
83
|
The `workspaceCwd` field surfaces the bound workspace so clients can pre-flight check + omit `cwd` on `POST /session`.
|
|
83
84
|
The `limits.maxPendingPromptsPerSession` field advertises the active per-session prompt admission cap; `null` means the cap is disabled.
|
|
84
85
|
|
|
86
|
+
### Run channels from the daemon
|
|
87
|
+
|
|
88
|
+
```bash
|
|
89
|
+
# Start one configured channel under qwen serve
|
|
90
|
+
qwen serve --channel telegram
|
|
91
|
+
|
|
92
|
+
# Start several configured channels under one daemon-owned worker
|
|
93
|
+
qwen serve --channel telegram --channel feishu
|
|
94
|
+
|
|
95
|
+
# Start all configured channels
|
|
96
|
+
qwen serve --channel all
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
This mode is experimental and daemon-managed. It does not replace the standalone `qwen channel start` command: standalone channels still use the ACP-backed `AcpBridge` service. With `qwen serve --channel`, the daemon launches one channel worker process after the HTTP runtime is ready. If the worker exits after startup, the daemon keeps running and `GET /daemon/status` reports a `channel_worker_exited` warning. Automatic worker restart is deferred.
|
|
100
|
+
|
|
101
|
+
The daemon is bound to one workspace, so every selected channel's `cwd` must resolve to the daemon workspace. `--channel all` cannot be combined with named channels.
|
|
102
|
+
|
|
85
103
|
The daemon also exposes read-only runtime snapshots for client UIs and
|
|
86
104
|
operators: `GET /daemon/status`, `GET /workspace/mcp`,
|
|
87
105
|
`GET /workspace/skills`, `GET /workspace/providers`, `GET /workspace/env`,
|
|
@@ -242,6 +260,38 @@ curl -H "Authorization: Bearer $QWEN_SERVER_TOKEN" http://your-host:4170/capabil
|
|
|
242
260
|
|
|
243
261
|
The token comparison is constant-time (SHA-256 + `crypto.timingSafeEqual`); 401 responses are uniform across "missing header", "wrong scheme", and "wrong token" so a side-channel can't distinguish.
|
|
244
262
|
|
|
263
|
+
## HTTPS / TLS (for mobile / cross-device access)
|
|
264
|
+
|
|
265
|
+
By default the daemon serves plain HTTP. That's fine on `localhost`, but a phone or tablet hitting a LAN IP (`https://192.168.x.x:4170`) is **not** a [secure context](https://developer.mozilla.org/en-US/docs/Web/Security/Secure_Contexts) over `http://` — so browsers block `getUserMedia` (voice input), WebRTC, and other secure-context-only APIs. Pass `--tls-cert` + `--tls-key` to serve the Web Shell over HTTPS and unlock them:
|
|
266
|
+
|
|
267
|
+
```bash
|
|
268
|
+
# 1. Install a local CA and trust it (one-time). The mobile device must
|
|
269
|
+
# also trust this CA — mkcert prints where the root cert lives.
|
|
270
|
+
mkcert -install
|
|
271
|
+
|
|
272
|
+
# 2. Generate a cert for your machine's LAN IP. Add localhost / 127.0.0.1 to
|
|
273
|
+
# the SANs too: with `--open`, the daemon rewrites the browser URL to
|
|
274
|
+
# 127.0.0.1, so a cert scoped to only the LAN IP would be rejected with
|
|
275
|
+
# ERR_CERT_COMMON_NAME_INVALID. (mkcert names the output after all hosts.)
|
|
276
|
+
mkcert 192.168.1.100 localhost 127.0.0.1
|
|
277
|
+
|
|
278
|
+
# 3. Start the daemon over HTTPS. Non-loopback binds still require a token,
|
|
279
|
+
# and the browser Origin must be allowed through CORS.
|
|
280
|
+
qwen serve \
|
|
281
|
+
--hostname 0.0.0.0 \
|
|
282
|
+
--token "$(openssl rand -hex 32)" \
|
|
283
|
+
--tls-cert "./192.168.1.100+2.pem" \
|
|
284
|
+
--tls-key "./192.168.1.100+2-key.pem" \
|
|
285
|
+
--allow-origin "https://192.168.1.100:4170"
|
|
286
|
+
# → qwen serve listening on https://0.0.0.0:4170
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
Notes:
|
|
290
|
+
|
|
291
|
+
- **Both flags or neither** — boot fails if only one is given (a cert with no key can't start an HTTPS listener).
|
|
292
|
+
- **TLS is orthogonal to auth** — HTTPS encrypts the transport; the bearer token still gates every API route. Non-loopback binds require a token with or without TLS.
|
|
293
|
+
- **Scope is TLS termination only** — no auto-generation, no ACME / Let's Encrypt. This is a LAN / dev convenience; for internet-facing deployments terminate TLS at a reverse proxy (see the threat model below).
|
|
294
|
+
|
|
245
295
|
## CLI flags
|
|
246
296
|
|
|
247
297
|
| Flag | Default | Purpose |
|
|
@@ -250,9 +300,12 @@ The token comparison is constant-time (SHA-256 + `crypto.timingSafeEqual`); 401
|
|
|
250
300
|
| `--hostname <addr>` | `127.0.0.1` | Bind interface. Anything beyond loopback requires a token. |
|
|
251
301
|
| `--token <str>` | — | Bearer token. Falls back to `QWEN_SERVER_TOKEN` env var (with leading/trailing whitespace stripped — handy for `$(cat token.txt)`). |
|
|
252
302
|
| `--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. |
|
|
303
|
+
| `--tls-cert <path>` | — | Path to a PEM certificate file. Serve over **HTTPS** instead of HTTP. Must be paired with `--tls-key` (boot fails if only one is given). Unlocks secure-context browser APIs — voice input (`getUserMedia`), WebRTC — over a LAN IP, which browsers otherwise block on plain `http://`. TLS termination only; no auto-generation / ACME. See [HTTPS / TLS](#https--tls-for-mobile--cross-device-access) below. |
|
|
304
|
+
| `--tls-key <path>` | — | Path to a PEM private key file. Must be paired with `--tls-cert`. |
|
|
253
305
|
| `--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). |
|
|
254
306
|
| `--max-pending-prompts-per-session <n>` | `5` | Per-session cap on prompts accepted by `POST /session/:id/prompt` but not yet settled, including queued prompts and the active prompt. The bridge rejects overflow synchronously with `503`, `Retry-After: 5`, and `code: "prompt_queue_full"` before returning a `promptId`. Set to `0` to disable. `branchSession` serializes on the same FIFO but does not count against this prompt cap. |
|
|
255
307
|
| `--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. |
|
|
308
|
+
| `--channel <name\|all>` | — | Experimental daemon-managed channel worker. Repeat the flag to select multiple configured channels, or pass `all` to start every configured channel. `all` cannot be combined with named channels. Selected channel `cwd` values must resolve to the daemon workspace. The worker is owned by `qwen serve`; stop the daemon to stop serve-managed channels. |
|
|
256
309
|
| `--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. |
|
|
257
310
|
| `--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`. |
|
|
258
311
|
| `--mcp-client-budget <n>` | — | Positive integer cap on live MCP clients **per ACP session** (issue [#4175](https://github.com/QwenLM/qwen-code/issues/4175) PR 14 v1; PR 23 graduates this to per-workspace via the shared MCP pool). Combine with `--mcp-budget-mode`. When unset, no accounting-driven enforcement (but `GET /workspace/mcp` still reports `clientCount`). Distinct from claude-code's `MCP_SERVER_CONNECTION_BATCH_SIZE` which gates startup concurrency, not the total client count. Pre-flight `caps.features.mcp_guardrails`. |
|