@qwen-code/qwen-code 0.23.1-preview.2 → 0.23.2-nightly.20260909.2e212144d3

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 (335) hide show
  1. package/README.md +35 -15
  2. package/bundled/computer-use/SKILL.md +189 -116
  3. package/bundled/goal-draft/SKILL.md +23 -13
  4. package/bundled/qc-helper/docs/_meta.ts +1 -0
  5. package/bundled/qc-helper/docs/configuration/auth.md +1 -1
  6. package/bundled/qc-helper/docs/configuration/model-providers.md +66 -16
  7. package/bundled/qc-helper/docs/configuration/settings.md +50 -0
  8. package/bundled/qc-helper/docs/conversations-recovery.md +102 -0
  9. package/bundled/qc-helper/docs/features/_meta.ts +1 -0
  10. package/bundled/qc-helper/docs/features/channels/dingtalk.md +1 -1
  11. package/bundled/qc-helper/docs/features/channels/github.md +1 -9
  12. package/bundled/qc-helper/docs/features/channels/overview.md +27 -52
  13. package/bundled/qc-helper/docs/features/channels/qqbot.md +1 -2
  14. package/bundled/qc-helper/docs/features/commands.md +79 -17
  15. package/bundled/qc-helper/docs/features/computer-use.md +9 -7
  16. package/bundled/qc-helper/docs/features/cross-session-protocol.md +291 -0
  17. package/bundled/qc-helper/docs/features/followup-suggestions.md +2 -2
  18. package/bundled/qc-helper/docs/features/goals.md +17 -3
  19. package/bundled/qc-helper/docs/features/sub-agents.md +8 -0
  20. package/bundled/qc-helper/docs/qwen-serve.md +80 -48
  21. package/chunks/{MaxSizedBox-IYIQ43IZ.js → MaxSizedBox-ZBGWYJZW.js} +29 -28
  22. package/chunks/{StandaloneSessionPicker-AWB2OHX6.js → StandaloneSessionPicker-NR5ACIJZ.js} +48 -47
  23. package/chunks/{acp-startup-profiler-BAL4LJTN.js → acp-startup-profiler-KEU6VAYR.js} +2 -2
  24. package/chunks/{acpAgent-ZC57OLS4.js → acpAgent-DM6XRCDQ.js} +361 -210
  25. package/chunks/{agent-GEBPAEJS.js → agent-EF3IIYE3.js} +20 -20
  26. package/chunks/{agent-headless-63ZEYAJK.js → agent-headless-5J2KFYR4.js} +20 -20
  27. package/chunks/{anthropicContentGenerator-6XDHXIII.js → anthropicContentGenerator-VIW2FG7G.js} +32 -9
  28. package/chunks/{artifact-tool-P52OKKEF.js → artifact-tool-G5LHNECG.js} +1 -1
  29. package/chunks/{askUserQuestion-3KAYLLMM.js → askUserQuestion-R3TXY77M.js} +1 -1
  30. package/chunks/{bridge-MHWO5I5T.js → bridge-LEMQM6QE.js} +32 -31
  31. package/chunks/{channel-management-service-NFRZXQFO.js → channel-management-service-TGF6XFXT.js} +4 -4
  32. package/chunks/{channel-settings-store-T7PMIHKC.js → channel-settings-store-FV365JSF.js} +40 -39
  33. package/chunks/{channel-worker-group-O2BWK5F7.js → channel-worker-group-SQ5FRWOH.js} +7 -7
  34. package/chunks/{channel-worker-manager-4WP7VJOD.js → channel-worker-manager-TU4ZNWOE.js} +7 -7
  35. package/chunks/{channel-worker-supervisor-CCUXD6J5.js → channel-worker-supervisor-EMITFMCP.js} +4 -4
  36. package/chunks/{chunk-3SH53ANB.js → chunk-22GORRNY.js} +12 -0
  37. package/chunks/{chunk-OFB36ZBA.js → chunk-2HYOOFDS.js} +10 -7
  38. package/chunks/chunk-2Z3T52OC.js +82 -0
  39. package/chunks/{chunk-LYHYXJJ3.js → chunk-34VPADLG.js} +3 -3
  40. package/chunks/{chunk-C7M445SS.js → chunk-3A2IMUDH.js} +14 -2
  41. package/chunks/{chunk-P5Z7VD23.js → chunk-3O77M472.js} +294 -87
  42. package/chunks/{chunk-4OCYWXKF.js → chunk-43EUMPKQ.js} +3 -3
  43. package/chunks/{chunk-W4LL5RZO.js → chunk-4ALNJDHL.js} +52 -13
  44. package/chunks/{chunk-VMFPZXRT.js → chunk-4DIMJKWU.js} +64 -43
  45. package/chunks/{chunk-ZRVFHLLK.js → chunk-5DQ4YTIZ.js} +1 -1
  46. package/chunks/{chunk-VYCJITND.js → chunk-5HV2HPO7.js} +1 -1
  47. package/chunks/{chunk-22QOQKG4.js → chunk-5WBA3DEF.js} +1 -1
  48. package/chunks/{chunk-3K65MUKD.js → chunk-65I7S4Z3.js} +2 -1
  49. package/chunks/{chunk-I7UNCY24.js → chunk-6GAYNM3F.js} +3 -3
  50. package/chunks/{chunk-2C3XDBGL.js → chunk-6S7YYUUH.js} +4 -4
  51. package/chunks/{chunk-Y3C5COGI.js → chunk-6VIATHL7.js} +1 -1
  52. package/chunks/{chunk-XNC2TCUO.js → chunk-76I36BEM.js} +4 -4
  53. package/chunks/{chunk-B54PFQS5.js → chunk-7CLLH5TI.js} +1 -1
  54. package/chunks/{chunk-RGAQDQ3Z.js → chunk-7IDZFJAV.js} +18 -9
  55. package/chunks/{chunk-5Z4FCEPY.js → chunk-7K4GGN3D.js} +606 -109
  56. package/chunks/{chunk-WLZRMF3C.js → chunk-7KZVXJ4U.js} +353 -11
  57. package/chunks/{chunk-REDVV5NC.js → chunk-7WCJEY3A.js} +7 -7
  58. package/chunks/{chunk-I67KJGM6.js → chunk-A7QZIGRB.js} +3 -3
  59. package/chunks/{chunk-SHX2HIE7.js → chunk-ATBLEXXV.js} +7 -2
  60. package/chunks/{chunk-RH344FKI.js → chunk-AUTUFD5X.js} +1 -1
  61. package/chunks/chunk-AXMWHKXA.js +42 -0
  62. package/chunks/{chunk-WFXD5OZH.js → chunk-AXWTG6R7.js} +2 -5
  63. package/chunks/{chunk-TSLRORQR.js → chunk-BDAVT6K2.js} +1809 -1588
  64. package/chunks/{chunk-HWZOOSEB.js → chunk-BDP3NTWD.js} +3 -3
  65. package/chunks/{chunk-RD3VPM4E.js → chunk-BZUHZCUO.js} +2 -2
  66. package/chunks/{chunk-HPE4LEWX.js → chunk-C24ZDDNY.js} +1 -1
  67. package/chunks/{chunk-R7TKFIQO.js → chunk-CALNF3Z3.js} +1 -1
  68. package/chunks/{chunk-RPFJJ33Z.js → chunk-CALTQWTZ.js} +1 -1
  69. package/chunks/{chunk-BF3RUIVP.js → chunk-CH2YDT6X.js} +36 -38
  70. package/chunks/{chunk-LD53HMPV.js → chunk-CRZBDVP2.js} +1 -0
  71. package/chunks/{chunk-GEV66YGE.js → chunk-D6AGS266.js} +1 -1
  72. package/chunks/{chunk-EPZWBYQI.js → chunk-D7DFZAK2.js} +19 -11
  73. package/chunks/{chunk-5V4B3EWA.js → chunk-DARWOZY6.js} +1 -1
  74. package/chunks/{chunk-XX4MBBFW.js → chunk-DGNRLJ6S.js} +4 -4
  75. package/chunks/{chunk-UTVIIA7N.js → chunk-DVOCOIS5.js} +1 -1
  76. package/chunks/{chunk-RQNAO42A.js → chunk-E4LXNQAK.js} +1 -1
  77. package/chunks/{chunk-EGRFCIXD.js → chunk-EATP5QCN.js} +84 -25
  78. package/chunks/{chunk-3RMVM33U.js → chunk-EDSU3VUG.js} +12 -5
  79. package/chunks/{chunk-733KQL63.js → chunk-EE5ZD4XU.js} +3 -3
  80. package/chunks/{chunk-QQGAR64U.js → chunk-EN3Q2S3J.js} +4 -4
  81. package/chunks/{chunk-PLUAIHZO.js → chunk-EOLGAQ25.js} +17 -16
  82. package/chunks/{chunk-37SOBIA3.js → chunk-ERXNTINK.js} +1 -1
  83. package/chunks/{chunk-L36LLVA5.js → chunk-EYCW6UF2.js} +7 -7
  84. package/chunks/{chunk-ZELCTN6Y.js → chunk-F23YN37B.js} +10 -0
  85. package/chunks/{chunk-FPGTNKCP.js → chunk-F3M6P6IQ.js} +199 -1
  86. package/chunks/{chunk-B44JBZBB.js → chunk-F4SAL7WM.js} +91 -3
  87. package/chunks/{chunk-F47DITLZ.js → chunk-FAWTMDX7.js} +14 -0
  88. package/chunks/{chunk-SI6Q52UI.js → chunk-FEEVHJOR.js} +3 -3
  89. package/chunks/{chunk-75UQFGFE.js → chunk-FN4KHWCL.js} +1 -1
  90. package/chunks/{chunk-WQBR7LN5.js → chunk-FRS3P7MQ.js} +15 -2
  91. package/chunks/{chunk-5JLQWQK6.js → chunk-FV4DM2M4.js} +2 -2
  92. package/chunks/{chunk-Z6DDPSGJ.js → chunk-GNY7B3CA.js} +1 -1
  93. package/chunks/{chunk-FDOGGKAA.js → chunk-GSFV5RQW.js} +2 -0
  94. package/chunks/{chunk-XBVNNDPK.js → chunk-GSYD7MYP.js} +8 -3
  95. package/chunks/{chunk-ERMAXPXA.js → chunk-HIXUUCGY.js} +187 -12
  96. package/chunks/{chunk-EJNYBDYC.js → chunk-HNLMYDQE.js} +1 -1
  97. package/chunks/{chunk-3K456UJF.js → chunk-HSO6D4KX.js} +93 -28
  98. package/chunks/{chunk-ANVC5CSK.js → chunk-HUJJFSMO.js} +10 -10
  99. package/chunks/{chunk-C4NXRR7T.js → chunk-HW4MRP4V.js} +2 -2
  100. package/chunks/{chunk-PMGWY6ZP.js → chunk-HWLLUDIA.js} +113 -18
  101. package/chunks/{chunk-RCUWMVN3.js → chunk-HZ2HUXX7.js} +1 -1
  102. package/chunks/{chunk-7PMKXGRP.js → chunk-IKK6NNS6.js} +91 -31
  103. package/chunks/{chunk-IMWCUWQT.js → chunk-J3TJH52D.js} +1 -1
  104. package/chunks/{chunk-BNWIX6BM.js → chunk-JFAGT5YG.js} +3 -3
  105. package/chunks/{chunk-RSU3I6UL.js → chunk-JGTMTJSQ.js} +1 -1
  106. package/chunks/{chunk-LTCI6ZOJ.js → chunk-JYGIJA4W.js} +1 -1
  107. package/chunks/{chunk-537SQ2AI.js → chunk-KECCLCXM.js} +146 -24
  108. package/chunks/{chunk-KAZWXVI3.js → chunk-KEPC5BOL.js} +5 -5
  109. package/chunks/{chunk-HZS3JRQW.js → chunk-L5VHJYHH.js} +40 -2
  110. package/chunks/{chunk-KTLT7VCX.js → chunk-LKBOBUA2.js} +2 -2
  111. package/chunks/{chunk-TDHVOZ65.js → chunk-LOBKNYPR.js} +2 -2
  112. package/chunks/{chunk-QW7BUOSI.js → chunk-LOVGQ3HZ.js} +26 -9
  113. package/chunks/{chunk-5FYGZ7E3.js → chunk-MUF4UGPB.js} +2 -2
  114. package/chunks/chunk-N3Z6Q7KC.js +384 -0
  115. package/chunks/{chunk-JOV46WGX.js → chunk-NB3NDQQK.js} +1 -1
  116. package/chunks/chunk-NFXXBWSE.js +463 -0
  117. package/chunks/chunk-NOO4QFXM.js +171 -0
  118. package/chunks/{chunk-PQSCGZT2.js → chunk-NPKCVSXX.js} +26 -2
  119. package/chunks/{chunk-FXYNIZPW.js → chunk-NV4YYXFT.js} +51 -10
  120. package/chunks/{chunk-FWH4736Q.js → chunk-O6BFERWN.js} +3 -3
  121. package/chunks/{chunk-UKADFFL2.js → chunk-OFVAS4AR.js} +1 -1
  122. package/chunks/{chunk-C55CR5I4.js → chunk-OVTPETDL.js} +6 -6
  123. package/chunks/chunk-PLEBBGHL.js +1401 -0
  124. package/chunks/{chunk-Z6KFLEG7.js → chunk-PSPAM24S.js} +1 -0
  125. package/chunks/{chunk-RRCNEW2A.js → chunk-PWR6BQ3U.js} +58 -4
  126. package/chunks/{chunk-SHK2SIR5.js → chunk-QA2B26PL.js} +4 -4
  127. package/chunks/{chunk-NFIDVZND.js → chunk-QB3KS3N3.js} +2 -21
  128. package/chunks/{chunk-NUQFUXOG.js → chunk-QTNCGZHQ.js} +2 -0
  129. package/chunks/{chunk-QJVZLILI.js → chunk-R7OO56VZ.js} +1 -1
  130. package/chunks/{chunk-MFCWL4LI.js → chunk-SK6VACCM.js} +936 -481
  131. package/chunks/{chunk-SD7Y2PMC.js → chunk-SM66GFKJ.js} +2 -2
  132. package/chunks/{chunk-ADJD4LZF.js → chunk-SNMUO5Z7.js} +1 -1
  133. package/chunks/{chunk-NXWYCSPL.js → chunk-SOA4HKRJ.js} +1 -1
  134. package/chunks/{chunk-IRKQ4YYX.js → chunk-SVWWF5TZ.js} +29 -1
  135. package/chunks/{chunk-YLFICBYK.js → chunk-SYKPMH2X.js} +3 -3
  136. package/chunks/{chunk-5HBA2Z7V.js → chunk-TGNNLRC3.js} +2 -3
  137. package/chunks/{chunk-AX23QSX3.js → chunk-TRQNRP2H.js} +4 -4
  138. package/chunks/{chunk-AUJOWIT5.js → chunk-UQOP2APG.js} +4 -24
  139. package/chunks/{chunk-HY3DXYZK.js → chunk-UYDQYDW2.js} +1 -1
  140. package/chunks/{chunk-IGOIYZBG.js → chunk-VAWM3A5N.js} +2 -2
  141. package/chunks/{chunk-6KYWU726.js → chunk-VJJXG73H.js} +417 -292
  142. package/chunks/{chunk-ZNI3V2XA.js → chunk-VJWJOKOQ.js} +2 -2
  143. package/chunks/{chunk-AWDF462I.js → chunk-VR6Y23FW.js} +2 -2
  144. package/chunks/{chunk-T7TP5UQL.js → chunk-VX2NR3SD.js} +21 -6
  145. package/chunks/{chunk-65GHQ4FX.js → chunk-WDVV3LRM.js} +707 -216
  146. package/chunks/{chunk-KP5QK3FB.js → chunk-WEU6O6VN.js} +397 -54
  147. package/chunks/{chunk-OHOO527W.js → chunk-WG7BL3FY.js} +52 -2
  148. package/chunks/{chunk-VU7O7CGQ.js → chunk-XDNFODER.js} +1 -1
  149. package/chunks/{chunk-YHDGABDC.js → chunk-XKBFYTCD.js} +1 -1
  150. package/chunks/{chunk-RUMSY4ES.js → chunk-Y7YHAY32.js} +28 -10
  151. package/chunks/{chunk-7IKXTGZT.js → chunk-YI2YCNSP.js} +1 -1
  152. package/chunks/{chunk-B5FF3LRF.js → chunk-YIE6REQ5.js} +29 -17
  153. package/chunks/{chunk-E4VX6LXB.js → chunk-YZTGGCEE.js} +10 -2
  154. package/chunks/{chunk-TXAEXF2B.js → chunk-ZEFWBG2C.js} +737 -1136
  155. package/chunks/{chunk-AIMZIXZM.js → chunk-ZM2TCZZ7.js} +5 -7
  156. package/chunks/{chunk-ZT3XUGSU.js → chunk-ZZ7RVOTU.js} +135 -26
  157. package/chunks/{config-utils-F4CFJ4MW.js → config-utils-SXFK3G4X.js} +33 -32
  158. package/chunks/{contextCommand-OIIGGOMU.js → contextCommand-QFPD26QO.js} +31 -30
  159. package/chunks/{core-runtime-JEHLOGMB.js → core-runtime-VXKNBODM.js} +35 -33
  160. package/chunks/{create-sub-session-MVFBE5RA.js → create-sub-session-7WSQETFR.js} +30 -29
  161. package/chunks/{daemon-LCUELM6E.js → daemon-U2456K5H.js} +2 -2
  162. package/chunks/{daemon-git-worktree-guard-5FTKLJOU.js → daemon-git-worktree-guard-I4DCSDUS.js} +29 -28
  163. package/chunks/{daemon-status-provider-P6A5MPMW.js → daemon-status-provider-5UV56RI4.js} +36 -35
  164. package/chunks/{daemon-trust-policy-ZJ3NFYUO.js → daemon-trust-policy-DKIBWTKU.js} +36 -35
  165. package/chunks/{daemon-trust-policy-monitor-6SDLEW7S.js → daemon-trust-policy-monitor-CPSD7UKT.js} +36 -35
  166. package/chunks/{deferred-core-runtime-DWOXIU5S.js → deferred-core-runtime-D2RF35BL.js} +29 -28
  167. package/chunks/{discovery-TUM3ZQ6U.js → discovery-XP4RMDUM.js} +4 -2
  168. package/chunks/{dist-P6YWBITG.js → dist-6YDUH3BB.js} +817 -152
  169. package/chunks/{dist-T4PRA5EZ.js → dist-BNQVF565.js} +2 -8
  170. package/chunks/{dist-AI25RVRA.js → dist-F34J4FZX.js} +1 -1
  171. package/chunks/{dist-3H3WODVS.js → dist-F6JLAJLE.js} +1 -1
  172. package/chunks/{dist-NXW4DUUX.js → dist-K5GHMXIG.js} +2 -2
  173. package/chunks/{dist-YNQU4CKC.js → dist-NP7QKLVG.js} +2 -2
  174. package/chunks/{dist-VCAS67N5.js → dist-UFTFGI6I.js} +1 -1
  175. package/chunks/{dist-I74QLLQS.js → dist-XLV33CLY.js} +1 -2
  176. package/chunks/{dist-XINEKB5A.js → dist-ZDNJK74R.js} +3 -7
  177. package/chunks/{edit-WPVXLL3T.js → edit-4IBADZ3O.js} +20 -20
  178. package/chunks/{enter-worktree-5A6VW6BN.js → enter-worktree-YFTKHXHZ.js} +2 -2
  179. package/chunks/{enterPlanMode-JSODW7E2.js → enterPlanMode-YN3GPQU5.js} +20 -20
  180. package/chunks/{environment-5LLJ3I3W.js → environment-E272IJMF.js} +32 -31
  181. package/chunks/{errors-IQT3YZEP.js → errors-CVAH3RWQ.js} +31 -30
  182. package/chunks/{exit-worktree-QV7E7KP6.js → exit-worktree-NF2XEMES.js} +3 -3
  183. package/chunks/{exitPlanMode-DDVFYNW4.js → exitPlanMode-24J5IHGC.js} +20 -20
  184. package/chunks/{fast-path-PAUQQEVU.js → fast-path-M5IDBMXF.js} +4 -4
  185. package/chunks/{fast-path-settings-ISEJPRYE.js → fast-path-settings-SATXY3PD.js} +3 -3
  186. package/chunks/{glob-SQ7CTZ7F.js → glob-ERBD7JYP.js} +20 -20
  187. package/chunks/{goal-tools-UWZRCLQB.js → goal-tools-245ULLQT.js} +20 -20
  188. package/chunks/{handleAutoUpdate-RUPZZTSG.js → handleAutoUpdate-JDZHHZKK.js} +32 -31
  189. package/chunks/{i18n-SF5MPWEB.js → i18n-LA4D5IXM.js} +32 -29
  190. package/chunks/{image-gen-Q3RUTVKR.js → image-gen-XP4NNIYG.js} +4 -4
  191. package/chunks/{initializer-CK4WPYZG.js → initializer-SHPTSWUZ.js} +36 -35
  192. package/chunks/{installationInfo-IRPQEYRF.js → installationInfo-QEQEPB3G.js} +29 -28
  193. package/chunks/{list-E3PS3EBJ.js → list-IBHCQWTF.js} +39 -38
  194. package/chunks/{list-agents-I5TRH3J7.js → list-agents-EDPZCGKN.js} +5 -4
  195. package/chunks/{llm-JQKBOYAF.js → llm-JAWCQLA4.js} +81 -75
  196. package/chunks/{llm-content-generator-2QWGBW42.js → llm-content-generator-GOV3A23T.js} +23 -8
  197. package/chunks/{loadedSettingsAdapter-DGXGVYZS.js → loadedSettingsAdapter-RVE2GNVU.js} +36 -35
  198. package/chunks/{loggingContentGenerator-ZYURLJKK.js → loggingContentGenerator-SSHNN5YW.js} +22 -22
  199. package/chunks/{managed-npm-update-HTHR63EA.js → managed-npm-update-BHSTITQO.js} +29 -28
  200. package/chunks/{mcp-I7G2AEWS.js → mcp-6ZZ7P2HU.js} +36 -35
  201. package/chunks/{monitor-4R76BCRZ.js → monitor-RKK6GSHG.js} +20 -20
  202. package/chunks/{nonInteractiveCli-24OQ3VP2.js → nonInteractiveCli-UQHP3G6P.js} +76 -72
  203. package/chunks/{notebook-edit-PPSH7FEX.js → notebook-edit-YM47A7WO.js} +20 -20
  204. package/chunks/{open-with-auth-D6JD6LDS.js → open-with-auth-6MVIHMXB.js} +1 -1
  205. package/chunks/{openaiContentGenerator-K7V5EO7F.js → openaiContentGenerator-FHKDWNI2.js} +11 -11
  206. package/chunks/{pidfile-TGIUY2GG.js → pidfile-SIIEJEEH.js} +32 -29
  207. package/chunks/{processUtils-3USXUQWX.js → processUtils-JF7CWBJC.js} +2 -2
  208. package/chunks/{prompt-terminal-ledger-XHVZRXJI.js → prompt-terminal-ledger-FXXHAEQU.js} +30 -29
  209. package/chunks/{qwenContentGenerator-MPBOQB64.js → qwenContentGenerator-KFJ77JP6.js} +24 -24
  210. package/chunks/{qwenOAuth2-BS5D2LYV.js → qwenOAuth2-KX6LVYQ3.js} +4 -4
  211. package/chunks/{read-file-R256LDWQ.js → read-file-S2NOCBIL.js} +4 -4
  212. package/chunks/{resumeHistoryUtils-S43LTFHD.js → resumeHistoryUtils-QHHPSQWU.js} +33 -32
  213. package/chunks/{ripGrep-L7HPZ75Y.js → ripGrep-F6TNOJUO.js} +5 -5
  214. package/chunks/{run-qwen-serve-CTFL5R6U.js → run-qwen-serve-KYBDQRDD.js} +229 -79
  215. package/chunks/{runtime-FS5TL6P7.js → runtime-3WNOFLCR.js} +43 -40
  216. package/chunks/{scheduled-tasks-QXPV3Q35.js → scheduled-tasks-RNBH56DJ.js} +34 -33
  217. package/chunks/{scheduler-EXU5HMVK.js → scheduler-ERMW7Q7B.js} +31 -30
  218. package/chunks/{send-message-GQKXGMPI.js → send-message-V5T3NMFM.js} +4 -4
  219. package/chunks/{serve-ITJC7WNN.js → serve-7NV46RMP.js} +36 -35
  220. package/chunks/{server-6JQY3PTU.js → server-6RZJR5QF.js} +1358 -932
  221. package/chunks/{session-PJDEKXD4.js → session-Z4EV7NVV.js} +107 -78
  222. package/chunks/{session-attachments-root-L37ORSST.js → session-attachments-root-SG5FC52X.js} +29 -28
  223. package/chunks/{session-pr-refresh-WIFD52YL.js → session-pr-refresh-ILC4Z3ZM.js} +33 -32
  224. package/chunks/{settings-LO6J5SAZ.js → settings-Y47SPE3X.js} +35 -34
  225. package/chunks/{shell-ANAFVYGR.js → shell-YBVCOPVO.js} +20 -20
  226. package/chunks/{skill-SHJWKSPH.js → skill-AXC63EBA.js} +4 -4
  227. package/chunks/{skill-settings-GX3XHZ5Q.js → skill-settings-AFPAYGLO.js} +35 -34
  228. package/chunks/{spawnChannel-WE42VBKM.js → spawnChannel-ZFL4J2V3.js} +29 -28
  229. package/chunks/{standalone-update-CWDIKJRP.js → standalone-update-Y2OZPLNJ.js} +31 -30
  230. package/chunks/{start-opentui-ui-BBHGFOTF.js → start-opentui-ui-G6TKT4LI.js} +2270 -1026
  231. package/chunks/{startInteractiveUI-FQX7LUYP.js → startInteractiveUI-YTNDPW7J.js} +1789 -2211
  232. package/chunks/{task-create-PMAFST2T.js → task-create-MWXJFRRM.js} +3 -3
  233. package/chunks/{task-list-R2HSY2NC.js → task-list-EYO3FE57.js} +2 -2
  234. package/chunks/{task-update-JYC57USF.js → task-update-2JJJRHMT.js} +3 -3
  235. package/chunks/{team-create-WKTPCH6D.js → team-create-BUFLGGSH.js} +20 -20
  236. package/chunks/{team-delete-CBHVBTPB.js → team-delete-IQZ6XGFI.js} +2 -2
  237. package/chunks/{team-plan-approval-Y23DL7WR.js → team-plan-approval-OUWWM42U.js} +20 -20
  238. package/chunks/{terminal-image-renderer-B646HBDW.js → terminal-image-renderer-WH2WV5ES.js} +29 -28
  239. package/chunks/{theme-manager-BNWESY26.js → theme-manager-5UDRARM2.js} +29 -28
  240. package/chunks/{tool-search-PVQ5O5Y2.js → tool-search-MCDIRPHN.js} +4 -4
  241. package/chunks/{total-session-admission-P5Z43KNW.js → total-session-admission-VL27U74Z.js} +33 -32
  242. package/chunks/{trustedFolders-FH2LT2MZ.js → trustedFolders-MSXT4VDD.js} +30 -29
  243. package/chunks/{update-relaunch-WOWTKJSN.js → update-relaunch-JKLEWVCB.js} +5 -5
  244. package/chunks/{updateCheck-3MYFMM35.js → updateCheck-ARTHAJT2.js} +31 -30
  245. package/chunks/{useAutoAcceptIndicator-Q7ZRRRKO.js → useAutoAcceptIndicator-YEAAGYVU.js} +38 -37
  246. package/chunks/{validateNonInterActiveAuth-MYEWJX3G.js → validateNonInterActiveAuth-EMRQKH5S.js} +71 -69
  247. package/chunks/{version-RO2FPO76.js → version-HFQU35WD.js} +3 -1
  248. package/chunks/{web-fetch-QAKY2LUA.js → web-fetch-QBXAO6VF.js} +7 -7
  249. package/chunks/{web-search-XA5Z4ZCD.js → web-search-2URQXA3A.js} +201 -13
  250. package/chunks/{web-shell-static-POZHGGXE.js → web-shell-static-BFDESDD4.js} +5 -4
  251. package/chunks/{workflow-QFIOCMDM.js → workflow-JDD6WDAH.js} +211 -75
  252. package/chunks/{workspace-providers-status-B2UD7RAG.js → workspace-providers-status-B4IKR6YJ.js} +38 -37
  253. package/chunks/{workspace-registration-store-VZLRTI3Q.js → workspace-registration-store-PJ3YHR45.js} +1 -2
  254. package/chunks/{workspace-registry-GYOGG6TM.js → workspace-registry-WVYJ5UGB.js} +33 -32
  255. package/chunks/{workspace-runtime-coordinator-7KRXGQ4V.js → workspace-runtime-coordinator-DXL5YVAG.js} +33 -32
  256. package/chunks/{workspace-service-DJEYGJE4.js → workspace-service-QNGAMVH7.js} +40 -39
  257. package/chunks/{workspace-skills-status-MOKNESUC.js → workspace-skills-status-BEISJIII.js} +36 -35
  258. package/chunks/{workspace-trust-reconciler-AXOSUTQW.js → workspace-trust-reconciler-ORYJF5L4.js} +40 -39
  259. package/chunks/{write-file-QOYVHAKK.js → write-file-DWLKFBTJ.js} +21 -21
  260. package/chunks/{zoom-image-UCCLGFNC.js → zoom-image-BYVIXSNQ.js} +4 -4
  261. package/cli.js +13 -13
  262. package/export-transcript-document.js +123 -119
  263. package/package.json +4 -4
  264. package/web-shell/assets/{abnfDiagram-VCTEODGH-CTstZpXw.js → abnfDiagram-VCTEODGH-C_8kzsly.js} +1 -1
  265. package/web-shell/assets/{arc-DKW0mbPo.js → arc-CDg7Zfpm.js} +1 -1
  266. package/web-shell/assets/{architectureDiagram-5GKGNRK7-DkMpJ42t.js → architectureDiagram-5GKGNRK7-DZzdCWyF.js} +1 -1
  267. package/web-shell/assets/{blockDiagram-NRAW4CY4-7Cp1_4i3.js → blockDiagram-NRAW4CY4-DI3B4gyR.js} +1 -1
  268. package/web-shell/assets/{c4Diagram-UCG6FXSJ-BfaoSlBK.js → c4Diagram-UCG6FXSJ-CfOgwHZW.js} +1 -1
  269. package/web-shell/assets/channel-e4xwS72w.js +1 -0
  270. package/web-shell/assets/{chunk-2Q5K7J3B-_n1qzAio.js → chunk-2Q5K7J3B-B_PUth0g.js} +1 -1
  271. package/web-shell/assets/{chunk-5VM5RSS4-0cira5ZV.js → chunk-5VM5RSS4-CrKtvBIL.js} +1 -1
  272. package/web-shell/assets/{chunk-F27PBJKO-DseRXSHC.js → chunk-F27PBJKO-B4z2n8Py.js} +1 -1
  273. package/web-shell/assets/{chunk-G27WJ6UU-BehQWin0.js → chunk-G27WJ6UU-BUtrFEO8.js} +1 -1
  274. package/web-shell/assets/{chunk-JWPE2WC7-B5ftg1Bb.js → chunk-JWPE2WC7-Cqw3aXW0.js} +1 -1
  275. package/web-shell/assets/{chunk-LCL6LL3I-D7rnbVdk.js → chunk-LCL6LL3I-CZolnvls.js} +1 -1
  276. package/web-shell/assets/{chunk-POPQ4Y6H-2Bp-Orju.js → chunk-POPQ4Y6H-DivgasCa.js} +1 -1
  277. package/web-shell/assets/{chunk-SVP7TREG-CD2goGva.js → chunk-SVP7TREG--seyb1B6.js} +1 -1
  278. package/web-shell/assets/{chunk-XXDRQBXY-DzQt-Rji.js → chunk-XXDRQBXY-D7pHtuVM.js} +1 -1
  279. package/web-shell/assets/classDiagram-DTDB5LWJ-CzXfUUOt.js +1 -0
  280. package/web-shell/assets/classDiagram-v2-JRS7N3AN-CzXfUUOt.js +1 -0
  281. package/web-shell/assets/{cose-bilkent-JH36ORCC-C-BZXSUn.js → cose-bilkent-JH36ORCC-4MWaRF_3.js} +1 -1
  282. package/web-shell/assets/csv-CX7rUNeC.svg +1 -0
  283. package/web-shell/assets/{cynefin-OW5HDTMX-BTcvowe1.js → cynefin-OW5HDTMX-nhJhAjgD.js} +1 -1
  284. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-BoUE6K81.js → cynefinDiagram-5FMLGOSQ-NF-PwXlq.js} +1 -1
  285. package/web-shell/assets/{dagre-3AP2YEHR-BHxy9xeB.js → dagre-3AP2YEHR-Bu0ncdWP.js} +1 -1
  286. package/web-shell/assets/{diagram-S7CK7UJ4-DMiJIvDT.js → diagram-S7CK7UJ4-CsvhFHZC.js} +1 -1
  287. package/web-shell/assets/{diagram-UQ7AKVKN-DXV09Aes.js → diagram-UQ7AKVKN-Ck61sIB3.js} +1 -1
  288. package/web-shell/assets/{diagram-VSXAHHWV-CocpRomV.js → diagram-VSXAHHWV-D0171zrb.js} +1 -1
  289. package/web-shell/assets/{diagram-VX7I27RA-DL7nqtb4.js → diagram-VX7I27RA-DvdxY4UL.js} +1 -1
  290. package/web-shell/assets/{diagram-Z3DM3KII-CPZ2Jux_.js → diagram-Z3DM3KII-CGGpseiB.js} +1 -1
  291. package/web-shell/assets/{ebnfDiagram-PWID7BFC-BX-eVNsX.js → ebnfDiagram-PWID7BFC-K8-QMvY8.js} +1 -1
  292. package/web-shell/assets/{erDiagram-SSCWMZ5O-CPy_Ir6y.js → erDiagram-SSCWMZ5O-D316nAem.js} +1 -1
  293. package/web-shell/assets/{flowDiagram-A5DVABFB-eknAOte9.js → flowDiagram-A5DVABFB-B7siy_mn.js} +1 -1
  294. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-crAxw_t7.js → ganttDiagram-EL5Y4UJY-BZQDxzTu.js} +1 -1
  295. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-M29pa3Tc.js → gitGraphDiagram-WWUBYQGX-DZynLCSV.js} +1 -1
  296. package/web-shell/assets/{index-C9R-iojE.js → index-9ie6xLTM.js} +1 -1
  297. package/web-shell/assets/index-DirkXQEg.js +2164 -0
  298. package/web-shell/assets/index-DzdST_7L.css +36 -0
  299. package/web-shell/assets/{infoDiagram-RXCK75RN-XqspXdOU.js → infoDiagram-RXCK75RN-B0gr769A.js} +1 -1
  300. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-C5KFS-7j.js → ishikawaDiagram-5VMMS53U-0pQFfjvX.js} +1 -1
  301. package/web-shell/assets/{journeyDiagram-EYS64GPL-Cc57LVRo.js → journeyDiagram-EYS64GPL-DEGtClWb.js} +1 -1
  302. package/web-shell/assets/{kanban-definition-3QL26DDD-C81OG-AI.js → kanban-definition-3QL26DDD-CnN8gPzw.js} +1 -1
  303. package/web-shell/assets/{layout-CFVu37BB.js → layout-C_70RhaT.js} +1 -1
  304. package/web-shell/assets/{linear-ChBxdtWf.js → linear-BJ2ZLmcq.js} +1 -1
  305. package/web-shell/assets/{mermaid.core-CMLfue0w.js → mermaid.core-RlY0zPNC.js} +6 -6
  306. package/web-shell/assets/{mindmap-definition-FBJOCRG2-DFsvJThp.js → mindmap-definition-FBJOCRG2-CpVAxTNl.js} +1 -1
  307. package/web-shell/assets/{pegDiagram-XKGWAZYB-BzpRzM4F.js → pegDiagram-XKGWAZYB-DmrSv3hD.js} +1 -1
  308. package/web-shell/assets/{pieDiagram-E7YTZNPT-Cv0Kankl.js → pieDiagram-E7YTZNPT-CJmgp8KJ.js} +1 -1
  309. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-Bh2BJ3Ay.js → quadrantDiagram-AXDQQJYC-UsgOyNco.js} +1 -1
  310. package/web-shell/assets/{railroadDiagram-O6MQD6OU-y8rNDdDS.js → railroadDiagram-O6MQD6OU-DQ6gMs_W.js} +1 -1
  311. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-C0m2DKJ_.js → requirementDiagram-EFPCY7ZU-DhqadamF.js} +1 -1
  312. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-BzdGnSF4.js → sankeyDiagram-P5KCCOFB-R4WnURaE.js} +1 -1
  313. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-DPzAVmzz.js → sequenceDiagram-WJ2MYXX4-D7BwMi_D.js} +1 -1
  314. package/web-shell/assets/{sizeCapture-X5ZJPWSS-LcHG28Zh.js → sizeCapture-X5ZJPWSS-Bqngz088.js} +1 -1
  315. package/web-shell/assets/{stateDiagram-HBIQ2CUA-C1Bzy3IT.js → stateDiagram-HBIQ2CUA-DwaXPGqn.js} +1 -1
  316. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-8GCQZAvv.js +1 -0
  317. package/web-shell/assets/{swimlanes-XN3QIQJK-Bftk8V64.js → swimlanes-XN3QIQJK-BsaLeRDY.js} +1 -1
  318. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-BoRBF2Yw.js +8 -0
  319. package/web-shell/assets/{timeline-definition-24CTP7MA-BfXHcN1A.js → timeline-definition-24CTP7MA-NJ9G-NUU.js} +1 -1
  320. package/web-shell/assets/{vennDiagram-4TSXK5OY-DRSlI9-V.js → vennDiagram-4TSXK5OY-Ca3W4rSq.js} +1 -1
  321. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-CaLmqGau.js → wardleyDiagram-VM6X3IG4-OabvjC-6.js} +1 -1
  322. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-8lgUT6e8.js → xychartDiagram-S5SC5T6Z-C7rbjvpc.js} +1 -1
  323. package/web-shell/index.html +2 -2
  324. package/chunks/chunk-2LD5U7Q3.js +0 -114
  325. package/chunks/chunk-3UMWOKJC.js +0 -78
  326. package/chunks/chunk-IQAFKVXS.js +0 -22
  327. package/chunks/chunk-X35VIWWJ.js +0 -276
  328. package/chunks/chunk-ZJ2LM2SI.js +0 -198
  329. package/web-shell/assets/channel-CQx7VSAp.js +0 -1
  330. package/web-shell/assets/classDiagram-DTDB5LWJ-C-Uz8hHk.js +0 -1
  331. package/web-shell/assets/classDiagram-v2-JRS7N3AN-C-Uz8hHk.js +0 -1
  332. package/web-shell/assets/index-B4TLaxWs.js +0 -2142
  333. package/web-shell/assets/index-CCrkEbzz.css +0 -36
  334. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-LuuL5byY.js +0 -1
  335. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-COmnNq8s.js +0 -8
