@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.
Files changed (353) hide show
  1. package/bundled/browser-use/SKILL.md +11 -10
  2. package/bundled/browser-use/runtime/index.js +70 -31
  3. package/bundled/browser-use/runtime/native-host.js +1 -0
  4. package/bundled/browser-use/runtime/scripts/native-host-setup.js +1 -0
  5. package/bundled/computer-use/SKILL.md +182 -224
  6. package/bundled/qc-helper/docs/configuration/model-providers.md +13 -2
  7. package/bundled/qc-helper/docs/conversations-recovery.md +10 -0
  8. package/bundled/qc-helper/docs/features/browser-use.md +22 -12
  9. package/bundled/qc-helper/docs/features/channels/dingtalk.md +2 -2
  10. package/bundled/qc-helper/docs/features/channels/dws.md +7 -7
  11. package/bundled/qc-helper/docs/features/channels/feishu.md +1 -1
  12. package/bundled/qc-helper/docs/features/channels/github.md +13 -9
  13. package/bundled/qc-helper/docs/features/channels/gitlab.md +12 -5
  14. package/bundled/qc-helper/docs/features/channels/overview.md +121 -46
  15. package/bundled/qc-helper/docs/features/channels/plugins.md +12 -12
  16. package/bundled/qc-helper/docs/features/channels/qqbot.md +5 -5
  17. package/bundled/qc-helper/docs/features/channels/telegram.md +5 -5
  18. package/bundled/qc-helper/docs/features/channels/wecom.md +5 -4
  19. package/bundled/qc-helper/docs/features/channels/weixin.md +3 -3
  20. package/bundled/qc-helper/docs/features/code-review.md +4 -0
  21. package/bundled/qc-helper/docs/features/computer-use.md +1 -1
  22. package/bundled/qc-helper/docs/quickstart.md +14 -14
  23. package/bundled/qc-helper/docs/qwen-serve.md +10 -4
  24. package/bundled/review/SKILL.md +44 -9
  25. package/bundled/review/references/persistence.md +3 -4
  26. package/chunks/{MaxSizedBox-3RXPTLCS.js → MaxSizedBox-4MLWQHF3.js} +33 -31
  27. package/chunks/{StandaloneSessionPicker-74775YBZ.js → StandaloneSessionPicker-PDNU6KJJ.js} +50 -48
  28. package/chunks/{acp-subagent-executor-OQXOMTFK.js → acp-subagent-executor-JB2J6N73.js} +35 -33
  29. package/chunks/{acpAgent-MD56LD7L.js → acpAgent-CAPZFZCW.js} +123 -97
  30. package/chunks/{agent-75EZNG2Q.js → agent-MTWGIPWC.js} +18 -16
  31. package/chunks/{agent-headless-TQ6MWUDT.js → agent-headless-Z27XJSXK.js} +18 -16
  32. package/chunks/{anthropicContentGenerator-DCDXTX3R.js → anthropicContentGenerator-VAFZRJWG.js} +3 -3
  33. package/chunks/{askUserQuestion-2NU6CXK2.js → askUserQuestion-V4OFZD5D.js} +1 -1
  34. package/chunks/{bridge-KGJYQUWD.js → bridge-BUCSJHCE.js} +35 -33
  35. package/chunks/{channel-management-service-YN4A3BJ6.js → channel-management-service-Q2B7WUPL.js} +27 -10
  36. package/chunks/{channel-settings-store-773UOD6B.js → channel-settings-store-U25CVEL6.js} +42 -40
  37. package/chunks/{channel-worker-group-AKPVHRUO.js → channel-worker-group-QNX4OIMZ.js} +5 -5
  38. package/chunks/{channel-worker-manager-TDAQSKWX.js → channel-worker-manager-IJCPV4WY.js} +24 -5
  39. package/chunks/{channel-worker-supervisor-PUMSN4J2.js → channel-worker-supervisor-ENJ2AE2N.js} +4 -4
  40. package/chunks/{chunk-OU4ZCLGJ.js → chunk-242INZ6Y.js} +1 -1
  41. package/chunks/{chunk-JOFZBTVL.js → chunk-245NB3M4.js} +1 -1
  42. package/chunks/{chunk-LISITUEH.js → chunk-26KGIWIW.js} +1 -1
  43. package/chunks/{chunk-WPHZEGFC.js → chunk-2RQEWY2P.js} +1 -1
  44. package/chunks/{chunk-DCTJ3GVF.js → chunk-2SCE6YR2.js} +3 -3
  45. package/chunks/{chunk-STKUN7BR.js → chunk-2XNGG7R3.js} +1 -1
  46. package/chunks/{chunk-OQE7AA2W.js → chunk-36ZMEEBW.js} +16 -12
  47. package/chunks/{chunk-Y53WH7VD.js → chunk-44K6Q5AW.js} +3 -3
  48. package/chunks/{chunk-N4VKU36J.js → chunk-465XOJLQ.js} +1 -1
  49. package/chunks/{chunk-HD4IXPPC.js → chunk-4A4XNQEZ.js} +3 -3
  50. package/chunks/{chunk-RXB6Y33E.js → chunk-4VULJ3LV.js} +1 -1
  51. package/chunks/{chunk-EBRC4GX2.js → chunk-4XXUGJJS.js} +1 -1
  52. package/chunks/{chunk-MVC4XLNM.js → chunk-53IRNMPU.js} +118 -5
  53. package/chunks/{chunk-VGLXXHTF.js → chunk-5BLOZPTW.js} +1 -1
  54. package/chunks/{chunk-3SK2A75W.js → chunk-5OJQLD3P.js} +3 -3
  55. package/chunks/{chunk-WVNCMGAO.js → chunk-6FURC4LI.js} +1 -1
  56. package/chunks/{chunk-WVTM33Q3.js → chunk-6KXQIDK2.js} +4 -4
  57. package/chunks/{chunk-ZKDUQHU4.js → chunk-7MNHZUTA.js} +35 -18
  58. package/chunks/{chunk-JEIPBSGX.js → chunk-7P5WZQXF.js} +7 -7
  59. package/chunks/{chunk-GGUOO2XC.js → chunk-7RCAMBLN.js} +1 -1
  60. package/chunks/{chunk-FBLGI2SO.js → chunk-AAOMFXVZ.js} +7 -7
  61. package/chunks/{chunk-JM76TMGV.js → chunk-ACLD6C3R.js} +8798 -7901
  62. package/chunks/{chunk-4FCWKBOC.js → chunk-ALTMZEBU.js} +6 -6
  63. package/chunks/{chunk-ZHQSWNO6.js → chunk-AN62TPO6.js} +1 -1
  64. package/chunks/{chunk-U5DPG7JW.js → chunk-AYTI24XN.js} +1 -1
  65. package/chunks/{chunk-B53FO7JN.js → chunk-AZN2GSLM.js} +2 -2
  66. package/chunks/{chunk-6KQQPPFF.js → chunk-B3J4BSPL.js} +1 -1
  67. package/chunks/{chunk-SLSH5TFD.js → chunk-BMCDSO77.js} +4 -4
  68. package/chunks/{chunk-DBYUN4U3.js → chunk-BUDUHXX3.js} +1 -1
  69. package/chunks/{chunk-TS4Y2MHO.js → chunk-CGREZDGO.js} +1 -1
  70. package/chunks/chunk-CLNDQINM.js +523 -0
  71. package/chunks/{chunk-LNUQA3OE.js → chunk-CVRZNFXO.js} +1 -1
  72. package/chunks/{chunk-3DBI3LLL.js → chunk-CWLTXYKP.js} +4 -4
  73. package/chunks/{chunk-B3XMX4SN.js → chunk-DACCX4JI.js} +4 -4
  74. package/chunks/{chunk-YWZOEHBT.js → chunk-DE2WI7RU.js} +192 -62
  75. package/chunks/{chunk-3TQVPDCN.js → chunk-DU53RB7A.js} +2 -2
  76. package/chunks/{chunk-2KZURPTB.js → chunk-DZCTQ2MF.js} +6 -1
  77. package/chunks/{chunk-35SABQFH.js → chunk-DZUNDX4M.js} +1 -1
  78. package/chunks/{chunk-4INF7OYV.js → chunk-ELY2U74S.js} +2 -2
  79. package/chunks/chunk-EMGHODF7.js +56 -0
  80. package/chunks/{chunk-5FZKG4JB.js → chunk-EMOTEATH.js} +1 -1
  81. package/chunks/{chunk-LW7WW3Z5.js → chunk-ERGQUKZ2.js} +1 -1
  82. package/chunks/{chunk-TNWJJEDT.js → chunk-ES6EQNGR.js} +6 -6
  83. package/chunks/{chunk-E3TLOFX7.js → chunk-EUHSEMO4.js} +62 -7
  84. package/chunks/{chunk-N25B6FZN.js → chunk-EYCDA5MN.js} +2 -0
  85. package/chunks/{chunk-GPTEZLRR.js → chunk-F4ERRMCO.js} +25 -23
  86. package/chunks/{chunk-SXFZ5P7F.js → chunk-FE7D3WKV.js} +1 -1
  87. package/chunks/{chunk-XEXNBTYX.js → chunk-FH45BQGZ.js} +3 -3
  88. package/chunks/{chunk-CAORZAZD.js → chunk-FLBUHGL4.js} +10 -10
  89. package/chunks/{chunk-X2R47SFR.js → chunk-FLVPNMCS.js} +1 -1
  90. package/chunks/{chunk-5SZSV2CK.js → chunk-FVIJFKEQ.js} +3 -3
  91. package/chunks/{chunk-KFLDZ3HB.js → chunk-G6XRNTXF.js} +1 -1
  92. package/chunks/{chunk-2JHQ2J3Y.js → chunk-G72UHXC3.js} +5 -5
  93. package/chunks/{chunk-4A255ZI6.js → chunk-GAHZJLQG.js} +2 -2
  94. package/chunks/{chunk-7IVZOKKW.js → chunk-GKJGKTWJ.js} +3 -3
  95. package/chunks/{chunk-KY4HZXLV.js → chunk-GLPNIOEV.js} +33 -2
  96. package/chunks/{chunk-6PRSQUPJ.js → chunk-GQZZGEMS.js} +1 -1
  97. package/chunks/{chunk-G2AE7GYZ.js → chunk-GRUASRWC.js} +1 -1
  98. package/chunks/{chunk-HH7R6RLK.js → chunk-GTQ35GRO.js} +1 -1
  99. package/chunks/{chunk-LWRJLRZS.js → chunk-GYLDOFLU.js} +3 -3
  100. package/chunks/{chunk-MZRJ2JJS.js → chunk-HDSI3RDN.js} +136 -9
  101. package/chunks/{chunk-RO5K7QUL.js → chunk-HHMJ5ONX.js} +45 -31
  102. package/chunks/{chunk-E4HNTYHK.js → chunk-HVVQYSBA.js} +32 -9
  103. package/chunks/{chunk-H2GVLBFU.js → chunk-I36GIR6K.js} +64 -2
  104. package/chunks/{chunk-VTFLRL55.js → chunk-IBRV4T3I.js} +2 -2
  105. package/chunks/{chunk-4VSTV4C2.js → chunk-IH22ZGZI.js} +53 -2
  106. package/chunks/{chunk-AOW7WIWE.js → chunk-IQH7Q5OP.js} +4 -4
  107. package/chunks/{chunk-OB444SG3.js → chunk-IYKGSUTA.js} +1 -1
  108. package/chunks/{chunk-HS5OZTQF.js → chunk-J2FLXQJM.js} +1 -1
  109. package/chunks/{chunk-BBCH7PBA.js → chunk-KACKEW2M.js} +2 -2
  110. package/chunks/{chunk-JE3J5HFM.js → chunk-KAOHUUM7.js} +62 -251
  111. package/chunks/{chunk-JCMDVGPR.js → chunk-KGLPVCX7.js} +2 -2
  112. package/chunks/{chunk-QKXZOHHQ.js → chunk-LDURD6EP.js} +15 -62
  113. package/chunks/{chunk-O4IH5UEC.js → chunk-LLIYDIGU.js} +20 -20
  114. package/chunks/{chunk-3XHMOJCP.js → chunk-MBC3PULP.js} +1 -1
  115. package/chunks/{chunk-SRZA7OU4.js → chunk-MMCGLNPP.js} +6 -6
  116. package/chunks/{chunk-3NG2ZQAJ.js → chunk-NZC74TT2.js} +1 -1
  117. package/chunks/{chunk-47C3HPMW.js → chunk-O5YL6KSX.js} +47 -18
  118. package/chunks/{chunk-EIHZ4FFM.js → chunk-O6PPYFQN.js} +3 -3
  119. package/chunks/{chunk-XCU752HT.js → chunk-OICDXWXP.js} +13 -19
  120. package/chunks/{chunk-VJCKLKZX.js → chunk-OOU7XOZF.js} +3 -3
  121. package/chunks/{chunk-OM5NSL25.js → chunk-P4P7CH7H.js} +38 -38
  122. package/chunks/{chunk-CIS4SY3R.js → chunk-PPBZHGEQ.js} +3 -3
  123. package/chunks/{chunk-PB7JBAHF.js → chunk-PVBIEIVZ.js} +0 -1
  124. package/chunks/{chunk-GG3MO6NO.js → chunk-PWGMHXIV.js} +2 -2
  125. package/chunks/{chunk-6N2PJAZG.js → chunk-PX2ZOOGQ.js} +1 -1
  126. package/chunks/{chunk-NNN2PKPV.js → chunk-PYYPSK6Q.js} +36 -495
  127. package/chunks/{chunk-TKOQGFRE.js → chunk-PZOWKCPJ.js} +1 -1
  128. package/chunks/{chunk-PJ546DX4.js → chunk-Q36IJ74U.js} +17 -11
  129. package/chunks/chunk-Q4FJVWI4.js +78 -0
  130. package/chunks/{chunk-PA4HU5IQ.js → chunk-QATPE3SN.js} +13 -7
  131. package/chunks/{chunk-MBUUQJPV.js → chunk-QGKAYDES.js} +5 -5
  132. package/chunks/{chunk-TFBQ5CKI.js → chunk-QNEBHC2E.js} +1 -1
  133. package/chunks/{chunk-6NA357SF.js → chunk-QTNSMJKU.js} +1 -1
  134. package/chunks/{chunk-TDLEDOJN.js → chunk-QU7VULWX.js} +5 -4
  135. package/chunks/{chunk-LOTGIM6V.js → chunk-R3IFSY55.js} +20 -20
  136. package/chunks/{chunk-ZX6EZ7EH.js → chunk-RBE3WRSN.js} +3 -3
  137. package/chunks/{chunk-YSZ2XZTG.js → chunk-RBKZ6SK4.js} +5 -5
  138. package/chunks/{chunk-FLRFAPDA.js → chunk-RCL6OXZC.js} +5 -5
  139. package/chunks/{chunk-H4W6TJFJ.js → chunk-RONRTFAQ.js} +1 -1
  140. package/chunks/{chunk-ZEGLZ3MN.js → chunk-SCYKHWRM.js} +5 -5
  141. package/chunks/{chunk-STUJ7IMZ.js → chunk-SI7XKACY.js} +56 -56
  142. package/chunks/{chunk-RL2HSTEB.js → chunk-SYZPPX3O.js} +1492 -1140
  143. package/chunks/{chunk-VUYJRNG5.js → chunk-T7TJPVTY.js} +3 -3
  144. package/chunks/{chunk-4V5YKOBI.js → chunk-TF7UC7F6.js} +3 -3
  145. package/chunks/{chunk-NXZD3VNX.js → chunk-TL7DSR47.js} +1 -1
  146. package/chunks/{chunk-BVFBDXI2.js → chunk-TPFV5YZK.js} +1 -1
  147. package/chunks/{chunk-YIHOHHJL.js → chunk-TZHXHWEW.js} +1 -1
  148. package/chunks/{chunk-3X5BDEXS.js → chunk-U6RMVE5X.js} +8 -8
  149. package/chunks/{chunk-HRVFPNGT.js → chunk-VFNKO4FK.js} +4 -4
  150. package/chunks/{chunk-VPALWDQL.js → chunk-VUIH3BQL.js} +31 -12
  151. package/chunks/{chunk-WVNML4HH.js → chunk-VW33WARJ.js} +1 -1
  152. package/chunks/{chunk-MICQVBPI.js → chunk-WCLHOKAZ.js} +1 -1
  153. package/chunks/{chunk-KMQ2ZH3Q.js → chunk-WVWCRZ6M.js} +2 -2
  154. package/chunks/{chunk-5NFAKADR.js → chunk-WZCVB2ER.js} +1 -36
  155. package/chunks/{chunk-JNQEW7B2.js → chunk-X3A72KX5.js} +6 -6
  156. package/chunks/{chunk-3JSIWFNA.js → chunk-XHHUGXYW.js} +527 -135
  157. package/chunks/{chunk-VIA4STCR.js → chunk-YCCBLTSL.js} +3 -3
  158. package/chunks/{chunk-Q5IEY2TN.js → chunk-Z3I5B4DH.js} +1 -1
  159. package/chunks/{chunk-O346IB64.js → chunk-ZAJNI63I.js} +1 -1
  160. package/chunks/{chunk-QR4U27UW.js → chunk-ZJFCDRVP.js} +4 -4
  161. package/chunks/{codex-subagent-executor-437LQYGM.js → codex-subagent-executor-IKWULWIZ.js} +35 -33
  162. package/chunks/{config-utils-CVLI36KM.js → config-utils-3IOTAFBG.js} +38 -34
  163. package/chunks/{contextCommand-2KSW7H5F.js → contextCommand-ZKG2JFCR.js} +33 -31
  164. package/chunks/{core-runtime-4IB27E7J.js → core-runtime-5CAK5DSM.js} +32 -30
  165. package/chunks/{create-sub-session-A73TQDAN.js → create-sub-session-DG4CVOQC.js} +33 -31
  166. package/chunks/{daemon-Y6AOK7LF.js → daemon-D4OAVQKB.js} +1 -1
  167. package/chunks/{daemon-git-worktree-guard-BTKVV3DZ.js → daemon-git-worktree-guard-S3SFT3H7.js} +32 -30
  168. package/chunks/{daemon-status-provider-ETDIOWMS.js → daemon-status-provider-GG64ZJR3.js} +40 -38
  169. package/chunks/{daemon-trust-policy-U5SPHJLP.js → daemon-trust-policy-XNWYLQ32.js} +38 -36
  170. package/chunks/{daemon-trust-policy-monitor-QKRCO5WI.js → daemon-trust-policy-monitor-DR5CRWMM.js} +38 -36
  171. package/chunks/{deferred-core-runtime-FRELZPIE.js → deferred-core-runtime-V4Q674KN.js} +32 -30
  172. package/chunks/{dist-54LGNLWW.js → dist-3M75XY4G.js} +1 -1
  173. package/chunks/{dist-YZBMQPNS.js → dist-6U5NQYA7.js} +5 -5
  174. package/chunks/{dist-FVMLRUVM.js → dist-AS2RPYOB.js} +1 -1
  175. package/chunks/{dist-HANHY2MK.js → dist-GFT4GU72.js} +2 -2
  176. package/chunks/{dist-Y5GP7SWL.js → dist-J7JK3GPY.js} +10 -9
  177. package/chunks/{dist-O723VE2K.js → dist-JTPRKF5H.js} +30 -27
  178. package/chunks/{dist-MGZKUISU.js → dist-MOO5VOC5.js} +7 -20
  179. package/chunks/{dist-IZ66D5A3.js → dist-NJ2L5QKL.js} +1 -1
  180. package/chunks/{dist-EI2XAB4W.js → dist-YC6LDCKH.js} +22 -28
  181. package/chunks/{edit-TQ3CABYP.js → edit-FPIWTN3L.js} +20 -18
  182. package/chunks/{enter-worktree-J46XVFRS.js → enter-worktree-55OWD4LT.js} +4 -3
  183. package/chunks/{enterPlanMode-JHOWELZO.js → enterPlanMode-GDZVXYB2.js} +18 -16
  184. package/chunks/{environment-LUM7XX27.js → environment-Q2BVTUQO.js} +36 -32
  185. package/chunks/{errors-SH32ID5I.js → errors-MZTLVUEM.js} +34 -32
  186. package/chunks/{execution-sandbox-settings-HIYVUBII.js → execution-sandbox-settings-3WJ67GX3.js} +3 -1
  187. package/chunks/{execution-tool-IIEL25CL.js → execution-tool-DZ4XSEFZ.js} +21 -19
  188. package/chunks/{execution-worker-NKKEZ4XF.js → execution-worker-L3TM3F5D.js} +24 -22
  189. package/chunks/{exit-worktree-BC4SDZCC.js → exit-worktree-MI6N4OUP.js} +4 -3
  190. package/chunks/{exitPlanMode-PUICCCQ5.js → exitPlanMode-VIGOD2KP.js} +18 -16
  191. package/chunks/{fast-path-QH3QTZZA.js → fast-path-JCKEFUUL.js} +4 -4
  192. package/chunks/{fast-path-settings-TQAYWLXR.js → fast-path-settings-VIYSH3SD.js} +2 -2
  193. package/chunks/{glob-OEB4WH3Z.js → glob-UOKQZHKL.js} +18 -16
  194. package/chunks/{goal-tools-KWGKFUSK.js → goal-tools-G4RIX4ER.js} +18 -16
  195. package/chunks/{handleAutoUpdate-KEA7JSUD.js → handleAutoUpdate-UZZEGL3N.js} +34 -32
  196. package/chunks/{i18n-AC3MUXKZ.js → i18n-IL33FVND.js} +32 -30
  197. package/chunks/{initializer-WBD32BEX.js → initializer-BCXBRM6Y.js} +38 -36
  198. package/chunks/{installationInfo-JRGFTKWY.js → installationInfo-V7OKUOJV.js} +32 -30
  199. package/chunks/{list-S7KW7NBX.js → list-LQHG6SXA.js} +41 -39
  200. package/chunks/{llm-E32WLISX.js → llm-JWCANCDC.js} +85 -74
  201. package/chunks/{llm-content-generator-OMKJHC5P.js → llm-content-generator-OXMMHUVK.js} +3 -3
  202. package/chunks/{loadedSettingsAdapter-5OSU3J46.js → loadedSettingsAdapter-EKXSRWMY.js} +38 -36
  203. package/chunks/{local-execution-environment-IQHCTUJ5.js → local-execution-environment-XIQLRMLF.js} +24 -22
  204. package/chunks/{loggingContentGenerator-JIYG3LJS.js → loggingContentGenerator-6KHNZDTZ.js} +20 -18
  205. package/chunks/{managed-npm-update-RKAT7AMQ.js → managed-npm-update-MBUH5TIX.js} +32 -30
  206. package/chunks/managed-runtime-attestation-worker-G23AEEMF.js +367 -0
  207. package/chunks/{mcp-SV72BZKG.js → mcp-AYVCEEN7.js} +38 -36
  208. package/chunks/{model-call-collection-PKDMVCZN.js → model-call-collection-OKUGOY4B.js} +1 -1
  209. package/chunks/{model-configuration-A52XMQW7.js → model-configuration-Q3MNGG3B.js} +38 -36
  210. package/chunks/{modelConfigUtils-7O4P3SLE.js → modelConfigUtils-WC5XDR34.js} +33 -31
  211. package/chunks/{monitor-ZXRV2DJB.js → monitor-7JUZXYZN.js} +18 -16
  212. package/chunks/{nonInteractiveCli-UPSGIYRC.js → nonInteractiveCli-B3GCZ6NJ.js} +74 -73
  213. package/chunks/{nonInteractiveToolExecutor-TDKVR43J.js → nonInteractiveToolExecutor-IUHO7PXG.js} +19 -17
  214. package/chunks/{notebook-edit-FBVHAHYM.js → notebook-edit-IYDACZDW.js} +19 -17
  215. package/chunks/{omni-3NREMV2Q.js → omni-DLBHISHC.js} +10 -7
  216. package/chunks/{openaiContentGenerator-EWPBZFIT.js → openaiContentGenerator-W5GN6H6Z.js} +12 -10
  217. package/chunks/{openaiResponsesContentGenerator-3CI3PINB.js → openaiResponsesContentGenerator-BXXRYJQQ.js} +5 -5
  218. package/chunks/{pidfile-BBUANGZX.js → pidfile-QIBF53CW.js} +32 -30
  219. package/chunks/{processUtils-6OHQLG7W.js → processUtils-2LU22KCR.js} +2 -2
  220. package/chunks/{prompt-terminal-ledger-ZBFYXJ4L.js → prompt-terminal-ledger-LXFVLR6C.js} +33 -31
  221. package/chunks/{qwenContentGenerator-62F5IKXJ.js → qwenContentGenerator-LYMLXBWI.js} +21 -19
  222. package/chunks/{reactive-degrade-URJMXJ7N.js → reactive-degrade-HPYBJHYA.js} +6 -6
  223. package/chunks/{read-file-IM4Q5TKI.js → read-file-SXS2MKDY.js} +6 -3
  224. package/chunks/{record-artifact-K4XSMW4X.js → record-artifact-XP3X7RE5.js} +3 -2
  225. package/chunks/{record-source-XZCI3IGU.js → record-source-2VBLKVIE.js} +2 -2
  226. package/chunks/{report-findings-MCGXBQFX.js → report-findings-D2QUYUOG.js} +4 -3
  227. package/chunks/{request-shutdown-TT62PREA.js → request-shutdown-R5SA5GE3.js} +1 -1
  228. package/chunks/{resumeHistoryUtils-O3NQMDVR.js → resumeHistoryUtils-UPGZGP5V.js} +35 -33
  229. package/chunks/{ripGrep-BG2FEVIV.js → ripGrep-X33VVIN5.js} +8 -5
  230. package/chunks/{run-qwen-serve-GMLWJITM.js → run-qwen-serve-CUB2NZ6P.js} +278 -79
  231. package/chunks/{runtime-SSGPOXRZ.js → runtime-2DAVBADX.js} +43 -41
  232. package/chunks/{sandboxConfig-ALYLLNWY.js → sandboxConfig-ESBH3F27.js} +34 -32
  233. package/chunks/{scheduled-tasks-QJTC5XQ7.js → scheduled-tasks-TGWYXZWW.js} +38 -36
  234. package/chunks/{scheduler-PEXTY7IG.js → scheduler-XGLZCXPN.js} +34 -32
  235. package/chunks/{send-message-3UM7XRTB.js → send-message-FBU6WDID.js} +1 -1
  236. package/chunks/{serve-OVAUTKXK.js → serve-7RX4AIID.js} +38 -36
  237. package/chunks/{server-3MMYOOJW.js → server-MJETIFJS.js} +1789 -375
  238. package/chunks/{session-PZBIKBQJ.js → session-7AVYU3TC.js} +75 -74
  239. package/chunks/{session-attachments-root-ESP5CNBV.js → session-attachments-root-RONFQ3D3.js} +32 -30
  240. package/chunks/{session-pr-refresh-B3N7PKUP.js → session-pr-refresh-ZPT6TAD4.js} +37 -35
  241. package/chunks/{settings-KSQ2DGPY.js → settings-FPMUAVWD.js} +37 -35
  242. package/chunks/{shell-3V26EVNC.js → shell-THD5EYOK.js} +18 -16
  243. package/chunks/{skill-XP7F3LBV.js → skill-2D6KXDC5.js} +52 -13
  244. package/chunks/{skill-settings-PDESL7S3.js → skill-settings-XW7X244B.js} +38 -36
  245. package/chunks/{spawnChannel-NVO7CCBW.js → spawnChannel-DBSAAUUT.js} +34 -32
  246. package/chunks/{standalone-update-FDWS2EGF.js → standalone-update-TFAWA676.js} +33 -31
  247. package/chunks/{start-opentui-ui-WIFFY5UD.js → start-opentui-ui-VYMAXPBH.js} +87 -86
  248. package/chunks/{startInteractiveUI-YBLIRIHD.js → startInteractiveUI-Z54XKH35.js} +1037 -966
  249. package/chunks/{task-create-PEI7AJLE.js → task-create-PVF66J3R.js} +2 -2
  250. package/chunks/{task-update-MQZRWBGK.js → task-update-RSIITTOK.js} +2 -2
  251. package/chunks/{team-create-Z5JUEMB7.js → team-create-TPCELNBJ.js} +18 -16
  252. package/chunks/{team-plan-approval-ZLLHMEQN.js → team-plan-approval-RUURGHQL.js} +18 -16
  253. package/chunks/{terminal-image-renderer-QFO2JTTT.js → terminal-image-renderer-SLJVUD4Z.js} +32 -30
  254. package/chunks/{theme-manager-N7ILUTRY.js → theme-manager-VBOIN2KT.js} +32 -30
  255. package/chunks/{tool-call-PLSQ34VE.js → tool-call-DUHP6UXC.js} +2 -2
  256. package/chunks/{tool-result-media-OAHUKGRK.js → tool-result-media-WU6QAREN.js} +10 -7
  257. package/chunks/{tool-search-534QKE2X.js → tool-search-ET4NH2LK.js} +7 -4
  258. package/chunks/{total-session-admission-EZJQKTPF.js → total-session-admission-UWMJWTWP.js} +35 -33
  259. package/chunks/{trustedFolders-4ZEV6RXD.js → trustedFolders-3WNZBUH7.js} +33 -31
  260. package/chunks/{update-relaunch-GB3SGRDP.js → update-relaunch-SHS3BD6V.js} +5 -5
  261. package/chunks/{updateCheck-DVAGAEQ4.js → updateCheck-MDF2FCRN.js} +32 -30
  262. package/chunks/{upload-config-DMZVTDH7.js → upload-config-LVVUIKA2.js} +4 -4
  263. package/chunks/{useAutoAcceptIndicator-PTQBS42B.js → useAutoAcceptIndicator-26OOM7OM.js} +41 -39
  264. package/chunks/{validateNonInterActiveAuth-DU3WXVSU.js → validateNonInterActiveAuth-TBCZCQIN.js} +72 -71
  265. package/chunks/{version-PNMZGKCV.js → version-MICV7I4Y.js} +1 -1
  266. package/chunks/{web-fetch-LMCOAHW6.js → web-fetch-3O2DFRE5.js} +13 -9
  267. package/chunks/{web-search-N7RR74LA.js → web-search-5FS3NB3D.js} +4 -4
  268. package/chunks/{web-shell-static-GI6FVIMI.js → web-shell-static-E3O6NW7Y.js} +4 -3
  269. package/chunks/{workflow-ZZPHI7FK.js → workflow-FRJO5ZUI.js} +19 -17
  270. package/chunks/{workspace-providers-status-TU73CNRF.js → workspace-providers-status-I5MO7Z2T.js} +43 -41
  271. package/chunks/{workspace-registration-store-743FRSOU.js → workspace-registration-store-CBHKV34L.js} +1 -1
  272. package/chunks/{workspace-registry-S7QTXFWM.js → workspace-registry-2UKNZO5M.js} +35 -33
  273. package/chunks/{workspace-runtime-coordinator-GWNDUIGO.js → workspace-runtime-coordinator-TKCI5WJW.js} +36 -34
  274. package/chunks/{workspace-service-CERZFJ3B.js → workspace-service-M3ZKR6WL.js} +40 -38
  275. package/chunks/{workspace-skills-status-5M3EIAUY.js → workspace-skills-status-OC3EYL7U.js} +41 -39
  276. package/chunks/{workspace-trust-reconciler-Q3LUKMQB.js → workspace-trust-reconciler-YQZSUOH4.js} +41 -39
  277. package/chunks/{write-file-CT54LXQL.js → write-file-BATJLBJX.js} +21 -19
  278. package/chunks/{zoom-image-EU3PGSZM.js → zoom-image-5I7DDLQE.js} +10 -6
  279. package/cli-entry.js +13 -0
  280. package/cli.js +24 -12
  281. package/execution-worker.js +1 -1
  282. package/export-transcript-document.css +1 -1
  283. package/export-transcript-document.js +104 -104
  284. package/package.json +3 -3
  285. package/web-shell/assets/{abnfDiagram-VCTEODGH-DDYEvG-M.js → abnfDiagram-VCTEODGH-DQHroFS1.js} +1 -1
  286. package/web-shell/assets/{arc-DQncKWFX.js → arc-BrOc_HVh.js} +1 -1
  287. package/web-shell/assets/{architectureDiagram-5GKGNRK7-C0-8u9zj.js → architectureDiagram-5GKGNRK7-DXce8IH6.js} +1 -1
  288. package/web-shell/assets/{blockDiagram-NRAW4CY4-Cpt59Ge5.js → blockDiagram-NRAW4CY4-96A3Q3-l.js} +1 -1
  289. package/web-shell/assets/{c4Diagram-UCG6FXSJ-BvESWh83.js → c4Diagram-UCG6FXSJ-CQBg2PSg.js} +1 -1
  290. package/web-shell/assets/channel-CBP6pwSs.js +1 -0
  291. package/web-shell/assets/{chunk-2Q5K7J3B-wKulGIU6.js → chunk-2Q5K7J3B-i_jhVz-t.js} +1 -1
  292. package/web-shell/assets/{chunk-5VM5RSS4-BX6kRoq7.js → chunk-5VM5RSS4-Cx3gMrWT.js} +1 -1
  293. package/web-shell/assets/{chunk-F27PBJKO-wA4IqTt-.js → chunk-F27PBJKO-B9WwW7C0.js} +1 -1
  294. package/web-shell/assets/{chunk-G27WJ6UU-B7hzevlb.js → chunk-G27WJ6UU-B8t0FNPI.js} +1 -1
  295. package/web-shell/assets/{chunk-JWPE2WC7-BdBg9pJg.js → chunk-JWPE2WC7-Dg0__6CF.js} +1 -1
  296. package/web-shell/assets/{chunk-LCL6LL3I-DghmF6LJ.js → chunk-LCL6LL3I-DUwE5g3m.js} +1 -1
  297. package/web-shell/assets/{chunk-POPQ4Y6H-BbReTOod.js → chunk-POPQ4Y6H-BirYW5iS.js} +1 -1
  298. package/web-shell/assets/{chunk-SVP7TREG-C1t0_19D.js → chunk-SVP7TREG-_ONJKtFF.js} +1 -1
  299. package/web-shell/assets/{chunk-XXDRQBXY-DQBby5mI.js → chunk-XXDRQBXY-DGi0chgj.js} +1 -1
  300. package/web-shell/assets/classDiagram-DTDB5LWJ-_4_fFrN3.js +1 -0
  301. package/web-shell/assets/classDiagram-v2-JRS7N3AN-_4_fFrN3.js +1 -0
  302. package/web-shell/assets/{cose-bilkent-JH36ORCC-CNrSyg7B.js → cose-bilkent-JH36ORCC-BSSFxREn.js} +1 -1
  303. package/web-shell/assets/{cynefin-OW5HDTMX-DoxgDRN-.js → cynefin-OW5HDTMX-h-oYVCez.js} +1 -1
  304. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-BmUwbS8Q.js → cynefinDiagram-5FMLGOSQ-CXj6T7Pm.js} +1 -1
  305. package/web-shell/assets/{dagre-3AP2YEHR-BJrOVIjc.js → dagre-3AP2YEHR-Ch9GIhJm.js} +1 -1
  306. package/web-shell/assets/{diagram-S7CK7UJ4-TDX4KU9V.js → diagram-S7CK7UJ4-Cq3W541T.js} +1 -1
  307. package/web-shell/assets/{diagram-UQ7AKVKN-D3VUQkGl.js → diagram-UQ7AKVKN-Bm1R5-sN.js} +1 -1
  308. package/web-shell/assets/{diagram-VSXAHHWV-CqCpgViy.js → diagram-VSXAHHWV-BW2qG6Vh.js} +1 -1
  309. package/web-shell/assets/{diagram-VX7I27RA-CthqfwCs.js → diagram-VX7I27RA-DN96PhRe.js} +1 -1
  310. package/web-shell/assets/{diagram-Z3DM3KII-BRY3Ahvu.js → diagram-Z3DM3KII-A8MnwaJr.js} +1 -1
  311. package/web-shell/assets/{ebnfDiagram-PWID7BFC-tJvTnIwp.js → ebnfDiagram-PWID7BFC-CZTpUypI.js} +1 -1
  312. package/web-shell/assets/{erDiagram-SSCWMZ5O-DT4b7w5B.js → erDiagram-SSCWMZ5O-CbxCRFru.js} +1 -1
  313. package/web-shell/assets/{flowDiagram-A5DVABFB-C5oirWSf.js → flowDiagram-A5DVABFB-Bt1PM2Dy.js} +1 -1
  314. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-ZD3kNlO4.js → ganttDiagram-EL5Y4UJY-CTgim3LX.js} +1 -1
  315. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-Bp1sg_wH.js → gitGraphDiagram-WWUBYQGX-h4jX7S4l.js} +1 -1
  316. package/web-shell/assets/{index-DSIzVof7.js → index-BDxWHGNm.js} +1 -1
  317. package/web-shell/assets/index-Bd3iA5Er.js +2407 -0
  318. package/web-shell/assets/index-DuwfO01z.css +36 -0
  319. package/web-shell/assets/{infoDiagram-RXCK75RN-Btumz_CZ.js → infoDiagram-RXCK75RN-DsIsFmZ4.js} +1 -1
  320. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-Dx8_uvso.js → ishikawaDiagram-5VMMS53U-BgF2V3rC.js} +1 -1
  321. package/web-shell/assets/{journeyDiagram-EYS64GPL-DS5spUhj.js → journeyDiagram-EYS64GPL-CJ2ibWhB.js} +1 -1
  322. package/web-shell/assets/{kanban-definition-3QL26DDD-DttC9d4D.js → kanban-definition-3QL26DDD-oqNfpjND.js} +1 -1
  323. package/web-shell/assets/{layout-BDOJQJbX.js → layout-DKF2f-UC.js} +1 -1
  324. package/web-shell/assets/{linear-BsUVMxld.js → linear-CadmYA8J.js} +1 -1
  325. package/web-shell/assets/{mermaid.core-De4-EW4Z.js → mermaid.core-BSD13L-h.js} +6 -6
  326. package/web-shell/assets/{mindmap-definition-FBJOCRG2-BsYY98Wv.js → mindmap-definition-FBJOCRG2-Cg3jlHzV.js} +1 -1
  327. package/web-shell/assets/{pegDiagram-XKGWAZYB-DXnnQrVY.js → pegDiagram-XKGWAZYB-BGzqlBWk.js} +1 -1
  328. package/web-shell/assets/{pieDiagram-E7YTZNPT-DGLAGUYR.js → pieDiagram-E7YTZNPT-BVDdPYnC.js} +1 -1
  329. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-Y8DcMTa5.js → quadrantDiagram-AXDQQJYC-D7maRW6r.js} +1 -1
  330. package/web-shell/assets/{railroadDiagram-O6MQD6OU-ZgauslUZ.js → railroadDiagram-O6MQD6OU-C7J0Nnqc.js} +1 -1
  331. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-Kxtu4twe.js → requirementDiagram-EFPCY7ZU-CDEpUB7S.js} +1 -1
  332. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-BKsLF9EA.js → sankeyDiagram-P5KCCOFB-DoA0BWeR.js} +1 -1
  333. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-D8sCv1NK.js → sequenceDiagram-WJ2MYXX4-DlqRjDLl.js} +1 -1
  334. package/web-shell/assets/{sizeCapture-X5ZJPWSS-BX8sokZX.js → sizeCapture-X5ZJPWSS-3l2EJ1DB.js} +1 -1
  335. package/web-shell/assets/{stateDiagram-HBIQ2CUA-DFMl58kv.js → stateDiagram-HBIQ2CUA-Bdq0N6Lr.js} +1 -1
  336. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-DtdYpKZp.js +1 -0
  337. package/web-shell/assets/{swimlanes-XN3QIQJK-BnMwURLN.js → swimlanes-XN3QIQJK-B4ArxdLV.js} +1 -1
  338. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-B_iL0Dc4.js +8 -0
  339. package/web-shell/assets/{timeline-definition-24CTP7MA-C8y77DDz.js → timeline-definition-24CTP7MA-B_Ug6D_k.js} +1 -1
  340. package/web-shell/assets/{vennDiagram-4TSXK5OY-DOWQgX9u.js → vennDiagram-4TSXK5OY-BR9tvaDT.js} +1 -1
  341. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-BM0AVIzE.js → wardleyDiagram-VM6X3IG4-BdGIt6qE.js} +1 -1
  342. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-B18-YghG.js → xychartDiagram-S5SC5T6Z-NxS8XkXN.js} +1 -1
  343. package/web-shell/index.html +2 -2
  344. package/web-shell/sw.js +1 -1
  345. package/bundled/computer-use/references/macos.md +0 -208
  346. package/bundled/computer-use/references/windows-linux.md +0 -247
  347. package/web-shell/assets/channel-B88Zt8_x.js +0 -1
  348. package/web-shell/assets/classDiagram-DTDB5LWJ-Dp-7ruHm.js +0 -1
  349. package/web-shell/assets/classDiagram-v2-JRS7N3AN-Dp-7ruHm.js +0 -1
  350. package/web-shell/assets/index-CpxLhWqx.js +0 -2337
  351. package/web-shell/assets/index-mr0Sw0G-.css +0 -36
  352. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-B3HSbbo2.js +0 -1
  353. 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
