@qwen-code/qwen-code 0.21.7-nightly.20260808.4ec0371e6 → 0.21.8

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 (254) hide show
  1. package/README.md +2 -0
  2. package/bundled/qc-helper/docs/configuration/settings.md +12 -8
  3. package/bundled/qc-helper/docs/features/commands.md +1 -1
  4. package/bundled/qc-helper/docs/features/hooks.md +50 -0
  5. package/bundled/qc-helper/docs/integration-jetbrains.md +1 -0
  6. package/bundled/qc-helper/docs/qwen-serve.md +1 -1
  7. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +50 -36
  8. package/bundled/review/SKILL.md +24 -5
  9. package/chunks/{MaxSizedBox-COZBVNCI.js → MaxSizedBox-7PM6BGJ5.js} +13 -10
  10. package/chunks/{StandaloneSessionPicker-3OF2FS6S.js → StandaloneSessionPicker-3UQHM7GV.js} +29 -26
  11. package/chunks/{acp-startup-profiler-ORIQ2CCQ.js → acp-startup-profiler-B5BYAMYQ.js} +2 -2
  12. package/chunks/{acpAgent-3JCJ6KWG.js → acpAgent-5UWLFV6V.js} +369 -148
  13. package/chunks/{agent-DBSC47CD.js → agent-624T2BLO.js} +13 -10
  14. package/chunks/{agent-headless-ZJHZ7I3S.js → agent-headless-2EE5J2KX.js} +13 -10
  15. package/chunks/{bridge-NFBYT4ZI.js → bridge-JENKGFFP.js} +15 -12
  16. package/chunks/{ca-NYKNH222.js → ca-ZLKAB4K3.js} +6 -0
  17. package/chunks/{channel-management-service-LXSJXQGM.js → channel-management-service-DDWUPHMU.js} +1 -1
  18. package/chunks/{channel-settings-store-LABKDKSI.js → channel-settings-store-SA6JZSPH.js} +21 -18
  19. package/chunks/{channel-worker-group-MTW2AGT3.js → channel-worker-group-E67EN3RV.js} +2 -2
  20. package/chunks/{channel-worker-manager-UU6PTQSI.js → channel-worker-manager-SW4C45CF.js} +2 -2
  21. package/chunks/{chunk-CJXIIILK.js → chunk-2FRY5CRX.js} +1 -1
  22. package/chunks/{chunk-HKCYGZZ4.js → chunk-2ILAOM2I.js} +30 -13
  23. package/chunks/{chunk-LDY4J4G6.js → chunk-2M4K4KYS.js} +176 -119
  24. package/chunks/{chunk-22NBYCPD.js → chunk-3P2LV43B.js} +1 -1
  25. package/chunks/{chunk-XCG76UE6.js → chunk-3PY4LPJF.js} +17 -129
  26. package/chunks/{chunk-26ISE5EG.js → chunk-3SE7J4DR.js} +3 -3
  27. package/chunks/{chunk-APMRLB2H.js → chunk-3WNQOYHQ.js} +12 -12
  28. package/chunks/{chunk-O7VQ3F22.js → chunk-4ALIARFY.js} +1 -1
  29. package/chunks/{chunk-FJ6YHWHZ.js → chunk-4DU3NCHG.js} +47 -54
  30. package/chunks/{chunk-BGG4MBYD.js → chunk-4PYCZH2V.js} +4 -187
  31. package/chunks/{chunk-3HS6Y4UA.js → chunk-4WU6NY7F.js} +2 -2
  32. package/chunks/{chunk-JRIJOZXO.js → chunk-5ZGR6RKJ.js} +3 -3
  33. package/chunks/{chunk-3K7FH2KQ.js → chunk-67N6HB5H.js} +1310 -171
  34. package/chunks/{chunk-ZQGHESAS.js → chunk-6TR7CFXH.js} +1 -1
  35. package/chunks/{chunk-EZ53KMUN.js → chunk-757GB46F.js} +1 -1
  36. package/chunks/{chunk-5YT3Y33M.js → chunk-77QVBFCU.js} +3 -3
  37. package/chunks/{chunk-5PGKKSO6.js → chunk-7DVT4LVV.js} +35 -28
  38. package/chunks/{chunk-IMK3SJ43.js → chunk-7VUERJHS.js} +1066 -597
  39. package/chunks/{chunk-KPMB4JEZ.js → chunk-B52AWKBB.js} +64 -20
  40. package/chunks/{chunk-R2KZWK5Z.js → chunk-BF224XHL.js} +2 -2
  41. package/chunks/{chunk-TSYIQDG7.js → chunk-BF52U4XJ.js} +1 -1
  42. package/chunks/{chunk-LDUGDB5H.js → chunk-C5VWPTGT.js} +1 -1
  43. package/chunks/{chunk-W7U4ESW2.js → chunk-CG3WBKJK.js} +1 -1
  44. package/chunks/chunk-COBO5EBO.js +135 -0
  45. package/chunks/{chunk-ACHMWGC5.js → chunk-DQSDACD2.js} +1 -1
  46. package/chunks/{chunk-VT3VNFVW.js → chunk-DX5W5AON.js} +2 -2
  47. package/chunks/{chunk-JACAHYEN.js → chunk-E4ZBKMSF.js} +4 -4
  48. package/chunks/{chunk-MV7VUCIG.js → chunk-EIVICVHM.js} +4 -4
  49. package/chunks/{chunk-YHEEE624.js → chunk-EN2TKTFH.js} +1 -1
  50. package/chunks/chunk-F6WFNA7U.js +22 -0
  51. package/chunks/{chunk-Z6W3XDLN.js → chunk-FN6YXJOP.js} +1 -1
  52. package/chunks/{chunk-BJKFFPX2.js → chunk-FWBXMANW.js} +3 -3
  53. package/chunks/{chunk-764F335K.js → chunk-FYAXKJK7.js} +314 -63
  54. package/chunks/{chunk-XIDHBXUI.js → chunk-GBDINRIL.js} +3 -3
  55. package/chunks/{chunk-Z5ZAWED3.js → chunk-GOEVOFQI.js} +3 -3
  56. package/chunks/{chunk-ZKUJ4AO7.js → chunk-GQCEQPYQ.js} +3 -3
  57. package/chunks/{chunk-BFSQBXHV.js → chunk-GXSNGY5M.js} +399 -534
  58. package/chunks/{chunk-3ARO4N5G.js → chunk-HA3SAB64.js} +22 -69
  59. package/chunks/{chunk-3ULCB3NE.js → chunk-HV76SFIA.js} +1 -1
  60. package/chunks/{chunk-LMEIS6WW.js → chunk-HWX5HPUG.js} +3 -3
  61. package/chunks/{chunk-VLFX3L3X.js → chunk-IBYULW65.js} +6 -6
  62. package/chunks/{chunk-SDUDZNF4.js → chunk-IUQ52YJK.js} +1 -1
  63. package/chunks/{chunk-H2352CX2.js → chunk-IYES5WOT.js} +2 -2
  64. package/chunks/{chunk-CE5UCTKO.js → chunk-KAQCJO6Y.js} +1 -1
  65. package/chunks/{chunk-DPH3MUAP.js → chunk-KKDVZLGL.js} +1 -1
  66. package/chunks/{chunk-R574ATRM.js → chunk-M2PNLYGY.js} +41 -0
  67. package/chunks/{chunk-P7HUJDBZ.js → chunk-M3STHEMM.js} +11 -16
  68. package/chunks/{chunk-VDS2WYM5.js → chunk-NGYI5EF5.js} +2 -2
  69. package/chunks/{chunk-ALGGS7UH.js → chunk-NPQ5ZKRP.js} +82 -1
  70. package/chunks/{chunk-GUFY6D3E.js → chunk-NPUXXRJI.js} +1 -1
  71. package/chunks/{chunk-4Q6N3SNL.js → chunk-NVRDQFCX.js} +1 -1
  72. package/chunks/{chunk-77WOUGCA.js → chunk-OHKJVAKG.js} +7 -7
  73. package/chunks/{chunk-TAOSTUHI.js → chunk-PG62DFWD.js} +10 -10
  74. package/chunks/{chunk-REHWPCG2.js → chunk-PLFATELK.js} +1 -1
  75. package/chunks/{chunk-APNNM3JC.js → chunk-QGHSP65Z.js} +2 -2
  76. package/chunks/{chunk-HY2INPTA.js → chunk-QQWD7LZV.js} +4 -4
  77. package/chunks/{chunk-P74TZRXD.js → chunk-QXVSWG66.js} +1 -1
  78. package/chunks/{chunk-TX3KSSDN.js → chunk-S3Y3GBFD.js} +1 -1
  79. package/chunks/{chunk-B23P3YWE.js → chunk-SNRT2TJJ.js} +6 -23
  80. package/chunks/chunk-SR7RZ4MS.js +202 -0
  81. package/chunks/{chunk-F3LPXDJP.js → chunk-TE3ZAJE7.js} +13 -3
  82. package/chunks/{chunk-AB4A73VL.js → chunk-TKSZJ5BV.js} +1 -1
  83. package/chunks/{chunk-RZMGG3HP.js → chunk-U5SLIG7E.js} +1 -1
  84. package/chunks/chunk-UA5H3DS2.js +203 -0
  85. package/chunks/{chunk-JSJTZ6GO.js → chunk-VWMUDKLC.js} +3 -3
  86. package/chunks/{chunk-RGTB44BO.js → chunk-VXZ5HAOV.js} +1 -1
  87. package/chunks/{chunk-BCMJPTXV.js → chunk-WG6542MA.js} +1 -1
  88. package/chunks/{chunk-AG3P2RES.js → chunk-WV5J6Q6N.js} +1 -1
  89. package/chunks/{chunk-MIA37QO3.js → chunk-XHD7CRP2.js} +2 -2
  90. package/chunks/{chunk-KKRGVSHC.js → chunk-XZKQT2B2.js} +4 -4
  91. package/chunks/{chunk-4QJJHIZ5.js → chunk-Y4TETC74.js} +5 -5
  92. package/chunks/{chunk-QKJT5K4Q.js → chunk-YEF7XEO2.js} +3 -3
  93. package/chunks/{chunk-UKAYEQDU.js → chunk-YHJFF7KH.js} +131 -38
  94. package/chunks/{chunk-64YLXLMY.js → chunk-YOM7DEGB.js} +2 -2
  95. package/chunks/{chunk-BN3OROB3.js → chunk-ZCLLJARV.js} +9 -9
  96. package/chunks/{chunk-RFA6VDCR.js → chunk-ZHA242R4.js} +2 -2
  97. package/chunks/{chunk-L4OW63GW.js → chunk-ZPLALRXZ.js} +17 -9
  98. package/chunks/{computer-use-QLJ27OCZ.js → computer-use-ESQYJ3JY.js} +13 -10
  99. package/chunks/{config-utils-KIEXWA4F.js → config-utils-XQHBJP7G.js} +2 -2
  100. package/chunks/{contextCommand-JDTOJRBO.js → contextCommand-CX3YF4ZE.js} +15 -12
  101. package/chunks/{core-runtime-MZIAVYQC.js → core-runtime-DIAU7JMG.js} +13 -10
  102. package/chunks/{create-sub-session-YBBCNSHE.js → create-sub-session-HDPD6HOA.js} +13 -10
  103. package/chunks/{daemon-SCTQMM7Z.js → daemon-VZBGJUNL.js} +30 -0
  104. package/chunks/{daemon-status-provider-BZ7RD4ZJ.js → daemon-status-provider-H6O4UQ4F.js} +19 -16
  105. package/chunks/{daemon-trust-policy-2E4C3M7S.js → daemon-trust-policy-BNUXG6MT.js} +20 -17
  106. package/chunks/{daemon-trust-policy-monitor-UYLFH6RW.js → daemon-trust-policy-monitor-E4EQ7GF4.js} +20 -17
  107. package/chunks/{de-VL76CPLV.js → de-LIW4XVLN.js} +5 -0
  108. package/chunks/{deferred-core-runtime-6XZYMJZB.js → deferred-core-runtime-CBMSHPAU.js} +13 -10
  109. package/chunks/{dist-BATY7GI4.js → dist-EEEQGCZA.js} +731 -136
  110. package/chunks/{dist-26RK5XZO.js → dist-MKX5OSFF.js} +4 -3
  111. package/chunks/{earlyInputCapture-LATQCGDC.js → earlyInputCapture-UIOP7OIN.js} +13 -10
  112. package/chunks/{edit-72DP57CD.js → edit-ITMZYFKA.js} +13 -10
  113. package/chunks/{en-IRJ2WN5T.js → en-SY5GTIGX.js} +6 -0
  114. package/chunks/{enter-worktree-B4FY2ZPP.js → enter-worktree-S4PL5UV6.js} +13 -10
  115. package/chunks/{enterPlanMode-TQBWGCPL.js → enterPlanMode-YV52NNJT.js} +13 -10
  116. package/chunks/{environment-MOGZGZDS.js → environment-NGOWPRZV.js} +17 -14
  117. package/chunks/{errors-PGON5GH7.js → errors-BU26DTDX.js} +15 -12
  118. package/chunks/{exit-worktree-EYUD4YP2.js → exit-worktree-XRM6LH5F.js} +13 -10
  119. package/chunks/{exitPlanMode-4Q7BSQXR.js → exitPlanMode-ZLI5F7KR.js} +13 -10
  120. package/chunks/{fast-path-WI7D5MER.js → fast-path-UJWORIED.js} +3 -3
  121. package/chunks/{fast-path-settings-YBRL24DB.js → fast-path-settings-37WQD5B2.js} +6 -3
  122. package/chunks/{fr-GK3HQYVB.js → fr-RQFO7U4P.js} +5 -0
  123. package/chunks/{gemini-ZXURGM6Y.js → gemini-ZSKNDUMU.js} +55 -48
  124. package/chunks/{geminiContentGenerator-EOODO75Y.js → geminiContentGenerator-YGEXOEKD.js} +1 -1
  125. package/chunks/{glob-QNRIUOS6.js → glob-7KZG44BR.js} +13 -10
  126. package/chunks/{goal-tools-QSYW65HV.js → goal-tools-PXWN5VK3.js} +3 -1
  127. package/chunks/{grep-56MTW67B.js → grep-6ZFC7RJ5.js} +13 -10
  128. package/chunks/{handleAutoUpdate-XGFIPVT4.js → handleAutoUpdate-KSEL3TQS.js} +17 -14
  129. package/chunks/{i18n-RZB35L4B.js → i18n-ZIUXBW5V.js} +14 -11
  130. package/chunks/{image-gen-OE2EEKN3.js → image-gen-AUIZJJNK.js} +6 -4
  131. package/chunks/{initializer-YPVMTMKD.js → initializer-7AHY3N6Q.js} +20 -17
  132. package/chunks/{installationInfo-ZTMTMYNW.js → installationInfo-VGBXMYLY.js} +14 -11
  133. package/chunks/{ja-3FA46IKD.js → ja-KOZKHJHZ.js} +5 -0
  134. package/chunks/{list-NIW3WID5.js → list-PSFKQHLB.js} +23 -20
  135. package/chunks/{loadedSettingsAdapter-VSLILTOZ.js → loadedSettingsAdapter-FTMRCTOF.js} +20 -17
  136. package/chunks/{loggingContentGenerator-KFZYVAGV.js → loggingContentGenerator-MZAN52UV.js} +5 -3
  137. package/chunks/{managed-npm-update-WHTA2K5V.js → managed-npm-update-O4NHK45X.js} +14 -11
  138. package/chunks/{mcp-7KGK3CS3.js → mcp-6CFP2AYQ.js} +20 -17
  139. package/chunks/{monitor-FDWEJQWP.js → monitor-DAKD6OU4.js} +13 -10
  140. package/chunks/{nonInteractiveCli-2MVJ6TCS.js → nonInteractiveCli-RC7VIUZL.js} +49 -44
  141. package/chunks/{notebook-edit-ZUVK2XWE.js → notebook-edit-474DPMRL.js} +13 -10
  142. package/chunks/{openaiContentGenerator-TNLWOPH5.js → openaiContentGenerator-2NFY2MWO.js} +6 -3
  143. package/chunks/{pidfile-BB6SKPH2.js → pidfile-KBFVDNQP.js} +13 -10
  144. package/chunks/{processUtils-WKHJOPDH.js → processUtils-6GRYH4Y3.js} +2 -2
  145. package/chunks/{pt-3AOBKPIJ.js → pt-U6AOCTMF.js} +5 -0
  146. package/chunks/{qwenContentGenerator-FZS2DYF7.js → qwenContentGenerator-KAHU6IZY.js} +14 -11
  147. package/chunks/{qwenOAuth2-UYMYRXBB.js → qwenOAuth2-RRQTCP4W.js} +6 -4
  148. package/chunks/{read-file-FMTE6LPA.js → read-file-3M6WXDXP.js} +4 -2
  149. package/chunks/{resumeHistoryUtils-Z34RCZFF.js → resumeHistoryUtils-D6TAY3HX.js} +16 -13
  150. package/chunks/{ripGrep-DUIYUZGM.js → ripGrep-PLPENT3E.js} +13 -10
  151. package/chunks/{ru-VJRAMC4W.js → ru-CMX4UMYP.js} +5 -0
  152. package/chunks/{run-qwen-serve-KOHHR3F4.js → run-qwen-serve-ZAFIJKJC.js} +93 -40
  153. package/chunks/{runtime-K4NTZSAU.js → runtime-ZED7CYOZ.js} +23 -20
  154. package/chunks/{scheduler-6G6AMURS.js → scheduler-MD3AL2W5.js} +13 -10
  155. package/chunks/{serve-NMG2TM5K.js → serve-E3VUDRZN.js} +20 -17
  156. package/chunks/{server-FS7KDELS.js → server-OWMEMAKR.js} +381 -192
  157. package/chunks/{session-XZADUVKJ.js → session-HZ57QK7K.js} +141 -81
  158. package/chunks/{settings-G75R6FOA.js → settings-V7BR3RKP.js} +19 -16
  159. package/chunks/{shell-3D3PMQHE.js → shell-23OMNMW6.js} +13 -10
  160. package/chunks/{skill-TSEYMVQ2.js → skill-6HBDYZRS.js} +4 -2
  161. package/chunks/{skill-settings-HJC2CPBJ.js → skill-settings-HWJLTU7M.js} +19 -16
  162. package/chunks/{spawnChannel-YWCN74G5.js → spawnChannel-N6KKUW5B.js} +13 -10
  163. package/chunks/{standalone-update-HLYOLX6V.js → standalone-update-QGIKHATD.js} +15 -12
  164. package/chunks/{startInteractiveUI-ROUIQ5KU.js → startInteractiveUI-GX2CRL42.js} +269 -118
  165. package/chunks/{team-create-OTP5SSB2.js → team-create-CFFKU7KL.js} +13 -10
  166. package/chunks/{team-plan-approval-TQX5TMXU.js → team-plan-approval-6EFOKR6A.js} +13 -10
  167. package/chunks/{terminal-image-renderer-KF3GKNWW.js → terminal-image-renderer-TLDNACQY.js} +13 -10
  168. package/chunks/{theme-manager-XVWAAGAM.js → theme-manager-5LJ3H7VO.js} +13 -10
  169. package/chunks/{tool-search-7N4D4O56.js → tool-search-UJV3A24H.js} +4 -2
  170. package/chunks/{total-session-admission-ZQ4VKIRW.js → total-session-admission-D63QYXGO.js} +15 -12
  171. package/chunks/{trustedFolders-4XYFPWVV.js → trustedFolders-KZCOB53W.js} +17 -12
  172. package/chunks/{update-relaunch-L4GSBLUU.js → update-relaunch-IFILM3SA.js} +5 -5
  173. package/chunks/{updateCheck-PCUTVRFE.js → updateCheck-YZ2CRCFC.js} +16 -13
  174. package/chunks/{useAutoAcceptIndicator-WMXY7MND.js → useAutoAcceptIndicator-AXEVNA3Q.js} +22 -19
  175. package/chunks/{validateNonInterActiveAuth-5S3U2D56.js → validateNonInterActiveAuth-3WTOJFWA.js} +44 -41
  176. package/chunks/{version-P57IQU2T.js → version-GXK7OHZY.js} +1 -1
  177. package/chunks/{web-fetch-5ZLLLCDD.js → web-fetch-ILB4GAVR.js} +10 -6
  178. package/chunks/{web-search-NELKANTW.js → web-search-HKRPGPZZ.js} +5 -3
  179. package/chunks/{workflow-RXKBF3LO.js → workflow-FXIPRQQA.js} +735 -134
  180. package/chunks/{workspace-providers-status-HAEMNAWC.js → workspace-providers-status-NYHC7HSR.js} +22 -19
  181. package/chunks/{workspace-registration-store-U3U3YM6V.js → workspace-registration-store-AKEB7OMW.js} +1 -1
  182. package/chunks/{workspace-registry-ZFP33GVB.js → workspace-registry-CDAS5TVZ.js} +15 -12
  183. package/chunks/{workspace-service-QMISJBMA.js → workspace-service-PAMUKMAV.js} +23 -20
  184. package/chunks/{workspace-skills-status-K7EOUGXL.js → workspace-skills-status-YQSHCCMS.js} +20 -17
  185. package/chunks/{workspace-trust-reconciler-BFPKULDZ.js → workspace-trust-reconciler-RPTXOIY2.js} +22 -19
  186. package/chunks/{write-file-2F76RRFE.js → write-file-CGS57TS4.js} +13 -10
  187. package/chunks/{zh-ARWDLDLR.js → zh-AGL2FVBI.js} +6 -0
  188. package/chunks/{zh-TW-Y4RGI3P7.js → zh-TW-KI66MHQY.js} +6 -0
  189. package/chunks/{zoom-image-DPR22XWY.js → zoom-image-E7D72GYV.js} +4 -2
  190. package/cli.js +13 -13
  191. package/locales/ca.js +10 -0
  192. package/locales/de.js +9 -0
  193. package/locales/en.js +10 -0
  194. package/locales/fr.js +9 -0
  195. package/locales/ja.js +9 -0
  196. package/locales/pt.js +9 -0
  197. package/locales/ru.js +9 -0
  198. package/locales/zh-TW.js +10 -0
  199. package/locales/zh.js +10 -0
  200. package/package.json +3 -3
  201. package/web-shell/assets/{arc-CunFPPcQ.js → arc-DybZaz32.js} +1 -1
  202. package/web-shell/assets/{architectureDiagram-3BPJPVTR-D3SqCgeM.js → architectureDiagram-3BPJPVTR-jN3qBd19.js} +1 -1
  203. package/web-shell/assets/{blockDiagram-GPEHLZMM-CPRx90S_.js → blockDiagram-GPEHLZMM-Ct5DZPrj.js} +1 -1
  204. package/web-shell/assets/{c4Diagram-AAUBKEIU-CahP9Ue4.js → c4Diagram-AAUBKEIU-CUAFMlUG.js} +1 -1
  205. package/web-shell/assets/channel-BMwLrwLW.js +1 -0
  206. package/web-shell/assets/{chunk-2J33WTMH-DckIWZ12.js → chunk-2J33WTMH-CuV8n90B.js} +1 -1
  207. package/web-shell/assets/{chunk-4BX2VUAB-D2Kfctyn.js → chunk-4BX2VUAB-BUzl_kls.js} +1 -1
  208. package/web-shell/assets/{chunk-55IACEB6-DkI11FTX.js → chunk-55IACEB6-BnDBLX6A.js} +1 -1
  209. package/web-shell/assets/{chunk-727SXJPM-rR-TSCIi.js → chunk-727SXJPM-B83uTOjm.js} +1 -1
  210. package/web-shell/assets/{chunk-AQP2D5EJ-DFGKcGRO.js → chunk-AQP2D5EJ-DM3HLgpT.js} +1 -1
  211. package/web-shell/assets/{chunk-FMBD7UC4-CjWqcTPE.js → chunk-FMBD7UC4-CSQ5hgyb.js} +1 -1
  212. package/web-shell/assets/{chunk-ND2GUHAM-RXe-87UV.js → chunk-ND2GUHAM-BWOF4SxX.js} +1 -1
  213. package/web-shell/assets/{chunk-QZHKN3VN-Dz0c_Yrn.js → chunk-QZHKN3VN-BsOH9LMi.js} +1 -1
  214. package/web-shell/assets/classDiagram-4FO5ZUOK-BGDv98jY.js +1 -0
  215. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BGDv98jY.js +1 -0
  216. package/web-shell/assets/{cose-bilkent-S5V4N54A-ZHF0-jvV.js → cose-bilkent-S5V4N54A-IENqH2iJ.js} +1 -1
  217. package/web-shell/assets/{dagre-BM42HDAG-7Umz_ygJ.js → dagre-BM42HDAG--dyzDTGo.js} +1 -1
  218. package/web-shell/assets/{diagram-2AECGRRQ-DomN8nxq.js → diagram-2AECGRRQ-BE7Dcqof.js} +1 -1
  219. package/web-shell/assets/{diagram-5GNKFQAL-eebvj2OL.js → diagram-5GNKFQAL-Cr8-5OTj.js} +1 -1
  220. package/web-shell/assets/{diagram-KO2AKTUF-IR1mmn9d.js → diagram-KO2AKTUF-Bzey3uAY.js} +1 -1
  221. package/web-shell/assets/{diagram-LMA3HP47-CKysx5KF.js → diagram-LMA3HP47-sErl28Xb.js} +1 -1
  222. package/web-shell/assets/{diagram-OG6HWLK6-cBy5puHn.js → diagram-OG6HWLK6-Dq30ATIo.js} +1 -1
  223. package/web-shell/assets/{erDiagram-TEJ5UH35-B5RJagPG.js → erDiagram-TEJ5UH35-BkCoEfVW.js} +1 -1
  224. package/web-shell/assets/{flowDiagram-I6XJVG4X-CfHgDmPg.js → flowDiagram-I6XJVG4X-DHwO0rrI.js} +1 -1
  225. package/web-shell/assets/{ganttDiagram-6RSMTGT7-DUfFF5nb.js → ganttDiagram-6RSMTGT7-s7vAPxWq.js} +1 -1
  226. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-M9dt57k5.js → gitGraphDiagram-PVQCEYII-CQxhwPOU.js} +1 -1
  227. package/web-shell/assets/{index-B8e-CkuC.css → index-Bckpjr-I.css} +1 -1
  228. package/web-shell/assets/{index-CKjO4myk.js → index-CF4wApWp.js} +1 -1
  229. package/web-shell/assets/{index-Dc-fTO0V.js → index-DwEr9HEW.js} +316 -316
  230. package/web-shell/assets/{infoDiagram-5YYISTIA-CTKMmIro.js → infoDiagram-5YYISTIA-BnFrD0bq.js} +1 -1
  231. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-DJIJDP4s.js → ishikawaDiagram-YF4QCWOH-Bf9zK5NK.js} +1 -1
  232. package/web-shell/assets/{journeyDiagram-JHISSGLW-DgRnvn6S.js → journeyDiagram-JHISSGLW-CyGAhsxi.js} +1 -1
  233. package/web-shell/assets/{kanban-definition-UN3LZRKU-VUwO8yrg.js → kanban-definition-UN3LZRKU-CbsK5akB.js} +1 -1
  234. package/web-shell/assets/{linear-BCvgV5I_.js → linear-cQsF4P8D.js} +1 -1
  235. package/web-shell/assets/{mermaid.core-mv_kVV6q.js → mermaid.core-Z4HVqrKY.js} +5 -5
  236. package/web-shell/assets/{mindmap-definition-RKZ34NQL-sfnjMlOd.js → mindmap-definition-RKZ34NQL-CYnrBo_f.js} +1 -1
  237. package/web-shell/assets/{pieDiagram-4H26LBE5-BlhICse4.js → pieDiagram-4H26LBE5-CBzOfhrs.js} +1 -1
  238. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-BgTQzwen.js → quadrantDiagram-W4KKPZXB-D4LK1Ebn.js} +1 -1
  239. package/web-shell/assets/{requirementDiagram-4Y6WPE33-CZ-FTrrN.js → requirementDiagram-4Y6WPE33-Bzti2Lcj.js} +1 -1
  240. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-G5Wp_jn3.js → sankeyDiagram-5OEKKPKP-yTBw5Z2s.js} +1 -1
  241. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-C8MKZ3i1.js → sequenceDiagram-3UESZ5HK-D07UVRiZ.js} +1 -1
  242. package/web-shell/assets/{stateDiagram-AJRCARHV-Bo0ZDm7y.js → stateDiagram-AJRCARHV-UE_lHsTn.js} +1 -1
  243. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-DC6xgXjX.js +1 -0
  244. package/web-shell/assets/{timeline-definition-PNZ67QCA-M3L9E01f.js → timeline-definition-PNZ67QCA-DRvYdiTs.js} +1 -1
  245. package/web-shell/assets/{vennDiagram-CIIHVFJN-DD4eHCrm.js → vennDiagram-CIIHVFJN-CQLIXs0u.js} +1 -1
  246. package/web-shell/assets/{wardley-L42UT6IY-DNEL_3g4.js → wardley-L42UT6IY-JZz_Xqse.js} +1 -1
  247. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-q484OoqI.js → wardleyDiagram-YWT4CUSO--i7BiJwB.js} +1 -1
  248. package/web-shell/assets/{xychartDiagram-2RQKCTM6-4mcNt1Yg.js → xychartDiagram-2RQKCTM6-Bkc-bW0S.js} +1 -1
  249. package/web-shell/index.html +2 -2
  250. package/chunks/chunk-ALFTV7GA.js +0 -92
  251. package/web-shell/assets/channel-zbv7GWAw.js +0 -1
  252. package/web-shell/assets/classDiagram-4FO5ZUOK-DSjLkJJZ.js +0 -1
  253. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-DSjLkJJZ.js +0 -1
  254. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-31TSCPcH.js +0 -1