@@ -757,12 +757,11 @@ qwen sessions list --json | jq .
757
757
 
758
758
  #### `qwen sessions ps`
759
759
 
760
- Lists the interactive Qwen Code sessions running on this machine right
761
- now. `sessions list` walks saved transcripts ("what have I worked on");
762
- this walks the live-process registry ("what is running at this moment").
763
- Records left behind by a killed session are swept as they are found.
764
- Headless sessions (`qwen -p`) do not register with the live-process
765
- registry, so they are not shown.
760
+ Lists the Qwen Code sessions registered on this machine right now.
761
+ `sessions list` walks saved transcripts ("what have I worked on"); this
762
+ walks the live-process registry ("what is running at this moment").
763
+ Records left behind by a killed session are swept as they are found. A
764
+ one-shot `qwen -p` run never registers, so it is never shown.
766
765
 
767
766
  **Flags:**
768
767
 
@@ -772,7 +771,16 @@ registry, so they are not shown.
772
771
 
773
772
  **Human-readable output (default):**
774
773
 
775
- A table with columns: NAME, PID, AGE, DIRECTORY.
774
+ A table with columns: NAME, KIND, PID, AGE, DIRECTORY.
775
+
776
+ KIND says what registered the session — `tui` for someone at a terminal,
777
+ `external` for a program that is not a Qwen Code session at all (a voice
778
+ front-end, a relay), and `headless` or `serve` for a session another
779
+ program drives. It is a self-report, like NAME and DIRECTORY: every field
780
+ here was written by the process it describes, and nothing about what a
781
+ session is allowed to do depends on it. See
782
+ [Cross-Session Protocol](./cross-session-protocol.md) for the record
783
+ format and for how to register a program of your own.
776
784
 
