@qwen-code/qwen-code 0.19.2 → 0.19.3-nightly.20260701.a974594d7

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 (291) hide show
  1. package/bundled/extension-creator/SKILL.md +357 -0
  2. package/bundled/loop/SKILL.md +34 -10
  3. package/bundled/loop/SKILL.test.ts +52 -0
  4. package/bundled/loop/autonomous-loop.test.ts +59 -0
  5. package/bundled/loop/autonomous-loop.ts +102 -0
  6. package/bundled/loop/loop-task-file.test.ts +1064 -0
  7. package/bundled/loop/loop-task-file.ts +404 -0
  8. package/bundled/loop/loop-tick-resolver.test.ts +864 -0
  9. package/bundled/loop/loop-tick-resolver.ts +416 -0
  10. package/bundled/qc-helper/SKILL.md +26 -19
  11. package/bundled/qc-helper/docs/configuration/auth.md +11 -11
  12. package/bundled/qc-helper/docs/configuration/model-providers.md +13 -13
  13. package/bundled/qc-helper/docs/configuration/settings.md +77 -75
  14. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -1
  15. package/bundled/qc-helper/docs/features/commands.md +108 -77
  16. package/bundled/qc-helper/docs/features/hooks.md +6 -1
  17. package/bundled/qc-helper/docs/features/memory.md +53 -1
  18. package/bundled/qc-helper/docs/features/status-line.md +3 -3
  19. package/bundled/qc-helper/docs/ide-integration/ide-integration.md +4 -4
  20. package/bundled/qc-helper/docs/qwen-serve.md +24 -2
  21. package/bundled/qc-helper/docs/support/tos-privacy.md +16 -3
  22. package/bundled/qc-helper/docs/support/troubleshooting.md +6 -0
  23. package/chunks/{MaxSizedBox-7RERNLFK.js → MaxSizedBox-UZHJ73JB.js} +29 -27
  24. package/chunks/{StandaloneSessionPicker-S22XBSN6.js → StandaloneSessionPicker-GGUIZWCE.js} +42 -37
  25. package/chunks/{acpAgent-4MCETHF2.js → acpAgent-QYZFICEZ.js} +1292 -332
  26. package/chunks/{agent-K3ENVYSB.js → agent-2EN7YNSW.js} +24 -23
  27. package/chunks/{agent-headless-HO3V3A3A.js → agent-headless-SLTEZ5LV.js} +24 -23
  28. package/chunks/{anthropicContentGenerator-E3TQ5XJJ.js → anthropicContentGenerator-CA3JTAMO.js} +33 -12
  29. package/chunks/{artifact-tool-QA4KRO3B.js → artifact-tool-RM7WINJO.js} +3 -3
  30. package/chunks/{askUserQuestion-HMWXW6VN.js → askUserQuestion-J3P6QAJ7.js} +2 -2
  31. package/chunks/{bridge-4LV2HBH2.js → bridge-HZVAUTMX.js} +29 -28
  32. package/chunks/{ca-7WC7ELX6.js → ca-RYOETBUW.js} +10 -9
  33. package/chunks/{chunk-JXQ23SNT.js → chunk-2JKEQWDZ.js} +623 -78
  34. package/chunks/chunk-32MCHZQC.js +73 -0
  35. package/chunks/{chunk-PXFFKNCO.js → chunk-35FH347N.js} +5308 -2500
  36. package/chunks/{chunk-5JZLXFPD.js → chunk-3O2BJMFW.js} +11 -11
  37. package/chunks/{chunk-2JD55C6G.js → chunk-3TK7FSCP.js} +2 -2
  38. package/chunks/{chunk-USGMPVOY.js → chunk-4722VFFU.js} +19 -10
  39. package/chunks/chunk-6FIWYVN4.js +4932 -0
  40. package/chunks/{chunk-I2RFAW6Q.js → chunk-7SP275SH.js} +7 -5
  41. package/chunks/{chunk-5R4SBCX6.js → chunk-AIBPG5MB.js} +3 -3
  42. package/chunks/{chunk-C4K3FEQ2.js → chunk-AVQDCKNF.js} +124 -21
  43. package/chunks/{chunk-OTBK43JR.js → chunk-B236XPGF.js} +1 -1
  44. package/chunks/{chunk-WA5OJGFL.js → chunk-B5MPZI4K.js} +458 -125
  45. package/chunks/{chunk-5DWXLGOM.js → chunk-BJBWRCSK.js} +1 -1
  46. package/chunks/{chunk-4W4T77MO.js → chunk-BLAE2TCO.js} +109 -6
  47. package/chunks/chunk-BMFMJINR.js +45 -0
  48. package/chunks/{chunk-T2VDEFUU.js → chunk-BZHLWC6T.js} +2 -2
  49. package/chunks/{chunk-XU5P23GN.js → chunk-CA4ML3VH.js} +3 -3
  50. package/chunks/{chunk-WGAEWQTF.js → chunk-DBR7PF4B.js} +1 -2
  51. package/chunks/{chunk-S566HKUS.js → chunk-DHXWNSJA.js} +15 -1
  52. package/chunks/{chunk-LLFFKXZZ.js → chunk-DJ25MIU2.js} +167 -43
  53. package/chunks/{chunk-KBXLIVWQ.js → chunk-DX3TKXNT.js} +2 -2
  54. package/chunks/{chunk-OIC6S73E.js → chunk-E5I6YSNO.js} +1 -1
  55. package/chunks/{chunk-TXVGVZYR.js → chunk-ESVSWG6Z.js} +3 -3
  56. package/chunks/{chunk-EX4W6ZYG.js → chunk-EUURTJY7.js} +1 -1
  57. package/chunks/{chunk-QBZ22PQX.js → chunk-EWALXUAD.js} +3 -1
  58. package/chunks/{chunk-F6XNTYNE.js → chunk-FQDMX5IL.js} +30 -307
  59. package/chunks/{chunk-3QFE4OTE.js → chunk-FR3II765.js} +4 -4
  60. package/chunks/{chunk-VYFMN7C6.js → chunk-FV4SQ54H.js} +382 -55
  61. package/chunks/{chunk-ZD3NW5KL.js → chunk-FZY7NH37.js} +63 -9
  62. package/chunks/{chunk-CI5O6SQL.js → chunk-G525INVW.js} +4 -4
  63. package/chunks/{chunk-CGOMICBE.js → chunk-GDIG7TMG.js} +34 -1
  64. package/chunks/{chunk-R2BXK7SX.js → chunk-GHOTR7HL.js} +6 -1
  65. package/chunks/{chunk-TZM5JIAX.js → chunk-GZKQ36JS.js} +10 -7
  66. package/chunks/{chunk-BS64PXY3.js → chunk-HIYUAXBG.js} +1 -1
  67. package/chunks/{chunk-TMBPDHXD.js → chunk-HTWHAN44.js} +1 -1
  68. package/chunks/{chunk-EL5IHQON.js → chunk-HUGAEYZR.js} +6 -27
  69. package/chunks/{chunk-2BIF2NVV.js → chunk-HWG4XLD7.js} +2 -2
  70. package/chunks/{chunk-I5T6PIBQ.js → chunk-I4MXURND.js} +1076 -954
  71. package/chunks/{chunk-JTYRZODB.js → chunk-IBEM64M4.js} +39 -11
  72. package/chunks/{chunk-XKBP7M7A.js → chunk-IKO44NAT.js} +149 -31
  73. package/chunks/{chunk-2BAQ3ACS.js → chunk-JERW36RG.js} +404 -4
  74. package/chunks/{chunk-TOEGRAVX.js → chunk-JV7A66DR.js} +28 -16
  75. package/chunks/{chunk-3RJ3ZPPR.js → chunk-KKQWC6WS.js} +7 -7
  76. package/chunks/{chunk-EXMX5YHG.js → chunk-KXVVXAAC.js} +1 -1
  77. package/chunks/{chunk-Z7XXFPGP.js → chunk-LDWTYE33.js} +1 -1
  78. package/chunks/{chunk-X6EDWN44.js → chunk-LWGLBVWA.js} +1 -1
  79. package/chunks/{chunk-NYOHZYHM.js → chunk-LXEW6BHF.js} +45 -3
  80. package/chunks/{chunk-BGUDAULQ.js → chunk-LXGWLOCM.js} +5 -5
  81. package/chunks/{chunk-ZUAXI2OA.js → chunk-M2U5NM24.js} +188 -11366
  82. package/chunks/{chunk-BNXANYLH.js → chunk-MOUXUCXQ.js} +81 -1
  83. package/chunks/{chunk-FPACXT7T.js → chunk-MTJVHQDP.js} +534 -164
  84. package/chunks/{chunk-UAARJR2G.js → chunk-N4V4VBP6.js} +2 -2
  85. package/chunks/chunk-NIOPRZNN.js +27 -0
  86. package/chunks/{chunk-2TJ3YN6Q.js → chunk-NOYV2NXI.js} +517 -490
  87. package/chunks/{chunk-PRYMDRBV.js → chunk-NPQWQYU6.js} +1 -1
  88. package/chunks/{chunk-J6AW7O5D.js → chunk-NVTRORSK.js} +2 -2
  89. package/chunks/{chunk-PF523XJX.js → chunk-OE5J6UA7.js} +1 -1
  90. package/chunks/{chunk-RS4HRC75.js → chunk-OEY3YAL2.js} +99 -8
  91. package/chunks/{chunk-R36VMVEP.js → chunk-PLQTLKMR.js} +5 -5
  92. package/chunks/{chunk-UN3C6GOR.js → chunk-PPFWEV7G.js} +10 -108
  93. package/chunks/chunk-Q3JOGB4U.js +481 -0
  94. package/chunks/{chunk-HG6YKEBI.js → chunk-Q7TDHJ2G.js} +192 -30
  95. package/chunks/{chunk-EW6C27XX.js → chunk-QHHNFG22.js} +9 -3
  96. package/chunks/chunk-QYUE6W3T.js +123 -0
  97. package/chunks/{chunk-GZCJS5WH.js → chunk-SJBIFVD2.js} +2 -2
  98. package/chunks/{chunk-3UALQ56H.js → chunk-T42ACHFI.js} +1 -1
  99. package/chunks/chunk-T44AF4I6.js +690 -0
  100. package/chunks/{chunk-DBZUXSSV.js → chunk-TMILTLP3.js} +6 -6
  101. package/chunks/{chunk-EEEZIVFJ.js → chunk-TOAUDIS7.js} +1 -1
  102. package/chunks/chunk-UAKXW3DN.js +30 -0
  103. package/chunks/{chunk-VQRYPFCV.js → chunk-V5YJAUHW.js} +10 -460
  104. package/chunks/{chunk-D5E5TMYH.js → chunk-VHRREANT.js} +16 -2
  105. package/chunks/{chunk-5RVSM6NW.js → chunk-VN4CKYUW.js} +1 -1
  106. package/chunks/chunk-VXGPYF7U.js +37 -0
  107. package/chunks/{chunk-UAARVVBI.js → chunk-WGY3GIPP.js} +1 -1
  108. package/chunks/{chunk-GYZQA2FO.js → chunk-WJAY4WXR.js} +1 -1
  109. package/chunks/chunk-XKSCTXPK.js +167 -0
  110. package/chunks/chunk-YCEHOJZJ.js +840 -0
  111. package/chunks/{chunk-BG4BIP7F.js → chunk-YCRTJYSQ.js} +4 -2
  112. package/chunks/{chunk-CGEGHF2C.js → chunk-YPCPZSZB.js} +1 -1
  113. package/chunks/chunk-YTFBURQD.js +313 -0
  114. package/chunks/{chunk-HGNSRCRB.js → chunk-YXK4GPYO.js} +1 -1
  115. package/chunks/{chunk-OQHQHJRK.js → chunk-Z34RYLRO.js} +151 -4775
  116. package/chunks/chunk-ZGSV5ORL.js +11273 -0
  117. package/chunks/{computer-use-6BBRNT6S.js → computer-use-FCNWHVPW.js} +103 -49
  118. package/chunks/{contextCommand-UJAJ6N57.js → contextCommand-FVFMZZEU.js} +26 -25
  119. package/chunks/{cron-create-4KQE6YLH.js → cron-create-IY5NMIHQ.js} +4 -4
  120. package/chunks/{cron-delete-THME66UP.js → cron-delete-OLNEQWKO.js} +6 -6
  121. package/chunks/{cron-list-7A54SJ5N.js → cron-list-YAUAUV24.js} +5 -5
  122. package/chunks/{daemon-status-provider-CSL3BUOY.js → daemon-status-provider-42JEXENZ.js} +32 -32
  123. package/chunks/{de-ACHALDED.js → de-HB5NJXGB.js} +10 -9
  124. package/chunks/{dist-BD27IA3L.js → dist-4FCNM6KJ.js} +2 -2
  125. package/chunks/{dist-OD2FY543.js → dist-K4XZILIO.js} +1 -1
  126. package/chunks/{dist-BOOH5JWN.js → dist-SU6L7ZNJ.js} +114 -9
  127. package/chunks/{dist-QHJRBCMP.js → dist-UKPWQJCL.js} +44 -2
  128. package/chunks/{dist-QFFZWACU.js → dist-VD7HXTML.js} +20 -9
  129. package/chunks/{earlyInputCapture-X6KMCSHD.js → earlyInputCapture-FFFEC6P4.js} +25 -24
  130. package/chunks/{edit-7J6WXARF.js → edit-32ILSGZY.js} +72 -30
  131. package/chunks/{en-NCUBOJOY.js → en-U3LWGSFX.js} +19 -9
  132. package/chunks/{enter-worktree-KULCKJPJ.js → enter-worktree-XWZKIN6A.js} +24 -23
  133. package/chunks/{enterPlanMode-H2CIOLMH.js → enterPlanMode-LPFFY7BJ.js} +24 -23
  134. package/chunks/{errors-6G2JYR54.js → errors-UXBPYPI2.js} +26 -25
  135. package/chunks/{exit-worktree-ECBWBVC5.js → exit-worktree-IBS4UIU7.js} +24 -23
  136. package/chunks/{exitPlanMode-DQV56GTW.js → exitPlanMode-JA72YHII.js} +24 -23
  137. package/chunks/{fast-path-35JJFS3C.js → fast-path-7UU67Y2W.js} +30 -13
  138. package/chunks/{fast-path-settings-TSVI53EB.js → fast-path-settings-UQLRFDQP.js} +3 -2
  139. package/chunks/{fr-GVKZ27MF.js → fr-XY3NQFCM.js} +10 -9
  140. package/chunks/{gemini-NDTG7WAX.js → gemini-GMVKJNMX.js} +211 -105
  141. package/chunks/{geminiContentGenerator-XTG6SFLA.js → geminiContentGenerator-7NIFF2L4.js} +4 -4
  142. package/chunks/{glob-SJ2JBZK4.js → glob-4NJCW5HI.js} +24 -23
  143. package/chunks/{grep-BRMWFEWR.js → grep-PAIMLQEL.js} +24 -23
  144. package/chunks/{initializer-P5AXF7PV.js → initializer-R6KU4VYM.js} +31 -28
  145. package/chunks/{ja-FKZ2WZ4D.js → ja-J7YAG7SA.js} +10 -9
  146. package/chunks/{keychain-token-storage-CSYMNRPP.js → keychain-token-storage-GPAKRDKQ.js} +2 -2
  147. package/chunks/{list-6COK34BP.js → list-H7LXAO64.js} +32 -29
  148. package/chunks/{loadedSettingsAdapter-XIUTN245.js → loadedSettingsAdapter-H27JMTLU.js} +30 -27
  149. package/chunks/{loop-wakeup-33GPXJLA.js → loop-wakeup-Y3OIRQFM.js} +7 -7
  150. package/chunks/{ls-BYQY7RVV.js → ls-TVJEYS7O.js} +4 -4
  151. package/chunks/{lsp-X54RO4IV.js → lsp-JZSDVR3F.js} +2 -2
  152. package/chunks/{monitor-DH7KFSJV.js → monitor-JSIHDPXP.js} +24 -23
  153. package/chunks/nonInteractiveCli-Y4CHOETG.js +100 -0
  154. package/chunks/{notebook-edit-D4R4ZLMA.js → notebook-edit-SHRNL2UM.js} +52 -23
  155. package/chunks/{openaiContentGenerator-F74IPQ6E.js → openaiContentGenerator-ORZZ7VFO.js} +13 -12
  156. package/chunks/{pt-SY5NCFGR.js → pt-6RTAA6SS.js} +10 -9
  157. package/chunks/{qwenContentGenerator-ATTK5P4D.js → qwenContentGenerator-H643PL2G.js} +26 -25
  158. package/chunks/{qwenOAuth2-K4AASPCV.js → qwenOAuth2-OI2B7PES.js} +5 -4
  159. package/chunks/{read-file-767G23OY.js → read-file-5PRNPTTY.js} +8 -8
  160. package/chunks/{read-mcp-resource-I5HCZJ6X.js → read-mcp-resource-QTXGKTEV.js} +2 -2
  161. package/chunks/{ripGrep-4OMMGSWX.js → ripGrep-JIKZMABJ.js} +24 -23
  162. package/chunks/{ru-FWNXJG4F.js → ru-AUBGJ2C4.js} +10 -9
  163. package/chunks/{run-qwen-serve-REKSTYRA.js → run-qwen-serve-PQV7QOHZ.js} +284 -52
  164. package/chunks/{scheduler-UNTFDQLG.js → scheduler-OS3R5MGU.js} +24 -23
  165. package/chunks/{send-message-2DAFXEYP.js → send-message-DKGHWSTF.js} +2 -2
  166. package/chunks/{serve-KZ56QB5S.js → serve-LVYZDKCZ.js} +31 -29
  167. package/chunks/{server-BV5TZUMU.js → server-P4YIH35I.js} +11458 -8447
  168. package/chunks/{session-OIBXFSGD.js → session-DE4TZBKH.js} +195 -58
  169. package/chunks/{settings-WJTCBIRA.js → settings-DFTYMJYF.js} +30 -27
  170. package/chunks/{shell-WC52IBHW.js → shell-3GNQLNV7.js} +24 -23
  171. package/chunks/{skill-U7F7JR4M.js → skill-NCNG4KKZ.js} +38 -11
  172. package/chunks/{spawnChannel-EI2E5BCW.js → spawnChannel-DHRIMDVL.js} +26 -25
  173. package/chunks/{src-4F6FBZFI.js → src-PNZYGM3R.js} +104 -28
  174. package/chunks/{startInteractiveUI-SFRVB3CE.js → startInteractiveUI-P6GZBFQW.js} +2817 -2500
  175. package/chunks/{syntheticOutput-PPS3HDVA.js → syntheticOutput-X7L5HWLN.js} +3 -3
  176. package/chunks/{task-create-OUYCA553.js → task-create-AWEUI4GI.js} +6 -6
  177. package/chunks/{task-list-WAX7I2IA.js → task-list-KZ3VJLDU.js} +5 -5
  178. package/chunks/{task-stop-CAIL6FNH.js → task-stop-GUNOZKJ5.js} +2 -2
  179. package/chunks/{task-update-AHEO5OUT.js → task-update-Y56GP6DU.js} +6 -6
  180. package/chunks/{team-create-3WC7CIIW.js → team-create-6JMW3KQK.js} +24 -23
  181. package/chunks/{team-delete-HGHFG23B.js → team-delete-6AFRGDJY.js} +5 -5
  182. package/chunks/{theme-manager-DICFCT3P.js → theme-manager-FEHQO22G.js} +25 -24
  183. package/chunks/{todoWrite-IFBMN3FH.js → todoWrite-JRS6NOEU.js} +4 -4
  184. package/chunks/{tool-search-L5K7HLER.js → tool-search-IXAEKS7J.js} +101 -16
  185. package/chunks/trustedFolders-SJRXNHZE.js +76 -0
  186. package/chunks/types-QX5C3CHJ.js +12 -0
  187. package/chunks/{validateNonInterActiveAuth-GCH4Z6KI.js → validateNonInterActiveAuth-HCH7OBDH.js} +56 -51
  188. package/chunks/{web-fetch-B5IIQ5TT.js → web-fetch-RELNL37A.js} +29 -15
  189. package/chunks/{workflow-OB3AND7I.js → workflow-M2COBI7R.js} +38 -32
  190. package/chunks/{workspace-providers-status-ZIR5EPOO.js → workspace-providers-status-GOCWYDMK.js} +32 -29
  191. package/chunks/workspace-service-34C7SUBU.js +75 -0
  192. package/chunks/{write-file-SEXBNDZM.js → write-file-E52WRXZL.js} +67 -31
  193. package/chunks/{zh-RBEGQVQT.js → zh-F5T4WWZO.js} +19 -9
  194. package/chunks/{zh-TW-QGAVRXT3.js → zh-TW-LKLBTZHE.js} +19 -9
  195. package/cli-entry.js +20 -9
  196. package/cli.js +6 -6
  197. package/locales/ca.js +15 -13
  198. package/locales/de.js +15 -13
  199. package/locales/en.js +31 -13
  200. package/locales/fr.js +16 -14
  201. package/locales/ja.js +15 -14
  202. package/locales/pt.js +15 -13
  203. package/locales/ru.js +15 -13
  204. package/locales/zh-TW.js +28 -12
  205. package/locales/zh.js +28 -12
  206. package/node_modules/@qwen-code/audio-capture/dist/index.d.ts +35 -0
  207. package/node_modules/@qwen-code/audio-capture/dist/index.js +48 -0
  208. package/node_modules/@qwen-code/audio-capture/dist/index.js.map +1 -0
  209. package/node_modules/@qwen-code/audio-capture/dist/platform.d.ts +7 -0
  210. package/node_modules/@qwen-code/audio-capture/dist/platform.js +18 -0
  211. package/node_modules/@qwen-code/audio-capture/dist/platform.js.map +1 -0
  212. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/LICENSE +21 -0
  213. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/README.md +58 -0
  214. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/SECURITY.md +5 -0
  215. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/bin.js +84 -0
  216. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/build-test.js +19 -0
  217. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/index.js +6 -0
  218. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/node-gyp-build.js +207 -0
  219. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/optional.js +7 -0
  220. package/node_modules/@qwen-code/audio-capture/node_modules/node-gyp-build/package.json +43 -0
  221. package/node_modules/@qwen-code/audio-capture/package.json +30 -0
  222. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  223. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  224. package/node_modules/@qwen-code/audio-capture/prebuilds/linux-arm64/@qwen-code+audio-capture.node +0 -0
  225. package/node_modules/@qwen-code/audio-capture/prebuilds/linux-x64/@qwen-code+audio-capture.node +0 -0
  226. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  227. package/package.json +18 -6
  228. package/patches/chrome-devtools-mcp+1.4.0.patch +31 -0
  229. package/postinstall.js +50 -0
  230. package/web-shell/assets/{arc-D_ae_Y9k.js → arc-C2DILvUl.js} +1 -1
  231. package/web-shell/assets/{architectureDiagram-3BPJPVTR-BMLRjppa.js → architectureDiagram-3BPJPVTR-b8gZ2cNw.js} +1 -1
  232. package/web-shell/assets/{blockDiagram-GPEHLZMM-qVDQC8KL.js → blockDiagram-GPEHLZMM-BuRpghMj.js} +1 -1
  233. package/web-shell/assets/{c4Diagram-AAUBKEIU-CxWS6MBd.js → c4Diagram-AAUBKEIU-2ItdhFmE.js} +1 -1
  234. package/web-shell/assets/channel-eRvn2UA3.js +1 -0
  235. package/web-shell/assets/{chunk-2J33WTMH-BtNuY5Yp.js → chunk-2J33WTMH-B1QXa0q3.js} +1 -1
  236. package/web-shell/assets/{chunk-4BX2VUAB-BU-x368d.js → chunk-4BX2VUAB-DXfhKlNq.js} +1 -1
  237. package/web-shell/assets/{chunk-55IACEB6-DRgTLvBu.js → chunk-55IACEB6-ClSNjxLo.js} +1 -1
  238. package/web-shell/assets/{chunk-727SXJPM-D2aElv7q.js → chunk-727SXJPM-Dsh2wisB.js} +1 -1
  239. package/web-shell/assets/{chunk-AQP2D5EJ-BwHCMRQ0.js → chunk-AQP2D5EJ-C1TkY5AR.js} +1 -1
  240. package/web-shell/assets/{chunk-FMBD7UC4-BMyPH-ku.js → chunk-FMBD7UC4-CGtN9XR6.js} +1 -1
  241. package/web-shell/assets/{chunk-ND2GUHAM-BNKTstUf.js → chunk-ND2GUHAM-BHiPi1SS.js} +1 -1
  242. package/web-shell/assets/{chunk-QZHKN3VN-gD3vsFId.js → chunk-QZHKN3VN-CzG3I5o1.js} +1 -1
  243. package/web-shell/assets/classDiagram-4FO5ZUOK-YZNwy1rx.js +1 -0
  244. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-YZNwy1rx.js +1 -0
  245. package/web-shell/assets/{cose-bilkent-S5V4N54A-BG9FAsXE.js → cose-bilkent-S5V4N54A-EgrIoH_K.js} +1 -1
  246. package/web-shell/assets/{dagre-BM42HDAG-Cy1sR7om.js → dagre-BM42HDAG-BUnpdX8S.js} +1 -1
  247. package/web-shell/assets/default-aEtf0G7-.svg +1 -0
  248. package/web-shell/assets/{diagram-2AECGRRQ-Bxi1I_Vu.js → diagram-2AECGRRQ-BlLUCVYu.js} +1 -1
  249. package/web-shell/assets/{diagram-5GNKFQAL-BGCJjO6y.js → diagram-5GNKFQAL-FG-enmjQ.js} +1 -1
  250. package/web-shell/assets/{diagram-KO2AKTUF-CMTeLXp7.js → diagram-KO2AKTUF-BlzmTONk.js} +1 -1
  251. package/web-shell/assets/{diagram-LMA3HP47-BN1wyAGh.js → diagram-LMA3HP47-CoBQ8mIx.js} +1 -1
  252. package/web-shell/assets/{diagram-OG6HWLK6-UYSG_zcp.js → diagram-OG6HWLK6-DvxV6sX8.js} +1 -1
  253. package/web-shell/assets/{erDiagram-TEJ5UH35-DqXL08lw.js → erDiagram-TEJ5UH35-Jq1tpAoj.js} +1 -1
  254. package/web-shell/assets/{flowDiagram-I6XJVG4X-BPJ9SFji.js → flowDiagram-I6XJVG4X-CbtYOry5.js} +1 -1
  255. package/web-shell/assets/{ganttDiagram-6RSMTGT7-BEd9Pnms.js → ganttDiagram-6RSMTGT7-ZEn2VEKR.js} +1 -1
  256. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-DrNRH3oi.js → gitGraphDiagram-PVQCEYII-BZh-LkhJ.js} +1 -1
  257. package/web-shell/assets/index-5FhE0ORO.css +5 -0
  258. package/web-shell/assets/index-CDTGmqVm.js +720 -0
  259. package/web-shell/assets/{infoDiagram-5YYISTIA-CFYBrkVI.js → infoDiagram-5YYISTIA-B9HuZygK.js} +1 -1
  260. package/web-shell/assets/insert-DmRbh9Rv.svg +1 -0
  261. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-Dxsddth7.js → ishikawaDiagram-YF4QCWOH-D76cNpYG.js} +1 -1
  262. package/web-shell/assets/{journeyDiagram-JHISSGLW-DxaDK80t.js → journeyDiagram-JHISSGLW-6bGo7P1t.js} +1 -1
  263. package/web-shell/assets/{kanban-definition-UN3LZRKU-Q0jQCOct.js → kanban-definition-UN3LZRKU-DuYyRBvB.js} +1 -1
  264. package/web-shell/assets/{linear-DGGM2kcP.js → linear-CpdSW1BC.js} +1 -1
  265. package/web-shell/assets/{mermaid.core-ByoxnWut.js → mermaid.core-s5xbZMMj.js} +5 -5
  266. package/web-shell/assets/{mindmap-definition-RKZ34NQL-C0ZseHsi.js → mindmap-definition-RKZ34NQL-go01fZ2y.js} +1 -1
  267. package/web-shell/assets/{pieDiagram-4H26LBE5-MQXNhl5A.js → pieDiagram-4H26LBE5-BfuZiEHO.js} +1 -1
  268. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DIR4ee2A.js → quadrantDiagram-W4KKPZXB-DsoINqV6.js} +1 -1
  269. package/web-shell/assets/queue-DWpnpFgW.svg +1 -0
  270. package/web-shell/assets/{requirementDiagram-4Y6WPE33-BTR0UdYQ.js → requirementDiagram-4Y6WPE33-B7FU4LiU.js} +1 -1
  271. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-sfnhMELN.js → sankeyDiagram-5OEKKPKP-BEDjFnGB.js} +1 -1
  272. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DXczHOHH.js → sequenceDiagram-3UESZ5HK-gzmmL5tK.js} +1 -1
  273. package/web-shell/assets/{stateDiagram-AJRCARHV-DdE_KQFH.js → stateDiagram-AJRCARHV-BtHD4IN_.js} +1 -1
  274. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DFy6gLDd.js +1 -0
  275. package/web-shell/assets/{timeline-definition-PNZ67QCA-DIc61uE8.js → timeline-definition-PNZ67QCA-T_8gmMCf.js} +1 -1
  276. package/web-shell/assets/{vennDiagram-CIIHVFJN-BF7ODmxB.js → vennDiagram-CIIHVFJN-DdjuqnjO.js} +1 -1
  277. package/web-shell/assets/{wardley-L42UT6IY-3pc1MEaw.js → wardley-L42UT6IY-Cgtrvb37.js} +1 -1
  278. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-9jnPcZuP.js → wardleyDiagram-YWT4CUSO-BW3f3-yW.js} +1 -1
  279. package/web-shell/assets/{xychartDiagram-2RQKCTM6-DcthaZK6.js → xychartDiagram-2RQKCTM6-BUS9IKkc.js} +1 -1
  280. package/web-shell/index.html +2 -2
  281. package/chunks/chunk-B6HQGTYR.js +0 -410
  282. package/chunks/chunk-RKIZXJMB.js +0 -13
  283. package/chunks/headlessSafetyWarnings-LJ6FJX77.js +0 -57
  284. package/chunks/nonInteractiveCli-7575LBXP.js +0 -91
  285. package/chunks/workspace-service-OM5D4OI2.js +0 -60
  286. package/web-shell/assets/channel-DYPNiTww.js +0 -1
  287. package/web-shell/assets/classDiagram-4FO5ZUOK-p_g25Tni.js +0 -1
  288. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-p_g25Tni.js +0 -1
  289. package/web-shell/assets/index-CpOXWDPh.js +0 -714
  290. package/web-shell/assets/index-oVK7qhre.css +0 -5
  291. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BHUSEndU.js +0 -1
