@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,7 +1,11 @@
1
1
  // Force strict mode and setup for ESM
2
2
  "use strict";
3
+ import {
4
+ RUNTIME_STARTUP_CANCELLED_MESSAGE
5
+ } from "./chunk-GHOTR7HL.js";
3
6
  import {
4
7
  CAPABILITIES_SCHEMA_VERSION,
8
+ ClientMcpSenderRegistry,
5
9
  SERVE_CAPABILITY_REGISTRY,
6
10
  allowOriginCors,
7
11
  allowOriginMode,
@@ -20,27 +24,29 @@ import {
20
24
  positiveFiniteOrNull,
21
25
  require_express,
22
26
  resolveWebShellDir
23
- } from "./chunk-FPACXT7T.js";
27
+ } from "./chunk-MTJVHQDP.js";
24
28
  import "./chunk-3HX5LZ6R.js";
25
29
  import "./chunk-7RYW5LQV.js";
26
30
  import {
27
31
  getCliVersion
28
- } from "./chunk-BS64PXY3.js";
32
+ } from "./chunk-HIYUAXBG.js";
33
+ import "./chunk-EWALXUAD.js";
29
34
  import {
30
35
  canonicalizeWorkspace
31
36
  } from "./chunk-SEZC2725.js";
32
- import {
33
- writeStderrLine,
34
- writeStdoutLine
35
- } from "./chunk-Y6Z2O3WR.js";
36
37
  import {
37
38
  loadServeFastPathSettings,
38
39
  preResolveServeFastPathHomeEnvOverrides
39
- } from "./chunk-3RJ3ZPPR.js";
40
+ } from "./chunk-KKQWC6WS.js";
40
41
  import {
41
42
  getGlobalQwenDirLite,
42
43
  resolveConfigPathLite
43
- } from "./chunk-UN3C6GOR.js";
44
+ } from "./chunk-PPFWEV7G.js";
45
+ import {
46
+ writeStderrLine,
47
+ writeStdoutLine
48
+ } from "./chunk-Y6Z2O3WR.js";
49
+ import "./chunk-QYUE6W3T.js";
44
50
  import "./chunk-5P5XGNYH.js";
45
51
  import "./chunk-SKAZWEV5.js";
46
52
  import "./chunk-UWCTAVOD.js";
@@ -347,10 +353,14 @@ __name(initDaemonLogger, "initDaemonLogger");
347
353
 
348
354
  // packages/cli/src/serve/run-qwen-serve.ts
349
355
  var QWEN_SERVER_TOKEN_ENV = "QWEN_SERVER_TOKEN";
356
+ var QWEN_SERVE_CLIENT_MCP_OVER_WS_ENV = "QWEN_SERVE_CLIENT_MCP_OVER_WS";
357
+ var QWEN_SERVE_CDP_TUNNEL_OVER_WS_ENV = "QWEN_SERVE_CDP_TUNNEL_OVER_WS";
350
358
  var QWEN_SERVE_PROMPT_DEADLINE_MS_ENV = "QWEN_SERVE_PROMPT_DEADLINE_MS";
351
359
  var QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS_ENV = "QWEN_SERVE_WRITER_IDLE_TIMEOUT_MS";
352
360
  var SHUTDOWN_FORCE_CLOSE_MS = 5e3;
353
361
  var DEFAULT_RUNTIME_STARTUP_TIMEOUT_MS = 12e4;
362
+ var FAST_PATH_RUNTIME_START_AFTER_HEALTH_MS = 50;
363
+ var FAST_PATH_RUNTIME_START_FALLBACK_MS = 1e3;
354
364
  var RUNTIME_STARTUP_TIMEOUT_ENV = "QWEN_SERVE_RUNTIME_STARTUP_TIMEOUT_MS";
355
365
  var MAX_EVENT_RING_SIZE = 1e6;
356
366
  var DEFAULT_MAX_SESSIONS = 20;
