@qwen-code/qwen-code 0.22.2 → 0.22.3-nightly.20260831.3a0c4c6108

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 (480) hide show
  1. package/bundled/computer-use/SKILL.md +3 -3
  2. package/bundled/qc-helper/docs/common-workflow.md +32 -0
  3. package/bundled/qc-helper/docs/configuration/auth.md +6 -6
  4. package/bundled/qc-helper/docs/configuration/model-providers.md +4 -2
  5. package/bundled/qc-helper/docs/configuration/settings.md +47 -44
  6. package/bundled/qc-helper/docs/extension/introduction.md +1 -1
  7. package/bundled/qc-helper/docs/features/approval-mode.md +3 -0
  8. package/bundled/qc-helper/docs/features/auto-mode.md +34 -17
  9. package/bundled/qc-helper/docs/features/channels/dws.md +2 -0
  10. package/bundled/qc-helper/docs/features/channels/overview.md +36 -3
  11. package/bundled/qc-helper/docs/features/code-review.md +5 -5
  12. package/bundled/qc-helper/docs/features/commands.md +41 -0
  13. package/bundled/qc-helper/docs/features/computer-use.md +2 -2
  14. package/bundled/qc-helper/docs/features/hooks.md +6 -2
  15. package/bundled/qc-helper/docs/features/memory.md +1 -0
  16. package/bundled/qc-helper/docs/features/tool-use-summaries.md +1 -1
  17. package/bundled/qc-helper/docs/qwen-serve-deploy-local.md +17 -7
  18. package/bundled/qc-helper/docs/qwen-serve.md +59 -55
  19. package/bundled/review/SKILL.md +90 -31
  20. package/bundled/review/references/persistence.md +7 -3
  21. package/bundled/review/references/posting.md +11 -5
  22. package/chunks/MaxSizedBox-IHRTWGSY.js +115 -0
  23. package/chunks/{StandaloneSessionPicker-AVLI6VJP.js → StandaloneSessionPicker-TLVWVTJ7.js} +88 -85
  24. package/chunks/{acp-startup-profiler-GNYAL6LI.js → acp-startup-profiler-M4X5F3VK.js} +2 -2
  25. package/chunks/{acpAgent-MXEAN54C.js → acpAgent-7I5LLPP3.js} +1563 -407
  26. package/chunks/agent-4Z4NTJXD.js +99 -0
  27. package/chunks/agent-headless-TVUJXQWU.js +89 -0
  28. package/chunks/{anthropicContentGenerator-HGMBACVE.js → anthropicContentGenerator-VSSPG7XV.js} +84 -55
  29. package/chunks/{artifact-tool-5YT4QF7Y.js → artifact-tool-TEYW6I4A.js} +11 -3
  30. package/chunks/{askUserQuestion-4SWJY65V.js → askUserQuestion-PYNBWV63.js} +45 -7
  31. package/chunks/bridge-EVURP4NO.js +122 -0
  32. package/chunks/{ca-7HPYOYSZ.js → ca-BNU7YNDE.js} +3 -0
  33. package/chunks/{channel-management-service-X4AZ6IXX.js → channel-management-service-IDBNYSFW.js} +6 -6
  34. package/chunks/channel-settings-store-MZNXRKVI.js +125 -0
  35. package/chunks/{channel-worker-group-27HMGD5S.js → channel-worker-group-ZLP5SJHT.js} +7 -7
  36. package/chunks/{channel-worker-manager-QEGX646Z.js → channel-worker-manager-FG5377T2.js} +7 -7
  37. package/chunks/{channel-worker-supervisor-UEW2WWCC.js → channel-worker-supervisor-HDVE4ADS.js} +4 -4
  38. package/chunks/{chunk-PPKZ7JOE.js → chunk-22UH7VTP.js} +1 -1
  39. package/chunks/chunk-24FVUD5P.js +49 -0
  40. package/chunks/{chunk-CMHFCLBU.js → chunk-26SIKQIC.js} +1 -1
  41. package/chunks/{chunk-5PA6UEYA.js → chunk-3452WXOK.js} +4 -1
  42. package/chunks/{chunk-SFPGAQUL.js → chunk-373DQUVA.js} +72 -31
  43. package/chunks/{chunk-H2WDGQ6D.js → chunk-3AKCBZVW.js} +3 -3
  44. package/chunks/{chunk-LXIBMVRN.js → chunk-3CZGSTZX.js} +15 -9
  45. package/chunks/{chunk-JVPFTDBK.js → chunk-3EGEBDTW.js} +1 -1
  46. package/chunks/{chunk-K2NQPH5D.js → chunk-3NQCZMUB.js} +79 -5
  47. package/chunks/{chunk-E7REAOTN.js → chunk-47ECGEJC.js} +4 -0
  48. package/chunks/{chunk-WKK5BQNP.js → chunk-4P7PPAHN.js} +45 -421
  49. package/chunks/chunk-4VQBQLIZ.js +293 -0
  50. package/chunks/{chunk-4JWNNLPT.js → chunk-5FGWVPCM.js} +4 -4
  51. package/chunks/{chunk-ZFKOCECU.js → chunk-5ICKESC3.js} +2 -2
  52. package/chunks/{chunk-3I6UTTDX.js → chunk-67AY5D3M.js} +20 -20
  53. package/chunks/chunk-6HUXPLB5.js +110 -0
  54. package/chunks/{chunk-BRVWYMKV.js → chunk-6MBXY6WM.js} +1 -1
  55. package/chunks/{chunk-6LFTG244.js → chunk-6NWPR2EB.js} +19 -9
  56. package/chunks/chunk-6OO7QEWV.js +2581 -0
  57. package/chunks/{chunk-TWSKM647.js → chunk-6VHIWUJP.js} +1 -1
  58. package/chunks/{chunk-RJC5EIKY.js → chunk-6YXNJXQW.js} +7 -5
  59. package/chunks/{chunk-TPI7O7HR.js → chunk-7DDTI7Q3.js} +1 -1
  60. package/chunks/{chunk-KGJGEEVR.js → chunk-7FA2II6K.js} +10 -1
  61. package/chunks/chunk-7J6OTNGO.js +424 -0
  62. package/chunks/{chunk-NIFYWDYN.js → chunk-7TBU7PU2.js} +1 -1
  63. package/chunks/{chunk-3FDFA4MZ.js → chunk-7XICSE62.js} +3 -3
  64. package/chunks/{chunk-V2NDP3I4.js → chunk-7XL4WRXM.js} +2 -2
  65. package/chunks/{chunk-F7TNAPZ4.js → chunk-AAX236AR.js} +45 -11
  66. package/chunks/{chunk-T32W2JHI.js → chunk-ACZ4YRYK.js} +6 -6
  67. package/chunks/chunk-ADJD4LZF.js +210 -0
  68. package/chunks/{chunk-JWALNCLT.js → chunk-AF3QB6OL.js} +1 -1
  69. package/chunks/{chunk-P2SU6ZTI.js → chunk-AI35S34R.js} +3 -3
  70. package/chunks/{chunk-OIP7C4FE.js → chunk-AKNQMSL2.js} +5 -5
  71. package/chunks/{chunk-6CGL7E7G.js → chunk-AN3KFCNH.js} +2 -2
  72. package/chunks/{chunk-ABS25QER.js → chunk-ANVG3BVV.js} +1 -1
  73. package/chunks/chunk-AYYKUUKP.js +972 -0
  74. package/chunks/chunk-B2RIIK3K.js +346 -0
  75. package/chunks/{chunk-F5SZP77N.js → chunk-BBYTY46C.js} +153 -112
  76. package/chunks/{chunk-XRSOI3DL.js → chunk-BE5FGT5Z.js} +1 -1
  77. package/chunks/{chunk-BGXZBI5B.js → chunk-BHTYRHJF.js} +3 -2
  78. package/chunks/{chunk-CSMI4FP5.js → chunk-BSJOBW4U.js} +1 -1
  79. package/chunks/{chunk-Z7TGYN5F.js → chunk-BXNKREX7.js} +3 -3
  80. package/chunks/{chunk-4MQEPP3Y.js → chunk-BY24DZ4J.js} +5 -119
  81. package/chunks/{chunk-5XBFCMWD.js → chunk-CAZADEU7.js} +17 -9
  82. package/chunks/chunk-CHEIIBT3.js +40 -0
  83. package/chunks/{chunk-BBWV7ONL.js → chunk-CM4F4JBB.js} +6 -6
  84. package/chunks/{chunk-CAJTKR6W.js → chunk-D7D3HSYQ.js} +6 -5
  85. package/chunks/{chunk-3DXFGHAJ.js → chunk-DBTMP3P4.js} +213 -185
  86. package/chunks/chunk-DJBQCO2E.js +842 -0
  87. package/chunks/{chunk-RXFQM6FQ.js → chunk-DMEUXLSS.js} +16 -1
  88. package/chunks/{chunk-3AFMQUTI.js → chunk-E4JNFXNI.js} +3 -3
  89. package/chunks/{chunk-UHQFIS7N.js → chunk-EAHOJF6V.js} +28 -4
  90. package/chunks/{chunk-OIVXBW3W.js → chunk-ED7DD7MV.js} +3 -3
  91. package/chunks/{chunk-6DIGWMGT.js → chunk-EIJT2PQ6.js} +2 -2
  92. package/chunks/{chunk-XQFT3QUF.js → chunk-ENYUKMFK.js} +1 -1
  93. package/chunks/{chunk-CQH5KTKC.js → chunk-ERHAMGAA.js} +1 -1
  94. package/chunks/{chunk-IOPCFOTF.js → chunk-ERRJA23L.js} +3 -3
  95. package/chunks/{chunk-LDP5OD6N.js → chunk-EU2B4P3D.js} +12 -12
  96. package/chunks/{chunk-W5MJJ2V7.js → chunk-FHPYRXRH.js} +1 -1
  97. package/chunks/{chunk-IZIVM7LZ.js → chunk-FIWZOMBF.js} +3 -3
  98. package/chunks/{chunk-4HV6HH33.js → chunk-FPMQT2YY.js} +9 -9
  99. package/chunks/{chunk-Z7VOMGDC.js → chunk-FTJMWDND.js} +0 -24
  100. package/chunks/{chunk-L2M46FP5.js → chunk-FXUSWLBF.js} +225 -12
  101. package/chunks/{chunk-VVW4ZNFY.js → chunk-GB4UKWY5.js} +16 -8
  102. package/chunks/{chunk-PKAYJDB3.js → chunk-GCUR24KK.js} +22 -4
  103. package/chunks/{chunk-DIMEPKCW.js → chunk-GDXSXL3H.js} +11 -1
  104. package/chunks/{chunk-7JPW6IYH.js → chunk-GN422P4J.js} +1 -1
  105. package/chunks/{chunk-66KDY3LV.js → chunk-GS7XT345.js} +3 -3
  106. package/chunks/{chunk-PFCQ62V4.js → chunk-H2A2GJGL.js} +6 -6
  107. package/chunks/{chunk-Z7FLBQPR.js → chunk-H5GPPDGY.js} +8 -8
  108. package/chunks/{chunk-CPGJJJLU.js → chunk-HDMKCJHI.js} +1 -1
  109. package/chunks/{chunk-6PJOTWAN.js → chunk-HT5S5TRQ.js} +1 -1
  110. package/chunks/{chunk-Z4X5MTRT.js → chunk-HWVUSYSN.js} +5 -12
  111. package/chunks/{chunk-V4QXXQJ2.js → chunk-I75VKFCJ.js} +4 -4
  112. package/chunks/{chunk-NU7RKEZR.js → chunk-IBMUI5EV.js} +3 -3
  113. package/chunks/{chunk-4J657AJR.js → chunk-ID33ZRWH.js} +42 -42
  114. package/chunks/{chunk-R4PMVSR5.js → chunk-IIFL7QDN.js} +30 -192
  115. package/chunks/{chunk-MQM5PJML.js → chunk-IVUWTA2D.js} +1 -1
  116. package/chunks/{chunk-E55H6BZ7.js → chunk-IXEZHTDR.js} +1616 -151
  117. package/chunks/{chunk-XF63PKEN.js → chunk-IXHV5MIC.js} +1 -1
  118. package/chunks/{chunk-JHS74YAB.js → chunk-J4Y3QJHF.js} +3 -1
  119. package/chunks/{chunk-MIIVI25Q.js → chunk-JDIO45X7.js} +3 -3
  120. package/chunks/{chunk-QFCDF5PL.js → chunk-JHN7UIDW.js} +1 -1
  121. package/chunks/{chunk-FDY5RMGH.js → chunk-JLSZT354.js} +2 -2
  122. package/chunks/chunk-JMRE4WJQ.js +1849 -0
  123. package/chunks/{chunk-FY76G3G5.js → chunk-JOTYTYYW.js} +6 -6
  124. package/chunks/{chunk-TRZTNIQ6.js → chunk-JOWQD4LO.js} +3 -3
  125. package/chunks/{chunk-KEKZFOL6.js → chunk-JPKTAQS3.js} +1 -1
  126. package/chunks/chunk-JS73NNWF.js +30 -0
  127. package/chunks/chunk-JX6XHPTX.js +26 -0
  128. package/chunks/{chunk-5JTIYALA.js → chunk-JZWOCUZ3.js} +1 -1
  129. package/chunks/{chunk-3JGZSIDA.js → chunk-KFN2IZYR.js} +3 -3
  130. package/chunks/{chunk-23RFD54N.js → chunk-KHP66DFN.js} +1 -1
  131. package/chunks/{chunk-AGR5UROZ.js → chunk-KUDI54QQ.js} +23 -33
  132. package/chunks/{chunk-3SGB2UHX.js → chunk-L2OKAIUK.js} +28 -16
  133. package/chunks/{chunk-BXDAPVQU.js → chunk-L6CUJZDG.js} +28 -4
  134. package/chunks/chunk-LAUEEBDL.js +277 -0
  135. package/chunks/{chunk-BNMF3K5X.js → chunk-LFAR7CPW.js} +55 -39
  136. package/chunks/{chunk-Y3QL45LS.js → chunk-LKODFJRD.js} +9 -9
  137. package/chunks/{chunk-BWORX6FA.js → chunk-LMMHS3RS.js} +1 -1
  138. package/chunks/{chunk-UTLCH2FK.js → chunk-LYSZVCCD.js} +10 -7
  139. package/chunks/{chunk-F6FV3C5K.js → chunk-MBZ5ORJB.js} +264 -283
  140. package/chunks/{chunk-L6YT5H34.js → chunk-MJBHSZEJ.js} +5 -5
  141. package/chunks/{chunk-B7CDU2SL.js → chunk-MOF6VZN2.js} +18 -21
  142. package/chunks/{chunk-6LFJEACX.js → chunk-MZ5A5PQW.js} +7 -7
  143. package/chunks/chunk-MZYWNU66.js +149 -0
  144. package/chunks/{chunk-2TNL5KPM.js → chunk-N4QWUPDM.js} +7 -0
  145. package/chunks/{chunk-5O72BNDD.js → chunk-ND7TQQPE.js} +9 -9
  146. package/chunks/{chunk-QP4C6WCE.js → chunk-NGKLMNWN.js} +3 -3
  147. package/chunks/{chunk-JSC3H3TD.js → chunk-NT5XIL5H.js} +46 -18
  148. package/chunks/{chunk-KUX5D6DK.js → chunk-NT7LXVV5.js} +11010 -11138
  149. package/chunks/{chunk-PDQGMSZK.js → chunk-ODZF64DM.js} +1 -1
  150. package/chunks/{chunk-FBSSIAAQ.js → chunk-OE5AQVNB.js} +8 -8
  151. package/chunks/chunk-OHU2H5CS.js +130 -0
  152. package/chunks/{chunk-2K6ORIHJ.js → chunk-OKMDOATP.js} +13 -13
  153. package/chunks/{chunk-JB4JIVTJ.js → chunk-OKTNXDVO.js} +1 -1
  154. package/chunks/{chunk-XDLEZ5HX.js → chunk-OQYXJK2V.js} +1 -1
  155. package/chunks/{chunk-EFUM7RVY.js → chunk-OSTQZIOY.js} +944 -18
  156. package/chunks/{chunk-VQUGEVGR.js → chunk-OTTNXUT5.js} +1 -1
  157. package/chunks/{chunk-T3WXYEZ4.js → chunk-PB7JBAHF.js} +53 -54
  158. package/chunks/{chunk-WAOIHTJS.js → chunk-PDAKFU7M.js} +1 -1
  159. package/chunks/{chunk-43GGFFLY.js → chunk-PDXYZBBQ.js} +3 -3
  160. package/chunks/{chunk-4CMJKUND.js → chunk-PNIGAVY6.js} +67 -2
  161. package/chunks/{chunk-SAH4BD2J.js → chunk-PQEISIKS.js} +67 -0
  162. package/chunks/{chunk-4CDSK5AZ.js → chunk-PWR2NQBS.js} +6 -6
  163. package/chunks/{chunk-YTDVNSUQ.js → chunk-QAK5475D.js} +1 -1
  164. package/chunks/{chunk-IJKTMLBE.js → chunk-QE7DTCLX.js} +1 -1
  165. package/chunks/{chunk-SMPR7SPO.js → chunk-QJNDUTOL.js} +45 -239
  166. package/chunks/{chunk-C6K43ZDE.js → chunk-QTMPM6RC.js} +16 -10
  167. package/chunks/{chunk-P5GGM4KS.js → chunk-RAEEQEC5.js} +5 -5
  168. package/chunks/{chunk-XDFHY4R3.js → chunk-RGEV5AUD.js} +242 -14
  169. package/chunks/{chunk-M6FOJXW3.js → chunk-RKW36UWC.js} +1 -1
  170. package/chunks/{chunk-RIEFGNTP.js → chunk-RLSPPTWH.js} +5119 -683
  171. package/chunks/{chunk-PDMJ3KGS.js → chunk-RT4QNQ5P.js} +3 -3
  172. package/chunks/{chunk-SJ3ZUWFK.js → chunk-RVCGAHC7.js} +4 -26
  173. package/chunks/{chunk-77RG5SFQ.js → chunk-RY7DL5IF.js} +11 -6
  174. package/chunks/{chunk-4FTKQNWJ.js → chunk-S2T7H5MI.js} +182 -3
  175. package/chunks/{chunk-EOGELB3H.js → chunk-SDCHI64N.js} +4 -4
  176. package/chunks/{chunk-EKSCLBBF.js → chunk-SMJYTKTB.js} +23 -5
  177. package/chunks/{chunk-MZS7GEC7.js → chunk-SMRDCANI.js} +1 -1
  178. package/chunks/{chunk-43UYNAWX.js → chunk-T3TL6S3B.js} +4 -4
  179. package/chunks/{chunk-4K7NQDCG.js → chunk-T4EFG2P5.js} +18 -9
  180. package/chunks/{chunk-IK5BW3CS.js → chunk-T4RMUTTT.js} +16 -5
  181. package/chunks/{chunk-L6BZRIUL.js → chunk-TBJ3SNS3.js} +183 -5
  182. package/chunks/{chunk-CCBZDVUA.js → chunk-TNMOFNT4.js} +133 -122
  183. package/chunks/{chunk-Y6LSMB6J.js → chunk-TV7BJ7TX.js} +1 -1
  184. package/chunks/{chunk-G34IR3D6.js → chunk-U5RTYI7D.js} +102 -146
  185. package/chunks/{chunk-TTX2JUE6.js → chunk-U6D2PPMN.js} +1 -1
  186. package/chunks/{chunk-D5LUXLUH.js → chunk-UJ4DUYIH.js} +18 -4
  187. package/chunks/{chunk-A7YP63XN.js → chunk-UKB2TZAO.js} +5 -5
  188. package/chunks/{chunk-VTHREBQM.js → chunk-UKYXYWI2.js} +2 -2
  189. package/chunks/{chunk-2NYCN6F2.js → chunk-UVYKCRJZ.js} +46 -29
  190. package/chunks/{chunk-HVEYF6VT.js → chunk-UXEW7TQS.js} +2 -2
  191. package/chunks/{chunk-HVQ3B7FF.js → chunk-V4HN35IF.js} +44 -7
  192. package/chunks/chunk-VGHZT6JR.js +51 -0
  193. package/chunks/{chunk-V5J4J5TP.js → chunk-VYSZUQGU.js} +2 -20
  194. package/chunks/{chunk-6IUNAPLR.js → chunk-W4BDHLRT.js} +3 -3
  195. package/chunks/{chunk-Q26AYA62.js → chunk-W7KWB6AH.js} +7 -4
  196. package/chunks/chunk-WLEYH7CD.js +332 -0
  197. package/chunks/{chunk-RU7BK6B3.js → chunk-X7C7KFWA.js} +2 -2
  198. package/chunks/{chunk-YRLW2MSX.js → chunk-XBVNNDPK.js} +11 -4
  199. package/chunks/{chunk-BFPESSTR.js → chunk-XEAAO654.js} +1 -1
  200. package/chunks/{chunk-JU4EEXC7.js → chunk-XLENZQXH.js} +2 -2
  201. package/chunks/{chunk-JSHHYW6T.js → chunk-XPDKSOVW.js} +69 -64
  202. package/chunks/chunk-YDQ4OCDK.js +1222 -0
  203. package/chunks/{chunk-ZU4UDIWX.js → chunk-YKADANK6.js} +6 -7
  204. package/chunks/{chunk-JCQD3INC.js → chunk-YNG7XAJU.js} +3 -3
  205. package/chunks/{chunk-O2UN57NX.js → chunk-YOFULAHO.js} +19 -2
  206. package/chunks/{chunk-BAJKAAOY.js → chunk-YOMKOM7E.js} +4892 -1504
  207. package/chunks/{chunk-ERFDKH32.js → chunk-YPISTYEI.js} +8 -7
  208. package/chunks/{chunk-TGWAQ5RB.js → chunk-ZBDYI7VM.js} +6900 -6882
  209. package/chunks/{chunk-OZ6KS6KW.js → chunk-ZGCKTAL5.js} +6 -1
  210. package/chunks/chunk-ZHO2CW6D.js +205 -0
  211. package/chunks/{chunk-DZWPESIF.js → chunk-ZQ3FKEWA.js} +3 -3
  212. package/chunks/{chunk-7EQQR46F.js → chunk-ZVP4PWBU.js} +1 -1
  213. package/chunks/{chunk-7UYV53BC.js → chunk-ZYPJ7HVZ.js} +1 -1
  214. package/chunks/config-utils-NNUPVGEC.js +118 -0
  215. package/chunks/contextCommand-S3TPCDM5.js +111 -0
  216. package/chunks/{core-runtime-677KFX6Q.js → core-runtime-NASPCSQX.js} +66 -63
  217. package/chunks/{create-sub-session-23ITIELI.js → create-sub-session-36TNCHCP.js} +3 -3
  218. package/chunks/{create-sub-session-JKZAYZX7.js → create-sub-session-DS4BJLYZ.js} +97 -68
  219. package/chunks/{cron-create-KJ4IY6PP.js → cron-create-QXHTYUTO.js} +4 -4
  220. package/chunks/{cron-delete-MBLQCAYY.js → cron-delete-WV2BM42M.js} +4 -4
  221. package/chunks/{cron-list-DWH2PQ47.js → cron-list-7KVNBLZ7.js} +4 -4
  222. package/chunks/{daemon-MJQUO7RA.js → daemon-UCVUHPJD.js} +723 -90
  223. package/chunks/{daemon-git-worktree-guard-6MVAAZZZ.js → daemon-git-worktree-guard-ATXVQPS3.js} +63 -60
  224. package/chunks/daemon-status-provider-UI3GBTMO.js +121 -0
  225. package/chunks/daemon-trust-policy-SUCBJ2CA.js +117 -0
  226. package/chunks/{daemon-trust-policy-monitor-B5U6TQX5.js → daemon-trust-policy-monitor-3LM5RQNS.js} +71 -68
  227. package/chunks/{de-X6HLSIFE.js → de-T4BLOKEC.js} +3 -0
  228. package/chunks/deferred-core-runtime-SCOJLVYG.js +119 -0
  229. package/chunks/{display-image-BE7I6ZB6.js → display-image-Z4VBQDEJ.js} +5 -5
  230. package/chunks/{dist-TJUDJTCB.js → dist-5423MG3D.js} +411 -91
  231. package/chunks/{dist-ILDBUWDB.js → dist-7WDZYMWV.js} +43 -25
  232. package/chunks/{dist-ZBVOXSKF.js → dist-FLJLHASF.js} +219 -121
  233. package/chunks/{dist-QODVOVWI.js → dist-GPSRNVVP.js} +43 -35
  234. package/chunks/{dist-DJBNNPLN.js → dist-LY66XNUL.js} +10 -3
  235. package/chunks/{dist-7CKN54NL.js → dist-S3BKCTWF.js} +205 -89
  236. package/chunks/{dist-UQUFZDIY.js → dist-SDKHGH5O.js} +41 -20
  237. package/chunks/{dist-4Q7NTUNB.js → dist-WAUO5OMN.js} +46 -22
  238. package/chunks/{dist-SATKXKUR.js → dist-WIVVPE7M.js} +28 -14
  239. package/chunks/earlyInputCapture-INWJ2STR.js +112 -0
  240. package/chunks/{edit-BSV6YRVW.js → edit-B7ZRRGAE.js} +51 -49
  241. package/chunks/{en-YLXBXM4Z.js → en-E4AYTX6H.js} +3 -0
  242. package/chunks/{enter-worktree-MQXFFPKM.js → enter-worktree-SPZHEETQ.js} +7 -7
  243. package/chunks/{enterPlanMode-PKNF35FE.js → enterPlanMode-S554IKJ2.js} +55 -53
  244. package/chunks/environment-25ADH4Y6.js +134 -0
  245. package/chunks/errors-G2I6LFTW.js +118 -0
  246. package/chunks/{exit-worktree-L344UY7K.js → exit-worktree-AWUXAMAM.js} +7 -7
  247. package/chunks/exitPlanMode-ZFH4OYPM.js +87 -0
  248. package/chunks/{fast-path-773PV7PU.js → fast-path-WZHVZ2ER.js} +8 -7
  249. package/chunks/{fast-path-settings-XMFBYFUH.js → fast-path-settings-NILM6QZL.js} +3 -3
  250. package/chunks/{fr-FTZWF462.js → fr-BGHGYX6A.js} +3 -0
  251. package/chunks/{glob-CZHOWUEA.js → glob-UOVDMBUP.js} +50 -48
  252. package/chunks/{goal-tools-YZQJXTGH.js → goal-tools-7TNK5ZHC.js} +5 -4
  253. package/chunks/{grep-5GPICQBU.js → grep-LHYJ5V2N.js} +9 -7
  254. package/chunks/handleAutoUpdate-4MZ45DZY.js +114 -0
  255. package/chunks/i18n-KWUEI4DS.js +129 -0
  256. package/chunks/{image-gen-HAYOEQ4O.js → image-gen-YZDVO5YS.js} +8 -10
  257. package/chunks/initializer-2NBROGMG.js +118 -0
  258. package/chunks/installationInfo-YKUSY3ZB.js +112 -0
  259. package/chunks/{ja-2GL5FKYJ.js → ja-G3FTD5XE.js} +3 -0
  260. package/chunks/{keychain-token-storage-37XPR34V.js → keychain-token-storage-REZVMJA6.js} +2 -2
  261. package/chunks/list-W2WV3COM.js +121 -0
  262. package/chunks/list-agents-PMVMHNY7.js +128 -0
  263. package/chunks/{gemini-IP4FJAP5.js → llm-NPPHLIJI.js} +162 -133
  264. package/chunks/{geminiContentGenerator-PUNEBWJW.js → llm-content-generator-YK3WN6XW.js} +29 -29
  265. package/chunks/loadedSettingsAdapter-2P7DFWUR.js +115 -0
  266. package/chunks/{loggingContentGenerator-2GGZNGLG.js → loggingContentGenerator-QYYYGU6V.js} +318 -35
  267. package/chunks/{loop-wakeup-XJFONSQ7.js → loop-wakeup-EBM4F5MZ.js} +5 -5
  268. package/chunks/{ls-3VAT2J7A.js → ls-F6TRX3DD.js} +4 -4
  269. package/chunks/{lsp-5W7IRUBH.js → lsp-QYTOS2FI.js} +2 -2
  270. package/chunks/{managed-npm-update-5TEV2E3J.js → managed-npm-update-UMC4NBWW.js} +64 -61
  271. package/chunks/mcp-OFI6XDP2.js +115 -0
  272. package/chunks/{monitor-FI7PY36Z.js → monitor-QX3BM3JY.js} +50 -48
  273. package/chunks/nonInteractiveCli-NVRMD5MN.js +193 -0
  274. package/chunks/{notebook-edit-TPGMGBST.js → notebook-edit-AAILDPSV.js} +51 -49
  275. package/chunks/{open-with-auth-4UI3KHUR.js → open-with-auth-D6JD6LDS.js} +4 -4
  276. package/chunks/{openaiContentGenerator-SUCYANUZ.js → openaiContentGenerator-53PB3CMN.js} +27 -29
  277. package/chunks/pidfile-5ACKG2LI.js +116 -0
  278. package/chunks/process-registry-OAEG6WGC.js +662 -0
  279. package/chunks/{processUtils-IQZBYWSB.js → processUtils-2BCDO3DZ.js} +2 -2
  280. package/chunks/prompt-terminal-ledger-3RKW73A2.js +110 -0
  281. package/chunks/{pt-XN2YWJVM.js → pt-D73IFYT7.js} +3 -0
  282. package/chunks/{qwenContentGenerator-J4TXFGJT.js → qwenContentGenerator-N4LLWDPH.js} +56 -54
  283. package/chunks/{qwenOAuth2-RF33DNZW.js → qwenOAuth2-7AOCKSOQ.js} +7 -9
  284. package/chunks/{read-file-QE2B5FTX.js → read-file-DPAKXHYE.js} +13 -13
  285. package/chunks/{read-mcp-resource-XD257PGJ.js → read-mcp-resource-R4NO75DW.js} +2 -2
  286. package/chunks/{record-artifact-RZGZBENU.js → record-artifact-2EAYLAL5.js} +4 -4
  287. package/chunks/{report-findings-Q3SYKKW5.js → report-findings-Y4MSHDS3.js} +9 -5
  288. package/chunks/{request-shutdown-BCLA3JV2.js → request-shutdown-DWRMGTMB.js} +8 -7
  289. package/chunks/resumeHistoryUtils-3JQORXAK.js +123 -0
  290. package/chunks/ripGrep-AHF5QCI7.js +39 -0
  291. package/chunks/{ru-OLTMFJEW.js → ru-QMISLKRH.js} +3 -0
  292. package/chunks/{run-qwen-serve-TPHZMSXJ.js → run-qwen-serve-3LKV7KDC.js} +728 -256
  293. package/chunks/runtime-66F4W3IA.js +153 -0
  294. package/chunks/scheduled-tasks-2NVKS5Q2.js +132 -0
  295. package/chunks/scheduler-JNV7T3ZO.js +127 -0
  296. package/chunks/{sdk-exporters-http-KCJ4ZFG7.js → sdk-exporters-http-MFIWD23D.js} +2 -2
  297. package/chunks/{sdk-impl-HLSEDAEP.js → sdk-impl-2RXJ4Q6X.js} +11 -5
  298. package/chunks/send-message-WPZRCJOB.js +442 -0
  299. package/chunks/serve-GP2UNRP7.js +123 -0
  300. package/chunks/{server-DFUSSSHI.js → server-7W6C3SOW.js} +5233 -3623
  301. package/chunks/{session-3TEHNENZ.js → session-PZLBAQGG.js} +125 -118
  302. package/chunks/session-pr-refresh-OIVL3U3Z.js +367 -0
  303. package/chunks/{settings-VOZYKLTT.js → settings-ZOHIQWYK.js} +70 -67
  304. package/chunks/shell-FWZT6IUR.js +97 -0
  305. package/chunks/{skill-FEOKFX26.js → skill-RTQC2YGA.js} +121 -65
  306. package/chunks/skill-settings-AKMIXFSJ.js +123 -0
  307. package/chunks/spawnChannel-ZP23JL6O.js +116 -0
  308. package/chunks/standalone-update-P2Q5H4ZU.js +123 -0
  309. package/chunks/{startInteractiveUI-WHJPFOGH.js → startInteractiveUI-NSA6QPQZ.js} +2018 -1526
  310. package/chunks/{stdioHelpers-7A2EE64Z.js → stdioHelpers-AY6XCDY2.js} +3 -1
  311. package/chunks/{syntheticOutput-ML43GEFN.js → syntheticOutput-5URSQLIS.js} +3 -3
  312. package/chunks/{task-create-TMSV7RD5.js → task-create-3EXVDG3G.js} +12 -12
  313. package/chunks/{task-list-W55RBFRX.js → task-list-PIBYNSE7.js} +5 -6
  314. package/chunks/{task-stop-CXEH5L2D.js → task-stop-IV3BYWJC.js} +2 -2
  315. package/chunks/{task-update-N536I4GQ.js → task-update-H5BPDS5Y.js} +13 -14
  316. package/chunks/{team-create-QYSWCYCL.js → team-create-53T42W37.js} +56 -55
  317. package/chunks/{team-delete-FJRFX33M.js → team-delete-X3WPELS6.js} +25 -8
  318. package/chunks/{team-plan-approval-P7DAD644.js → team-plan-approval-D45ZC5OE.js} +50 -48
  319. package/chunks/terminal-image-renderer-FCRUWT6C.js +121 -0
  320. package/chunks/theme-manager-MHNPEDP7.js +107 -0
  321. package/chunks/{todoWrite-WDJNQEMW.js → todoWrite-A5IOZZ3P.js} +4 -4
  322. package/chunks/{tool-search-F2EMIAPV.js → tool-search-6RPBGGUX.js} +27 -23
  323. package/chunks/total-session-admission-MGV56XDK.js +117 -0
  324. package/chunks/trustedFolders-QJYEFMTU.js +127 -0
  325. package/chunks/{types-WYCFCEHR.js → types-HKLPXZB3.js} +1 -3
  326. package/chunks/{update-relaunch-4GF3OXMB.js → update-relaunch-ZDMQX63C.js} +6 -6
  327. package/chunks/updateCheck-4QZWCGP6.js +123 -0
  328. package/chunks/useAutoAcceptIndicator-DLIQN256.js +125 -0
  329. package/chunks/{validateNonInterActiveAuth-BPPA563H.js → validateNonInterActiveAuth-HGTG7AEK.js} +114 -107
  330. package/chunks/{version-ANP4TS6O.js → version-CPAZMC4B.js} +1 -1
  331. package/chunks/{web-fetch-QJADSAH3.js → web-fetch-N4K5M3M4.js} +16 -18
  332. package/chunks/{web-search-7TTQKEKM.js → web-search-4VZKM5SF.js} +9 -11
  333. package/chunks/{web-shell-static-A6QMUNNV.js → web-shell-static-PW7OEDQO.js} +3 -2
  334. package/chunks/{workflow-5XN6XSOT.js → workflow-2ALQKTHG.js} +229 -146
  335. package/chunks/workspace-providers-status-5JM4CB6R.js +119 -0
  336. package/chunks/{workspace-registration-store-XKVW2YVH.js → workspace-registration-store-RNMFVCH7.js} +2 -1
  337. package/chunks/workspace-registry-6EULAPZC.js +126 -0
  338. package/chunks/workspace-runtime-coordinator-IRI2DRCJ.js +127 -0
  339. package/chunks/workspace-service-SETHN4WE.js +131 -0
  340. package/chunks/workspace-skills-status-4D4EUEQU.js +118 -0
  341. package/chunks/{workspace-trust-reconciler-KLGOB53D.js → workspace-trust-reconciler-4LR3CDL4.js} +77 -76
  342. package/chunks/write-file-45GWPSOI.js +92 -0
  343. package/chunks/{zh-UNY63FR3.js → zh-2BQ7P6OD.js} +3 -0
  344. package/chunks/{zh-TW-RPTMRTHG.js → zh-TW-UFXRZTXX.js} +3 -0
  345. package/chunks/{zoom-image-6ASG6J4C.js → zoom-image-K6IQUKRC.js} +13 -13
  346. package/cli.js +129 -92
  347. package/locales/ca.js +6 -0
  348. package/locales/de.js +6 -0
  349. package/locales/en.js +6 -0
  350. package/locales/fr.js +6 -0
  351. package/locales/ja.js +6 -0
  352. package/locales/pt.js +6 -0
  353. package/locales/ru.js +6 -0
  354. package/locales/zh-TW.js +6 -0
  355. package/locales/zh.js +6 -0
  356. package/package.json +3 -3
  357. package/web-shell/assets/{abnfDiagram-VCTEODGH-uS-vtfs3.js → abnfDiagram-VCTEODGH-C80OZcPP.js} +1 -1
  358. package/web-shell/assets/{arc-BSTnk5pu.js → arc-AUqStYgf.js} +1 -1
  359. package/web-shell/assets/{architectureDiagram-5GKGNRK7-DCMyiqzy.js → architectureDiagram-5GKGNRK7-CQYOdYla.js} +1 -1
  360. package/web-shell/assets/{blockDiagram-NRAW4CY4-C7_gt0r1.js → blockDiagram-NRAW4CY4-lYKlFysy.js} +1 -1
  361. package/web-shell/assets/{c4Diagram-UCG6FXSJ-BeQg2L8B.js → c4Diagram-UCG6FXSJ-BoS23iIp.js} +1 -1
  362. package/web-shell/assets/channel-B0ovOJeK.js +1 -0
  363. package/web-shell/assets/{chunk-2Q5K7J3B-DnV9bKBe.js → chunk-2Q5K7J3B-DLLooL1E.js} +1 -1
  364. package/web-shell/assets/{chunk-5VM5RSS4-rT1GAcT7.js → chunk-5VM5RSS4-kPfJxScY.js} +1 -1
  365. package/web-shell/assets/{chunk-F27PBJKO-BcgSxqGA.js → chunk-F27PBJKO-CVGFBqkD.js} +1 -1
  366. package/web-shell/assets/{chunk-G27WJ6UU-Bw1ZhyZq.js → chunk-G27WJ6UU-CnM_kOVV.js} +1 -1
  367. package/web-shell/assets/{chunk-JWPE2WC7-D4iDw-96.js → chunk-JWPE2WC7-Cj-ajOkT.js} +1 -1
  368. package/web-shell/assets/{chunk-LCL6LL3I-D3MB3GTZ.js → chunk-LCL6LL3I-8L5c-wFo.js} +1 -1
  369. package/web-shell/assets/{chunk-POPQ4Y6H-Cep2ndrS.js → chunk-POPQ4Y6H-DsXTxpvL.js} +1 -1
  370. package/web-shell/assets/{chunk-SVP7TREG-BuahMHJc.js → chunk-SVP7TREG-DU5GE1_z.js} +1 -1
  371. package/web-shell/assets/{chunk-XXDRQBXY-BdujIvJY.js → chunk-XXDRQBXY-D2IIWZKt.js} +1 -1
  372. package/web-shell/assets/classDiagram-DTDB5LWJ-DMll2-6_.js +1 -0
  373. package/web-shell/assets/classDiagram-v2-JRS7N3AN-DMll2-6_.js +1 -0
  374. package/web-shell/assets/{cose-bilkent-JH36ORCC-CGLLUbF8.js → cose-bilkent-JH36ORCC-CF_txUJr.js} +1 -1
  375. package/web-shell/assets/{cynefin-OW5HDTMX-D6kDsRSh.js → cynefin-OW5HDTMX-DEZ-My-Z.js} +1 -1
  376. package/web-shell/assets/{cynefinDiagram-5FMLGOSQ-CCy78qZx.js → cynefinDiagram-5FMLGOSQ-BV7EKUS6.js} +1 -1
  377. package/web-shell/assets/{dagre-3AP2YEHR-D5gJuJsf.js → dagre-3AP2YEHR-JGIX0G4H.js} +1 -1
  378. package/web-shell/assets/{diagram-S7CK7UJ4-ZwEZ5W__.js → diagram-S7CK7UJ4-DdUY7q6A.js} +1 -1
  379. package/web-shell/assets/{diagram-UQ7AKVKN-B036APjv.js → diagram-UQ7AKVKN-fhzRZ19v.js} +1 -1
  380. package/web-shell/assets/{diagram-VSXAHHWV-BfDJ57Fq.js → diagram-VSXAHHWV-BOgOex6q.js} +1 -1
  381. package/web-shell/assets/{diagram-VX7I27RA-Wha0p5rT.js → diagram-VX7I27RA-C0NknIz6.js} +1 -1
  382. package/web-shell/assets/{diagram-Z3DM3KII-L20bz2K1.js → diagram-Z3DM3KII-C__3mUBX.js} +1 -1
  383. package/web-shell/assets/{ebnfDiagram-PWID7BFC-D1ZM0Cp7.js → ebnfDiagram-PWID7BFC-BvPhqycH.js} +1 -1
  384. package/web-shell/assets/{erDiagram-SSCWMZ5O-CMtA19v8.js → erDiagram-SSCWMZ5O-BqzoNoL9.js} +1 -1
  385. package/web-shell/assets/{flowDiagram-A5DVABFB-D96m326S.js → flowDiagram-A5DVABFB-CJKOre47.js} +1 -1
  386. package/web-shell/assets/{ganttDiagram-EL5Y4UJY-BuHiYG2o.js → ganttDiagram-EL5Y4UJY-C5xZjrp0.js} +1 -1
  387. package/web-shell/assets/{gitGraphDiagram-WWUBYQGX-Ck3NmkSw.js → gitGraphDiagram-WWUBYQGX-C0EjwuPK.js} +1 -1
  388. package/web-shell/assets/index-B_IPzA0h.js +2020 -0
  389. package/web-shell/assets/{index-CBGz4Qjl.js → index-C5M93syE.js} +1 -1
  390. package/web-shell/assets/index-D1OKGQlM.css +36 -0
  391. package/web-shell/assets/{infoDiagram-RXCK75RN-B6DAOyXe.js → infoDiagram-RXCK75RN-BUwzsYOs.js} +1 -1
  392. package/web-shell/assets/{ishikawaDiagram-5VMMS53U-Bpg-joFo.js → ishikawaDiagram-5VMMS53U-EDJ_DH3V.js} +1 -1
  393. package/web-shell/assets/{journeyDiagram-EYS64GPL-BclrHzGa.js → journeyDiagram-EYS64GPL-BnfcOsS0.js} +1 -1
  394. package/web-shell/assets/{kanban-definition-3QL26DDD-5gJzNTYG.js → kanban-definition-3QL26DDD-D_ofTVGu.js} +1 -1
  395. package/web-shell/assets/{layout-CEz_1L8z.js → layout-CBuQFdfZ.js} +1 -1
  396. package/web-shell/assets/{linear-CBjTq9Hc.js → linear-DRIHtmGv.js} +1 -1
  397. package/web-shell/assets/{mermaid.core-Dzhbxx_I.js → mermaid.core-CmR5wZH6.js} +6 -6
  398. package/web-shell/assets/{mindmap-definition-FBJOCRG2-DQdVqlBF.js → mindmap-definition-FBJOCRG2-BV374olC.js} +1 -1
  399. package/web-shell/assets/{pegDiagram-XKGWAZYB-D1JZlYXL.js → pegDiagram-XKGWAZYB-Bpy1SplK.js} +1 -1
  400. package/web-shell/assets/{pieDiagram-E7YTZNPT-BmkpYL0w.js → pieDiagram-E7YTZNPT-CeZx4hR2.js} +1 -1
  401. package/web-shell/assets/{quadrantDiagram-AXDQQJYC-DRvD6co5.js → quadrantDiagram-AXDQQJYC-COYKs14h.js} +1 -1
  402. package/web-shell/assets/{railroadDiagram-O6MQD6OU-CEdjDuoo.js → railroadDiagram-O6MQD6OU-5g2pOeTs.js} +1 -1
  403. package/web-shell/assets/{requirementDiagram-EFPCY7ZU-BCHG-ie8.js → requirementDiagram-EFPCY7ZU-Yn8uPGtF.js} +1 -1
  404. package/web-shell/assets/{sankeyDiagram-P5KCCOFB-C9cZMnye.js → sankeyDiagram-P5KCCOFB-CTayAGq6.js} +1 -1
  405. package/web-shell/assets/{sequenceDiagram-WJ2MYXX4-DYHRV4zL.js → sequenceDiagram-WJ2MYXX4-BFWDKzUU.js} +1 -1
  406. package/web-shell/assets/{sizeCapture-X5ZJPWSS-DlK21aye.js → sizeCapture-X5ZJPWSS-CtErUbj4.js} +1 -1
  407. package/web-shell/assets/{stateDiagram-HBIQ2CUA-BrmZssvk.js → stateDiagram-HBIQ2CUA-Co3HFzOd.js} +1 -1
  408. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-C3gdRjPm.js +1 -0
  409. package/web-shell/assets/{swimlanes-XN3QIQJK-D9xfcayR.js → swimlanes-XN3QIQJK-CDZuxzOj.js} +1 -1
  410. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-C34TGCPZ.js +8 -0
  411. package/web-shell/assets/{timeline-definition-24CTP7MA-D4gdDL_d.js → timeline-definition-24CTP7MA-UcNHj8At.js} +1 -1
  412. package/web-shell/assets/{vennDiagram-4TSXK5OY-DdhIExjI.js → vennDiagram-4TSXK5OY-JKR9pVFG.js} +1 -1
  413. package/web-shell/assets/{wardleyDiagram-VM6X3IG4-C9RS_Zof.js → wardleyDiagram-VM6X3IG4-C4SU-yIW.js} +1 -1
  414. package/web-shell/assets/{xychartDiagram-S5SC5T6Z-orRgmxWk.js → xychartDiagram-S5SC5T6Z-D_yoWGZ4.js} +1 -1
  415. package/web-shell/index.html +197 -3
  416. package/chunks/MaxSizedBox-X5FZSNAJ.js +0 -112
  417. package/chunks/agent-PJIPDWHB.js +0 -97
  418. package/chunks/agent-headless-B4JVD7UK.js +0 -87
  419. package/chunks/bridge-FKZTVIS3.js +0 -121
  420. package/chunks/channel-settings-store-4UFCLBBG.js +0 -117
  421. package/chunks/chunk-7DJCPZE3.js +0 -945
  422. package/chunks/chunk-CPBF7KYF.js +0 -51
  423. package/chunks/chunk-H72BQNM3.js +0 -645
  424. package/chunks/chunk-J2OSJFP3.js +0 -202
  425. package/chunks/chunk-K2OJUPOE.js +0 -78
  426. package/chunks/chunk-P3QQPMQA.js +0 -19
  427. package/chunks/chunk-RUGNCYNO.js +0 -699
  428. package/chunks/chunk-T26EAKDL.js +0 -13
  429. package/chunks/chunk-ZGXYO7DY.js +0 -3416
  430. package/chunks/chunk-ZYNTSXWK.js +0 -32
  431. package/chunks/config-utils-BBOCOGZW.js +0 -113
  432. package/chunks/contextCommand-EET67MQ2.js +0 -108
  433. package/chunks/daemon-status-provider-RFKZOK3S.js +0 -119
  434. package/chunks/daemon-trust-policy-DRZPFB4Q.js +0 -114
  435. package/chunks/deferred-core-runtime-BBVIOP24.js +0 -116
  436. package/chunks/earlyInputCapture-2JOMMNQ4.js +0 -109
  437. package/chunks/environment-MOZMPUHR.js +0 -131
  438. package/chunks/errors-DMPQVYJL.js +0 -115
  439. package/chunks/exitPlanMode-UE4FGCY4.js +0 -85
  440. package/chunks/handleAutoUpdate-SGXKTQM6.js +0 -111
  441. package/chunks/i18n-B42HKHKH.js +0 -126
  442. package/chunks/initializer-FB66WYR3.js +0 -115
  443. package/chunks/installationInfo-Y7AULNMX.js +0 -109
  444. package/chunks/list-2HWGSVRA.js +0 -118
  445. package/chunks/list-agents-DI3YFTDT.js +0 -80
  446. package/chunks/loadedSettingsAdapter-7Y7IEI6T.js +0 -112
  447. package/chunks/mcp-QGG5NMJJ.js +0 -112
  448. package/chunks/nonInteractiveCli-4LO2TL72.js +0 -186
  449. package/chunks/pidfile-JMF2CLMY.js +0 -113
  450. package/chunks/process-registry-PMJOA5CO.js +0 -172
  451. package/chunks/prompt-terminal-ledger-DCZO6S7C.js +0 -107
  452. package/chunks/resumeHistoryUtils-CZ4JRDVW.js +0 -120
  453. package/chunks/ripGrep-R6B6HWPX.js +0 -39
  454. package/chunks/runtime-TTIGSBM4.js +0 -150
  455. package/chunks/scheduled-tasks-QB4ZVUQS.js +0 -129
  456. package/chunks/scheduler-YRUG22M7.js +0 -124
  457. package/chunks/send-message-Y5I6NYAM.js +0 -295
  458. package/chunks/serve-MXXCDAQN.js +0 -120
  459. package/chunks/shell-6RTKZVMI.js +0 -95
  460. package/chunks/skill-settings-VA4XVYVL.js +0 -120
  461. package/chunks/spawnChannel-F6WVP723.js +0 -114
  462. package/chunks/standalone-update-RGILUQVK.js +0 -120
  463. package/chunks/terminal-image-renderer-SMQE46UJ.js +0 -116
  464. package/chunks/theme-manager-RFO5WWFF.js +0 -104
  465. package/chunks/total-session-admission-HTVTP4BS.js +0 -116
  466. package/chunks/trustedFolders-7OCNMUQE.js +0 -124
  467. package/chunks/updateCheck-7QBDXZRT.js +0 -120
  468. package/chunks/useAutoAcceptIndicator-UI4SNL2O.js +0 -122
  469. package/chunks/workspace-providers-status-PDFZWL5Q.js +0 -116
  470. package/chunks/workspace-registry-23R7XRB5.js +0 -125
  471. package/chunks/workspace-service-MUYO2QIC.js +0 -131
  472. package/chunks/workspace-skills-status-IKECTOOQ.js +0 -115
  473. package/chunks/write-file-GGRBB5TZ.js +0 -90
  474. package/web-shell/assets/channel-CENAhErJ.js +0 -1
  475. package/web-shell/assets/classDiagram-DTDB5LWJ-CM6FArGH.js +0 -1
  476. package/web-shell/assets/classDiagram-v2-JRS7N3AN-CM6FArGH.js +0 -1
  477. package/web-shell/assets/index-8hXIpvo4.js +0 -1865
  478. package/web-shell/assets/index-DclEv91i.css +0 -5
  479. package/web-shell/assets/stateDiagram-v2-4QOOHH4V-B2Q7XDaE.js +0 -1
  480. package/web-shell/assets/swimlanesDiagram-VK2B7HYN-DpZPOSbX.js +0 -8