@@ -1,14 +1,12 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
- import {
4
- MID_TURN_QUEUE_DRAIN_METHOD
5
- } from "./chunk-QBZ22PQX.js";
6
3
  import {
7
4
  MCP_RESTART_SERVER_DEADLINE_MS
8
5
  } from "./chunk-P7M4GA57.js";
9
6
  import {
10
7
  BranchWhilePromptActiveError,
11
8
  CancelSentinelCollisionError,
9
+ CdWhilePromptActiveError,
12
10
  InvalidClientIdError,
13
11
  InvalidPermissionOptionError,
14
12
  InvalidRewindTargetError,
@@ -24,7 +22,10 @@ import {
24
22
  SessionShellDisabledError,
25
23
  WorkspaceMismatchError,
26
24
  isNotCurrentlyGeneratingCancelError
27
- } from "./chunk-S566HKUS.js";
25
+ } from "./chunk-DHXWNSJA.js";
26
+ import {
27
+ MID_TURN_QUEUE_DRAIN_METHOD
28
+ } from "./chunk-EWALXUAD.js";
28
29
  import {
29
30
  canonicalizeWorkspace
30
31
  } from "./chunk-SEZC2725.js";
@@ -35,7 +36,7 @@ import {
35
36
  } from "./chunk-ALX6BUYW.js";