777
785
  **JSON output (`--json`):**
778
786
 
@@ -781,7 +789,7 @@ object with fields:
781
789
 
782
790
  ```
783
791
  schemaVersion, pid, procStart, pidNs, sessionId, cwd, name, startedAt,
784
- qwenVersion, ipcPath (when peer messaging is available)
792
+ qwenVersion, kind, ipcPath (when peer messaging is available)
785
793
  ```
786
794
 
787
795
  Nothing else is written to stdout — an empty listing prints nothing at
@@ -871,14 +879,50 @@ session registry rather than deriving it.
871
879
 
872
880
  The `send_message` call only confirms the message was handed to the other
873
881
  session. What became of it arrives later as a receipt: if it was held,
874
- declined, refused, expired, or misaddressed (the address changed hands —
875
- list the agents again) — or released after a hold — a notice appears in
876
- the sending session's transcript (`Message to <name>: …`). Declined and
877
- refused are different answers: declined means someone reviewed the
878
- message and said no, while refused means that session's
879
- `agents.crossSessionInbound` is `refuse` and nobody saw it at all. The
880
- model that sent it is not told; if the other session replies, the reply
881
- arrives as a cross-session message.
882
+ declined, refused, dropped, expired, or misaddressed (the address changed
883
+ hands — list the agents again) — or released after a hold — a notice
884
+ appears in the sending session's transcript (`Message to <name>: …`).
885
+ Declined, refused and dropped are three different answers: declined means
886
+ someone reviewed the message and said no, refused means that session's
887
+ `agents.crossSessionInbound` is `refuse` and nobody saw it at all, and
888
+ dropped means its inbox turned the message away before any of that (see
889
+ below). The first drop is answered at once and the rest are folded into a
890
+ receipt every few seconds, each naming the messages it stands for, so a
891
+ run of them costs a handful of lines rather than one line each. The model that
892
+ sent it is not told; if the other session replies, the reply arrives as a
893
+ cross-session message.
894
+
895
+ ### Flood protection
896
+
897
+ A session accepts up to 30 messages at once from one sender and then one
898
+ every two seconds, and up to 32 at once from all senders together and
899
+ then one a second. The second limit exists because a sender names itself:
900
+ rotating that name gets a fresh allowance from the first limit but not
901
+ from the second. It is barely above the first because every accepted
902
+ message draws a receipt, and a session can only have so many of those
903
+ going out at once. A message from another session that repeats that
904
+ sender's previous message word for word within 30 seconds is also turned
905
+ away — a model looping on one sentence mints a fresh message id every
906
+ time, so the text is what catches it. Messages from a script the session
907
+ started and from a trusted controller are exempt from the repeat check,
908
+ because a hook reporting the same line twice is reporting two facts and a
909
+ person saying "continue" twice means it twice; both are still subject to
910
+ the rate limits. Finally, a message that is accepted but cannot be queued
911
+ because the session already has 50 waiting is turned away too.
912
+
913
+ A message turned away this way is never held, never shown to the model,
914
+ and leaves no record, so the sender can try again later and land. The
915
+ receiving session says so in its transcript at most once a minute per
916
+ sender, with a count of what that line stands for. The sending session
917
+ gets one receipt naming every message the burst cost it, and its
918
+ transcript says to fold what still matters into one later message rather
919
+ than re-sending.
920
+
921
+ The sending side does not wait to find out. Each session tracks what it
922
+ has sent to each address and refuses a send that the receiver would
923
+ drop, so the model is told to batch before the message is written rather
924
+ than after — and the receiver never spends a connection on a message it
925
+ was going to turn away.
882
926
 