@@ -515,7 +525,7 @@ function shouldPreheatBridge(deps) {
515
525
  __name(shouldPreheatBridge, "shouldPreheatBridge");
516
526
  var coreRuntimePromise;
517
527
  function loadCoreRuntime() {
518
- coreRuntimePromise ??= import("./src-4F6FBZFI.js");
528
+ coreRuntimePromise ??= import("./src-PNZYGM3R.js");
519
529
  return coreRuntimePromise;
520
530
  }
521
531
  __name(loadCoreRuntime, "loadCoreRuntime");
@@ -545,11 +555,13 @@ __name(resolveDaemonLogBaseDirForRun, "resolveDaemonLogBaseDirForRun");
545
555
  var settingsRuntimePromise;
546
556
  function loadSettingsRuntimeModules() {
547
557
  settingsRuntimePromise ??= Promise.all([
548
- import("./settings-WJTCBIRA.js"),
549
- import("./loadedSettingsAdapter-XIUTN245.js")
550
- ]).then(([settings, loadedSettingsAdapter]) => ({
558
+ import("./settings-DFTYMJYF.js"),
559
+ import("./loadedSettingsAdapter-H27JMTLU.js"),
560
+ import("./trustedFolders-SJRXNHZE.js")
561
+ ]).then(([settings, loadedSettingsAdapter, trustedFolders]) => ({
551
562
  settings,
552
- loadedSettingsAdapter
563
+ loadedSettingsAdapter,
564
+ trustedFolders
553
565
  }));
554
566
  return settingsRuntimePromise;
555
567
  }
@@ -560,15 +572,17 @@ async function loadServeRuntimeModules() {
560
572
  bridgeModule,
561
573
  spawnChannelModule,
562
574
  workspaceModule,
575
+ workspaceTypesModule,
563
576
  daemonStatusProviderModule,
564
577
  workspaceProvidersStatusModule
565
578
  ] = await Promise.all([
566
- import("./server-BV5TZUMU.js"),
567
- import("./bridge-4LV2HBH2.js"),
568
- import("./spawnChannel-EI2E5BCW.js"),
569
- import("./workspace-service-OM5D4OI2.js"),
570
- import("./daemon-status-provider-CSL3BUOY.js"),
571
- import("./workspace-providers-status-ZIR5EPOO.js")
579
+ import("./server-P4YIH35I.js"),
580
+ import("./bridge-HZVAUTMX.js"),
581
+ import("./spawnChannel-DHRIMDVL.js"),
582
+ import("./workspace-service-34C7SUBU.js"),
583
+ import("./types-QX5C3CHJ.js"),
584
+ import("./daemon-status-provider-42JEXENZ.js"),
585
+ import("./workspace-providers-status-GOCWYDMK.js")
572
586
  ]);
573
587
  return {
574
588
  createServeApp: serverModule.createServeApp,
@@ -577,6 +591,7 @@ async function loadServeRuntimeModules() {
577
591
  createAcpSessionBridge: bridgeModule.createAcpSessionBridge,
578
592
  createSpawnChannelFactory: spawnChannelModule.createSpawnChannelFactory,
579
593
  createDaemonWorkspaceService: workspaceModule.createDaemonWorkspaceService,
594
+ WorkspaceSettingsPartialPersistError: workspaceTypesModule.WorkspaceSettingsPartialPersistError,
580
595
  createDaemonStatusProvider: daemonStatusProviderModule.createDaemonStatusProvider,
581
596
  createWorkspaceProvidersStatusProvider: workspaceProvidersStatusModule.createWorkspaceProvidersStatusProvider
582
597
  };
@@ -612,7 +627,11 @@ function currentServeFeaturesForRunQwenServe(opts, sessionShellCommandEnabled) {
612
627
  persistSettingAvailable: true,
613
628
  sessionShellCommandEnabled,
614
629
  rateLimit: opts.rateLimit === true,
615
- reloadAvailable: true
630
+ reloadAvailable: true,
631
+ // Advertise the same WS feature flags as the runtime path (serve-features.ts)
632
+ // so the bootstrap `/capabilities` window doesn't briefly under-report them.
633
+ clientMcpOverWsEnabled: opts.clientMcpOverWs === true,
634
+ cdpTunnelOverWsEnabled: opts.cdpTunnelOverWs === true
616
635
  });
617
636
  }
618
637
  __name(currentServeFeaturesForRunQwenServe, "currentServeFeaturesForRunQwenServe");
@@ -737,6 +756,14 @@ async function waitForRuntimeStartingForShutdown(runtimeStarting, daemonLog, tim
737
756
  });
738
757
  }
739
758
  __name(waitForRuntimeStartingForShutdown, "waitForRuntimeStartingForShutdown");
759
+ var BOOTSTRAP_HEALTH_PATH = "/health";
760
+ var BOOTSTRAP_CAPABILITIES_PATH = "/capabilities";
761
+ var BOOTSTRAP_DAEMON_STATUS_PATH = "/daemon/status";
762
+ var BOOTSTRAP_SERVE_PATHS = /* @__PURE__ */ new Set([
763
+ BOOTSTRAP_HEALTH_PATH,
764
+ BOOTSTRAP_CAPABILITIES_PATH,
765
+ BOOTSTRAP_DAEMON_STATUS_PATH
766
+ ]);
740
767
  function createBootstrapServeApp(input) {
741
768
  const {
742
769
  opts,
@@ -747,7 +774,8 @@ function createBootstrapServeApp(input) {
747
774
  qwenCodeVersion,
748
775
  sessionShellCommandEnabled,
749
776
  permissionPolicy,
750
- getRuntimeError
777
+ getRuntimeError,
778
+ onHealthServed
751
779
  } = input;
752
780
  const app = (0, import_express.default)();
753
781
  installSameOriginOriginStrip(app, getPort);
@@ -766,18 +794,21 @@ function createBootstrapServeApp(input) {
766
794
  });
767
795
  return;
768
796
  }