36
37
  import {
37
38
  defaultSpawnChannelFactory
38
- } from "./chunk-EXMX5YHG.js";
39
+ } from "./chunk-KXVVXAAC.js";
39
40
  import {
40
41
  ClientSideConnection,
41
42
  PROTOCOL_VERSION,
@@ -49,15 +50,15 @@ import {
49
50
  STATUS_SCHEMA_VERSION,
50
51
  createIdleWorkspaceExtensionsStatus,
51
52
  createIdleWorkspaceHooksStatus
52
- } from "./chunk-D5E5TMYH.js";
53
+ } from "./chunk-VHRREANT.js";
53
54
  import {
54
55
  ShellExecutionService,
55
56
  TrustGateError
56
- } from "./chunk-PXFFKNCO.js";
57
+ } from "./chunk-35FH347N.js";
57
58
  import {
58
59
  DAEMON_TRACEPARENT_META_KEY,
59
60
  DAEMON_TRACESTATE_META_KEY
60
- } from "./chunk-WA5OJGFL.js";
61
+ } from "./chunk-B5MPZI4K.js";
61
62
  import {
62
63
  init_esbuild_shims
63
64
  } from "./chunk-A4BMJM77.js";
@@ -1099,7 +1100,7 @@ function sliceLineRange(content, startLine, endLine) {
1099
1100
  }