883
927
  ### Inbox authentication and scripted injection
884
928
 
@@ -904,7 +948,10 @@ recognized as the session's own rather than as another session's.
904
948
 
905
949
  Give every injection a fresh `msgId`. The receiving gate remembers the
906
950
  ids it has already settled, so a hook that reuses one is delivered the
907
- first time and silently deduplicated on every run after that.
951
+ first time and silently deduplicated on every run after that. Repeating
952
+ the same _text_ is fine — the repeat check above does not apply to a
953
+ session's own processes — but the rate limits do apply, so a hook in a
954
+ loop is dropped like any other flood.
908
955
 
909
956
  An injected message still goes through the inbound gate and is marked as
910
957
  not coming from the user, but the gate knows it came from the session's
@@ -979,3 +1026,18 @@ on your behalf.
979
1026
  Anyone who holds the token can send as that controller, so treat it like
980
1027
  any other credential: give it to one program, keep it out of shared
981
1028
  config, and revoke it when that program is done.
1029
+
1030
+ ### Programs that are not Qwen Code sessions
1031
+
1032
+ Everything above works between sessions, but nothing in it is specific to
1033
+ one. A program that writes a registry record for itself and binds an
1034
+ inbox the same way is listed by `qwen sessions ps` and by `list_agents`,
1035
+ can be addressed by name from `send_message`, and receives delivery
1036
+ receipts for what it sends — a voice front-end, a relay, a build watcher.
1037
+ It should record `kind: "external"` so a listing can say what it is.
1038
+
1039
+ [Cross-Session Protocol](./cross-session-protocol.md) is the contract for
1040
+ writing one: the record schema and how liveness is judged, the socket
1041
+ paths and framing, the auth line, every frame field, the receipt states
1042
+ and their transitions, and what a receiver does with a message before its
1043
+ model sees it.
@@ -25,8 +25,8 @@ Node.js 22 or later and npm are required.
25
25
  When first used, the skill runs these commands itself:
