@qwen-code/qwen-code 0.19.10 → 0.19.11-nightly.20260717.f8e6e8931
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/qc-helper/docs/configuration/settings.md +7 -6
- package/bundled/qc-helper/docs/features/approval-mode.md +2 -2
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +30 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +53 -17
- package/bundled/qc-helper/docs/features/channels/wecom.md +8 -7
- package/bundled/qc-helper/docs/features/sandbox.md +2 -0
- package/bundled/qc-helper/docs/qwen-serve-deploy-local.md +42 -7
- package/bundled/qc-helper/docs/qwen-serve.md +53 -46
- package/bundled/review/SKILL.md +163 -403
- package/chunks/{MaxSizedBox-67ODZ4SZ.js → MaxSizedBox-JGTP7YJQ.js} +13 -13
- package/chunks/{StandaloneSessionPicker-SIPBQT5Z.js → StandaloneSessionPicker-2XQDOYZ5.js} +27 -27
- package/chunks/{acpAgent-VPZJXLFX.js → acpAgent-RXRJA7GD.js} +1135 -373
- package/chunks/{agent-Z7NWL6XL.js → agent-UQP53UWQ.js} +10 -10
- package/chunks/{agent-headless-73HZ6ROQ.js → agent-headless-I52OXDCK.js} +10 -10
- package/chunks/{anthropicContentGenerator-56U3YCP2.js → anthropicContentGenerator-HBRXJSP4.js} +76 -14
- package/chunks/{artifact-tool-BWZZJ42H.js → artifact-tool-MIZLXBLF.js} +1 -1
- package/chunks/{askUserQuestion-WU3S5A5T.js → askUserQuestion-XMJVPNWM.js} +1 -1
- package/chunks/{bridge-XFKW6S7Q.js → bridge-3DVRNBSF.js} +14 -16
- package/chunks/{ca-C2JTT2N5.js → ca-CODEN7TD.js} +5 -0
- package/chunks/channel-worker-group-SOUWTFHC.js +21 -0
- package/chunks/{channel-worker-manager-5RWKSGEU.js → channel-worker-manager-LOVSV3WW.js} +34 -10
- package/chunks/{channel-worker-supervisor-PCDAZN4D.js → channel-worker-supervisor-XW6MHJBQ.js} +6 -4
- package/chunks/{chunk-BBNVFRGD.js → chunk-3DWIFU7L.js} +1 -1
- package/chunks/{chunk-ZQTZXVHP.js → chunk-3KSHYS4T.js} +4 -18
- package/chunks/{chunk-ZKMGAFYV.js → chunk-3LS57JZI.js} +1 -1
- package/chunks/{chunk-B5I2IIWY.js → chunk-46Y6SSQ7.js} +5 -5
- package/chunks/{chunk-GDQQRV43.js → chunk-4BJVSIS3.js} +2 -2
- package/chunks/{chunk-L37RC7MQ.js → chunk-4HTHLSIH.js} +1 -1
- package/chunks/{chunk-DPFBNG72.js → chunk-4UBEB74N.js} +1 -1
- package/chunks/{chunk-AAR5SGMD.js → chunk-4YR7FSAM.js} +7 -5
- package/chunks/{chunk-OATTJGPJ.js → chunk-5CNYZ7TN.js} +7 -7
- package/chunks/{chunk-JSJFKYWT.js → chunk-5VWYKIMW.js} +1 -1
- package/chunks/{chunk-6GETGQWP.js → chunk-5WWYHNAH.js} +39 -10
- package/chunks/{chunk-65N2J6V2.js → chunk-6ANLV27M.js} +2 -2
- package/chunks/{chunk-L62SEJWY.js → chunk-6RV42SFP.js} +4 -4
- package/chunks/{chunk-XXJKGHZV.js → chunk-6VMOP2Z7.js} +4 -4
- package/chunks/{chunk-URU5UEK6.js → chunk-6WGZDD67.js} +135 -68
- package/chunks/{chunk-7NAWTFVY.js → chunk-6WPJRYLZ.js} +2 -2
- package/chunks/chunk-6WVLHULT.js +59 -0
- package/chunks/{chunk-N6FXRR6P.js → chunk-7ZFXHKKZ.js} +1 -1
- package/chunks/{chunk-E67NFMF4.js → chunk-A2HWMJVO.js} +35 -1
- package/chunks/{chunk-4FMG7EDJ.js → chunk-AEKHQ3E5.js} +77 -11
- package/chunks/{chunk-WIASPMLX.js → chunk-AH3YAJU6.js} +22 -33
- package/chunks/{chunk-6GKMJPOC.js → chunk-AHAH5H6D.js} +3 -3
- package/chunks/{chunk-3XJFUTNM.js → chunk-AVAU67KP.js} +57 -10
- package/chunks/{chunk-LNUXFLLJ.js → chunk-BDHYJ2MM.js} +53 -5
- package/chunks/{chunk-P6LART6G.js → chunk-BTSE2DUP.js} +957 -122
- package/chunks/{chunk-7MJAZMXK.js → chunk-BZ5D7OVV.js} +28 -77
- package/chunks/{chunk-WDWJ4OQJ.js → chunk-CC2UASQ4.js} +3 -3
- package/chunks/{chunk-WLXYAKV7.js → chunk-D7KYA6EY.js} +3 -3
- package/chunks/{chunk-5LROA5W4.js → chunk-DD45XVOQ.js} +3 -3
- package/chunks/{chunk-H3FQOPPS.js → chunk-DOPUYNXO.js} +2 -2
- package/chunks/{chunk-SPUYQB4T.js → chunk-DPXB3XRN.js} +1 -1
- package/chunks/{chunk-XLIRF7IK.js → chunk-E7ECGLZW.js} +1 -1
- package/chunks/{chunk-RDRVMDWV.js → chunk-EMJJBXS7.js} +10 -10
- package/chunks/{chunk-TXY2C3D2.js → chunk-F333XEAU.js} +1 -1
- package/chunks/chunk-FEOZBUMT.js +77 -0
- package/chunks/{chunk-YYPXHMWO.js → chunk-FEYHXPZG.js} +4 -4
- package/chunks/{chunk-ZRKBI3DP.js → chunk-FNX3LGAK.js} +1 -1
- package/chunks/chunk-FXK3QMRD.js +140 -0
- package/chunks/{chunk-422XAKCK.js → chunk-G5ZKRK2E.js} +2 -2
- package/chunks/{chunk-DK33QJ3V.js → chunk-GCRFH57X.js} +732 -13
- package/chunks/{chunk-EQY6POVO.js → chunk-GLEJW7T2.js} +1 -1
- package/chunks/{chunk-FXMC7SL2.js → chunk-I6NOSIVF.js} +1 -1
- package/chunks/{chunk-VBRRNQB7.js → chunk-IHJRUIWN.js} +109 -22
- package/chunks/{chunk-F7NXQH4Y.js → chunk-IIXEI2VE.js} +1 -1
- package/chunks/{chunk-2UUAIFQO.js → chunk-JGUT3LWZ.js} +5 -0
- package/chunks/{chunk-5EBKKSBX.js → chunk-JY74T7PW.js} +1 -1
- package/chunks/chunk-KSZKSE23.js +226 -0
- package/chunks/{chunk-MO7O5722.js → chunk-KW46DBFM.js} +35 -2
- package/chunks/{chunk-TISZXPAX.js → chunk-L263ROM6.js} +1 -1
- package/chunks/chunk-LXXMOYPL.js +22 -0
- package/chunks/{chunk-YX4LLZ3D.js → chunk-NABT4VOY.js} +109 -35
- package/chunks/{chunk-W34A5MJH.js → chunk-NROLDLP4.js} +1 -1
- package/chunks/{chunk-V7EQTZYR.js → chunk-O3WCEZEN.js} +191 -44
- package/chunks/{chunk-K4PZ5F5T.js → chunk-OWT2CAEQ.js} +1 -1
- package/chunks/{chunk-4YWLED2A.js → chunk-PNCWEDF6.js} +7 -4
- package/chunks/{chunk-WDW64OW3.js → chunk-PSDTLRAV.js} +5 -5
- package/chunks/{chunk-7R4DPSRA.js → chunk-R3VWUU2E.js} +1 -1
- package/chunks/{chunk-K7CRWKOE.js → chunk-R6AO7HBQ.js} +4617 -4012
- package/chunks/{chunk-6OATMEYN.js → chunk-RTV5TUYB.js} +12 -4
- package/chunks/{chunk-6W6DI34P.js → chunk-SE6GSFAO.js} +159 -2
- package/chunks/{chunk-WTSXKLG5.js → chunk-SUARMD4Q.js} +1 -1
- package/chunks/chunk-T4TZQJ7W.js +48 -0
- package/chunks/{chunk-LTNI523B.js → chunk-T7CZYIAU.js} +28 -5
- package/chunks/{chunk-3MX7D6QN.js → chunk-TIOE2OPE.js} +32 -4
- package/chunks/{chunk-TTUO4DNG.js → chunk-UF6ZTWU5.js} +75 -710
- package/chunks/{chunk-Q5GLXH5Q.js → chunk-UJG4VV2O.js} +5 -5
- package/chunks/{chunk-CJFNEBYB.js → chunk-VFEZWI6F.js} +1 -1
- package/chunks/{chunk-UFOKA4PR.js → chunk-VHCSIMTF.js} +114 -4
- package/chunks/{chunk-TQBODCFD.js → chunk-VRR65QYW.js} +250 -2
- package/chunks/{chunk-CUUXANEQ.js → chunk-W6J7RSCK.js} +6 -1
- package/chunks/{chunk-YHN5SUIJ.js → chunk-W7H223ZZ.js} +1 -1
- package/chunks/{chunk-WX6SD4IQ.js → chunk-WTNZ6DXB.js} +1 -1
- package/chunks/{chunk-GGJII3FM.js → chunk-WZJELXEU.js} +92 -3
- package/chunks/{chunk-OFEVHGVU.js → chunk-X5HZX4EP.js} +9 -11
- package/chunks/{chunk-KSO42X3Z.js → chunk-X6YQWCIJ.js} +21 -2
- package/chunks/{chunk-7L4XBYVW.js → chunk-XK42MWWO.js} +9 -2
- package/chunks/{chunk-X362TMXZ.js → chunk-XQDPCQ3A.js} +7 -5
- package/chunks/{chunk-YU56QGXX.js → chunk-Y3TNSHKF.js} +1 -1
- package/chunks/{chunk-HHEFI4RP.js → chunk-YOJGIRTD.js} +714 -109
- package/chunks/{chunk-CEW4HDPK.js → chunk-ZK4AMPKI.js} +2459 -350
- package/chunks/{chunk-SXU3KKNI.js → chunk-ZQIYGQCG.js} +251 -54
- package/chunks/{computer-use-IYTX45WA.js → computer-use-LTW3VB6L.js} +10 -10
- package/chunks/{config-utils-CFT33LTP.js → config-utils-IQQT3GCI.js} +3 -3
- package/chunks/{contextCommand-272V77WU.js → contextCommand-GLMC6CTP.js} +12 -12
- package/chunks/{create-sub-session-WNX2OQVX.js → create-sub-session-EAB2U5XW.js} +1 -1
- package/chunks/{create-sub-session-CBJMQLYP.js → create-sub-session-YMWQAWSN.js} +10 -10
- package/chunks/{cron-create-36TIFKRT.js → cron-create-GMVKSXZT.js} +1 -1
- package/chunks/{cron-delete-OQD3WULU.js → cron-delete-VDZKUAVK.js} +1 -1
- package/chunks/{cron-list-4533T2FH.js → cron-list-UG7C7RAR.js} +1 -1
- package/chunks/{daemon-RNGFPMAB.js → daemon-PRB64RP5.js} +303 -71
- package/chunks/{daemon-status-provider-L4STG5VO.js → daemon-status-provider-5OMM5JHF.js} +19 -20
- package/chunks/{de-2VCDRDGU.js → de-NOXPCSYN.js} +5 -0
- package/chunks/{dist-ERCPDVA6.js → dist-4WCQEZIN.js} +4 -51
- package/chunks/{dist-MOEC47TR.js → dist-DOPL5LSQ.js} +1 -1
- package/chunks/{dist-JZE7F6YR.js → dist-GXJVCOS7.js} +1 -1
- package/chunks/{dist-PHEPJLXD.js → dist-PX2ERZ6I.js} +2 -2
- package/chunks/{dist-HNN7DR2L.js → dist-V2YVLYOW.js} +58 -30
- package/chunks/{dist-3V3ZV6ML.js → dist-VYWUKURL.js} +1 -1
- package/chunks/{earlyInputCapture-EN4BRREQ.js → earlyInputCapture-A3WSRN4T.js} +10 -10
- package/chunks/{edit-OMAF2QDR.js → edit-7PG4AH27.js} +10 -10
- package/chunks/{en-NJCA3TAA.js → en-JFVULHTB.js} +6 -0
- package/chunks/{enter-worktree-BBZX52HG.js → enter-worktree-QUSB44RE.js} +10 -10
- package/chunks/{enterPlanMode-5NNFMBUY.js → enterPlanMode-NVSIEL7X.js} +10 -10
- package/chunks/{environment-7TEWMJYN.js → environment-AHHXHQTI.js} +12 -12
- package/chunks/{errors-I4VKVX3F.js → errors-NSWSRXC7.js} +12 -12
- package/chunks/{exit-worktree-FUWRJI33.js → exit-worktree-FXYEYHPL.js} +10 -10
- package/chunks/{exitPlanMode-IHCJ5EEI.js → exitPlanMode-JI5GK3F6.js} +10 -10
- package/chunks/{fast-path-ZA57TOH4.js → fast-path-X7EVDLKZ.js} +2 -2
- package/chunks/{fr-5F3E7WKD.js → fr-HVFNU42H.js} +5 -0
- package/chunks/{gemini-UOAKVXBG.js → gemini-YRLHY5KS.js} +162 -206
- package/chunks/{geminiContentGenerator-G6UCE6MW.js → geminiContentGenerator-SPLFPV5E.js} +1 -1
- package/chunks/{glob-4GJQ2UFF.js → glob-WASUBCSA.js} +10 -10
- package/chunks/{grep-5QSYXF2E.js → grep-DUVG3NGA.js} +10 -10
- package/chunks/{handleAutoUpdate-ULHNWL6R.js → handleAutoUpdate-NGE5AQ2N.js} +14 -14
- package/chunks/{i18n-CYDUTF6F.js → i18n-QNVR36NB.js} +11 -11
- package/chunks/{initializer-NRFKUGIO.js → initializer-ZY7ORPMH.js} +15 -15
- package/chunks/{installationInfo-WELKRHHE.js → installationInfo-4R75MFTB.js} +11 -11
- package/chunks/{ja-66J6B53L.js → ja-PY5AF544.js} +5 -0
- package/chunks/{list-JVDXEG2E.js → list-36JCMZRS.js} +18 -18
- package/chunks/{loadedSettingsAdapter-WAM4VUTG.js → loadedSettingsAdapter-PQIOJUSJ.js} +15 -15
- package/chunks/{loop-wakeup-MVUKDVCP.js → loop-wakeup-QXWZSCYM.js} +2 -2
- package/chunks/{ls-RXNIAQDE.js → ls-2OUTG3IZ.js} +1 -1
- package/chunks/{lsp-HB5LM5IL.js → lsp-4VMNXZW6.js} +1 -1
- package/chunks/{mcp-YHOZN3ZM.js → mcp-QXY6XA6H.js} +15 -15
- package/chunks/{monitor-R7XZPJHQ.js → monitor-AVEKRSY3.js} +12 -11
- package/chunks/{nonInteractiveCli-NSOB6D74.js → nonInteractiveCli-YWIBKX4M.js} +50 -50
- package/chunks/{notebook-edit-6RNKE2L2.js → notebook-edit-4SBTJX72.js} +10 -10
- package/chunks/{openaiContentGenerator-XNS5S64I.js → openaiContentGenerator-4EBAO7LR.js} +8 -8
- package/chunks/{pidfile-XE4RRR2P.js → pidfile-JMIUPXSU.js} +10 -10
- package/chunks/processUtils-EOINMEIH.js +29 -0
- package/chunks/{pt-TFZO5Y6T.js → pt-A3PRQXMU.js} +5 -0
- package/chunks/{qwenContentGenerator-APDPJ3VN.js → qwenContentGenerator-M7UBL3JS.js} +12 -12
- package/chunks/{read-file-XSUWXSR7.js → read-file-DXSEFHCV.js} +5 -5
- package/chunks/{read-mcp-resource-6LRTZKXI.js → read-mcp-resource-JUFHCKSC.js} +1 -1
- package/chunks/{record-artifact-PMDTY4OS.js → record-artifact-DWSMBXYY.js} +1 -1
- package/chunks/{ripGrep-APB3CDMU.js → ripGrep-VTRVFMDJ.js} +10 -10
- package/chunks/{ru-4L4LFHIT.js → ru-IBCWUTOC.js} +5 -0
- package/chunks/{run-qwen-serve-NWTGPERT.js → run-qwen-serve-P7WQDZAS.js} +59 -38
- package/chunks/{runtime-EIO3NQKR.js → runtime-UHYO6JGN.js} +19 -19
- package/chunks/{scheduler-JJDZBDRN.js → scheduler-WTK7ZLV5.js} +10 -10
- package/chunks/{send-message-SR4WSXP2.js → send-message-JZ752NWD.js} +2 -2
- package/chunks/{serve-WTIPB3EI.js → serve-AG2AOG56.js} +15 -15
- package/chunks/{server-NJPHQHLH.js → server-G5MM2BRI.js} +1157 -225
- package/chunks/{session-O4AO7FTS.js → session-NUAGEMVS.js} +51 -51
- package/chunks/{settings-HQNDK7TG.js → settings-VQA5PR2M.js} +14 -14
- package/chunks/{shell-UIXM6PWG.js → shell-X33RWGLP.js} +12 -10
- package/chunks/{skill-3XMB4ULV.js → skill-PHSU2OPP.js} +5 -5
- package/chunks/{spawnChannel-3R632QRM.js → spawnChannel-D6TZN4W7.js} +12 -13
- package/chunks/{src-USZKPUOC.js → src-6OJFUPTL.js} +95 -34
- package/chunks/{standalone-update-L5XW3D7K.js → standalone-update-ZARRW44Y.js} +12 -12
- package/chunks/{startInteractiveUI-CPZOL2WB.js → startInteractiveUI-C6IZRTF3.js} +176 -158
- package/chunks/{syntheticOutput-YKFNUQZD.js → syntheticOutput-LELY6HAI.js} +2 -2
- package/chunks/{task-create-NUFOHU53.js → task-create-QY3BIMNM.js} +3 -3
- package/chunks/{task-list-Z2IKQY3S.js → task-list-D2U47WBJ.js} +1 -1
- package/chunks/{task-stop-KQFIVQTJ.js → task-stop-N6E5IYLH.js} +1 -1
- package/chunks/{task-update-HKADXSTD.js → task-update-HJCQILLB.js} +3 -3
- package/chunks/{team-create-XXPRF3IQ.js → team-create-H434NQP2.js} +10 -10
- package/chunks/{team-delete-SDNTGZLG.js → team-delete-RCWYDRF4.js} +1 -1
- package/chunks/{team-plan-approval-EOTTKHDW.js → team-plan-approval-IIOHXZU6.js} +10 -10
- package/chunks/{theme-manager-P6UITO2L.js → theme-manager-IEOPHMX6.js} +10 -10
- package/chunks/{todoWrite-YNXB27GB.js → todoWrite-FKCGATPJ.js} +1 -1
- package/chunks/{tool-search-DDNGK2LR.js → tool-search-WIIEDALL.js} +6 -6
- package/chunks/{total-session-admission-PL5N7DNY.js → total-session-admission-WU3DORRW.js} +15 -17
- package/chunks/{trustedFolders-C5LMF3UR.js → trustedFolders-JVUTUAJ3.js} +11 -11
- package/chunks/update-relaunch-X5EQKCH5.js +87 -0
- package/chunks/{updateCheck-QTVVISH7.js → updateCheck-TGO2X735.js} +14 -12
- package/chunks/{validateNonInterActiveAuth-RY4RKBQG.js → validateNonInterActiveAuth-2MEUL2ME.js} +46 -46
- package/chunks/{version-U45RYOSD.js → version-KBGQKZWV.js} +1 -1
- package/chunks/{web-fetch-ZSPR3PRR.js → web-fetch-CFCWTCAP.js} +2 -3
- package/chunks/{workflow-TCIAQYOA.js → workflow-PAOSF4CG.js} +11 -11
- package/chunks/{workspace-providers-status-I3G2HYLY.js → workspace-providers-status-AYHJYSVO.js} +18 -18
- package/chunks/{workspace-registration-store-IH5GLZ6Y.js → workspace-registration-store-GZMR53QL.js} +1 -1
- package/chunks/{workspace-registry-QEKBELIX.js → workspace-registry-C2IXZWPF.js} +15 -17
- package/chunks/{workspace-service-ORKHGLP3.js → workspace-service-KDDAW33F.js} +20 -21
- package/chunks/{workspace-skills-status-D7QCNDYY.js → workspace-skills-status-WWEZBZXY.js} +16 -16
- package/chunks/{write-file-JGRQR5VM.js → write-file-ACN3TAIX.js} +10 -10
- package/chunks/{zh-FSAH32JB.js → zh-PAUNIMHQ.js} +6 -0
- package/chunks/{zh-TW-D2YIE2LO.js → zh-TW-GNEUIUFF.js} +6 -0
- package/cli-entry.js +92 -8
- package/cli.js +11 -11
- package/locales/ca.js +10 -0
- package/locales/de.js +10 -0
- package/locales/en.js +11 -0
- package/locales/fr.js +10 -0
- package/locales/ja.js +10 -0
- package/locales/pt.js +10 -0
- package/locales/ru.js +10 -0
- package/locales/zh-TW.js +11 -0
- package/locales/zh.js +11 -0
- package/package.json +3 -3
- package/web-shell/assets/{arc-CUeDlxvE.js → arc-Blc5_CnD.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-PiUszkQA.js → architectureDiagram-3BPJPVTR-Dyv1BvGP.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-s2wYSO7e.js → blockDiagram-GPEHLZMM-CVAb8DyB.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-DyLxZoz9.js → c4Diagram-AAUBKEIU-ClHPb_6S.js} +1 -1
- package/web-shell/assets/channel-DkPTtnGS.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-Dsdai7Tk.js → chunk-2J33WTMH-Dad9g3ZA.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-DEosOjV7.js → chunk-4BX2VUAB-IJJSSdDs.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-sNsRLTXf.js → chunk-55IACEB6-DRcc-Hl9.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DkRNZzmh.js → chunk-727SXJPM-DOCFB-6a.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-BrsRNpzd.js → chunk-AQP2D5EJ-CRZnSjHp.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CI039lpl.js → chunk-FMBD7UC4-BwUI4Yes.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-M-pkeIfu.js → chunk-ND2GUHAM-DLy8doxd.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-C4ckGNbH.js → chunk-QZHKN3VN-Bhz7iysj.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-DBdPU8ix.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DBdPU8ix.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BciKUAFq.js → cose-bilkent-S5V4N54A-jT1e8KzN.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-C1nTSgU6.js → dagre-BM42HDAG-C1veApQk.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-BDPNWr1m.js → diagram-2AECGRRQ-C_NOwKeT.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-CNFhTszL.js → diagram-5GNKFQAL-Bigfuz1r.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-CjPa4p5a.js → diagram-KO2AKTUF-CpXltPpU.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-ZzPykSyG.js → diagram-LMA3HP47-DYawbYbH.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-0UVtZ9A4.js → diagram-OG6HWLK6-D2t-ttd1.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CajDZCat.js → erDiagram-TEJ5UH35-Buc53PB5.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-BRuFBIvL.js → flowDiagram-I6XJVG4X-DwdFsCN7.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-BevGmJqG.js → ganttDiagram-6RSMTGT7-XhiEKGoP.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DvPMpBMb.js → gitGraphDiagram-PVQCEYII-D6We014a.js} +1 -1
- package/web-shell/assets/index-BctAmeF3.js +1143 -0
- package/web-shell/assets/{index-DzHwQkQq.js → index-CAWqS-bZ.js} +1 -1
- package/web-shell/assets/index-DLyhlZZO.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-Oixn7tA9.js → infoDiagram-5YYISTIA-C_iugRHQ.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-BgKpeg-j.js → ishikawaDiagram-YF4QCWOH-CAn9Kaix.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-74mwxIaA.js → journeyDiagram-JHISSGLW-BjDYOkEB.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-D4D6cEqA.js → kanban-definition-UN3LZRKU-Br_oI3Ob.js} +1 -1
- package/web-shell/assets/{linear-atZRE_L2.js → linear-BqnWHE9E.js} +1 -1
- package/web-shell/assets/{mermaid.core-KKudX-JC.js → mermaid.core-CT-sofSb.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-CMCej9yG.js → mindmap-definition-RKZ34NQL-BbvrZR4B.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-nhx40X7q.js → pieDiagram-4H26LBE5-gAwi3h_Q.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-CUmVcN3M.js → quadrantDiagram-W4KKPZXB-CONvBIuO.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-C_vyEwyy.js → requirementDiagram-4Y6WPE33-lpkrcy1e.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-DU6G4VWR.js → sankeyDiagram-5OEKKPKP-Bk6FJHqb.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DdeRR_KJ.js → sequenceDiagram-3UESZ5HK-B9b9bBzt.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-C6iCI8ps.js → stateDiagram-AJRCARHV-JqBGC-S3.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-B_w4fDnm.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-B_Ea8Cb7.js → timeline-definition-PNZ67QCA-CCCceXDP.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-BPUVZEJA.js → vennDiagram-CIIHVFJN-EHRnmZ09.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-BWEj0lKY.js → wardley-L42UT6IY-CYIcHx3_.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-BvDsdIQw.js → wardleyDiagram-YWT4CUSO-B81AuYRl.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-crz0QhF_.js → xychartDiagram-2RQKCTM6-DOQ6E3z7.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/channel-worker-group-K7QKH6IG.js +0 -13
- package/chunks/chunk-B7NUUEXC.js +0 -311
- package/chunks/chunk-CARU2RR2.js +0 -24
- package/chunks/chunk-GYTKQYDB.js +0 -23
- package/chunks/chunk-LQU7EVFA.js +0 -30
- package/chunks/chunk-OCPBI7J5.js +0 -18
- package/chunks/chunk-OJAMDVF5.js +0 -66
- package/chunks/chunk-TEGEBB2I.js +0 -122
- package/web-shell/assets/channel-DkuJJ0qd.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-CwqHc0TB.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-CwqHc0TB.js +0 -1
- package/web-shell/assets/index-Cnvv4VcI.css +0 -5
- package/web-shell/assets/index-D1Uyklxa.js +0 -1088
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-C0_6nR6C.js +0 -1
|
@@ -163,7 +163,7 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
163
163
|
| `model.reasoningEffort` | enum | How hard reasoning-capable models think, applied across all providers. Set with the [`/effort`](../features/commands) command (`low`, `medium`, `high`, `xhigh`, `max`). Each provider maps and clamps this to what the active model supports (e.g. Gemini caps at `high`; Anthropic clamps tiers a model lacks). Leave unset to use the model/provider default. | `undefined` |
|
|
164
164
|
| `model.baseUrl` | string | Persisted automatically by the model picker to disambiguate when multiple `modelProviders` entries share the same model id. Not intended to be set by hand — use the `/model` picker or a `modelProviders` entry instead; a stale hand-edited value can silently route requests to a different same-id provider. | `undefined` |
|
|
165
165
|
| `model.sessionTokenLimit` | number | Maximum recorded prompt token count allowed before sending the next message. `-1` means unlimited; `0` is also treated as unlimited (unlike `model.maxToolCalls`, where `0` disallows all calls). When the recorded prompt count exceeds the limit, the next send is dropped (the session is not aborted). | `-1` |
|
|
166
|
-
| `model.maxSessionTurns` |
|
|
166
|
+
| `model.maxSessionTurns` | integer | Maximum number of user/model/tool turns to keep in a session. -1 means unlimited. | `-1` |
|
|
167
167
|
| `model.maxWallTimeSeconds` | number | Wall-clock budget for headless / unattended runs, in seconds. `-1` means unlimited. Overridable per-invocation via `--max-wall-time`, which requires a positive duration (`90`, `30s`, `5m`, `1h`, `1.5h`); the minimum is 1 second — sub-second values (`500ms`, `0.5`) are rejected as typos. Omit the flag to fall back to this setting. Aborts with exit code 55 when exceeded. | `-1` |
|
|
168
168
|
| `model.maxToolCalls` | number | Cumulative tool-call budget for a run (counts every executed tool, success or failure; `structured_output` under `--json-schema` is exempt). `-1` means unlimited; `0` means "no tool calls allowed". Capped at 1,000,000 to catch typos. Overridable via `--max-tool-calls`. Aborts with exit code 55 when exceeded. | `-1` |
|
|
169
169
|
| `model.maxSubagentDepth` | number | Maximum sub-agent nesting depth (1-based levels: a top-level sub-agent is level 1). `1` keeps sub-agents available but disables nesting — the pre-nesting behavior. Values clamp to the range 1–100; non-finite values fall back to the default. Teammates, forks, and workflow-spawned agents never nest regardless of this setting. Overridable via `--max-subagent-depth`. | `5` |
|
|
@@ -175,7 +175,7 @@ Settings are organized into categories. Most settings should be placed within th
|
|
|
175
175
|
| `model.chatCompression.screenshotTriggerThreshold` | number | Tool-returned image count at or above which the screenshot trigger fires (only when `enableScreenshotTrigger`). Compaction resets the count — surviving images are re-embedded as top-level parts, which the trigger doesn't count — so it won't immediately re-fire. Env override: `QWEN_COMPACT_SCREENSHOT_THRESHOLD`. | `20` |
|
|
176
176
|
| `model.skipNextSpeakerCheck` | boolean | Skip the next speaker check. | `true` |
|
|
177
177
|
| `model.skipLoopDetection` | boolean | Disables streaming loop detection checks. Defaults to `true` (loop detection is skipped) to avoid false positives interrupting legitimate workflows. Set to `false` to re-enable streaming loop detection — useful as a guardrail in headless / non-interactive runs where stuck repetition can otherwise waste budget. | `true` |
|
|
178
|
-
| `model.maxToolCallsPerTurn` |
|
|
178
|
+
| `model.maxToolCallsPerTurn` | integer | Hard cap on tool calls within a single turn (one model turn plus its tool-result continuations; blocking Stop-hook continuations such as `/goal` iterations start a fresh budget). Always-on circuit breaker against runaway turns, independent of `model.skipLoopDetection`; the pattern-based loop detectors fire long before this cap, which only bounds total volume. Set to `0` or a negative value to disable the cap. Choosing "Disable loop detection for this session" in the loop-detected dialog also suppresses it for the rest of the session. | `100` |
|
|
179
179
|
| `model.skipStartupContext` | boolean | Skips sending the startup workspace context (environment summary and acknowledgement) at the beginning of each session. Enable this if you prefer to provide context manually or want to save tokens on startup. | `false` |
|
|
180
180
|
| `model.enableOpenAILogging` | boolean | Enables logging of OpenAI API calls for debugging and analysis. When enabled, API requests and responses are logged to JSON files. | `false` |
|
|
181
181
|
| `model.openAILoggingDir` | string | Custom directory path for OpenAI API logs. If not specified, defaults to `logs/openai` in the current working directory. Supports absolute paths, relative paths (resolved from current working directory), and `~` expansion (home directory). | `undefined` |
|
|
@@ -258,9 +258,9 @@ The `extra_body` field allows you to add custom parameters to the request body s
|
|
|
258
258
|
|
|
259
259
|
#### visionModel
|
|
260
260
|
|
|
261
|
-
| Setting | Type | Description
|
|
262
|
-
| ------------- | ------ |
|
|
263
|
-
| `visionModel` | string | Image-capable model used as the vision bridge: when a text-only main model receives an image, it is transcribed by this model first. Leave empty to auto-pick a same-provider vision model. Can also be set via `/model --vision`. | `""` |
|
|
261
|
+
| Setting | Type | Description | Default |
|
|
262
|
+
| ------------- | ------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------- |
|
|
263
|
+
| `visionModel` | string | Image-capable model used as the vision bridge: when a text-only main model receives an image, or `read_file` needs the bounded PDF visual fallback, it is transcribed by this model first. Setting this explicitly authorizes bridge calls to that model even when it uses another provider; the tool display discloses the endpoint. Leave empty to auto-pick a same-provider vision model. Can also be set via `/model --vision`. | `""` |
|
|
264
264
|
|
|
265
265
|
#### visionBridgeTimeoutMs
|
|
266
266
|
|
|
@@ -320,12 +320,13 @@ If you are experiencing performance issues with file searching (e.g., with `@` c
|
|
|
320
320
|
| `tools.sandboxImage` | string | Sandbox image URI used by Docker/Podman when `--sandbox-image` and `QWEN_SANDBOX_IMAGE` are not set. | `undefined` | |
|
|
321
321
|
| `tools.shell.enableInteractiveShell` | boolean | Use `node-pty` for an interactive shell experience. Fallback to `child_process` still applies. | `true` | |
|
|
322
322
|
| `tools.shell.defaultTimeoutMs` | number | Default timeout, in milliseconds, for foreground shell commands started by the agent. A per-call timeout on the shell tool overrides this. When unset, foreground commands time out after 120000 ms (2 minutes). Set to 0 to disable the timeout. | `undefined` | |
|
|
323
|
+
| `tools.shell.heartbeatIntervalMs` | number | Interval, in milliseconds, between liveness heartbeats emitted while a foreground shell command produces no output. Heartbeats are forwarded to ACP clients and stream-json consumers so they can tell a silent command from a dead session. When unset, heartbeats fire every 10000 ms (10 seconds). Set to 0 to disable heartbeats. | `undefined` | |
|
|
323
324
|
| `tools.core` | array of strings | **Deprecated.** Will be removed in next version. Use `permissions.allow` + `permissions.deny` instead. Restricts built-in tools to an allowlist. All tools not in the list are disabled. | `undefined` | |
|
|
324
325
|
| `tools.exclude` | array of strings | **Deprecated.** Use `permissions.deny` instead. Tool names to exclude from discovery. Automatically migrated to the `permissions` format on first load. | `undefined` | |
|
|
325
326
|
| `tools.disabled` | array of strings | Tool names hidden from the registry entirely. Unlike `permissions.deny` (which blocks calls at runtime), disabled tools are never registered, so they do not appear in `/tools` and cannot be discovered or called by the model. For example, `["enter_plan_mode"]` prevents the model from switching into plan mode on its own. Merged as a union across scopes. | `undefined` | |
|
|
326
327
|
| `tools.visible` | array of strings | Deferred tool names made visible at startup without requiring `tool_search`. Listed tools appear alongside core tools in the initial session. Merged as a union across scopes. | `undefined` | |
|
|
327
328
|
| `tools.allowed` | array of strings | **Deprecated.** Use `permissions.allow` instead. Tool names that bypass the confirmation dialog. Automatically migrated to the `permissions` format on first load. | `undefined` | |
|
|
328
|
-
| `tools.approvalMode` | string | Sets the default approval mode for tool usage. | `
|
|
329
|
+
| `tools.approvalMode` | string | Sets the default approval mode for tool usage. | `auto` | Possible values: `plan` (analyze only, do not modify files or execute commands), `default` (require approval before file edits or shell commands run), `auto-edit` (automatically approve file edits), `auto` (LLM classifier auto-approves safe actions, blocks risky ones), `yolo` (automatically approve all tool calls) |
|
|
329
330
|
| `tools.discoveryCommand` | string | Command to run for tool discovery. | `undefined` | |
|
|
330
331
|
| `tools.callCommand` | string | Defines a custom shell command for calling a specific tool that was discovered using `tools.discoveryCommand`. The shell command must meet the following criteria: It must take function `name` (exactly as in [function declaration](https://ai.google.dev/gemini-api/docs/function-calling#function-declarations)) as first command line argument. It must read function arguments as JSON on `stdin`, analogous to [`functionCall.args`](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference#functioncall). It must return function output as JSON on `stdout`, analogous to [`functionResponse.response.content`](https://cloud.google.com/vertex-ai/generative-ai/docs/model-reference/inference#functionresponse). | `undefined` | |
|
|
331
332
|
| `tools.useRipgrep` | boolean | Use ripgrep for file content search instead of the fallback implementation. Provides faster search performance. | `true` | |
|
|
@@ -19,9 +19,9 @@ Qwen Code offers five distinct permission modes that allow you to flexibly contr
|
|
|
19
19
|
### Quick Reference Guide
|
|
20
20
|
|
|
21
21
|
- **Start in Plan Mode**: Great for understanding before making changes
|
|
22
|
-
- **
|
|
22
|
+
- **Auto Mode (default)**: The default out-of-the-box experience — an LLM classifier auto-approves safe actions and blocks risky ones, minimizing interruptions while keeping a safety net
|
|
23
|
+
- **Switch to Ask Permissions**: When you want manual approval for every file edit and shell command
|
|
23
24
|
- **Switch to Auto-Edit**: When you're making lots of safe code changes
|
|
24
|
-
- **Try Auto Mode**: When you want fewer interruptions but still want safety on shell commands and network calls — an LLM classifier evaluates each call
|
|
25
25
|
- **Use YOLO sparingly**: Only for trusted automation in controlled environments
|
|
26
26
|
|
|
27
27
|
> [!tip]
|
|
@@ -81,6 +81,36 @@ qwen channel start
|
|
|
81
81
|
|
|
82
82
|
Open DingTalk and send a message to the bot. You should see a 👀 emoji reaction appear while the agent processes, followed by the response.
|
|
83
83
|
|
|
84
|
+
## Daemon Webhook Delivery
|
|
85
|
+
|
|
86
|
+
When the channel runs under `qwen serve`, authenticated external Webhook events can trigger unattended agent tasks and deliver the final Markdown response to either a DingTalk user or group. Use the existing Webhook target fields; no separate channel type is required:
|
|
87
|
+
|
|
88
|
+
```json
|
|
89
|
+
{
|
|
90
|
+
"webhooks": {
|
|
91
|
+
"sources": {
|
|
92
|
+
"manual-test": {
|
|
93
|
+
"secretEnv": "QWEN_CHANNEL_DINGTALK_TEST_SECRET",
|
|
94
|
+
"targets": {
|
|
95
|
+
"operator": {
|
|
96
|
+
"chatId": "DINGTALK_USER_ID",
|
|
97
|
+
"senderId": "webhook:manual-test",
|
|
98
|
+
"isGroup": false
|
|
99
|
+
},
|
|
100
|
+
"team": {
|
|
101
|
+
"chatId": "OPEN_CONVERSATION_ID",
|
|
102
|
+
"senderId": "webhook:manual-test",
|
|
103
|
+
"isGroup": true
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Every target must set `isGroup` explicitly. For a direct message, `chatId` is the recipient's DingTalk user ID. For a group message, `chatId` is the group's `openConversationId`. Thread targets and incoming robot Webhook URLs are not supported for proactive delivery. See [Webhook-triggered tasks](./overview#webhook-triggered-tasks) for the complete channel configuration and request format.
|
|
113
|
+
|
|
84
114
|
## Group Chats
|
|
85
115
|
|
|
86
116
|
DingTalk bots work in both DM and group conversations. To enable group support:
|
|
@@ -89,20 +89,51 @@ Controls how conversation sessions are managed:
|
|
|
89
89
|
|
|
90
90
|
### Channel Memory
|
|
91
91
|
|
|
92
|
-
Channel memory
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
92
|
+
Channel memory stores durable context for one chat or thread. Entries have stable
|
|
93
|
+
IDs, so a list response can be used for deterministic follow-up operations.
|
|
94
|
+
|
|
95
|
+
- `记住:默认使用 staging 环境` saves a new entry for the current chat or
|
|
96
|
+
thread.
|
|
97
|
+
- `查看记忆` lists entries and their stable IDs. Use `查看第 2 页记忆` to view
|
|
98
|
+
a later page, `查看记忆 <id>` to view one entry, or a natural filtered
|
|
99
|
+
request such as `只看中文偏好` to list the matching entries.
|
|
100
|
+
- `查看刚才那条记忆`, `把关于 staging 的记忆改成默认使用 production`, and
|
|
101
|
+
`忘掉刚才那条` work when the natural reference resolves to exactly one entry.
|
|
102
|
+
`把 <id> 改成默认使用 production` updates that entry immediately, and
|
|
103
|
+
`忘掉 <id>` removes it immediately. Neither operation needs confirmation.
|
|
104
|
+
- `清空记忆` starts the clear-all confirmation flow; `确认清空记忆` completes
|
|
105
|
+
it.
|
|
106
|
+
|
|
107
|
+
When a natural inspect, update, or removal request matches multiple entries,
|
|
108
|
+
the bot returns the candidate IDs and previews without changing memory. There
|
|
109
|
+
is no pending selection or confirmation state: retry the request with one exact
|
|
110
|
+
ID, such as `忘掉 m-a31f0d82c7e4`. Exact-ID operations remain the deterministic
|
|
111
|
+
fast path. A natural request with no match reports that no entry matched.
|
|
112
|
+
|
|
113
|
+
The legacy slash aliases `/remember-channel`, `/channel-memory`, and
|
|
114
|
+
`/forget-channel` have been removed. They are no longer channel-memory
|
|
115
|
+
commands.
|
|
116
|
+
|
|
117
|
+
Channel memory follows the channel access gates. Any message accepted by
|
|
118
|
+
`senderPolicy`, `dmPolicy`, `groupPolicy`, group settings, pairing, and mention
|
|
119
|
+
requirements can read, write, update, or clear memory for that chat or thread.
|
|
120
|
+
Accepted members of the same group share that group's target store. Use
|
|
121
|
+
`allowlist` or `pairing` policies when group memory should be limited to trusted
|
|
122
|
+
senders.
|
|
123
|
+
|
|
124
|
+
Existing legacy `CHANNEL.md` memory is migrated automatically to structured
|
|
125
|
+
`CHANNEL.json` storage on the first mutation. Structured memory persists across
|
|
126
|
+
standalone channel and daemon-managed channel restarts, and is injected when a
|
|
127
|
+
fresh target-scoped session starts, including after `/clear`.
|
|
128
|
+
|
|
129
|
+
Memory remains keyed to the current chat or thread. It is not injected into a
|
|
130
|
+
`sessionScope: single` session, because that session is shared across the whole
|
|
131
|
+
channel rather than scoped to one target.
|
|
132
|
+
|
|
133
|
+
Channel memory does not automatically learn facts from normal conversation,
|
|
134
|
+
extract multiple entries from one request, or accept `第一个` as confirmation
|
|
135
|
+
for an ambiguous natural reference. Use a clear remember request and an exact
|
|
136
|
+
entry ID when a natural reference is ambiguous.
|
|
106
137
|
|
|
107
138
|
### Token Security
|
|
108
139
|
|
|
@@ -421,7 +452,12 @@ Example channel config:
|
|
|
421
452
|
"github-ci": {
|
|
422
453
|
"secretEnv": "QWEN_CHANNEL_GITHUB_CI_SECRET",
|
|
423
454
|
"targets": {
|
|
424
|
-
"
|
|
455
|
+
"operator": {
|
|
456
|
+
"chatId": "DINGTALK_USER_ID",
|
|
457
|
+
"senderId": "webhook:github-ci",
|
|
458
|
+
"isGroup": false
|
|
459
|
+
},
|
|
460
|
+
"team": {
|
|
425
461
|
"chatId": "OPEN_CONVERSATION_ID",
|
|
426
462
|
"senderId": "webhook:github-ci",
|
|
427
463
|
"isGroup": true
|
|
@@ -435,7 +471,7 @@ Example channel config:
|
|
|
435
471
|
}
|
|
436
472
|
```
|
|
437
473
|
|
|
438
|
-
For DingTalk, `chatId`
|
|
474
|
+
For DingTalk, set `isGroup` explicitly on every target. A direct-message target uses the DingTalk user ID as `chatId` with `isGroup: false`; a group target uses the group `openConversationId` with `isGroup: true`. Other adapters may require their own proactive target shape.
|
|
439
475
|
|
|
440
476
|
Start `qwen serve` with the channel worker enabled:
|
|
441
477
|
|
|
@@ -451,7 +487,7 @@ curl -X POST "http://127.0.0.1:4170/channels/dingtalk-main/webhooks/github-ci" \
|
|
|
451
487
|
-H "Content-Type: application/json" \
|
|
452
488
|
-d '{
|
|
453
489
|
"eventType": "push",
|
|
454
|
-
"targetRef": "
|
|
490
|
+
"targetRef": "operator",
|
|
455
491
|
"title": "CI pipeline finished",
|
|
456
492
|
"payload": {
|
|
457
493
|
"targetRef": "refs/heads/main",
|
|
@@ -39,10 +39,7 @@ Add the channel to `~/.qwen/settings.json`:
|
|
|
39
39
|
"sessionScope": "user",
|
|
40
40
|
"cwd": "/path/to/your/project",
|
|
41
41
|
"instructions": "You are a concise coding assistant responding via WeCom.",
|
|
42
|
-
"groupPolicy": "open"
|
|
43
|
-
"groups": {
|
|
44
|
-
"*": { "requireMention": true }
|
|
45
|
-
}
|
|
42
|
+
"groupPolicy": "open"
|
|
46
43
|
}
|
|
47
44
|
}
|
|
48
45
|
}
|
|
@@ -82,9 +79,13 @@ Open WeCom and send a message to the intelligent robot.
|
|
|
82
79
|
- `pairing`: users must pair before using the bot.
|
|
83
80
|
- `open`: anyone who can message the robot can use it.
|
|
84
81
|
|
|
85
|
-
For groups, set `groupPolicy` to `"allowlist"` or `"open"`.
|
|
82
|
+
For groups, set `groupPolicy` to `"allowlist"` or `"open"`. WeCom only delivers group messages that mention the intelligent robot, so every delivered group callback is treated as mentioned. The `requireMention` setting cannot enable responses to unmentioned group messages because those messages are not delivered to the bot.
|
|
86
83
|
|
|
87
|
-
|
|
84
|
+
### Group Mention Compatibility
|
|
85
|
+
|
|
86
|
+
Earlier Qwen Code versions also applied the generic `requireMention` gate after WeCom delivered a group callback. Because the callback does not include separate mention metadata, `requireMention: true`—including the default value—could reject every delivered group message and make group chat appear nonfunctional.
|
|
87
|
+
|
|
88
|
+
Qwen Code now relies on WeCom's mention-scoped delivery and does not apply a second mention decision. Existing WeCom configurations containing either `requireMention: true` or `requireMention: false` remain valid and do not produce configuration errors. Both values have the same behavior for WeCom, so the field can be removed. Other settings in the same group entry, such as `dispatchMode`, continue to apply. `groupHistoryLimit` remains accepted but cannot collect new WeCom history because unmentioned group messages are not delivered.
|
|
88
89
|
|
|
89
90
|
## Images and Files
|
|
90
91
|
|
|
@@ -109,7 +110,7 @@ For safety, local image paths must be inside the channel file directory under th
|
|
|
109
110
|
### Bot does not respond in groups
|
|
110
111
|
|
|
111
112
|
- Check `groupPolicy`.
|
|
112
|
-
- Mention the bot
|
|
113
|
+
- Mention the bot in the group.
|
|
113
114
|
- Confirm the robot has been added to the group.
|
|
114
115
|
|
|
115
116
|
### Self-built application credentials do not work
|
|
@@ -114,6 +114,8 @@ Priority order (highest to lowest):
|
|
|
114
114
|
|
|
115
115
|
`settings.env.QWEN_SANDBOX_IMAGE` also works as a generic env injection mechanism, but `tools.sandboxImage` is the preferred persistent setting.
|
|
116
116
|
|
|
117
|
+
Custom images are user-managed. Rebuild them with an up-to-date Qwen Code installation to receive the safe update handoff; older images may still use their original in-process updater.
|
|
118
|
+
|
|
117
119
|
### macOS Seatbelt profiles
|
|
118
120
|
|
|
119
121
|
Built-in profiles (set via `SEATBELT_PROFILE` env var):
|
|
@@ -20,6 +20,34 @@ The daemon reads the bearer token from either `--token <value>` on the CLI or th
|
|
|
20
20
|
|
|
21
21
|
One shell-level `export` covers both server boot and SDK client construction (just keep it scoped to the session, per the note above).
|
|
22
22
|
|
|
23
|
+
## Workspace lifecycle and process boundaries
|
|
24
|
+
|
|
25
|
+
One daemon can host several isolated workspace runtimes under the same listener.
|
|
26
|
+
Repeat `--workspace` with absolute directories to create explicit startup
|
|
27
|
+
runtimes; the first is primary. Primary and other explicit startup/static
|
|
28
|
+
runtimes cannot be removed without restarting the process.
|
|
29
|
+
|
|
30
|
+
Additional workspaces can also be registered while the daemon is running
|
|
31
|
+
through `POST /workspaces`. Pass `persist: true` to retain a dynamic secondary
|
|
32
|
+
in the user-level registration store so it is restored on the next start.
|
|
33
|
+
Untrusted registrations remain visible for diagnostics, bounded file reads,
|
|
34
|
+
and declared persisted reads but cannot start ACP. Dynamic and
|
|
35
|
+
persisted-restored secondaries are removable: a normal removal refuses while
|
|
36
|
+
the runtime is busy, while a forced removal requests termination of active
|
|
37
|
+
resources and commits logical removal before the same cwd can be re-added.
|
|
38
|
+
Cleanup is bounded and best-effort after the persistence commit point; failures
|
|
39
|
+
are logged rather than restoring the removed runtime.
|
|
40
|
+
|
|
41
|
+
Runtime isolation covers cwd, environment overlay, filesystem/trust boundary,
|
|
42
|
+
workspace services, bridge, Voice lease state, channel worker, and the ACP/MCP
|
|
43
|
+
resource boundary. Production attempts to preheat the primary ACP child and
|
|
44
|
+
retries on first use after failure; trusted secondaries start theirs on demand,
|
|
45
|
+
and untrusted secondaries do not start ACP.
|
|
46
|
+
Authentication, HTTP rate limits, listener and Voice admission caps,
|
|
47
|
+
total-session admission, metrics, shutdown, and the process fault radius remain
|
|
48
|
+
daemon-global. Run separate daemons when those process-level boundaries must be
|
|
49
|
+
independent.
|
|
50
|
+
|
|
23
51
|
## Linux: systemd user unit
|
|
24
52
|
|
|
25
53
|
> **Find your `qwen` binary first.** The unit file's `ExecStart=` must hold an **absolute path** — service managers don't read your shell's `PATH`. Run `which qwen` to discover it. Common locations: `/usr/local/bin/qwen` (Linuxbrew, manual installs), `~/.nvm/versions/node/vX.Y.Z/bin/qwen` (nvm), `~/.fnm/aliases/default/bin/qwen` (fnm), `~/.volta/bin/qwen` (Volta). Substitute the actual path everywhere the templates below show `/PATH/TO/qwen`.
|
|
@@ -34,9 +62,9 @@ After=network.target
|
|
|
34
62
|
[Service]
|
|
35
63
|
Type=simple
|
|
36
64
|
# Replace with your project; %h expands to $HOME under user units.
|
|
37
|
-
WorkingDirectory=%h/
|
|
65
|
+
WorkingDirectory=%h/project-a
|
|
38
66
|
# Run `which qwen` to find the absolute path. systemd does NOT read $PATH.
|
|
39
|
-
ExecStart=/PATH/TO/qwen serve --hostname 127.0.0.1 --port 4170
|
|
67
|
+
ExecStart=/PATH/TO/qwen serve --hostname 127.0.0.1 --port 4170 --workspace %h/project-a --workspace %h/project-b
|
|
40
68
|
# Read the bearer token from a chmod 600 file rather than inlining it
|
|
41
69
|
# in the unit. `Environment=` would expose the token in the unit file
|
|
42
70
|
# (typically 644 = world-readable). EnvironmentFile keeps the token in
|
|
@@ -95,10 +123,14 @@ Without `loginctl enable-linger`, the user-level systemd instance shuts down whe
|
|
|
95
123
|
<string>127.0.0.1</string>
|
|
96
124
|
<string>--port</string>
|
|
97
125
|
<string>4170</string>
|
|
126
|
+
<string>--workspace</string>
|
|
127
|
+
<string>/Users/YOUR-USERNAME/project-a</string>
|
|
128
|
+
<string>--workspace</string>
|
|
129
|
+
<string>/Users/YOUR-USERNAME/project-b</string>
|
|
98
130
|
</array>
|
|
99
131
|
<!-- launchd does NOT expand `~` or `$HOME` — use absolute paths. -->
|
|
100
132
|
<key>WorkingDirectory</key>
|
|
101
|
-
<string>/Users/YOUR-USERNAME/
|
|
133
|
+
<string>/Users/YOUR-USERNAME/project-a</string>
|
|
102
134
|
<key>EnvironmentVariables</key>
|
|
103
135
|
<dict>
|
|
104
136
|
<!-- DO NOT COMMIT this file with a real token. Also chmod 600 the
|
|
@@ -153,7 +185,7 @@ After editing the plist (e.g., rotating the token) you must `unload` then `load`
|
|
|
153
185
|
Assumes `QWEN_SERVER_TOKEN` is already exported in your shell (see the setup section above):
|
|
154
186
|
|
|
155
187
|
```bash
|
|
156
|
-
tmux new -d -s qwen-serve "
|
|
188
|
+
tmux new -d -s qwen-serve "qwen serve --hostname 127.0.0.1 --workspace /absolute/path/project-a --workspace /absolute/path/project-b"
|
|
157
189
|
tmux attach -t qwen-serve # see live logs; Ctrl-b d to detach
|
|
158
190
|
tmux kill-session -t qwen-serve
|
|
159
191
|
```
|
|
@@ -165,11 +197,14 @@ tmux kill-session -t qwen-serve
|
|
|
165
197
|
Assumes `QWEN_SERVER_TOKEN` is already exported in your shell:
|
|
166
198
|
|
|
167
199
|
```bash
|
|
168
|
-
nohup
|
|
200
|
+
nohup qwen serve --hostname 127.0.0.1 \
|
|
201
|
+
--workspace /absolute/path/project-a \
|
|
202
|
+
--workspace /absolute/path/project-b \
|
|
203
|
+
> qwen-serve.log 2>&1 &
|
|
169
204
|
echo $! # daemon PID; capture if you want to `kill` cleanly later
|
|
170
205
|
```
|
|
171
206
|
|
|
172
|
-
|
|
207
|
+
Explicit absolute `--workspace` values keep the daemon independent of the shell's current directory. A client should select one of the advertised `capabilities.workspaces[]` entries and pass its cwd when creating a session.
|
|
173
208
|
|
|
174
209
|
OK for one-off "let me run this in the background while I poke at the API" workflows. **Not recommended** for anything beyond a single session — no restart-on-crash, log file grows unbounded, no clean way to find the daemon if you forget the PID. Prefer tmux for interactive supervision or systemd / launchd for anything you want to outlast a reboot.
|
|
175
210
|
|
|
@@ -214,7 +249,7 @@ A daemon **restart** drops all in-memory sessions; clients reconnect and start f
|
|
|
214
249
|
## Out of scope (defers to v0.16.x or later)
|
|
215
250
|
|
|
216
251
|
- **Containerized deployment** — Dockerfile, docker-compose, Kubernetes manifests, nginx + TLS reverse proxy, multi-instance token isolation. Defers to v0.16.x once an enterprise pilot is committed; the doc would otherwise rot from no-one-validating.
|
|
217
|
-
- **Cross-host federation / multi-daemon coordination on one host** —
|
|
252
|
+
- **Cross-host federation / multi-daemon coordination on one host** — one daemon can host multiple registered workspace runtimes, but daemons do not coordinate. Instance-path token keying + stale-token cleanup defer to v0.16.x.
|
|
218
253
|
- **Auto-generated daemon tokens** — alpha is BYO-token. Auto-gen + token-store infrastructure defers to v0.16.x.
|
|
219
254
|
- **Windows native service** (`nssm`, Service Control Manager wrapper) — for now use [WSL2](https://learn.microsoft.com/en-us/windows/wsl/) and follow the systemd section above.
|
|
220
255
|
|