@qwen-code/qwen-code 0.24.5-preview.0 → 0.24.5
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/browser-use/SKILL.md +11 -10
- package/bundled/browser-use/runtime/index.js +70 -31
- package/bundled/browser-use/runtime/native-host.js +1 -0
- package/bundled/browser-use/runtime/scripts/native-host-setup.js +1 -0
- package/bundled/computer-use/SKILL.md +182 -224
- package/bundled/qc-helper/docs/configuration/model-providers.md +13 -2
- package/bundled/qc-helper/docs/conversations-recovery.md +10 -0
- package/bundled/qc-helper/docs/features/browser-use.md +22 -12
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +2 -2
- package/bundled/qc-helper/docs/features/channels/dws.md +7 -7
- package/bundled/qc-helper/docs/features/channels/feishu.md +1 -1
- package/bundled/qc-helper/docs/features/channels/github.md +13 -9
- package/bundled/qc-helper/docs/features/channels/gitlab.md +12 -5
- package/bundled/qc-helper/docs/features/channels/overview.md +121 -46
- package/bundled/qc-helper/docs/features/channels/plugins.md +12 -12
- package/bundled/qc-helper/docs/features/channels/qqbot.md +5 -5
- package/bundled/qc-helper/docs/features/channels/telegram.md +5 -5
- package/bundled/qc-helper/docs/features/channels/wecom.md +5 -4
- package/bundled/qc-helper/docs/features/channels/weixin.md +3 -3
- package/bundled/qc-helper/docs/features/code-review.md +4 -0
- package/bundled/qc-helper/docs/features/computer-use.md +1 -1
- package/bundled/qc-helper/docs/quickstart.md +14 -14
- package/bundled/qc-helper/docs/qwen-serve.md +10 -4
- package/bundled/review/SKILL.md +44 -9
- package/bundled/review/references/persistence.md +3 -4
- package/chunks/{MaxSizedBox-3RXPTLCS.js → MaxSizedBox-4MLWQHF3.js} +33 -31
- package/chunks/{StandaloneSessionPicker-74775YBZ.js → StandaloneSessionPicker-PDNU6KJJ.js} +50 -48
- package/chunks/{acp-subagent-executor-OQXOMTFK.js → acp-subagent-executor-JB2J6N73.js} +35 -33
- package/chunks/{acpAgent-MD56LD7L.js → acpAgent-CAPZFZCW.js} +123 -97
- package/chunks/{agent-75EZNG2Q.js → agent-MTWGIPWC.js} +18 -16
- package/chunks/{agent-headless-TQ6MWUDT.js → agent-headless-Z27XJSXK.js} +18 -16
- package/chunks/{anthropicContentGenerator-DCDXTX3R.js → anthropicContentGenerator-VAFZRJWG.js} +3 -3
- package/chunks/{askUserQuestion-2NU6CXK2.js → askUserQuestion-V4OFZD5D.js} +1 -1
- package/chunks/{bridge-KGJYQUWD.js → bridge-BUCSJHCE.js} +35 -33
- package/chunks/{channel-management-service-YN4A3BJ6.js → channel-management-service-Q2B7WUPL.js} +27 -10
- package/chunks/{channel-settings-store-773UOD6B.js → channel-settings-store-U25CVEL6.js} +42 -40
- package/chunks/{channel-worker-group-AKPVHRUO.js → channel-worker-group-QNX4OIMZ.js} +5 -5
- package/chunks/{channel-worker-manager-TDAQSKWX.js → channel-worker-manager-IJCPV4WY.js} +24 -5
- package/chunks/{channel-worker-supervisor-PUMSN4J2.js → channel-worker-supervisor-ENJ2AE2N.js} +4 -4
- package/chunks/{chunk-OU4ZCLGJ.js → chunk-242INZ6Y.js} +1 -1
- package/chunks/{chunk-JOFZBTVL.js → chunk-245NB3M4.js} +1 -1
- package/chunks/{chunk-LISITUEH.js → chunk-26KGIWIW.js} +1 -1
- package/chunks/{chunk-WPHZEGFC.js → chunk-2RQEWY2P.js} +1 -1
- package/chunks/{chunk-DCTJ3GVF.js → chunk-2SCE6YR2.js} +3 -3
- package/chunks/{chunk-STKUN7BR.js → chunk-2XNGG7R3.js} +1 -1
- package/chunks/{chunk-OQE7AA2W.js → chunk-36ZMEEBW.js} +16 -12
- package/chunks/{chunk-Y53WH7VD.js → chunk-44K6Q5AW.js} +3 -3
- package/chunks/{chunk-N4VKU36J.js → chunk-465XOJLQ.js} +1 -1
- package/chunks/{chunk-HD4IXPPC.js → chunk-4A4XNQEZ.js} +3 -3
- package/chunks/{chunk-RXB6Y33E.js → chunk-4VULJ3LV.js} +1 -1
- package/chunks/{chunk-EBRC4GX2.js → chunk-4XXUGJJS.js} +1 -1
- package/chunks/{chunk-MVC4XLNM.js → chunk-53IRNMPU.js} +118 -5
- package/chunks/{chunk-VGLXXHTF.js → chunk-5BLOZPTW.js} +1 -1
- package/chunks/{chunk-3SK2A75W.js → chunk-5OJQLD3P.js} +3 -3
- package/chunks/{chunk-WVNCMGAO.js → chunk-6FURC4LI.js} +1 -1
- package/chunks/{chunk-WVTM33Q3.js → chunk-6KXQIDK2.js} +4 -4
- package/chunks/{chunk-ZKDUQHU4.js → chunk-7MNHZUTA.js} +35 -18
- package/chunks/{chunk-JEIPBSGX.js → chunk-7P5WZQXF.js} +7 -7
- package/chunks/{chunk-GGUOO2XC.js → chunk-7RCAMBLN.js} +1 -1
- package/chunks/{chunk-FBLGI2SO.js → chunk-AAOMFXVZ.js} +7 -7
- package/chunks/{chunk-JM76TMGV.js → chunk-ACLD6C3R.js} +8798 -7901
- package/chunks/{chunk-4FCWKBOC.js → chunk-ALTMZEBU.js} +6 -6
- package/chunks/{chunk-ZHQSWNO6.js → chunk-AN62TPO6.js} +1 -1
- package/chunks/{chunk-U5DPG7JW.js → chunk-AYTI24XN.js} +1 -1
- package/chunks/{chunk-B53FO7JN.js → chunk-AZN2GSLM.js} +2 -2
- package/chunks/{chunk-6KQQPPFF.js → chunk-B3J4BSPL.js} +1 -1
- package/chunks/{chunk-SLSH5TFD.js → chunk-BMCDSO77.js} +4 -4
- package/chunks/{chunk-DBYUN4U3.js → chunk-BUDUHXX3.js} +1 -1
- package/chunks/{chunk-TS4Y2MHO.js → chunk-CGREZDGO.js} +1 -1
- package/chunks/chunk-CLNDQINM.js +523 -0
- package/chunks/{chunk-LNUQA3OE.js → chunk-CVRZNFXO.js} +1 -1
- package/chunks/{chunk-3DBI3LLL.js → chunk-CWLTXYKP.js} +4 -4
- package/chunks/{chunk-B3XMX4SN.js → chunk-DACCX4JI.js} +4 -4
- package/chunks/{chunk-YWZOEHBT.js → chunk-DE2WI7RU.js} +192 -62
- package/chunks/{chunk-3TQVPDCN.js → chunk-DU53RB7A.js} +2 -2
- package/chunks/{chunk-2KZURPTB.js → chunk-DZCTQ2MF.js} +6 -1
- package/chunks/{chunk-35SABQFH.js → chunk-DZUNDX4M.js} +1 -1
- package/chunks/{chunk-4INF7OYV.js → chunk-ELY2U74S.js} +2 -2
- package/chunks/chunk-EMGHODF7.js +56 -0
- package/chunks/{chunk-5FZKG4JB.js → chunk-EMOTEATH.js} +1 -1
- package/chunks/{chunk-LW7WW3Z5.js → chunk-ERGQUKZ2.js} +1 -1
- package/chunks/{chunk-TNWJJEDT.js → chunk-ES6EQNGR.js} +6 -6
- package/chunks/{chunk-E3TLOFX7.js → chunk-EUHSEMO4.js} +62 -7
- package/chunks/{chunk-N25B6FZN.js → chunk-EYCDA5MN.js} +2 -0
- package/chunks/{chunk-GPTEZLRR.js → chunk-F4ERRMCO.js} +25 -23
- package/chunks/{chunk-SXFZ5P7F.js → chunk-FE7D3WKV.js} +1 -1
- package/chunks/{chunk-XEXNBTYX.js → chunk-FH45BQGZ.js} +3 -3
- package/chunks/{chunk-CAORZAZD.js → chunk-FLBUHGL4.js} +10 -10
- package/chunks/{chunk-X2R47SFR.js → chunk-FLVPNMCS.js} +1 -1
- package/chunks/{chunk-5SZSV2CK.js → chunk-FVIJFKEQ.js} +3 -3
- package/chunks/{chunk-KFLDZ3HB.js → chunk-G6XRNTXF.js} +1 -1
- package/chunks/{chunk-2JHQ2J3Y.js → chunk-G72UHXC3.js} +5 -5
- package/chunks/{chunk-4A255ZI6.js → chunk-GAHZJLQG.js} +2 -2
- package/chunks/{chunk-7IVZOKKW.js → chunk-GKJGKTWJ.js} +3 -3
- package/chunks/{chunk-KY4HZXLV.js → chunk-GLPNIOEV.js} +33 -2
- package/chunks/{chunk-6PRSQUPJ.js → chunk-GQZZGEMS.js} +1 -1
- package/chunks/{chunk-G2AE7GYZ.js → chunk-GRUASRWC.js} +1 -1
- package/chunks/{chunk-HH7R6RLK.js → chunk-GTQ35GRO.js} +1 -1
- package/chunks/{chunk-LWRJLRZS.js → chunk-GYLDOFLU.js} +3 -3
- package/chunks/{chunk-MZRJ2JJS.js → chunk-HDSI3RDN.js} +136 -9
- package/chunks/{chunk-RO5K7QUL.js → chunk-HHMJ5ONX.js} +45 -31
- package/chunks/{chunk-E4HNTYHK.js → chunk-HVVQYSBA.js} +32 -9
- package/chunks/{chunk-H2GVLBFU.js → chunk-I36GIR6K.js} +64 -2
- package/chunks/{chunk-VTFLRL55.js → chunk-IBRV4T3I.js} +2 -2
- package/chunks/{chunk-4VSTV4C2.js → chunk-IH22ZGZI.js} +53 -2
- package/chunks/{chunk-AOW7WIWE.js → chunk-IQH7Q5OP.js} +4 -4
- package/chunks/{chunk-OB444SG3.js → chunk-IYKGSUTA.js} +1 -1
- package/chunks/{chunk-HS5OZTQF.js → chunk-J2FLXQJM.js} +1 -1
- package/chunks/{chunk-BBCH7PBA.js → chunk-KACKEW2M.js} +2 -2
- package/chunks/{chunk-JE3J5HFM.js → chunk-KAOHUUM7.js} +62 -251
- package/chunks/{chunk-JCMDVGPR.js → chunk-KGLPVCX7.js} +2 -2
- package/chunks/{chunk-QKXZOHHQ.js → chunk-LDURD6EP.js} +15 -62
- package/chunks/{chunk-O4IH5UEC.js → chunk-LLIYDIGU.js} +20 -20
- package/chunks/{chunk-3XHMOJCP.js → chunk-MBC3PULP.js} +1 -1
- package/chunks/{chunk-SRZA7OU4.js → chunk-MMCGLNPP.js} +6 -6
- package/chunks/{chunk-3NG2ZQAJ.js → chunk-NZC74TT2.js} +1 -1
- package/chunks/{chunk-47C3HPMW.js → chunk-O5YL6KSX.js} +47 -18
- package/chunks/{chunk-EIHZ4FFM.js → chunk-O6PPYFQN.js} +3 -3
- package/chunks/{chunk-XCU752HT.js → chunk-OICDXWXP.js} +13 -19
- package/chunks/{chunk-VJCKLKZX.js → chunk-OOU7XOZF.js} +3 -3
- package/chunks/{chunk-OM5NSL25.js → chunk-P4P7CH7H.js} +38 -38
- package/chunks/{chunk-CIS4SY3R.js → chunk-PPBZHGEQ.js} +3 -3
- package/chunks/{chunk-PB7JBAHF.js → chunk-PVBIEIVZ.js} +0 -1
- package/chunks/{chunk-GG3MO6NO.js → chunk-PWGMHXIV.js} +2 -2
- package/chunks/{chunk-6N2PJAZG.js → chunk-PX2ZOOGQ.js} +1 -1
- package/chunks/{chunk-NNN2PKPV.js → chunk-PYYPSK6Q.js} +36 -495
- package/chunks/{chunk-TKOQGFRE.js → chunk-PZOWKCPJ.js} +1 -1
- package/chunks/{chunk-PJ546DX4.js → chunk-Q36IJ74U.js} +17 -11
- package/chunks/chunk-Q4FJVWI4.js +78 -0
- package/chunks/{chunk-PA4HU5IQ.js → chunk-QATPE3SN.js} +13 -7
- package/chunks/{chunk-MBUUQJPV.js → chunk-QGKAYDES.js} +5 -5
- package/chunks/{chunk-TFBQ5CKI.js → chunk-QNEBHC2E.js} +1 -1
- package/chunks/{chunk-6NA357SF.js → chunk-QTNSMJKU.js} +1 -1
- package/chunks/{chunk-TDLEDOJN.js → chunk-QU7VULWX.js} +5 -4
- package/chunks/{chunk-LOTGIM6V.js → chunk-R3IFSY55.js} +20 -20
- package/chunks/{chunk-ZX6EZ7EH.js → chunk-RBE3WRSN.js} +3 -3
- package/chunks/{chunk-YSZ2XZTG.js → chunk-RBKZ6SK4.js} +5 -5
- package/chunks/{chunk-FLRFAPDA.js → chunk-RCL6OXZC.js} +5 -5
- package/chunks/{chunk-H4W6TJFJ.js → chunk-RONRTFAQ.js} +1 -1
- package/chunks/{chunk-ZEGLZ3MN.js → chunk-SCYKHWRM.js} +5 -5
- package/chunks/{chunk-STUJ7IMZ.js → chunk-SI7XKACY.js} +56 -56
- package/chunks/{chunk-RL2HSTEB.js → chunk-SYZPPX3O.js} +1492 -1140
- package/chunks/{chunk-VUYJRNG5.js → chunk-T7TJPVTY.js} +3 -3
- package/chunks/{chunk-4V5YKOBI.js → chunk-TF7UC7F6.js} +3 -3
- package/chunks/{chunk-NXZD3VNX.js → chunk-TL7DSR47.js} +1 -1
- package/chunks/{chunk-BVFBDXI2.js → chunk-TPFV5YZK.js} +1 -1
- package/chunks/{chunk-YIHOHHJL.js → chunk-TZHXHWEW.js} +1 -1
- package/chunks/{chunk-3X5BDEXS.js → chunk-U6RMVE5X.js} +8 -8
- package/chunks/{chunk-HRVFPNGT.js → chunk-VFNKO4FK.js} +4 -4
- package/chunks/{chunk-VPALWDQL.js → chunk-VUIH3BQL.js} +31 -12
- package/chunks/{chunk-WVNML4HH.js → chunk-VW33WARJ.js} +1 -1
- package/chunks/{chunk-MICQVBPI.js → chunk-WCLHOKAZ.js} +1 -1
- package/chunks/{chunk-KMQ2ZH3Q.js → chunk-WVWCRZ6M.js} +2 -2
- package/chunks/{chunk-5NFAKADR.js → chunk-WZCVB2ER.js} +1 -36
- package/chunks/{chunk-JNQEW7B2.js → chunk-X3A72KX5.js} +6 -6
- package/chunks/{chunk-3JSIWFNA.js → chunk-XHHUGXYW.js} +527 -135
- package/chunks/{chunk-VIA4STCR.js → chunk-YCCBLTSL.js} +3 -3
- package/chunks/{chunk-Q5IEY2TN.js → chunk-Z3I5B4DH.js} +1 -1
- package/chunks/{chunk-O346IB64.js → chunk-ZAJNI63I.js} +1 -1
- package/chunks/{chunk-QR4U27UW.js → chunk-ZJFCDRVP.js} +4 -4
- package/chunks/{codex-subagent-executor-437LQYGM.js → codex-subagent-executor-IKWULWIZ.js} +35 -33
- package/chunks/{config-utils-CVLI36KM.js → config-utils-3IOTAFBG.js} +38 -34
- package/chunks/{contextCommand-2KSW7H5F.js → contextCommand-ZKG2JFCR.js} +33 -31
- package/chunks/{core-runtime-4IB27E7J.js → core-runtime-5CAK5DSM.js} +32 -30
- package/chunks/{create-sub-session-A73TQDAN.js → create-sub-session-DG4CVOQC.js} +33 -31
- package/chunks/{daemon-Y6AOK7LF.js → daemon-D4OAVQKB.js} +1 -1
- package/chunks/{daemon-git-worktree-guard-BTKVV3DZ.js → daemon-git-worktree-guard-S3SFT3H7.js} +32 -30
- package/chunks/{daemon-status-provider-ETDIOWMS.js → daemon-status-provider-GG64ZJR3.js} +40 -38
- package/chunks/{daemon-trust-policy-U5SPHJLP.js → daemon-trust-policy-XNWYLQ32.js} +38 -36
- package/chunks/{daemon-trust-policy-monitor-QKRCO5WI.js → daemon-trust-policy-monitor-DR5CRWMM.js} +38 -36
- package/chunks/{deferred-core-runtime-FRELZPIE.js → deferred-core-runtime-V4Q674KN.js} +32 -30
- package/chunks/{dist-54LGNLWW.js → dist-3M75XY4G.js} +1 -1
- package/chunks/{dist-YZBMQPNS.js → dist-6U5NQYA7.js} +5 -5
- package/chunks/{dist-FVMLRUVM.js → dist-AS2RPYOB.js} +1 -1
- package/chunks/{dist-HANHY2MK.js → dist-GFT4GU72.js} +2 -2
- package/chunks/{dist-Y5GP7SWL.js → dist-J7JK3GPY.js} +10 -9
- package/chunks/{dist-O723VE2K.js → dist-JTPRKF5H.js} +30 -27
- package/chunks/{dist-MGZKUISU.js → dist-MOO5VOC5.js} +7 -20
- package/chunks/{dist-IZ66D5A3.js → dist-NJ2L5QKL.js} +1 -1
- package/chunks/{dist-EI2XAB4W.js → dist-YC6LDCKH.js} +22 -28
- package/chunks/{edit-TQ3CABYP.js → edit-FPIWTN3L.js} +20 -18
- package/chunks/{enter-worktree-J46XVFRS.js → enter-worktree-55OWD4LT.js} +4 -3
- package/chunks/{enterPlanMode-JHOWELZO.js → enterPlanMode-GDZVXYB2.js} +18 -16
- package/chunks/{environment-LUM7XX27.js → environment-Q2BVTUQO.js} +36 -32
- package/chunks/{errors-SH32ID5I.js → errors-MZTLVUEM.js} +34 -32
- package/chunks/{execution-sandbox-settings-HIYVUBII.js → execution-sandbox-settings-3WJ67GX3.js} +3 -1
- package/chunks/{execution-tool-IIEL25CL.js → execution-tool-DZ4XSEFZ.js} +21 -19
- package/chunks/{execution-worker-NKKEZ4XF.js → execution-worker-L3TM3F5D.js} +24 -22
- package/chunks/{exit-worktree-BC4SDZCC.js → exit-worktree-MI6N4OUP.js} +4 -3
- package/chunks/{exitPlanMode-PUICCCQ5.js → exitPlanMode-VIGOD2KP.js} +18 -16
- package/chunks/{fast-path-QH3QTZZA.js → fast-path-JCKEFUUL.js} +4 -4
- package/chunks/{fast-path-settings-TQAYWLXR.js → fast-path-settings-VIYSH3SD.js} +2 -2
- package/chunks/{glob-OEB4WH3Z.js → glob-UOKQZHKL.js} +18 -16
- package/chunks/{goal-tools-KWGKFUSK.js → goal-tools-G4RIX4ER.js} +18 -16
- package/chunks/{handleAutoUpdate-KEA7JSUD.js → handleAutoUpdate-UZZEGL3N.js} +34 -32
- package/chunks/{i18n-AC3MUXKZ.js → i18n-IL33FVND.js} +32 -30
- package/chunks/{initializer-WBD32BEX.js → initializer-BCXBRM6Y.js} +38 -36
- package/chunks/{installationInfo-JRGFTKWY.js → installationInfo-V7OKUOJV.js} +32 -30
- package/chunks/{list-S7KW7NBX.js → list-LQHG6SXA.js} +41 -39
- package/chunks/{llm-E32WLISX.js → llm-JWCANCDC.js} +85 -74
- package/chunks/{llm-content-generator-OMKJHC5P.js → llm-content-generator-OXMMHUVK.js} +3 -3
- package/chunks/{loadedSettingsAdapter-5OSU3J46.js → loadedSettingsAdapter-EKXSRWMY.js} +38 -36
- package/chunks/{local-execution-environment-IQHCTUJ5.js → local-execution-environment-XIQLRMLF.js} +24 -22
- package/chunks/{loggingContentGenerator-JIYG3LJS.js → loggingContentGenerator-6KHNZDTZ.js} +20 -18
- package/chunks/{managed-npm-update-RKAT7AMQ.js → managed-npm-update-MBUH5TIX.js} +32 -30
- package/chunks/managed-runtime-attestation-worker-G23AEEMF.js +367 -0
- package/chunks/{mcp-SV72BZKG.js → mcp-AYVCEEN7.js} +38 -36
- package/chunks/{model-call-collection-PKDMVCZN.js → model-call-collection-OKUGOY4B.js} +1 -1
- package/chunks/{model-configuration-A52XMQW7.js → model-configuration-Q3MNGG3B.js} +38 -36
- package/chunks/{modelConfigUtils-7O4P3SLE.js → modelConfigUtils-WC5XDR34.js} +33 -31
- package/chunks/{monitor-ZXRV2DJB.js → monitor-7JUZXYZN.js} +18 -16
- package/chunks/{nonInteractiveCli-UPSGIYRC.js → nonInteractiveCli-B3GCZ6NJ.js} +74 -73
- package/chunks/{nonInteractiveToolExecutor-TDKVR43J.js → nonInteractiveToolExecutor-IUHO7PXG.js} +19 -17
- package/chunks/{notebook-edit-FBVHAHYM.js → notebook-edit-IYDACZDW.js} +19 -17
- package/chunks/{omni-3NREMV2Q.js → omni-DLBHISHC.js} +10 -7
- package/chunks/{openaiContentGenerator-EWPBZFIT.js → openaiContentGenerator-W5GN6H6Z.js} +12 -10
- package/chunks/{openaiResponsesContentGenerator-3CI3PINB.js → openaiResponsesContentGenerator-BXXRYJQQ.js} +5 -5
- package/chunks/{pidfile-BBUANGZX.js → pidfile-QIBF53CW.js} +32 -30
- package/chunks/{processUtils-6OHQLG7W.js → processUtils-2LU22KCR.js} +2 -2
- package/chunks/{prompt-terminal-ledger-ZBFYXJ4L.js → prompt-terminal-ledger-LXFVLR6C.js} +33 -31
- package/chunks/{qwenContentGenerator-62F5IKXJ.js → qwenContentGenerator-LYMLXBWI.js} +21 -19
- package/chunks/{reactive-degrade-URJMXJ7N.js → reactive-degrade-HPYBJHYA.js} +6 -6
- package/chunks/{read-file-IM4Q5TKI.js → read-file-SXS2MKDY.js} +6 -3
- package/chunks/{record-artifact-K4XSMW4X.js → record-artifact-XP3X7RE5.js} +3 -2
- package/chunks/{record-source-XZCI3IGU.js → record-source-2VBLKVIE.js} +2 -2
- package/chunks/{report-findings-MCGXBQFX.js → report-findings-D2QUYUOG.js} +4 -3
- package/chunks/{request-shutdown-TT62PREA.js → request-shutdown-R5SA5GE3.js} +1 -1
- package/chunks/{resumeHistoryUtils-O3NQMDVR.js → resumeHistoryUtils-UPGZGP5V.js} +35 -33
- package/chunks/{ripGrep-BG2FEVIV.js → ripGrep-X33VVIN5.js} +8 -5
- package/chunks/{run-qwen-serve-GMLWJITM.js → run-qwen-serve-CUB2NZ6P.js} +278 -79
- package/chunks/{runtime-SSGPOXRZ.js → runtime-2DAVBADX.js} +43 -41
- package/chunks/{sandboxConfig-ALYLLNWY.js → sandboxConfig-ESBH3F27.js} +34 -32
- package/chunks/{scheduled-tasks-QJTC5XQ7.js → scheduled-tasks-TGWYXZWW.js} +38 -36
- package/chunks/{scheduler-PEXTY7IG.js → scheduler-XGLZCXPN.js} +34 -32
- package/chunks/{send-message-3UM7XRTB.js → send-message-FBU6WDID.js} +1 -1
- package/chunks/{serve-OVAUTKXK.js → serve-7RX4AIID.js} +38 -36
- package/chunks/{server-3MMYOOJW.js → server-MJETIFJS.js} +1789 -375
- package/chunks/{session-PZBIKBQJ.js → session-7AVYU3TC.js} +75 -74
- package/chunks/{session-attachments-root-ESP5CNBV.js → session-attachments-root-RONFQ3D3.js} +32 -30
- package/chunks/{session-pr-refresh-B3N7PKUP.js → session-pr-refresh-ZPT6TAD4.js} +37 -35
- package/chunks/{settings-KSQ2DGPY.js → settings-FPMUAVWD.js} +37 -35
- package/chunks/{shell-3V26EVNC.js → shell-THD5EYOK.js} +18 -16
- package/chunks/{skill-XP7F3LBV.js → skill-2D6KXDC5.js} +52 -13
- package/chunks/{skill-settings-PDESL7S3.js → skill-settings-XW7X244B.js} +38 -36
- package/chunks/{spawnChannel-NVO7CCBW.js → spawnChannel-DBSAAUUT.js} +34 -32
- package/chunks/{standalone-update-FDWS2EGF.js → standalone-update-TFAWA676.js} +33 -31
- package/chunks/{start-opentui-ui-WIFFY5UD.js → start-opentui-ui-VYMAXPBH.js} +87 -86
- package/chunks/{startInteractiveUI-YBLIRIHD.js → startInteractiveUI-Z54XKH35.js} +1037 -966
- package/chunks/{task-create-PEI7AJLE.js → task-create-PVF66J3R.js} +2 -2
- package/chunks/{task-update-MQZRWBGK.js → task-update-RSIITTOK.js} +2 -2
- package/chunks/{team-create-Z5JUEMB7.js → team-create-TPCELNBJ.js} +18 -16
- package/chunks/{team-plan-approval-ZLLHMEQN.js → team-plan-approval-RUURGHQL.js} +18 -16
- package/chunks/{terminal-image-renderer-QFO2JTTT.js → terminal-image-renderer-SLJVUD4Z.js} +32 -30
- package/chunks/{theme-manager-N7ILUTRY.js → theme-manager-VBOIN2KT.js} +32 -30
- package/chunks/{tool-call-PLSQ34VE.js → tool-call-DUHP6UXC.js} +2 -2
- package/chunks/{tool-result-media-OAHUKGRK.js → tool-result-media-WU6QAREN.js} +10 -7
- package/chunks/{tool-search-534QKE2X.js → tool-search-ET4NH2LK.js} +7 -4
- package/chunks/{total-session-admission-EZJQKTPF.js → total-session-admission-UWMJWTWP.js} +35 -33
- package/chunks/{trustedFolders-4ZEV6RXD.js → trustedFolders-3WNZBUH7.js} +33 -31
- package/chunks/{update-relaunch-GB3SGRDP.js → update-relaunch-SHS3BD6V.js} +5 -5
- package/chunks/{updateCheck-DVAGAEQ4.js → updateCheck-MDF2FCRN.js} +32 -30
- package/chunks/{upload-config-DMZVTDH7.js → upload-config-LVVUIKA2.js} +4 -4
- package/chunks/{useAutoAcceptIndicator-PTQBS42B.js → useAutoAcceptIndicator-26OOM7OM.js} +41 -39
- package/chunks/{validateNonInterActiveAuth-DU3WXVSU.js → validateNonInterActiveAuth-TBCZCQIN.js} +72 -71
- package/chunks/{version-PNMZGKCV.js → version-MICV7I4Y.js} +1 -1
- package/chunks/{web-fetch-LMCOAHW6.js → web-fetch-3O2DFRE5.js} +13 -9
- package/chunks/{web-search-N7RR74LA.js → web-search-5FS3NB3D.js} +4 -4
- package/chunks/{web-shell-static-GI6FVIMI.js → web-shell-static-E3O6NW7Y.js} +4 -3
- package/chunks/{workflow-ZZPHI7FK.js → workflow-FRJO5ZUI.js} +19 -17
- package/chunks/{workspace-providers-status-TU73CNRF.js → workspace-providers-status-I5MO7Z2T.js} +43 -41
- package/chunks/{workspace-registration-store-743FRSOU.js → workspace-registration-store-CBHKV34L.js} +1 -1
- package/chunks/{workspace-registry-S7QTXFWM.js → workspace-registry-2UKNZO5M.js} +35 -33
- package/chunks/{workspace-runtime-coordinator-GWNDUIGO.js → workspace-runtime-coordinator-TKCI5WJW.js} +36 -34
- package/chunks/{workspace-service-CERZFJ3B.js → workspace-service-M3ZKR6WL.js} +40 -38
- package/chunks/{workspace-skills-status-5M3EIAUY.js → workspace-skills-status-OC3EYL7U.js} +41 -39
- package/chunks/{workspace-trust-reconciler-Q3LUKMQB.js → workspace-trust-reconciler-YQZSUOH4.js} +41 -39
- package/chunks/{write-file-CT54LXQL.js → write-file-BATJLBJX.js} +21 -19
- package/chunks/{zoom-image-EU3PGSZM.js → zoom-image-5I7DDLQE.js} +10 -6
- package/cli-entry.js +13 -0
- package/cli.js +24 -12
- package/execution-worker.js +1 -1
- package/export-transcript-document.css +1 -1
- package/export-transcript-document.js +104 -104
- package/package.json +3 -3
- package/web-shell/assets/{abnfDiagram-VCTEODGH-DDYEvG-M.js → abnfDiagram-VCTEODGH-DQHroFS1.js} +1 -1
- package/web-shell/assets/{arc-DQncKWFX.js → arc-BrOc_HVh.js} +1 -1
- package/web-shell/assets/{architectureDiagram-5GKGNRK7-C0-8u9zj.js → architectureDiagram-5GKGNRK7-DXce8IH6.js} +1 -1
- package/web-shell/assets/{blockDiagram-NRAW4CY4-Cpt59Ge5.js → blockDiagram-NRAW4CY4-96A3Q3-l.js} +1 -1
- package/web-shell/assets/{c4Diagram-UCG6FXSJ-BvESWh83.js → c4Diagram-UCG6FXSJ-CQBg2PSg.js} +1 -1
- package/web-shell/assets/channel-CBP6pwSs.js +1 -0
- package/web-shell/assets/{chunk-2Q5K7J3B-wKulGIU6.js → chunk-2Q5K7J3B-i_jhVz-t.js} +1 -1
- package/web-shell/assets/{chunk-5VM5RSS4-BX6kRoq7.js → chunk-5VM5RSS4-Cx3gMrWT.js} +1 -1
- package/web-shell/assets/{chunk-F27PBJKO-wA4IqTt-.js → chunk-F27PBJKO-B9WwW7C0.js} +1 -1
- package/web-shell/assets/{chunk-G27WJ6UU-B7hzevlb.js → chunk-G27WJ6UU-B8t0FNPI.js} +1 -1
- package/web-shell/assets/{chunk-JWPE2WC7-BdBg9pJg.js → chunk-JWPE2WC7-Dg0__6CF.js} +1 -1
- package/web-shell/assets/{chunk-LCL6LL3I-DghmF6LJ.js → chunk-LCL6LL3I-DUwE5g3m.js} +1 -1
- package/web-shell/assets/{chunk-POPQ4Y6H-BbReTOod.js → chunk-POPQ4Y6H-BirYW5iS.js} +1 -1
- package/web-shell/assets/{chunk-SVP7TREG-C1t0_19D.js → chunk-SVP7TREG-_ONJKtFF.js} +1 -1
- package/web-shell/assets/{chunk-XXDRQBXY-DQBby5mI.js → chunk-XXDRQBXY-DGi0chgj.js} +1 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-_4_fFrN3.js +1 -0
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-_4_fFrN3.js +1 -0
- package/web-shell/assets/{cose-bilkent-JH36ORCC-CNrSyg7B.js → cose-bilkent-JH36ORCC-BSSFxREn.js} +1 -1
- package/web-shell/assets/{cynefin-OW5HDTMX-DoxgDRN-.js → cynefin-OW5HDTMX-h-oYVCez.js} +1 -1
- package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-BmUwbS8Q.js → cynefinDiagram-5FMLGOSQ-CXj6T7Pm.js} +1 -1
- package/web-shell/assets/{dagre-3AP2YEHR-BJrOVIjc.js → dagre-3AP2YEHR-Ch9GIhJm.js} +1 -1
- package/web-shell/assets/{diagram-S7CK7UJ4-TDX4KU9V.js → diagram-S7CK7UJ4-Cq3W541T.js} +1 -1
- package/web-shell/assets/{diagram-UQ7AKVKN-D3VUQkGl.js → diagram-UQ7AKVKN-Bm1R5-sN.js} +1 -1
- package/web-shell/assets/{diagram-VSXAHHWV-CqCpgViy.js → diagram-VSXAHHWV-BW2qG6Vh.js} +1 -1
- package/web-shell/assets/{diagram-VX7I27RA-CthqfwCs.js → diagram-VX7I27RA-DN96PhRe.js} +1 -1
- package/web-shell/assets/{diagram-Z3DM3KII-BRY3Ahvu.js → diagram-Z3DM3KII-A8MnwaJr.js} +1 -1
- package/web-shell/assets/{ebnfDiagram-PWID7BFC-tJvTnIwp.js → ebnfDiagram-PWID7BFC-CZTpUypI.js} +1 -1
- package/web-shell/assets/{erDiagram-SSCWMZ5O-DT4b7w5B.js → erDiagram-SSCWMZ5O-CbxCRFru.js} +1 -1
- package/web-shell/assets/{flowDiagram-A5DVABFB-C5oirWSf.js → flowDiagram-A5DVABFB-Bt1PM2Dy.js} +1 -1
- package/web-shell/assets/{ganttDiagram-EL5Y4UJY-ZD3kNlO4.js → ganttDiagram-EL5Y4UJY-CTgim3LX.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-Bp1sg_wH.js → gitGraphDiagram-WWUBYQGX-h4jX7S4l.js} +1 -1
- package/web-shell/assets/{index-DSIzVof7.js → index-BDxWHGNm.js} +1 -1
- package/web-shell/assets/index-Bd3iA5Er.js +2407 -0
- package/web-shell/assets/index-DuwfO01z.css +36 -0
- package/web-shell/assets/{infoDiagram-RXCK75RN-Btumz_CZ.js → infoDiagram-RXCK75RN-DsIsFmZ4.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-5VMMS53U-Dx8_uvso.js → ishikawaDiagram-5VMMS53U-BgF2V3rC.js} +1 -1
- package/web-shell/assets/{journeyDiagram-EYS64GPL-DS5spUhj.js → journeyDiagram-EYS64GPL-CJ2ibWhB.js} +1 -1
- package/web-shell/assets/{kanban-definition-3QL26DDD-DttC9d4D.js → kanban-definition-3QL26DDD-oqNfpjND.js} +1 -1
- package/web-shell/assets/{layout-BDOJQJbX.js → layout-DKF2f-UC.js} +1 -1
- package/web-shell/assets/{linear-BsUVMxld.js → linear-CadmYA8J.js} +1 -1
- package/web-shell/assets/{mermaid.core-De4-EW4Z.js → mermaid.core-BSD13L-h.js} +6 -6
- package/web-shell/assets/{mindmap-definition-FBJOCRG2-BsYY98Wv.js → mindmap-definition-FBJOCRG2-Cg3jlHzV.js} +1 -1
- package/web-shell/assets/{pegDiagram-XKGWAZYB-DXnnQrVY.js → pegDiagram-XKGWAZYB-BGzqlBWk.js} +1 -1
- package/web-shell/assets/{pieDiagram-E7YTZNPT-DGLAGUYR.js → pieDiagram-E7YTZNPT-BVDdPYnC.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-AXDQQJYC-Y8DcMTa5.js → quadrantDiagram-AXDQQJYC-D7maRW6r.js} +1 -1
- package/web-shell/assets/{railroadDiagram-O6MQD6OU-ZgauslUZ.js → railroadDiagram-O6MQD6OU-C7J0Nnqc.js} +1 -1
- package/web-shell/assets/{requirementDiagram-EFPCY7ZU-Kxtu4twe.js → requirementDiagram-EFPCY7ZU-CDEpUB7S.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-P5KCCOFB-BKsLF9EA.js → sankeyDiagram-P5KCCOFB-DoA0BWeR.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-D8sCv1NK.js → sequenceDiagram-WJ2MYXX4-DlqRjDLl.js} +1 -1
- package/web-shell/assets/{sizeCapture-X5ZJPWSS-BX8sokZX.js → sizeCapture-X5ZJPWSS-3l2EJ1DB.js} +1 -1
- package/web-shell/assets/{stateDiagram-HBIQ2CUA-DFMl58kv.js → stateDiagram-HBIQ2CUA-Bdq0N6Lr.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-DtdYpKZp.js +1 -0
- package/web-shell/assets/{swimlanes-XN3QIQJK-BnMwURLN.js → swimlanes-XN3QIQJK-B4ArxdLV.js} +1 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-B_iL0Dc4.js +8 -0
- package/web-shell/assets/{timeline-definition-24CTP7MA-C8y77DDz.js → timeline-definition-24CTP7MA-B_Ug6D_k.js} +1 -1
- package/web-shell/assets/{vennDiagram-4TSXK5OY-DOWQgX9u.js → vennDiagram-4TSXK5OY-BR9tvaDT.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-VM6X3IG4-BM0AVIzE.js → wardleyDiagram-VM6X3IG4-BdGIt6qE.js} +1 -1
- package/web-shell/assets/{xychartDiagram-S5SC5T6Z-B18-YghG.js → xychartDiagram-S5SC5T6Z-NxS8XkXN.js} +1 -1
- package/web-shell/index.html +2 -2
- package/web-shell/sw.js +1 -1
- package/bundled/computer-use/references/macos.md +0 -208
- package/bundled/computer-use/references/windows-linux.md +0 -247
- package/web-shell/assets/channel-B88Zt8_x.js +0 -1
- package/web-shell/assets/classDiagram-DTDB5LWJ-Dp-7ruHm.js +0 -1
- package/web-shell/assets/classDiagram-v2-JRS7N3AN-Dp-7ruHm.js +0 -1
- package/web-shell/assets/index-CpxLhWqx.js +0 -2337
- package/web-shell/assets/index-mr0Sw0G-.css +0 -36
- package/web-shell/assets/stateDiagram-v2-4QOOHH4V-B3HSbbo2.js +0 -1
- package/web-shell/assets/swimlanesDiagram-VK2B7HYN-FnO0SUMi.js +0 -8
|
@@ -32,7 +32,7 @@ Add a channel to `~/.qwen/settings.json`:
|
|
|
32
32
|
"dws-work": {
|
|
33
33
|
"type": "dws",
|
|
34
34
|
"profile": "profile-name-or-corp-id",
|
|
35
|
-
"
|
|
35
|
+
"privatePolicy": "pairing",
|
|
36
36
|
"groupPolicy": "pairing",
|
|
37
37
|
"watchTodos": true,
|
|
38
38
|
"startReaction": "🤔",
|
|
@@ -55,7 +55,7 @@ without interactive confirmations:
|
|
|
55
55
|
"channels": {
|
|
56
56
|
"dws-answers": {
|
|
57
57
|
"type": "dws",
|
|
58
|
-
"
|
|
58
|
+
"privatePolicy": "pairing",
|
|
59
59
|
"groupPolicy": "pairing",
|
|
60
60
|
"approvalMode": "yolo",
|
|
61
61
|
"cwd": "/path/to/answer-bot"
|
|
@@ -67,15 +67,15 @@ without interactive confirmations:
|
|
|
67
67
|
YOLO mode auto-approves every tool call. Use it only for a trusted bot account
|
|
68
68
|
and workspace.
|
|
69
69
|
|
|
70
|
-
|
|
70
|
+
New managed DWS channels default to `privatePolicy: "pairing"` and `groupPolicy: "pairing"`. Approve a user or group with the code returned by the channel:
|
|
71
71
|
|
|
72
72
|
```bash
|
|
73
73
|
qwen channel pairing approve dws-work CODE
|
|
74
74
|
```
|
|
75
75
|
|
|
76
|
-
`
|
|
76
|
+
`privatePolicy` controls direct messages, document-notification authors, and native-todo creators. Document threads and native todos are personal requests; `groups.senders` never applies to them. `groupPolicy` controls group admission, and `groups["*"].senders` or a per-group override controls which members may start tasks. Group members default to `open`, independently of private access. Shared-session management requires explicit `operators`; see [Shared-Session Operators](./overview.md#shared-session-operators).
|
|
77
77
|
|
|
78
|
-
|
|
78
|
+
For a group-only channel, set `privatePolicy: "disabled"` and enable `groupPolicy`. For a personal-only channel, set `groupPolicy: "disabled"` and enable `privatePolicy`. Disabled private access prevents direct messages, document notifications, and native todos from starting tasks; `watchTodos` separately enables todo polling. Deprecated `senderPolicy` and `dmPolicy` remain private-policy fallbacks only; see [Private Policy](./overview.md#private-policy).
|
|
79
79
|
|
|
80
80
|
Disabled chat sources are not subscribed to or polled, and their messages cannot start new tasks through late callbacks or persisted replay. Pending work and history cursors are retained: after re-enabling a source, the existing recovery mechanism may process older messages, including messages from the disabled interval. Sender authorization, group pairing, and mention requirements still apply.
|
|
81
81
|
|
|
@@ -105,7 +105,7 @@ There is no document or knowledge-base watch list. To start a document task:
|
|
|
105
105
|
|
|
106
106
|
The channel extracts the document ID, comment key, and request from that notification. It reads the referenced document for context, adds the configured start reaction while the task runs, and replies to the original document comment. The real-time DWS event stream is used when it contains the card; a five-second incremental history check covers cards omitted by the current event stream.
|
|
107
107
|
|
|
108
|
-
Comments that do not generate a notification are ignored by design. Duplicate notification messages for the same document comment execute only once. Document tasks follow `
|
|
108
|
+
Comments that do not generate a notification are ignored by design. Duplicate notification messages for the same document comment execute only once. Document tasks follow `privatePolicy` and support `approvalMode` `default`, `plan`, or `yolo`; `default` is used when omitted.
|
|
109
109
|
|
|
110
110
|
## Native Todo Changes
|
|
111
111
|
|
|
@@ -113,7 +113,7 @@ Set `watchTodos: true` to poll the selected DWS profile's pending native todos w
|
|
|
113
113
|
|
|
114
114
|
The first successful scan establishes a baseline and does not start historical todos. Later scans run a task when a todo is newly assigned, reopened, or its actionable fields change, including its title, priority, deadline, or assignees. The final response is added as a comment on the originating todo. Comment-only metadata and modification timestamps are excluded from change detection so the channel's own response cannot trigger a loop. Completion or removal drops the todo from the pending set; reopening it creates a new trigger.
|
|
115
115
|
|
|
116
|
-
Native todos follow `
|
|
116
|
+
Native todos follow `privatePolicy` using the todo creator identity. Under `pairing`, the channel adds one pairing-code comment and keeps the todo pending; after the creator is approved locally, a later poll can process the unchanged todo. Polling runs every 30 seconds and remains scoped to the pinned profile's current organization.
|
|
117
117
|
|
|
118
118
|
## Starting and Verifying
|
|
119
119
|
|
|
@@ -64,7 +64,7 @@ Add the channel to `~/.qwen/settings.json`:
|
|
|
64
64
|
"type": "feishu",
|
|
65
65
|
"clientId": "<your-app-id>",
|
|
66
66
|
"clientSecret": "<your-app-secret>",
|
|
67
|
-
"
|
|
67
|
+
"privatePolicy": "open",
|
|
68
68
|
"sessionScope": "user",
|
|
69
69
|
"cwd": "/path/to/your/project",
|
|
70
70
|
"groupPolicy": "open",
|
|
@@ -42,13 +42,16 @@ Add the channel to `~/.qwen/settings.json`:
|
|
|
42
42
|
"useLocalGh": true,
|
|
43
43
|
"pollInterval": 60000,
|
|
44
44
|
"reasonFilter": ["mention", "review_requested", "assign"],
|
|
45
|
-
"
|
|
46
|
-
"allowedUsers": ["operator-github-username"],
|
|
45
|
+
"operators": ["operator-github-username"],
|
|
47
46
|
"sessionScope": "chat_thread",
|
|
48
47
|
"cwd": "/path/to/your/project",
|
|
49
48
|
"groupPolicy": "open",
|
|
50
49
|
"groups": {
|
|
51
|
-
"*": {
|
|
50
|
+
"*": {
|
|
51
|
+
"requireMention": true,
|
|
52
|
+
"senders": "allowlist",
|
|
53
|
+
"allowedUsers": ["operator-github-username"]
|
|
54
|
+
}
|
|
52
55
|
}
|
|
53
56
|
}
|
|
54
57
|
}
|
|
@@ -61,7 +64,7 @@ To override local `gh` authentication with a PAT, add `"token": "$GITHUB_TOKEN"`
|
|
|
61
64
|
export GITHUB_TOKEN="ghp_your_token_here"
|
|
62
65
|
```
|
|
63
66
|
|
|
64
|
-
The authenticated account cannot trigger its own channel. If that account needs to operate the channel, authenticate a separate bot account and put
|
|
67
|
+
The authenticated account cannot trigger its own channel. If that account needs to operate the channel, authenticate a separate bot account and put their usernames in the group `allowedUsers` and explicit `operators` lists. Startup warns when a group allowlist contains the authenticated account, which cannot trigger tasks; use a different account in the group allowlist.
|
|
65
68
|
|
|
66
69
|
### GitHub Enterprise
|
|
67
70
|
|
|
@@ -84,7 +87,6 @@ Local `gh` authentication requires an HTTPS `baseUrl` so the daemon host credent
|
|
|
84
87
|
| `pollInterval` | `60000` | Poll interval in ms |
|
|
85
88
|
| `baseUrl` | `https://api.github.com` | API base URL (for GHE) |
|
|
86
89
|
| `groupPolicy` | `"disabled"` | Must be `"open"`, `"allowlist"` with the repo (`owner/repo`) listed in `groups`, or `"pairing"` with the repo approved for notifications to flow |
|
|
87
|
-
| `senderPolicy` | `"allowlist"` | Who can trigger the bot |
|
|
88
90
|
| `groups.*.requireMention` | `true` | Require @mentions for ordinary comments; directed notification reasons still run |
|
|
89
91
|
| `reasonFilter` | unset | Optional allowlist of GitHub notification reasons to process |
|
|
90
92
|
|
|
@@ -96,13 +98,15 @@ Filtered notifications are marked read only after all accepted work in the poll
|
|
|
96
98
|
|
|
97
99
|
## ⚠️ Security
|
|
98
100
|
|
|
99
|
-
On a **public repository**, setting `
|
|
101
|
+
On a **public repository**, setting `groups: { "*": { "senders": "open" } }` allows **any GitHub user** who triggers a supported notification reason to submit prompts that drive the agent in your `cwd`. This includes reading code, spending tokens, posting comments, and (subject to permission policy) running tools.
|
|
100
102
|
|
|
101
|
-
Always use `
|
|
103
|
+
Always use `groups["*"].senders: "allowlist"` with explicit group `allowedUsers` on public repos.
|
|
102
104
|
|
|
103
|
-
|
|
105
|
+
All GitHub traffic is group traffic. Group members default to `open`; set `groups["*"].senders` to `allowlist` and populate its `allowedUsers` to restrict authors. Private policy and user pairing never restrict repository members. Set `operators` explicitly for shared-session management.
|
|
104
106
|
|
|
105
|
-
|
|
107
|
+
Group member allowlists and operator lists follow the **username**, not the immutable account ID. If a listed user renames their GitHub account, remove the stale entry — GitHub releases the old username for anyone else to claim, and the new holder would inherit that authorization.
|
|
108
|
+
|
|
109
|
+
Note that under `groupPolicy: "pairing"`, access is granted per repository: once a repository is approved, **any GitHub user** can by default drive the bot through that repository's issues and pull requests. All GitHub traffic is group traffic, so `privatePolicy` and the top-level `allowedUsers` do not gate members of an approved repository; set `senders: "allowlist"` with `allowedUsers` on that repository's `groups` entry to narrow it. Approvals are keyed by the repository full name (`owner/repo`), which changes on rename or transfer — revoke stale group approvals after any repository rename, transfer, or deletion.
|
|
106
110
|
|
|
107
111
|
## Mention Detection
|
|
108
112
|
|
|
@@ -26,7 +26,13 @@ Add the channel to `~/.qwen/settings.json`:
|
|
|
26
26
|
"type": "gitlab",
|
|
27
27
|
"token": "$GITLAB_TOKEN",
|
|
28
28
|
"pollInterval": 60000,
|
|
29
|
-
"
|
|
29
|
+
"operators": ["operator-gitlab-username"],
|
|
30
|
+
"groups": {
|
|
31
|
+
"*": {
|
|
32
|
+
"senders": "allowlist",
|
|
33
|
+
"allowedUsers": ["operator-gitlab-username"]
|
|
34
|
+
}
|
|
35
|
+
},
|
|
30
36
|
"sessionScope": "chat_thread",
|
|
31
37
|
"cwd": "/path/to/your/project",
|
|
32
38
|
"groupPolicy": "open",
|
|
@@ -63,7 +69,6 @@ For self-hosted instances, set `baseUrl`:
|
|
|
63
69
|
| `baseUrl` | `https://gitlab.com` | GitLab instance URL |
|
|
64
70
|
| `action_prompt_template` | (required for processing) | Maps GitLab action names to metadata templates |
|
|
65
71
|
| `groupPolicy` | `"disabled"` | Must be `"open"`, `"allowlist"` with the project listed, or `"pairing"` with the project approved |
|
|
66
|
-
| `senderPolicy` | `"allowlist"` | Who can trigger the bot |
|
|
67
72
|
|
|
68
73
|
## action_prompt_template
|
|
69
74
|
|
|
@@ -128,11 +133,13 @@ You do **not** need a `%body%` variable — the comment/description text is alwa
|
|
|
128
133
|
|
|
129
134
|
## ⚠️ Security
|
|
130
135
|
|
|
131
|
-
On a **public project**, setting `
|
|
136
|
+
On a **public project**, setting `groups: { "*": { "senders": "open" } }` allows **any GitLab user** who @mentions the bot to submit prompts that drive the agent in your `cwd`.
|
|
132
137
|
|
|
133
|
-
Always use `
|
|
138
|
+
Always use `groups["*"].senders: "allowlist"` with explicit group `allowedUsers` on public projects.
|
|
134
139
|
|
|
135
|
-
|
|
140
|
+
All GitLab traffic is group traffic. Group members default to `open`; set `groups["*"].senders` to `allowlist` and populate its `allowedUsers` to restrict authors. Private policy and user pairing never restrict repository members. Set `operators` explicitly for shared-session management.
|
|
141
|
+
|
|
142
|
+
Note that under `groupPolicy: "pairing"`, access is granted per project: once a project is approved, **any GitLab user** can by default drive the bot through that project's issues and merge requests. All GitLab traffic is group traffic, so `privatePolicy` and the top-level `allowedUsers` do not gate members of an approved project; set `senders: "allowlist"` with `allowedUsers` on that project's `groups` entry to narrow it. Approvals are keyed by the project path (`owner/repo`), which changes on rename or transfer — revoke stale group approvals after any project rename, transfer, or deletion.
|
|
136
143
|
|
|
137
144
|
## Mention Detection
|
|
138
145
|
|
|
@@ -33,13 +33,12 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
33
33
|
"my-channel": {
|
|
34
34
|
"type": "telegram",
|
|
35
35
|
"token": "$MY_BOT_TOKEN",
|
|
36
|
-
"
|
|
36
|
+
"privatePolicy": "allowlist",
|
|
37
37
|
"allowedUsers": ["123456789"],
|
|
38
38
|
"sessionScope": "user",
|
|
39
39
|
"cwd": "/path/to/working/directory",
|
|
40
40
|
"instructions": "Optional system instructions for the agent.",
|
|
41
41
|
"groupPolicy": "disabled",
|
|
42
|
-
"dmPolicy": "open",
|
|
43
42
|
"groups": {
|
|
44
43
|
"*": { "requireMention": true }
|
|
45
44
|
}
|
|
@@ -50,36 +49,86 @@ Channels are configured under the `channels` key in `settings.json`. Each channe
|
|
|
50
49
|
|
|
51
50
|
### Options
|
|
52
51
|
|
|
53
|
-
| Option | Required | Description
|
|
54
|
-
| ------------------- | ---------------- |
|
|
55
|
-
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `dws`, `wecom`, `feishu`, `github`, `gitlab`, or a custom type from an extension (see [Plugins](./plugins))
|
|
56
|
-
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat, DingTalk, WeCom, or Feishu
|
|
57
|
-
| `clientId` | DingTalk, Feishu | DingTalk AppKey or Feishu App ID. Supports `$ENV_VAR` syntax
|
|
58
|
-
| `clientSecret` | DingTalk, Feishu | DingTalk AppSecret or Feishu App Secret. Supports `$ENV_VAR` syntax
|
|
59
|
-
| `botId` | WeCom | WeCom intelligent robot Bot ID. Supports `$ENV_VAR` syntax. See [WeCom](./wecom)
|
|
60
|
-
| `secret` | WeCom | WeCom intelligent robot Secret. Supports `$ENV_VAR` syntax. See [WeCom](./wecom)
|
|
61
|
-
| `model` | No | Model to use for this channel (e.g., `qwen3.5-plus`). Overrides the default model. Useful for multimodal models that support image input
|
|
62
|
-
| `
|
|
63
|
-
| `allowedUsers` | No |
|
|
64
|
-
| `sessionScope` | No | How sessions are scoped: `user` (default), `chat_thread`, or `single`. Legacy `thread` remains compatible when already configured but is not offered for new Web Shell configurations
|
|
65
|
-
| `multiSession` | No | Retain up to eight owner-scoped named tasks in one chat. Requires daemon-managed mode, `sessionScope: "user"`, no webhooks or group-history backfill, and no enabled Channel loops
|
|
66
|
-
| `cwd` | No | Working directory for the agent. Defaults to the current directory
|
|
67
|
-
| `approvalMode` | No | Tool approval mode for channel sessions. Unattended webhook tasks require `yolo`; the setting applies to every session on the channel
|
|
68
|
-
| `instructions` | No | Custom instructions prepended to the first message of each session
|
|
69
|
-
| `webhooks` | No | Webhook sources and delivery targets for daemon-managed channels. See [Webhook-triggered tasks](#webhook-triggered-tasks)
|
|
70
|
-
| `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, `pairing`, or `open`. See [Group Chats](#group-chats)
|
|
71
|
-
| `
|
|
72
|
-
| `
|
|
73
|
-
| `
|
|
74
|
-
| `
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
52
|
+
| Option | Required | Description |
|
|
53
|
+
| ------------------- | ---------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
54
|
+
| `type` | Yes | Channel type: `telegram`, `weixin`, `qq`, `dingtalk`, `dws`, `wecom`, `feishu`, `github`, `gitlab`, or a custom type from an extension (see [Plugins](./plugins)) |
|
|
55
|
+
| `token` | Telegram | Bot token. Supports `$ENV_VAR` syntax to read from environment variables. Not needed for WeChat, DingTalk, WeCom, or Feishu |
|
|
56
|
+
| `clientId` | DingTalk, Feishu | DingTalk AppKey or Feishu App ID. Supports `$ENV_VAR` syntax |
|
|
57
|
+
| `clientSecret` | DingTalk, Feishu | DingTalk AppSecret or Feishu App Secret. Supports `$ENV_VAR` syntax |
|
|
58
|
+
| `botId` | WeCom | WeCom intelligent robot Bot ID. Supports `$ENV_VAR` syntax. See [WeCom](./wecom) |
|
|
59
|
+
| `secret` | WeCom | WeCom intelligent robot Secret. Supports `$ENV_VAR` syntax. See [WeCom](./wecom) |
|
|
60
|
+
| `model` | No | Model to use for this channel (e.g., `qwen3.5-plus`). Overrides the default model. Useful for multimodal models that support image input |
|
|
61
|
+
| `privatePolicy` | No | Private access: `disabled`, `allowlist`, `pairing`, or `open`; new managed channels default to `pairing` |
|
|
62
|
+
| `allowedUsers` | No | Private user IDs allowed without pairing (used by private `allowlist` and `pairing` policies) |
|
|
63
|
+
| `sessionScope` | No | How sessions are scoped: `user` (default), `chat_thread`, or `single`. Legacy `thread` remains compatible when already configured but is not offered for new Web Shell configurations |
|
|
64
|
+
| `multiSession` | No | Retain up to eight owner-scoped named tasks in one chat. Requires daemon-managed mode, `sessionScope: "user"`, no webhooks or group-history backfill, and no enabled Channel loops |
|
|
65
|
+
| `cwd` | No | Working directory for the agent. Defaults to the current directory |
|
|
66
|
+
| `approvalMode` | No | Tool approval mode for channel sessions. Unattended webhook tasks require `yolo`; the setting applies to every session on the channel |
|
|
67
|
+
| `instructions` | No | Custom instructions prepended to the first message of each session |
|
|
68
|
+
| `webhooks` | No | Webhook sources and delivery targets for daemon-managed channels. See [Webhook-triggered tasks](#webhook-triggered-tasks) |
|
|
69
|
+
| `groupPolicy` | No | Group chat access: `disabled` (default), `allowlist`, `pairing`, or `open`. See [Group Chats](#group-chats) |
|
|
70
|
+
| `senderPolicy` | No | Deprecated: `allowlist`, `pairing`, or `open`; used only when `privatePolicy` is absent and DM access is enabled |
|
|
71
|
+
| `dmPolicy` | No | Deprecated: `open` or `disabled`; used only when `privatePolicy` is absent |
|
|
72
|
+
| `operators` | No | Who may operate a shared session (`/approve`, `/clear`, `/loop`, ...). Unset or empty grants no shared-session operator permissions. See [Shared-Session Operators](#shared-session-operators) |
|
|
73
|
+
| `groupHistoryLimit` | No | Opt-in group history backfill. `0` or omitted disables it. A positive number persists that many unmentioned group messages from senders admitted by the group member policy for the next bot mention/reply. |
|
|
74
|
+
| `groups` | No | Per-group settings. Keys are group chat IDs or `"*"` for defaults. See [Group Chats](#group-chats) |
|
|
75
|
+
| `dispatchMode` | No | What happens when you send a message while the bot is busy: `steer` (default), `collect`, or `followup`. See [Dispatch Modes](#dispatch-modes) |
|
|
76
|
+
|
|
77
|
+
### Message Routes
|
|
78
|
+
|
|
79
|
+
Use `messageRoutes` to run multiple workflows through one Channel connection.
|
|
80
|
+
Each key is a case-sensitive message prefix and each value contains instructions
|
|
81
|
+
for that route:
|
|
82
|
+
|
|
83
|
+
```json
|
|
84
|
+
{
|
|
85
|
+
"messageRoutes": {
|
|
86
|
+
"/review": "Review the requested pull request.",
|
|
87
|
+
"/QA": "Answer questions about this repository."
|
|
88
|
+
},
|
|
89
|
+
"defaultMessageRoute": "/QA"
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
A prefix must be followed by whitespace and a non-empty message. The longest
|
|
94
|
+
matching prefix wins; leading mentions are skipped when matching. The matched prefix is removed before the
|
|
95
|
+
message reaches the agent. Route instructions are combined with the Channel's
|
|
96
|
+
common `instructions` on the first turn of each session. Routes use separate
|
|
97
|
+
sessions within the configured `sessionScope`. Existing Channel memory remains
|
|
98
|
+
shared at its configured chat/thread scope; routes are not a permissions sandbox.
|
|
99
|
+
|
|
100
|
+
Without `defaultMessageRoute`, unmatched chat messages are ignored. To accept
|
|
101
|
+
ordinary messages, set it to a key in `messageRoutes`; those messages keep their
|
|
102
|
+
original text and use that route's instructions and session. Empty prefixes and
|
|
103
|
+
empty route maps are invalid. Route instructions may be empty. Prefixes and
|
|
104
|
+
instructions are trimmed when loading configuration. `messageRoutes` cannot be
|
|
105
|
+
combined with `multiSession`.
|
|
106
|
+
|
|
107
|
+
Routing does not grant access: private and group policies still apply. Shared
|
|
108
|
+
and agent commands also need a route prefix, for example `/QA /help`. Messages
|
|
109
|
+
without user-authored text and provider-generated system events remain outside
|
|
110
|
+
prefix routing.
|
|
111
|
+
|
|
112
|
+
### Private Policy
|
|
113
|
+
|
|
114
|
+
`privatePolicy` controls private conversations independently of groups:
|
|
115
|
+
|
|
116
|
+
- **`disabled`** — Ignore private messages without creating pairing requests.
|
|
117
|
+
- **`allowlist`** — Only users listed in the top-level `allowedUsers` may send private messages.
|
|
118
|
+
- **`pairing`** — Users in `allowedUsers` are admitted directly. Other users need a locally approved user pairing. See [DM Pairing](#dm-pairing).
|
|
119
|
+
- **`open`** — Anyone can send private messages.
|
|
120
|
+
|
|
121
|
+
New managed channels default to `pairing`. The deprecated `senderPolicy` and `dmPolicy` keys remain supported: an explicit `privatePolicy` takes precedence; otherwise `dmPolicy: "disabled"` disables private access, and otherwise `senderPolicy` supplies the policy (default `allowlist`). These old keys do not restrict group members. Saving from the editor uses `privatePolicy` and preserves existing deprecated keys.
|
|
122
|
+
|
|
123
|
+
### Shared-Session Operators
|
|
124
|
+
|
|
125
|
+
In a shared session (`sessionScope: "chat_thread"` or `"single"`, and group chats under `"thread"`), some commands affect everyone in the conversation: `/approve`, `/deny`, `/cancel`, `/clear`, `/who`, `/status`, `/loop`, `/btw`, the loop tool, and steering an in-flight turn. Only the session's operators may use them; other members' messages queue instead of steering. Sessions that are not shared belong to their own sender, who may always use them.
|
|
126
|
+
|
|
127
|
+
Set `operators` to the user IDs allowed to manage shared sessions. Omitted or empty `operators` grants nobody this role. Private allowlists, user pairing, group pairing, and group member lists never imply operator permissions. Operators must still pass normal conversation admission.
|
|
128
|
+
|
|
129
|
+
For example, `groups: { "*": { "senders": "open" } }` with `operators: ["alice"]` lets every admitted group member start a turn, but only Alice can manage its shared session.
|
|
130
|
+
|
|
131
|
+
A saved loop is checked against the same rule when it fires, using its creator as the sender, and is disabled if the creator is no longer an operator.
|
|
83
132
|
|
|
84
133
|
### Session Scope
|
|
85
134
|
|
|
@@ -156,11 +205,12 @@ The legacy slash aliases `/remember-channel`, `/channel-memory`, and
|
|
|
156
205
|
commands.
|
|
157
206
|
|
|
158
207
|
Channel memory follows the channel access gates. Any message accepted by
|
|
159
|
-
|
|
160
|
-
requirements can read, write, update, or clear memory for
|
|
161
|
-
Accepted members of the same group share that group's
|
|
162
|
-
`allowlist`
|
|
163
|
-
senders
|
|
208
|
+
private access, group admission, group member settings,
|
|
209
|
+
pairing, and mention requirements can read, write, update, or clear memory for
|
|
210
|
+
that chat or thread. Accepted members of the same group share that group's
|
|
211
|
+
target store. Use a group's `senders: "allowlist"` with its `allowedUsers` when group memory should be
|
|
212
|
+
limited to trusted senders — under `senders: "open"` every member of an
|
|
213
|
+
admitted group shares that group's memory store.
|
|
164
214
|
|
|
165
215
|
Existing legacy `CHANNEL.md` memory is migrated automatically to structured
|
|
166
216
|
`CHANNEL.json` storage on the first mutation. Structured memory persists across
|
|
@@ -194,7 +244,7 @@ Set the actual token in your shell environment or in a `.env` file that gets loa
|
|
|
194
244
|
|
|
195
245
|
## DM Pairing
|
|
196
246
|
|
|
197
|
-
When `
|
|
247
|
+
When `privatePolicy` is set to `"pairing"`, unknown senders go through an approval flow:
|
|
198
248
|
|
|
199
249
|
1. An unknown user sends a message to the bot
|
|
200
250
|
2. The bot replies with an 8-character pairing code (e.g., `VEQDDWXJ`)
|
|
@@ -237,7 +287,7 @@ Controls whether the bot participates in group chats at all:
|
|
|
237
287
|
|
|
238
288
|
- **`disabled`** (default) — The bot ignores all group messages. Safest option.
|
|
239
289
|
- **`allowlist`** — The bot only responds in groups explicitly listed in `groups` by chat ID. The `"*"` key provides default settings but does **not** act as a wildcard allow.
|
|
240
|
-
- **`pairing`** — A deliberate mention or reply from an unknown group creates one pairing request for the group. Once approved,
|
|
290
|
+
- **`pairing`** — A deliberate mention or reply from an unknown group creates one pairing request for the group. Once approved, members can use the bot subject to the group's `senders` setting (default `open`); `privatePolicy` continues to control direct messages.
|
|
241
291
|
- **`open`** — The bot responds in all groups it's added to. Use with caution.
|
|
242
292
|
|
|
243
293
|
Approve a group with the same CLI command used for user pairing. The pending
|
|
@@ -276,6 +326,32 @@ Configure per-group with the `groups` setting:
|
|
|
276
326
|
- **Group chat ID** — Override settings for a specific group. Overrides `"*"` defaults.
|
|
277
327
|
- **`requireMention`** (default: `true`) — When `true`, the bot only responds to messages that @mention it or reply to one of its messages. When `false`, the bot responds to all messages (useful for dedicated task groups).
|
|
278
328
|
|
|
329
|
+
### Group Senders
|
|
330
|
+
|
|
331
|
+
Admitted groups allow all members by default. Set `senders` in `groups` to restrict members independently of private access:
|
|
332
|
+
|
|
333
|
+
```json
|
|
334
|
+
{
|
|
335
|
+
"privatePolicy": "pairing",
|
|
336
|
+
"groupPolicy": "open",
|
|
337
|
+
"groups": {
|
|
338
|
+
"*": { "senders": "open" },
|
|
339
|
+
"-100123456": { "senders": "allowlist", "allowedUsers": ["alice", "bob"] }
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
- **`open`** (default) — Any member of an admitted group may use the bot. Private policy and user pairing have no effect on group members.
|
|
345
|
+
- **`allowlist`** — only the group's `allowedUsers` may speak. This list is separate from the channel-level `allowedUsers`.
|
|
346
|
+
|
|
347
|
+
All group settings use field-by-field inheritance: the specific group, then `"*"`, then the channel default where applicable, then the built-in default. Empty objects inherit defaults; arrays replace rather than merge, including `allowedUsers: []`. For example, a group that sets only `senders: "allowlist"` uses the `allowedUsers` from `"*"`. Under `groupPolicy: "allowlist"` a group ID key also admits the group, so a per-group entry there both admits the group and sets its senders.
|
|
348
|
+
|
|
349
|
+
`pairing` is deliberately not a `senders` value: pairing approvals are stored per user, so approving someone through a group message would also unlock their direct messages. Use `groupPolicy: "pairing"` to admit an entire group instead.
|
|
350
|
+
|
|
351
|
+
On the `github` and `gitlab` channels all inbound traffic is group traffic, so only `groupPolicy` and group member settings govern admission — see those channels' Security notes before using it on a public repository or project. Under `sessionScope: "single"` direct messages and groups share one conversation, so opening a group also exposes direct-message history to its members.
|
|
352
|
+
|
|
353
|
+
In the Web Shell channel editor, **Who can talk in groups** and **Allowed group member IDs** edit `groups["*"]`, and **Session operators** edits `operators`. When `senders` is unset, the editor shows its effective default and writes nothing until you pick a value. Per-group overrides and an explicitly empty `"operators": []` are set in `settings.json`; saving from the editor keeps them.
|
|
354
|
+
|
|
279
355
|
### Group History Backfill
|
|
280
356
|
|
|
281
357
|
By default, Qwen ignores unmentioned group messages and does not store them as session turns. To let the next `@mention` include recent group context, set `groupHistoryLimit` to a positive number.
|
|
@@ -303,7 +379,7 @@ By default, Qwen ignores unmentioned group messages and does not store them as s
|
|
|
303
379
|
|
|
304
380
|
- Omitted or `0` disables backfill.
|
|
305
381
|
- Group-level `groupHistoryLimit` overrides the channel-level value.
|
|
306
|
-
- Only messages from
|
|
382
|
+
- Only messages from senders the group's `senders` setting admits are persisted (all admitted group members by default) — so `senders: "open"` also widens whose messages `groupHistoryLimit` records.
|
|
307
383
|
- Messages rejected by `groupPolicy` or group allowlist are not persisted.
|
|
308
384
|
- Pending group history is stored as local JSONL under `~/.qwen/channels/<channel-name>-group-history.jsonl` or `$QWEN_HOME/channels/<channel-name>-group-history.jsonl`.
|
|
309
385
|
- Cached messages are injected as untrusted context on the next real trigger and are not written as standalone session turns.
|
|
@@ -312,10 +388,9 @@ By default, Qwen ignores unmentioned group messages and does not store them as s
|
|
|
312
388
|
|
|
313
389
|
```
|
|
314
390
|
1. groupPolicy — is this group disabled, listed, paired, or open? (no → ignore/pairing flow)
|
|
315
|
-
2.
|
|
316
|
-
3.
|
|
317
|
-
4.
|
|
318
|
-
5. Route to session
|
|
391
|
+
2. requireMention — was the bot mentioned/replied to? (no → no task; eligible history may be cached)
|
|
392
|
+
3. senders — is this member allowed? (open, or group member allowlist)
|
|
393
|
+
4. Route to session
|
|
319
394
|
```
|
|
320
395
|
|
|
321
396
|
### Telegram Setup for Groups
|
|
@@ -531,7 +606,7 @@ qwen channel status --daemon-url http://127.0.0.1:4170 --token secret
|
|
|
531
606
|
qwen channel stop --daemon-url http://127.0.0.1:4170 --token secret
|
|
532
607
|
```
|
|
533
608
|
|
|
534
|
-
This mode starts workspace-grouped channel worker processes owned by `qwen serve`. Workers connect back to the daemon through the SDK and use the same channel adapters. They are separate from the daemon process, so a channel adapter crash does not crash the daemon. An explicit `--channel` selection takes precedence and fails daemon startup if it cannot become ready. On a flagless boot, every trusted registered workspace's own `serve.channels` setting is restored, and a name that cannot be hosted is skipped with a log instead of stopping the others. `all` remains primary-workspace only. Without
|
|
609
|
+
This mode starts workspace-grouped channel worker processes owned by `qwen serve`. Workers connect back to the daemon through the SDK and use the same channel adapters. They are separate from the daemon process, so a channel adapter crash does not crash the daemon. An explicit `--channel` selection takes precedence and fails daemon startup if it cannot become ready. On a flagless boot, every trusted registered workspace's own `serve.channels` setting is restored, and a name that cannot be hosted is skipped with a log instead of stopping the others. `all` remains primary-workspace only. Registering a workspace later restores its channels too — without holding the registration open — once per daemon run, and not at all when the daemon was started with an explicit `--channel` or after `qwen channel stop`. Unlike the boot restore, one name it cannot host costs that workspace its whole list. Without any of these sources, the daemon does not load channel adapters or reserve the lease until the first `qwen channel set`, or until a workspace that configures its own `serve.channels` registers.
|
|
535
610
|
|
|
536
611
|
Automatic restore skips invalid startup settings and validation or lease failures that occur before workers start, while preserving unrelated settings. After a worker startup fails, the daemon continues only once cleanup succeeds. A global runtime startup timeout or an unconfirmed worker stop still follows the normal startup-failure path; the service lease remains held while worker termination is unconfirmed. Check the daemon log for messages identifying `serve.channels` when a channel does not restore.
|
|
537
612
|
|
|
@@ -556,7 +631,7 @@ Example channel config:
|
|
|
556
631
|
"clientId": "$DINGTALK_CLIENT_ID",
|
|
557
632
|
"clientSecret": "$DINGTALK_CLIENT_SECRET",
|
|
558
633
|
"cwd": "/repo",
|
|
559
|
-
"
|
|
634
|
+
"privatePolicy": "allowlist",
|
|
560
635
|
"allowedUsers": ["12345"],
|
|
561
636
|
"approvalMode": "yolo",
|
|
562
637
|
"sessionScope": "user",
|
|
@@ -35,7 +35,7 @@ Add a channel entry to `~/.qwen/settings.json` using the custom type provided by
|
|
|
35
35
|
"my-bot": {
|
|
36
36
|
"type": "my-platform",
|
|
37
37
|
"apiKey": "$MY_PLATFORM_API_KEY",
|
|
38
|
-
"
|
|
38
|
+
"privatePolicy": "open",
|
|
39
39
|
"cwd": "/path/to/project"
|
|
40
40
|
}
|
|
41
41
|
}
|
|
@@ -46,17 +46,17 @@ The `type` must match a channel type registered by an installed extension. Check
|
|
|
46
46
|
|
|
47
47
|
All standard channel options work with custom channels:
|
|
48
48
|
|
|
49
|
-
| Option
|
|
50
|
-
|
|
|
51
|
-
| `
|
|
52
|
-
| `allowedUsers`
|
|
53
|
-
| `sessionScope`
|
|
54
|
-
| `cwd`
|
|
55
|
-
| `instructions`
|
|
56
|
-
| `model`
|
|
57
|
-
| `groupPolicy`
|
|
58
|
-
| `dmPolicy`
|
|
59
|
-
| `groups`
|
|
49
|
+
| Option | Description |
|
|
50
|
+
| --------------- | -------------------------------------------------------------------------------------------------- |
|
|
51
|
+
| `privatePolicy` | `disabled`, `allowlist`, `pairing`, or `open` |
|
|
52
|
+
| `allowedUsers` | Private-message allowlist of user IDs |
|
|
53
|
+
| `sessionScope` | `user`, `chat_thread`, or `single`; legacy `thread` remains compatible for existing configurations |
|
|
54
|
+
| `cwd` | Working directory for the agent |
|
|
55
|
+
| `instructions` | Prepended to the first message of each session |
|
|
56
|
+
| `model` | Model override for the channel |
|
|
57
|
+
| `groupPolicy` | `disabled`, `allowlist`, `pairing`, or `open` |
|
|
58
|
+
| `dmPolicy` | Deprecated private fallback: `open` or `disabled` |
|
|
59
|
+
| `groups` | Per-group settings |
|
|
60
60
|
|
|
61
61
|
See [Overview](./overview) for details on each option.
|
|
62
62
|
|
|
@@ -59,7 +59,7 @@ export QQ_APP_SECRET=<your-app-secret>
|
|
|
59
59
|
"appID": "YOUR_APP_ID",
|
|
60
60
|
"appSecret": "$QQ_APP_SECRET",
|
|
61
61
|
"sandbox": false,
|
|
62
|
-
"
|
|
62
|
+
"privatePolicy": "open",
|
|
63
63
|
"sessionScope": "user",
|
|
64
64
|
"cwd": "/path/to/your/project",
|
|
65
65
|
"instructions": "你是一个通过 QQ Bot 对话的 AI 助手。回复控制在 2000 字符以内。",
|
|
@@ -81,7 +81,7 @@ export QQ_APP_SECRET=<your-app-secret>
|
|
|
81
81
|
| `sandbox` | `false` | Set to `true` to use the QQ sandbox API environment (`sandbox.api.sgroup.qq.com`) |
|
|
82
82
|
|
|
83
83
|
All standard channel options (see [Channel Overview](./overview#options)) are also supported:
|
|
84
|
-
`
|
|
84
|
+
`privatePolicy`, `allowedUsers`, `sessionScope`, `cwd`, `instructions`, `groupPolicy`, `groups`, `dispatchMode`.
|
|
85
85
|
|
|
86
86
|
## Running
|
|
87
87
|
|
|
@@ -102,7 +102,7 @@ To use the bot in QQ groups:
|
|
|
102
102
|
1. Set `groupPolicy` to `"allowlist"`, `"pairing"`, or `"open"` in your channel config
|
|
103
103
|
2. Add the bot to a QQ group via the QQ Bot Open Platform dashboard or by having a group admin invite it
|
|
104
104
|
3. Group members must **@mention** the bot to trigger a response
|
|
105
|
-
4. If using `groupPolicy: "pairing"`, approve the group's pairing request once before responses start. Note that once a group is approved, **any member of that group** can use the bot; `
|
|
105
|
+
4. If using `groupPolicy: "pairing"`, approve the group's pairing request once before responses start. Note that once a group is approved, **any member of that group** can use the bot by default (restrict with the group's `senders: "allowlist"` and `allowedUsers`); `privatePolicy` and the top-level `allowedUsers` do not gate members of an approved group.
|
|
106
106
|
|
|
107
107
|
QQ Bot API V2 only delivers group messages that @mention the bot — the bot does not see all group messages. By default, `requireMention` is `true` and should be left that way for QQ.
|
|
108
108
|
|
|
@@ -135,7 +135,7 @@ Token refresh continues across WebSocket reconnects — the channel never goes o
|
|
|
135
135
|
- **Use Markdown freely** — Unlike WeChat, QQ renders Markdown natively. Bold, code blocks, lists, and links all work.
|
|
136
136
|
- **Keep responses under 2000 characters** — Longer responses are automatically split into chunks. Adding a length hint to your instructions helps the agent stay concise.
|
|
137
137
|
- **Sandbox for testing** — Set `"sandbox": true` to use the sandbox API during development. No production messages will be affected.
|
|
138
|
-
- **Restrict access** — Use `
|
|
138
|
+
- **Restrict access** — Use `privatePolicy: "allowlist"` for a fixed set of QQ users, or `"pairing"` to approve new users from the CLI. See [DM Pairing](./overview#dm-pairing) for details.
|
|
139
139
|
|
|
140
140
|
## Key Differences from Telegram
|
|
141
141
|
|
|
@@ -154,7 +154,7 @@ Token refresh continues across WebSocket reconnects — the channel never goes o
|
|
|
154
154
|
|
|
155
155
|
- Check the terminal output for errors
|
|
156
156
|
- Verify the channel is running (`qwen channel status`)
|
|
157
|
-
- If using `
|
|
157
|
+
- If using `privatePolicy: "allowlist"`, make sure your QQ user ID is in `allowedUsers`
|
|
158
158
|
- On first start, a QR code will appear in the terminal — scan it with your QQ app
|
|
159
159
|
|
|
160
160
|
### Bot doesn't respond in groups
|
|
@@ -15,7 +15,7 @@ This guide covers setting up a Qwen Code channel on Telegram.
|
|
|
15
15
|
|
|
16
16
|
## Finding Your User ID
|
|
17
17
|
|
|
18
|
-
To use `
|
|
18
|
+
To use `privatePolicy: "allowlist"` or `"pairing"`, you need your Telegram user ID (a numeric ID, not your username).
|
|
19
19
|
|
|
20
20
|
The easiest way to find it:
|
|
21
21
|
|
|
@@ -32,7 +32,7 @@ Add the channel to `~/.qwen/settings.json`:
|
|
|
32
32
|
"my-telegram": {
|
|
33
33
|
"type": "telegram",
|
|
34
34
|
"token": "$TELEGRAM_BOT_TOKEN",
|
|
35
|
-
"
|
|
35
|
+
"privatePolicy": "allowlist",
|
|
36
36
|
"allowedUsers": ["YOUR_USER_ID"],
|
|
37
37
|
"sessionScope": "user",
|
|
38
38
|
"cwd": "/path/to/your/project",
|
|
@@ -74,7 +74,7 @@ To use the bot in Telegram groups:
|
|
|
74
74
|
2. **Disable privacy mode** in BotFather: `/mybots` → select your bot → Bot Settings → Group Privacy → Turn Off
|
|
75
75
|
3. Add the bot to a group. If it was already in the group, **remove and re-add it** (Telegram caches privacy settings from when the bot joined)
|
|
76
76
|
4. If using `groupPolicy: "allowlist"`, add the group's chat ID to `groups` in your config
|
|
77
|
-
5. If using `groupPolicy: "pairing"`, approve the group's pairing request once before responses start. Note that once a group is approved, **any member of that group** can use the bot; `
|
|
77
|
+
5. If using `groupPolicy: "pairing"`, approve the group's pairing request once before responses start. Note that once a group is approved, **any member of that group** can use the bot by default (restrict with the group's `senders: "allowlist"` and `allowedUsers`); `privatePolicy` and the top-level `allowedUsers` do not gate members of an approved group.
|
|
78
78
|
|
|
79
79
|
By default, the bot requires an @mention or a reply to respond in groups. Set `"requireMention": false` for a specific group to make it respond to all messages (useful for dedicated task groups). See [Group Chats](./overview#group-chats) for full details.
|
|
80
80
|
|
|
@@ -90,7 +90,7 @@ You can send photos and documents to the bot, not just text.
|
|
|
90
90
|
|
|
91
91
|
- **Keep instructions concise-focused** — Telegram has a 4096-character message limit. Adding instructions like "keep responses short" helps the agent stay within bounds.
|
|
92
92
|
- **Use `sessionScope: "user"`** — This gives each user their own conversation. Use `/clear` to start fresh.
|
|
93
|
-
- **Restrict access** — Use `
|
|
93
|
+
- **Restrict access** — Use `privatePolicy: "allowlist"` for a fixed set of users, or `"pairing"` to let new users request access with a code you approve via CLI. See [DM Pairing](./overview#dm-pairing) for details.
|
|
94
94
|
|
|
95
95
|
## Message Formatting
|
|
96
96
|
|
|
@@ -101,7 +101,7 @@ The agent's markdown responses are automatically converted to Telegram-compatibl
|
|
|
101
101
|
### Bot doesn't respond
|
|
102
102
|
|
|
103
103
|
- Check that the bot token is correct and the environment variable is set
|
|
104
|
-
- Verify your user ID is in `allowedUsers` if using `
|
|
104
|
+
- Verify your user ID is in `allowedUsers` if using `privatePolicy: "allowlist"`, or that you've been approved if using `"pairing"`
|
|
105
105
|
- Check the terminal output for errors
|
|
106
106
|
|
|
107
107
|
### Bot doesn't respond in groups
|
|
@@ -34,7 +34,7 @@ Add the channel to `~/.qwen/settings.json`:
|
|
|
34
34
|
"type": "wecom",
|
|
35
35
|
"botId": "$WECOM_BOT_ID",
|
|
36
36
|
"secret": "$WECOM_SECRET",
|
|
37
|
-
"
|
|
37
|
+
"privatePolicy": "allowlist",
|
|
38
38
|
"allowedUsers": ["zhangsan"],
|
|
39
39
|
"sessionScope": "user",
|
|
40
40
|
"cwd": "/path/to/your/project",
|
|
@@ -73,13 +73,14 @@ Open WeCom and send a message to the intelligent robot.
|
|
|
73
73
|
|
|
74
74
|
## Access Control
|
|
75
75
|
|
|
76
|
-
`
|
|
76
|
+
`privatePolicy` works the same way as other IM channels:
|
|
77
77
|
|
|
78
|
-
- `
|
|
78
|
+
- `disabled`: ignore all private messages without creating pairing requests.
|
|
79
|
+
- `allowlist`: only users in the top-level `allowedUsers` can send private messages. This is the recommended enterprise default.
|
|
79
80
|
- `pairing`: users must pair before using the bot.
|
|
80
81
|
- `open`: anyone who can message the robot can use it.
|
|
81
82
|
|
|
82
|
-
For groups, set `groupPolicy` to `"allowlist"`, `"pairing"`, or `"open"`. Under `"pairing"`, the group's first mention creates a pairing request that must be approved once before responses start. Note that under `groupPolicy: "pairing"`, access is granted per group: once a group is approved, **any member of that group** can use the bot; `
|
|
83
|
+
For groups, set `groupPolicy` to `"allowlist"`, `"pairing"`, or `"open"`. Under `"pairing"`, the group's first mention creates a pairing request that must be approved once before responses start. Note that under `groupPolicy: "pairing"`, access is granted per group: once a group is approved, **any member of that group** can use the bot by default (restrict with the group's `senders: "allowlist"` and `allowedUsers`); `privatePolicy` and the top-level `allowedUsers` do not gate members of an approved group. 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.
|
|
83
84
|
|
|
84
85
|
### Group Mention Compatibility
|
|
85
86
|
|