26
26
 
27
27
  ```bash
28
- qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.2
29
- npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.3
28
+ qwen mcp add --scope user node-repl npx -y @qwen-code/node-repl-mcp@0.1.3
29
+ npm install --no-save --package-lock=false @qwen-code/cua-sdk@0.20.5
30
30
  ```
31
31
 
32
32
  Restart Qwen Code after the MCP server is first added. The skill then resumes
@@ -45,11 +45,13 @@ Ask Qwen Code to use `$computer-use` for the desktop task. After bootstrap, it
45
45
  follows the standard Computer Use workflow:
46
46
 
47
47
  1. discovers the exact application and window;
48
- 2. observes full accessibility state;
49
- 3. acts through current semantic element tokens when possible;
50
- 4. fetches fresh state after every mutation;
51
- 5. verifies the requested result; and
52
- 6. closes the SDK client and resets the REPL.
48
+ 2. observes full accessibility state, then accumulates automatic incremental
49
+ updates into the current state;
50
+ 3. performs one or more actions through current semantic element tokens,
51
+ including unchanged tokens retained across compatible diffs;
52
+ 4. fetches the latest state before deciding what to do next; and
53
+ 5. closes the SDK client and resets the REPL only when no other persistent
54
+ state is needed.
53
55
 
54
56
  The driver is the only component that computes observation diffs. Model code