@@ -4,11 +4,15 @@ import {
4
4
  computeCpuPercent
5
5
  } from "./chunk-LBOVL47Y.js";
6
6
  import {
7
- RUNTIME_STARTUP_CANCELLED_MESSAGE
8
- } from "./chunk-QUPXZXLV.js";
7
+ hostAssignsIpv6Loopback,
8
+ isOwnInterfaceAddress
9
+ } from "./chunk-24FVUD5P.js";
9
10
  import {
10
11
  resolveServeToken
11
12
  } from "./chunk-ZELCTN6Y.js";
13
+ import {
14
+ RUNTIME_STARTUP_CANCELLED_MESSAGE
15
+ } from "./chunk-QUPXZXLV.js";
12
16
  import {
13
17
  ACCESS_LOG_CONTROLLER_LOCAL,
14
18
  CAPABILITIES_SCHEMA_VERSION,
@@ -24,39 +28,47 @@ import {
24
28
  bearerAuth,
25
29
  createBridgeFileSystemAdapter,
26
30
  denyBrowserOriginCors,
31
+ findNonLoopbackHttpOrigin,
27
32
  getAdvertisedServeFeatures,
28
33
  getDeviceFlowRegistry,
29
34
  getRateLimiter,
30
35
  getServeProtocolVersions,
31
36
  hostAllowlist,
37
+ installSelfOriginStripMiddleware,
32
38
  isBrowserAutomationMcpAvailable,
33
39
  isDeepHealthQuery,
34
40
  isManagedScratchChild,
41
+ isNativeDirectoryPickerAvailable,
42
+ isTrustedLoopbackMode,
35
43
  listenerMaxConnections,
36
44
  parseAllowOriginPatterns,
37
45
  parseDaemonStatusDetail,
38
46
  positiveFiniteOrNull,
39
47
  prepareManagedScratchRoot,
40
48
  resolveAcpHttpEnabled,
41
- setDeferredRuntimeRequestTiming,
42
49
  toDaemonStatusMemoryLimits
43
- } from "./chunk-F6FV3C5K.js";
50
+ } from "./chunk-MBZ5ORJB.js";
51
+ import "./chunk-VGHZT6JR.js";
44
52
  import {
45
53
  ConversationDirectoryIdentityError,
46
54
  assertExactConversationRootIdentity,
47
55
  createConversationRootIdentity,
56
+ getConversationDirectoryName,
57
+ getConversationStagedDirectoryName,
48
58
  inspectConversationDirectoryIdentity,
59
+ inspectConversationStagedDirectoryIdentity,
60
+ isSameConversationDirectoryObject,
49
61
  materializeConversationDirectoryIdentity,
50
62
  revalidateConversationRootIdentity
51
- } from "./chunk-T3WXYEZ4.js";
63
+ } from "./chunk-PB7JBAHF.js";
52
64
  import {
53
65
  formatMemoryBudgetStderr,
54
66
  resolveDaemonMemoryBudget,
55
67
  serveJournalGrowthPoolMb
56
68
  } from "./chunk-UXEO7E3V.js";