@@ -21,7 +21,7 @@ import {
21
21
  shouldSuppressRememberErrorDetails,
22
22
  workspaceMemoryFailureCode,
23
23
  workspaceMemoryFailureDiagnostics
24
- } from "./chunk-L4OW63GW.js";
24
+ } from "./chunk-ZPLALRXZ.js";
25
25
  import {
26
26
  deriveWebSocketBase,
27
27
  openQwenAsrRealtimeStream,
@@ -39,12 +39,12 @@ import {
39
39
  toJson,
40
40
  toJsonl,
41
41
  toMarkdown
42
- } from "./chunk-LDY4J4G6.js";
42
+ } from "./chunk-2M4K4KYS.js";
43
43
  import {
44
44
  OBSERVED_CONTACT_MAX_FRESH_WITHIN_SECONDS,
45
45
  ObservedChannelContactStore
46
46
  } from "./chunk-OWMAZHIX.js";
47
- import "./chunk-O7VQ3F22.js";
47
+ import "./chunk-4ALIARFY.js";
48
48
  import {
49
49
  escapeAnsiCtrlCodes
50
50
  } from "./chunk-4NFY2S7N.js";
@@ -108,7 +108,7 @@ import {
108
108
  setRateLimiter,
109
109
  unsafeRevealSecret,
110
110
  validateMcpRuntimeServerName
111
- } from "./chunk-CE5UCTKO.js";
111
+ } from "./chunk-KAQCJO6Y.js";
112
112
  import {
113
113
  isLoopbackBind
114
114
  } from "./chunk-RXFQM6FQ.js";