1100
1101
  __name(sliceLineRange, "sliceLineRange");
1101
1102
  var BridgeClient = class {
1102
- constructor(resolveEntry, resolvePendingRestoreEvents, mediator, permissionTimeoutMs, maxPendingPerSession, fileSystem, onModelPromoted, onModePromoted) {
1103
+ constructor(resolveEntry, resolvePendingRestoreEvents, mediator, permissionTimeoutMs, maxPendingPerSession, fileSystem, onModelPromoted, onModePromoted, clientMcpSender) {
1103
1104
  this.resolveEntry = resolveEntry;
1104
1105
  this.resolvePendingRestoreEvents = resolvePendingRestoreEvents;
1105
1106
  this.mediator = mediator;
@@ -1108,6 +1109,7 @@ var BridgeClient = class {
1108
1109
  this.fileSystem = fileSystem;
1109
1110
  this.onModelPromoted = onModelPromoted;
1110
1111
  this.onModePromoted = onModePromoted;
1112
+ this.clientMcpSender = clientMcpSender;
1111
1113
  }
1112
1114
  static {
1113
1115
  __name(this, "BridgeClient");
@@ -1254,6 +1256,9 @@ var BridgeClient = class {
1254
1256
  * treats that as "drain unsupported" and stops asking.
1255
1257
  */
1256
1258
  async extMethod(method, params) {
1259
+ if (method === SERVE_CONTROL_EXT_METHODS.clientMcpMessage) {
1260
+ return this.handleClientMcpMessage(params);
1261
+ }
1257
1262
  if (method !== MID_TURN_QUEUE_DRAIN_METHOD) {
1258
1263
  throw RequestError.methodNotFound(method);
1259
1264
  }
@@ -1283,6 +1288,52 @@ var BridgeClient = class {
1283
1288
  }
1284
1289
  return { messages };
1285
1290
  }
1291
+ /**
1292
+ * Reverse tool channel (issue #5626, Phase 2) — answer the child's
1293
+ * `qwen/control/client_mcp/message` ext-method. The child's session
1294
+ * `McpClientManager` calls this when its agent drives a client-hosted
1295
+ * (extension) MCP server: `params` carries the advertised `server` name and
1296
+ * the JSON-RPC `payload` (initialize / tools/list / tools/call / a
1297
+ * notification). We resolve the per-WS-connection sender via the injected
1298
+ * `clientMcpSender` lookup, deliver the payload over the daemon WS, and
1299
+ * return the correlated response as `{ payload }`.
1300
+ *
1301
+ * Rejects with ACP `methodNotFound` when no `clientMcpSender` is wired (Mode
1302
+ * A / tests can't host a client MCP server), and `invalidParams` when the
1303
+ * frame is malformed or the named server is no longer hosted (e.g. the
1304
+ * extension disconnected mid-turn) — the agent's `SdkControlClientTransport`
1305
+ * surfaces that as a transport error rather than hanging.
1306
+ */
1307
+ async handleClientMcpMessage(params) {
1308
+ if (!this.clientMcpSender) {
1309
+ throw RequestError.methodNotFound(
1310
+ SERVE_CONTROL_EXT_METHODS.clientMcpMessage
1311
+ );
1312
+ }
1313
+ const server = params["server"];
1314
+ if (typeof server !== "string" || server.length === 0) {
1315
+ throw RequestError.invalidParams(
1316
+ void 0,
1317
+ "`server` must be a non-empty string"
1318
+ );
1319
+ }
1320
+ const payload = params["payload"];
1321
+ if (payload === null || typeof payload !== "object") {
1322
+ throw RequestError.invalidParams(
1323
+ void 0,
1324
+ "`payload` must be a JSON-RPC message object"
1325
+ );
1326
+ }
1327
+ const send = this.clientMcpSender(server);
1328
+ if (!send) {
1329
+ throw RequestError.invalidParams(
1330
+ void 0,
1331
+ `client-hosted MCP server '${server}' is not currently connected`
1332
+ );
1333
+ }
1334
+ const response = await send(payload);
1335
+ return { payload: response };
1336
+ }
1286
1337
  /**
1287
1338
  * Handle child->bridge ACP `extNotification` calls. Six methods are
1288
1339
  * recognized — `qwen/notify/session/model-update`,
@@ -1912,15 +1963,18 @@ function broadcastPromptCancelledOnce(entry, sessionId, originatorClientId, reas
1912
1963
  }
1913
1964
  __name(broadcastPromptCancelledOnce, "broadcastPromptCancelledOnce");
1914
1965
  function broadcastTurnComplete(entry, sessionId, promptResult, promptId, originatorClientId) {
1915
- entry.events.publish({
1916
- type: "turn_complete",
1917
- data: {
1918
- sessionId,
1919
- stopReason: promptResult.stopReason ?? "end_turn",
1920
- ...promptId ? { promptId } : {}
1921
- },
1922
- ...originatorClientId ? { originatorClientId } : {}
1923
- });
1966
+ try {
1967
+ entry.events.publish({
1968
+ type: "turn_complete",
1969
+ data: {
1970
+ sessionId,
1971
+ stopReason: promptResult.stopReason ?? "end_turn",
1972
+ ...promptId ? { promptId } : {}
1973
+ },
1974
+ ...originatorClientId ? { originatorClientId } : {}
1975
+ });
1976
+ } catch {
1977
+ }
1924
1978
  }
1925
1979
  __name(broadcastTurnComplete, "broadcastTurnComplete");
1926
1980
  function extractErrorMessage(err) {
@@ -1963,16 +2017,19 @@ function broadcastTurnError(entry, sessionId, err, promptId, originatorClientId)
1963
2017
  const message = extractErrorMessage(err);
1964
2018
  const code = extractErrorCode(err);
1965
2019
  entry.retryAllowed = true;
1966
- entry.events.publish({
1967
- type: "turn_error",
1968
- data: {
1969
- sessionId,
1970
- message,
1971
- ...code ? { code } : {},
1972
- ...promptId ? { promptId } : {}
1973
- },
1974
- ...originatorClientId ? { originatorClientId } : {}
1975
- });
2020
+ try {
2021
+ entry.events.publish({
2022
+ type: "turn_error",
2023
+ data: {
2024
+ sessionId,
2025
+ message,
2026
+ ...code ? { code } : {},
2027
+ ...promptId ? { promptId } : {}
2028
+ },
2029
+ ...originatorClientId ? { originatorClientId } : {}
2030
+ });
2031
+ } catch {
2032
+ }
1976
2033
  }
1977
2034
  __name(broadcastTurnError, "broadcastTurnError");
1978
2035
  function hasControlCharacter(value) {
@@ -1985,11 +2042,26 @@ function hasControlCharacter(value) {
1985
2042
  return false;
1986
2043
  }
1987
2044
  __name(hasControlCharacter, "hasControlCharacter");
2045
+ function extractPromptText(prompt) {
2046
+ if (!Array.isArray(prompt)) return "";
2047
+ let hasImage = false;
2048
+ for (const block of prompt) {
2049
+ if (block["type"] === "image") {
2050
+ hasImage = true;
2051
+ }
2052
+ if (block["type"] === "text" && typeof block["text"] === "string" && block["text"].length > 0) {
2053
+ return block["text"];
2054
+ }
2055
+ }
2056
+ return hasImage ? "[image]" : "";
2057
+ }
2058
+ __name(extractPromptText, "extractPromptText");
1988
2059
  var DEFAULT_INIT_TIMEOUT_MS = 1e4;
1989
2060
  var PERSIST_TIMEOUT_MS = 5e3;
1990
2061
  var MCP_RESTART_TIMEOUT_MS = 3e5;
1991
2062
  var MCP_OAUTH_TIMEOUT_MS = 6e5;
1992
2063
  var DAEMON_RETRY_META_KEY = "qwen.daemon.retry";
2064
+ var DAEMON_CONTINUE_META_KEY = "qwen.daemon.continueLastTurn";
1993
2065
  var SESSION_RECAP_TIMEOUT_MS = 6e4;
1994
2066
  var SESSION_BTW_TIMEOUT_MS = 6e4;
1995
2067
  var SHELL_COMMAND_TIMEOUT_MS = 12e4;
@@ -2174,6 +2246,14 @@ function createAcpSessionBridge(opts) {
2174
2246
  const aliveChannels = /* @__PURE__ */ new Set();
2175
2247
  let inFlightChannelSpawn;
2176
2248
  const byId = /* @__PURE__ */ new Map();
2249
+ const toSessionSummary = /* @__PURE__ */ __name((entry) => ({
2250
+ sessionId: entry.sessionId,
2251
+ workspaceCwd: entry.workspaceCwd,
2252
+ createdAt: entry.createdAt,
2253
+ displayName: entry.displayName,
2254
+ clientCount: entry.clientIds.size,
2255
+ hasActivePrompt: entry.promptActive
2256
+ }), "toSessionSummary");
2177
2257
  const permissionConsensusQuorum = opts.permissionConsensusQuorum;
2178
2258
  if (permissionConsensusQuorum !== void 0 && (!Number.isInteger(permissionConsensusQuorum) || permissionConsensusQuorum < 1)) {
2179
2259
  throw new Error(
@@ -2294,7 +2374,14 @@ function createAcpSessionBridge(opts) {
2294
2374
  },
2295
2375
  originator
2296
2376
  );
2297
- }
2377
+ },
2378
+ // Reverse tool channel (issue #5626, Phase 2): forward the optional
2379
+ // client-hosted-MCP sender lookup so `BridgeClient.extMethod` can
2380
+ // answer `qwen/control/client_mcp/message` from the child by reaching
2381
+ // the per-WS-connection `ClientMcpRegistrar`. Omitted callers (tests,
2382
+ // Mode A) never host a client MCP server, so the method stays
2383
+ // unreachable.
2384
+ opts.clientMcpSender
2298
2385
  );
2299
2386
  const connection = new ClientSideConnection(() => client, channel.stream);
2300
2387
  const info = {
@@ -2750,6 +2837,7 @@ function createAcpSessionBridge(opts) {
2750
2837
  events,
2751
2838
  promptQueue: Promise.resolve(),
2752
2839
  pendingPromptCount: 0,
2840
+ pendingPromptList: [],
2753
2841
  midTurnMessageQueue: [],
2754
2842
  modelChangeQueue: Promise.resolve(),
2755
2843
  approvalModeQueue: Promise.resolve(),
@@ -2828,6 +2916,7 @@ function createAcpSessionBridge(opts) {
2828
2916
  // Late attachers get the same ACP state the original restore
2829
2917
  // caller saw; spawn-only sessions don't carry a state payload.
2830
2918
  state: existing.restoreState ?? {},
2919
+ hasActivePrompt: existing.promptActive,
2831
2920
  ...replayFieldsFor(existing, action)
2832
2921
  };
2833
2922
  }
@@ -2860,7 +2949,8 @@ function createAcpSessionBridge(opts) {
2860
2949
  ...restored,
2861
2950
  attached: true,
2862
2951
  clientId: registerClient(entry, req.clientId),
2863
- createdAt: entry.createdAt
2952
+ createdAt: entry.createdAt,
2953
+ hasActivePrompt: entry.promptActive
2864
2954
  };
2865
2955
  }
2866
2956
  if (byId.size + inFlightSpawns.size + inFlightRestores.size >= maxSessions) {
@@ -2948,6 +3038,7 @@ function createAcpSessionBridge(opts) {
2948
3038
  clientId: clientId2,
2949
3039
  createdAt: racedEntry.createdAt,
2950
3040
  state: racedEntry.restoreState ?? {},
3041
+ hasActivePrompt: racedEntry.promptActive,
2951
3042
  ...replayFieldsFor(racedEntry, action)
2952
3043
  };
2953
3044
  }
@@ -2969,6 +3060,7 @@ function createAcpSessionBridge(opts) {
2969
3060
  clientId,
2970
3061
  createdAt: entry.createdAt,
2971
3062
  state,
3063
+ hasActivePrompt: entry.promptActive,
2972
3064
  ...replayFieldsFor(entry, action)
2973
3065
  };
2974
3066
  })().finally(() => {
@@ -3059,7 +3151,7 @@ function createAcpSessionBridge(opts) {
3059
3151
  }
3060
3152
  __name(closeSessionImpl, "closeSessionImpl");
3061
3153
  startSessionReaper();
3062
- return {
3154
+ const bridgeApi = {
3063
3155
  getDaemonStatusSnapshot() {
3064
3156
  return {
3065
3157
  limits: {
@@ -3146,7 +3238,8 @@ function createAcpSessionBridge(opts) {
3146
3238
  workspaceCwd: existing.workspaceCwd,
3147
3239
  attached: true,
3148
3240
  clientId,
3149
- createdAt: existing.createdAt
3241
+ createdAt: existing.createdAt,
3242
+ hasActivePrompt: existing.promptActive
3150
3243
  };
3151
3244
  }
3152
3245
  const inFlight = inFlightSpawns.get(workspaceKey);
@@ -3170,7 +3263,12 @@ function createAcpSessionBridge(opts) {
3170
3263
  ).catch(() => {
3171
3264
  });
3172
3265
  }
3173
- return { ...session, attached: true, clientId };
3266
+ return {
3267
+ ...session,
3268
+ attached: true,
3269
+ clientId,
3270
+ hasActivePrompt: attachedEntry.promptActive
3271
+ };
3174
3272
  }
3175
3273
  }
3176
3274
  if (byId.size + inFlightSpawns.size + inFlightRestores.size >= maxSessions) {
@@ -3217,10 +3315,60 @@ function createAcpSessionBridge(opts) {
3217
3315
  promptSlotReleased = true;
3218
3316
  entry.pendingPromptCount = Math.max(0, entry.pendingPromptCount - 1);
3219
3317
  }, "releasePromptSlot");
3318
+ const promptId = context?.promptId ?? randomUUID2();
3319
+ const isQueued = entry.pendingPromptCount > 1;
3320
+ const pendingAbort = new AbortController();
3321
+ if (signal) {
3322
+ if (signal.aborted) {
3323
+ pendingAbort.abort(signal.reason);
3324
+ } else {
3325
+ signal.addEventListener(
3326
+ "abort",
3327
+ () => pendingAbort.abort(signal.reason),
3328
+ { once: true }
3329
+ );
3330
+ }
3331
+ }
3332
+ const pendingEntry = {
3333
+ promptId,
3334
+ queuedAt,
3335
+ ...originatorClientId !== void 0 ? { originatorClientId } : {},
3336
+ text: extractPromptText(req.prompt),
3337
+ abortController: pendingAbort,
3338
+ state: isQueued ? "queued" : "running"
3339
+ };
3340
+ entry.pendingPromptList.push(pendingEntry);
3341
+ if (isQueued) {
3342
+ entry.events.publish({
3343
+ type: "pending_prompt_added",
3344
+ data: {
3345
+ sessionId,
3346
+ promptId: pendingEntry.promptId,
3347
+ text: pendingEntry.text,
3348
+ queuedAt: pendingEntry.queuedAt
3349
+ },
3350
+ ...originatorClientId ? { originatorClientId } : {}
3351
+ });
3352
+ }
3220
3353
  const result = entry.promptQueue.then(
3221
3354
  () => telemetry.runWithContext(capturedContext, async () => {
3222
3355
  const queueWaitMs = Date.now() - queuedAt;
3223
3356
  telemetry.metrics?.promptQueueWait(queueWaitMs);
3357
+ if (pendingAbort.signal.aborted) {
3358
+ throw new DOMException("Prompt aborted", "AbortError");
3359
+ }
3360
+ if (pendingEntry.state === "queued") {
3361
+ pendingEntry.state = "running";
3362
+ entry.events.publish({
3363
+ type: "pending_prompt_started",
3364
+ data: {
3365
+ sessionId,
3366
+ promptId: pendingEntry.promptId,
3367
+ text: pendingEntry.text
3368
+ },
3369
+ ...originatorClientId ? { originatorClientId } : {}
3370
+ });
3371
+ }
3224
3372
  const dispatchStartMs = Date.now();
3225
3373
  try {
3226
3374
  return await telemetry.withSpan(
@@ -3238,13 +3386,11 @@ function createAcpSessionBridge(opts) {
3238
3386
  sessionId
3239
3387
  }
3240
3388
  );
3241
- if (signal?.aborted) {
3242
- throw new DOMException("Prompt aborted", "AbortError");
3243
- }
3244
3389
  assertLivePromptEntry(sessionId, entry);
3245
3390
  const requestedRetry = req.retry === true;
3246
3391
  const isRetry = requestedRetry && entry.retryAllowed;
3247
3392
  entry.retryAllowed = false;
3393
+ const isContinue = context?.continue === true;
3248
3394
  const promptRequest = (() => {
3249
3395
  const copy = {
3250
3396
  ...normalized
@@ -3252,9 +3398,13 @@ function createAcpSessionBridge(opts) {
3252
3398
  delete copy.retry;
3253
3399
  const meta = copy._meta && typeof copy._meta === "object" ? { ...copy._meta } : {};
3254
3400
  delete meta[DAEMON_RETRY_META_KEY];
3401
+ delete meta[DAEMON_CONTINUE_META_KEY];
3255
3402
  if (isRetry) {
3256
3403
  meta[DAEMON_RETRY_META_KEY] = true;
3257
3404
  }
3405
+ if (isContinue) {
3406
+ meta[DAEMON_CONTINUE_META_KEY] = true;
3407
+ }
3258
3408
  if (Object.keys(meta).length > 0) {
3259
3409
  copy._meta = meta;
3260
3410
  } else {
@@ -3273,7 +3423,7 @@ function createAcpSessionBridge(opts) {
3273
3423
  }
3274
3424
  try {
3275
3425
  entry.cancelBroadcast = false;
3276
- if (!isRetry) {
3426
+ if (!isRetry && !isContinue) {
3277
3427
  echoPromptToSessionBus(
3278
3428
  entry,
3279
3429
  promptRequest,
@@ -3315,6 +3465,12 @@ function createAcpSessionBridge(opts) {
3315
3465
  () => {
3316
3466
  },
3317
3467
  (err) => {
3468
+ if (err instanceof DOMException && err.name === "AbortError" && pendingEntry.state === "queued") {
3469
+ writeStderrLine(
3470
+ `sendPrompt: queued prompt removed before agent forward for session ${sessionId}`
3471
+ );
3472
+ return;
3473
+ }
3318
3474
  writeStderrLine(
3319
3475
  `sendPrompt: forward failed for session ${sessionId}: ${extractErrorMessage(err)}`
3320
3476
  );
@@ -3325,12 +3481,15 @@ function createAcpSessionBridge(opts) {
3325
3481
  "forward_failed"
3326
3482
  );
3327
3483
  cancelPendingForSession(sessionId);
3328
- entry.connection.cancel({ sessionId }).catch(() => {
3484
+ entry.connection.cancel({ sessionId }).catch((err2) => {
3485
+ writeStderrLine(
3486
+ `[pending-prompt] cancel forward failed after prompt abort session=${sessionId}: ${extractErrorMessage(err2)}`
3487
+ );
3329
3488
  });
3330
3489
  }
3331
3490
  ).catch(() => {
3332
3491
  });
3333
- if (!signal) return racedPromise;
3492
+ const abortSignal = pendingAbort.signal;
3334
3493
  const onAbort = /* @__PURE__ */ __name(() => {
3335
3494
  broadcastPromptCancelledOnce(
3336
3495
  entry,
@@ -3338,15 +3497,22 @@ function createAcpSessionBridge(opts) {
3338
3497
  originatorClientId
3339
3498
  );
3340
3499
  cancelPendingForSession(sessionId);
3341
- entry.connection.cancel({ sessionId }).catch(() => {
3500
+ entry.connection.cancel({ sessionId }).catch((err) => {
3501
+ writeStderrLine(
3502
+ `[pending-prompt] cancel forward failed after removePendingPrompt session=${sessionId}: ${extractErrorMessage(err)}`
3503
+ );
3342
3504
  });
3343
3505
  }, "onAbort");
3344
- if (signal.aborted) {
3506
+ if (abortSignal.aborted) {
3345
3507
  onAbort();
3346
3508
  } else {
3347
- signal.addEventListener("abort", onAbort, { once: true });
3348
- if (signal.aborted) onAbort();
3349
- racedPromise.finally(() => signal.removeEventListener("abort", onAbort)).catch(() => {
3509
+ abortSignal.addEventListener("abort", onAbort, {
3510
+ once: true
3511
+ });
3512
+ if (abortSignal.aborted) onAbort();
3513
+ racedPromise.finally(
3514
+ () => abortSignal.removeEventListener("abort", onAbort)
3515
+ ).catch(() => {
3350
3516
  });
3351
3517
  }
3352
3518
  return racedPromise;
@@ -3357,14 +3523,13 @@ function createAcpSessionBridge(opts) {
3357
3523
  }
3358
3524
  })
3359
3525
  );
3360
- const promptId = context?.promptId;
3361
3526
  result.then(
3362
3527
  (promptResult) => {
3363
3528
  broadcastTurnComplete(
3364
3529
  entry,
3365
3530
  sessionId,
3366
3531
  promptResult,
3367
- promptId,
3532
+ pendingEntry.promptId,
3368
3533
  originatorClientId
3369
3534
  );
3370
3535
  },
@@ -3374,7 +3539,7 @@ function createAcpSessionBridge(opts) {
3374
3539
  entry,
3375
3540
  sessionId,
3376
3541
  err,
3377
- promptId,
3542
+ pendingEntry.promptId,
3378
3543
  originatorClientId
3379
3544
  );
3380
3545
  }
@@ -3384,6 +3549,24 @@ function createAcpSessionBridge(opts) {
3384
3549
  () => void 0
3385
3550
  );
3386
3551
  result.finally(() => {
3552
+ const listIdx = entry.pendingPromptList.indexOf(pendingEntry);
3553
+ if (listIdx !== -1) {
3554
+ entry.pendingPromptList.splice(listIdx, 1);
3555
+ if (isQueued) {
3556
+ try {
3557
+ entry.events.publish({
3558
+ type: "pending_prompt_completed",
3559
+ data: {
3560
+ sessionId,
3561
+ promptId: pendingEntry.promptId,
3562
+ state: "completed"
3563
+ },
3564
+ ...originatorClientId ? { originatorClientId } : {}
3565
+ });
3566
+ } catch {
3567
+ }
3568
+ }
3569
+ }
3387
3570
  releasePromptSlot();
3388
3571
  if (entry.pendingPromptCount === 0 && entry.midTurnMessageQueue.length > 0) {
3389
3572
  writeStderrLine(
@@ -3616,6 +3799,59 @@ function createAcpSessionBridge(opts) {
3616
3799
  );
3617
3800
  return branchResult;
3618
3801
  },
3802
+ async changeSessionCwd(sessionId, req, context) {
3803
+ if (shuttingDown) throw new Error("AcpSessionBridge is shutting down");
3804
+ const entry = byId.get(sessionId);
3805
+ if (!entry) throw new SessionNotFoundError(sessionId);
3806
+ const originatorClientId = resolveTrustedClientId(
3807
+ entry,
3808
+ context?.clientId
3809
+ );
3810
+ const cdPromise = entry.promptQueue.then(async () => {
3811
+ if (entry.promptActive) {
3812
+ throw new CdWhilePromptActiveError(sessionId);
3813
+ }
3814
+ const ci = await ensureChannel();
3815
+ const raw = await ci.connection.extMethod(
3816
+ SERVE_CONTROL_EXT_METHODS.sessionCd,
3817
+ {
3818
+ sessionId,
3819
+ path: req.path
3820
+ }
3821
+ );
3822
+ const extResult = raw;
3823
+ if (typeof extResult?.previousCwd !== "string" || typeof extResult?.newCwd !== "string" || !Array.isArray(extResult?.warnings)) {
3824
+ throw new Error(
3825
+ `changeSessionCwd: unexpected response shape from agent: ${JSON.stringify(raw)}`
3826
+ );
3827
+ }
3828
+ if (extResult.previousCwd !== extResult.newCwd) {
3829
+ entry.events.publish({
3830
+ type: "session_cwd_changed",
3831
+ data: {
3832
+ sessionId,
3833
+ previousCwd: extResult.previousCwd,
3834
+ newCwd: extResult.newCwd
3835
+ },
3836
+ ...originatorClientId ? { originatorClientId } : {}
3837
+ });
3838
+ }
3839
+ return extResult;
3840
+ });
3841
+ entry.promptQueue = cdPromise.then(
3842
+ () => void 0,
3843
+ () => void 0
3844
+ );
3845
+ const result = await withTimeout(
3846
+ cdPromise,
3847
+ Math.max(initTimeoutMs, 3e4),
3848
+ "changeSessionCwd"
3849
+ );
3850
+ writeStderrLine(
3851
+ `qwen serve: session ${sessionId} cwd changed: ${result.previousCwd} -> ${result.newCwd}` + (result.warnings.length > 0 ? ` (warnings: ${result.warnings.join("; ")})` : "")
3852
+ );
3853
+ return { sessionId, ...result };
3854
+ },
3619
3855
  async closeSession(sessionId, context, closeOpts) {
3620
3856
  return closeSessionImpl(sessionId, context, closeOpts);
3621
3857
  },
@@ -3679,18 +3915,16 @@ function createAcpSessionBridge(opts) {
3679
3915
  const out = [];
3680
3916
  for (const entry of byId.values()) {
3681
3917
  if (entry.workspaceCwd === key) {
3682
- out.push({
3683
- sessionId: entry.sessionId,
3684
- workspaceCwd: entry.workspaceCwd,
3685
- createdAt: entry.createdAt,
3686
- displayName: entry.displayName,
3687
- clientCount: entry.clientIds.size,
3688
- hasActivePrompt: entry.promptActive
3689
- });
3918
+ out.push(toSessionSummary(entry));
3690
3919
  }
3691
3920
  }
3692
3921
  return out;
3693
3922
  },
3923
+ getSessionSummary(sessionId) {
3924
+ const entry = byId.get(sessionId);
3925
+ if (!entry) throw new SessionNotFoundError(sessionId);
3926
+ return toSessionSummary(entry);
3927
+ },
3694
3928
  recordHeartbeat(sessionId, context) {
3695
3929
  const entry = byId.get(sessionId);
3696
3930
  if (!entry) throw new SessionNotFoundError(sessionId);
@@ -3790,6 +4024,27 @@ function createAcpSessionBridge(opts) {
3790
4024
  { serverName }
3791
4025
  );
3792
4026
  },
4027
+ async getWorkspaceMcpResourcesStatus(serverName) {
4028
+ return requestWorkspaceStatus(
4029
+ SERVE_STATUS_EXT_METHODS.workspaceMcpResources,
4030
+ () => ({
4031
+ v: STATUS_SCHEMA_VERSION,
4032
+ workspaceCwd: boundWorkspace,
4033
+ serverName,
4034
+ initialized: false,
4035
+ acpChannelLive: false,
4036
+ resources: [],
4037
+ errors: [
4038
+ {
4039
+ kind: "mcp_resources",
4040
+ status: "not_started",
4041
+ hint: "spawn a session to populate"
4042
+ }
4043
+ ]
4044
+ }),
4045
+ { serverName }
4046
+ );
4047
+ },
3793
4048
  async getWorkspaceToolsStatus() {
3794
4049
  return requestWorkspaceStatus(
3795
4050
  SERVE_STATUS_EXT_METHODS.workspaceTools,
@@ -3853,6 +4108,39 @@ function createAcpSessionBridge(opts) {
3853
4108
  SERVE_CONTROL_EXT_METHODS.sessionGoalClear
3854
4109
  );
3855
4110
  },
4111
+ async continueSession(sessionId, context) {
4112
+ const entry = byId.get(sessionId);
4113
+ if (!entry) throw new SessionNotFoundError(sessionId);
4114
+ resolveTrustedClientId(entry, context?.clientId);
4115
+ const decision = await requestSessionStatus(sessionId, SERVE_CONTROL_EXT_METHODS.sessionContinue);
4116
+ if (!decision.accepted) {
4117
+ return decision;
4118
+ }
4119
+ const liveEntry = byId.get(sessionId);
4120
+ if (!liveEntry) throw new SessionNotFoundError(sessionId);
4121
+ const lastEventId = liveEntry.events.lastEventId;
4122
+ const promptId = context?.promptId;
4123
+ const promptPromise = bridgeApi.sendPrompt(
4124
+ sessionId,
4125
+ { sessionId, prompt: [] },
4126
+ void 0,
4127
+ {
4128
+ ...context?.clientId !== void 0 ? { clientId: context.clientId } : {},
4129
+ ...promptId !== void 0 ? { promptId } : {},
4130
+ continue: true
4131
+ }
4132
+ );
4133
+ promptPromise.catch((err) => {
4134
+ teeServeDebugLine(
4135
+ `continueSession: continuation turn failed for ${sessionId}: ${err instanceof Error ? err.message : String(err)}`
4136
+ );
4137
+ });
4138
+ return {
4139
+ ...decision,
4140
+ ...promptId !== void 0 ? { promptId } : {},
4141
+ lastEventId
4142
+ };
4143
+ },
3856
4144
  async getSessionStatsStatus(sessionId) {
3857
4145
  return requestSessionStatus(
3858
4146
  sessionId,
@@ -4177,6 +4465,44 @@ function createAcpSessionBridge(opts) {
4177
4465
  recap: response.recap ?? null
4178
4466
  };
4179
4467
  },
4468
+ getPendingPrompts(sessionId, context) {
4469
+ const entry = byId.get(sessionId);
4470
+ if (!entry) throw new SessionNotFoundError(sessionId);
4471
+ resolveTrustedClientId(entry, context?.clientId);
4472
+ return entry.pendingPromptList.map((p) => ({
4473
+ promptId: p.promptId,
4474
+ text: p.text,
4475
+ queuedAt: p.queuedAt,
4476
+ state: p.state,
4477
+ ...p.originatorClientId !== void 0 ? { originatorClientId: p.originatorClientId } : {}
4478
+ }));
4479
+ },
4480
+ removePendingPrompt(sessionId, promptId, context) {
4481
+ const entry = byId.get(sessionId);
4482
+ if (!entry) throw new SessionNotFoundError(sessionId);
4483
+ resolveTrustedClientId(entry, context?.clientId);
4484
+ const idx = entry.pendingPromptList.findIndex(
4485
+ (p) => p.promptId === promptId
4486
+ );
4487
+ if (idx === -1) return { removed: false };
4488
+ const target = entry.pendingPromptList[idx];
4489
+ writeStderrLine(
4490
+ `[pending-prompt] session=${sessionId} removing promptId=${promptId} state=${target.state}`
4491
+ );
4492
+ target.abortController.abort(
4493
+ new DOMException("Prompt removed by user", "AbortError")
4494
+ );
4495
+ entry.pendingPromptList.splice(idx, 1);
4496
+ try {
4497
+ entry.events.publish({
4498
+ type: "pending_prompt_completed",
4499
+ data: { sessionId, promptId, state: "removed" },
4500
+ ...target.originatorClientId ? { originatorClientId: target.originatorClientId } : {}
4501
+ });
4502
+ } catch {
4503
+ }
4504
+ return { removed: true };
4505
+ },
4180
4506
  enqueueMidTurnMessage(sessionId, message, context) {
4181
4507
  const entry = byId.get(sessionId);
4182
4508
  if (!entry) throw new SessionNotFoundError(sessionId);
@@ -4728,6 +5054,7 @@ function createAcpSessionBridge(opts) {
4728
5054
  }
4729
5055
  }
4730
5056
  };
5057
+ return bridgeApi;
4731
5058
  }
4732
5059
  __name(createAcpSessionBridge, "createAcpSessionBridge");
4733
5060
  async function withTimeout(p, ms, label) {