55
57
  uses the typed SDK methods and does not dispatch arbitrary driver tool names.
@@ -0,0 +1,291 @@
1
+ # Cross-Session Protocol
2
+
3
+ This page is the contract for a program that wants to take part in
4
+ cross-session messaging without being a Qwen Code session: a voice
5
+ front-end, a relay daemon, a script that watches a build. It describes
6
+ what a session writes to the registry, what its inbox reads off a
7
+ connection, and what it sends back. Everything here is what the code
8
+ does today at schema version 1 and frame version 1; the last section
9
+ says what may change and how you will know.
10
+
11
+ Every value that crosses a process boundary is untrusted on arrival and
12
+ validated by the reader. Where this page says a field "must" have some
13
+ shape, a value that does not is dropped, never rejected with an error.
14
+
15
+ ## 1. The session registry
16
+
17
+ A running session publishes one record:
18
+
19
+ ```
20
+ $QWEN_HOME/sessions/<pid>.json (directory 0700, file 0600)
21
+ ```
22
+
23
+ `$QWEN_HOME` defaults to `~/.qwen`. The file name is the writer's PID
24
+ and nothing else; a record whose `pid` field disagrees with its file
25
+ name is ignored.
26
+
27
+ ```json
28
+ {
29
+ "schemaVersion": 1,
30
+ "pid": 41337,
31
+ "procStart": "a1b2c3d4-…-boot-uuid:8895124",
32
+ "pidNs": 4026531836,
33
+ "sessionId": "8e016be8-5b48-4c13-ad22-1f5326ae64ac",
34
+ "cwd": "/home/me/project",
35
+ "name": "project-3f",
36
+ "startedAt": 1788959000000,
37
+ "qwenVersion": "0.23.0",
38
+ "kind": "tui",
39
+ "ipcPath": "/run/user/1000/qwen-socks/41337.sock",
40
+ "ipcToken": "c0ffee…64 hex…"
41
+ }
42
+ ```
43
+
44
+ | Field | Meaning |
45
+ | --------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
46
+ | `schemaVersion` | Always `1`. A reader skips a record with a higher version and never deletes it. |
47
+ | `pid` | The writer's process id. Must equal the file name. |
48
+ | `procStart` | `<boot id>:<process start ticks>` on Linux (`/proc/sys/kernel/random/boot_id` and field 22 of `/proc/<pid>/stat`); `null` elsewhere. Guards against PID reuse, and against records written on another machine that shares this home directory. |
49
+ | `pidNs` | Inode number of `/proc/self/ns/pid` on Linux; `null` elsewhere. A reader only lists and sweeps records from its own namespace. |
50
+ | `sessionId` | The session's id. `/clear` and `/resume` swap it under the same PID, so re-read the record before each send. |
51
+ | `cwd` | Working directory at registration. |
52
+ | `name` | Display name. Derived from the cwd basename (Unicode letters, marks, digits, `.`, `_`, `-`; up to 32 code points) plus `-` and the first two hex characters of `sha256(sessionId)`, unless the writer chose one. Not unique. |
53
+ | `startedAt` | Epoch milliseconds. Newest first is the listing order and the tie-break between twins. |
54
+ | `qwenVersion` | Free text or `null`. |
55
+ | `kind` | What registered: `tui` (someone at a terminal), `headless`, `serve`, `external`. Lowercase ASCII, digits and dashes, at most 16 characters; anything else is dropped on read. Absent means a writer older than the field, which reads as `tui`. A label for listings — never a credential; see below. |
56
+ | `ipcPath` | The inbox socket, present only while it is bound. Absent means discoverable but not messageable. |
57
+ | `ipcToken` | 64 hex characters. What a connection to `ipcPath` presents on its auth line. Absent means the inbox requires none (records from older builds). |
58
+
59
+ **A record is a self-report.** Every field in it was written by the
60
+ process it describes, so `name`, `cwd` and `kind` are claims, not facts a
61
+ reader can lean on. Nothing that decides what a sender may do reads
62
+ them — that is settled by what a connection presents (§3) and by the
63
+ receiving session's own policy (§6). Set `kind` so a listing can group
64
+ sessions honestly; do not expect it to buy you anything.
65
+
66
+ **Writing your own record.** An external process that wants to be
67
+ found — listed by `qwen sessions ps`, addressable from `send_message`,
68
+ able to receive receipts — writes the same record for itself: its own
69
+ `pid`, `procStart` and `pidNs` computed the same way, a `sessionId` it
70
+ mints (any UUID), `kind: "external"`, a `name` (yours, or derived the
71
+ same way; it is flattened to one line and bounded when displayed), and
72
+ `ipcPath` + `ipcToken` for an inbox it binds itself (§2). Write to a
73
+ temp file in the same directory and `rename` over the target; create the
74
+ file 0600; refuse to write through a symlink. Remove the record on exit.
75
+ A record whose process is gone is swept by the next session that lists,
76
+ but only when `procStart` proves the PID is not merely reused.
77
+
78
+ **Reading.** Anything that can read the directory can read every record,
79
+ including tokens: being able to discover a session and being able to
80
+ authenticate to it are one capability by design. Do not print
81
+ `ipcToken` anywhere a model or a log can see it.
82
+
83
+ **Liveness.** A record is live when all of these hold: the file name
84
+ matches `pid`; `pidNs` equals the reader's; the boot id inside
85
+ `procStart` equals the reader's (or `procStart` is `null`); and the PID
86
+ is alive with the same start ticks. A live record with an `ipcPath`
87
+ still has to be dialed before it is advertised as reachable — a socket
88
+ file outlives a crash.
89
+
90
+ **Refs.** Displayed handles use `ref = sha256(sessionId)[0:6]`. Two
91
+ sessions may share a `name`; the address grammar a sender types is
92
+ `name`, `name [ref]`, `[ref]` or the bare `ref`, and an ambiguous
93
+ `name` is an error rather than a guess.
94
+
95
+ ## 2. The inbox socket
96
+
97
+ One UNIX domain socket per session, at the first of these that binds:
98
+
99
+ 1. `$XDG_RUNTIME_DIR/qwen-socks/<pid>.sock`
100
+ 2. `$TMPDIR/qwen-socks-<16 hex>/<pid>.sock`
101
+ 3. `/tmp/qwen-socks-<16 hex>/<pid>.sock`
102
+
103
+ The directory is 0700 and the socket 0600. A path longer than 103 bytes
104
+ is skipped. When the PID-keyed name is already held by a live listener
105
+ (two PID namespaces sharing a runtime directory), the session binds
106
+ `<pid>-<8 hex>.sock` next to it instead. Peers never derive a socket
107
+ path; they read `ipcPath` from the record.
108
+
109
+ A connection carries newline-delimited JSON, one object per line, UTF-8.
110
+ A single line longer than 1 MiB (measured in UTF-16 code units) drops
111
+ the connection. A connection that goes 30 seconds without completing a
112
+ line that parses is dropped; junk lines do not extend the deadline. The
113
+ listener accepts at most 64 connections at once.
114
+
115
+ The expected exchange is one message per connection: connect, write the
116
+ auth line and the frame in one write, half-close, wait for the peer to
117
+ close. The receiver never writes on the same connection; anything it
118
+ has to say comes back as a separate connection to your own `ipcPath`.
119
+
120
+ ## 3. The auth line
121
+
122
+ When the target record has an `ipcToken`, the first line must be:
123
+
124
+ ```json
125
+ { "msgV": 1, "type": "auth", "token": "<token>" }
126
+ ```
127
+
128
+ Three kinds of token are accepted, and the inbox remembers which one it
129
+ saw:
130
+
131
+ | Presented | The inbox concludes | Effect |
132
+ | ----------------------------------------------------------------------------- | ------------------------------ | -------------------------------------------------------------------------------- |
133
+ | The `ipcToken` from the target's registry record | an ordinary peer | subject to policy and mode parity (§6) |
134
+ | `QWEN_CODE_MESSAGING_TOKEN` from the target's own environment | a process that session started | delivered under the parity default; `origin="own-process"` |
135
+ | A controller token `qpc_<64 hex>` minted with `qwen sessions controllers add` | a program the user trusts | delivered under the parity default; `origin="controller"` with the grant's label |
136
+
137
+ A first line that is not an auth line, or that presents a token matching
138
+ none of the three, drops the connection silently. When the record has no
139
+ `ipcToken`, do not send an auth line; an older inbox reads it as an
140
+ unknown frame type and skips it, so leading with one is always safe.
141
+
142
+ Nothing here authenticates the _sender_: a token proves the connection is
143
+ allowed, not who opened it. `from`, `fromName`, `fromMode` and every
144
+ field of the record are claims.
145
+
146
+ This is also the whole of the trust model. A program the user wants
147
+ driving their sessions gets a controller token, minted by hand and given
148
+ to that one program; it is what makes the difference between a message
149
+ that is delivered and one that waits for review. Writing
150
+ `kind: "external"` or a familiar-looking `name` buys nothing.
151
+
152
+ ## 4. The user frame
153
+
154
+ ```json
155
+ {
156
+ "msgV": 1,
157
+ "msgId": "5f1d0c9e-3b2a-4e8f-9c7d-1a2b3c4d5e6f",
158
+ "type": "user",
159
+ "from": "/run/user/1000/qwen-socks/40011.sock",
160
+ "replyToken": "<my own ipcToken>",
161
+ "fromName": "project-3f",
162
+ "fromMode": "prompting",
163
+ "toSessionId": "8e016be8-…",
164
+ "priority": "next",
165
+ "message": { "role": "user", "content": "build finished, 0 failures" }
166
+ }
167
+ ```
168
+
169
+ | Field | Rule |
170
+ | ------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
171
+ | `msgV` | Number. Must be ≤ 1; higher is dropped. |
172
+ | `msgId` | `^[A-Za-z0-9][A-Za-z0-9_-]{0,63}$`, and must not canonicalize (dashes stripped, lower-cased) to `all`. Use a fresh UUID per message: the receiver remembers ids it has settled and repeats the old verdict for a re-sent one. |
173
+ | `type` | `"user"`. |
174
+ | `from` | Your `ipcPath`, if you have one. Where receipts go. Absent means no receipts. |
175
+ | `replyToken` | Your `ipcToken`, so the receiver can authenticate its receipts to you. |
176
+ | `fromName` | Display name; flattened to one line, at most 200 characters. |
177
+ | `fromMode` | `"prompting"` (a person reviews each action) or `"bypass"` (some actions apply without review). Absent means "asserts nothing", which is held for review (§6). |
178
+ | `toSessionId` | The `sessionId` you read from the record. A receiver holding a different id answers `misaddressed`. Always send it. |
179
+ | `priority` | `"now"` or `"next"`; anything else reads as `"next"`. Carried for a future interrupt path; today the receiver queues both for the next turn. |
180
+ | `message` | `role` must be `"user"`; `content` a non-empty string. |
181
+
182
+ Unknown fields are ignored.
183
+
184
+ ## 5. The delivery-status frame
185
+
186
+ The receiver reports what became of a message with one control frame per
187
+ outcome, sent to the message's `from` and authenticated with its
188
+ `replyToken`:
189
+
190
+ ```json
191
+ {
192
+ "msgV": 1,
193
+ "msgId": "<fresh id>",
194
+ "type": "control",
195
+ "action": "delivery_status",
196
+ "status": "held",
197
+ "origMsgId": "5f1d0c9e-…",
198
+ "from": "/run/user/1000/qwen-socks/41337.sock",
199
+ "reason": "Your message is held for the recipient user to review …"
200
+ }
201
+ ```
202
+
203
+ | `status` | When | What to do |
204
+ | -------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------- |
205
+ | `held` | Parked for the user to review. Repeated on a retry, and on a release that could not be queued. | Wait; a decision or an expiry follows. |
206
+ | `delivered` | Queued for the model. | Nothing. Not proof it was read. |
207
+ | `denied` | A person reviewed it and said no. | Do not re-send. |
208
+ | `refused` | The session's policy turns peer messages away; nobody saw it. Only ever the first receipt. | Stop; reach that user another way. |
209
+ | `expired` | A held message ran out its wait, the session exited with it unread, or it arrived while that session was shutting down. Can follow `held` or `delivered`. | Re-send later if it still matters. |
210
+ | `misaddressed` | `toSessionId` does not match the session at that address. | Re-read the registry. |
211
+ | `dropped` | The inbox turned it away before any policy ran (§6). | Treat as unsent. Do not retry in a loop; fold what matters into one later message. |
212
+
213
+ A `dropped` receipt carries two more fields. `dropReason` is
214
+ `rate-limited`, `duplicate` or `queue-full`. `droppedMsgIds` lists up to
215
+ 256 further ids the same receipt settles: a burst is answered with one
216
+ receipt rather than one each, so a sender moves every message it lost to
217
+ a terminal state from a single frame. Both are meaningless on any other
218
+ status and are ignored there.
219
+
220
+ `reason` is free text for a human. Order of receipts is not guaranteed
221
+ across connections; apply them as state transitions:
222
+
223
+ ```
224
+ pending → held | delivered | denied | refused | expired | misaddressed | dropped
225
+ held → delivered | denied | expired | misaddressed
226
+ delivered → expired | misaddressed
227
+ ```
228
+
229
+ Anything else is a repeat and should be ignored. A receipt for an id you
230
+ never sent is noise; ignore it. Receipts are best-effort on the
231
+ receiver's side: a full outbound limit or a dead `from` loses them
232
+ silently, so a sender must tolerate never hearing back.
233
+
234
+ Your own inbox receives these frames from the sessions you messaged. If
235
+ you only ever send, bind an inbox and give `from` anyway: without one you
236
+ are blind to every outcome above.
237
+
238
+ ## 6. What the receiver does with a message
239
+
240
+ In order:
241
+
242
+ 1. **Admission.** Per sender: a burst of 30, then one message every two seconds. All senders together: a burst of 32, then one a second — a sender names itself on the frame, so rotating that name buys a fresh allowance from the first limit but not the second. The same body from another session inside 30 seconds is a `duplicate`; a process the session started and a trusted controller are exempt from that check, and rate-limited like everyone else. A dropped message is never held, never delivered, and leaves no record, so a sender that waits out its burst and retries still lands.
243
+ 2. **Settled ids.** A `msgId` the gate already decided repeats its earlier verdict.
244
+ 3. **Policy.** `agents.crossSessionInbound` set to `accept`, `hold` or `refuse` wins. Unset: a process the session started or a trusted controller is accepted; otherwise a message is accepted only when `fromMode` names the same review class the receiver is in, and held in every other case, including when `fromMode` is absent.
245
+ 4. **Hold.** Up to 50 messages wait. A message arriving at a full buffer is `dropped` with `queue-full` rather than evicting one already parked. A held message expires after `agents.crossSessionHeldExpiry` (`1m`, `5m`, `10m`, `never`; default `5m`). The user releases or denies from `/peers`; a mode change re-evaluates the backlog.
246
+ 5. **Queue.** An accepted message joins the session's input queue, which holds at most 50 from peers. A full queue is `dropped` with `queue-full` too.
247
+
248
+ A sender does not have to discover the limits the hard way: a Qwen Code
249
+ session mirrors them per address and refuses its own send before writing
250
+ it, telling its model to batch instead.
251
+
252
+ The model sees a delivered message as:
253
+
254
+ ```
255
+ <cross_session_message from="/run/user/1000/qwen-socks/40011.sock" name="project-3f">
256
+ build finished, 0 failures
257
+ </cross_session_message>
258
+ ```
259
+
260
+ followed by a notice stating the sender's authority. `origin="own-process"`
261
+ or `origin="controller" controller="<label>"` is added by the receiver
262
+ from what the connection presented, never from the frame; a controller's
263
+ label comes from the grant the user minted, not from `fromName`. Tags
264
+ that look like the envelope are defanged inside `content`.
265
+
266
+ ## 7. Compatibility
267
+
268
+ - A reader ignores fields it does not know. Adding a field to a record or
269
+ a frame is not a breaking change.
270
+ - `schemaVersion` and `msgV` are bumped only for a change to the shape of
271
+ existing fields. A reader drops a frame or skips a record with a
272
+ version above what it knows, and never deletes such a record.
273
+ - New `status` values may appear; treat an unknown one as "no transition"
274
+ and keep waiting. The same goes for a `kind` you do not recognize:
275
+ show it, do not correct it.
276
+ - Constants that may change without notice: the burst and rate figures,
277
+ the hold ceiling and expiry choices, the 1 MiB line cap, the 30-second
278
+ line deadline, the 64-connection cap.
279
+
280
+ ## 8. Not settled yet
281
+
282
+ - **Name yielding.** Two sessions in one directory can register the same
283
+ `name`; today they are told apart only by `ref`. A registration that
284
+ yields to a live name, and a control frame that tells peers a session
285
+ renamed itself, are both still to come.
286
+ - **Same-name reporting.** `qwen sessions ps` and `list_agents` do not
287
+ flag records that still collide.
288
+ - **Daemon-managed sessions.** Only the interactive UI registers today, so
289
+ a session `qwen serve` drives is not in the registry, cannot be
290
+ addressed, and cannot send. The `serve` and `headless` kinds are
291
+ reserved for it.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Qwen Code can predict what you want to type next and show it as placeholder text in the input area. This feature uses an LLM call to analyze the conversation context and generate a natural next step suggestion.
4
4
 