@@ -124,17 +124,17 @@ import {
124
124
  import "./chunk-GRC5HGPI.js";
125
125
  import {
126
126
  assertValidChannelSecretUpdates
127
- } from "./chunk-3HS6Y4UA.js";
127
+ } from "./chunk-4WU6NY7F.js";
128
128
  import {
129
129
  createWorkspaceProvidersStatusProvider
130
- } from "./chunk-KKRGVSHC.js";
130
+ } from "./chunk-XZKQT2B2.js";
131
131
  import {
132
132
  getAuthTypeFromEnv,
133
133
  resolveCliGenerationConfig
134
- } from "./chunk-XIDHBXUI.js";
134
+ } from "./chunk-GBDINRIL.js";
135
135
  import {
136
136
  createWorkspaceSkillsStatusProvider
137
- } from "./chunk-VT3VNFVW.js";
137
+ } from "./chunk-DX5W5AON.js";
138
138
  import "./chunk-BGXZBI5B.js";
139
139
  import {
140
140
  isServeDebugMode,
@@ -147,7 +147,7 @@ import {
147
147
  import {
148
148
  evaluateDaemonWorkspaceTrust,
149
149
  readDaemonTrustPolicySnapshot
150
- } from "./chunk-B23P3YWE.js";
150
+ } from "./chunk-SNRT2TJJ.js";
151
151
  import {
152
152
  EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,
153
153
  MAX_WORKSPACE_SKILL_NAME_LENGTH,
@@ -161,14 +161,14 @@ import {
161
161
  validateWorkspaceSkillName,
162
162
  validateWorkspaceVoiceState,
163
163
  voiceSettingsScopeToWire
164
- } from "./chunk-VLFX3L3X.js";
164
+ } from "./chunk-IBYULW65.js";
165
165
  import {
166
166
  PermissionRulesValidationError,
167
167
  buildPermissionSettings,
168
168
  isPermissionRuleType,
169
169
  normalizePermissionRules,
170
170
  readPermissionRuleSet
171
- } from "./chunk-DPH3MUAP.js";
171
+ } from "./chunk-KKDVZLGL.js";
172
172
  import {
173
173
  assertVoiceBaseUrlNetworkAllowed,
174
174
  isStreamingVoiceModel,
@@ -176,12 +176,12 @@ import {
176
176
  resolveVoiceTranscriptionConfig,
177
177
  sanitizeVoiceErrorMessage,
178
178
  transcribeVoiceAudio
179
- } from "./chunk-ACHMWGC5.js";
179
+ } from "./chunk-DQSDACD2.js";
180
180
  import {
181
181
  isVoiceEnabled,
182
182
  isVoiceMode,
183
183
  readVoiceModel
184
- } from "./chunk-LDUGDB5H.js";
184
+ } from "./chunk-C5VWPTGT.js";
185
185
  import "./chunk-AOHJKPKL.js";
186
186
  import "./chunk-Z4X5MTRT.js";
187
187
  import {
@@ -193,8 +193,8 @@ import {
193
193
  import {
194
194
  daemonObservedContactsPath,
195
195
  loadChannelsConfig
196
- } from "./chunk-JACAHYEN.js";
197
- import "./chunk-HY2INPTA.js";
196
+ } from "./chunk-E4ZBKMSF.js";
197
+ import "./chunk-QQWD7LZV.js";
198
198
  import "./chunk-57OAHC2Y.js";
199
199
  import {
200
200
  LIVE_HOST_BUNDLE_ID,
@@ -203,19 +203,19 @@ import {
203
203
  } from "./chunk-NKLP3DCK.js";
204
204
  import {
205
205
  createDaemonStatusProvider
206
- } from "./chunk-JSJTZ6GO.js";
206
+ } from "./chunk-VWMUDKLC.js";
207
207
  import "./chunk-VXZBKKQR.js";
208
- import "./chunk-26ISE5EG.js";
208
+ import "./chunk-3SE7J4DR.js";
209
209
  import "./chunk-3SH53ANB.js";
210
210
  import {
211
211
  snapshotProcessEnv
212
- } from "./chunk-TX3KSSDN.js";
212
+ } from "./chunk-S3Y3GBFD.js";
213
213
  import {
214
214
  SessionArtifactAuthorizationError,
215
215
  SessionArtifactValidationError,
216
216
  createAcpSessionBridge,
217
217
  parseSessionSource
218
- } from "./chunk-764F335K.js";
218
+ } from "./chunk-FYAXKJK7.js";
219
219
  import {
220
220
  EVENT_SCHEMA_VERSION,
221
221
  EventBus,
@@ -234,11 +234,11 @@ import "./chunk-FC4KQFCS.js";
234
234
  import "./chunk-T3CHYWJZ.js";
235
235
  import {
236
236
  parseChannelWebhookConfigLenient
237
- } from "./chunk-P74TZRXD.js";
237
+ } from "./chunk-QXVSWG66.js";
238
238
  import "./chunk-KJZ26VBX.js";
239
239
  import {
240
240
  supportedChannelCatalog
241
- } from "./chunk-VDS2WYM5.js";
241
+ } from "./chunk-NGYI5EF5.js";
242
242
  import "./chunk-V6WHFGST.js";
243
243
  import {
244
244
  MAX_REGISTERED_WORKSPACES,
@@ -247,8 +247,10 @@ import {
247
247
  WorkspaceRegistrationStoreLimitError,
248
248
  normalizeWorkspaceDisplayName,
249
249
  workspaceRegistrationId
250
- } from "./chunk-EZ53KMUN.js";
251
- import "./chunk-R574ATRM.js";
250
+ } from "./chunk-757GB46F.js";
251
+ import {
252
+ gradeActiveWorkCoverage
253
+ } from "./chunk-M2PNLYGY.js";
252
254
  import {
253
255
  BranchWhilePromptActiveError,
254
256
  CancelSentinelCollisionError,
@@ -323,7 +325,7 @@ import {
323
325
  getWritableScopes,
324
326
  loadSettings,
325
327
  validateSettingValue
326
- } from "./chunk-77WOUGCA.js";
328
+ } from "./chunk-OHKJVAKG.js";
327
329
  import "./chunk-RKUWKYED.js";
328
330
  import "./chunk-GOXKNSDZ.js";
329
331
  import "./chunk-IDS7MSUP.js";
@@ -332,15 +334,15 @@ import {
332
334
  detectSystemLanguage,
333
335
  resolveLanguageSetting,
334
336
  resolveSupportedLanguage
335
- } from "./chunk-TAOSTUHI.js";
336
- import "./chunk-KPMB4JEZ.js";
337
- import "./chunk-ALFTV7GA.js";
338
- import "./chunk-Z6W3XDLN.js";
337
+ } from "./chunk-PG62DFWD.js";
338
+ import "./chunk-B52AWKBB.js";
339
+ import "./chunk-UA5H3DS2.js";
340
+ import "./chunk-FN6YXJOP.js";
339
341
  import "./chunk-VJNBRRZG.js";
340
342
  import {
341
343
  getWorkspaceTrustStatus
342
- } from "./chunk-3ARO4N5G.js";
343
- import "./chunk-ALGGS7UH.js";
344
+ } from "./chunk-HA3SAB64.js";
345
+ import "./chunk-NPQ5ZKRP.js";
344
346
  import {
345
347
  isWithinRoot as isWithinRoot2
346
348
  } from "./chunk-MR3PXB6E.js";
@@ -419,7 +421,7 @@ import {
419
421
  writeWorkspaceContextFile,
420
422
  writeWorktreeSession,
421
423
  writeWorktreeSessionMarker
422
- } from "./chunk-BFSQBXHV.js";
424
+ } from "./chunk-GXSNGY5M.js";
423
425
  import "./chunk-GOFAQQZA.js";
424
426
  import "./chunk-5M6IDOMF.js";
425
427
  import "./chunk-TWPJO254.js";
@@ -432,7 +434,7 @@ import "./chunk-MVUQRLOH.js";
432
434
  import "./chunk-XCWO3SMQ.js";
433
435
  import "./chunk-7MH4J33A.js";
434
436
  import "./chunk-6PVPNMXU.js";
435
- import "./chunk-RGTB44BO.js";
437
+ import "./chunk-VXZ5HAOV.js";
436
438
  import {
437
439
  nextFireTime,
438
440
  parseCron
@@ -455,12 +457,12 @@ import "./chunk-J6SZID63.js";
455
457
  import "./chunk-KRXPRVGL.js";
456
458
  import "./chunk-GM463R2B.js";
457
459
  import "./chunk-SEZ556DZ.js";
458
- import "./chunk-CJXIIILK.js";
459
- import "./chunk-3K7FH2KQ.js";
460
+ import "./chunk-2FRY5CRX.js";
461
+ import "./chunk-67N6HB5H.js";
460
462
  import {
461
463
  APPROVAL_MODES
462
464
  } from "./chunk-WAUGQKUU.js";
463
- import "./chunk-REHWPCG2.js";
465
+ import "./chunk-PLFATELK.js";
464
466
  import {
465
467
  addDaemonRequestAttribute,
466
468
  captureDaemonTelemetryContext,
@@ -494,11 +496,12 @@ import {
494
496
  isDeviceAuthorizationSuccess,
495
497
  isDeviceTokenPending,
496
498
  isDeviceTokenSuccess
497
- } from "./chunk-22NBYCPD.js";
499
+ } from "./chunk-3P2LV43B.js";
498
500
  import "./chunk-NAVJD2PQ.js";
499
- import "./chunk-3ULCB3NE.js";
500
- import "./chunk-BGG4MBYD.js";
501
+ import "./chunk-HV76SFIA.js";
502
+ import "./chunk-4PYCZH2V.js";
501
503
  import "./chunk-P3QQPMQA.js";
504
+ import "./chunk-SR7RZ4MS.js";
502
505
  import "./chunk-M6HMMKVG.js";
503
506
  import "./chunk-DGEIYUC3.js";
504
507
  import "./chunk-MPHPFVKK.js";
@@ -518,13 +521,15 @@ import {
518
521
  isWithinRoot,
519
522
  parseLineTolerant,
520
523
  read
521
- } from "./chunk-XCG76UE6.js";
524
+ } from "./chunk-3PY4LPJF.js";
522
525
  import "./chunk-WOJZWRAZ.js";