- "senderPolicy": "pairing",
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
- "senderPolicy": "pairing",
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
- `senderPolicy` and `groupPolicy` default to `pairing` for a newly managed DWS channel. `dmPolicy` defaults to `open`, including existing configurations that omit it. Approve a user or group with the code returned by the channel:
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
- `senderPolicy` controls direct-message senders, document-notification authors, native-todo creators, and senders in `open` or `allowlist` groups. `groupPolicy` controls group conversations. An approved pairing group follows the shared channel behavior and authorizes its members; open and allowlist groups must also pass `senderPolicy`.
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
- Group and direct-message access can be configured independently. For a group-only channel, set `dmPolicy: "disabled"` and choose an enabled `groupPolicy`. For a direct-message-only channel, set `groupPolicy: "disabled"` and `dmPolicy: "open"`. Direct-message access also controls document notifications. Native todo polling remains controlled separately by `watchTodos`.
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 `senderPolicy` and support `approvalMode` `default`, `plan`, or `yolo`; `default` is used when omitted.
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 `senderPolicy` 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.
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
- "senderPolicy": "open",
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
- "senderPolicy": "allowlist",
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
- "*": { "requireMention": true }
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 only operator accounts in `allowedUsers`. Startup rejects an allowlist containing only the authenticated account and warns when it appears alongside other operators.
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 `senderPolicy: "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.
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 `senderPolicy: "allowlist"` with explicit `allowedUsers` on public repos.
103
+ Always use `groups["*"].senders: "allowlist"` with explicit group `allowedUsers` on public repos.
102
104
 
103
- Allowlist and pairing entries follow the **username**, not the immutable account ID. If an allowlisted 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 the allowlist/pairing authorization.
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
- Note that under `groupPolicy: "pairing"`, access is granted per repository: once a repository is approved, **any GitHub user** can drive the bot through that repository's issues and pull requests. All GitHub traffic is group traffic, so `senderPolicy` and `allowedUsers` do not gate members of an approved repository. 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.
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
- "senderPolicy": "open",
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 `senderPolicy: "open"` allows **any GitLab user** who @mentions the bot to submit prompts that drive the agent in your `cwd`.
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 `senderPolicy: "allowlist"` with explicit `allowedUsers` on public projects.
138
+ Always use `groups["*"].senders: "allowlist"` with explicit group `allowedUsers` on public projects.
134
139
 
135
- Note that under `groupPolicy: "pairing"`, access is granted per project: once a project is approved, **any GitLab user** can drive the bot through that project's issues and merge requests. All GitLab traffic is group traffic, so `senderPolicy` and `allowedUsers` do not gate members of an approved project. 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.
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
- "senderPolicy": "allowlist",
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
- | `senderPolicy` | No | Who can talk to the bot: `allowlist` (default), `open`, or `pairing` |
63
- | `allowedUsers` | No | List of user IDs allowed to use the bot (used by `allowlist` and `pairing` policies) |
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
- | `dmPolicy` | No | Private/DM access: `open` (default) or `disabled` (silently drop all DMs). Useful for group-only bots |
72
- | `groupHistoryLimit` | No | Opt-in group history backfill. `0` or omitted disables it. A positive number persists that many unmentioned group messages from authorized senders or members of approved paired groups for the next bot mention/reply. |
73
- | `groups` | No | Per-group settings. Keys are group chat IDs or `"*"` for defaults. See [Group Chats](#group-chats) |
74
- | `dispatchMode` | No | What happens when you send a message while the bot is busy: `steer` (default), `collect`, or `followup`. See [Dispatch Modes](#dispatch-modes) |
75
-
76
- ### Sender Policy
77
-
78
- Controls who can interact with the bot:
79
-
80
- - **`allowlist`** (default) — Only users listed in `allowedUsers` can send messages. Others are silently ignored.
81
- - **`pairing`** — Unknown senders receive a pairing code. The bot operator approves them via CLI, and they're added to a persistent allowlist. Users in `allowedUsers` skip pairing entirely. See [DM Pairing](#dm-pairing) below.
82
- - **`open`** — Anyone can send messages. Use with caution.
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
- `senderPolicy`, `dmPolicy`, `groupPolicy`, group settings, pairing, and mention
160
- requirements can read, write, update, or clear memory for that chat or thread.
161
- Accepted members of the same group share that group's target store. Use
162
- `allowlist` or `pairing` policies when group memory should be limited to trusted
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 `senderPolicy` is set to `"pairing"`, unknown senders go through an approval flow:
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, every member can use the bot in that group; `senderPolicy` continues to control direct messages.
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 authorized senders, or members of an approved paired group, are persisted.
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. dmPolicy — is this DM allowed? (disabled → ignore)
316
- 3. requireMention — was the bot mentioned/replied to? (no → ignore)
317
- 4. senderPolicy — is this sender approved? (skipped for a paired group; otherwise no → user pairing flow)
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 either source, the daemon does not load channel adapters or reserve the lease until the first `qwen channel set`.
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
- "senderPolicy": "allowlist",
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
- "senderPolicy": "open",
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 | Description |
50
- | -------------- | -------------------------------------------------------------------------------------------------- |
51
- | `senderPolicy` | `allowlist`, `pairing`, or `open` |
52
- | `allowedUsers` | Static allowlist of sender 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` | `open` or `disabled` |
59
- | `groups` | Per-group settings |
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
- "senderPolicy": "open",
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
- `senderPolicy`, `allowedUsers`, `sessionScope`, `cwd`, `instructions`, `groupPolicy`, `groups`, `dispatchMode`.
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; `senderPolicy` and `allowedUsers` do not gate members of an approved group.
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 `senderPolicy: "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.
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 `senderPolicy: "allowlist"`, make sure your QQ user ID is in `allowedUsers`
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 `senderPolicy: "allowlist"` or `"pairing"`, you need your Telegram user ID (a numeric ID, not your username).
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
- "senderPolicy": "allowlist",
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; `senderPolicy` and `allowedUsers` do not gate members of an approved group.
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 `senderPolicy: "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.
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 `senderPolicy: "allowlist"`, or that you've been approved if using `"pairing"`
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
- "senderPolicy": "allowlist",
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
- `senderPolicy` works the same way as other IM channels:
76
+ `privatePolicy` works the same way as other IM channels:
77
77
 
78
- - `allowlist`: only users in `allowedUsers` can use the bot. This is the recommended enterprise default.
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; `senderPolicy` and `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
+ 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