57
69
  import {
58
- isLoopbackBind
59
- } from "./chunk-RXFQM6FQ.js";
70
+ setDeferredRuntimeRequestTiming
71
+ } from "./chunk-LAUEEBDL.js";
60
72
  import {
61
73
  normalizeSessionIdForLookup
62
74
  } from "./chunk-ZEZKIS2K.js";
@@ -64,6 +76,9 @@ import "./chunk-NYWWQ437.js";
64
76
  import {
65
77
  resolveSessionRestoreTimeoutMs
66
78
  } from "./chunk-4JRM2BSM.js";
79
+ import {
80
+ DEFAULT_RING_SIZE
81
+ } from "./chunk-7U5G6JXI.js";
67
82
  import {
68
83
  DEFAULT_COMPACTED_REPLAY_MAX_BYTES,
69
84
  DEFAULT_MAX_JOURNAL_BYTES,
@@ -79,9 +94,13 @@ import {
79
94
  import {
80
95
  resolveWebShellDir
81
96
  } from "./chunk-FBX2SDQ4.js";
97
+ import {
98
+ isLoopbackAddress,
99
+ isLoopbackBind
100
+ } from "./chunk-DMEUXLSS.js";
82
101
  import {
83
102
  resolveChannelCwd
84
- } from "./chunk-7JPW6IYH.js";
103
+ } from "./chunk-GN422P4J.js";
85
104
  import {
86
105
  LIVE_HOST_PROTOCOL_VERSION
87
106
  } from "./chunk-NKLP3DCK.js";
@@ -92,17 +111,17 @@ import {
92
111
  consumeServeFastPathRejectedLoaderKeys,
93
112
  loadServeFastPathSettings,
94
113
  preResolveServeFastPathHomeEnvOverrides
95
- } from "./chunk-TWSKM647.js";
114
+ } from "./chunk-6VHIWUJP.js";
96
115
  import {
97
116
  MAX_REGISTERED_WORKSPACES,
98
117
  resolveWorkspaceInputs,
99
118
  workspaceRegistrationId
100
- } from "./chunk-77RG5SFQ.js";
101
- import "./chunk-43UYNAWX.js";
119
+ } from "./chunk-RY7DL5IF.js";
120
+ import "./chunk-T3TL6S3B.js";
102
121
  import {
103
122
  LOAD_REPLAY_META_KEY
104
- } from "./chunk-OZ6KS6KW.js";
105
- import "./chunk-ERFDKH32.js";
123
+ } from "./chunk-ZGCKTAL5.js";
124
+ import "./chunk-YPISTYEI.js";
106
125
  import {
107
126
  canonicalizeWorkspace,
108
127
  translateAndCheckAbsoluteWorkspacePath
@@ -110,22 +129,22 @@ import {
110
129
  import {
111
130
  ExtraCaInspectionError,
112
131
  loadableCertificates
113
- } from "./chunk-4HV6HH33.js";
132
+ } from "./chunk-FPMQT2YY.js";
114
133
  import "./chunk-FYJ7W2PI.js";
115
134
  import "./chunk-Z7B6SRPM.js";
116
135
  import {
117
136
  ChannelWebhookEnqueueError
118
137
  } from "./chunk-STUJ7IMZ.js";
138
+ import {
139
+ QWEN_SERVER_TOKEN_ENV
140
+ } from "./chunk-GYTKQYDB.js";
119
141
  import {
120
142
  normalizeWorkerDiagnostic,
121
143
  sanitizeWorkerDiagnostic
122
- } from "./chunk-JVPFTDBK.js";
144
+ } from "./chunk-3EGEBDTW.js";
123
145
  import {
124
146
  channelSelectionNames
125
147
  } from "./chunk-ALMR3E6Q.js";