523
526
  import "./chunk-VGC4I5JJ.js";
524
527
  import "./chunk-FVKHVJZQ.js";
528
+ import "./chunk-COBO5EBO.js";
525
529
  import "./chunk-6ZRFAKXK.js";
526
530
  import "./chunk-PYQADEFD.js";
527
- import "./chunk-P7HUJDBZ.js";
531
+ import "./chunk-M3STHEMM.js";
532
+ import "./chunk-F6WFNA7U.js";
528
533
  import "./chunk-46UV252V.js";
529
534
  import "./chunk-ZBVS26BY.js";
530
535
  import "./chunk-KKBPOU75.js";
@@ -537,6 +542,7 @@ import {
537
542
  FatalConfigError,
538
543
  Storage,
539
544
  createDebugLogger,
545
+ getErrorMessage,
540
546
  runWithoutDebugLogSession
541
547
  } from "./chunk-OIVKILPI.js";
542
548
  import "./chunk-VOQXFAY5.js";
@@ -565,7 +571,7 @@ import {
565
571
 
566
572
  // packages/cli/src/serve/server.ts
567
573
  init_esbuild_shims();
568
- var import_express4 = __toESM(require_express(), 1);
574
+ var import_express5 = __toESM(require_express(), 1);
569
575
 
570
576
  // packages/cli/src/serve/acp-http/index.ts
571
577
  init_esbuild_shims();
@@ -1182,11 +1188,11 @@ function decodeTextCursor(cursor) {
1182
1188
  return { off, size, dev, ino };
1183
1189
  }
1184
1190
  __name(decodeTextCursor, "decodeTextCursor");
1185
- function assertCursorMatchesFile(cursor, stats, path14) {
1191
+ function assertCursorMatchesFile(cursor, stats, path15) {
1186
1192
  if (String(stats.dev) !== cursor.dev || String(stats.ino) !== cursor.ino || stats.size < cursor.size) {
1187
1193
  throw new FsError(
1188
1194
  "hash_mismatch",
1189
- `cursor no longer matches the file it was issued for: ${path14}`,
1195
+ `cursor no longer matches the file it was issued for: ${path15}`,
1190
1196
  { hint: "re-read the file from the beginning to get a fresh cursor" }
1191
1197
  );
1192
1198
  }
@@ -1948,17 +1954,17 @@ var WorkspaceFileSystemImpl = class {
1948
1954
  if (err instanceof Error && "code" in err && err.code === "workspace_generation_closed") {
1949
1955
  return err;
1950
1956
  }
1951
- const fs7 = wrapAsFsError(err);
1957
+ const fs8 = wrapAsFsError(err);
1952
1958
  this.deps.audit.recordDenied(this.deps.ctx, {
1953
1959
  intent,
1954
1960
  input,
1955
- errorKind: fs7.kind,
1956
- hint: fs7.hint,
1961
+ errorKind: fs8.kind,
1962
+ hint: fs8.hint,
1957
1963
  // Quote the underlying OS / FsError message so audit
1958
1964
  // consumers debugging a production incident can see the
1959
1965
  // actual cause (errno text, byte counts, glob pattern,
1960
1966
  // etc.) rather than just `errorKind` + `hint`.
1961
- message: fs7.message,
1967
+ message: fs8.message,
1962
1968
  // For glob denials (parse_error pattern rejection,
1963
1969
  // catastrophic walk failures) the input IS the pattern
1964
1970
  // already; surfacing it on the dedicated `pattern` field
@@ -1967,7 +1973,7 @@ var WorkspaceFileSystemImpl = class {
1967
1973
  // branching on intent.
1968
1974
  pattern: intent === "glob" ? input : void 0
1969
1975
  });
1970
- return fs7;
1976
+ return fs8;
1971
1977
  }
1972
1978
  };
1973
1979
  var CONTENT_HASH_RE = /^sha256:[0-9a-f]{64}$/;
@@ -3043,12 +3049,12 @@ function sendFsError(res, err, route) {
3043
3049
  applyReadHeaders(res);
3044
3050
  if (sendGenerationClosedError(res, err)) return;
3045
3051
  if (isFsError(err)) {
3046
- const fs7 = err;
3047
- res.status(fs7.status).json({
3048
- errorKind: fs7.kind,
3049
- error: fs7.message,
3050
- hint: fs7.hint,
3051
- status: fs7.status
3052
+ const fs8 = err;
3053
+ res.status(fs8.status).json({
3054
+ errorKind: fs8.kind,
3055
+ error: fs8.message,
3056
+ hint: fs8.hint,
3057
+ status: fs8.status
3052
3058
  });
3053
3059
  return;
3054
3060
  }
@@ -3161,13 +3167,13 @@ async function handleGetFile(req, res, deps) {
3161
3167
  return;
3162
3168
  }
3163
3169
  const cursor = rawCursor;
3164
- const fs7 = factory.forRequest({
3170
+ const fs8 = factory.forRequest({
3165
3171
  originatorClientId: clientId ?? void 0,
3166
3172
  route: ROUTE2
3167
3173
  });
3168
3174
  try {
3169
- const resolved = await fs7.resolve(queryPath, "read");
3170
- const out = await fs7.readText(resolved, {
3175
+ const resolved = await fs8.resolve(queryPath, "read");
3176
+ const out = await fs8.readText(resolved, {
3171
3177
  maxBytes,
3172
3178
  line,
3173
3179
  limit,
@@ -3228,13 +3234,13 @@ async function handleGetFileBytes(req, res, deps) {
3228
3234
  });
3229
3235
  return;
3230
3236
  }
3231
- const fs7 = factory.forRequest({
3237
+ const fs8 = factory.forRequest({
3232
3238
  originatorClientId: clientId ?? void 0,
3233
3239
  route: ROUTE2
3234
3240
  });
3235
3241
  try {
3236
- const resolved = await fs7.resolve(queryPath, "read");
3237
- const out = await fs7.readBytesWindow(resolved, {
3242
+ const resolved = await fs8.resolve(queryPath, "read");
3243
+ const out = await fs8.readBytesWindow(resolved, {
3238
3244
  offset: offset ?? 0,
3239
3245
  maxBytes: maxBytes ?? DEFAULT_FILE_BYTES_MAX_BYTES
3240
3246
  });
@@ -3262,13 +3268,13 @@ async function handleGetStat(req, res, deps) {
3262
3268
  if (clientId === null) return;
3263
3269
  const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
3264
3270
  if (queryPath === null) return;
3265
- const fs7 = factory.forRequest({
3271
+ const fs8 = factory.forRequest({
3266
3272
  originatorClientId: clientId ?? void 0,
3267
3273
  route: ROUTE2
3268
3274
  });
3269
3275
  try {
3270
- const resolved = await fs7.resolve(queryPath, "stat");
3271
- const st = await fs7.stat(resolved);
3276
+ const resolved = await fs8.resolve(queryPath, "stat");
3277
+ const st = await fs8.stat(resolved);
3272
3278
  applyReadHeaders(res);
3273
3279
  res.status(200).json({
3274
3280
  kind: "stat",
@@ -3291,13 +3297,13 @@ async function handleGetList(req, res, deps) {
3291
3297
  const queryPath = requireStringQuery(res, req.query["path"], "path", ROUTE2);
3292
3298
  if (queryPath === null) return;
3293
3299
  const includeIgnored = parseBoolFlag(req.query["includeIgnored"]);
3294
- const fs7 = factory.forRequest({
3300
+ const fs8 = factory.forRequest({
3295
3301
  originatorClientId: clientId ?? void 0,
3296
3302
  route: ROUTE2
3297
3303
  });
3298
3304
  try {
3299
- const resolved = await fs7.resolve(queryPath, "list");
3300
- const entries = await fs7.list(resolved, {
3305
+ const resolved = await fs8.resolve(queryPath, "list");
3306
+ const entries = await fs8.list(resolved, {
3301
3307
  includeIgnored,
3302
3308
  maxEntries: MAX_LIST_ENTRIES + 1
3303
3309
  });
@@ -3350,15 +3356,15 @@ async function handleGetGlob(req, res, deps) {
3350
3356
  }
3351
3357
  const cwdRaw = req.query["cwd"];
3352
3358
  const cwdString = typeof cwdRaw === "string" && cwdRaw.length > 0 ? cwdRaw : void 0;
3353
- const fs7 = factory.forRequest({
3359
+ const fs8 = factory.forRequest({
3354
3360
  originatorClientId: clientId ?? void 0,
3355
3361
  route: ROUTE2
3356
3362
  });
3357
3363
  const start = performance.now();
3358
3364
  try {
3359
- const cwdResolved = cwdString ? await fs7.resolve(cwdString, "list") : void 0;
3365
+ const cwdResolved = cwdString ? await fs8.resolve(cwdString, "list") : void 0;
3360
3366
  const cap = maxResults ?? DEFAULT_GLOB_MAX_RESULTS;
3361
- const probe = await fs7.glob(pattern, {
3367
+ const probe = await fs8.glob(pattern, {
3362
3368
  cwd: cwdResolved,
3363
3369
  includeIgnored,
3364
3370
  maxResults: cap + 1
@@ -3546,7 +3552,7 @@ function validateClientId(clientId, deps, res) {
3546
3552
  }
3547
3553
  __name(validateClientId, "validateClientId");
3548
3554
  function createSetupGithubFileOps(factory, route, originatorClientId, assertGenerationOpen) {
3549
- const fs7 = factory.forRequest({
3555
+ const fs8 = factory.forRequest({
3550
3556
  route,
3551
3557
  ...originatorClientId ? { originatorClientId } : {}
3552
3558
  });
@@ -3574,14 +3580,14 @@ function createSetupGithubFileOps(factory, route, originatorClientId, assertGene
3574
3580
  );
3575
3581
  },
3576
3582
  async writeTextFile(_gitRepoRoot, relativePath, content) {
3577
- const resolved = await fs7.resolve(relativePath, "write");
3578
- const out = await fs7.writeTextOverwrite(resolved, content);
3583
+ const resolved = await fs8.resolve(relativePath, "write");
3584
+ const out = await fs8.writeTextOverwrite(resolved, content);
3579
3585
  return { sizeBytes: out.sizeBytes };
3580
3586
  },
3581
3587
  async readTextFile(_gitRepoRoot, relativePath) {
3582
3588
  try {
3583
- const resolved = await fs7.resolve(relativePath, "read");
3584
- const out = await fs7.readText(resolved);
3589
+ const resolved = await fs8.resolve(relativePath, "read");
3590
+ const out = await fs8.readText(resolved);
3585
3591
  return out.content;
3586
3592
  } catch (error2) {
3587
3593
  if (isFsError(error2) && error2.kind === "path_not_found") {
@@ -10793,7 +10799,7 @@ var AcpDispatcher = class {
10793
10799
  );
10794
10800
  return;
10795
10801
  }
10796
- const fs7 = this.fsFactory.forRequest({
10802
+ const fs8 = this.fsFactory.forRequest({
10797
10803
  originatorClientId: conn.clientId,
10798
10804
  route: `ACP ${method}`
10799
10805
  });
@@ -10858,8 +10864,8 @@ var AcpDispatcher = class {
10858
10864
  return;
10859
10865
  }
10860
10866
  const cursor = rawCursor;
10861
- const resolved = await fs7.resolve(p, "read");
10862
- const out = await fs7.readText(resolved, {
10867
+ const resolved = await fs8.resolve(p, "read");
10868
+ const out = await fs8.readText(resolved, {
10863
10869
  maxBytes,
10864
10870
  line,
10865
10871
  limit,
@@ -10886,7 +10892,7 @@ var AcpDispatcher = class {
10886
10892
  conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
10887
10893
  return;
10888
10894
  }
10889
- const fs7 = this.fsFactory.forRequest({
10895
+ const fs8 = this.fsFactory.forRequest({
10890
10896
  originatorClientId: conn.clientId,
10891
10897
  route: `ACP ${method}`
10892
10898
  });
@@ -10922,8 +10928,8 @@ var AcpDispatcher = class {
10922
10928
  );
10923
10929
  return;
10924
10930
  }
10925
- const resolved = await fs7.resolve(p, "read");
10926
- const buf = await fs7.readBytesWindow(resolved, { offset, maxBytes });
10931
+ const resolved = await fs8.resolve(p, "read");
10932
+ const buf = await fs8.readBytesWindow(resolved, { offset, maxBytes });
10927
10933
  this.replyConn(conn, id, { path: p, ...buf });
10928
10934
  return;
10929
10935
  }
@@ -10941,12 +10947,12 @@ var AcpDispatcher = class {
10941
10947
  conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
10942
10948
  return;
10943
10949
  }
10944
- const fs7 = this.fsFactory.forRequest({
10950
+ const fs8 = this.fsFactory.forRequest({
10945
10951
  originatorClientId: conn.clientId,
10946
10952
  route: `ACP ${method}`
10947
10953
  });
10948
- const resolved = await fs7.resolve(p, "read");
10949
- const result = await fs7.stat(resolved);
10954
+ const resolved = await fs8.resolve(p, "read");
10955
+ const result = await fs8.stat(resolved);
10950
10956
  this.replyConn(conn, id, { path: p, ...result });
10951
10957
  return;
10952
10958
  }
@@ -10964,13 +10970,13 @@ var AcpDispatcher = class {
10964
10970
  conn.sendConn(error(id, RPC.INVALID_PARAMS, "`path` required"));
10965
10971
  return;
10966
10972
  }
10967
- const fs7 = this.fsFactory.forRequest({
10973
+ const fs8 = this.fsFactory.forRequest({
10968
10974
  originatorClientId: conn.clientId,
10969
10975
  route: `ACP ${method}`
10970
10976
  });
10971
- const resolved = await fs7.resolve(p, "read");
10977
+ const resolved = await fs8.resolve(p, "read");
10972
10978
  const MAX_LIST = 2e3;
10973
- const entries = await fs7.list(resolved, { maxEntries: MAX_LIST + 1 });
10979
+ const entries = await fs8.list(resolved, { maxEntries: MAX_LIST + 1 });
10974
10980
  const truncated = entries.length > MAX_LIST;
10975
10981
  this.replyConn(conn, id, {
10976
10982
  path: p,
@@ -10995,7 +11001,7 @@ var AcpDispatcher = class {
10995
11001
  );
10996
11002
  return;
10997
11003
  }
10998
- const fs7 = this.fsFactory.forRequest({
11004
+ const fs8 = this.fsFactory.forRequest({
10999
11005
  originatorClientId: conn.clientId,
11000
11006
  route: `ACP ${method}`
11001
11007
  });
@@ -11015,7 +11021,7 @@ var AcpDispatcher = class {
11015
11021
  );
11016
11022
  return;
11017
11023
  }
11018
- const matches = await fs7.glob(pattern, {
11024
+ const matches = await fs8.glob(pattern, {
11019
11025
  maxResults: maxResults + 1
11020
11026
  });
11021
11027
  const truncated = matches.length > maxResults;
@@ -11047,11 +11053,11 @@ var AcpDispatcher = class {
11047
11053
  );
11048
11054
  return;
11049
11055
  }
11050
- const fs7 = this.fsFactory.forRequest({
11056
+ const fs8 = this.fsFactory.forRequest({
11051
11057
  originatorClientId: conn.clientId,
11052
11058
  route: `ACP ${method}`
11053
11059
  });
11054
- const resolved = await fs7.resolve(p, "write");
11060
+ const resolved = await fs8.resolve(p, "write");
11055
11061
  if (Buffer.byteLength(params["content"], "utf8") > 10 * 1024 * 1024) {
11056
11062
  if (id !== void 0)
11057
11063
  conn.sendConn(
@@ -11059,7 +11065,7 @@ var AcpDispatcher = class {
11059
11065
  );
11060
11066
  return;
11061
11067
  }
11062
- await fs7.writeTextOverwrite(resolved, params["content"]);
11068
+ await fs8.writeTextOverwrite(resolved, params["content"]);
11063
11069
  assertGenerationOpen?.();
11064
11070
  this.replyConn(conn, id, { ok: true, path: p });
11065
11071
  return;
@@ -11089,12 +11095,12 @@ var AcpDispatcher = class {
11089
11095
  );
11090
11096
  return;
11091
11097
  }
11092
- const fs7 = this.fsFactory.forRequest({
11098
+ const fs8 = this.fsFactory.forRequest({
11093
11099
  originatorClientId: conn.clientId,
11094
11100
  route: `ACP ${method}`
11095
11101
  });
11096
- const resolved = await fs7.resolve(p, "write");
11097
- const result = await fs7.edit(
11102
+ const resolved = await fs8.resolve(p, "write");
11103
+ const result = await fs8.edit(
11098
11104
  resolved,
11099
11105
  params["oldText"],
11100
11106
  params["newText"]
@@ -13937,7 +13943,7 @@ function mountAcpHttp(app, bridge, opts) {
13937
13943
  if (!enabled) return void 0;
13938
13944
  const daemonEnv = opts.daemonEnv ?? process.env;
13939
13945
  const getPrimaryEnv = /* @__PURE__ */ __name(() => opts.workspaceRegistry ? runtimeEffectiveEnv(opts.workspaceRegistry.primary, daemonEnv) : daemonEnv, "getPrimaryEnv");
13940
- const path14 = opts.path ?? "/acp";
13946
+ const path15 = opts.path ?? "/acp";
13941
13947
  const dispatcherRef = {};
13942
13948
  let disposed = false;
13943
13949
  const rejectIfDisposed = /* @__PURE__ */ __name((res) => {
@@ -14109,7 +14115,7 @@ function mountAcpHttp(app, bridge, opts) {
14109
14115
  const primaryMount = {
14110
14116
  primary: true,
14111
14117
  workspaceCwd: opts.boundWorkspace,
14112
- routeLabel: logSafe(path14),
14118
+ routeLabel: logSafe(path15),
14113
14119
  rateLimitScope: opts.workspaceRegistry?.primary.workspaceId ?? "primary",
14114
14120
  registry,
14115
14121
  dispatcher,
@@ -14263,7 +14269,7 @@ function mountAcpHttp(app, bridge, opts) {
14263
14269
  });
14264
14270
  }, "handleAcpPost");
14265
14271
  app.post(
14266
- path14,
14272
+ path15,
14267
14273
  (req, res) => handleAcpPost(primaryMount, req, res)
14268
14274
  );
14269
14275
  const handleAcpGet = /* @__PURE__ */ __name((mount, req, res) => {
@@ -14361,10 +14367,10 @@ function mountAcpHttp(app, bridge, opts) {
14361
14367
  onPumpSettled();
14362
14368
  });
14363
14369
  }, "handleAcpGet");
14364
- app.get(path14, (req, res) => {
14370
+ app.get(path15, (req, res) => {
14365
14371
  handleAcpGet(primaryMount, req, res);
14366
14372
  });
14367
- app.delete(path14, (req, res) => {
14373
+ app.delete(path15, (req, res) => {
14368
14374
  handleAcpDelete(primaryMount, req, res);
14369
14375
  });
14370
14376
  const createSecondaryAcpMount = /* @__PURE__ */ __name((rt) => {
@@ -14566,7 +14572,7 @@ function mountAcpHttp(app, bridge, opts) {
14566
14572
  const isPluralAcpShape = pluralRawSelector !== null;
14567
14573
  const pluralVoiceRawSelector = opts.workspaceVoiceConnection ? pluralWorkspaceRawSelector(rawPath, PLURAL_VOICE_WS_SUFFIX) : null;
14568
14574
  const isPluralVoiceShape = pluralVoiceRawSelector !== null;
14569
- if (rawPath !== path14 && !isCdpPath && !extraRoute && !isPluralAcpShape && !isPluralVoiceShape) {
14575
+ if (rawPath !== path15 && !isCdpPath && !extraRoute && !isPluralAcpShape && !isPluralVoiceShape) {
14570
14576
  logReject(`unknown-path ${logSafe(rawPath)}`);
14571
14577
  socket.destroy();
14572
14578
  return;
@@ -15103,7 +15109,7 @@ function mountAcpHttp(app, bridge, opts) {
15103
15109
  });
15104
15110
  }, "upgradeListener");
15105
15111
  httpServer.on("upgrade", upgradeListener);
15106
- writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${path14}`);
15112
+ writeStderrLine(`qwen serve: /acp WebSocket transport enabled on ${path15}`);
15107
15113
  }
15108
15114
  __name(setupWebSocket, "setupWebSocket");
15109
15115
  return {
@@ -16628,19 +16634,32 @@ function createHealthDemoRoutes(deps) {
16628
16634
  let sessions = 0;
16629
16635
  let pendingPermissions = 0;
16630
16636
  let activePrompts = 0;
16637
+ let activeWork = false;
16631
16638
  let channelAlive = false;
16632
16639
  let lastActivity = null;
16640
+ let coveredSessions = 0;
16641
+ let sessionsOnNegotiatedChannel = 0;
16642
+ let oldestReportAt = null;
16633
16643
  for (const runtime of runtimes) {
16634
16644
  failedWorkspaceId = runtime.workspaceId;
16635
16645
  const bridge = runtime.bridge;
16636
16646
  const runtimeSessions = bridge.sessionCount;
16637
16647
  const runtimePendingPermissions = bridge.pendingPermissionCount;
16638
16648
  const runtimeActivePrompts = bridge.activePromptCount;
16649
+ const runtimeActiveWork = bridge.activeWork;
16650
+ const runtimeCoverage = bridge.activeWorkCoverage;
16651
+ const runtimeOldestReportAt = runtimeCoverage.oldestCoveredReportAt;
16639
16652
  const runtimeChannelAlive = bridge.isChannelLive();
16640
16653
  const runtimeLastActivity = bridge.lastActivityAt;
16641
16654
  sessions += runtimeSessions;
16642
16655
  pendingPermissions += runtimePendingPermissions;
16643
16656
  activePrompts += runtimeActivePrompts;
16657
+ activeWork = activeWork || runtimeActiveWork;
16658
+ coveredSessions += runtimeCoverage.covered;
16659
+ sessionsOnNegotiatedChannel += runtimeCoverage.onNegotiatedChannel;
16660
+ if (runtimeOldestReportAt !== null && (oldestReportAt === null || runtimeOldestReportAt < oldestReportAt)) {
16661
+ oldestReportAt = runtimeOldestReportAt;
16662
+ }
16644
16663
  channelAlive = channelAlive || runtimeChannelAlive;
16645
16664
  if (runtimeLastActivity !== null && (lastActivity === null || runtimeLastActivity > lastActivity)) {
16646
16665
  lastActivity = runtimeLastActivity;
@@ -16655,6 +16674,17 @@ function createHealthDemoRoutes(deps) {
16655
16674
  sessions,
16656
16675
  pendingPermissions,
16657
16676
  activePrompts,
16677
+ activeWork,
16678
+ activeWorkReporting: gradeActiveWorkCoverage({
16679
+ total: sessions,
16680
+ covered: coveredSessions,
16681
+ onNegotiatedChannel: sessionsOnNegotiatedChannel
16682
+ }),
16683
+ // 0 rather than null when nothing is covered: an idle daemon with no
16684
+ // sessions must not read as infinitely stale to a controller applying
16685
+ // its own freshness floor. `oldestReportAt` is the oldest *covered*
16686
+ // report, so this never disagrees with the grade above.
16687
+ activeWorkStaleMs: oldestReportAt === null ? 0 : now - oldestReportAt,
16658
16688
  connectedClients: getActiveSseCount2(),
16659
16689
  channelAlive,
16660
16690
  lastActivityAt: lastActivity !== null ? new Date(lastActivity).toISOString() : null,
@@ -17180,6 +17210,10 @@ __name(registerWorkspaceAuthRoutes, "registerWorkspaceAuthRoutes");
17180
17210
  // packages/cli/src/serve/routes/workspace-extensions.ts
17181
17211
  init_esbuild_shims();
17182
17212
  import * as crypto2 from "node:crypto";
17213
+ import * as fs4 from "node:fs/promises";
17214
+ import * as os from "node:os";
17215
+ import * as path9 from "node:path";
17216
+ var import_express2 = __toESM(require_express(), 1);
17183
17217
 
17184
17218
  // packages/cli/src/serve/extension-operation-scheduler.ts
17185
17219
  init_esbuild_shims();
@@ -17261,6 +17295,7 @@ var MAX_UNFINISHED_EXTENSION_OPERATIONS = 10;
17261
17295
  var sanitizeDaemonMessage = /* @__PURE__ */ __name((message) => redactUrlCredentials(stripAnsiAndControl(message)), "sanitizeDaemonMessage");
17262
17296
  var redactExtensionDisplaySource = /* @__PURE__ */ __name((source) => {
17263
17297
  const redacted = redactUrlCredentials(source);
17298
+ if (redacted.startsWith("upload:")) return redacted;
17264
17299
  if (/^[A-Za-z]:[\\/]/.test(redacted)) return redacted;
17265
17300
  try {
17266
17301
  const url = new URL(redacted);
@@ -17950,6 +17985,39 @@ var EXTENSION_PREPARE_DEADLINE_MS = 10 * 6e4;
17950
17985
  var EXTENSION_INTERACTION_DEADLINE_MS = 10 * 6e4;
17951
17986
  var EXTENSION_INTERACTIVE_PREPARE_DEADLINE_MS = EXTENSION_PREPARE_DEADLINE_MS + EXTENSION_INTERACTION_DEADLINE_MS;
17952
17987
  var EXTENSION_UPDATE_CHECK_DEADLINE_MS = 2 * 6e4;
17988
+ var EXTENSION_ARCHIVE_UPLOAD_LIMIT = "10mb";
17989
+ var extensionArchiveBodyParser = import_express2.default.raw({
17990
+ type: "application/octet-stream",
17991
+ limit: EXTENSION_ARCHIVE_UPLOAD_LIMIT
17992
+ });
17993
+ var parseExtensionArchiveFilename = /* @__PURE__ */ __name((value) => {
17994
+ const invalidCharacter = typeof value === "string" && Array.from(value).some((character) => {
17995
+ const code = character.charCodeAt(0);
17996
+ return character === "/" || character === "\\" || code < 32 || code === 127;
17997
+ });
17998
+ if (typeof value !== "string" || value.length === 0 || Buffer.byteLength(value, "utf8") > 255 || invalidCharacter) {
17999
+ return null;
18000
+ }
18001
+ const lower = value.toLowerCase();
18002
+ if (lower.endsWith(".tar.gz")) return { filename: value, suffix: ".tar.gz" };
18003
+ if (lower.endsWith(".zip")) return { filename: value, suffix: ".zip" };
18004
+ return null;
18005
+ }, "parseExtensionArchiveFilename");
18006
+ var extensionArchiveUploadMetadata = /* @__PURE__ */ __name((req, res, next) => {
18007
+ if (req.query["consent"] !== "true") {
18008
+ res.status(400).json({
18009
+ error: "Extension installation requires explicit consent"
18010
+ });
18011
+ return;
18012
+ }
18013
+ if (!parseExtensionArchiveFilename(req.query["filename"])) {
18014
+ res.status(400).json({
18015
+ error: "`filename` must name a .zip or .tar.gz archive"
18016
+ });
18017
+ return;
18018
+ }
18019
+ next();
18020
+ }, "extensionArchiveUploadMetadata");
17953
18021
  var parseExtensionScope = /* @__PURE__ */ __name((body, res) => {
17954
18022
  const scope = body["scope"];
17955
18023
  if (scope !== "user" && scope !== "workspace") {
@@ -18391,6 +18459,127 @@ function registerWorkspaceExtensionRoutes(app, deps) {
18391
18459
  }
18392
18460
  }
18393
18461
  );
18462
+ app.post(
18463
+ `${base}/install-archive`,
18464
+ mutate({ strict: true }),
18465
+ extensionArchiveUploadMetadata,
18466
+ extensionArchiveBodyParser,
18467
+ async (req, res) => {
18468
+ const ctrl = resolve5(req, res, true);
18469
+ if (!ctrl) return;
18470
+ try {
18471
+ if (!ctrl.validateExtensionMutationClient(req, res, {
18472
+ requireClientId: false
18473
+ })) {
18474
+ return;
18475
+ }
18476
+ const archiveName = parseExtensionArchiveFilename(
18477
+ req.query["filename"]
18478
+ );
18479
+ if (!req.is("application/octet-stream")) {
18480
+ res.status(415).json({
18481
+ error: "Extension archive uploads require application/octet-stream"
18482
+ });
18483
+ return;
18484
+ }
18485
+ if (!Buffer.isBuffer(req.body) || req.body.length === 0) {
18486
+ res.status(400).json({ error: "Extension archive is empty" });
18487
+ return;
18488
+ }
18489
+ let archive = req.body;
18490
+ const source = `upload:v1:${crypto2.randomUUID()}:${archiveName.filename}`;
18491
+ ctrl.runQueuedExtensionMutation(
18492
+ "install",
18493
+ { source },
18494
+ res,
18495
+ async (extensionManager, _signal, context, operationId) => {
18496
+ let uploadDir;
18497
+ const sanitizeUploadError = /* @__PURE__ */ __name((error2) => {
18498
+ const sanitized = new Error(
18499
+ uploadDir ? getErrorMessage(error2).replaceAll(
18500
+ uploadDir,
18501
+ "<extension-upload-dir>"
18502
+ ) : "Could not create the temporary extension upload directory"
18503
+ );
18504
+ const code = typeof error2 === "object" && error2 !== null && "code" in error2 && typeof error2.code === "string" ? error2.code : void 0;
18505
+ if (code) Object.assign(sanitized, { code });
18506
+ return sanitized;
18507
+ }, "sanitizeUploadError");
18508
+ let result;
18509
+ let failure;
18510
+ try {
18511
+ uploadDir = await fs4.mkdtemp(
18512
+ path9.join(os.tmpdir(), "qwen-extension-upload-")
18513
+ );
18514
+ const archivePath = path9.join(
18515
+ uploadDir,
18516
+ `extension${archiveName.suffix}`
18517
+ );
18518
+ await fs4.writeFile(archivePath, archive);
18519
+ archive = void 0;
18520
+ const prepared = await context.prepare(async (signal) => {
18521
+ supersedeActiveInstallOperations(ctrl, operationId);
18522
+ return await extensionManager.prepareExtensionInstall({
18523
+ installMetadata: { type: "local", source },
18524
+ localSourcePath: archivePath,
18525
+ initialActivation: { scope: "user" },
18526
+ requestConsent: /* @__PURE__ */ __name(() => Promise.resolve(), "requestConsent"),
18527
+ signal
18528
+ });
18529
+ });
18530
+ try {
18531
+ const committed = await context.commit(
18532
+ async (onCommitted) => await extensionManager.commitPreparedExtension(
18533
+ prepared,
18534
+ onCommitted
18535
+ )
18536
+ );
18537
+ result = {
18538
+ status: "installed",
18539
+ source,
18540
+ name: committed.identity.name,
18541
+ version: committed.version
18542
+ };
18543
+ } finally {
18544
+ await extensionManager.disposePreparedExtension(prepared);
18545
+ }
18546
+ } catch (error2) {
18547
+ failure = sanitizeUploadError(error2);
18548
+ }
18549
+ if (uploadDir) {
18550
+ try {
18551
+ await fs4.rm(uploadDir, { recursive: true, force: true });
18552
+ } catch (error2) {
18553
+ failure ??= sanitizeUploadError(error2);
18554
+ }
18555
+ }
18556
+ if (failure) throw failure;
18557
+ return result;
18558
+ },
18559
+ {
18560
+ createManager: /* @__PURE__ */ __name((operationId) => ctrl.createExtensionManager(
18561
+ void 0,
18562
+ void 0,
18563
+ extensionInteractionHandlers(ctrl, operationId)
18564
+ ), "createManager"),
18565
+ onSettled: /* @__PURE__ */ __name((operationId) => {
18566
+ supersededInstallOperations.delete(operationId);
18567
+ cancelPendingExtensionInteraction(
18568
+ operationId,
18569
+ "Extension operation ended"
18570
+ );
18571
+ }, "onSettled"),
18572
+ deadlineMs: EXTENSION_INTERACTIVE_PREPARE_DEADLINE_MS,
18573
+ ...globalReconciliationOptions()
18574
+ }
18575
+ );
18576
+ } catch (err) {
18577
+ sendBridgeError2(res, err, {
18578
+ route: `POST ${base}/install-archive`
18579
+ });
18580
+ }
18581
+ }
18582
+ );
18394
18583
  app.post(`${base}/install`, mutate({ strict: true }), async (req, res) => {
18395
18584
  const ctrl = resolve5(req, res, true);
18396
18585
  if (!ctrl) return;
@@ -19624,13 +19813,13 @@ async function handlePostFileWrite(req, res, deps) {
19624
19813
  req
19625
19814
  );
19626
19815
  if (originatorClientId === null) return;
19627
- const fs7 = factory.forRequest({
19816
+ const fs8 = factory.forRequest({
19628
19817
  originatorClientId,
19629
19818
  route: ROUTE2
19630
19819
  });
19631
19820
  try {
19632
- const resolved = await fs7.resolve(queryPath, "write");
19633
- const out = await fs7.writeTextAtomic(resolved, content, {
19821
+ const resolved = await fs8.resolve(queryPath, "write");
19822
+ const out = await fs8.writeTextAtomic(resolved, content, {
19634
19823
  mode,
19635
19824
  ...expectedHash ? { expectedHash } : {},
19636
19825
  ...bom !== void 0 ? { bom } : {},
@@ -19683,13 +19872,13 @@ async function handlePostFileEdit(req, res, deps) {
19683
19872
  req
19684
19873
  );
19685
19874
  if (originatorClientId === null) return;
19686
- const fs7 = factory.forRequest({
19875
+ const fs8 = factory.forRequest({
19687
19876
  originatorClientId,
19688
19877
  route: ROUTE2
19689
19878
  });
19690
19879
  try {
19691
- const resolved = await fs7.resolve(queryPath, "edit");
19692
- const out = await fs7.editAtomic(resolved, oldText, newText, {
19880
+ const resolved = await fs8.resolve(queryPath, "edit");
19881
+ const out = await fs8.editAtomic(resolved, oldText, newText, {
19693
19882
  expectedHash
19694
19883
  });
19695
19884
  applyReadHeaders(res);
@@ -20340,8 +20529,8 @@ function decodePathSegment(value) {
20340
20529
  }
20341
20530
  __name(decodePathSegment, "decodePathSegment");
20342
20531
  function matchLegacySessionTelemetryRoute(method, requestPath) {
20343
- const path14 = requestPath.length > 1 && requestPath.endsWith("/") ? requestPath.slice(0, -1) : requestPath;
20344
- const requestSegments = path14.split("/").slice(1);
20532
+ const path15 = requestPath.length > 1 && requestPath.endsWith("/") ? requestPath.slice(0, -1) : requestPath;
20533
+ const requestSegments = path15.split("/").slice(1);
20345
20534
  const prefix = requestSegments[0]?.toLowerCase();
20346
20535
  if (prefix !== "session" && prefix !== "sessions" && prefix !== "permission") {
20347
20536
  return void 0;
@@ -20393,23 +20582,23 @@ __name(setDaemonTelemetryWorkspace, "setDaemonTelemetryWorkspace");
20393
20582
  function resolveDaemonTelemetryRoute(req) {
20394
20583
  const legacyRoute = matchLegacySessionTelemetryRoute(req.method, req.path);
20395
20584
  if (legacyRoute) return legacyRoute;
20396
- const path14 = req.path.replace(/\/$/, "") || "/";
20397
- if (req.method === "GET" && path14 === "/daemon/status") {
20585
+ const path15 = req.path.replace(/\/$/, "") || "/";
20586
+ if (req.method === "GET" && path15 === "/daemon/status") {
20398
20587
  return { route: "GET /daemon/status" };
20399
20588
  }
20400
- if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(path14)) {
20589
+ if (req.method === "GET" && /^\/workspace\/[^/]+\/sessions$/.test(path15)) {
20401
20590
  return { route: "GET /workspace/:id/sessions" };
20402
20591
  }
20403
- if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(path14)) {
20592
+ if (req.method === "GET" && /^\/workspaces\/[^/]+\/sessions$/.test(path15)) {
20404
20593
  return { route: "GET /workspace/:id/sessions" };
20405
20594
  }
20406
- if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(path14)) {
20595
+ if (req.method === "GET" && /^\/workspace\/[^/]+\/session-info$/.test(path15)) {
20407
20596
  return { route: "GET /workspace/:id/session-info" };
20408
20597
  }
20409
- if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(path14)) {
20598
+ if (req.method === "GET" && /^\/workspaces\/[^/]+\/session-info$/.test(path15)) {
20410
20599
  return { route: "GET /workspace/:id/session-info" };
20411
20600
  }
20412
- const workspaceTranscript = path14.match(
20601
+ const workspaceTranscript = path15.match(
20413
20602
  /^\/workspaces\/[^/]+\/session\/([^/]+)\/transcript$/
20414
20603
  );
20415
20604
  if (workspaceTranscript?.[1] && req.method === "GET") {
@@ -20418,7 +20607,7 @@ function resolveDaemonTelemetryRoute(req) {
20418
20607
  sessionId: decodePathSegment(workspaceTranscript[1])
20419
20608
  };
20420
20609
  }
20421
- const workspaceExport = path14.match(
20610
+ const workspaceExport = path15.match(
20422
20611
  /^\/workspaces\/[^/]+\/session\/([^/]+)\/export$/
20423
20612
  );
20424
20613
  if (workspaceExport?.[1] && req.method === "GET") {
@@ -20427,7 +20616,7 @@ function resolveDaemonTelemetryRoute(req) {
20427
20616
  sessionId: decodePathSegment(workspaceExport[1])
20428
20617
  };
20429
20618
  }
20430
- const workspaceArchivedExport = path14.match(
20619
+ const workspaceArchivedExport = path15.match(
20431
20620
  /^\/workspaces\/[^/]+\/session\/([^/]+)\/archive\/export$/
20432
20621
  );
20433
20622
  if (workspaceArchivedExport?.[1] && req.method === "GET") {
@@ -20437,8 +20626,8 @@ function resolveDaemonTelemetryRoute(req) {
20437
20626
  };
20438
20627
  }
20439
20628
  const pluralWorkspacePrefix = /^\/workspaces\/[^/]+/;
20440
- if (pluralWorkspacePrefix.test(path14)) {
20441
- const suffix = path14.replace(pluralWorkspacePrefix, "/workspace");
20629
+ if (pluralWorkspacePrefix.test(path15)) {
20630
+ const suffix = path15.replace(pluralWorkspacePrefix, "/workspace");
20442
20631
  if (req.method === "GET") {
20443
20632
  if (suffix === "/workspace/mcp" || suffix === "/workspace/skills" || suffix === "/workspace/tools" || suffix === "/workspace/providers" || suffix === "/workspace/env" || suffix === "/workspace/preflight" || suffix === "/workspace/hooks" || suffix === "/workspace/settings" || suffix === "/workspace/voice" || suffix === "/workspace/permissions" || suffix === "/workspace/trust" || suffix === "/workspace/memory" || suffix === "/workspace/agents") {
20444
20633
  return { route: `GET ${suffix}` };
@@ -20497,58 +20686,58 @@ function resolveDaemonTelemetryRoute(req) {
20497
20686
  return { route: "DELETE /workspace/session-groups/:groupId" };
20498
20687
  }
20499
20688
  }
20500
- if (req.method === "POST" && path14 === "/workspace/init") {
20689
+ if (req.method === "POST" && path15 === "/workspace/init") {
20501
20690
  return { route: "POST /workspace/init" };
20502
20691
  }
20503
- if (req.method === "POST" && path14 === "/workspace/setup-github") {
20692
+ if (req.method === "POST" && path15 === "/workspace/setup-github") {
20504
20693
  return { route: "POST /workspace/setup-github" };
20505
20694
  }
20506
- if (req.method === "POST" && path14 === "/workspace/reload") {
20695
+ if (req.method === "POST" && path15 === "/workspace/reload") {
20507
20696
  return { route: "POST /workspace/reload" };
20508
20697
  }
20509
- const mcpRestart = path14.match(/^\/workspace\/mcp\/([^/]+)\/restart$/);
20698
+ const mcpRestart = path15.match(/^\/workspace\/mcp\/([^/]+)\/restart$/);
20510
20699
  if (mcpRestart?.[1] && req.method === "POST") {
20511
20700
  return { route: "POST /workspace/mcp/:server/restart" };
20512
20701
  }
20513
- if (req.method === "POST" && path14 === "/workspace/mcp/servers") {
20702
+ if (req.method === "POST" && path15 === "/workspace/mcp/servers") {
20514
20703
  return { route: "POST /workspace/mcp/servers" };
20515
20704
  }
20516
- const mcpDelete = path14.match(/^\/workspace\/mcp\/servers\/([^/]+)$/);
20705
+ const mcpDelete = path15.match(/^\/workspace\/mcp\/servers\/([^/]+)$/);
20517
20706
  if (mcpDelete?.[1] && req.method === "DELETE") {
20518
20707
  return { route: "DELETE /workspace/mcp/servers/:name" };
20519
20708
  }
20520
- if (req.method === "POST" && path14 === "/workspace/auth/device-flow") {
20709
+ if (req.method === "POST" && path15 === "/workspace/auth/device-flow") {
20521
20710
  return { route: "POST /workspace/auth/device-flow" };
20522
20711
  }
20523
- const deviceFlowDelete = path14.match(
20712
+ const deviceFlowDelete = path15.match(
20524
20713
  /^\/workspace\/auth\/device-flow\/([^/]+)$/
20525
20714
  );
20526
20715
  if (deviceFlowDelete?.[1] && req.method === "DELETE") {
20527
20716
  return { route: "DELETE /workspace/auth/device-flow/:id" };
20528
20717
  }
20529
- const toolEnable = path14.match(/^\/workspace\/tools\/([^/]+)\/enable$/);
20718
+ const toolEnable = path15.match(/^\/workspace\/tools\/([^/]+)\/enable$/);
20530
20719
  if (toolEnable?.[1] && req.method === "POST") {
20531
20720
  return { route: "POST /workspace/tools/:name/enable" };
20532
20721
  }
20533
- if (path14 === "/workspace/settings") {
20722
+ if (path15 === "/workspace/settings") {
20534
20723
  if (req.method === "GET") return { route: "GET /workspace/settings" };
20535
20724
  if (req.method === "POST") return { route: "POST /workspace/settings" };
20536
20725
  }
20537
- if (path14 === "/workspace/permissions") {
20726
+ if (path15 === "/workspace/permissions") {
20538
20727
  if (req.method === "GET") return { route: "GET /workspace/permissions" };
20539
20728
  if (req.method === "POST") return { route: "POST /workspace/permissions" };
20540
20729
  }
20541
- if (path14 === "/workspace/trust") {
20730
+ if (path15 === "/workspace/trust") {
20542
20731
  if (req.method === "GET") return { route: "GET /workspace/trust" };
20543
20732
  }
20544
- if (req.method === "POST" && path14 === "/workspace/trust/request") {
20733
+ if (req.method === "POST" && path15 === "/workspace/trust/request") {
20545
20734
  return { route: "POST /workspace/trust/request" };
20546
20735
  }
20547
- if (path14 === "/workspace/voice") {
20736
+ if (path15 === "/workspace/voice") {
20548
20737
  if (req.method === "GET") return { route: "GET /workspace/voice" };
20549
20738
  if (req.method === "POST") return { route: "POST /workspace/voice" };
20550
20739
  }
20551
- if (req.method === "POST" && path14 === "/workspace/voice/transcribe") {
20740
+ if (req.method === "POST" && path15 === "/workspace/voice/transcribe") {
20552
20741
  return { route: "POST /workspace/voice/transcribe" };
20553
20742
  }
20554
20743
  return void 0;
@@ -20816,8 +21005,8 @@ __name(registerPermissionRoutes, "registerPermissionRoutes");
20816
21005
  // packages/cli/src/serve/routes/session.ts
20817
21006
  init_esbuild_shims();
20818
21007
  import * as crypto3 from "node:crypto";
20819
- import * as fs5 from "node:fs";
20820
- import * as path9 from "node:path";
21008
+ import * as fs6 from "node:fs";
21009
+ import * as path10 from "node:path";
20821
21010
 
20822
21011
  // packages/cli/src/serve/server/prompt-deadline.ts
20823
21012
  init_esbuild_shims();
@@ -21508,7 +21697,7 @@ __name(deleteBranch, "deleteBranch");
21508
21697
 
21509
21698
  // packages/cli/src/serve/virtual-subagent-sessions.ts
21510
21699
  init_esbuild_shims();
21511
- import * as fs4 from "node:fs/promises";
21700
+ import * as fs5 from "node:fs/promises";
21512
21701
  import { createReadStream } from "node:fs";
21513
21702
  import readline from "node:readline";
21514
21703
  var PREFIX = "subagent.";
@@ -21702,7 +21891,7 @@ var VirtualSubagentTarget = class _VirtualSubagentTarget {
21702
21891
  async readNewRecords(endOffset) {
21703
21892
  let handle;
21704
21893
  try {
21705
- handle = await fs4.open(this.task.outputFile, "r");
21894
+ handle = await fs5.open(this.task.outputFile, "r");
21706
21895
  const stat3 = await handle.stat();
21707
21896
  const identity = `${stat3.dev}:${stat3.ino}`;
21708
21897
  if (this.transcriptIdentity !== void 0 && this.transcriptIdentity !== identity || stat3.size < this.offset) {
@@ -21746,7 +21935,7 @@ var VirtualSubagentTarget = class _VirtualSubagentTarget {
21746
21935
  const filePath = `${this.task.outputFile}.stream`;
21747
21936
  let handle;
21748
21937
  try {
21749
- handle = await fs4.open(filePath, "r");
21938
+ handle = await fs5.open(filePath, "r");
21750
21939
  const stat3 = await handle.stat();
21751
21940
  const identity = `${stat3.dev}:${stat3.ino}`;
21752
21941
  if (this.streamIdentity !== void 0 && this.streamIdentity !== identity) {
@@ -21911,7 +22100,7 @@ var VirtualSubagentTarget = class _VirtualSubagentTarget {
21911
22100
  async captureReadBounds() {
21912
22101
  const size = /* @__PURE__ */ __name(async (filePath) => {
21913
22102
  try {
21914
- return (await fs4.stat(filePath)).size;
22103
+ return (await fs5.stat(filePath)).size;
21915
22104
  } catch (error2) {
21916
22105
  if (error2.code === "ENOENT") return 0;
21917
22106
  throw error2;
@@ -22040,7 +22229,7 @@ var VirtualSubagentSessions = class {
22040
22229
  const sessionDir = getSubagentSessionDir(projectDir, parentSessionId);
22041
22230
  let names;
22042
22231
  try {
22043
- names = await fs4.readdir(sessionDir);
22232
+ names = await fs5.readdir(sessionDir);
22044
22233
  } catch (error2) {
22045
22234
  if (error2.code === "ENOENT") return void 0;
22046
22235
  throw error2;
@@ -22096,7 +22285,7 @@ var VirtualSubagentSessions = class {
22096
22285
  const sessionDir = getSubagentSessionDir(projectDir, parentSessionId);
22097
22286
  let names;
22098
22287
  try {
22099
- names = await fs4.readdir(sessionDir);
22288
+ names = await fs5.readdir(sessionDir);
22100
22289
  } catch (error2) {
22101
22290
  if (error2.code === "ENOENT") return void 0;
22102
22291
  throw error2;
@@ -22585,7 +22774,7 @@ function registerSessionRoutes(app, deps) {
22585
22774
  const workspaceParam = req.params[paramName] ?? "";
22586
22775
  const byId = workspaceRegistry.getByWorkspaceId(workspaceParam);
22587
22776
  if (byId) return byId;
22588
- if (!path9.isAbsolute(workspaceParam)) {
22777
+ if (!path10.isAbsolute(workspaceParam)) {
22589
22778
  res.status(400).json({
22590
22779
  error: `\`:${paramName}\` must decode to a workspace id or absolute path`
22591
22780
  });
@@ -23476,7 +23665,7 @@ function registerSessionRoutes(app, deps) {
23476
23665
  if (worktreeMeta) {
23477
23666
  try {
23478
23667
  const createAllowedRoots = [
23479
- path9.join(workspaceCwd, ".qwen", "worktrees")
23668
+ path10.join(workspaceCwd, ".qwen", "worktrees")
23480
23669
  ];
23481
23670
  let createRepoTop = null;
23482
23671
  try {
@@ -23487,7 +23676,7 @@ function registerSessionRoutes(app, deps) {
23487
23676
  }
23488
23677
  if (createRepoTop && createRepoTop !== workspaceCwd) {
23489
23678
  createAllowedRoots.push(
23490
- path9.join(createRepoTop, ".qwen", "worktrees")
23679
+ path10.join(createRepoTop, ".qwen", "worktrees")
23491
23680
  );
23492
23681
  }
23493
23682
  await runtime.bridge.changeSessionCwd(session.sessionId, {
@@ -23786,10 +23975,10 @@ function registerSessionRoutes(app, deps) {
23786
23975
  if (sidecar) {
23787
23976
  let realTarget;
23788
23977
  const candidateRoots = [
23789
- path9.join(workspaceCwd, ".qwen", "worktrees")
23978
+ path10.join(workspaceCwd, ".qwen", "worktrees")
23790
23979
  ];
23791
23980
  try {
23792
- realTarget = fs5.realpathSync(sidecar.worktreePath);
23981
+ realTarget = fs6.realpathSync(sidecar.worktreePath);
23793
23982
  let repoTop = null;
23794
23983
  try {
23795
23984
  repoTop = await new GitWorktreeService(
@@ -23798,13 +23987,13 @@ function registerSessionRoutes(app, deps) {
23798
23987
  } catch {
23799
23988
  }
23800
23989
  if (repoTop && repoTop !== workspaceCwd) {
23801
- candidateRoots.push(path9.join(repoTop, ".qwen", "worktrees"));
23990
+ candidateRoots.push(path10.join(repoTop, ".qwen", "worktrees"));
23802
23991
  }
23803
23992
  const contained = candidateRoots.some((root) => {
23804
23993
  try {
23805
- const realRoot = fs5.realpathSync(root);
23806
- const rel = path9.relative(realRoot, realTarget);
23807
- return !rel.startsWith("..") && !path9.isAbsolute(rel);
23994
+ const realRoot = fs6.realpathSync(root);
23995
+ const rel = path10.relative(realRoot, realTarget);
23996
+ return !rel.startsWith("..") && !path10.isAbsolute(rel);
23808
23997
  } catch {
23809
23998
  return false;
23810
23999
  }
@@ -24120,7 +24309,7 @@ function registerSessionRoutes(app, deps) {
24120
24309
  async (req, res, sessionId, runtime) => {
24121
24310
  const body = safeBody(req);
24122
24311
  const targetPath = body["path"];
24123
- if (typeof targetPath !== "string" || targetPath.length === 0 || !path9.isAbsolute(targetPath)) {
24312
+ if (typeof targetPath !== "string" || targetPath.length === 0 || !path10.isAbsolute(targetPath)) {
24124
24313
  res.status(400).json({
24125
24314
  error: "`path` is required and must be an absolute path",
24126
24315
  code: "invalid_path"
@@ -27154,7 +27343,7 @@ __name(registerUsageStatsRoutes, "registerUsageStatsRoutes");
27154
27343
  // packages/cli/src/serve/scheduled-task-keepalive.ts
27155
27344
  init_esbuild_shims();
27156
27345
  import * as fsSync from "node:fs";
27157
- import * as path10 from "node:path";
27346
+ import * as path11 from "node:path";
27158
27347
  var log = createDebugLogger("SCHED_KEEPALIVE");
27159
27348
  function collectBoundSessionIds(tasks) {
27160
27349
  const seen = /* @__PURE__ */ new Set();
@@ -27380,8 +27569,8 @@ function startScheduledTaskKeepalive(opts) {
27380
27569
  opts.runtimeBaseDir,
27381
27570
  () => getCronFilePath(boundWorkspace)
27382
27571
  );
27383
- const cronDir = path10.dirname(cronFilePath);
27384
- const cronFileName = path10.basename(cronFilePath);
27572
+ const cronDir = path11.dirname(cronFilePath);
27573
+ const cronFileName = path11.basename(cronFilePath);
27385
27574
  let fileWatcher;
27386
27575
  try {
27387
27576
  fsSync.mkdirSync(cronDir, { recursive: true });
@@ -30326,7 +30515,7 @@ __name(registerWorkspaceModelsRoutes, "registerWorkspaceModelsRoutes");
30326
30515
  // packages/cli/src/serve/routes/a2ui-action.ts
30327
30516
  init_esbuild_shims();
30328
30517
  import * as fsp4 from "node:fs/promises";
30329
- import * as path11 from "node:path";
30518
+ import * as path12 from "node:path";
30330
30519
  var A2UI_MIME = "application/a2ui+json";
30331
30520
  var ACTION_TOOL = "action";
30332
30521
  var CALL_TIMEOUT_MS = 15e3;
@@ -30349,7 +30538,7 @@ __name(usableServerConfig, "usableServerConfig");
30349
30538
  async function findFromSettingsFile(workspaceCwd) {
30350
30539
  try {
30351
30540
  const raw = await fsp4.readFile(
30352
- path11.join(workspaceCwd, ".qwen", "settings.json"),
30541
+ path12.join(workspaceCwd, ".qwen", "settings.json"),
30353
30542
  "utf8"
30354
30543
  );
30355
30544
  const settings = JSON.parse(raw);
@@ -30510,7 +30699,7 @@ __name(registerA2uiActionRoutes, "registerA2uiActionRoutes");
30510
30699
 
30511
30700
  // packages/cli/src/serve/server/fs-factory.ts
30512
30701
  init_esbuild_shims();
30513
- import * as path12 from "node:path";
30702
+ import * as path13 from "node:path";
30514
30703
  var IDE_WORKSPACE_PATH_ENV_VAR = "QWEN_CODE_IDE_WORKSPACE_PATH";
30515
30704
  function createDefaultFsAuditEmit() {
30516
30705
  const WARN_EVERY = 100;
@@ -30585,14 +30774,14 @@ function parseIdeWorkspacePathEnv(value) {
30585
30774
  const parsed = JSON.parse(value);
30586
30775
  if (Array.isArray(parsed) && parsed.every((item) => typeof item === "string")) {
30587
30776
  return parsed.filter(
30588
- (workspace) => workspace.length > 0 && path12.isAbsolute(workspace)
30777
+ (workspace) => workspace.length > 0 && path13.isAbsolute(workspace)
30589
30778
  );
30590
30779
  }
30591
30780
  throw new Error("IDE workspace path JSON must be a string array");
30592
30781
  } catch {
30593
30782
  }
30594
30783
  }
30595
- return value.split(path12.delimiter).filter((workspace) => workspace.length > 0 && path12.isAbsolute(workspace));
30784
+ return value.split(path13.delimiter).filter((workspace) => workspace.length > 0 && path13.isAbsolute(workspace));
30596
30785
  }
30597
30786
  __name(parseIdeWorkspacePathEnv, "parseIdeWorkspacePathEnv");
30598
30787
  function dropNestedWorkspacesPreservingPrimary(workspaces) {
@@ -30861,9 +31050,9 @@ __name(setupDeviceFlowRegistry, "setupDeviceFlowRegistry");
30861
31050
 
30862
31051
  // packages/cli/src/serve/server/error-handlers.ts
30863
31052
  init_esbuild_shims();
30864
- var import_express2 = __toESM(require_express(), 1);
31053
+ var import_express3 = __toESM(require_express(), 1);
30865
31054
  function installJsonBodyParser(app) {
30866
- app.use(import_express2.default.json({ limit: "10mb" }));
31055
+ app.use(import_express3.default.json({ limit: "10mb" }));
30867
31056
  app.use((err, _req, res, next) => {
30868
31057
  if (sendJsonBodyParserError(res, err)) return;
30869
31058
  next(err);
@@ -30917,10 +31106,10 @@ function installRateLimiter(app, opts, daemonLog, options = {}) {
30917
31106
  { tier, key: key.slice(0, 64) }
30918
31107
  );
30919
31108
  } : void 0,
30920
- onError: daemonLog ? (err, path14) => {
31109
+ onError: daemonLog ? (err, path15) => {
30921
31110
  daemonLog.warn(
30922
31111
  `rate limiter error (fail-open): ${err instanceof Error ? err.message : String(err)}`,
30923
- { path: path14 }
31112
+ { path: path15 }
30924
31113
  );
30925
31114
  } : void 0
30926
31115
  });
@@ -31116,7 +31305,7 @@ __name(registerWorkspaceQualifiedLifecycleRoutes, "registerWorkspaceQualifiedLif
31116
31305
  init_esbuild_shims();
31117
31306
  import { readdir as readdir2, stat as stat2 } from "node:fs/promises";
31118
31307
  import { realpathSync as realpathSync3 } from "node:fs";
31119
- import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as join7, resolve as resolve4, sep as sep3 } from "node:path";
31308
+ import { basename as basename4, dirname as dirname4, isAbsolute as isAbsolute7, join as join8, resolve as resolve4, sep as sep3 } from "node:path";
31120
31309
 
31121
31310
  // packages/cli/src/serve/native-directory-picker.ts
31122
31311
  init_esbuild_shims();
@@ -31502,7 +31691,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
31502
31691
  return;
31503
31692
  }
31504
31693
  const endsWithSep = prefix.endsWith("/") || process.platform === "win32" && prefix.endsWith("\\");
31505
- const dir = endsWithSep ? join7(prefix, ".") : dirname4(prefix);
31694
+ const dir = endsWithSep ? join8(prefix, ".") : dirname4(prefix);
31506
31695
  const filter = endsWithSep ? "" : basename4(prefix);
31507
31696
  const filterLower = filter.toLowerCase();
31508
31697
  const suggestions = [];
@@ -31518,7 +31707,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
31518
31707
  let isDir = entry.isDirectory();
31519
31708
  if (!isDir && entry.isSymbolicLink()) {
31520
31709
  try {
31521
- isDir = (await stat2(join7(dir, entry.name))).isDirectory();
31710
+ isDir = (await stat2(join8(dir, entry.name))).isDirectory();
31522
31711
  } catch {
31523
31712
  continue;
31524
31713
  }
@@ -31528,7 +31717,7 @@ function registerWorkspaceManagementRoutes(app, deps) {
31528
31717
  truncated = true;
31529
31718
  break;
31530
31719
  }
31531
- suggestions.push({ name: entry.name, path: join7(dir, entry.name) });
31720
+ suggestions.push({ name: entry.name, path: join8(dir, entry.name) });
31532
31721
  }
31533
31722
  } catch {
31534
31723
  }
@@ -31548,11 +31737,11 @@ function registerWorkspaceManagementRoutes(app, deps) {
31548
31737
  const controller = new AbortController();
31549
31738
  res.on("close", () => controller.abort());
31550
31739
  try {
31551
- const path14 = await pickWorkspaceDirectory(controller.signal);
31740
+ const path15 = await pickWorkspaceDirectory(controller.signal);
31552
31741
  res.status(200).json({
31553
31742
  kind: "workspace-directory-picker",
31554
- selected: path14 !== void 0,
31555
- ...path14 === void 0 ? {} : { path: path14 }
31743
+ selected: path15 !== void 0,
31744
+ ...path15 === void 0 ? {} : { path: path15 }
31556
31745
  });
31557
31746
  } catch (error2) {
31558
31747
  const detail = error2 instanceof Error ? error2.message : String(error2);
@@ -32609,8 +32798,8 @@ function buildDiffList(workspaceCwd, result) {
32609
32798
  hiddenCount: 0
32610
32799
  };
32611
32800
  }
32612
- const files = [...result.perFileStats.entries()].map(([path14, s]) => ({
32613
- path: path14,
32801
+ const files = [...result.perFileStats.entries()].map(([path15, s]) => ({
32802
+ path: path15,
32614
32803
  oldPath: s.oldPath,
32615
32804
  added: s.added,
32616
32805
  removed: s.removed,
@@ -35517,7 +35706,7 @@ __name(registerWorkspaceQualifiedSkillsRoutes, "registerWorkspaceQualifiedSkills
35517
35706
 
35518
35707
  // packages/cli/src/serve/routes/channel-webhooks.ts
35519
35708
  init_esbuild_shims();
35520
- var import_express3 = __toESM(require_express(), 1);
35709
+ var import_express4 = __toESM(require_express(), 1);
35521
35710
  import { createHash as createHash4, timingSafeEqual as timingSafeEqual2 } from "node:crypto";
35522
35711
  var PROTOTYPE_POLLUTION_KEYS = /* @__PURE__ */ new Set([
35523
35712
  "__proto__",
@@ -35566,7 +35755,7 @@ function registerChannelWebhookRoutes(app, deps) {
35566
35755
  locals.channelWebhook = { channelName, source, sourceConfig };
35567
35756
  next();
35568
35757
  },
35569
- import_express3.default.json({ limit: "1mb" }),
35758
+ import_express4.default.json({ limit: "1mb" }),
35570
35759
  async (req, res) => {
35571
35760
  const locals = res.locals;
35572
35761
  const webhook = locals.channelWebhook;
@@ -39065,10 +39254,10 @@ __name(registerLiveSetupRoutes, "registerLiveSetupRoutes");
39065
39254
  init_esbuild_shims();
39066
39255
  import { execFile as execFile3 } from "node:child_process";
39067
39256
  import { createHash as createHash5, randomUUID as randomUUID11 } from "node:crypto";
39068
- import * as fs6 from "node:fs";
39257
+ import * as fs7 from "node:fs";
39069
39258
  import * as fsp5 from "node:fs/promises";
39070
- import * as os from "node:os";
39071
- import * as path13 from "node:path";
39259
+ import * as os2 from "node:os";
39260
+ import * as path14 from "node:path";
39072
39261
  import { Readable, Transform } from "node:stream";
39073
39262
  import { pipeline } from "node:stream/promises";
39074
39263
  import { promisify as promisify3 } from "node:util";
@@ -39146,7 +39335,7 @@ async function readBundleValue(appPath, key) {
39146
39335
  "raw",
39147
39336
  "-o",
39148
39337
  "-",
39149
- path13.join(appPath, "Contents", "Info.plist")
39338
+ path14.join(appPath, "Contents", "Info.plist")
39150
39339
  ]);
39151
39340
  }
39152
39341
  __name(readBundleValue, "readBundleValue");
@@ -39241,7 +39430,7 @@ async function downloadAsset(asset, destination, onProgress) {
39241
39430
  await pipeline(
39242
39431
  Readable.fromWeb(response.body),
39243
39432
  guard,
39244
- fs6.createWriteStream(destination, { flags: "wx", mode: 384 })
39433
+ fs7.createWriteStream(destination, { flags: "wx", mode: 384 })
39245
39434
  );
39246
39435
  if (received !== asset.size || hash.digest("hex") !== asset.sha256) {
39247
39436
  throw new Error("Live Host checksum verification failed.");
@@ -39252,11 +39441,11 @@ async function installLatestHost(currentArchitecture, onStatus) {
39252
39441
  const manifest = await fetchManifest();
39253
39442
  const asset = manifest.assets[currentArchitecture];
39254
39443
  const temporaryDirectory = await fsp5.mkdtemp(
39255
- path13.join(os.tmpdir(), "qwen-live-host-")
39444
+ path14.join(os2.tmpdir(), "qwen-live-host-")
39256
39445
  );
39257
- const archivePath = path13.join(temporaryDirectory, asset.name);
39258
- const extractedPath = path13.join(temporaryDirectory, "extracted");
39259
- const candidatePath = path13.join(extractedPath, LIVE_HOST_APP_NAME);
39446
+ const archivePath = path14.join(temporaryDirectory, asset.name);
39447
+ const extractedPath = path14.join(temporaryDirectory, "extracted");
39448
+ const candidatePath = path14.join(extractedPath, LIVE_HOST_APP_NAME);
39260
39449
  const stagingPath = `/Applications/.Qwen Live Host.install-${randomUUID11()}.app`;
39261
39450
  const backupPath = `/Applications/.Qwen Live Host.backup-${randomUUID11()}.app`;
39262
39451
  let movedExisting = false;
@@ -39404,13 +39593,13 @@ var LiveHostInstaller = class {
39404
39593
  init_esbuild_shims();
39405
39594
  import { createHash as createHash6, randomUUID as randomUUID12 } from "node:crypto";
39406
39595
  import { createWriteStream as createWriteStream2, mkdirSync as mkdirSync2 } from "node:fs";
39407
- import { join as join10 } from "node:path";
39596
+ import { join as join11 } from "node:path";
39408
39597
 
39409
39598
  // packages/cli/src/serve/live/realtime-startup-context.ts
39410
39599
  init_esbuild_shims();
39411
39600
  import { readdirSync } from "node:fs";
39412
39601
  import { homedir } from "node:os";
39413
- import { basename as basename5, join as join9 } from "node:path";
39602
+ import { basename as basename5, join as join10 } from "node:path";
39414
39603
  var STARTUP_CONTEXT_HEADER = "Startup context from Qwen Code.\nThis is background context about recent work and machine/workspace layout. It may be incomplete or stale. Use it to inform responses, and do not repeat it back unless relevant.";
39415
39604
  var CURRENT_THREAD_SECTION_TOKEN_BUDGET = 1200;
39416
39605
  var RECENT_WORK_SECTION_TOKEN_BUDGET = 2200;
@@ -39652,7 +39841,7 @@ function collectTreeLines(directory, depth, lines) {
39652
39841
  const indent = " ".repeat(depth);
39653
39842
  lines.push(`${indent}- ${entry.name}${entry.isDirectory() ? "/" : ""}`);
39654
39843
  if (entry.isDirectory()) {
39655
- collectTreeLines(join9(directory, entry.name), depth + 1, lines);
39844
+ collectTreeLines(join10(directory, entry.name), depth + 1, lines);
39656
39845
  }
39657
39846
  }
39658
39847
  if (entries.length > DIR_ENTRY_LIMIT) {
@@ -39771,13 +39960,13 @@ function openLiveAudioCapture(source, identifier) {
39771
39960
  try {
39772
39961
  mkdirSync2(directory, { recursive: true, mode: 448 });
39773
39962
  const safeIdentifier = identifier.replace(/[^A-Za-z0-9_-]/g, "_");
39774
- const path14 = join10(
39963
+ const path15 = join11(
39775
39964
  directory,
39776
39965
  `${source}-${Date.now()}-${safeIdentifier}.pcm`
39777
39966
  );
39778
- const stream = createWriteStream2(path14, { flags: "wx", mode: 384 });
39967
+ const stream = createWriteStream2(path15, { flags: "wx", mode: 384 });
39779
39968
  stream.on("error", () => void 0);
39780
- return { source, path: path14, stream, hash: createHash6("sha256"), bytes: 0 };
39969
+ return { source, path: path15, stream, hash: createHash6("sha256"), bytes: 0 };
39781
39970
  } catch {
39782
39971
  return void 0;
39783
39972
  }
@@ -42143,7 +42332,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
42143
42332
  "createServeApp: deps.workspaceRuntimeRemoval requires the matching deps.voiceCoordinator."
42144
42333
  );
42145
42334
  }
42146
- const app = (0, import_express4.default)();
42335
+ const app = (0, import_express5.default)();
42147
42336
  const injectedWorkspaceRegistry = deps.workspaceRegistry;
42148
42337
  const boundWorkspace = injectedWorkspaceRegistry?.primary.workspaceCwd ?? deps.boundWorkspace ?? canonicalizeWorkspace(opts.workspace ?? process.cwd());
42149
42338
  if (injectedWorkspaceRegistry) {