5
- This feature works end-to-end in both the CLI and Web Shell. Generation is automatic and server-side: after each completed turn the daemon emits the suggestion on the session stream (on by default; set `ui.enableFollowupSuggestions` to `false` to opt out), and Web Shell's composer already wires the `useDaemonFollowupSuggestion` hook, so suggestions render and accept with no additional host wiring.
5
+ This feature works end-to-end in both the CLI and Web Shell. Generation is automatic and server-side: after each cleanly completed turn (the daemon's `end_turn` stop reason — a `cancelled`, `refusal`, `max_tokens`, or `max_turn_requests` turn gets none) the daemon emits the suggestion on the session stream (on by default; set `ui.enableFollowupSuggestions` to `false` to opt out), and Web Shell's composer already wires the `useDaemonFollowupSuggestion` hook, so suggestions render and accept with no additional host wiring.
6
6
 
7
7
  ## How It Works
8
8
 
@@ -36,7 +36,7 @@ Suggestions are generated when all of the following conditions are met:
36
36
  - The approval mode is not set to `plan`
37
37
  - The feature is enabled (on by default — set `ui.enableFollowupSuggestions` to `false` to turn it off)
38
38
 
39
- Suggestions will not appear in non-interactive mode (e.g., headless/SDK mode).
39
+ Suggestions will not appear in the CLI's non-interactive mode (e.g., headless/SDK mode). In the daemon, generation is server-side and runs after every turn that meets the conditions above, so a headless or SDK client that cannot render the suggestion should set `ui.enableFollowupSuggestions` to `false` to avoid the per-turn LLM cost.
40
40
 
41
41
  Suggestions are automatically dismissed when:
42
42
 
@@ -16,13 +16,19 @@ A Goal keeps Qwen Code working across turns until a stated condition is met. Set
16
16
 
17
17
  Creating, editing, or resuming a Goal requires a trusted workspace (`/trust`). Headless usage is covered in [Headless Mode](./headless.md#run-a-persistent-goal).
18
18
 
19
+ Once a Goal has billed a turn, the footer pill and every status card show what it has spent against the window it is allowed, as `1.2k/30.0m`. The figure counts the model calls the Goal makes in its own turns; subagents and the verifier's own checks are not included. The window is set by [`model.goalTokenBudget`](../configuration/settings.md); resuming a Goal that has spent its window grants another one on top of what it has already spent, so the figure reads `30.0m/60.0m` rather than starting over. A Goal with no budget shows only what it has spent. A Goal that has not billed a turn yet shows no figures at all.
20
+
21
+ Each turn the session takes on its own reports what the Goal has spent so far, how many turns are behind it, and — unless the Goal runs unbounded — the window it is allowed. Every such turn except the final wind-down hand-off also carries standing instructions to re-check the workspace rather than trust earlier turns' reports, to work toward the end state the objective asks for, to do something different when the previous turn changed nothing (from the second turn on, once there is a previous turn to judge), and to check every requirement against citable evidence before proposing that the Goal is done.
22
+
23
+ A long Goal periodically compresses the evidence it has recorded into checkpoint claims with a side model check, so later turns and the verifier still have it to cite. The check is bounded by [`model.goalCheckpointTimeoutSeconds`](../configuration/settings.md), 180 seconds by default. If its claims overrun the aggregate byte budget, or include a claim over the per-claim character limit, it makes one corrective model call and both calls share that ceiling. A check that does not finish in time is abandoned as inconclusive; it counts toward the checkpoint stall limit only when the evidence window has overflowed, while a non-overflowing check preserves the streak and retries on a later turn. The calls are streamed, so the per-request transport timeout bounds only connect and first response, and the ceiling itself stops at the stream guards' 15-minute lifetime cap because past that the guard, not the setting, ends the check. That 15-minute limit on the setting is fixed, and raising the stream guard's own cap does not lift it.
24
+
19
25
  ## Interrupting a Goal
20
26
 
21
27
  Cancelling a Goal turn pauses the Goal. Press Esc while the model is answering or while its tools are still running, and the turn stops, the Goal moves to `paused`, and the card and `/goal` both say why it stopped. Nothing continues until you run `/goal resume`.
22
28
 
23
29
  Typing a message while a Goal is active does not pause it. Your message runs as the next Goal turn, so use it to steer the work; use `/goal pause` or `/goal clear` to stop it.
24
30
 
25
- Every pause states its reason: that you interrupted it, that you ran `/goal pause`, that the session token limit blocked the next model request, or that the turn failed. A Goal stopped by a limit keeps the reason for that limit instead.
31
+ Every pause states its reason: that you interrupted it, that you ran `/goal pause`, that the session token limit blocked the next model request, that the turn failed, or that three turns in a row recorded nothing the verifier could judge and no proposal — Goal bookkeeping reads (`get_goal`, `update_goal`) do not count as progress. A Goal stopped by a limit keeps the reason for that limit instead.
26
32
 
27
33
  ## How a Goal is judged
28
34
 
@@ -50,6 +56,8 @@ Put these into the objective, in this order:
50
56
 
51
57
  Keep it to one objective. `/goal set` and `/goal edit` accept any length, but stay roughly under 1,200 characters: the objective is re-sent on every Goal turn. An objective the model proposes through `propose_goal` is capped at 1,500 characters. Both commands collapse newlines to spaces, so number the items rather than relying on line breaks.
52
58
 
59
+ `Budget` is an instruction to the model about when to stop and report a blocker. Writing a turn count or time limit in the objective does not configure a runtime timer or change the Goal's token budget.
60
+
53
61
  | Weak | Why it fails | Stronger |
54
62
  | -------------------------- | ----------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
55
63
  | make checkout faster | No threshold, no check. | `Outcome: checkout p95 is below 250 ms. Done when: 1) npm run bench:checkout exits 0 and prints p95 < 250 (paste the line); 2) npm test exits 0. Must not: change the benchmark or skip tests. Budget: stop as blocked after 20 turns.` |
@@ -59,9 +67,15 @@ Keep it to one objective. `/goal set` and `/goal edit` accept any length, but st
59
67
 
60
68
  ## Let `/goal-draft` write it
61
69
 
62
- `/goal-draft <what you want done>` is a bundled skill that does the above for you. It checks whether the request is a Goal at all, reads the workspace for the real test and lint commands instead of guessing, asks at most one round of multiple-choice questions when the answer changes the check or the scope, drafts the objective in the format above, runs the self-check, and hands it over: in an interactive session it proposes the objective through the `propose_goal` approval dialog described below, otherwise it prints a `/goal set …` line you can run as-is. It never starts the work itself, and nothing is set without your approval.
70
+ `/goal-draft <what you want done>` is a bundled skill that does the above for you. It reads only enough of the workspace to establish the scope and real verification commands, without running tests, building, installing dependencies, or starting services. It asks at most one round of questions when essential choices are unclear, then writes a compact objective, usually with 3–5 completion checks (fewer when enough). Explicit requirements are preserved; it does not add checks just to reach a count.
71
+
72
+ For an audit, completion means covering the agreed scenarios and reporting evidence, including reproduction steps for confirmed defects. Finding no defects is a valid result. The draft should not invent a minimum number of scenarios, evidence files, exploration rounds, or defects.
73
+
74
+ If a success criterion, command, input path, or essential decision cannot be established, the skill returns a draft marked "Needs clarification" with `<TODO: …>` items. It does not offer that draft for approval or print a runnable `/goal set` or `/goal edit` command. Nonessential defaults are marked `[ASSUMPTION]`; they do not stand in for missing success criteria.
75
+
76
+ Once the objective is ready, an interactive terminal session can show the `propose_goal` approval dialog described below. Web Shell and other ACP clients, headless runs, sessions with the tool disabled, and sessions with an active Goal receive a command to run manually instead. The hand-off says that the draft has not been applied. The skill never starts the work itself, and nothing is set without your approval.
63
77
 
64
- Pass an existing objective to tighten it: `/goal-draft all tests pass and the lint is clean`.
78
+ Pass an existing objective to tighten it: `/goal-draft all tests pass and the lint is clean`. For an active Goal, an explicit request to tighten it produces `/goal edit`; a replacement uses `/goal set`. If the intended operation is unclear, the skill includes that choice in its single round of questions.
65
79
 
66
80
  ### Approve a Goal the model proposes
67
81
 
@@ -131,6 +131,14 @@ When a session is restored, compatible background agents are added back to the s
131
131
 
132
132
  Use continuation for related follow-up work. Launch a new agent when the task is unrelated or the previous agent cannot be resumed.
133
133
 
134
+ ## Notification Queue
135
+
136
+ In the interactive TUI and ACP session, completion notifications from background agents, shells, monitors and workflows share a queue that drains into a model turn once the session is idle. These queues hold at most 20 notifications so a noisy producer cannot accumulate an unbounded backlog. The headless CLI's local queue is not capped by this rule.
137
+
138
+ When a 21st notification arrives, Qwen Code evicts an interim monitor pulse first — the monitor's next poll supersedes it — and otherwise the oldest queued notification. Agent results, workflow results and scheduled prompts are never evicted in the interactive TUI; a notification that would displace one is dropped instead, and so is an arriving pulse when only terminal results are queued.
139
+
140
+ Discarded notifications are reported rather than dropped quietly. The summary appears before the next notification in the live transcript. ACP also prefixes it to that turn's model input; the TUI keeps it parked for the next Notification batch so cron prompts still pass unchanged through slash, shell and `@` preprocessing. A daemon notification is recorded before it is acknowledged, so after a reload its durable record can precede the later overflow summary. ACP can discard a pending summary if the session is cleared or switched, or if a client cancels or preempts the notification turn. Discarding a notification never stops or deletes its task, and completed tasks retain their results; the summary points at `/tasks` and task output files when there is a task to inspect. A discarded scheduled prompt was never delivered and is not retried. A daemon notification that was recorded but could not be delivered live remains available in the session transcript and is reported separately from lost notifications.
141
+
134
142
  ## Agent Working Directory
135
143
 
136
144
  For a named regular subagent, `working_dir` pins the agent to an existing git worktree of the current repository. Relative paths resolve from the current directory, and the worktree must already be registered with git as a linked worktree of this repository.