126
- import {
127
- QWEN_SERVER_TOKEN_ENV
128
- } from "./chunk-GYTKQYDB.js";
129
148
  import {
130
149
  ChannelDeliveryError,
131
150
  isChannelDeliveryError
@@ -144,7 +163,7 @@ import {
144
163
  } from "./chunk-5HBA2Z7V.js";
145
164
  import {
146
165
  sanitizeLogText
147
- } from "./chunk-E55H6BZ7.js";
166
+ } from "./chunk-IXEZHTDR.js";
148
167
  import "./chunk-IW6RQPQB.js";
149
168
  import "./chunk-GOXKNSDZ.js";
150
169
  import {
@@ -156,10 +175,10 @@ import {
156
175
  clearLoaderKeyRejectionReporterIfCurrent,
157
176
  scrubInheritedLoaderEnv,
158
177
  setLoaderKeyRejectionReporter
159
- } from "./chunk-5PA6UEYA.js";
178
+ } from "./chunk-3452WXOK.js";
160
179
  import {
161
180
  getCliVersion
162
- } from "./chunk-7UYV53BC.js";
181
+ } from "./chunk-ZYPJ7HVZ.js";
163
182
  import "./chunk-W3N5XAZ6.js";
164
183
  import "./chunk-NPQ5ZKRP.js";