797
+ if (onHealthServed) {
798
+ res.once("finish", onHealthServed);
799
+ }
769
800
  res.status(200).json({ status: "ok" });
770
801
  }, "healthHandler");
771
802
  const loopback = isLoopbackBind(opts.hostname);
772
803
  const exposeHealthPreAuth = loopback && !opts.requireAuth;
773
804
  if (exposeHealthPreAuth) {
774
- app.get("/health", healthHandler);
805
+ app.get(BOOTSTRAP_HEALTH_PATH, healthHandler);
775
806
  }
776
807
  app.use(bearerAuth(opts.token));
777
808
  if (!exposeHealthPreAuth) {
778
- app.get("/health", healthHandler);
809
+ app.get(BOOTSTRAP_HEALTH_PATH, healthHandler);
779
810
  }
780
- app.get("/capabilities", (_req, res) => {
811
+ app.get(BOOTSTRAP_CAPABILITIES_PATH, (_req, res) => {
781
812
  res.status(200).json(
782
813
  createBootstrapCapabilities({
783
814
  opts,
@@ -788,7 +819,7 @@ function createBootstrapServeApp(input) {
788
819
  })
789
820
  );
790
821
  });
791
- app.get("/daemon/status", (req, res) => {
822
+ app.get(BOOTSTRAP_DAEMON_STATUS_PATH, (req, res) => {
792
823
  const detail = parseDaemonStatusDetail(req.query["detail"]);
793
824
  if (!detail.ok || !detail.detail) {
794
825
  res.status(400).json({
@@ -910,16 +941,58 @@ function createBootstrapServeApp(input) {
910
941
  return app;
911
942
  }
912
943
  __name(createBootstrapServeApp, "createBootstrapServeApp");
913
- function createDelegatingServeApp(bootstrapApp, getRuntimeApp) {
944
+ function createDelegatingServeApp(bootstrapApp, getRuntimeApp, options = {}) {
914
945
  const app = (0, import_express.default)();
915
946
  app.use((req, res, next) => {
916
- const target = getRuntimeApp() ?? bootstrapApp;
917
- const handler = target;
918
- handler(req, res, next);
947
+ const dispatch = /* @__PURE__ */ __name(async () => {
948
+ let target = getRuntimeApp();
949
+ if (!target && options.waitForDeferredRuntimeRoutes === true && !isBootstrapServeRoute(req) && !isCorsPreflightRequest(req) && options.startRuntime && options.runtimeReady) {
950
+ if (options.authenticateDeferredRuntimeRequest && !runSynchronousRequestGate(
951
+ options.authenticateDeferredRuntimeRequest,
952
+ req,
953
+ res,
954
+ next
955
+ )) {
956
+ return;
957
+ }
958
+ options.startRuntime();
959
+ try {
960
+ await options.runtimeReady;
961
+ } catch {
962
+ }
963
+ target = getRuntimeApp();
964
+ }
965
+ const handler = target ?? bootstrapApp;
966
+ handler(req, res, next);
967
+ }, "dispatch");
968
+ void dispatch().catch(next);
919
969
  });
920
970
  return app;
921
971
  }
922
972
  __name(createDelegatingServeApp, "createDelegatingServeApp");
973
+ function isBootstrapServeRoute(req) {
974
+ const path2 = req.path.length > 1 && req.path.endsWith("/") ? req.path.slice(0, -1) : req.path;
975
+ return BOOTSTRAP_SERVE_PATHS.has(path2);
976
+ }
977
+ __name(isBootstrapServeRoute, "isBootstrapServeRoute");
978
+ function isCorsPreflightRequest(req) {
979
+ return req.method === "OPTIONS" && Boolean(req.headers.origin) && Boolean(
980
+ req.headers["access-control-request-method"] || req.headers["access-control-request-headers"]
981
+ );
982
+ }
983
+ __name(isCorsPreflightRequest, "isCorsPreflightRequest");
984
+ function runSynchronousRequestGate(handler, req, res, next) {
985
+ let passed = false;
986
+ handler(req, res, (err) => {
987
+ if (err) {
988
+ next(err);
989
+ return;
990
+ }
991
+ passed = true;
992
+ });
993
+ return passed;
994
+ }
995
+ __name(runSynchronousRequestGate, "runSynchronousRequestGate");
923
996
  async function runQwenServe(optsIn, deps = {}) {
924
997
  const runStartedAt = performance.now();
925
998
  const shouldPreheat = !deps.bridge && shouldPreheatBridge(deps);
@@ -952,7 +1025,16 @@ async function runQwenServe(optsIn, deps = {}) {
952
1025
  ...optsIn,
953
1026
  token,
954
1027
  promptDeadlineMs,
955
- writerIdleTimeoutMs
1028
+ writerIdleTimeoutMs,
1029
+ // Reverse tool channel (issue #5626, Phase 2). Opt-in via env until the
1030
+ // public contract settles — the WS `mcp_register` / `mcp_message` frames
1031
+ // and the child↔parent `client_mcp/message` round-trip stay dormant
1032
+ // otherwise. An explicit `clientMcpOverWs` in `optsIn` (embedded callers)
1033
+ // still wins.
1034
+ clientMcpOverWs: optsIn.clientMcpOverWs ?? process.env[QWEN_SERVE_CLIENT_MCP_OVER_WS_ENV] === "1",
1035
+ // CDP tunnel (Plan C, issue #5626). Opt-in via env until the contract
1036
+ // settles; an explicit `cdpTunnelOverWs` in `optsIn` still wins.
1037
+ cdpTunnelOverWs: optsIn.cdpTunnelOverWs ?? process.env[QWEN_SERVE_CDP_TUNNEL_OVER_WS_ENV] === "1"
956
1038
  };
957
1039
  validateRateLimitOptions(opts);
958
1040
  if (!opts.hostname.startsWith("[") && opts.hostname.split(":").length === 2) {
@@ -1132,10 +1214,25 @@ async function runQwenServe(optsIn, deps = {}) {
1132
1214
  }
1133
1215
  const childEnvOverrides = {
1134
1216
  QWEN_SERVE_MCP_CLIENT_BUDGET: opts.mcpClientBudget !== void 0 ? String(opts.mcpClientBudget) : void 0,
1135
- QWEN_SERVE_MCP_BUDGET_MODE: opts.mcpBudgetMode
1217
+ QWEN_SERVE_MCP_BUDGET_MODE: opts.mcpBudgetMode,
1218
+ // CDP tunnel (Plan C, #5626): forward the flag + bound port so the spawned
1219
+ // ACP child can auto-register chrome-devtools-mcp against this `/cdp`
1220
+ // endpoint. Only meaningful with a fixed `--port`: the override map is frozen
1221
+ // at bridge construction, so an ephemeral `--port 0` (resolved only after
1222
+ // `listen`) can't be threaded here. Leave the port unset in that case so the
1223
+ // child surfaces a clear diagnostic instead of a bogus port "0".
1224
+ QWEN_SERVE_CDP_TUNNEL_OVER_WS: opts.cdpTunnelOverWs ? "1" : void 0,
1225
+ QWEN_SERVE_CDP_TUNNEL_PORT: opts.cdpTunnelOverWs && opts.port > 0 ? String(opts.port) : void 0,
1226
+ // Tell the child whether `/cdp` requires bearer auth. The ACP child can't
1227
+ // inherit QWEN_SERVER_TOKEN (the spawn path scrubs it) and chrome-devtools-
1228
+ // mcp is launched with `--wsEndpoint` only, so it can't authenticate against
1229
+ // an auth-gated `/cdp`. The child uses this flag to skip auto-registering the
1230
+ // browser tools (with a diagnostic) instead of registering tools that can't
1231
+ // connect. See buildCdpTunnelMcpServer in acpAgent.ts.
1232
+ QWEN_SERVE_CDP_TUNNEL_AUTH_REQUIRED: opts.cdpTunnelOverWs && (token || opts.requireAuth) ? "1" : void 0
1136
1233
  };
1137
- const cliVersion = await getCliVersion();
1138
- const trustedWorkspace = deps.trustedWorkspace ?? true;
1234
+ const cliVersionPromise = getCliVersion();
1235
+ let cliVersion;
1139
1236
  const diagnosticSink = /* @__PURE__ */ __name((line, level) => daemonLog.raw(line, level), "diagnosticSink");
1140
1237
  let actualPort = opts.port;
1141
1238
  const webShellDir = opts.serveWebShell === false ? void 0 : resolveWebShellDir();
@@ -1167,6 +1264,9 @@ async function runQwenServe(optsIn, deps = {}) {
1167
1264
  let markRuntimeReady;
1168
1265
  let markRuntimeFailed;
1169
1266
  let runtimeStartupSettled = false;
1267
+ let startRuntimeAfterHealth;
1268
+ let startRuntimeForRequest;
1269
+ const deferRuntimeUntilFirstHealth = deps.resolveOnListen === true && deps.deferRuntimeUntilFirstHealth === true;
1170
1270
  const runtimeReady = new Promise((resolve, reject) => {
1171
1271
  markRuntimeReady = resolve;
1172
1272
  markRuntimeFailed = reject;
@@ -1178,11 +1278,13 @@ async function runQwenServe(optsIn, deps = {}) {
1178
1278
  () => runtimeStartupError
1179
1279
  );
1180
1280
  const buildRuntime = /* @__PURE__ */ __name(async () => {
1181
- const [runtime, core, settingsRuntime] = await Promise.all([
1281
+ const [runtime, core, settingsRuntime, resolvedCliVersion] = await Promise.all([
1182
1282
  loadServeRuntimeModules(),
1183
1283
  loadCoreRuntime(),
1184
- loadSettingsRuntimeModules()
1284
+ loadSettingsRuntimeModules(),
1285
+ cliVersionPromise
1185
1286
  ]);
1287
+ cliVersion = resolvedCliVersion;
1186
1288
  let runtimeBootSettings;
1187
1289
  try {
1188
1290
  runtimeBootSettings = settingsRuntime.settings.loadSettings(boundWorkspace);
@@ -1191,15 +1293,35 @@ async function runQwenServe(optsIn, deps = {}) {
1191
1293
  `qwen serve: could not read full settings for runtime startup (${err instanceof Error ? err.message : String(err)}); falling back to defaults.`
1192
1294
  );
1193
1295
  }
1296
+ const trustedWorkspace = deps.trustedWorkspace ?? (runtimeBootSettings ? settingsRuntime.trustedFolders.getWorkspaceTrustStatus(
1297
+ runtimeBootSettings.merged,
1298
+ boundWorkspace
1299
+ ).effective.state === "trusted" : true);
1300
+ if (deps.trustedWorkspace === void 0 && runtimeBootSettings && !trustedWorkspace) {
1301
+ daemonLog.warn(
1302
+ "workspace file writes are disabled because the bound workspace is not trusted",
1303
+ { workspace: boundWorkspace }
1304
+ );
1305
+ }
1194
1306
  const daemonWorkspaceHash = core.hashDaemonWorkspace(boundWorkspace);
1195
- const daemonTelemetrySettings = await core.resolveTelemetrySettings({
1196
- env: process.env,
1197
- settings: runtimeBootSettings?.merged.telemetry
1198
- });
1307
+ let daemonTelemetrySettings;
1308
+ try {
1309
+ daemonTelemetrySettings = await core.resolveTelemetrySettings({
1310
+ env: process.env,
1311
+ settings: runtimeBootSettings?.merged.telemetry
1312
+ });
1313
+ } catch (err) {
1314
+ if (err instanceof core.FatalConfigError) {
1315
+ throw new core.FatalConfigError(
1316
+ `Invalid telemetry configuration: ${err.message}.`
1317
+ );
1318
+ }
1319
+ throw err;
1320
+ }
1199
1321
  core.initializeTelemetry(
1200
1322
  createDaemonTelemetryRuntimeConfig(
1201
1323
  daemonTelemetrySettings,
1202
- cliVersion,
1324
+ resolvedCliVersion,
1203
1325
  `daemon:${daemonWorkspaceHash}:${process.pid}`,
1204
1326
  {
1205
1327
  otlpEndpoint: core.DEFAULT_OTLP_ENDPOINT,
@@ -1257,6 +1379,7 @@ async function runQwenServe(optsIn, deps = {}) {
1257
1379
  });
1258
1380
  const statusProvider = runtime.createDaemonStatusProvider();
1259
1381
  const workspaceProvidersStatusProvider = runtime.createWorkspaceProvidersStatusProvider();
1382
+ const clientMcpSenderRegistry = new ClientMcpSenderRegistry();
1260
1383
  const persistDisabledToolsFn = /* @__PURE__ */ __name((workspace, toolName, enabled) => withSettingsLock(workspace, async () => {
1261
1384
  const fresh = settingsRuntime.settings.loadSettings(workspace);
1262
1385
  const wsScope = fresh.forScope(WORKSPACE_SETTING_SCOPE).settings;
@@ -1271,7 +1394,42 @@ async function runQwenServe(optsIn, deps = {}) {
1271
1394
  [...next].sort()
1272
1395
  );
1273
1396
  }), "persistDisabledToolsFn");
1397
+ const persistSettingFn = /* @__PURE__ */ __name((workspace, scope, key, value) => withSettingsLock(workspace, async () => {
1398
+ const fresh = settingsRuntime.settings.loadSettings(workspace);
1399
+ fresh.setValue(scope, key, value);
1400
+ return fresh;
1401
+ }), "persistSettingFn");
1402
+ const persistSettingsFn = /* @__PURE__ */ __name((workspace, writes) => withSettingsLock(workspace, async () => {
1403
+ const fresh = settingsRuntime.settings.loadSettings(workspace);
1404
+ const writesByScope = /* @__PURE__ */ new Map();
1405
+ for (const write of writes) {
1406
+ writesByScope.set(
1407
+ write.scope,
1408
+ (writesByScope.get(write.scope) ?? 0) + 1
1409
+ );
1410
+ }
1411
+ const committedScopes = /* @__PURE__ */ new Set();
1412
+ let committed = 0;
1413
+ try {
1414
+ fresh.setValues(writes, (scope) => {
1415
+ committedScopes.add(scope);
1416
+ committed += writesByScope.get(scope) ?? 0;
1417
+ });
1418
+ } catch (err) {
1419
+ const failedWrite = writes.find((write) => !committedScopes.has(write.scope)) ?? writes[committed];
1420
+ const message = `persistSettings partial failure (workspace=${workspace}, committed=${committed}/${writes.length}, failedKey=${failedWrite?.key ?? "<unknown>"}, failedScope=${failedWrite?.scope ?? "<unknown>"}): ${err instanceof Error ? err.message : String(err)}`;
1421
+ writeStderrLine(`qwen serve: ${message}`);
1422
+ throw new runtime.WorkspaceSettingsPartialPersistError(
1423
+ message,
1424
+ writes.filter((write) => committedScopes.has(write.scope)),
1425
+ err
1426
+ );
1427
+ }
1428
+ }), "persistSettingsFn");
1274
1429
  const bridge = deps.bridge ?? runtime.createAcpSessionBridge({
1430
+ // Reverse tool channel: let `BridgeClient.extMethod` reach the WS
1431
+ // connection that hosts a named client MCP server (#5626).
1432
+ clientMcpSender: clientMcpSenderRegistry.lookup,
1275
1433
  maxSessions: opts.maxSessions,
1276
1434
  ...opts.maxPendingPromptsPerSession !== void 0 ? { maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession } : {},
1277
1435
  ...opts.eventRingSize !== void 0 ? { eventRingSize: opts.eventRingSize } : {},
@@ -1305,6 +1463,8 @@ async function runQwenServe(optsIn, deps = {}) {
1305
1463
  workspaceProvidersStatusProvider,
1306
1464
  isChannelLive: /* @__PURE__ */ __name(() => bridge.isChannelLive(), "isChannelLive"),
1307
1465
  persistDisabledTools: persistDisabledToolsFn,
1466
+ persistSetting: persistSettingFn,
1467
+ persistSettings: persistSettingsFn,
1308
1468
  reloadDaemonEnv: /* @__PURE__ */ __name((workspace) => withSettingsLock(workspace, async () => {
1309
1469
  const fresh = settingsRuntime.settings.loadSettings(workspace, {
1310
1470
  skipLoadEnvironment: true
@@ -1328,16 +1488,17 @@ async function runQwenServe(optsIn, deps = {}) {
1328
1488
  bridge,
1329
1489
  webShellDir,
1330
1490
  boundWorkspace,
1331
- qwenCodeVersion: cliVersion,
1491
+ qwenCodeVersion: resolvedCliVersion,
1332
1492
  startup,
1333
1493
  fsFactory,
1334
1494
  daemonLog,
1335
1495
  workspace: workspaceService,
1496
+ // Reverse tool channel (#5626): the SAME registry wired into `bridge` above,
1497
+ // so the WS provider and the child-answering bridge share one sender map.
1498
+ clientMcpSenderRegistry,
1336
1499
  persistDisabledTools: persistDisabledToolsFn,
1337
- persistSetting: /* @__PURE__ */ __name((workspace, scope, key, value) => withSettingsLock(workspace, async () => {
1338
- const fresh = settingsRuntime.settings.loadSettings(workspace);
1339
- fresh.setValue(scope, key, value);
1340
- }), "persistSetting"),
1500
+ persistSetting: persistSettingFn,
1501
+ persistSettings: persistSettingsFn,
1341
1502
  installAuthProvider: /* @__PURE__ */ __name((req) => withSettingsLock(
1342
1503
  boundWorkspace,
1343
1504
  async () => {
@@ -1351,23 +1512,26 @@ async function runQwenServe(optsIn, deps = {}) {
1351
1512
  });
1352
1513
  const plan = core.buildInstallPlan(provider, inputs);
1353
1514
  const fresh = settingsRuntime.settings.loadSettings(boundWorkspace);
1515
+ const adapter = settingsRuntime.loadedSettingsAdapter.createLoadedSettingsAdapter(
1516
+ fresh
1517
+ );
1354
1518
  await core.applyProviderInstallPlan(plan, {
1355
- settings: settingsRuntime.loadedSettingsAdapter.createLoadedSettingsAdapter(
1356
- fresh
1357
- ),
1519
+ settings: adapter,
1358
1520
  doRefreshAuth: false
1359
1521
  });
1360
1522
  core.emitDaemonLog("Auth provider installed.", {
1361
1523
  "qwen-code.daemon.auth.provider_id": provider.id,
1362
1524
  "qwen-code.daemon.auth.auth_type": plan.authType
1363
1525
  });
1526
+ const effectiveModelId = adapter.getValue("model.name") ?? plan.modelSelection?.modelId;
1527
+ const effectiveBaseUrl = adapter.getValue("model.baseUrl") ?? plan.modelSelection?.baseUrl ?? inputs.baseUrl;
1364
1528
  return {
1365
1529
  v: 1,
1366
1530
  providerId: provider.id,
1367
1531
  providerLabel: provider.label,
1368
1532
  authType: plan.authType,
1369
- ...plan.modelSelection?.modelId ? { modelId: plan.modelSelection.modelId } : {},
1370
- ...inputs.baseUrl ? { baseUrl: inputs.baseUrl } : {},
1533
+ ...effectiveModelId ? { modelId: effectiveModelId } : {},
1534
+ ...effectiveBaseUrl ? { baseUrl: effectiveBaseUrl } : {},
1371
1535
  message: `Successfully configured ${provider.label}. Use /model to switch models.`
1372
1536
  };
1373
1537
  }
@@ -1383,6 +1547,7 @@ async function runQwenServe(optsIn, deps = {}) {
1383
1547
  runtimeStartupSettled = true;
1384
1548
  markRuntimeReady();
1385
1549
  }
1550
+ cliVersion ??= await cliVersionPromise;
1386
1551
  const bootstrapApp = createBootstrapServeApp({
1387
1552
  opts,
1388
1553
  getPort: /* @__PURE__ */ __name(() => actualPort, "getPort"),
@@ -1392,9 +1557,15 @@ async function runQwenServe(optsIn, deps = {}) {
1392
1557
  qwenCodeVersion: cliVersion,
1393
1558
  sessionShellCommandEnabled,
1394
1559
  permissionPolicy,
1395
- getRuntimeError: /* @__PURE__ */ __name(() => runtimeStartupError, "getRuntimeError")
1560
+ getRuntimeError: /* @__PURE__ */ __name(() => runtimeStartupError, "getRuntimeError"),
1561
+ onHealthServed: deferRuntimeUntilFirstHealth ? () => startRuntimeAfterHealth?.() : void 0
1562
+ });
1563
+ const app = runtimeApp ?? createDelegatingServeApp(bootstrapApp, () => runtimeApp, {
1564
+ waitForDeferredRuntimeRoutes: deferRuntimeUntilFirstHealth,
1565
+ startRuntime: /* @__PURE__ */ __name(() => startRuntimeForRequest?.(), "startRuntime"),
1566
+ runtimeReady,
1567
+ authenticateDeferredRuntimeRequest: bearerAuth(opts.token)
1396
1568
  });
1397
- const app = runtimeApp ?? createDelegatingServeApp(bootstrapApp, () => runtimeApp);
1398
1569
  let listenHostname = opts.hostname;
1399
1570
  if (opts.hostname.startsWith("[")) {
1400
1571
  const inner = opts.hostname.slice(1, -1);
@@ -1447,6 +1618,8 @@ async function runQwenServe(optsIn, deps = {}) {
1447
1618
  let shuttingDown = false;
1448
1619
  let closePromise;
1449
1620
  let runtimeStartupTimer;
1621
+ let runtimeStartAfterHealthTimer;
1622
+ let runtimeStartFallbackTimer;
1450
1623
  const runtimeStartupTimeoutMs = resolveRuntimeStartupTimeoutMs(
1451
1624
  deps.runtimeStartupTimeoutMs
1452
1625
  );
@@ -1455,6 +1628,27 @@ async function runQwenServe(optsIn, deps = {}) {
1455
1628
  clearTimeout(runtimeStartupTimer);
1456
1629
  runtimeStartupTimer = void 0;
1457
1630
  }, "clearRuntimeStartupTimer");
1631
+ const clearRuntimeStartFallbackTimer = /* @__PURE__ */ __name(() => {
1632
+ if (!runtimeStartFallbackTimer) return;
1633
+ clearTimeout(runtimeStartFallbackTimer);
1634
+ runtimeStartFallbackTimer = void 0;
1635
+ }, "clearRuntimeStartFallbackTimer");
1636
+ const clearRuntimeStartAfterHealthTimer = /* @__PURE__ */ __name(() => {
1637
+ if (!runtimeStartAfterHealthTimer) return;
1638
+ clearTimeout(runtimeStartAfterHealthTimer);
1639
+ runtimeStartAfterHealthTimer = void 0;
1640
+ }, "clearRuntimeStartAfterHealthTimer");
1641
+ const cancelDeferredRuntimeStartup = /* @__PURE__ */ __name(() => {
1642
+ if (!deferRuntimeUntilFirstHealth || runtimeStarting || runtimeStartupSettled)
1643
+ return;
1644
+ daemonLog.info(
1645
+ "deferred runtime: cancelled, server closed before startup"
1646
+ );
1647
+ runtimeStartupSettled = true;
1648
+ const error = new Error(RUNTIME_STARTUP_CANCELLED_MESSAGE);
1649
+ runtimeStartupError = error.message;
1650
+ markRuntimeFailed(error);
1651
+ }, "cancelDeferredRuntimeStartup");
1458
1652
  const shutdownBridgeAfterFailedStartup = /* @__PURE__ */ __name(async (bridge) => {
1459
1653
  if (!bridge || deps.bridge) return;
1460
1654
  try {
@@ -1511,6 +1705,8 @@ async function runQwenServe(optsIn, deps = {}) {
1511
1705
  }, "startBridgePreheat");
1512
1706
  const startRuntime = /* @__PURE__ */ __name(() => {
1513
1707
  if (runtimeStarting) return;
1708
+ clearRuntimeStartAfterHealthTimer();
1709
+ clearRuntimeStartFallbackTimer();
1514
1710
  runtimeStarting = buildRuntime().then(async (runtime) => {
1515
1711
  if (runtimeStartupSettled) {
1516
1712
  await shutdownBridgeAfterFailedStartup(runtime.bridge);
@@ -1546,6 +1742,37 @@ async function runQwenServe(optsIn, deps = {}) {
1546
1742
  runtimeStartupTimer.unref();
1547
1743
  }
1548
1744
  }, "startRuntime");
1745
+ startRuntimeForRequest = startRuntime;
1746
+ const scheduleRuntimeStartFallback = /* @__PURE__ */ __name(() => {
1747
+ if (shuttingDown || runtimeStarting || runtimeStartFallbackTimer)
1748
+ return;
1749
+ daemonLog.info(
1750
+ `deferred runtime: scheduling fallback start in ${FAST_PATH_RUNTIME_START_FALLBACK_MS}ms`
1751
+ );
1752
+ runtimeStartFallbackTimer = setTimeout(() => {
1753
+ runtimeStartFallbackTimer = void 0;
1754
+ if (shuttingDown) return;
1755
+ daemonLog.info("deferred runtime: fallback timer fired, starting");
1756
+ startRuntime();
1757
+ }, FAST_PATH_RUNTIME_START_FALLBACK_MS);
1758
+ runtimeStartFallbackTimer.unref();
1759
+ }, "scheduleRuntimeStartFallback");
1760
+ startRuntimeAfterHealth = /* @__PURE__ */ __name(() => {
1761
+ if (shuttingDown || runtimeStarting || runtimeStartAfterHealthTimer) {
1762
+ return;
1763
+ }
1764
+ clearRuntimeStartFallbackTimer();
1765
+ daemonLog.info(
1766
+ `deferred runtime: health served, scheduling start in ${FAST_PATH_RUNTIME_START_AFTER_HEALTH_MS}ms`
1767
+ );
1768
+ runtimeStartAfterHealthTimer = setTimeout(() => {
1769
+ runtimeStartAfterHealthTimer = void 0;
1770
+ if (shuttingDown) return;
1771
+ daemonLog.info("deferred runtime: health timer fired, starting");
1772
+ startRuntime();
1773
+ }, FAST_PATH_RUNTIME_START_AFTER_HEALTH_MS);
1774
+ runtimeStartAfterHealthTimer.unref();
1775
+ }, "startRuntimeAfterHealth");
1549
1776
  const onSignal = /* @__PURE__ */ __name(async (signal) => {
1550
1777
  if (shuttingDown) {
1551
1778
  daemonLog.warn(`received ${signal} during drain \u2014 forcing exit`);
@@ -1585,6 +1812,9 @@ async function runQwenServe(optsIn, deps = {}) {
1585
1812
  if (closePromise) return closePromise;
1586
1813
  closePromise = new Promise((res, rej) => {
1587
1814
  shuttingDown = true;
1815
+ clearRuntimeStartAfterHealthTimer();
1816
+ clearRuntimeStartFallbackTimer();
1817
+ cancelDeferredRuntimeStartup();
1588
1818
  let settled = false;
1589
1819
  let bridgeShutdownError;
1590
1820
  const finish = /* @__PURE__ */ __name((err) => {
@@ -1688,6 +1918,8 @@ async function runQwenServe(optsIn, deps = {}) {
1688
1918
  if (shouldPreheat) {
1689
1919
  startBridgePreheat(bridgeRef);
1690
1920
  }
1921
+ } else if (deferRuntimeUntilFirstHealth) {
1922
+ scheduleRuntimeStartFallback();
1691
1923
  } else {
1692
1924
  startRuntime();
1693
1925
  }