165
184
  import {
@@ -168,6 +187,7 @@ import {
168
187
  import "./chunk-LJZSMWOH.js";
169
188
  import "./chunk-GOFAQQZA.js";
170
189
  import "./chunk-5M6IDOMF.js";
190
+ import "./chunk-6HUXPLB5.js";
171
191
  import "./chunk-TWPJO254.js";
172
192
  import "./chunk-CQ35AJ4Z.js";
173
193
  import {
@@ -182,7 +202,7 @@ import "./chunk-JVEGA3MM.js";
182
202
  import {
183
203
  writeStderrLine,
184
204
  writeStdoutLine
185
- } from "./chunk-KGJGEEVR.js";
205
+ } from "./chunk-7FA2II6K.js";
186
206
  import "./chunk-DMTGGOSA.js";
187
207
  import "./chunk-YQ3U5MUC.js";
188
208
  import {
@@ -204,6 +224,7 @@ init_esbuild_shims();
204
224
  var import_express = __toESM(require_express(), 1);
205
225
  import { X509Certificate, createHash as createHash2, timingSafeEqual } from "node:crypto";
206
226
  import { execFile } from "node:child_process";
227
+ import { lookup } from "node:dns/promises";
207
228
  import * as fs from "node:fs";
208
229
  import { createServer } from "node:http";
209
230
  import * as https from "node:https";
@@ -620,11 +641,11 @@ async function ensureRealDirectory(fs2, dirPath, mutationAllowed = () => true) {
620
641
  __name(ensureRealDirectory, "ensureRealDirectory");
621
642
  async function activeFileSize(fs2, activePath) {
622
643
  try {
623
- const stat = await fs2.lstat(activePath);
624
- if (!stat.isFile() || stat.isSymbolicLink()) {
644
+ const stat2 = await fs2.lstat(activePath);
645
+ if (!stat2.isFile() || stat2.isSymbolicLink()) {
625
646
  throw new Error(`${activePath} is not a regular file`);
626
647
  }
627
- return stat.size;
648
+ return stat2.size;
628
649
  } catch (error) {
629
650
  if (isErrno(error, "ENOENT")) return 0;
630
651
  throw error;
@@ -1045,8 +1066,8 @@ __name(closeFallbackFamily, "closeFallbackFamily");
1045
1066
  async function cleanupFallbacksBestEffort(input) {
1046
1067
  const runsDir = nodePath.join(input.daemonDir, "runs");
1047
1068
  try {
1048
- const stat = await input.fs.lstat(runsDir);
1049
- if (!stat.isDirectory() || stat.isSymbolicLink()) {
1069
+ const stat2 = await input.fs.lstat(runsDir);
1070
+ if (!stat2.isDirectory() || stat2.isSymbolicLink()) {
1050
1071
  throw new Error(`${runsDir} is not a real directory`);
1051
1072
  }
1052
1073
  } catch (error) {
@@ -1768,9 +1789,10 @@ __name(initDaemonLogger, "initDaemonLogger");
1768
1789
 
1769
1790
  // packages/cli/src/serve/conversations/conversation-workspace.ts
1770
1791
  init_esbuild_shims();
1771
- import { readdir, rmdir } from "node:fs/promises";
1792
+ import { constants as fsConstants } from "node:fs";
1793
+ import { open, readdir, rename, rm, rmdir, stat } from "node:fs/promises";
1772
1794
  import { homedir } from "node:os";
1773
- import { resolve } from "node:path";
1795
+ import { join as join2, resolve } from "node:path";
1774
1796
  function liveIdentityError(error, exactRoot = false, creatingRoot = false) {
1775
1797
  if (!(error instanceof ConversationDirectoryIdentityError)) throw error;
1776
1798
  if (error.reason === "io_error" && error.cause !== void 0) {
@@ -2012,6 +2034,171 @@ var ConversationWorkspace = class {
2012
2034
  throw error;
2013
2035
  }
2014
2036
  }
2037
+ async inspectStandaloneDeletionPaths(storageSessionId, expected) {
2038
+ const root = await this.revalidateStandaloneRoot();
2039
+ try {
2040
+ const normal = await inspectConversationDirectoryIdentity(
2041
+ root,
2042
+ storageSessionId
2043
+ );
2044
+ const staged = await inspectConversationStagedDirectoryIdentity(
2045
+ root,
2046
+ storageSessionId
2047
+ );
2048
+ if (normal && staged) {
2049
+ throw new ConversationDirectoryIdentityError(
2050
+ "child",
2051
+ "unexpected_identity"
2052
+ );
2053
+ }
2054
+ const identity = normal ?? staged;
2055
+ if (identity && expected && !isSameConversationDirectoryObject(identity, expected)) {
2056
+ throw new ConversationDirectoryIdentityError(
2057
+ "child",
2058
+ "unexpected_identity"
2059
+ );
2060
+ }
2061
+ if (normal) return { status: "normal", identity: normal };
2062
+ if (staged) return { status: "staged", identity: staged };
2063
+ return { status: "absent" };
2064
+ } catch (error) {
2065
+ if (error instanceof ConversationDirectoryIdentityError && error.scope === "child") {
2066
+ return { status: "compromised", error };
2067
+ }
2068
+ throw error;
2069
+ }
2070
+ }
2071
+ async createStandaloneDeletionExpectation(storageSessionId, recorded) {
2072
+ if (recorded.inodeVerifiable !== (recorded.inode !== 0)) {
2073
+ throw new ConversationDirectoryIdentityError(
2074
+ "child",
2075
+ "unexpected_identity"
2076
+ );
2077
+ }
2078
+ const root = await this.revalidateStandaloneRoot();
2079
+ const name = getConversationDirectoryName(storageSessionId);
2080
+ return {
2081
+ root,
2082
+ storageSessionId,
2083
+ name,
2084
+ canonicalPath: join2(root.canonicalRoot, name),
2085
+ device: recorded.device,
2086
+ inode: recorded.inode
2087
+ };
2088
+ }
2089
+ async stageStandaloneDirectory(storageSessionId, expected) {
2090
+ const inspected = await this.inspectStandaloneDeletionPaths(
2091
+ storageSessionId,
2092
+ expected
2093
+ );
2094
+ if (inspected.status === "compromised") throw inspected.error;
2095
+ if (inspected.status !== "normal") {
2096
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
2097
+ }
2098
+ const root = await this.revalidateStandaloneRoot();
2099
+ await rename(
2100
+ inspected.identity.canonicalPath,
2101
+ join2(
2102
+ root.canonicalRoot,
2103
+ getConversationStagedDirectoryName(storageSessionId)
2104
+ )
2105
+ );
2106
+ await revalidateConversationRootIdentity(root);
2107
+ const staged = await inspectConversationStagedDirectoryIdentity(
2108
+ root,
2109
+ storageSessionId
2110
+ );
2111
+ if (!staged || !isSameConversationDirectoryObject(staged, inspected.identity)) {
2112
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
2113
+ }
2114
+ await this.syncStandaloneRoot(root);
2115
+ return staged;
2116
+ }
2117
+ async restoreStagedStandaloneDirectory(storageSessionId, expected) {
2118
+ const inspected = await this.inspectStandaloneDeletionPaths(
2119
+ storageSessionId,
2120
+ expected
2121
+ );
2122
+ if (inspected.status === "compromised") throw inspected.error;
2123
+ if (inspected.status !== "staged") {
2124
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
2125
+ }
2126
+ const root = await this.revalidateStandaloneRoot();
2127
+ await rename(
2128
+ inspected.identity.canonicalPath,
2129
+ join2(root.canonicalRoot, getConversationDirectoryName(storageSessionId))
2130
+ );
2131
+ await revalidateConversationRootIdentity(root);
2132
+ const restored = await inspectConversationDirectoryIdentity(
2133
+ root,
2134
+ storageSessionId
2135
+ );
2136
+ if (!restored || !isSameConversationDirectoryObject(restored, inspected.identity)) {
2137
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
2138
+ }
2139
+ await this.syncStandaloneRoot(root);
2140
+ return restored;
2141
+ }
2142
+ async removeStagedStandaloneDirectory(storageSessionId, expected) {
2143
+ const inspected = await this.inspectStandaloneDeletionPaths(
2144
+ storageSessionId,
2145
+ expected
2146
+ );
2147
+ if (inspected.status === "compromised") throw inspected.error;
2148
+ if (inspected.status !== "staged") {
2149
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
2150
+ }
2151
+ const confirmed = await inspectConversationStagedDirectoryIdentity(
2152
+ inspected.identity.root,
2153
+ storageSessionId
2154
+ );
2155
+ if (!confirmed || !isSameConversationDirectoryObject(confirmed, inspected.identity)) {
2156
+ throw new ConversationDirectoryIdentityError("child", "identity_changed");
2157
+ }
2158
+ await rm(confirmed.canonicalPath, { recursive: true });
2159
+ await this.syncStandaloneRoot(confirmed.root);
2160
+ }
2161
+ async confirmStandaloneRootDurability(root) {
2162
+ await this.syncStandaloneRoot(root);
2163
+ }
2164
+ async syncStandaloneRoot(root) {
2165
+ await revalidateConversationRootIdentity(root);
2166
+ let handle;
2167
+ try {
2168
+ handle = await open(
2169
+ root.canonicalRoot,
2170
+ fsConstants.O_RDONLY | (process.platform === "win32" ? 0 : fsConstants.O_NOFOLLOW ?? 0)
2171
+ );
2172
+ const stats = await handle.stat();
2173
+ const inodeVerifiable = Number.isSafeInteger(stats.ino) && stats.ino > 0;
2174
+ if (!stats.isDirectory() || stats.dev !== root.device || inodeVerifiable !== root.inodeVerifiable || root.inodeVerifiable && stats.ino !== root.inode) {
2175
+ throw new ConversationDirectoryIdentityError(
2176
+ "root",
2177
+ "identity_changed"
2178
+ );
2179
+ }
2180
+ try {
2181
+ await handle.sync();
2182
+ } catch (error) {
2183
+ if (process.platform !== "win32" || !["EACCES", "EINVAL", "EPERM"].includes(
2184
+ error.code ?? ""
2185
+ )) {
2186
+ throw error;
2187
+ }
2188
+ }
2189
+ const current = await stat(root.canonicalRoot);
2190
+ const currentInodeVerifiable = Number.isSafeInteger(current.ino) && current.ino > 0;
2191
+ if (!current.isDirectory() || current.dev !== root.device || currentInodeVerifiable !== root.inodeVerifiable || root.inodeVerifiable && current.ino !== root.inode) {
2192
+ throw new ConversationDirectoryIdentityError(
2193
+ "root",
2194
+ "identity_changed"
2195
+ );
2196
+ }
2197
+ } finally {
2198
+ await handle?.close().catch(() => void 0);
2199
+ }
2200
+ await revalidateConversationRootIdentity(root);
2201
+ }
2015
2202
  };
2016
2203
 
2017
2204
  // packages/cli/src/serve/daemon-metrics-ring.ts
@@ -2919,8 +3106,8 @@ var RUNTIME_STARTUP_TIMEOUT_ENV = "QWEN_SERVE_RUNTIME_STARTUP_TIMEOUT_MS";
2919
3106
  var MAX_EVENT_RING_SIZE = 1e6;
2920
3107
  var DEFAULT_MAX_SESSIONS = 32;
2921
3108
  var DEFAULT_MAX_PENDING_PROMPTS_PER_SESSION = 5;
2922
- var DEFAULT_EVENT_RING_SIZE = 8e3;
2923
3109
  var DEFAULT_SESSION_IDLE_TIMEOUT_MS = 30 * 6e4;
3110
+ var DEFAULT_SESSION_PROMPT_SETTLED_CLOSE_GRACE_MS = 0;
2924
3111
  var WORKSPACE_SETTING_SCOPE = "Workspace";
2925
3112
  function isPositiveIntegerMs(value) {
2926
3113
  return Number.isFinite(value) && Number.isInteger(value) && value > 0;
@@ -3054,15 +3241,52 @@ function workspaceRuntimeEffectiveEnv(runtime, daemonEnv) {
3054
3241
  return runtime.env.effectiveEnv ?? daemonEnv;
3055
3242
  }
3056
3243
  __name(workspaceRuntimeEffectiveEnv, "workspaceRuntimeEffectiveEnv");
3057
- function formatChannelWorkerDaemonUrl(host, port, tls = false) {
3244
+ function canonicalIpLiteral(host) {
3245
+ const inner = host.startsWith("[") && host.endsWith("]") ? host.slice(1, -1) : host;
3246
+ try {
3247
+ const hostname = new URL(
3248
+ `http://${inner.includes(":") ? `[${inner}]` : inner}`
3249
+ ).hostname;
3250
+ const canonical = hostname.startsWith("[") && hostname.endsWith("]") ? hostname.slice(1, -1) : hostname;
3251
+ return isIP(canonical) === 0 ? void 0 : canonical;
3252
+ } catch {
3253
+ return void 0;
3254
+ }
3255
+ }
3256
+ __name(canonicalIpLiteral, "canonicalIpLiteral");
3257
+ function formatChannelWorkerDaemonUrl(host, port, tls = false, boundFamily, ipv6LoopbackAssigned = hostAssignsIpv6Loopback()) {
3058
3258
  const scheme = tls ? "https" : "http";
3059
3259
  const normalized = host.trim().toLowerCase();
3060
- if (normalized === "" || normalized === "0.0.0.0" || normalized === "::" || normalized === "[::]") {
3260
+ const canonicalIp = canonicalIpLiteral(normalized);
3261
+ const v6Loopback = ipv6LoopbackAssigned ? `${scheme}://[::1]:${port}` : `${scheme}://127.0.0.1:${port}`;
3262
+ if (normalized === "") {
3263
+ return boundFamily === "IPv4" ? `${scheme}://127.0.0.1:${port}` : v6Loopback;
3264
+ }
3265
+ if (canonicalIp === "::") {
3266
+ return v6Loopback;
3267
+ }
3268
+ if (canonicalIp === "0.0.0.0" || canonicalIp === "::ffff:0:0") {
3061
3269
  return `${scheme}://127.0.0.1:${port}`;
3062
3270
  }
3063
3271
  return `${scheme}://${formatHostForUrl(host)}:${port}`;
3064
3272
  }
3065
3273
  __name(formatChannelWorkerDaemonUrl, "formatChannelWorkerDaemonUrl");
3274
+ function assertChannelWorkerDaemonUrlIsLocal(workerDaemonUrl, hostname) {
3275
+ let host;
3276
+ try {
3277
+ host = new URL(workerDaemonUrl).hostname;
3278
+ } catch {
3279
+ throw new Error(
3280
+ `Channels cannot start: --hostname "${hostname}" cannot be carried in a worker URL (a zone-scoped address has no spelling the URL parser accepts). Bind to loopback, to the wildcard (0.0.0.0 / ::), or to a zone-less literal address of one of this machine's interfaces.`
3281
+ );
3282
+ }
3283
+ if (isLoopbackBind(host)) return;
3284
+ if (isOwnInterfaceAddress(host)) return;
3285
+ throw new Error(
3286
+ `Channels cannot start: --hostname "${hostname}" is not a loopback bind and does not name an address on this host, so channel workers have no local URL to reach the daemon on. Bind to loopback, to the wildcard (0.0.0.0 / ::), or to a literal address of one of this machine's interfaces.`
3287
+ );
3288
+ }
3289
+ __name(assertChannelWorkerDaemonUrlIsLocal, "assertChannelWorkerDaemonUrlIsLocal");
3066
3290
  var WORKER_TLS_TRUST_PROBE = `
3067
3291
  import { isIP } from 'node:net';
3068
3292
  import * as tls from 'node:tls';
@@ -3181,9 +3405,11 @@ function describeWorkerTlsTrustGaps(opts) {
3181
3405
  );
3182
3406
  const leafHeldByWorkers = servingBlocks !== void 0 && servingBlocks.some((block) => block.fingerprint256 === x509.fingerprint256);
3183
3407
  const workerTrustStore = operatorChain && servingBlocks ? [...operatorChain, ...servingChain] : servingChain;
3408
+ const now = Date.now();
3184
3409
  const anchorPath = walkWorkerAnchorPath(
3185
3410
  x509,
3186
3411
  workerTrustStore,
3412
+ now,
3187
3413
  // The `servingBlocks === undefined` fallback prepends the leaf too, but
3188
3414
  // that file already reports its own gap below and the workers receive it
3189
3415
  // verbatim; only the partial-read case needs the distinction.
@@ -3239,7 +3465,6 @@ function describeWorkerTlsTrustGaps(opts) {
3239
3465
  `--tls-cert "${opts.certPath}" is issued by another CA (${x509.issuer.replace(/\r?\n/g, ", ")}), not self-signed, and ${!opts.operatorCaCertPath ? `no NODE_EXTRA_CA_CERTS is set` : opts.operatorCaCertReadError !== void 0 ? `NODE_EXTRA_CA_CERTS "${opts.operatorCaCertPath}" could not be read, so whatever it carries reached nobody` : operatorDiscarded ? `NODE_EXTRA_CA_CERTS "${opts.operatorCaCertPath}" was discarded together with the unloadable serving file above, whatever it carries` : `NODE_EXTRA_CA_CERTS "${opts.operatorCaCertPath}" does not carry a certificate that anchors it`}, so nothing in the channel workers' bundle anchors their trust \u2014 every worker handshake to the daemon will fail UNABLE_TO_VERIFY_LEAF_SIGNATURE unless the issuing CA is already in the workers' default trust store. ` + (operatorDiscarded ? `Re-export --tls-cert as described above and restart; NODE_EXTRA_CA_CERTS is not the file to change.` : opts.operatorCaCertReadError !== void 0 ? `Make NODE_EXTRA_CA_CERTS readable by the daemon as described above and restart.` : `Point NODE_EXTRA_CA_CERTS at the issuing CA (for mkcert: "$(mkcert -CAROOT)/rootCA.pem") and restart.`)
3240
3466
  );
3241
3467
  }
3242
- const now = Date.now();
3243
3468
  for (const member of anchorPath.path) {
3244
3469
  if (member.fingerprint256 === x509.fingerprint256) continue;
3245
3470
  const subject = member.subject.replace(/\r?\n/g, ", ");
@@ -3249,14 +3474,16 @@ function describeWorkerTlsTrustGaps(opts) {
3249
3474
  );
3250
3475
  continue;
3251
3476
  }
3252
- if (new Date(member.validTo).getTime() < now) {
3253
- gaps.push(
3254
- `--tls-cert "${opts.certPath}" chains through "${subject}", which expired on ${member.validTo} \u2014 every worker handshake to the daemon will fail CERT_HAS_EXPIRED. Renew that chain member and restart.`
3255
- );
3256
- } else if (new Date(member.validFrom).getTime() > now) {
3257
- gaps.push(
3258
- `--tls-cert "${opts.certPath}" chains through "${subject}", which is not yet valid (validFrom: ${member.validFrom}) \u2014 every worker handshake to the daemon will fail CERT_NOT_YET_VALID. Check that chain member's notBefore date or the system clock.`
3259
- );
3477
+ if (!certValidAt(member, now)) {
3478
+ if (new Date(member.validTo).getTime() < now) {
3479
+ gaps.push(
3480
+ `--tls-cert "${opts.certPath}" chains through "${subject}", which expired on ${member.validTo} \u2014 every worker handshake to the daemon will fail CERT_HAS_EXPIRED. Renew that chain member and restart.`
3481
+ );
3482
+ } else {
3483
+ gaps.push(
3484
+ `--tls-cert "${opts.certPath}" chains through "${subject}", which is not yet valid (validFrom: ${member.validFrom}) \u2014 every worker handshake to the daemon will fail CERT_NOT_YET_VALID. Check that chain member's notBefore date or the system clock.`
3485
+ );
3486
+ }
3260
3487
  }
3261
3488
  }
3262
3489
  const host = workerDialHost(opts.daemonUrl);
@@ -3377,6 +3604,10 @@ function cannotIssueCertificates(cert) {
3377
3604
  return !isV1Certificate(cert) && keyUsage === void 0;
3378
3605
  }
3379
3606
  __name(cannotIssueCertificates, "cannotIssueCertificates");
3607
+ function certValidAt(cert, now) {
3608
+ return new Date(cert.validFrom).getTime() <= now && new Date(cert.validTo).getTime() >= now;
3609
+ }
3610
+ __name(certValidAt, "certValidAt");
3380
3611
  function isSelfSignedCert(x509) {
3381
3612
  if (x509.subject !== x509.issuer) return false;
3382
3613
  try {
@@ -3447,7 +3678,7 @@ function pathLengthConstraint(cert) {
3447
3678
  return length;
3448
3679
  }
3449
3680
  __name(pathLengthConstraint, "pathLengthConstraint");
3450
- function walkWorkerAnchorPath(leaf, chain, leafHeldByWorkers = true) {
3681
+ function walkWorkerAnchorPath(leaf, chain, now, leafHeldByWorkers = true) {
3451
3682
  let next = leaf;
3452
3683
  const walked = /* @__PURE__ */ new Set();
3453
3684
  const path2 = [];
@@ -3472,9 +3703,10 @@ function walkWorkerAnchorPath(leaf, chain, leafHeldByWorkers = true) {
3472
3703
  return pathLengthViolation ? { anchored: false, path: path2, pathLengthViolation } : { anchored: true, path: path2 };
3473
3704
  }
3474
3705
  walked.add(current.fingerprint256);
3475
- const issuer = chain.find(
3706
+ const issuers = chain.filter(
3476
3707
  (candidate) => !walked.has(candidate.fingerprint256) && certIssuedBy(current, candidate)
3477
3708
  );
3709
+ const issuer = issuers.find((candidate) => certValidAt(candidate, now)) ?? issuers[0];
3478
3710
  if (issuer && !isSelfSignedCert(issuer) && !issuer.ca) {
3479
3711
  return { anchored: false, path: path2, incapableIssuer: issuer };
3480
3712
  }
@@ -3566,12 +3798,12 @@ __name(hasRetryableChannelWorkerShutdownError, "hasRetryableChannelWorkerShutdow
3566
3798
  var channelWorkerRuntimePromise;
3567
3799
  async function loadChannelWorkerRuntime() {
3568
3800
  channelWorkerRuntimePromise ??= Promise.all([
3569
- import("./channel-worker-supervisor-UEW2WWCC.js"),
3570
- import("./pidfile-JMF2CLMY.js"),
3571
- import("./runtime-TTIGSBM4.js"),
3801
+ import("./channel-worker-supervisor-HDVE4ADS.js"),
3802
+ import("./pidfile-5ACKG2LI.js"),
3803
+ import("./runtime-66F4W3IA.js"),
3572
3804
  import("./cli-entry-path-4VJ3Y6T2.js"),
3573
- import("./channel-worker-group-27HMGD5S.js"),
3574
- import("./channel-worker-manager-QEGX646Z.js")
3805
+ import("./channel-worker-group-ZLP5SJHT.js"),
3806
+ import("./channel-worker-manager-FG5377T2.js")
3575
3807
  ]).then(
3576
3808
  ([
3577
3809
  supervisor,
@@ -3677,7 +3909,7 @@ function shouldPreheatBridge(deps) {
3677
3909
  __name(shouldPreheatBridge, "shouldPreheatBridge");
3678
3910
  var coreRuntimePromise;
3679
3911
  function loadCoreRuntime() {
3680
- coreRuntimePromise ??= import("./core-runtime-677KFX6Q.js");
3912
+ coreRuntimePromise ??= import("./core-runtime-NASPCSQX.js");
3681
3913
  return coreRuntimePromise;
3682
3914
  }
3683
3915
  __name(loadCoreRuntime, "loadCoreRuntime");
@@ -3713,10 +3945,10 @@ __name(resolveDaemonLogBaseDirForRun, "resolveDaemonLogBaseDirForRun");
3713
3945
  var settingsRuntimePromise;
3714
3946
  function loadSettingsRuntimeModules() {
3715
3947
  settingsRuntimePromise ??= Promise.all([
3716
- import("./settings-VOZYKLTT.js"),
3717
- import("./environment-MOZMPUHR.js"),
3718
- import("./loadedSettingsAdapter-7Y7IEI6T.js"),
3719
- import("./trustedFolders-7OCNMUQE.js")
3948
+ import("./settings-ZOHIQWYK.js"),
3949
+ import("./environment-25ADH4Y6.js"),
3950
+ import("./loadedSettingsAdapter-2P7DFWUR.js"),
3951
+ import("./trustedFolders-QJYEFMTU.js")
3720
3952
  ]).then(([settings, environment, loadedSettingsAdapter, trustedFolders]) => ({
3721
3953
  settings,
3722
3954
  environment,
@@ -3729,8 +3961,8 @@ __name(loadSettingsRuntimeModules, "loadSettingsRuntimeModules");
3729
3961
  var channelWebhookConfigRuntimePromise;
3730
3962
  function loadChannelWebhookConfigRuntime() {
3731
3963
  channelWebhookConfigRuntimePromise ??= Promise.all([
3732
- import("./runtime-TTIGSBM4.js"),
3733
- import("./config-utils-BBOCOGZW.js")
3964
+ import("./runtime-66F4W3IA.js"),
3965
+ import("./config-utils-NNUPVGEC.js")
3734
3966
  ]).then(([channelRuntime, configUtils]) => ({
3735
3967
  loadChannelsConfig: channelRuntime.loadChannelsConfig,
3736
3968
  parseChannelWebhookConfig: configUtils.parseChannelWebhookConfig
@@ -3754,20 +3986,22 @@ async function loadServeRuntimeModules() {
3754
3986
  workspaceSkillsStatusModule,
3755
3987
  totalSessionAdmissionModule,
3756
3988
  workspaceRegistryModule,
3989
+ workspaceRuntimeCoordinatorModule,
3757
3990
  promptLedgerModule
3758
3991
  ] = await Promise.all([
3759
- import("./server-DFUSSSHI.js"),
3760
- import("./bridge-FKZTVIS3.js"),
3761
- import("./spawnChannel-F6WVP723.js"),
3762
- import("./process-registry-PMJOA5CO.js"),
3763
- import("./workspace-service-MUYO2QIC.js"),
3764
- import("./types-WYCFCEHR.js"),
3765
- import("./daemon-status-provider-RFKZOK3S.js"),
3766
- import("./workspace-providers-status-PDFZWL5Q.js"),
3767
- import("./workspace-skills-status-IKECTOOQ.js"),
3768
- import("./total-session-admission-HTVTP4BS.js"),
3769
- import("./workspace-registry-23R7XRB5.js"),
3770
- import("./prompt-terminal-ledger-DCZO6S7C.js")
3992
+ import("./server-7W6C3SOW.js"),
3993
+ import("./bridge-EVURP4NO.js"),
3994
+ import("./spawnChannel-ZP23JL6O.js"),
3995
+ import("./process-registry-OAEG6WGC.js"),
3996
+ import("./workspace-service-SETHN4WE.js"),
3997
+ import("./types-HKLPXZB3.js"),
3998
+ import("./daemon-status-provider-UI3GBTMO.js"),
3999
+ import("./workspace-providers-status-5JM4CB6R.js"),
4000
+ import("./workspace-skills-status-4D4EUEQU.js"),
4001
+ import("./total-session-admission-MGV56XDK.js"),
4002
+ import("./workspace-registry-6EULAPZC.js"),
4003
+ import("./workspace-runtime-coordinator-IRI2DRCJ.js"),
4004
+ import("./prompt-terminal-ledger-3RKW73A2.js")
3771
4005
  ]);
3772
4006
  return {
3773
4007
  createServeApp: serverModule.createServeApp,
@@ -3780,7 +4014,6 @@ async function loadServeRuntimeModules() {
3780
4014
  ProcessRegistry: processRegistryModule.ProcessRegistry,
3781
4015
  createDaemonWorkspaceService: workspaceModule.createDaemonWorkspaceService,
3782
4016
  WorkspaceSettingsPartialPersistError: workspaceTypesModule.WorkspaceSettingsPartialPersistError,
3783
- WorkspaceSkillNotToggleableError: workspaceTypesModule.WorkspaceSkillNotToggleableError,
3784
4017
  createDaemonStatusProvider: daemonStatusProviderModule.createDaemonStatusProvider,
3785
4018
  createWorkspaceProvidersStatusProvider: workspaceProvidersStatusModule.createWorkspaceProvidersStatusProvider,
3786
4019
  createWorkspaceSkillsStatusProvider: workspaceSkillsStatusModule.createWorkspaceSkillsStatusProvider,
@@ -3788,6 +4021,7 @@ async function loadServeRuntimeModules() {
3788
4021
  createWorkspaceRegistry: workspaceRegistryModule.createWorkspaceRegistry,
3789
4022
  createWorkspaceSessionOwnerIndex: workspaceRegistryModule.createWorkspaceSessionOwnerIndex,
3790
4023
  createWorkspaceGenerationGuard: workspaceRegistryModule.createWorkspaceGenerationGuard,
4024
+ getWorkspaceRuntimeCoordinatorIfSupported: workspaceRuntimeCoordinatorModule.getWorkspaceRuntimeCoordinatorIfSupported,
3791
4025
  createPromptLedgerSink: promptLedgerModule.createPromptLedgerSink
3792
4026
  };
3793
4027
  }
@@ -3812,7 +4046,11 @@ function sessionIdleTimeoutMs(value) {
3812
4046
  return value !== void 0 ? channelIdleTimeoutMs(value) : DEFAULT_SESSION_IDLE_TIMEOUT_MS;
3813
4047
  }
3814
4048
  __name(sessionIdleTimeoutMs, "sessionIdleTimeoutMs");
3815
- function currentServeFeaturesForRunQwenServe(opts, sessionShellCommandEnabled, sessionArtifactsPersistenceAvailable, currentSessionSchedulingAvailable, env) {
4049
+ function sessionPromptSettledCloseGraceMs(value) {
4050
+ return value !== void 0 ? channelIdleTimeoutMs(value) : DEFAULT_SESSION_PROMPT_SETTLED_CLOSE_GRACE_MS;
4051
+ }
4052
+ __name(sessionPromptSettledCloseGraceMs, "sessionPromptSettledCloseGraceMs");
4053
+ function currentServeFeaturesForRunQwenServe(opts, sessionShellCommandEnabled, sessionArtifactsPersistenceAvailable, workspaceRuntimeAvailable, currentSessionSchedulingAvailable, env, nativeDirectoryPickerAvailable) {
3816
4054
  return getAdvertisedServeFeatures(void 0, {
3817
4055
  requireAuth: opts.requireAuth === true,
3818
4056
  mcpPoolActive: opts.mcpPoolActive !== false,
@@ -3833,8 +4071,11 @@ function currentServeFeaturesForRunQwenServe(opts, sessionShellCommandEnabled, s
3833
4071
  channelManagementAvailable: true,
3834
4072
  persistentWorkspaceRegistrationAvailable: true,
3835
4073
  workspaceRuntimeRemovalAvailable: true,
3836
- // Advertise the same WS feature flags as the runtime path (serve-features.ts)
3837
- // so the bootstrap `/capabilities` window doesn't briefly under-report them.
4074
+ // Advertise the same host-conditional and WS feature flags as the runtime
4075
+ // path (serve-features.ts) so the bootstrap `/capabilities` window doesn't
4076
+ // briefly under-report them.
4077
+ nativeDirectoryPickerAvailable,
4078
+ workspaceRuntimeAvailable,
3838
4079
  clientMcpOverWsEnabled: opts.clientMcpOverWs === true,
3839
4080
  cdpTunnelOverWsEnabled: opts.cdpTunnelOverWs === true,
3840
4081
  browserAutomationMcpAvailable: isBrowserAutomationMcpAvailable(opts, env)
@@ -3851,8 +4092,10 @@ function createBootstrapCapabilities(input) {
3851
4092
  input.opts,
3852
4093
  input.sessionShellCommandEnabled,
3853
4094
  input.sessionArtifactsPersistenceAvailable,
4095
+ input.workspaceRuntimeAvailable,
3854
4096
  input.currentSessionSchedulingAvailable,
3855
- input.env
4097
+ input.env,
4098
+ input.nativeDirectoryPickerAvailable
3856
4099
  ),
3857
4100
  modelServices: [],
3858
4101
  workspaceCwd: input.boundWorkspace,
@@ -3887,45 +4130,6 @@ function validateRateLimitOptions(opts) {
3887
4130
  }
3888
4131
  }
3889
4132
  __name(validateRateLimitOptions, "validateRateLimitOptions");
3890
- function installSameOriginOriginStrip(app, getPort) {
3891
- let cachedStripPort = -1;
3892
- let cachedSelfOrigins = /* @__PURE__ */ new Set();
3893
- app.use((req, _res, next) => {
3894
- const origin = req.headers.origin;
3895
- if (origin) {
3896
- const port = getPort();
3897
- if (port !== cachedStripPort) {
3898
- cachedStripPort = port;
3899
- cachedSelfOrigins = /* @__PURE__ */ new Set([
3900
- `http://127.0.0.1:${port}`,
3901
- `http://localhost:${port}`,
3902
- `http://[::1]:${port}`,
3903
- `http://host.docker.internal:${port}`,
3904
- `https://127.0.0.1:${port}`,
3905
- `https://localhost:${port}`,
3906
- `https://[::1]:${port}`,
3907
- `https://host.docker.internal:${port}`
3908
- ]);
3909
- if (port === 80 || port === 443) {
3910
- for (const host of [
3911
- "127.0.0.1",
3912
- "localhost",
3913
- "[::1]",
3914
- "host.docker.internal"
3915
- ]) {
3916
- cachedSelfOrigins.add(`http://${host}`);
3917
- cachedSelfOrigins.add(`https://${host}`);
3918
- }
3919
- }
3920
- }
3921
- if (cachedSelfOrigins.has(origin)) {
3922
- delete req.headers.origin;
3923
- }
3924
- }
3925
- next();
3926
- });
3927
- }
3928
- __name(installSameOriginOriginStrip, "installSameOriginOriginStrip");
3929
4133
  function createLazyBridgeProxy(getBridge, getStartupError = () => void 0) {
3930
4134
  return new Proxy(
3931
4135
  {},
@@ -4011,6 +4215,7 @@ function createBootstrapServeApp(input) {
4011
4215
  qwenCodeVersion,
4012
4216
  sessionShellCommandEnabled,
4013
4217
  sessionArtifactsPersistenceAvailable,
4218
+ workspaceRuntimeAvailable,
4014
4219
  currentSessionSchedulingAvailable,
4015
4220
  permissionPolicy,
4016
4221
  multiWorkspaceCapabilitiesRequireRuntime,
@@ -4020,7 +4225,8 @@ function createBootstrapServeApp(input) {
4020
4225
  onHealthServed
4021
4226
  } = input;
4022
4227
  const app = (0, import_express.default)();
4023
- installSameOriginOriginStrip(app, getPort);
4228
+ const nativeDirectoryPickerAvailable = isNativeDirectoryPickerAvailable();
4229
+ installSelfOriginStripMiddleware(app, getPort, opts.hostname);
4024
4230
  if (opts.allowOrigins && opts.allowOrigins.length > 0) {
4025
4231
  app.use(allowOriginCors(parseAllowOriginPatterns(opts.allowOrigins)));
4026
4232
  } else {
@@ -4071,9 +4277,11 @@ function createBootstrapServeApp(input) {
4071
4277
  qwenCodeVersion,
4072
4278
  sessionShellCommandEnabled,
4073
4279
  sessionArtifactsPersistenceAvailable,
4280
+ workspaceRuntimeAvailable,
4074
4281
  currentSessionSchedulingAvailable,
4075
4282
  permissionPolicy,
4076
- env: process.env
4283
+ env: process.env,
4284
+ nativeDirectoryPickerAvailable
4077
4285
  })
4078
4286
  );
4079
4287
  });
@@ -4155,7 +4363,7 @@ function createBootstrapServeApp(input) {
4155
4363
  opts.maxPendingPromptsPerSession
4156
4364
  ),
4157
4365
  listenerMaxConnections: listenerMaxConnections(opts.maxConnections),
4158
- eventRingSize: opts.eventRingSize ?? DEFAULT_EVENT_RING_SIZE,
4366
+ eventRingSize: opts.eventRingSize ?? DEFAULT_RING_SIZE,
4159
4367
  compactedReplayMaxBytes: opts.compactedReplayMaxBytes ?? DEFAULT_COMPACTED_REPLAY_MAX_BYTES,
4160
4368
  maxJournalEvents: opts.maxJournalEvents ?? DEFAULT_MAX_JOURNAL_EVENTS,
4161
4369
  maxJournalBytes: opts.maxJournalBytes ?? DEFAULT_MAX_JOURNAL_BYTES,
@@ -4163,6 +4371,9 @@ function createBootstrapServeApp(input) {
4163
4371
  writerIdleTimeoutMs: positiveFiniteOrNull(opts.writerIdleTimeoutMs),
4164
4372
  channelIdleTimeoutMs: channelIdleTimeoutMs(opts.channelIdleTimeoutMs),
4165
4373
  sessionIdleTimeoutMs: sessionIdleTimeoutMs(opts.sessionIdleTimeoutMs),
4374
+ sessionPromptSettledCloseGraceMs: sessionPromptSettledCloseGraceMs(
4375
+ opts.sessionPromptSettledCloseGraceMs
4376
+ ),
4166
4377
  acpConnectionCap: null,
4167
4378
  acpPreAttachMaxFramesPerStream: null,
4168
4379
  acpPreAttachMaxFramesPerConnection: null,
@@ -4189,8 +4400,10 @@ function createBootstrapServeApp(input) {
4189
4400
  opts,
4190
4401
  sessionShellCommandEnabled,
4191
4402
  sessionArtifactsPersistenceAvailable,
4403
+ workspaceRuntimeAvailable,
4192
4404
  currentSessionSchedulingAvailable,
4193
- process.env
4405
+ process.env,
4406
+ nativeDirectoryPickerAvailable
4194
4407
  )
4195
4408
  },
4196
4409
  runtime: {
@@ -4490,7 +4703,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4490
4703
  const runStartedAt = performance2.now();
4491
4704
  delete process.env[EXTERNAL_TOOL_GUARD_TOKEN_ENV];
4492
4705
  const channelDeliveryAuthorizations = new ChannelDeliveryAuthorizationStore();
4493
- const shouldPreheat = !deps.bridge && shouldPreheatBridge(deps);
4706
+ let shouldPreheat = !deps.bridge && shouldPreheatBridge(deps);
4494
4707
  const startup = {
4495
4708
  processStartedAt: new Date(
4496
4709
  Date.now() - Math.round(process.uptime() * 1e3)
@@ -4529,12 +4742,18 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4529
4742
  }, "restoreScrubbedLoaderEnv");
4530
4743
  loggerLifecycle.scrubApplied(restoreScrubbedLoaderEnv);
4531
4744
  const token = resolveServeToken(optsIn.token);
4745
+ const bindHostname = optsIn.hostname.toLowerCase() === "localhost" ? (await (deps.bindHostnameLookup ?? lookup)(optsIn.hostname)).address : optsIn.hostname;
4746
+ const trustedLoopbackMode = isTrustedLoopbackMode({
4747
+ loopbackBind: isLoopbackAddress(bindHostname),
4748
+ tokenConfigured: token !== void 0,
4749
+ requireAuth: optsIn.requireAuth === true
4750
+ });
4532
4751
  const channelDeliveryDiagnosticRedaction = {
4533
4752
  workerEnv: daemonRuntimeBaseEnv,
4534
4753
  ...token ? { daemonToken: token } : {}
4535
4754
  };
4536
- const sessionShellCommandEnabled = optsIn.enableSessionShell === true && token !== void 0;
4537
- if (optsIn.enableSessionShell === true && token === void 0) {
4755
+ const sessionShellCommandEnabled = optsIn.enableSessionShell === true && (token !== void 0 || trustedLoopbackMode);
4756
+ if (optsIn.enableSessionShell === true && token === void 0 && !trustedLoopbackMode) {
4538
4757
  writeStderrLine(
4539
4758
  `qwen serve: --enable-session-shell ignored because no bearer token is configured. Set ${QWEN_SERVER_TOKEN_ENV} or pass --token to enable direct session shell.`
4540
4759
  );
@@ -4556,6 +4775,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4556
4775
  const rawWorkspace = rawWorkspaces[0];
4557
4776
  const opts = {
4558
4777
  ...optsIn,
4778
+ hostname: bindHostname,
4559
4779
  token,
4560
4780
  promptDeadlineMs,
4561
4781
  writerIdleTimeoutMs,
@@ -4687,7 +4907,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4687
4907
  }
4688
4908
  if (!isLoopbackBind(opts.hostname) && !token) {
4689
4909
  throw new Error(
4690
- `Refusing to bind ${opts.hostname}:${opts.port} without a bearer token. Set ${QWEN_SERVER_TOKEN_ENV} or pass --token, or rebind to loopback (127.0.0.1, localhost, ::1, or [::1]).`
4910
+ `Refusing to bind ${opts.hostname}:${opts.port} without a bearer token. Set ${QWEN_SERVER_TOKEN_ENV} or pass --token, or rebind to loopback (127.0.0.0/8, localhost, ::1, or [::1]).`
4691
4911
  );
4692
4912
  }
4693
4913
  if (opts.requireAuth && !token) {
@@ -4702,8 +4922,16 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4702
4922
  `Refusing to start with --allow-origin '*' but no bearer token configured. '*' admits any cross-origin browser to the API; without a token, any local page can drive the daemon. Set ${QWEN_SERVER_TOKEN_ENV} or pass --token, or list specific origins instead of '*'.`
4703
4923
  );
4704
4924
  }
4925
+ const nonLoopbackHttpOrigin = findNonLoopbackHttpOrigin(parsed);
4926
+ if (nonLoopbackHttpOrigin && !token) {
4927
+ throw new Error(
4928
+ `Refusing to start with --allow-origin ${JSON.stringify(
4929
+ nonLoopbackHttpOrigin
4930
+ )} but no bearer token configured. Non-loopback HTTP(S) browser origins can drive the full operator API, including code execution as the daemon user. Set ${QWEN_SERVER_TOKEN_ENV} or pass --token, or use a loopback origin.`
4931
+ );
4932
+ }
4705
4933
  writeStderrLine(
4706
- `qwen serve: --allow-origin: ${opts.allowOrigins.join(", ")}` + (parsed.allowAny ? " (WARNING: `*` admits any cross-origin browser \u2014 bearer token gates API routes; the Web Shell static assets stay pre-auth in every mode unless --no-web, and /health stays pre-auth on loopback unless --require-auth is set)" : "")
4934
+ `qwen serve: --allow-origin: ${opts.allowOrigins.join(", ")}` + (parsed.allowAny ? " (WARNING: `*` admits any cross-origin browser \u2014 bearer token gates API routes; the Web Shell static assets stay pre-auth in every mode unless --no-web, and /health stays pre-auth on loopback unless --require-auth is set)" : trustedLoopbackMode ? " (WARNING: these browser origins receive full API authority without a bearer token in trusted loopback mode and can execute code as the daemon user)" : "")
4707
4935
  );
4708
4936
  }
4709
4937
  if (opts.allowPrivateAuthBaseUrl) {
@@ -4813,7 +5041,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
4813
5041
  }
4814
5042
  let workspaceRegistrationStore = deps.workspaceRegistrationStore;
4815
5043
  if (workspaceRegistrationStore === void 0 && process.env["QWEN_SERVE_NO_PERSISTENT_REGISTRATION"] !== "1") {
4816
- const { WorkspaceRegistrationStore } = await import("./workspace-registration-store-XKVW2YVH.js");
5044
+ const { WorkspaceRegistrationStore } = await import("./workspace-registration-store-RNMFVCH7.js");
4817
5045
  workspaceRegistrationStore = new WorkspaceRegistrationStore(boundWorkspace);
4818
5046
  }
4819
5047
  if (workspaceRegistrationStore) {
@@ -5047,6 +5275,13 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5047
5275
  );
5048
5276
  }
5049
5277
  }
5278
+ if (opts.sessionPromptSettledCloseGraceMs !== void 0) {
5279
+ if (!isNonNegativeIntegerMs(opts.sessionPromptSettledCloseGraceMs)) {
5280
+ throw new TypeError(
5281
+ `Invalid sessionPromptSettledCloseGraceMs: ${opts.sessionPromptSettledCloseGraceMs}. Must be a non-negative integer (milliseconds, 0 = disabled).`
5282
+ );
5283
+ }
5284
+ }
5050
5285
  if (opts.initializeTimeoutMs !== void 0) {
5051
5286
  if (!isPositiveIntegerMs(opts.initializeTimeoutMs)) {
5052
5287
  throw new TypeError(
@@ -5097,7 +5332,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5097
5332
  "qwen serve: required external tool guard handshake succeeded."
5098
5333
  );
5099
5334
  }
5100
- const { createDaemonToolGuard } = await import("./daemon-git-worktree-guard-6MVAAZZZ.js");
5335
+ const { createDaemonToolGuard } = await import("./daemon-git-worktree-guard-ATXVQPS3.js");
5101
5336
  const daemonToolGuardHandler = createDaemonToolGuard(
5102
5337
  externalToolGuardHandler
5103
5338
  );
@@ -5160,12 +5395,15 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5160
5395
  }, "markServeAppStartupFailed");
5161
5396
  let runtimeApp;
5162
5397
  let runtimeAppForCleanup;
5398
+ let getWorkspaceRuntimeCoordinatorIfSupported;
5163
5399
  let bridgeRef = deps.bridge;
5164
5400
  let managedProcessRegistry;
5165
5401
  let managedChildHeapPolicy;
5166
5402
  const internalRuntimeBridgesForCleanup = [];
5167
5403
  let daemonEventLoopMonitor;
5168
5404
  let daemonMetricsSampler;
5405
+ let sessionPrRefreshTimer;
5406
+ let sessionPrRefreshGeneration = 0;
5169
5407
  let runtimeStartupError;
5170
5408
  let runtimeStarting;
5171
5409
  let markRuntimeReady;
@@ -5185,6 +5423,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5185
5423
  daemonEventLoopMonitor = void 0;
5186
5424
  const metricsSampler = daemonMetricsSampler;
5187
5425
  daemonMetricsSampler = void 0;
5426
+ const prRefreshTimer = sessionPrRefreshTimer;
5427
+ sessionPrRefreshTimer = void 0;
5428
+ sessionPrRefreshGeneration += 1;
5429
+ prRefreshTimer?.dispose();
5188
5430
  try {
5189
5431
  eventLoopMonitor?.dispose();
5190
5432
  } catch (err) {
@@ -5369,6 +5611,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5369
5611
  stopSafely("scheduled-task keepalive", locals.stopScheduledTaskKeepalive);
5370
5612
  stopSafely("workspace git state", locals.stopWorkspaceGitState);
5371
5613
  stopSafely("Live Host coordinator", locals.stopLiveCoordinator);
5614
+ stopSafely("web terminal registry", locals.stopWebTerminalRegistry);
5372
5615
  stopTrustPolicyMonitor(app2);
5373
5616
  for (const stop of locals.subSessionStoppers ?? []) {
5374
5617
  stopSafely("sub-session launcher", stop);
@@ -5436,8 +5679,9 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5436
5679
  loadCoreRuntime(),
5437
5680
  loadSettingsRuntimeModules(),
5438
5681
  cliVersionPromise,
5439
- import("./daemon-trust-policy-DRZPFB4Q.js")
5682
+ import("./daemon-trust-policy-SUCBJ2CA.js")
5440
5683
  ]);
5684
+ getWorkspaceRuntimeCoordinatorIfSupported = runtime.getWorkspaceRuntimeCoordinatorIfSupported;
5441
5685
  cliVersion = resolvedCliVersion;
5442
5686
  settingsRuntime.environment.preResolveHomeEnvOverrides();
5443
5687
  const bootTrustSnapshot = await trustPolicy.readDaemonTrustPolicySnapshot();
@@ -5447,6 +5691,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5447
5691
  boundWorkspace
5448
5692
  );
5449
5693
  const trustedWorkspace = deps.trustedWorkspace ?? bootPrimaryTrustDecision.targetTrusted;
5694
+ if (shouldPreheat && !trustedWorkspace) {
5695
+ shouldPreheat = false;
5696
+ startup.preheat.status = "not_scheduled";
5697
+ }
5450
5698
  const workspaceTrustHotReloadAvailable = deps.trustedWorkspace === void 0 && deps.bridge === void 0 && deps.fsFactory === void 0;
5451
5699
  let managedScratchRoot;
5452
5700
  try {
@@ -5548,6 +5796,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5548
5796
  mode: "runtime-overlay",
5549
5797
  overlayKeys: [...runtimeEnvSnapshot.overlayKeys],
5550
5798
  effectiveEnv: runtimeEffectiveEnv,
5799
+ workflowsEnabledBySettings: runtimeBootSettings?.merged.tools?.workflowsEnabled === true,
5551
5800
  envFilePaths: [...runtimeEnvSnapshot.envFilePaths],
5552
5801
  envFileReadFailed: runtimeEnvSnapshot.envFileReadFailed,
5553
5802
  envFileReadFailures: [...runtimeEnvSnapshot.envFileReadFailures]
@@ -5772,6 +6021,19 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5772
6021
  });
5773
6022
  const clientMcpSenderRegistry = new ClientMcpSenderRegistry();
5774
6023
  const runtimeBridges = [];
6024
+ const runtimeEpochSources = /* @__PURE__ */ new Map();
6025
+ const runtimeEpochSourceFor = /* @__PURE__ */ __name((workspaceCwd) => {
6026
+ let source = runtimeEpochSources.get(workspaceCwd);
6027
+ if (!source) {
6028
+ let epoch = 0;
6029
+ source = {
6030
+ current: /* @__PURE__ */ __name(() => epoch, "current"),
6031
+ allocate: /* @__PURE__ */ __name(() => ++epoch, "allocate")
6032
+ };
6033
+ runtimeEpochSources.set(workspaceCwd, source);
6034
+ }
6035
+ return source;
6036
+ }, "runtimeEpochSourceFor");
5775
6037
  const totalSessionAdmission = runtime.createTotalSessionAdmissionController(
5776
6038
  {
5777
6039
  maxTotalSessions: opts.maxTotalSessions,
@@ -5808,22 +6070,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5808
6070
  }), "persistDisabledToolsFn");
5809
6071
  const persistDisabledSkillsFn = /* @__PURE__ */ __name((workspace, skillName, enabled, assertGenerationOpen) => withSettingsLock(workspace, async () => {
5810
6072
  assertGenerationOpen?.();
5811
- const {
5812
- resolveSkillSettings,
5813
- skillSettingStrings,
5814
- updateWorkspaceSkillSettingLists
5815
- } = await import("./skill-settings-VA4XVYVL.js");
6073
+ const { skillSettingStrings, updateWorkspaceSkillSettingLists } = await import("./skill-settings-AKMIXFSJ.js");
5816
6074
  const fresh = loadSettingsForPersistence(workspace);
5817
- const normalizedName = skillName.trim().toLowerCase();
5818
- const resolved = resolveSkillSettings(fresh);
5819
- const disablement = resolved.disablements.get(normalizedName);
5820
- if (disablement?.reason === "hard" && disablement.lockedScope) {
5821
- throw new runtime.WorkspaceSkillNotToggleableError(
5822
- skillName,
5823
- "locked",
5824
- disablement.lockedScope
5825
- );
5826
- }
5827
6075
  const workspaceDisabled = skillSettingStrings(
5828
6076
  fresh,
5829
6077
  WORKSPACE_SETTING_SCOPE,
@@ -5837,8 +6085,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5837
6085
  const next = updateWorkspaceSkillSettingLists(
5838
6086
  { disabled: workspaceDisabled, enabled: workspaceEnabled },
5839
6087
  skillName,
5840
- enabled,
5841
- resolved.defaultDisabledNames.has(normalizedName) && !resolved.enabledNames.has(normalizedName)
6088
+ enabled
5842
6089
  );
5843
6090
  const settingsChanges = [];
5844
6091
  if (JSON.stringify(next.disabled) !== JSON.stringify(workspaceDisabled)) {
@@ -5873,13 +6120,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5873
6120
  }), "persistDisabledSkillsFn");
5874
6121
  const persistDisabledSkillsBatchFn = /* @__PURE__ */ __name((workspace, skillNames, enabled, assertGenerationOpen) => withSettingsLock(workspace, async () => {
5875
6122
  assertGenerationOpen?.();
5876
- const {
5877
- resolveSkillSettings,
5878
- skillSettingStrings,
5879
- updateWorkspaceSkillSettingLists
5880
- } = await import("./skill-settings-VA4XVYVL.js");
6123
+ const { skillSettingStrings, updateWorkspaceSkillSettingLists } = await import("./skill-settings-AKMIXFSJ.js");
5881
6124
  const fresh = loadSettingsForPersistence(workspace);
5882
- const resolved = resolveSkillSettings(fresh);
5883
6125
  const initialDisabled = skillSettingStrings(
5884
6126
  fresh,
5885
6127
  WORKSPACE_SETTING_SCOPE,
@@ -5893,24 +6135,10 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5893
6135
  let next = { disabled: initialDisabled, enabled: initialEnabled };
5894
6136
  const outcomes = [];
5895
6137
  for (const skillName of skillNames) {
5896
- const normalizedName = skillName.trim().toLowerCase();
5897
- const disablement = resolved.disablements.get(normalizedName);
5898
- if (disablement?.reason === "hard" && disablement.lockedScope) {
5899
- outcomes.push({
5900
- skillName,
5901
- error: new runtime.WorkspaceSkillNotToggleableError(
5902
- skillName,
5903
- "locked",
5904
- disablement.lockedScope
5905
- )
5906
- });
5907
- continue;
5908
- }
5909
6138
  const updated = updateWorkspaceSkillSettingLists(
5910
6139
  next,
5911
6140
  skillName,
5912
- enabled,
5913
- resolved.defaultDisabledNames.has(normalizedName) && !resolved.enabledNames.has(normalizedName)
6141
+ enabled
5914
6142
  );
5915
6143
  const changed = JSON.stringify(updated.disabled) !== JSON.stringify(next.disabled) || JSON.stringify(updated.enabled) !== JSON.stringify(next.enabled);
5916
6144
  next = updated;
@@ -5983,8 +6211,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
5983
6211
  }
5984
6212
  }), "persistSettingsFn");
5985
6213
  const [{ createSubSessionLauncher }, scheduledTaskRoutes] = await Promise.all([
5986
- import("./create-sub-session-JKZAYZX7.js"),
5987
- import("./scheduled-tasks-QB4ZVUQS.js")
6214
+ import("./create-sub-session-DS4BJLYZ.js"),
6215
+ import("./scheduled-tasks-2NVKS5Q2.js")
5988
6216
  ]);
5989
6217
  const createCurrentSessionScheduledTaskHandler = /* @__PURE__ */ __name((workspaceCwd, runtimeBaseDir, getBridge, assertGenerationOpen) => async ({
5990
6218
  callerSessionId,
@@ -6072,8 +6300,12 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6072
6300
  sessionRestoreTimeoutMs,
6073
6301
  ...opts.sessionReapIntervalMs !== void 0 ? { sessionReapIntervalMs: opts.sessionReapIntervalMs } : {},
6074
6302
  ...opts.sessionIdleTimeoutMs !== void 0 ? { sessionIdleTimeoutMs: opts.sessionIdleTimeoutMs } : {},
6303
+ ...opts.sessionPromptSettledCloseGraceMs !== void 0 ? {
6304
+ sessionPromptSettledCloseGraceMs: opts.sessionPromptSettledCloseGraceMs
6305
+ } : {},
6075
6306
  ...opts.permissionResponseTimeoutMs !== void 0 ? { permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs } : {},
6076
6307
  boundWorkspace,
6308
+ runtimeEpochSource: runtimeEpochSourceFor(boundWorkspace),
6077
6309
  // Prompt terminal ledger: persisted beside the transcript so a
6078
6310
  // restarted daemon can reconcile dangling prompts on cold load.
6079
6311
  promptLedger: runtime.createPromptLedgerSink(
@@ -6121,6 +6353,82 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6121
6353
  runtimeBridges.push(bridge);
6122
6354
  let invalidatePrimaryServeFeaturesCache = /* @__PURE__ */ __name(() => {
6123
6355
  }, "invalidatePrimaryServeFeaturesCache");
6356
+ const reloadPrimaryDaemonEnv = /* @__PURE__ */ __name((workspace, assertGenerationOpen) => withSettingsLock(workspace, async () => {
6357
+ assertGenerationOpen?.();
6358
+ const fresh = settingsRuntime.settings.loadSettings(workspace, {
6359
+ skipLoadEnvironment: true,
6360
+ skipWorkspaceSettings: !trustedWorkspace,
6361
+ workspaceTrusted: trustedWorkspace
6362
+ });
6363
+ assertGenerationOpen?.();
6364
+ let refreshedRuntimeEnv;
6365
+ try {
6366
+ refreshedRuntimeEnv = settingsRuntime.environment.buildRuntimeEnvironment(
6367
+ fresh.merged,
6368
+ workspace,
6369
+ daemonRuntimeBaseEnv,
6370
+ trustedWorkspace
6371
+ );
6372
+ } catch (err) {
6373
+ const fallbackReason = err instanceof Error ? err.message : String(err);
6374
+ primaryRuntimeEnv.fallbackReason = fallbackReason;
6375
+ daemonLog.warn(
6376
+ "failed to rebuild runtime env snapshot before daemon env reload; preserving previous runtime env",
6377
+ {
6378
+ error: fallbackReason
6379
+ }
6380
+ );
6381
+ return {
6382
+ updatedKeys: [],
6383
+ removedKeys: [],
6384
+ runtimeEnvironmentApplied: false
6385
+ };
6386
+ }
6387
+ logRuntimeEnvFileReadFailures(workspace, refreshedRuntimeEnv);
6388
+ if (refreshedRuntimeEnv.envFileReadFailed) {
6389
+ return {
6390
+ updatedKeys: [],
6391
+ removedKeys: [],
6392
+ runtimeEnvironmentApplied: false
6393
+ };
6394
+ }
6395
+ const result = settingsRuntime.settings.reloadEnvironment(
6396
+ fresh.merged,
6397
+ workspace,
6398
+ trustedWorkspace,
6399
+ { failClosedOnEnvFileReadError: true }
6400
+ );
6401
+ if (result.envFileReadFailed) {
6402
+ return {
6403
+ updatedKeys: [],
6404
+ removedKeys: [],
6405
+ runtimeEnvironmentApplied: false
6406
+ };
6407
+ }
6408
+ replaceRuntimeEffectiveEnv(refreshedRuntimeEnv.effectiveEnv);
6409
+ primaryRuntimeEnv.workflowsEnabledBySettings = fresh.merged.tools?.workflowsEnabled === true;
6410
+ delete primaryRuntimeEnv.fallbackReason;
6411
+ primaryRuntimeEnv.envFileReadFailed = refreshedRuntimeEnv.envFileReadFailed;
6412
+ primaryRuntimeEnv.envFileReadFailures.splice(
6413
+ 0,
6414
+ primaryRuntimeEnv.envFileReadFailures.length,
6415
+ ...refreshedRuntimeEnv.envFileReadFailures
6416
+ );
6417
+ primaryRuntimeEnv.overlayKeys.splice(
6418
+ 0,
6419
+ primaryRuntimeEnv.overlayKeys.length,
6420
+ ...refreshedRuntimeEnv.overlayKeys
6421
+ );
6422
+ primaryRuntimeEnv.envFilePaths.splice(
6423
+ 0,
6424
+ primaryRuntimeEnv.envFilePaths.length,
6425
+ ...refreshedRuntimeEnv.envFilePaths
6426
+ );
6427
+ return {
6428
+ ...result,
6429
+ runtimeEnvironmentApplied: true
6430
+ };
6431
+ }), "reloadPrimaryDaemonEnv");
6124
6432
  const workspaceService = runtime.createDaemonWorkspaceService({
6125
6433
  boundWorkspace,
6126
6434
  isWorkspaceTrusted: /* @__PURE__ */ __name(() => trustedWorkspace, "isWorkspaceTrusted"),
@@ -6138,71 +6446,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6138
6446
  persistSetting: persistSettingFn,
6139
6447
  persistSettings: persistSettingsFn,
6140
6448
  preheatAcpChild: /* @__PURE__ */ __name(() => bridge.preheat(), "preheatAcpChild"),
6141
- reloadDaemonEnv: /* @__PURE__ */ __name((workspace, assertGenerationOpen) => withSettingsLock(workspace, async () => {
6142
- assertGenerationOpen?.();
6143
- const fresh = settingsRuntime.settings.loadSettings(workspace, {
6144
- skipLoadEnvironment: true,
6145
- skipWorkspaceSettings: !trustedWorkspace,
6146
- workspaceTrusted: trustedWorkspace
6147
- });
6148
- assertGenerationOpen?.();
6149
- const result = settingsRuntime.settings.reloadEnvironment(
6150
- fresh.merged,
6151
- workspace,
6152
- trustedWorkspace
6153
- );
6154
- let refreshedRuntimeEnv;
6155
- let fallbackReason;
6156
- try {
6157
- refreshedRuntimeEnv = settingsRuntime.environment.buildRuntimeEnvironment(
6158
- fresh.merged,
6159
- workspace,
6160
- daemonRuntimeBaseEnv,
6161
- trustedWorkspace
6162
- );
6163
- } catch (err) {
6164
- fallbackReason = err instanceof Error ? err.message : String(err);
6165
- daemonLog.warn(
6166
- "failed to rebuild runtime env snapshot after daemon env reload; preserving previous runtime env",
6167
- {
6168
- error: fallbackReason
6169
- }
6170
- );
6171
- refreshedRuntimeEnv = {
6172
- effectiveEnv: { ...runtimeEffectiveEnv },
6173
- overlayKeys: [...primaryRuntimeEnv.overlayKeys],
6174
- envFilePaths: [...primaryRuntimeEnv.envFilePaths],
6175
- envFileReadFailed: primaryRuntimeEnv.envFileReadFailed ?? false,
6176
- envFileReadFailures: [
6177
- ...primaryRuntimeEnv.envFileReadFailures ?? []
6178
- ]
6179
- };
6180
- }
6181
- logRuntimeEnvFileReadFailures(workspace, refreshedRuntimeEnv);
6182
- replaceRuntimeEffectiveEnv(refreshedRuntimeEnv.effectiveEnv);
6183
- if (fallbackReason) {
6184
- primaryRuntimeEnv.fallbackReason = fallbackReason;
6185
- } else {
6186
- delete primaryRuntimeEnv.fallbackReason;
6187
- }
6188
- primaryRuntimeEnv.envFileReadFailed = refreshedRuntimeEnv.envFileReadFailed;
6189
- primaryRuntimeEnv.envFileReadFailures.splice(
6190
- 0,
6191
- primaryRuntimeEnv.envFileReadFailures.length,
6192
- ...refreshedRuntimeEnv.envFileReadFailures
6193
- );
6194
- primaryRuntimeEnv.overlayKeys.splice(
6195
- 0,
6196
- primaryRuntimeEnv.overlayKeys.length,
6197
- ...refreshedRuntimeEnv.overlayKeys
6198
- );
6199
- primaryRuntimeEnv.envFilePaths.splice(
6200
- 0,
6201
- primaryRuntimeEnv.envFilePaths.length,
6202
- ...refreshedRuntimeEnv.envFilePaths
6203
- );
6204
- return result;
6205
- }), "reloadDaemonEnv"),
6449
+ reloadDaemonEnv: reloadPrimaryDaemonEnv,
6206
6450
  queryWorkspaceStatus: /* @__PURE__ */ __name((method, idle) => bridge.queryWorkspaceStatus(method, idle), "queryWorkspaceStatus"),
6207
6451
  invokeWorkspaceCommand: /* @__PURE__ */ __name((method, params, invokeOpts) => bridge.invokeWorkspaceCommand(method, params, invokeOpts), "invokeWorkspaceCommand"),
6208
6452
  refreshExtensionsForAllSessions: /* @__PURE__ */ __name(() => bridge.refreshExtensionsForAllSessions(), "refreshExtensionsForAllSessions"),
@@ -6259,6 +6503,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6259
6503
  mode: "runtime-overlay",
6260
6504
  overlayKeys: [...snapshot.overlayKeys],
6261
6505
  effectiveEnv,
6506
+ workflowsEnabledBySettings: settings?.merged.tools?.workflowsEnabled === true,
6262
6507
  envFilePaths: [...snapshot.envFilePaths],
6263
6508
  envFileReadFailed: snapshot.envFileReadFailed,
6264
6509
  envFileReadFailures: [...snapshot.envFileReadFailures]
@@ -6276,6 +6521,80 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6276
6521
  }
6277
6522
  };
6278
6523
  }, "createRuntimeEnvMetadata");
6524
+ const reloadRuntimeOverlaySnapshotForModelProviders = /* @__PURE__ */ __name((workspace, trusted, env, assertGenerationOpen) => withSettingsLock(workspace, async () => {
6525
+ assertGenerationOpen?.();
6526
+ const fresh = settingsRuntime.settings.loadSettings(workspace, {
6527
+ skipLoadEnvironment: true,
6528
+ skipWorkspaceSettings: !trusted,
6529
+ workspaceTrusted: trusted
6530
+ });
6531
+ assertGenerationOpen?.();
6532
+ let refreshedRuntimeEnv;
6533
+ try {
6534
+ refreshedRuntimeEnv = settingsRuntime.environment.buildRuntimeEnvironment(
6535
+ fresh.merged,
6536
+ workspace,
6537
+ daemonRuntimeBaseEnv,
6538
+ trusted
6539
+ );
6540
+ } catch (err) {
6541
+ env.metadata.fallbackReason = err instanceof Error ? err.message : String(err);
6542
+ daemonLog.warn(
6543
+ "failed to rebuild runtime overlay for model-provider reload; preserving previous runtime env",
6544
+ { workspace, error: env.metadata.fallbackReason }
6545
+ );
6546
+ return {
6547
+ updatedKeys: [],
6548
+ removedKeys: [],
6549
+ runtimeEnvironmentApplied: false
6550
+ };
6551
+ }
6552
+ logRuntimeEnvFileReadFailures(workspace, refreshedRuntimeEnv);
6553
+ if (refreshedRuntimeEnv.envFileReadFailed) {
6554
+ return {
6555
+ updatedKeys: [],
6556
+ removedKeys: [],
6557
+ runtimeEnvironmentApplied: false
6558
+ };
6559
+ }
6560
+ assertGenerationOpen?.();
6561
+ try {
6562
+ env.replace(refreshedRuntimeEnv.effectiveEnv);
6563
+ env.metadata.envFileReadFailed = refreshedRuntimeEnv.envFileReadFailed;
6564
+ env.metadata.envFileReadFailures.splice(
6565
+ 0,
6566
+ env.metadata.envFileReadFailures.length,
6567
+ ...refreshedRuntimeEnv.envFileReadFailures
6568
+ );
6569
+ env.metadata.overlayKeys.splice(
6570
+ 0,
6571
+ env.metadata.overlayKeys.length,
6572
+ ...refreshedRuntimeEnv.overlayKeys
6573
+ );
6574
+ env.metadata.envFilePaths.splice(
6575
+ 0,
6576
+ env.metadata.envFilePaths.length,
6577
+ ...refreshedRuntimeEnv.envFilePaths
6578
+ );
6579
+ delete env.metadata.fallbackReason;
6580
+ return {
6581
+ updatedKeys: [],
6582
+ removedKeys: [],
6583
+ runtimeEnvironmentApplied: true
6584
+ };
6585
+ } catch (err) {
6586
+ env.metadata.fallbackReason = err instanceof Error ? err.message : String(err);
6587
+ daemonLog.warn(
6588
+ "failed to apply runtime overlay for model-provider reload; preserving previous runtime env",
6589
+ { workspace, error: env.metadata.fallbackReason }
6590
+ );
6591
+ return {
6592
+ updatedKeys: [],
6593
+ removedKeys: [],
6594
+ runtimeEnvironmentApplied: false
6595
+ };
6596
+ }
6597
+ }), "reloadRuntimeOverlaySnapshotForModelProviders");
6279
6598
  const readLiveConversationScheduledTasks = /* @__PURE__ */ __name(async () => {
6280
6599
  if (!fs.existsSync(liveConversationWorkspace.rootPath)) return [];
6281
6600
  const { canonicalRoot } = await liveConversationWorkspace.revalidate();
@@ -6423,8 +6742,12 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6423
6742
  sessionRestoreTimeoutMs,
6424
6743
  ...opts.sessionReapIntervalMs !== void 0 ? { sessionReapIntervalMs: opts.sessionReapIntervalMs } : {},
6425
6744
  ...opts.sessionIdleTimeoutMs !== void 0 ? { sessionIdleTimeoutMs: opts.sessionIdleTimeoutMs } : {},
6745
+ ...opts.sessionPromptSettledCloseGraceMs !== void 0 ? {
6746
+ sessionPromptSettledCloseGraceMs: opts.sessionPromptSettledCloseGraceMs
6747
+ } : {},
6426
6748
  ...opts.permissionResponseTimeoutMs !== void 0 ? { permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs } : {},
6427
6749
  boundWorkspace: workspaceInput.cwd,
6750
+ runtimeEpochSource: runtimeEpochSourceFor(workspaceInput.cwd),
6428
6751
  promptLedger: runtime.createPromptLedgerSink(
6429
6752
  workspaceInput.cwd,
6430
6753
  secondaryEnv.sessionRuntimeBaseDir
@@ -6500,20 +6823,54 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6500
6823
  workspaceTrusted: secondaryTrusted
6501
6824
  });
6502
6825
  assertGenerationOpen?.();
6503
- const result = settingsRuntime.settings.reloadEnvironment(
6504
- fresh.merged,
6505
- workspace,
6506
- secondaryTrusted
6507
- );
6826
+ let runtimeEnvironmentApplied = false;
6827
+ let refreshedRuntimeEnv;
6508
6828
  try {
6509
- const refreshedRuntimeEnv = settingsRuntime.environment.buildRuntimeEnvironment(
6829
+ refreshedRuntimeEnv = settingsRuntime.environment.buildRuntimeEnvironment(
6510
6830
  fresh.merged,
6511
6831
  workspace,
6512
6832
  daemonRuntimeBaseEnv,
6513
6833
  secondaryTrusted
6514
6834
  );
6515
- logRuntimeEnvFileReadFailures(workspace, refreshedRuntimeEnv);
6835
+ } catch (err) {
6836
+ secondaryEnv.metadata.fallbackReason = err instanceof Error ? err.message : String(err);
6837
+ daemonLog.warn(
6838
+ "failed to rebuild secondary runtime env snapshot before daemon env reload; preserving previous runtime env",
6839
+ {
6840
+ workspace,
6841
+ error: secondaryEnv.metadata.fallbackReason
6842
+ }
6843
+ );
6844
+ return {
6845
+ updatedKeys: [],
6846
+ removedKeys: [],
6847
+ runtimeEnvironmentApplied
6848
+ };
6849
+ }
6850
+ logRuntimeEnvFileReadFailures(workspace, refreshedRuntimeEnv);
6851
+ if (refreshedRuntimeEnv.envFileReadFailed) {
6852
+ return {
6853
+ updatedKeys: [],
6854
+ removedKeys: [],
6855
+ runtimeEnvironmentApplied: false
6856
+ };
6857
+ }
6858
+ const result = settingsRuntime.settings.reloadEnvironment(
6859
+ fresh.merged,
6860
+ workspace,
6861
+ secondaryTrusted,
6862
+ { failClosedOnEnvFileReadError: true }
6863
+ );
6864
+ if (result.envFileReadFailed) {
6865
+ return {
6866
+ updatedKeys: [],
6867
+ removedKeys: [],
6868
+ runtimeEnvironmentApplied: false
6869
+ };
6870
+ }
6871
+ try {
6516
6872
  secondaryEnv.replace(refreshedRuntimeEnv.effectiveEnv);
6873
+ secondaryEnv.metadata.workflowsEnabledBySettings = fresh.merged.tools?.workflowsEnabled === true;
6517
6874
  secondaryEnv.metadata.envFileReadFailed = refreshedRuntimeEnv.envFileReadFailed;
6518
6875
  secondaryEnv.metadata.envFileReadFailures.splice(
6519
6876
  0,
@@ -6531,18 +6888,26 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6531
6888
  ...refreshedRuntimeEnv.envFilePaths
6532
6889
  );
6533
6890
  delete secondaryEnv.metadata.fallbackReason;
6891
+ runtimeEnvironmentApplied = true;
6892
+ return { ...result, runtimeEnvironmentApplied };
6534
6893
  } catch (err) {
6535
6894
  secondaryEnv.metadata.fallbackReason = err instanceof Error ? err.message : String(err);
6536
6895
  daemonLog.warn(
6537
- "failed to rebuild secondary runtime env snapshot after daemon env reload; preserving previous runtime env",
6896
+ "failed to apply secondary runtime env snapshot after daemon env reload; preserving previous runtime env",
6538
6897
  {
6539
6898
  workspace,
6540
6899
  error: secondaryEnv.metadata.fallbackReason
6541
6900
  }
6542
6901
  );
6902
+ return { ...result, runtimeEnvironmentApplied };
6543
6903
  }
6544
- return result;
6545
6904
  }), "reloadDaemonEnv"),
6905
+ reloadModelProvidersDaemonEnv: /* @__PURE__ */ __name((workspace, assertGenerationOpen) => reloadRuntimeOverlaySnapshotForModelProviders(
6906
+ workspace,
6907
+ secondaryTrusted,
6908
+ secondaryEnv,
6909
+ assertGenerationOpen
6910
+ ), "reloadModelProvidersDaemonEnv"),
6546
6911
  queryWorkspaceStatus: /* @__PURE__ */ __name((method, idle) => secondaryBridge.queryWorkspaceStatus(method, idle), "queryWorkspaceStatus"),
6547
6912
  invokeWorkspaceCommand: /* @__PURE__ */ __name((method, params, invokeOpts) => secondaryBridge.invokeWorkspaceCommand(method, params, invokeOpts), "invokeWorkspaceCommand"),
6548
6913
  refreshExtensionsForAllSessions: /* @__PURE__ */ __name(() => secondaryBridge.refreshExtensionsForAllSessions(), "refreshExtensionsForAllSessions"),
@@ -6680,6 +7045,22 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6680
7045
  metricsLoopDelay.disable();
6681
7046
  }
6682
7047
  };
7048
+ sessionPrRefreshTimer?.dispose();
7049
+ const refreshGeneration = ++sessionPrRefreshGeneration;
7050
+ void import("./session-pr-refresh-OIVL3U3Z.js").then((mod) => {
7051
+ if (refreshGeneration !== sessionPrRefreshGeneration) return;
7052
+ sessionPrRefreshTimer = mod.startSessionPrRefreshTimer({
7053
+ workspaceRegistry,
7054
+ // The coordinator lives on the serve app (createServeApp below),
7055
+ // which is built after this timer starts; read it per tick like
7056
+ // the metrics sampler reads `acpHandle`.
7057
+ getArchiveCoordinator: /* @__PURE__ */ __name(() => app2.locals.sessionArchiveCoordinator, "getArchiveCoordinator")
7058
+ });
7059
+ }).catch((error) => {
7060
+ daemonLog.warn(
7061
+ `session-pr-refresh load failed: ${error instanceof Error ? error.message : String(error)}`
7062
+ );
7063
+ });
6683
7064
  const createDynamicWorkspaceRuntime = /* @__PURE__ */ __name(async (cwd, buildOptions) => {
6684
7065
  const provenance = buildOptions?.provenance ?? "existing";
6685
7066
  if (provenance === "managed-scratch" && (!managedScratchRoot || !isManagedScratchChild(cwd, managedScratchRoot.canonicalRoot))) {
@@ -6809,8 +7190,12 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6809
7190
  sessionRestoreTimeoutMs,
6810
7191
  ...opts.sessionReapIntervalMs !== void 0 ? { sessionReapIntervalMs: opts.sessionReapIntervalMs } : {},
6811
7192
  ...opts.sessionIdleTimeoutMs !== void 0 ? { sessionIdleTimeoutMs: opts.sessionIdleTimeoutMs } : {},
7193
+ ...opts.sessionPromptSettledCloseGraceMs !== void 0 ? {
7194
+ sessionPromptSettledCloseGraceMs: opts.sessionPromptSettledCloseGraceMs
7195
+ } : {},
6812
7196
  ...opts.permissionResponseTimeoutMs !== void 0 ? { permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs } : {},
6813
7197
  boundWorkspace: cwd,
7198
+ runtimeEpochSource: runtimeEpochSourceFor(cwd),
6814
7199
  // Live-conversation workspaces keep transcripts outside the
6815
7200
  // runtime storage layout, so no ledger sink is wired there.
6816
7201
  ...provenance === "live-conversation" ? {} : {
@@ -6897,20 +7282,54 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6897
7282
  workspaceTrusted: trusted
6898
7283
  });
6899
7284
  assertGenerationOpen?.();
6900
- const result = settingsRuntime.settings.reloadEnvironment(
6901
- fresh.merged,
6902
- workspace,
6903
- trusted
6904
- );
7285
+ let runtimeEnvironmentApplied = false;
7286
+ let refreshedRuntimeEnv;
6905
7287
  try {
6906
- const refreshedRuntimeEnv = settingsRuntime.environment.buildRuntimeEnvironment(
7288
+ refreshedRuntimeEnv = settingsRuntime.environment.buildRuntimeEnvironment(
6907
7289
  fresh.merged,
6908
7290
  workspace,
6909
7291
  daemonRuntimeBaseEnv,
6910
7292
  trusted
6911
7293
  );
6912
- logRuntimeEnvFileReadFailures(workspace, refreshedRuntimeEnv);
7294
+ } catch (err) {
7295
+ wsEnv.metadata.fallbackReason = err instanceof Error ? err.message : String(err);
7296
+ daemonLog.warn(
7297
+ "failed to rebuild dynamic runtime env snapshot before daemon env reload; preserving previous runtime env",
7298
+ {
7299
+ workspace,
7300
+ error: wsEnv.metadata.fallbackReason
7301
+ }
7302
+ );
7303
+ return {
7304
+ updatedKeys: [],
7305
+ removedKeys: [],
7306
+ runtimeEnvironmentApplied
7307
+ };
7308
+ }
7309
+ logRuntimeEnvFileReadFailures(workspace, refreshedRuntimeEnv);
7310
+ if (refreshedRuntimeEnv.envFileReadFailed) {
7311
+ return {
7312
+ updatedKeys: [],
7313
+ removedKeys: [],
7314
+ runtimeEnvironmentApplied: false
7315
+ };
7316
+ }
7317
+ const result = settingsRuntime.settings.reloadEnvironment(
7318
+ fresh.merged,
7319
+ workspace,
7320
+ trusted,
7321
+ { failClosedOnEnvFileReadError: true }
7322
+ );
7323
+ if (result.envFileReadFailed) {
7324
+ return {
7325
+ updatedKeys: [],
7326
+ removedKeys: [],
7327
+ runtimeEnvironmentApplied: false
7328
+ };
7329
+ }
7330
+ try {
6913
7331
  wsEnv.replace(refreshedRuntimeEnv.effectiveEnv);
7332
+ wsEnv.metadata.workflowsEnabledBySettings = fresh.merged.tools?.workflowsEnabled === true;
6914
7333
  wsEnv.metadata.envFileReadFailed = refreshedRuntimeEnv.envFileReadFailed;
6915
7334
  wsEnv.metadata.envFileReadFailures.splice(
6916
7335
  0,
@@ -6928,18 +7347,28 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
6928
7347
  ...refreshedRuntimeEnv.envFilePaths
6929
7348
  );
6930
7349
  delete wsEnv.metadata.fallbackReason;
7350
+ runtimeEnvironmentApplied = true;
7351
+ return { ...result, runtimeEnvironmentApplied };
6931
7352
  } catch (err) {
6932
7353
  wsEnv.metadata.fallbackReason = err instanceof Error ? err.message : String(err);
6933
7354
  daemonLog.warn(
6934
- "failed to rebuild dynamic runtime env snapshot after daemon env reload; preserving previous runtime env",
7355
+ "failed to apply dynamic runtime env snapshot after daemon env reload; preserving previous runtime env",
6935
7356
  {
6936
7357
  workspace,
6937
7358
  error: wsEnv.metadata.fallbackReason
6938
7359
  }
6939
7360
  );
7361
+ return { ...result, runtimeEnvironmentApplied };
6940
7362
  }
6941
- return result;
6942
7363
  }), "reloadDaemonEnv"),
7364
+ ...buildOptions?.primary === true ? {} : {
7365
+ reloadModelProvidersDaemonEnv: /* @__PURE__ */ __name((workspace, assertGenerationOpen) => reloadRuntimeOverlaySnapshotForModelProviders(
7366
+ workspace,
7367
+ trusted,
7368
+ wsEnv,
7369
+ assertGenerationOpen
7370
+ ), "reloadModelProvidersDaemonEnv")
7371
+ },
6943
7372
  queryWorkspaceStatus: /* @__PURE__ */ __name((method, idle) => wsBridge.queryWorkspaceStatus(method, idle), "queryWorkspaceStatus"),
6944
7373
  invokeWorkspaceCommand: /* @__PURE__ */ __name((method, params, invokeOpts) => wsBridge.invokeWorkspaceCommand(method, params, invokeOpts), "invokeWorkspaceCommand"),
6945
7374
  refreshExtensionsForAllSessions: /* @__PURE__ */ __name(() => wsBridge.refreshExtensionsForAllSessions(), "refreshExtensionsForAllSessions"),
@@ -7122,6 +7551,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7122
7551
  const existing = runtimeCleanupPromises.get(runtimeToDrain);
7123
7552
  if (existing) return existing;
7124
7553
  const cleanup = (async () => {
7554
+ runtime.getWorkspaceRuntimeCoordinatorIfSupported(runtimeToDrain)?.dispose();
7125
7555
  const containmentErrors = [];
7126
7556
  try {
7127
7557
  await workspaceVoiceCoordinator.disposeRuntime(
@@ -7177,6 +7607,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7177
7607
  const app3 = serveAppForRuntimeLifecycle.current ?? runtimeApp ?? runtimeAppForCleanup;
7178
7608
  const stopWorkspaceGitStateForWorkspace = app3?.locals?.["stopWorkspaceGitStateForWorkspace"];
7179
7609
  const stopScheduledTaskKeepaliveForWorkspace = app3?.locals?.["stopScheduledTaskKeepaliveForWorkspace"];
7610
+ const releaseWebTerminalsForWorkspace = app3?.locals?.["releaseWebTerminalsForWorkspace"];
7180
7611
  try {
7181
7612
  stopWorkspaceGitStateForWorkspace?.(runtimeToDrain.workspaceCwd);
7182
7613
  } catch (err) {
@@ -7195,6 +7626,14 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7195
7626
  err instanceof Error ? err : null
7196
7627
  );
7197
7628
  }
7629
+ try {
7630
+ releaseWebTerminalsForWorkspace?.(runtimeToDrain.workspaceCwd);
7631
+ } catch (err) {
7632
+ daemonLog.error(
7633
+ "workspace web-terminal cleanup error",
7634
+ err instanceof Error ? err : null
7635
+ );
7636
+ }
7198
7637
  }
7199
7638
  let bridgeStopped = false;
7200
7639
  try {
@@ -7266,8 +7705,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7266
7705
  { createChannelManagementService },
7267
7706
  { WorkspaceChannelSettingsStore }
7268
7707
  ] = await Promise.all([
7269
- import("./channel-management-service-X4AZ6IXX.js"),
7270
- import("./channel-settings-store-4UFCLBBG.js")
7708
+ import("./channel-management-service-IDBNYSFW.js"),
7709
+ import("./channel-settings-store-MZNXRKVI.js")
7271
7710
  ]);
7272
7711
  return createChannelManagementService({
7273
7712
  workspaceCwd: targetRuntime.workspaceCwd,
@@ -7472,8 +7911,8 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7472
7911
  { createWorkspaceTrustReconciler },
7473
7912
  { createDaemonTrustPolicyMonitor }
7474
7913
  ] = await Promise.all([
7475
- import("./workspace-trust-reconciler-KLGOB53D.js"),
7476
- import("./daemon-trust-policy-monitor-B5U6TQX5.js")
7914
+ import("./workspace-trust-reconciler-4LR3CDL4.js"),
7915
+ import("./daemon-trust-policy-monitor-3LM5RQNS.js")
7477
7916
  ]);
7478
7917
  const materializationFor = /* @__PURE__ */ __name((entry, snapshot, decision) => {
7479
7918
  const boundWorkspaces2 = entry.primary && decision.targetTrusted ? runtime.resolveBoundWorkspacesFromIdeEnv(
@@ -7645,6 +8084,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7645
8084
  qwenCodeVersion: cliVersion,
7646
8085
  sessionShellCommandEnabled,
7647
8086
  sessionArtifactsPersistenceAvailable,
8087
+ workspaceRuntimeAvailable: deps.bridge === void 0 || typeof deps.bridge.getWorkspaceRuntimeLifecycleSnapshot === "function",
7648
8088
  currentSessionSchedulingAvailable: false,
7649
8089
  permissionPolicy,
7650
8090
  multiWorkspaceCapabilitiesRequireRuntime: workspaceInputs.length > 1,
@@ -7669,7 +8109,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7669
8109
  // through (and start the runtime) exactly like the warm app would.
7670
8110
  // Dynamic import keeps web-shell-static out of the serve fast-path
7671
8111
  // static closure (see the import-boundary guards in fast-path.test.ts).
7672
- isPreAuthRequest: webShellMounted ? (req) => import("./web-shell-static-A6QMUNNV.js").then(
8112
+ isPreAuthRequest: webShellMounted ? (req) => import("./web-shell-static-PW7OEDQO.js").then(
7673
8113
  (webShellStatic) => webShellStatic.isPreAuthWebShellRequest(req)
7674
8114
  ) : void 0
7675
8115
  });
@@ -7689,7 +8129,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7689
8129
  );
7690
8130
  }
7691
8131
  const channelValidationSettingsRuntime = opts.channelSelection ? await loadSettingsRuntimeModules() : void 0;
7692
- const channelValidationTrustPolicy = opts.channelSelection ? await import("./daemon-trust-policy-DRZPFB4Q.js") : void 0;
8132
+ const channelValidationTrustPolicy = opts.channelSelection ? await import("./daemon-trust-policy-SUCBJ2CA.js") : void 0;
7693
8133
  const channelValidationTrustSnapshot = channelValidationTrustPolicy ? await channelValidationTrustPolicy.readDaemonTrustPolicySnapshot() : void 0;
7694
8134
  const resolveChannelWorkspaceGroupsAtListen = /* @__PURE__ */ __name(() => {
7695
8135
  if (!opts.channelSelection || !channelValidationSettingsRuntime || !channelRuntime) {
@@ -7813,7 +8253,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
7813
8253
  const addr = server.address();
7814
8254
  actualPort = typeof addr === "object" && addr ? addr.port : opts.port;
7815
8255
  const scheme = tlsOptions ? "https" : "http";
7816
- const url = `${scheme}://${formatHostForUrl(opts.hostname)}:${actualPort}`;
8256
+ const url = `${scheme}://${formatHostForUrl(optsIn.hostname)}:${actualPort}`;
7817
8257
  const liveRuntimeBaseDir = path.dirname(daemonLogBaseDir);
7818
8258
  const liveDiscoveryOwners = [];
7819
8259
  const rememberLiveDiscoveryOwner = /* @__PURE__ */ __name((owner) => {
@@ -8242,11 +8682,14 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8242
8682
  );
8243
8683
  }
8244
8684
  const workerRuntime = await ensureChannelRuntime();
8685
+ const workerHostname = tlsOptions ? optsIn.hostname : opts.hostname;
8245
8686
  const workerDaemonUrl = formatChannelWorkerDaemonUrl(
8246
- opts.hostname,
8687
+ workerHostname,
8247
8688
  actualPort,
8248
- tlsOptions !== void 0
8689
+ tlsOptions !== void 0,
8690
+ typeof addr === "object" && addr && (addr.family === "IPv4" || addr.family === "IPv6") ? addr.family : void 0
8249
8691
  );
8692
+ (deps.channelWorkerUrlCertifier ?? assertChannelWorkerDaemonUrlIsLocal)(workerDaemonUrl, workerHostname);
8250
8693
  if (tlsOptions && tlsCertPath && process.env["NODE_TLS_REJECT_UNAUTHORIZED"] === "0") {
8251
8694
  daemonLog.warn(
8252
8695
  `NODE_TLS_REJECT_UNAUTHORIZED=0 disables certificate verification for channel workers; skipping the worker TLS trust check.`
@@ -8546,6 +8989,15 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8546
8989
  cancelLiveDiscoveryRetry();
8547
8990
  channelControlDraining = true;
8548
8991
  const initiallyMountedApp = runtimeApp ?? runtimeAppForCleanup;
8992
+ const beginRuntimeCoordinatorDrains = /* @__PURE__ */ __name((app2) => {
8993
+ const registry = app2?.locals?.["workspaceRegistry"];
8994
+ for (const workspaceRuntime of registry?.list() ?? []) {
8995
+ getWorkspaceRuntimeCoordinatorIfSupported?.(
8996
+ workspaceRuntime
8997
+ )?.beginDrain();
8998
+ }
8999
+ }, "beginRuntimeCoordinatorDrains");
9000
+ beginRuntimeCoordinatorDrains(initiallyMountedApp);
8549
9001
  const initiallyMountedManagement = initiallyMountedApp?.locals?.["workspaceManagementHandle"];
8550
9002
  const initiallyMountedSessionMaintenance = initiallyMountedApp?.locals?.["sessionArchiveCoordinator"];
8551
9003
  const initiallyMountedConversationActivity = initiallyMountedApp?.locals?.["conversationRuntimeActivity"];
@@ -8577,6 +9029,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8577
9029
  if (!preserveSignalHandlers) {
8578
9030
  process.removeListener("SIGINT", onSignal);
8579
9031
  process.removeListener("SIGTERM", onSignal);
9032
+ process.removeListener("SIGHUP", onSignal);
8580
9033
  }
8581
9034
  process.removeListener(
8582
9035
  "uncaughtExceptionMonitor",
@@ -8673,6 +9126,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8673
9126
  err instanceof Error ? err : null
8674
9127
  );
8675
9128
  });
9129
+ beginRuntimeCoordinatorDrains(appForCleanup);
8676
9130
  startProcessRegistryShutdown();
8677
9131
  disposeRuntimeAppResources(appForCleanup);
8678
9132
  disposeDaemonEventLoopMonitor();
@@ -8782,7 +9236,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8782
9236
  );
8783
9237
  if (!token) {
8784
9238
  writeStderrLine(
8785
- `qwen serve: bearer auth disabled (loopback default). Set ${QWEN_SERVER_TOKEN_ENV} to enable.`
9239
+ `qwen serve: trusted loopback mode; local callers have full API access without bearer authentication, including code execution as the daemon user. Use --require-auth with ${QWEN_SERVER_TOKEN_ENV} on shared or untrusted hosts.`
8786
9240
  );
8787
9241
  if (opts.clientMcpOverWs === true) {
8788
9242
  writeStderrLine(
@@ -8796,6 +9250,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8796
9250
  }
8797
9251
  process.on("SIGINT", onSignal);
8798
9252
  process.on("SIGTERM", onSignal);
9253
+ process.on("SIGHUP", onSignal);
8799
9254
  process.on("uncaughtExceptionMonitor", onUncaughtExceptionMonitor);
8800
9255
  server.on("error", (err) => {
8801
9256
  daemonLog.error("server error", err instanceof Error ? err : null);
@@ -8894,6 +9349,22 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8894
9349
  const tryListen = /* @__PURE__ */ __name((attemptPort, attempt) => {
8895
9350
  const handleListening = /* @__PURE__ */ __name(() => {
8896
9351
  server.removeListener("error", handleError);
9352
+ const address = server.address();
9353
+ if (trustedLoopbackMode && (typeof address !== "object" || address === null || !isLoopbackAddress(address.address))) {
9354
+ const resolvedAddress = typeof address === "object" && address !== null ? address.address : String(address);
9355
+ const error = new Error(
9356
+ `Refusing trusted-loopback mode because ${opts.hostname} bound to non-loopback address ${resolvedAddress}. Set ${QWEN_SERVER_TOKEN_ENV} or pass --token, or bind to an explicit loopback address.`
9357
+ );
9358
+ removeCurrentServePidfile();
9359
+ markServeAppStartupFailed(error);
9360
+ void serveAppLifecycle.close().then(
9361
+ () => reject(error),
9362
+ (closeError) => reject(
9363
+ closeError instanceof Error ? new AggregateError([error, closeError], error.message) : error
9364
+ )
9365
+ );
9366
+ return;
9367
+ }
8897
9368
  onListening();
8898
9369
  }, "handleListening");
8899
9370
  const handleError = /* @__PURE__ */ __name((err) => {
@@ -8945,6 +9416,7 @@ async function runQwenServeImpl(optsIn, deps, loggerLifecycle) {
8945
9416
  __name(runQwenServeImpl, "runQwenServeImpl");
8946
9417
  export {
8947
9418
  InvalidPolicyConfigError,
9419
+ assertChannelWorkerDaemonUrlIsLocal,
8948
9420
  createBoundChannelDeliveryHandler,
8949
9421
  createDisabledChannelWorkerSupervisor,
8950
9422
  createLazyBridgeProxy,