@qwen-code/qwen-code 0.19.7-nightly.20260708.394c1a289 → 0.19.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 (228) hide show
  1. package/bundled/qc-helper/docs/features/channels/overview.md +6 -3
  2. package/bundled/qc-helper/docs/features/channels/plugins.md +1 -0
  3. package/bundled/qc-helper/docs/features/hooks.md +36 -34
  4. package/bundled/qc-helper/docs/features/memory.md +1 -1
  5. package/bundled/qc-helper/docs/qwen-serve.md +17 -10
  6. package/bundled/review/SKILL.md +6 -2
  7. package/chunks/{MaxSizedBox-XS37LWTD.js → MaxSizedBox-5DT2SD7B.js} +7 -7
  8. package/chunks/{StandaloneSessionPicker-LPALJTKN.js → StandaloneSessionPicker-EYRGH6PJ.js} +23 -21
  9. package/chunks/{acpAgent-4VE3FGJX.js → acpAgent-GRFTTRHW.js} +74 -69
  10. package/chunks/{agent-CCHERW6L.js → agent-H2DGKS77.js} +4 -4
  11. package/chunks/{agent-headless-55N6UBUU.js → agent-headless-KFMFIT6J.js} +4 -4
  12. package/chunks/{anthropicContentGenerator-AKYPSZIV.js → anthropicContentGenerator-CPF22MA7.js} +28 -1
  13. package/chunks/{bridge-U6HXOHE7.js → bridge-NA3ZQQKJ.js} +11 -10
  14. package/chunks/{ca-HCMB2I54.js → ca-MKD32FQL.js} +26 -1
  15. package/chunks/{channel-worker-supervisor-CRCVYQIE.js → channel-worker-supervisor-NZQUOEFJ.js} +3 -3
  16. package/chunks/{chunk-J43WPR6U.js → chunk-27BHARDE.js} +8 -8
  17. package/chunks/{chunk-KKWO4IX2.js → chunk-2EM7ECZD.js} +251 -71
  18. package/chunks/{chunk-E7HM76PR.js → chunk-3GNOQZDC.js} +1562 -1025
  19. package/chunks/{chunk-G7ZG7CA6.js → chunk-3UP777ZS.js} +8 -7
  20. package/chunks/{chunk-VEB3NYSO.js → chunk-5MBO76SL.js} +5 -0
  21. package/chunks/{chunk-N74BA4VP.js → chunk-6VK6FIMQ.js} +1 -1
  22. package/chunks/{chunk-2FHWCKWA.js → chunk-A5JOJ77H.js} +35 -14
  23. package/chunks/{chunk-PLGONYEL.js → chunk-AYNCLGTW.js} +5 -5
  24. package/chunks/{chunk-K34DD7FH.js → chunk-BOBOCR5H.js} +4 -3
  25. package/chunks/chunk-BOBRZZKD.js +468 -0
  26. package/chunks/{chunk-7I4MGFBN.js → chunk-BUZ6HGL4.js} +5 -5
  27. package/chunks/{chunk-FK77ILF5.js → chunk-BVYU3ZTI.js} +2 -2
  28. package/chunks/{chunk-TBAZMRW3.js → chunk-CD6USWHZ.js} +1 -1
  29. package/chunks/{chunk-PVXPDMGP.js → chunk-CHB5SLZZ.js} +2 -2
  30. package/chunks/{chunk-SJHAUELE.js → chunk-DCZWC4PF.js} +2 -2
  31. package/chunks/{chunk-YYU6H66M.js → chunk-DHOLNQLC.js} +11 -11
  32. package/chunks/{chunk-MOQOAH7N.js → chunk-DICGXFAI.js} +1 -1
  33. package/chunks/{chunk-KT3SI3CQ.js → chunk-DIWVZ3VM.js} +8 -8
  34. package/chunks/{chunk-2DYY5XUZ.js → chunk-E7EMCSUG.js} +1 -1
  35. package/chunks/{chunk-XQ2GVLNJ.js → chunk-EEN2TKST.js} +1 -1
  36. package/chunks/{chunk-DNV4FSN5.js → chunk-FBET5XZ2.js} +6 -4
  37. package/chunks/{chunk-GIY6JTTC.js → chunk-FQNC62B2.js} +4 -4
  38. package/chunks/{chunk-B34OV7K2.js → chunk-GGQQA4JW.js} +13 -0
  39. package/chunks/chunk-GLE2YUPU.js +34 -0
  40. package/chunks/{chunk-X265R5C6.js → chunk-GN3F6PIU.js} +1 -1
  41. package/chunks/{chunk-LC4SMGYY.js → chunk-GSHQYYIV.js} +45 -9
  42. package/chunks/{chunk-BGL43SJ3.js → chunk-HDOH3QYE.js} +1 -1
  43. package/chunks/{chunk-4AFOWB47.js → chunk-I6WGFJJ3.js} +63 -4
  44. package/chunks/{chunk-2NPS2UDH.js → chunk-IBY3Q3HG.js} +390 -9
  45. package/chunks/{chunk-AXTPFMRS.js → chunk-J7RCB6N5.js} +1 -1
  46. package/chunks/{chunk-QCSLZO6J.js → chunk-JCH35JB3.js} +1 -1
  47. package/chunks/{chunk-JYOWO2F7.js → chunk-JPALE3PA.js} +3 -3
  48. package/chunks/{chunk-5FL2K3ZB.js → chunk-JRQ7EVGE.js} +1 -1
  49. package/chunks/{chunk-BHRU4SDF.js → chunk-JZHIQJOE.js} +3 -3
  50. package/chunks/{chunk-FB2ULV4M.js → chunk-L46XKEGM.js} +14 -153
  51. package/chunks/{chunk-LKXDC3AW.js → chunk-L4AMBVQG.js} +9 -9
  52. package/chunks/{chunk-ME344634.js → chunk-LAXNEOBG.js} +1 -1
  53. package/chunks/{chunk-QHT5USLK.js → chunk-M7S4GK5Z.js} +66 -445
  54. package/chunks/{chunk-4RQIB5UZ.js → chunk-O2YT7VB4.js} +0 -34
  55. package/chunks/{chunk-TBLJNMI7.js → chunk-O33TBKDC.js} +10 -10
  56. package/chunks/chunk-O7FIRWJV.js +168 -0
  57. package/chunks/{chunk-4KJ2BPIT.js → chunk-OACJLMLD.js} +2 -38
  58. package/chunks/{chunk-CR5IU2RX.js → chunk-ON3JA3RU.js} +2 -2
  59. package/chunks/{chunk-VTCPREC7.js → chunk-OQXDAMKY.js} +3 -3
  60. package/chunks/{chunk-ELMPRVCB.js → chunk-P3XEEI3X.js} +1 -1
  61. package/chunks/{chunk-OU6FPTJZ.js → chunk-PMFULMLX.js} +296 -81
  62. package/chunks/{chunk-2YELHTUE.js → chunk-PUVCVELY.js} +1 -1
  63. package/chunks/{chunk-5OSSOBZC.js → chunk-RMLZAUWH.js} +4 -4
  64. package/chunks/{chunk-B6WUEODT.js → chunk-SQ2UATK7.js} +14 -8
  65. package/chunks/{chunk-TEYGKLIZ.js → chunk-TI3BWD4D.js} +1 -1
  66. package/chunks/{chunk-T2EJHSE3.js → chunk-TSPB77TG.js} +57 -35
  67. package/chunks/{chunk-L7IWK7JY.js → chunk-UX6OTBVD.js} +1 -1
  68. package/chunks/{chunk-XUSONNJ4.js → chunk-UXEW557D.js} +1 -1
  69. package/chunks/chunk-V35MD7KN.js +13 -0
  70. package/chunks/{chunk-B5FOCTEZ.js → chunk-VGGOPZUL.js} +6 -5
  71. package/chunks/{chunk-MYZWWRVW.js → chunk-WF4FAXDL.js} +2 -2
  72. package/chunks/{chunk-2SWMCXVR.js → chunk-WHJQ3JUS.js} +20 -8
  73. package/chunks/{chunk-VQJ64BIQ.js → chunk-WQTHLB5T.js} +3 -3
  74. package/chunks/chunk-XNXVCNAT.js +88 -0
  75. package/chunks/{chunk-TDGF35EN.js → chunk-XOHNA2S6.js} +1 -1
  76. package/chunks/{chunk-ZK5EI6NR.js → chunk-XYR5RUA5.js} +14 -5
  77. package/chunks/{chunk-YMWIKAEE.js → chunk-YDOXPLYL.js} +244 -47
  78. package/chunks/{chunk-UZCT5OLN.js → chunk-YHKAK72D.js} +11 -11
  79. package/chunks/{chunk-RFIL6REB.js → chunk-YKZIAK7C.js} +119 -29
  80. package/chunks/chunk-Z3I3QJK3.js +47 -0
  81. package/chunks/{chunk-3QDZDAJG.js → chunk-ZE6E424U.js} +1 -1
  82. package/chunks/chunk-ZL5HN75Q.js +61 -0
  83. package/chunks/{computer-use-4CTF6WS3.js → computer-use-WMY3UOBX.js} +4 -4
  84. package/chunks/{contextCommand-Z3XWQCY6.js → contextCommand-LXFZRP4L.js} +6 -6
  85. package/chunks/{daemon-F3I2RXP6.js → daemon-WPAENEBW.js} +48 -0
  86. package/chunks/{daemon-status-provider-6A4QCG6Q.js → daemon-status-provider-GJRXY5EN.js} +15 -13
  87. package/chunks/{de-PLLFDERI.js → de-ZFPPQVSF.js} +26 -1
  88. package/chunks/{dist-IMFFBMAT.js → dist-BEXOZXLQ.js} +1 -1
  89. package/chunks/{dist-OT7G2WNM.js → dist-E6UANPIM.js} +1 -1
  90. package/chunks/{dist-FQ5WRJPL.js → dist-H2AEJCZ5.js} +2 -2
  91. package/chunks/{dist-YTRKAVUB.js → dist-O2IRTRPP.js} +1 -1
  92. package/chunks/{dist-573HNSVO.js → dist-SCFLLYMK.js} +1 -1
  93. package/chunks/{dist-PKFTNUHO.js → dist-Z34QPAQW.js} +1 -1
  94. package/chunks/{earlyInputCapture-7O47HW62.js → earlyInputCapture-KNOYZ4MJ.js} +4 -4
  95. package/chunks/{edit-E32KWLF2.js → edit-OTYWAXGP.js} +5 -5
  96. package/chunks/{en-GA2RMXY5.js → en-N4EPZAQI.js} +26 -1
  97. package/chunks/{enter-worktree-ZKFFMHUD.js → enter-worktree-HNYBDVCX.js} +4 -4
  98. package/chunks/{enterPlanMode-HLDC6NGX.js → enterPlanMode-CJCNGT63.js} +4 -4
  99. package/chunks/environment-ATFTYMLZ.js +88 -0
  100. package/chunks/{errors-MTIDDXX7.js → errors-A54HAADA.js} +6 -6
  101. package/chunks/{exit-worktree-YHY72XA2.js → exit-worktree-DUUKOE3X.js} +4 -4
  102. package/chunks/{exitPlanMode-JNXKBZ2C.js → exitPlanMode-AMMSXOAJ.js} +4 -4
  103. package/chunks/{fast-path-DVAGBROV.js → fast-path-OV6NIP3K.js} +12 -3
  104. package/chunks/{fast-path-settings-RCRXH2JG.js → fast-path-settings-7RIFI3PK.js} +3 -2
  105. package/chunks/{fr-GWNQG4XH.js → fr-5WWMY53B.js} +26 -1
  106. package/chunks/{gemini-2TMHJVRC.js → gemini-NQ3WWBKB.js} +431 -135
  107. package/chunks/{geminiContentGenerator-WCH4GWD3.js → geminiContentGenerator-CDUNEJQE.js} +1 -1
  108. package/chunks/{glob-I6Y4AGKO.js → glob-ROV3YS4R.js} +4 -4
  109. package/chunks/{grep-3P2J3LU5.js → grep-NRITKDCD.js} +4 -4
  110. package/chunks/{handleAutoUpdate-4IVRMRG4.js → handleAutoUpdate-CEZJAARW.js} +6 -6
  111. package/chunks/{initializer-DVNCPVTC.js → initializer-BRFJKRRX.js} +11 -9
  112. package/chunks/{ja-2HOTA47X.js → ja-CUHZOLEJ.js} +26 -1
  113. package/chunks/{list-4D6QK2KZ.js → list-KVHF7O4X.js} +13 -11
  114. package/chunks/{loadedSettingsAdapter-GNGELH6Q.js → loadedSettingsAdapter-LL5PSFKX.js} +11 -9
  115. package/chunks/{ls-L654WOAT.js → ls-7MFU2QYW.js} +1 -1
  116. package/chunks/{lsp-M35KE54Y.js → lsp-XHDTPTGV.js} +2 -4
  117. package/chunks/{mcp-2IL72YJP.js → mcp-3GCXRTOQ.js} +11 -9
  118. package/chunks/{monitor-BLVCZAVX.js → monitor-FL2ZO33W.js} +4 -4
  119. package/chunks/{nonInteractiveCli-UD3V7UOO.js → nonInteractiveCli-PTQI3DV6.js} +44 -41
  120. package/chunks/{notebook-edit-5TVMWIWY.js → notebook-edit-6PULTHL5.js} +5 -5
  121. package/chunks/{openaiContentGenerator-5LJ5A7YY.js → openaiContentGenerator-YE42PKCY.js} +3 -3
  122. package/chunks/{pidfile-AN5JQJ2T.js → pidfile-NZYSCFRK.js} +4 -4
  123. package/chunks/{pt-2THT3YHA.js → pt-OLYN42DS.js} +26 -1
  124. package/chunks/{qwenContentGenerator-E2JSB4FJ.js → qwenContentGenerator-NX2E7PB7.js} +5 -5
  125. package/chunks/{read-file-N5DEFUDU.js → read-file-33XGP5HF.js} +2 -2
  126. package/chunks/{record-artifact-PP3LKHTS.js → record-artifact-SQ2OKRJW.js} +3 -3
  127. package/chunks/{ripGrep-BLJHTHKE.js → ripGrep-QWZLGTAN.js} +4 -4
  128. package/chunks/{ru-Z67YJHBG.js → ru-LDM3GWVQ.js} +26 -1
  129. package/chunks/{run-qwen-serve-4JDO64RN.js → run-qwen-serve-JK2DL7PI.js} +596 -143
  130. package/chunks/{scheduler-FQR4XA7J.js → scheduler-O4IGVZKK.js} +4 -4
  131. package/chunks/{send-message-OA6MV4EU.js → send-message-76GT3JMC.js} +1 -1
  132. package/chunks/{serve-ZOCFC7YM.js → serve-JTMIGANH.js} +13 -10
  133. package/chunks/{server-GEOYEPYT.js → server-SGNPKX2O.js} +667 -243
  134. package/chunks/{session-NJCONHGX.js → session-5BNM25EZ.js} +45 -42
  135. package/chunks/{settings-QBGGXANI.js → settings-3MI4XXP6.js} +20 -16
  136. package/chunks/{shell-2DVPSEKT.js → shell-YJKBE67T.js} +4 -4
  137. package/chunks/{skill-HIPXUHV7.js → skill-I22QK5XS.js} +2 -2
  138. package/chunks/{spawnChannel-3JYXY52G.js → spawnChannel-UNV6W4DU.js} +6 -6
  139. package/chunks/{src-NLEX4CUC.js → src-BBQSM46M.js} +8 -4
  140. package/chunks/{startInteractiveUI-TYGZIU27.js → startInteractiveUI-JII36UGN.js} +619 -288
  141. package/chunks/{task-create-RPFZNB4B.js → task-create-WCHTB435.js} +2 -2
  142. package/chunks/{task-update-5WUG5MVQ.js → task-update-XYWMHJGJ.js} +2 -2
  143. package/chunks/{team-create-MGX57SZJ.js → team-create-A7NUU5AQ.js} +4 -4
  144. package/chunks/{team-plan-approval-BO2N7J3E.js → team-plan-approval-TOQRJ2KI.js} +4 -4
  145. package/chunks/{theme-manager-WU7LOA64.js → theme-manager-WZ4RRMMB.js} +4 -4
  146. package/chunks/{tool-search-CLBKVEVK.js → tool-search-SZ4EFS2T.js} +3 -3
  147. package/chunks/total-session-admission-ULXJWXFV.js +72 -0
  148. package/chunks/{trustedFolders-GAQM2GHB.js → trustedFolders-LAZZPZ3D.js} +5 -5
  149. package/chunks/{updateCheck-RIK2YIQE.js → updateCheck-KONLM73X.js} +5 -5
  150. package/chunks/{validateNonInterActiveAuth-NS3GBIJZ.js → validateNonInterActiveAuth-MPKSRCXD.js} +41 -38
  151. package/chunks/{version-B3RSLP54.js → version-NO2XSNNP.js} +1 -1
  152. package/chunks/{workflow-7APPIGND.js → workflow-WO2H6NRI.js} +5 -5
  153. package/chunks/{workspace-providers-status-SC67GLMY.js → workspace-providers-status-3W7E7DFW.js} +14 -11
  154. package/chunks/workspace-registry-SXJZNN3O.js +74 -0
  155. package/chunks/{workspace-service-ZJHF22WA.js → workspace-service-CZRQZ4Q4.js} +17 -15
  156. package/chunks/{workspace-skills-status-NJEK6P6Y.js → workspace-skills-status-K7WFREPD.js} +12 -10
  157. package/chunks/{write-file-R6Z3VLRY.js → write-file-PX2Z7IBE.js} +5 -5
  158. package/chunks/{zh-7XVVRTDH.js → zh-J4F6QWQV.js} +26 -1
  159. package/chunks/{zh-TW-DPH554OG.js → zh-TW-XVDWOLSW.js} +26 -1
  160. package/cli.js +11 -11
  161. package/locales/ca.js +30 -0
  162. package/locales/de.js +30 -0
  163. package/locales/en.js +30 -0
  164. package/locales/fr.js +30 -0
  165. package/locales/ja.js +30 -0
  166. package/locales/pt.js +30 -0
  167. package/locales/ru.js +30 -0
  168. package/locales/zh-TW.js +30 -0
  169. package/locales/zh.js +30 -0
  170. package/node_modules/@qwen-code/audio-capture/package.json +1 -1
  171. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
  172. package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
  173. package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
  174. package/package.json +3 -3
  175. package/web-shell/assets/{arc-C7hjaa7g.js → arc-BWyoJpY2.js} +1 -1
  176. package/web-shell/assets/{architectureDiagram-3BPJPVTR-pm9KtMZY.js → architectureDiagram-3BPJPVTR-BT0mGrz2.js} +1 -1
  177. package/web-shell/assets/{blockDiagram-GPEHLZMM-CApElKsU.js → blockDiagram-GPEHLZMM-BLgUWvyf.js} +1 -1
  178. package/web-shell/assets/{c4Diagram-AAUBKEIU-BeDe0-9N.js → c4Diagram-AAUBKEIU-DYx9M7oU.js} +1 -1
  179. package/web-shell/assets/channel-wmPUGHtg.js +1 -0
  180. package/web-shell/assets/{chunk-2J33WTMH-DJEkmLdl.js → chunk-2J33WTMH-CfMHWbuZ.js} +1 -1
  181. package/web-shell/assets/{chunk-4BX2VUAB-DXX8gdpe.js → chunk-4BX2VUAB-B1URoqEV.js} +1 -1
  182. package/web-shell/assets/{chunk-55IACEB6-DORmk1kQ.js → chunk-55IACEB6-DAIaM4QF.js} +1 -1
  183. package/web-shell/assets/{chunk-727SXJPM-DWmO4mCZ.js → chunk-727SXJPM-B2X34knw.js} +1 -1
  184. package/web-shell/assets/{chunk-AQP2D5EJ-C7LRaYw2.js → chunk-AQP2D5EJ-Cif-zLTQ.js} +1 -1
  185. package/web-shell/assets/{chunk-FMBD7UC4-CCdXgyC5.js → chunk-FMBD7UC4-H18WCXdY.js} +1 -1
  186. package/web-shell/assets/{chunk-ND2GUHAM-SyL_xvWc.js → chunk-ND2GUHAM-YFtetHi0.js} +1 -1
  187. package/web-shell/assets/{chunk-QZHKN3VN-BzOuCKxa.js → chunk-QZHKN3VN-By2hiH3r.js} +1 -1
  188. package/web-shell/assets/classDiagram-4FO5ZUOK-BA2ljEjW.js +1 -0
  189. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BA2ljEjW.js +1 -0
  190. package/web-shell/assets/{cose-bilkent-S5V4N54A-BMPWyDKc.js → cose-bilkent-S5V4N54A-VrcnnLZu.js} +1 -1
  191. package/web-shell/assets/{dagre-BM42HDAG-B_GnPWik.js → dagre-BM42HDAG-CGo-IaVV.js} +1 -1
  192. package/web-shell/assets/{diagram-2AECGRRQ-fJqMc3S_.js → diagram-2AECGRRQ-Dl4QjzIB.js} +1 -1
  193. package/web-shell/assets/{diagram-5GNKFQAL-ximV3O9D.js → diagram-5GNKFQAL-qMLmsO0u.js} +1 -1
  194. package/web-shell/assets/{diagram-KO2AKTUF-2vVyjzqw.js → diagram-KO2AKTUF-CHlmuxPI.js} +1 -1
  195. package/web-shell/assets/{diagram-LMA3HP47-Dckcx1sT.js → diagram-LMA3HP47-BUwU3GwT.js} +1 -1
  196. package/web-shell/assets/{diagram-OG6HWLK6-BAVv47ga.js → diagram-OG6HWLK6-HEhwPDUM.js} +1 -1
  197. package/web-shell/assets/{erDiagram-TEJ5UH35-Bn3nf5J0.js → erDiagram-TEJ5UH35-1n0llBmM.js} +1 -1
  198. package/web-shell/assets/{flowDiagram-I6XJVG4X-BIbGF9JT.js → flowDiagram-I6XJVG4X-BN74uMnt.js} +1 -1
  199. package/web-shell/assets/{ganttDiagram-6RSMTGT7-CDbhb3AH.js → ganttDiagram-6RSMTGT7-BoOq78i3.js} +1 -1
  200. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-CbKG1a_w.js → gitGraphDiagram-PVQCEYII-CN8b00c8.js} +1 -1
  201. package/web-shell/assets/index-CNwoO1Cn.js +783 -0
  202. package/web-shell/assets/index-CWQ0z6kZ.css +5 -0
  203. package/web-shell/assets/{infoDiagram-5YYISTIA-DUFxTy8m.js → infoDiagram-5YYISTIA-CCurnIna.js} +1 -1
  204. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D69hrBG8.js → ishikawaDiagram-YF4QCWOH-AwuRqdUP.js} +1 -1
  205. package/web-shell/assets/{journeyDiagram-JHISSGLW-DsvEw51Y.js → journeyDiagram-JHISSGLW-B7IICk-E.js} +1 -1
  206. package/web-shell/assets/{kanban-definition-UN3LZRKU-lFFjZEYd.js → kanban-definition-UN3LZRKU-BYF0OKhx.js} +1 -1
  207. package/web-shell/assets/{linear-Bo5bWzvo.js → linear-GWWguGfD.js} +1 -1
  208. package/web-shell/assets/{mermaid.core-C_HKMJx5.js → mermaid.core-JqtkxvCl.js} +5 -5
  209. package/web-shell/assets/{mindmap-definition-RKZ34NQL-DlV-NUTs.js → mindmap-definition-RKZ34NQL-B0MmHsZ6.js} +1 -1
  210. package/web-shell/assets/{pieDiagram-4H26LBE5-B2e6FH2a.js → pieDiagram-4H26LBE5-DhImUZLQ.js} +1 -1
  211. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-D75kSk-b.js → quadrantDiagram-W4KKPZXB-DGeSC3DT.js} +1 -1
  212. package/web-shell/assets/{requirementDiagram-4Y6WPE33-CQ6xakhM.js → requirementDiagram-4Y6WPE33-DkspY6Re.js} +1 -1
  213. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-J_XTKrcY.js → sankeyDiagram-5OEKKPKP-CaOofS2x.js} +1 -1
  214. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-D7jTcBtf.js → sequenceDiagram-3UESZ5HK-DFQ_kFnN.js} +1 -1
  215. package/web-shell/assets/{stateDiagram-AJRCARHV-CrlM_OT3.js → stateDiagram-AJRCARHV-D3snw0Tz.js} +1 -1
  216. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BbSm_9d0.js +1 -0
  217. package/web-shell/assets/{timeline-definition-PNZ67QCA-5oZi76Ef.js → timeline-definition-PNZ67QCA-l4zH8nLM.js} +1 -1
  218. package/web-shell/assets/{vennDiagram-CIIHVFJN-DO5YptPK.js → vennDiagram-CIIHVFJN-BnRlA98M.js} +1 -1
  219. package/web-shell/assets/{wardley-L42UT6IY-4t1eJDvM.js → wardley-L42UT6IY-BS0xUdmd.js} +1 -1
  220. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DKZc661S.js → wardleyDiagram-YWT4CUSO-DKGBUWyQ.js} +1 -1
  221. package/web-shell/assets/{xychartDiagram-2RQKCTM6-su9hp08G.js → xychartDiagram-2RQKCTM6-DVb2HuOB.js} +1 -1
  222. package/web-shell/index.html +2 -2
  223. package/web-shell/assets/channel-BNf1dW-j.js +0 -1
  224. package/web-shell/assets/classDiagram-4FO5ZUOK-uOIGlzgi.js +0 -1
  225. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-uOIGlzgi.js +0 -1
  226. package/web-shell/assets/index-CnE2ur2L.js +0 -779
  227. package/web-shell/assets/index-hSKXrlSE.css +0 -5
  228. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-Bs4TK_84.js +0 -1
@@ -11,7 +11,7 @@ import {
11
11
  openQwenAsrRealtimeStream,
12
12
  openVoiceStream,
13
13
  openVoiceStreamWithRetry
14
- } from "./chunk-2YELHTUE.js";
14
+ } from "./chunk-PUVCVELY.js";
15
15
  import {
16
16
  SetupGithubError,
17
17
  collectSessionData,
@@ -22,62 +22,10 @@ import {
22
22
  toJson,
23
23
  toJsonl,
24
24
  toMarkdown
25
- } from "./chunk-FK77ILF5.js";
26
- import "./chunk-ZK5EI6NR.js";
25
+ } from "./chunk-BVYU3ZTI.js";
26
+ import "./chunk-XYR5RUA5.js";
27
27
  import "./chunk-LGFAYIKX.js";
28
28
  import "./chunk-54YZOP7P.js";
29
- import {
30
- createDaemonStatusProvider
31
- } from "./chunk-FB2ULV4M.js";
32
- import "./chunk-BHRU4SDF.js";
33
- import "./chunk-KHDZHZMH.js";
34
- import {
35
- createWorkspaceProvidersStatusProvider
36
- } from "./chunk-B6WUEODT.js";
37
- import {
38
- getAuthTypeFromEnv,
39
- resolveCliGenerationConfig
40
- } from "./chunk-KT3SI3CQ.js";
41
- import {
42
- createWorkspaceSkillsStatusProvider
43
- } from "./chunk-VTCPREC7.js";
44
- import "./chunk-6IAWPIQ6.js";
45
- import {
46
- EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,
47
- WorkspaceVoiceError,
48
- buildWorkspaceVoiceSettingsWrites,
49
- buildWorkspaceVoiceStatus,
50
- createDaemonWorkspaceService,
51
- hasConfiguredBatchVoiceTranscriptionModel,
52
- transcribeWorkspaceVoiceAudio,
53
- validateWorkspaceVoiceState,
54
- voiceSettingsScopeToWire
55
- } from "./chunk-UZCT5OLN.js";
56
- import {
57
- PermissionRulesValidationError,
58
- buildPermissionSettings,
59
- isPermissionRuleType,
60
- normalizePermissionRules,
61
- readPermissionRuleSet
62
- } from "./chunk-5FL2K3ZB.js";
63
- import {
64
- assertVoiceBaseUrlNetworkAllowed,
65
- isStreamingVoiceModel,
66
- resolveVoiceStreamConfig,
67
- resolveVoiceTranscriptionConfig,
68
- sanitizeVoiceErrorMessage,
69
- transcribeVoiceAudio
70
- } from "./chunk-B5FOCTEZ.js";
71
- import {
72
- isVoiceEnabled,
73
- isVoiceMode,
74
- readVoiceModel
75
- } from "./chunk-3QDZDAJG.js";
76
- import "./chunk-E7KNELIZ.js";
77
- import {
78
- WorkspacePermissionRulesSessionRequiredError,
79
- WorkspaceSettingsPartialPersistError
80
- } from "./chunk-BMFMJINR.js";
81
29
  import {
82
30
  CAPABILITIES_SCHEMA_VERSION,
83
31
  CLIENT_ID_HEADER,
@@ -123,28 +71,84 @@ import {
123
71
  setRateLimiter,
124
72
  unsafeRevealSecret,
125
73
  validateMcpRuntimeServerName
126
- } from "./chunk-RFIL6REB.js";
74
+ } from "./chunk-YKZIAK7C.js";
127
75
  import {
128
76
  isLoopbackBind
129
77
  } from "./chunk-RNBYOUGV.js";
130
78
  import "./chunk-3HX5LZ6R.js";
131
79
  import "./chunk-7RYW5LQV.js";
132
80
  import {
133
- getDialogSettingKeys,
134
- getNestedProperty,
135
- getSettingDefinition,
136
- loadSettings,
137
- validateSettingValue
138
- } from "./chunk-QHT5USLK.js";
81
+ createDaemonStatusProvider
82
+ } from "./chunk-L46XKEGM.js";
83
+ import "./chunk-JZHIQJOE.js";
84
+ import "./chunk-KHDZHZMH.js";
139
85
  import {
140
- SUPPORTED_LANGUAGES
141
- } from "./chunk-TBLJNMI7.js";
142
- import "./chunk-TLRYABYP.js";
143
- import "./chunk-4RQIB5UZ.js";
86
+ createWorkspaceProvidersStatusProvider
87
+ } from "./chunk-SQ2UATK7.js";
88
+ import {
89
+ getAuthTypeFromEnv,
90
+ resolveCliGenerationConfig
91
+ } from "./chunk-DIWVZ3VM.js";
92
+ import {
93
+ snapshotProcessEnv
94
+ } from "./chunk-O7FIRWJV.js";
95
+ import {
96
+ createWorkspaceSkillsStatusProvider
97
+ } from "./chunk-OQXDAMKY.js";
98
+ import "./chunk-6IAWPIQ6.js";
99
+ import {
100
+ EMPTY_WORKSPACE_VOICE_UPDATE_ERROR,
101
+ WorkspaceVoiceError,
102
+ buildWorkspaceVoiceSettingsWrites,
103
+ buildWorkspaceVoiceStatus,
104
+ createDaemonWorkspaceService,
105
+ hasConfiguredBatchVoiceTranscriptionModel,
106
+ transcribeWorkspaceVoiceAudio,
107
+ validateWorkspaceVoiceState,
108
+ voiceSettingsScopeToWire
109
+ } from "./chunk-YHKAK72D.js";
110
+ import {
111
+ PermissionRulesValidationError,
112
+ buildPermissionSettings,
113
+ isPermissionRuleType,
114
+ normalizePermissionRules,
115
+ readPermissionRuleSet
116
+ } from "./chunk-JRQ7EVGE.js";
117
+ import {
118
+ assertVoiceBaseUrlNetworkAllowed,
119
+ isStreamingVoiceModel,
120
+ resolveVoiceStreamConfig,
121
+ resolveVoiceTranscriptionConfig,
122
+ sanitizeVoiceErrorMessage,
123
+ transcribeVoiceAudio
124
+ } from "./chunk-VGGOPZUL.js";
125
+ import {
126
+ isVoiceEnabled,
127
+ isVoiceMode,
128
+ readVoiceModel
129
+ } from "./chunk-ZE6E424U.js";
130
+ import "./chunk-E7KNELIZ.js";
131
+ import {
132
+ WorkspacePermissionRulesSessionRequiredError,
133
+ WorkspaceSettingsPartialPersistError
134
+ } from "./chunk-BMFMJINR.js";
135
+ import {
136
+ createTotalSessionAdmissionController
137
+ } from "./chunk-ZL5HN75Q.js";
138
+ import {
139
+ createSingleWorkspaceRegistry
140
+ } from "./chunk-XNXVCNAT.js";
141
+ import "./chunk-V35MD7KN.js";
144
142
  import {
145
143
  SessionArtifactValidationError,
146
144
  createAcpSessionBridge
147
- } from "./chunk-OU6FPTJZ.js";
145
+ } from "./chunk-PMFULMLX.js";
146
+ import "./chunk-AGHU5VRK.js";
147
+ import {
148
+ EVENT_SCHEMA_VERSION,
149
+ SubscriberLimitExceededError
150
+ } from "./chunk-3UP777ZS.js";
151
+ import "./chunk-GLE2YUPU.js";
148
152
  import "./chunk-P7M4GA57.js";
149
153
  import {
150
154
  BranchWhilePromptActiveError,
@@ -169,36 +173,49 @@ import {
169
173
  SessionNotFoundError,
170
174
  SessionShellClientRequiredError,
171
175
  SessionShellDisabledError,
176
+ TotalSessionLimitExceededError,
172
177
  WorkspaceInitConflictError,
173
178
  WorkspaceInitPathEscapeError,
174
179
  WorkspaceInitRaceError,
175
180
  WorkspaceInitSymlinkError,
176
181
  WorkspaceMismatchError
177
- } from "./chunk-B34OV7K2.js";
178
- import "./chunk-AGHU5VRK.js";
182
+ } from "./chunk-GGQQA4JW.js";
179
183
  import {
180
184
  MAX_WORKSPACE_PATH_LENGTH,
181
185
  canonicalizeWorkspace,
182
186
  canonicalizeWorkspaces
183
187
  } from "./chunk-ER3BKOLB.js";
184
188
  import {
185
- EVENT_SCHEMA_VERSION,
186
- SubscriberLimitExceededError
187
- } from "./chunk-G7ZG7CA6.js";
189
+ QWEN_SERVER_TOKEN_ENV
190
+ } from "./chunk-S6RLAIUR.js";
188
191
  import "./chunk-VRDMOSQS.js";
189
- import "./chunk-K34DD7FH.js";
192
+ import {
193
+ getDialogSettingKeys,
194
+ getNestedProperty,
195
+ getSettingDefinition,
196
+ loadSettings,
197
+ validateSettingValue
198
+ } from "./chunk-M7S4GK5Z.js";
199
+ import {
200
+ SUPPORTED_LANGUAGES
201
+ } from "./chunk-O33TBKDC.js";
202
+ import "./chunk-TLRYABYP.js";
203
+ import "./chunk-BOBRZZKD.js";
204
+ import "./chunk-O2YT7VB4.js";
205
+ import "./chunk-Z3I3QJK3.js";
206
+ import "./chunk-BOBOCR5H.js";
190
207
  import "./chunk-EXPMGZZV.js";
191
208
  import {
192
209
  STATUS_SCHEMA_VERSION,
193
210
  createIdleWorkspaceMemoryStatus,
194
211
  mapDomainErrorToErrorKind
195
- } from "./chunk-ME344634.js";
212
+ } from "./chunk-LAXNEOBG.js";
196
213
  import "./chunk-HLKG6CZN.js";
197
- import "./chunk-XUSONNJ4.js";
214
+ import "./chunk-UXEW557D.js";
198
215
  import "./chunk-43W4YSO6.js";
199
216
  import {
200
217
  getWorkspaceTrustStatus
201
- } from "./chunk-MOQOAH7N.js";
218
+ } from "./chunk-DICGXFAI.js";
202
219
  import {
203
220
  writeStderrLine
204
221
  } from "./chunk-Y6Z2O3WR.js";
@@ -232,13 +249,13 @@ import {
232
249
  encodeTextFileContent,
233
250
  glob,
234
251
  loadIgnoreRules,
235
- loadUsageHistory,
252
+ loadUsageHistoryWithLive,
236
253
  parseInstallSource,
237
254
  redactUrlCredentials,
238
255
  shouldShowStep,
239
256
  stripTerminalControlSequences,
240
257
  writeWorkspaceContextFile
241
- } from "./chunk-E7HM76PR.js";
258
+ } from "./chunk-3GNOQZDC.js";
242
259
  import "./chunk-5P5XGNYH.js";
243
260
  import "./chunk-SKAZWEV5.js";
244
261
  import "./chunk-K5PGHDBN.js";
@@ -269,7 +286,7 @@ import {
269
286
  APPROVAL_MODES,
270
287
  SubagentError,
271
288
  SubagentErrorCode
272
- } from "./chunk-VEB3NYSO.js";
289
+ } from "./chunk-5MBO76SL.js";
273
290
  import "./chunk-GO6LNQXT.js";
274
291
  import "./chunk-NQKLOAVJ.js";
275
292
  import "./chunk-WMPVYQ4P.js";
@@ -288,12 +305,12 @@ import {
288
305
  recordDaemonHttpRequest,
289
306
  recordDaemonHttpResponse,
290
307
  withDaemonRequestSpan
291
- } from "./chunk-7I4MGFBN.js";
308
+ } from "./chunk-BUZ6HGL4.js";
292
309
  import "./chunk-E6US47KI.js";
293
310
  import "./chunk-UWCTAVOD.js";
294
311
  import "./chunk-OFEVLU4C.js";
295
312
  import "./chunk-OMX7CUOE.js";
296
- import "./chunk-4KJ2BPIT.js";
313
+ import "./chunk-OACJLMLD.js";
297
314
  import "./chunk-SUAKHHK7.js";
298
315
  import "./chunk-FEJ2FZ3U.js";
299
316
  import "./chunk-X3YGAX7V.js";
@@ -350,9 +367,6 @@ import { createHash as createHash3, timingSafeEqual } from "node:crypto";
350
367
  init_esbuild_shims();
351
368
  import path8 from "node:path";
352
369
 
353
- // packages/cli/src/serve/acp-session-bridge.ts
354
- init_esbuild_shims();
355
-
356
370
  // packages/cli/src/serve/fs/errors.ts
357
371
  init_esbuild_shims();
358
372
  var DEFAULT_STATUS_BY_KIND = {
@@ -3252,7 +3266,8 @@ function cloneTask(task) {
3252
3266
  removedEntries: task.result.removedEntries.map((entry) => ({
3253
3267
  ...entry
3254
3268
  })),
3255
- touchedTopics: [...task.result.touchedTopics]
3269
+ touchedTopics: [...task.result.touchedTopics],
3270
+ touchedScopes: [...task.result.touchedScopes]
3256
3271
  } : void 0
3257
3272
  };
3258
3273
  }
@@ -3457,7 +3472,8 @@ var WorkspaceRememberTaskLane = class _WorkspaceRememberTaskLane {
3457
3472
  task.result = {
3458
3473
  summary: result.summary ?? formatWorkspaceMemoryForgetSummary(result.removedEntries.length),
3459
3474
  removedEntries: result.removedEntries,
3460
- touchedTopics: result.touchedTopics
3475
+ touchedTopics: result.touchedTopics,
3476
+ touchedScopes: result.touchedScopes
3461
3477
  };
3462
3478
  task.updatedAt = nowIso();
3463
3479
  } catch (err) {
@@ -3479,7 +3495,7 @@ var WorkspaceRememberTaskLane = class _WorkspaceRememberTaskLane {
3479
3495
  this.publishManagedMemoryChanged({
3480
3496
  source: "workspace_memory_forget",
3481
3497
  taskId: task.taskId,
3482
- touchedScopes: touchedScopesFromTopics(task.result.touchedTopics),
3498
+ touchedScopes: task.result.touchedScopes,
3483
3499
  ...params.originatorClientId ? { originatorClientId: params.originatorClientId } : {}
3484
3500
  });
3485
3501
  }
@@ -5720,7 +5736,27 @@ function toRpcError(err) {
5720
5736
  case "InvalidClientIdError":
5721
5737
  return { code: RPC.INVALID_PARAMS, message: errMsg(err) };
5722
5738
  case "SessionLimitExceededError":
5723
- return { code: RPC.INTERNAL_ERROR, message: errMsg(err) };
5739
+ return {
5740
+ code: RPC.INTERNAL_ERROR,
5741
+ message: errMsg(err),
5742
+ data: {
5743
+ errorKind: "session_limit_exceeded",
5744
+ limit: err.limit,
5745
+ scope: "workspace",
5746
+ retryable: true
5747
+ }
5748
+ };
5749
+ case "TotalSessionLimitExceededError":
5750
+ return {
5751
+ code: RPC.INTERNAL_ERROR,
5752
+ message: errMsg(err),
5753
+ data: {
5754
+ errorKind: "session_limit_exceeded",
5755
+ limit: err.limit,
5756
+ scope: err.scope,
5757
+ retryable: true
5758
+ }
5759
+ };
5724
5760
  case "PromptQueueFullError": {
5725
5761
  const promptErr = err;
5726
5762
  return {
@@ -11447,14 +11483,14 @@ function readVoiceModel2(settings) {
11447
11483
  return trimmed.length > 0 ? trimmed : void 0;
11448
11484
  }
11449
11485
  __name(readVoiceModel2, "readVoiceModel");
11450
- function buildModelsConfig(settings) {
11486
+ function buildModelsConfig(settings, env) {
11451
11487
  const merged = settings.merged;
11452
- const selectedAuthType = merged.security?.auth?.selectedType ?? getAuthTypeFromEnv();
11488
+ const selectedAuthType = merged.security?.auth?.selectedType ?? getAuthTypeFromEnv(env);
11453
11489
  const resolvedCliConfig = resolveCliGenerationConfig({
11454
11490
  argv: {},
11455
11491
  settings: merged,
11456
11492
  selectedAuthType,
11457
- env: process.env
11493
+ env
11458
11494
  });
11459
11495
  return new ModelsConfig({
11460
11496
  initialAuthType: selectedAuthType,
@@ -11464,17 +11500,29 @@ function buildModelsConfig(settings) {
11464
11500
  });
11465
11501
  }
11466
11502
  __name(buildModelsConfig, "buildModelsConfig");
11467
- function loadDaemonVoiceContext(workspaceCwd) {
11468
- const settings = loadSettings(workspaceCwd);
11503
+ function loadDaemonVoiceContext(workspaceCwd, options = {}) {
11504
+ const settings = loadSettings(
11505
+ workspaceCwd,
11506
+ options.env ? { skipLoadEnvironment: true } : true
11507
+ );
11469
11508
  const voiceModel = readVoiceModel2(settings);
11470
11509
  if (!voiceModel) {
11471
11510
  throw new Error("No voice model is configured for this workspace.");
11472
11511
  }
11473
- const models = buildModelsConfig(settings);
11474
- resolveVoiceTranscriptionConfig({ config: models, settings, voiceModel });
11512
+ const models = buildModelsConfig(
11513
+ settings,
11514
+ options.env ?? snapshotProcessEnv()
11515
+ );
11516
+ resolveVoiceTranscriptionConfig({
11517
+ config: models,
11518
+ settings,
11519
+ voiceModel,
11520
+ env: options.env
11521
+ });
11475
11522
  return {
11476
11523
  settings,
11477
11524
  models,
11525
+ ...options.env ? { env: options.env } : {},
11478
11526
  voiceModel,
11479
11527
  streaming: isStreamingVoiceModel(voiceModel)
11480
11528
  };
@@ -11514,7 +11562,8 @@ async function defaultOpenStream(ctx, callbacks) {
11514
11562
  const cfg = resolveVoiceStreamConfig({
11515
11563
  config: ctx.models,
11516
11564
  settings: ctx.settings,
11517
- voiceModel: ctx.voiceModel
11565
+ voiceModel: ctx.voiceModel,
11566
+ env: ctx.env
11518
11567
  });
11519
11568
  await assertVoiceBaseUrlNetworkAllowed(cfg);
11520
11569
  return await openVoiceStreamWithRetry(
@@ -11529,7 +11578,12 @@ __name(defaultOpenStream, "defaultOpenStream");
11529
11578
  function defaultTranscribe(ctx, pcm) {
11530
11579
  return transcribeVoiceAudio(
11531
11580
  { data: encodeWav(pcm), mimeType: "audio/wav" },
11532
- { config: ctx.models, settings: ctx.settings, voiceModel: ctx.voiceModel }
11581
+ {
11582
+ config: ctx.models,
11583
+ settings: ctx.settings,
11584
+ voiceModel: ctx.voiceModel,
11585
+ env: ctx.env
11586
+ }
11533
11587
  ).catch((error2) => {
11534
11588
  debugLogger3.debug(
11535
11589
  `[voice-ws] batch transcription error: ${errMessage(error2)}`
@@ -11568,7 +11622,7 @@ function parseControl(text) {
11568
11622
  }
11569
11623
  __name(parseControl, "parseControl");
11570
11624
  function createVoiceWsConnectionHandler(boundWorkspace, deps = {}) {
11571
- const loadContext = deps.loadContext ?? loadDaemonVoiceContext;
11625
+ const loadContext = deps.loadContext ?? ((workspaceCwd) => loadDaemonVoiceContext(workspaceCwd, { env: deps.env }));
11572
11626
  const openStream = deps.openStream ?? defaultOpenStream;
11573
11627
  const transcribe = deps.transcribe ?? defaultTranscribe;
11574
11628
  let activeSessions = 0;
@@ -11976,6 +12030,7 @@ function registerDaemonStatusRoutes(app, deps) {
11976
12030
  opts: deps.opts,
11977
12031
  boundWorkspace: deps.boundWorkspace,
11978
12032
  bridge: deps.bridge,
12033
+ workspaceRegistry: deps.workspaceRegistry,
11979
12034
  workspace: deps.workspace,
11980
12035
  daemonLog: deps.daemonLog,
11981
12036
  startup: deps.startup,
@@ -11990,7 +12045,8 @@ function registerDaemonStatusRoutes(app, deps) {
11990
12045
  sessionShellCommandEnabled: deps.sessionShellCommandEnabled,
11991
12046
  getChannelWorkerSnapshot: deps.getChannelWorkerSnapshot,
11992
12047
  getPerfSnapshot: deps.getPerfSnapshot,
11993
- getMetricsSeries: deps.getMetricsSeries
12048
+ getMetricsSeries: deps.getMetricsSeries,
12049
+ getTotalSessionAdmissionSnapshot: deps.getTotalSessionAdmissionSnapshot
11994
12050
  })
11995
12051
  );
11996
12052
  } catch (err) {
@@ -14282,8 +14338,88 @@ __name(registerWorkspaceTrustRoutes, "registerWorkspaceTrustRoutes");
14282
14338
 
14283
14339
  // packages/cli/src/serve/routes/permission.ts
14284
14340
  init_esbuild_shims();
14341
+
14342
+ // packages/cli/src/serve/routes/session-runtime.ts
14343
+ init_esbuild_shims();
14344
+ function requireSessionRuntime(opts) {
14345
+ const {
14346
+ sessionId,
14347
+ route,
14348
+ res,
14349
+ workspaceRegistry,
14350
+ daemonLog,
14351
+ details = {}
14352
+ } = opts;
14353
+ if (workspaceRegistry.list().length === 1) {
14354
+ return workspaceRegistry.primary;
14355
+ }
14356
+ const resolution = workspaceRegistry.resolveLiveSessionOwner(sessionId);
14357
+ if (resolution.kind === "found") {
14358
+ const runtime = resolution.runtime;
14359
+ if (!runtime.primary && !runtime.trusted) {
14360
+ daemonLog?.warn("session routing failed", {
14361
+ route,
14362
+ resolutionKind: "untrusted_workspace",
14363
+ sessionId,
14364
+ workspaceId: runtime.workspaceId,
14365
+ workspaceCwd: runtime.workspaceCwd,
14366
+ ...details
14367
+ });
14368
+ res.status(403).json({
14369
+ error: `Workspace "${runtime.workspaceCwd}" is not trusted.`,
14370
+ code: "untrusted_workspace",
14371
+ sessionId,
14372
+ workspaceId: runtime.workspaceId,
14373
+ workspaceCwd: runtime.workspaceCwd
14374
+ });
14375
+ return void 0;
14376
+ }
14377
+ return runtime;
14378
+ }
14379
+ if (resolution.kind === "not_found") {
14380
+ daemonLog?.warn("session routing failed", {
14381
+ route,
14382
+ resolutionKind: "not_found",
14383
+ sessionId,
14384
+ ...details
14385
+ });
14386
+ res.status(404).json({
14387
+ error: `No session with id "${sessionId}"`,
14388
+ code: "session_not_found",
14389
+ sessionId
14390
+ });
14391
+ return void 0;
14392
+ }
14393
+ const workspaceIds = resolution.runtimes.map(
14394
+ (runtime) => runtime.workspaceId
14395
+ );
14396
+ daemonLog?.warn("session routing failed", {
14397
+ route,
14398
+ resolutionKind: "ambiguous",
14399
+ sessionId,
14400
+ workspaceIds,
14401
+ ...details
14402
+ });
14403
+ res.status(500).json({
14404
+ error: `Session owner is ambiguous for "${sessionId}"`,
14405
+ code: "ambiguous_session_owner",
14406
+ sessionId,
14407
+ route,
14408
+ workspaceIds
14409
+ });
14410
+ return void 0;
14411
+ }
14412
+ __name(requireSessionRuntime, "requireSessionRuntime");
14413
+
14414
+ // packages/cli/src/serve/routes/permission.ts
14285
14415
  function registerPermissionRoutes(app, deps) {
14286
- const { bridge, mutate, sendPermissionVoteError: sendPermissionVoteError2 } = deps;
14416
+ const {
14417
+ bridge,
14418
+ workspaceRegistry,
14419
+ daemonLog,
14420
+ mutate,
14421
+ sendPermissionVoteError: sendPermissionVoteError2
14422
+ } = deps;
14287
14423
  app.post("/session/:id/permission/:requestId", mutate(), (req, res) => {
14288
14424
  const sessionId = req.params["id"];
14289
14425
  const requestId = req.params["requestId"];
@@ -14298,7 +14434,16 @@ function registerPermissionRoutes(app, deps) {
14298
14434
  };
14299
14435
  let accepted;
14300
14436
  try {
14301
- accepted = bridge.respondToSessionPermission(
14437
+ const runtime = requireSessionRuntime({
14438
+ sessionId,
14439
+ route: "POST /session/:id/permission/:requestId",
14440
+ res,
14441
+ workspaceRegistry,
14442
+ daemonLog,
14443
+ details: { requestId }
14444
+ });
14445
+ if (!runtime) return;
14446
+ accepted = runtime.bridge.respondToSessionPermission(
14302
14447
  sessionId,
14303
14448
  requestId,
14304
14449
  response,
@@ -14425,6 +14570,25 @@ function encodeOrganizedCursor(last, group, archiveState) {
14425
14570
  ).toString("base64url");
14426
14571
  }
14427
14572
  __name(encodeOrganizedCursor, "encodeOrganizedCursor");
14573
+ function parseLiveSessionCursor(cursor) {
14574
+ if (cursor === "") return void 0;
14575
+ try {
14576
+ const parsed = JSON.parse(
14577
+ Buffer.from(cursor, "base64url").toString("utf8")
14578
+ );
14579
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed) || typeof parsed.activityTime !== "number" || !Number.isFinite(parsed.activityTime) || typeof parsed.sessionId !== "string" || parsed.sessionId.length === 0) {
14580
+ throw new Error("invalid live cursor");
14581
+ }
14582
+ return parsed;
14583
+ } catch {
14584
+ throw new InvalidCursorError(cursor, "live");
14585
+ }
14586
+ }
14587
+ __name(parseLiveSessionCursor, "parseLiveSessionCursor");
14588
+ function encodeLiveSessionCursor(last) {
14589
+ return Buffer.from(JSON.stringify(last), "utf8").toString("base64url");
14590
+ }
14591
+ __name(encodeLiveSessionCursor, "encodeLiveSessionCursor");
14428
14592
  function toSummary2(item) {
14429
14593
  return {
14430
14594
  sessionId: item.sessionId,
@@ -14470,6 +14634,19 @@ function getSummaryActivityTime(session) {
14470
14634
  return Number.isFinite(time) ? time : 0;
14471
14635
  }
14472
14636
  __name(getSummaryActivityTime, "getSummaryActivityTime");
14637
+ function getLiveSessionCursorKey(session) {
14638
+ return {
14639
+ activityTime: getSummaryActivityTime(session),
14640
+ sessionId: session.sessionId
14641
+ };
14642
+ }
14643
+ __name(getLiveSessionCursorKey, "getLiveSessionCursorKey");
14644
+ function compareLiveSessionCursorKeys(a, b) {
14645
+ const byTime = b.activityTime - a.activityTime;
14646
+ if (byTime !== 0) return byTime;
14647
+ return a.sessionId.localeCompare(b.sessionId);
14648
+ }
14649
+ __name(compareLiveSessionCursorKeys, "compareLiveSessionCursorKeys");
14473
14650
  function compareOrganizedSessions(activityTimeById, a, b) {
14474
14651
  return compareOrganizedCursorKeys(
14475
14652
  getOrganizedCursorKey(activityTimeById, a),
@@ -14677,6 +14854,31 @@ async function listWorkspaceSessionsForResponse(bridge, workspaceCwd, options) {
14677
14854
  return { sessions, nextCursor };
14678
14855
  }
14679
14856
  __name(listWorkspaceSessionsForResponse, "listWorkspaceSessionsForResponse");
14857
+ function listLiveWorkspaceSessionsForResponse(bridge, workspaceCwd, options) {
14858
+ const rawSize = options?.size;
14859
+ const requestedSize = typeof rawSize === "number" && Number.isSafeInteger(rawSize) ? rawSize : DEFAULT_SESSION_PAGE_SIZE;
14860
+ const pageSize = Math.min(Math.max(requestedSize, 1), MAX_SESSION_PAGE_SIZE);
14861
+ const cursorKey = options?.cursor !== void 0 ? parseLiveSessionCursor(options.cursor) : void 0;
14862
+ const sessions = bridge.listWorkspaceSessions(workspaceCwd).sort(
14863
+ (a, b) => compareLiveSessionCursorKeys(
14864
+ getLiveSessionCursorKey(a),
14865
+ getLiveSessionCursorKey(b)
14866
+ )
14867
+ );
14868
+ const afterCursor = cursorKey === void 0 ? sessions : sessions.filter(
14869
+ (session) => compareLiveSessionCursorKeys(
14870
+ cursorKey,
14871
+ getLiveSessionCursorKey(session)
14872
+ ) < 0
14873
+ );
14874
+ const page = afterCursor.slice(0, pageSize);
14875
+ const nextCursor = page.length < afterCursor.length ? encodeLiveSessionCursor(getLiveSessionCursorKey(page[page.length - 1])) : void 0;
14876
+ return {
14877
+ sessions: page,
14878
+ ...nextCursor !== void 0 ? { nextCursor } : {}
14879
+ };
14880
+ }
14881
+ __name(listLiveWorkspaceSessionsForResponse, "listLiveWorkspaceSessionsForResponse");
14680
14882
  function parseSessionPageSizeQuery(raw) {
14681
14883
  if (typeof raw !== "string") return void 0;
14682
14884
  const trimmed = raw.trim();
@@ -14780,6 +14982,7 @@ function registerSessionRoutes(app, deps) {
14780
14982
  const {
14781
14983
  boundWorkspace,
14782
14984
  bridge,
14985
+ workspaceRegistry,
14783
14986
  archiveCoordinator,
14784
14987
  mutate,
14785
14988
  sendBridgeError: sendBridgeError2,
@@ -14788,6 +14991,158 @@ function registerSessionRoutes(app, deps) {
14788
14991
  sessionShellCommandEnabled
14789
14992
  } = deps;
14790
14993
  const LANGUAGE_CODES = deps.languageCodes;
14994
+ const logSessionRoutingFailure = /* @__PURE__ */ __name((route, resolutionKind, details = {}) => {
14995
+ daemonLog?.warn("session routing failed", {
14996
+ route,
14997
+ resolutionKind,
14998
+ ...details
14999
+ });
15000
+ }, "logSessionRoutingFailure");
15001
+ const sendWorkspaceMismatch = /* @__PURE__ */ __name((res, requestedWorkspace) => {
15002
+ const runtimes = workspaceRegistry.list();
15003
+ if (runtimes.length > 1) {
15004
+ res.status(400).json({
15005
+ error: `Workspace mismatch: daemon is bound to ${runtimes.length} workspaces; none matched the requested workspace.`,
15006
+ code: "workspace_mismatch",
15007
+ boundWorkspace,
15008
+ workspaceCount: runtimes.length,
15009
+ requestedWorkspace
15010
+ });
15011
+ return;
15012
+ }
15013
+ res.status(400).json({
15014
+ error: `Workspace mismatch: daemon is bound to "${boundWorkspace}"`,
15015
+ code: "workspace_mismatch",
15016
+ boundWorkspace,
15017
+ requestedWorkspace
15018
+ });
15019
+ }, "sendWorkspaceMismatch");
15020
+ const resolveRuntimeForSessionCreation = /* @__PURE__ */ __name((body, res) => {
15021
+ const cwd = parseOptionalWorkspaceCwd(body, boundWorkspace, res);
15022
+ if (cwd === void 0) return void 0;
15023
+ let key;
15024
+ try {
15025
+ key = canonicalizeWorkspace(cwd);
15026
+ } catch (err) {
15027
+ if (workspaceRegistry.list().length > 1 && "cwd" in body) {
15028
+ logSessionRoutingFailure("POST /session", "workspace_mismatch", {
15029
+ requestedWorkspace: cwd
15030
+ });
15031
+ sendWorkspaceMismatch(res, cwd);
15032
+ return void 0;
15033
+ }
15034
+ sendBridgeError2(res, err, { route: "POST /session" });
15035
+ return void 0;
15036
+ }
15037
+ if (workspaceRegistry.list().length === 1) {
15038
+ return {
15039
+ runtime: workspaceRegistry.primary,
15040
+ workspaceCwd: "cwd" in body ? key : workspaceRegistry.primary.workspaceCwd
15041
+ };
15042
+ }
15043
+ const runtime = workspaceRegistry.resolveWorkspaceCwd(
15044
+ "cwd" in body ? key : void 0
15045
+ );
15046
+ if (!runtime) {
15047
+ logSessionRoutingFailure("POST /session", "workspace_mismatch", {
15048
+ requestedWorkspace: key
15049
+ });
15050
+ sendWorkspaceMismatch(res, key);
15051
+ return void 0;
15052
+ }
15053
+ if (!runtime.primary && !runtime.trusted) {
15054
+ logSessionRoutingFailure("POST /session", "untrusted_workspace", {
15055
+ workspaceId: runtime.workspaceId,
15056
+ workspaceCwd: runtime.workspaceCwd
15057
+ });
15058
+ res.status(403).json({
15059
+ error: `Workspace "${runtime.workspaceCwd}" is not trusted.`,
15060
+ code: "untrusted_workspace",
15061
+ workspaceCwd: runtime.workspaceCwd
15062
+ });
15063
+ return void 0;
15064
+ }
15065
+ return { runtime, workspaceCwd: runtime.workspaceCwd };
15066
+ }, "resolveRuntimeForSessionCreation");
15067
+ const resolveRuntimeFromWorkspaceParam = /* @__PURE__ */ __name((req, res) => {
15068
+ const workspaceParam = req.params["id"] ?? "";
15069
+ const byId = workspaceRegistry.getByWorkspaceId(workspaceParam);
15070
+ if (byId) return byId;
15071
+ if (!path10.isAbsolute(workspaceParam)) {
15072
+ res.status(400).json({
15073
+ error: "`:id` must decode to a workspace id or absolute path"
15074
+ });
15075
+ return null;
15076
+ }
15077
+ let key;
15078
+ try {
15079
+ key = canonicalizeWorkspace(workspaceParam);
15080
+ } catch {
15081
+ sendWorkspaceMismatch(res, workspaceParam);
15082
+ return null;
15083
+ }
15084
+ const runtime = workspaceRegistry.getByWorkspaceCwd(key);
15085
+ if (!runtime) {
15086
+ sendWorkspaceMismatch(res, key);
15087
+ return null;
15088
+ }
15089
+ return runtime;
15090
+ }, "resolveRuntimeFromWorkspaceParam");
15091
+ const resolvePrimaryOnlyWorkspaceCwd = /* @__PURE__ */ __name((cwd, res, route) => {
15092
+ let key;
15093
+ try {
15094
+ key = canonicalizeWorkspace(cwd);
15095
+ } catch (err) {
15096
+ sendBridgeError2(res, err, { route });
15097
+ return void 0;
15098
+ }
15099
+ if (key !== boundWorkspace) {
15100
+ const runtime = workspaceRegistry.getByWorkspaceCwd(key);
15101
+ if (runtime && !runtime.primary) {
15102
+ res.status(400).json({
15103
+ error: "Non-primary persisted session load/resume is not supported in Phase 2a.",
15104
+ code: "secondary_workspace_load_not_supported",
15105
+ workspaceCwd: runtime.workspaceCwd,
15106
+ workspaceId: runtime.workspaceId,
15107
+ route
15108
+ });
15109
+ return void 0;
15110
+ }
15111
+ sendWorkspaceMismatch(res, key);
15112
+ return void 0;
15113
+ }
15114
+ return key;
15115
+ }, "resolvePrimaryOnlyWorkspaceCwd");
15116
+ const resolveLiveSessionRuntime = /* @__PURE__ */ __name((sessionId, res, route) => requireSessionRuntime({
15117
+ sessionId,
15118
+ route,
15119
+ res,
15120
+ workspaceRegistry,
15121
+ daemonLog
15122
+ }), "resolveLiveSessionRuntime");
15123
+ const sendNonPrimarySessionRouteUnsupported = /* @__PURE__ */ __name((res, route, sessionId, runtime) => {
15124
+ res.status(400).json({
15125
+ error: `Route "${route}" is primary-only for non-primary workspace sessions in Phase 2a.`,
15126
+ code: "non_primary_session_route_not_supported",
15127
+ sessionId,
15128
+ workspaceId: runtime.workspaceId,
15129
+ workspaceCwd: runtime.workspaceCwd,
15130
+ route
15131
+ });
15132
+ }, "sendNonPrimarySessionRouteUnsupported");
15133
+ const withOwnerMutableSession = /* @__PURE__ */ __name((route, handler) => async (req, res) => {
15134
+ const sessionId = requireSessionId(req, res);
15135
+ if (sessionId === null) return;
15136
+ const runtime = resolveLiveSessionRuntime(sessionId, res, route);
15137
+ if (!runtime) return;
15138
+ try {
15139
+ await archiveCoordinator.runSharedMany([sessionId], async () => {
15140
+ await handler(req, res, sessionId, runtime);
15141
+ });
15142
+ } catch (err) {
15143
+ sendBridgeError2(res, err, { route, sessionId });
15144
+ }
15145
+ }, "withOwnerMutableSession");
14791
15146
  const parseSessionIdsBody = /* @__PURE__ */ __name((req, res) => {
14792
15147
  const body = safeBody(req);
14793
15148
  const sessionIds = body["sessionIds"];
@@ -14825,6 +15180,12 @@ function registerSessionRoutes(app, deps) {
14825
15180
  const withMutableSession = /* @__PURE__ */ __name((route, handler) => async (req, res) => {
14826
15181
  const sessionId = requireSessionId(req, res);
14827
15182
  if (sessionId === null) return;
15183
+ const runtime = resolveLiveSessionRuntime(sessionId, res, route);
15184
+ if (!runtime) return;
15185
+ if (!runtime.primary) {
15186
+ sendNonPrimarySessionRouteUnsupported(res, route, sessionId, runtime);
15187
+ return;
15188
+ }
14828
15189
  try {
14829
15190
  await archiveCoordinator.runSharedMany([sessionId], async () => {
14830
15191
  await handler(req, res, sessionId);
@@ -14835,8 +15196,9 @@ function registerSessionRoutes(app, deps) {
14835
15196
  }, "withMutableSession");
14836
15197
  app.post("/session", mutate(), async (req, res) => {
14837
15198
  const body = safeBody(req);
14838
- const cwd = parseOptionalWorkspaceCwd(body, boundWorkspace, res);
14839
- if (cwd === void 0) return;
15199
+ const resolvedRuntime = resolveRuntimeForSessionCreation(body, res);
15200
+ if (resolvedRuntime === void 0) return;
15201
+ const { runtime, workspaceCwd } = resolvedRuntime;
14840
15202
  const modelServiceId = typeof body["modelServiceId"] === "string" ? body["modelServiceId"] : void 0;
14841
15203
  const rawSessionScope = body["sessionScope"];
14842
15204
  let sessionScope;
@@ -14853,8 +15215,8 @@ function registerSessionRoutes(app, deps) {
14853
15215
  const clientId = parseClientIdHeader(req, res);
14854
15216
  if (clientId === null) return;
14855
15217
  try {
14856
- const session = await bridge.spawnOrAttach({
14857
- workspaceCwd: cwd,
15218
+ const session = await runtime.bridge.spawnOrAttach({
15219
+ workspaceCwd,
14858
15220
  modelServiceId,
14859
15221
  ...clientId !== void 0 ? { clientId } : {},
14860
15222
  ...sessionScope !== void 0 ? { sessionScope } : {}
@@ -14876,10 +15238,10 @@ function registerSessionRoutes(app, deps) {
14876
15238
  );
14877
15239
  }
14878
15240
  if (!session.attached) {
14879
- bridge.killSession(session.sessionId, { requireZeroAttaches: true }).catch(() => {
15241
+ runtime.bridge.killSession(session.sessionId, { requireZeroAttaches: true }).catch(() => {
14880
15242
  });
14881
15243
  } else {
14882
- bridge.detachClient(session.sessionId, session.clientId).catch(() => {
15244
+ runtime.bridge.detachClient(session.sessionId, session.clientId).catch(() => {
14883
15245
  });
14884
15246
  }
14885
15247
  return;
@@ -14895,21 +15257,27 @@ function registerSessionRoutes(app, deps) {
14895
15257
  const body = safeBody(req);
14896
15258
  const cwd = parseOptionalWorkspaceCwd(body, boundWorkspace, res);
14897
15259
  if (cwd === void 0) return;
15260
+ const primaryCwd = resolvePrimaryOnlyWorkspaceCwd(
15261
+ cwd,
15262
+ res,
15263
+ `POST /session/:id/${action}`
15264
+ );
15265
+ if (primaryCwd === void 0) return;
14898
15266
  const clientId = parseClientIdHeader(req, res);
14899
15267
  if (clientId === null) return;
14900
15268
  try {
14901
15269
  const session = await archiveCoordinator.runSharedMany(
14902
15270
  [sessionId],
14903
15271
  async () => {
14904
- await assertSessionLoadable(cwd, sessionId);
15272
+ await assertSessionLoadable(primaryCwd, sessionId);
14905
15273
  return action === "load" ? await bridge.loadSession({
14906
15274
  sessionId,
14907
- workspaceCwd: cwd,
15275
+ workspaceCwd: primaryCwd,
14908
15276
  historyReplay: "response",
14909
15277
  ...clientId !== void 0 ? { clientId } : {}
14910
15278
  }) : await bridge.resumeSession({
14911
15279
  sessionId,
14912
- workspaceCwd: cwd,
15280
+ workspaceCwd: primaryCwd,
14913
15281
  ...clientId !== void 0 ? { clientId } : {}
14914
15282
  });
14915
15283
  }
@@ -15027,8 +15395,14 @@ function registerSessionRoutes(app, deps) {
15027
15395
  app.get("/session/:id/status", (req, res) => {
15028
15396
  const sessionId = requireSessionId(req, res);
15029
15397
  if (sessionId === null) return;
15398
+ const runtime = resolveLiveSessionRuntime(
15399
+ sessionId,
15400
+ res,
15401
+ "GET /session/:id/status"
15402
+ );
15403
+ if (!runtime) return;
15030
15404
  try {
15031
- res.status(200).json(bridge.getSessionSummary(sessionId));
15405
+ res.status(200).json(runtime.bridge.getSessionSummary(sessionId));
15032
15406
  } catch (err) {
15033
15407
  sendBridgeError2(res, err, {
15034
15408
  route: "GET /session/:id/status",
@@ -15297,9 +15671,10 @@ function registerSessionRoutes(app, deps) {
15297
15671
  app.post(
15298
15672
  "/session/:id/prompt",
15299
15673
  mutate(),
15300
- withMutableSession(
15674
+ withOwnerMutableSession(
15301
15675
  "POST /session/:id/prompt",
15302
- async (req, res, sessionId) => {
15676
+ async (req, res, sessionId, runtime) => {
15677
+ const ownerBridge = runtime.bridge;
15303
15678
  const body = safeBody(req);
15304
15679
  const prompt = body["prompt"];
15305
15680
  if (!Array.isArray(prompt) || prompt.length === 0) {
@@ -15333,7 +15708,7 @@ function registerSessionRoutes(app, deps) {
15333
15708
  const promptId = crypto2.randomUUID();
15334
15709
  const forwardedBody = { ...body };
15335
15710
  delete forwardedBody["deadlineMs"];
15336
- const lastEventId = bridge.getSessionLastEventId(sessionId);
15711
+ const lastEventId = ownerBridge.getSessionLastEventId(sessionId);
15337
15712
  addDaemonRequestAttribute("qwen-code.prompt_id", promptId);
15338
15713
  const abort = new AbortController();
15339
15714
  let responseFinished = false;
@@ -15361,7 +15736,7 @@ function registerSessionRoutes(app, deps) {
15361
15736
  }
15362
15737
  let promptPromise;
15363
15738
  try {
15364
- promptPromise = bridge.sendPrompt(
15739
+ promptPromise = ownerBridge.sendPrompt(
15365
15740
  sessionId,
15366
15741
  {
15367
15742
  ...forwardedBody,
@@ -15434,25 +15809,28 @@ function registerSessionRoutes(app, deps) {
15434
15809
  app.post(
15435
15810
  "/session/:id/heartbeat",
15436
15811
  mutate(),
15437
- withMutableSession("POST /session/:id/heartbeat", (req, res, sessionId) => {
15438
- const clientId = parseClientIdHeader(req, res);
15439
- if (clientId === null) return;
15440
- const result = bridge.recordHeartbeat(
15441
- sessionId,
15442
- clientId !== void 0 ? { clientId } : void 0
15443
- );
15444
- res.status(200).json(result);
15445
- })
15812
+ withOwnerMutableSession(
15813
+ "POST /session/:id/heartbeat",
15814
+ (req, res, sessionId, runtime) => {
15815
+ const clientId = parseClientIdHeader(req, res);
15816
+ if (clientId === null) return;
15817
+ const result = runtime.bridge.recordHeartbeat(
15818
+ sessionId,
15819
+ clientId !== void 0 ? { clientId } : void 0
15820
+ );
15821
+ res.status(200).json(result);
15822
+ }
15823
+ )
15446
15824
  );
15447
15825
  app.post(
15448
15826
  "/session/:id/detach",
15449
15827
  mutate(),
15450
- withMutableSession(
15828
+ withOwnerMutableSession(
15451
15829
  "POST /session/:id/detach",
15452
- async (req, res, sessionId) => {
15830
+ async (req, res, sessionId, runtime) => {
15453
15831
  const clientId = parseClientIdHeader(req, res);
15454
15832
  if (clientId === null) return;
15455
- await bridge.detachClient(sessionId, clientId);
15833
+ await runtime.bridge.detachClient(sessionId, clientId);
15456
15834
  res.status(204).end();
15457
15835
  }
15458
15836
  )
@@ -15460,13 +15838,13 @@ function registerSessionRoutes(app, deps) {
15460
15838
  app.post(
15461
15839
  "/session/:id/cancel",
15462
15840
  mutate(),
15463
- withMutableSession(
15841
+ withOwnerMutableSession(
15464
15842
  "POST /session/:id/cancel",
15465
- async (req, res, sessionId) => {
15843
+ async (req, res, sessionId, runtime) => {
15466
15844
  const body = safeBody(req);
15467
15845
  const clientId = parseClientIdHeader(req, res);
15468
15846
  if (clientId === null) return;
15469
- await bridge.cancelSession(
15847
+ await runtime.bridge.cancelSession(
15470
15848
  sessionId,
15471
15849
  {
15472
15850
  ...body,
@@ -15485,10 +15863,16 @@ function registerSessionRoutes(app, deps) {
15485
15863
  const sessionId = req.params["id"];
15486
15864
  const clientId = parseClientIdHeader(req, res);
15487
15865
  if (clientId === null) return;
15866
+ const runtime = resolveLiveSessionRuntime(
15867
+ sessionId,
15868
+ res,
15869
+ "DELETE /session/:id"
15870
+ );
15871
+ if (!runtime) return;
15488
15872
  try {
15489
15873
  await archiveCoordinator.runExclusiveMany(
15490
15874
  [sessionId],
15491
- async () => bridge.closeSession(
15875
+ async () => runtime.bridge.closeSession(
15492
15876
  sessionId,
15493
15877
  clientId !== void 0 ? { clientId } : void 0
15494
15878
  )
@@ -15734,21 +16118,9 @@ function registerSessionRoutes(app, deps) {
15734
16118
  }
15735
16119
  );
15736
16120
  app.get("/workspace/:id/sessions", async (req, res) => {
15737
- const workspaceCwd = req.params["id"] ?? "";
15738
- if (!path10.isAbsolute(workspaceCwd)) {
15739
- res.status(400).json({ error: "`:id` must decode to an absolute workspace path" });
15740
- return;
15741
- }
15742
- const key = canonicalizeWorkspace(workspaceCwd);
15743
- if (key !== boundWorkspace) {
15744
- res.status(400).json({
15745
- error: `Workspace mismatch: daemon is bound to "${boundWorkspace}"`,
15746
- code: "workspace_mismatch",
15747
- boundWorkspace,
15748
- requestedWorkspace: key
15749
- });
15750
- return;
15751
- }
16121
+ const runtime = resolveRuntimeFromWorkspaceParam(req, res);
16122
+ if (runtime === null) return;
16123
+ const key = runtime.workspaceCwd;
15752
16124
  try {
15753
16125
  const cursor = typeof req.query["cursor"] === "string" ? req.query["cursor"] : void 0;
15754
16126
  const size = parseSessionPageSizeQuery(req.query["size"]);
@@ -15784,13 +16156,21 @@ function registerSessionRoutes(app, deps) {
15784
16156
  }
15785
16157
  archiveState = rawArchiveState;
15786
16158
  }
15787
- const result = await listWorkspaceSessionsForResponse(bridge, key, {
16159
+ if (!runtime.primary && (archiveState === "archived" || view)) {
16160
+ res.status(400).json({
16161
+ error: "Non-primary workspace session listing is live-only in Phase 2a.",
16162
+ code: "non_primary_live_sessions_only"
16163
+ });
16164
+ return;
16165
+ }
16166
+ const options = {
15788
16167
  ...cursor !== void 0 ? { cursor } : {},
15789
16168
  ...size !== void 0 ? { size } : {},
15790
16169
  ...archiveState !== void 0 ? { archiveState } : {},
15791
16170
  ...view !== void 0 ? { view } : {},
15792
16171
  ...group !== void 0 ? { group } : {}
15793
- });
16172
+ };
16173
+ const result = runtime.primary ? await listWorkspaceSessionsForResponse(runtime.bridge, key, options) : listLiveWorkspaceSessionsForResponse(runtime.bridge, key, options);
15794
16174
  res.status(200).json({
15795
16175
  sessions: result.sessions,
15796
16176
  ...result.nextCursor != null ? { nextCursor: result.nextCursor } : {},
@@ -15948,10 +16328,16 @@ function registerSessionRoutes(app, deps) {
15948
16328
  app.get("/session/:id/pending-prompts", (req, res) => {
15949
16329
  const sessionId = requireSessionId(req, res);
15950
16330
  if (sessionId === null) return;
16331
+ const runtime = resolveLiveSessionRuntime(
16332
+ sessionId,
16333
+ res,
16334
+ "GET /session/:id/pending-prompts"
16335
+ );
16336
+ if (!runtime) return;
15951
16337
  const clientId = parseClientIdHeader(req, res);
15952
16338
  if (clientId === null) return;
15953
16339
  try {
15954
- const pendingPrompts = bridge.getPendingPrompts(
16340
+ const pendingPrompts = runtime.bridge.getPendingPrompts(
15955
16341
  sessionId,
15956
16342
  clientId !== void 0 ? { clientId } : void 0
15957
16343
  );
@@ -15966,9 +16352,9 @@ function registerSessionRoutes(app, deps) {
15966
16352
  app.delete(
15967
16353
  "/session/:id/pending-prompts/:promptId",
15968
16354
  mutate(),
15969
- withMutableSession(
16355
+ withOwnerMutableSession(
15970
16356
  "DELETE /session/:id/pending-prompts/:promptId",
15971
- (req, res, sessionId) => {
16357
+ (req, res, sessionId, runtime) => {
15972
16358
  const clientId = parseClientIdHeader(req, res);
15973
16359
  if (clientId === null) return;
15974
16360
  const promptId = req.params["promptId"];
@@ -15976,7 +16362,7 @@ function registerSessionRoutes(app, deps) {
15976
16362
  res.status(400).json({ error: "`promptId` route parameter is required" });
15977
16363
  return;
15978
16364
  }
15979
- const result = bridge.removePendingPrompt(
16365
+ const result = runtime.bridge.removePendingPrompt(
15980
16366
  sessionId,
15981
16367
  promptId,
15982
16368
  clientId !== void 0 ? { clientId } : void 0
@@ -16094,7 +16480,7 @@ function registerSessionRoutes(app, deps) {
16094
16480
  );
16095
16481
  app.post(
16096
16482
  "/session/:id/approval-mode",
16097
- mutate({ strict: true }),
16483
+ mutate(),
16098
16484
  withMutableSession(
16099
16485
  "POST /session/:id/approval-mode",
16100
16486
  async (req, res, sessionId) => {
@@ -16675,7 +17061,7 @@ function parseHeatmapDays(raw) {
16675
17061
  }
16676
17062
  __name(parseHeatmapDays, "parseHeatmapDays");
16677
17063
  function registerUsageStatsRoutes(app, deps = {}) {
16678
- const loadHistory = deps.loadHistory ?? (() => loadUsageHistory(void 0, { persistRebuild: false }));
17064
+ const loadHistory = deps.loadHistory ?? (() => loadUsageHistoryWithLive());
16679
17065
  const ttlMs = deps.cacheTtlMs ?? DEFAULT_CACHE_TTL_MS;
16680
17066
  let cache = null;
16681
17067
  const getRecords = /* @__PURE__ */ __name(() => {
@@ -17148,6 +17534,7 @@ init_esbuild_shims();
17148
17534
 
17149
17535
  // packages/cli/src/serve/server/serve-features.ts
17150
17536
  init_esbuild_shims();
17537
+ var DEFAULT_MAX_SESSIONS = 20;
17151
17538
  var DEFAULT_MAX_PENDING_PROMPTS_PER_SESSION = 5;
17152
17539
  var SERVE_LANGUAGE_CODES = [
17153
17540
  ...SUPPORTED_LANGUAGES.map((language) => language.code),
@@ -17159,13 +17546,20 @@ function advertisedMaxPendingPromptsPerSession(value) {
17159
17546
  return value;
17160
17547
  }
17161
17548
  __name(advertisedMaxPendingPromptsPerSession, "advertisedMaxPendingPromptsPerSession");
17549
+ function advertisedMaxSessions(value) {
17550
+ if (value === void 0) return DEFAULT_MAX_SESSIONS;
17551
+ if (value === 0 || value === Number.POSITIVE_INFINITY) return null;
17552
+ return value;
17553
+ }
17554
+ __name(advertisedMaxSessions, "advertisedMaxSessions");
17162
17555
  function createServeFeatures(deps) {
17163
17556
  const {
17164
17557
  opts,
17165
17558
  boundWorkspace,
17166
17559
  persistSettingAvailable,
17167
17560
  reloadAvailable,
17168
- sessionShellCommandEnabled
17561
+ sessionShellCommandEnabled,
17562
+ multiWorkspaceSessionsEnabled
17169
17563
  } = deps;
17170
17564
  let cachedVoiceTranscriptionAvailable;
17171
17565
  const invalidateServeFeaturesCache = /* @__PURE__ */ __name(() => {
@@ -17188,6 +17582,7 @@ function createServeFeatures(deps) {
17188
17582
  sessionShellCommandEnabled,
17189
17583
  rateLimit: opts.rateLimit === true,
17190
17584
  reloadAvailable,
17585
+ multiWorkspaceSessionsEnabled,
17191
17586
  clientMcpOverWsEnabled: opts.clientMcpOverWs === true,
17192
17587
  cdpTunnelOverWsEnabled: opts.cdpTunnelOverWs === true,
17193
17588
  voiceTranscriptionAvailable: getCachedVoiceTranscriptionAvailable(),
@@ -17217,6 +17612,8 @@ __name(isWorkspaceVoiceTranscriptionAvailable, "isWorkspaceVoiceTranscriptionAva
17217
17612
  // packages/cli/src/serve/routes/capabilities.ts
17218
17613
  function registerCapabilitiesRoutes(app, deps) {
17219
17614
  app.get("/capabilities", (_req, res) => {
17615
+ const runtimes = deps.workspaceRegistry.list();
17616
+ const multiWorkspace = runtimes.length > 1;
17220
17617
  const envelope = {
17221
17618
  v: CAPABILITIES_SCHEMA_VERSION,
17222
17619
  protocolVersions: getServeProtocolVersions(),
@@ -17224,8 +17621,8 @@ function registerCapabilitiesRoutes(app, deps) {
17224
17621
  mode: deps.mode,
17225
17622
  features: deps.currentServeFeatures(),
17226
17623
  modelServices: [],
17227
- // Surface the bound workspace so clients can detect mismatch pre-flight
17228
- // and omit `cwd` on `POST /session`.
17624
+ // Surface the primary workspace so clients can omit `cwd` on
17625
+ // `POST /session`; multi-workspace clients use `workspaces[]`.
17229
17626
  workspaceCwd: deps.boundWorkspace,
17230
17627
  // Advertise supported transport families so SDK clients can
17231
17628
  // auto-negotiate the best available transport via negotiateTransport().
@@ -17235,8 +17632,22 @@ function registerCapabilitiesRoutes(app, deps) {
17235
17632
  limits: {
17236
17633
  maxPendingPromptsPerSession: advertisedMaxPendingPromptsPerSession(
17237
17634
  deps.maxPendingPromptsPerSession
17238
- )
17635
+ ),
17636
+ ...multiWorkspace ? {
17637
+ maxSessionsPerWorkspace: advertisedMaxSessions(
17638
+ deps.maxSessionsPerWorkspace
17639
+ ),
17640
+ maxTotalSessions: deps.maxTotalSessions === void 0 || deps.maxTotalSessions === 0 || deps.maxTotalSessions === Number.POSITIVE_INFINITY ? null : deps.maxTotalSessions
17641
+ } : {}
17239
17642
  },
17643
+ ...multiWorkspace ? {
17644
+ workspaces: runtimes.map((runtime) => ({
17645
+ id: runtime.workspaceId,
17646
+ cwd: runtime.workspaceCwd,
17647
+ primary: runtime.primary,
17648
+ trusted: runtime.trusted
17649
+ }))
17650
+ } : {},
17240
17651
  supportedLanguages: deps.languageCodes
17241
17652
  };
17242
17653
  res.status(200).json(envelope);
@@ -17760,7 +18171,28 @@ function sendBridgeError(res, err, ctx, daemonLog) {
17760
18171
  res.status(503).json({
17761
18172
  error: err.message,
17762
18173
  code: "session_limit_exceeded",
17763
- limit: err.limit
18174
+ limit: err.limit,
18175
+ scope: "workspace"
18176
+ });
18177
+ return;
18178
+ }
18179
+ if (err instanceof TotalSessionLimitExceededError) {
18180
+ const totalSessionError = err;
18181
+ daemonLog?.warn("total session admission rejected", {
18182
+ ...ctx?.route ? { route: ctx.route } : {},
18183
+ ...ctx?.sessionId ? { sessionId: ctx.sessionId } : {},
18184
+ limit: totalSessionError.limit,
18185
+ scope: totalSessionError.scope,
18186
+ ...totalSessionError.operation ? { operation: totalSessionError.operation } : {},
18187
+ ...totalSessionError.workspaceCwd ? { workspaceCwd: totalSessionError.workspaceCwd } : {},
18188
+ ...totalSessionError.sourceSessionId ? { sourceSessionId: totalSessionError.sourceSessionId } : {}
18189
+ });
18190
+ res.set("Retry-After", "5");
18191
+ res.status(503).json({
18192
+ error: err.message,
18193
+ code: "session_limit_exceeded",
18194
+ limit: err.limit,
18195
+ scope: err.scope
17764
18196
  });
17765
18197
  return;
17766
18198
  }
@@ -17962,7 +18394,7 @@ data: ${dataJson}
17962
18394
  }
17963
18395
  __name(formatSseFrame, "formatSseFrame");
17964
18396
  function registerSseEventsRoutes(app, deps) {
17965
- const { bridge, daemonLog, sendBridgeError: sendBridgeError2, writerIdleTimeoutMs } = deps;
18397
+ const { workspaceRegistry, daemonLog, sendBridgeError: sendBridgeError2, writerIdleTimeoutMs } = deps;
17966
18398
  app.get("/session/:id/events", (req, res) => {
17967
18399
  const sessionId = req.params["id"];
17968
18400
  const lastEventId = parseLastEventId(req.headers["last-event-id"]);
@@ -17971,8 +18403,16 @@ function registerSseEventsRoutes(app, deps) {
17971
18403
  let iter;
17972
18404
  const abort = new AbortController();
17973
18405
  try {
18406
+ const runtime = requireSessionRuntime({
18407
+ sessionId,
18408
+ route: "GET /session/:id/events",
18409
+ res,
18410
+ workspaceRegistry,
18411
+ daemonLog
18412
+ });
18413
+ if (!runtime) return;
17974
18414
  const snapshot = req.query["snapshot"] === "1";
17975
- const iterable = bridge.subscribeEvents(sessionId, {
18415
+ const iterable = runtime.bridge.subscribeEvents(sessionId, {
17976
18416
  signal: abort.signal,
17977
18417
  lastEventId,
17978
18418
  ...maxQueued !== void 0 ? { maxQueued } : {},
@@ -18182,6 +18622,9 @@ import * as path12 from "node:path";
18182
18622
  var A2UI_MIME = "application/a2ui+json";
18183
18623
  var ACTION_TOOL = "action";
18184
18624
  var CALL_TIMEOUT_MS = 15e3;
18625
+ var SCRUBBED_STDIO_ENV_KEYS = /* @__PURE__ */ new Set([
18626
+ QWEN_SERVER_TOKEN_ENV
18627
+ ]);
18185
18628
  function usableServerConfig(cfg) {
18186
18629
  if (!cfg) return false;
18187
18630
  if (typeof cfg.httpUrl === "string") {
@@ -18212,22 +18655,34 @@ async function findFromSettingsFile(workspaceCwd) {
18212
18655
  return null;
18213
18656
  }
18214
18657
  __name(findFromSettingsFile, "findFromSettingsFile");
18215
- function buildTransport(cfg) {
18658
+ function buildTransport(cfg, baseEnv = snapshotProcessEnv()) {
18216
18659
  if (typeof cfg.httpUrl === "string") {
18217
18660
  return new StreamableHTTPClientTransport(new URL(cfg.httpUrl));
18218
18661
  }
18219
18662
  return new StdioClientTransport({
18220
18663
  command: cfg.command,
18221
18664
  args: cfg.args ?? [],
18222
- // spawn() treats `env` as a complete replacement, not a merge — a partial
18223
- // env (e.g. {API_KEY}) would strip PATH/HOME and break the child. Merge
18224
- // over process.env like packages/core/src/tools/mcp-client.ts does; when
18225
- // unset, let the SDK apply its safe default environment.
18226
- ...cfg.env ? { env: { ...process.env, ...cfg.env } } : {},
18665
+ // Passing `env` prevents the SDK from reading live process.env while
18666
+ // keeping daemon MCP stdio behavior aligned with the core CLI client.
18667
+ env: buildStdioServerEnv(baseEnv, cfg.env),
18227
18668
  cwd: cfg.cwd
18228
18669
  });
18229
18670
  }
18230
18671
  __name(buildTransport, "buildTransport");
18672
+ function buildStdioServerEnv(baseEnv, serverEnv) {
18673
+ const env = {};
18674
+ for (const [key, value] of Object.entries(baseEnv)) {
18675
+ if (value !== void 0 && !key.startsWith("BASH_FUNC_") && !value.startsWith("()") && !SCRUBBED_STDIO_ENV_KEYS.has(key)) {
18676
+ env[key] = value;
18677
+ }
18678
+ }
18679
+ const merged = { ...env, ...serverEnv ?? {} };
18680
+ for (const key of SCRUBBED_STDIO_ENV_KEYS) {
18681
+ delete merged[key];
18682
+ }
18683
+ return merged;
18684
+ }
18685
+ __name(buildStdioServerEnv, "buildStdioServerEnv");
18231
18686
  function extractA2uiActionResult(result) {
18232
18687
  if (result.isError) {
18233
18688
  const errMsg2 = (result.content ?? []).filter(
@@ -18253,8 +18708,8 @@ function extractA2uiActionResult(result) {
18253
18708
  return { commands, fallback };
18254
18709
  }
18255
18710
  __name(extractA2uiActionResult, "extractA2uiActionResult");
18256
- async function callA2uiAction(cfg, args) {
18257
- const transport = buildTransport(cfg);
18711
+ async function callA2uiAction(cfg, args, env) {
18712
+ const transport = buildTransport(cfg, env);
18258
18713
  const client = new Client({ name: "qwen-serve-a2ui", version: "0.0.1" });
18259
18714
  try {
18260
18715
  await client.connect(transport, { timeout: CALL_TIMEOUT_MS });
@@ -18274,7 +18729,7 @@ async function callA2uiAction(cfg, args) {
18274
18729
  __name(callA2uiAction, "callA2uiAction");
18275
18730
  function registerA2uiActionRoutes(app, opts) {
18276
18731
  const { boundWorkspace, mutate, safeBody: safeBody2, getMcpServers } = opts;
18277
- const callAction = opts.callAction ?? callA2uiAction;
18732
+ const callAction = opts.callAction ?? ((cfg, args) => callA2uiAction(cfg, args, opts.env));
18278
18733
  app.post(
18279
18734
  "/session/:id/a2ui-action",
18280
18735
  mutate(),
@@ -18982,73 +19437,6 @@ function installSelfOriginStripMiddleware(app, getPort) {
18982
19437
  }
18983
19438
  __name(installSelfOriginStripMiddleware, "installSelfOriginStripMiddleware");
18984
19439
 
18985
- // packages/cli/src/serve/workspace-registry.ts
18986
- init_esbuild_shims();
18987
- function createWorkspaceRegistry(inputRuntimes) {
18988
- if (inputRuntimes.length === 0) {
18989
- throw new Error(
18990
- "WorkspaceRegistry requires at least one workspace runtime."
18991
- );
18992
- }
18993
- const primaryRuntimes = inputRuntimes.filter((runtime) => runtime.primary);
18994
- if (primaryRuntimes.length !== 1) {
18995
- throw new Error(
18996
- "WorkspaceRegistry requires exactly one primary workspace runtime."
18997
- );
18998
- }
18999
- const byCwd = /* @__PURE__ */ new Map();
19000
- const byId = /* @__PURE__ */ new Map();
19001
- for (const runtime of inputRuntimes) {
19002
- if (byCwd.has(runtime.workspaceCwd)) {
19003
- throw new Error(
19004
- `Duplicate workspace runtime cwd ${JSON.stringify(
19005
- runtime.workspaceCwd
19006
- )}.`
19007
- );
19008
- }
19009
- byCwd.set(runtime.workspaceCwd, runtime);
19010
- if (byId.has(runtime.workspaceId)) {
19011
- throw new Error(
19012
- `Duplicate workspace runtime id ${JSON.stringify(
19013
- runtime.workspaceId
19014
- )}.`
19015
- );
19016
- }
19017
- byId.set(runtime.workspaceId, runtime);
19018
- }
19019
- const runtimes = Object.freeze([...inputRuntimes]);
19020
- const primary = primaryRuntimes[0];
19021
- return {
19022
- primary,
19023
- list: /* @__PURE__ */ __name(() => runtimes, "list"),
19024
- getByWorkspaceCwd: /* @__PURE__ */ __name((workspaceCwd) => byCwd.get(workspaceCwd), "getByWorkspaceCwd"),
19025
- getByWorkspaceId: /* @__PURE__ */ __name((workspaceId) => byId.get(workspaceId), "getByWorkspaceId"),
19026
- resolveWorkspaceCwd: /* @__PURE__ */ __name((workspaceCwd) => workspaceCwd === void 0 ? primary : byCwd.get(workspaceCwd), "resolveWorkspaceCwd"),
19027
- resolveLiveSessionOwner: /* @__PURE__ */ __name((sessionId) => {
19028
- const matches = [];
19029
- for (const runtime of runtimes) {
19030
- try {
19031
- runtime.bridge.getSessionSummary(sessionId);
19032
- matches.push(runtime);
19033
- } catch (err) {
19034
- if (err instanceof SessionNotFoundError) continue;
19035
- throw err;
19036
- }
19037
- }
19038
- if (matches.length === 0) return { kind: "not_found" };
19039
- if (matches.length === 1) {
19040
- return { kind: "found", runtime: matches[0] };
19041
- }
19042
- return { kind: "ambiguous", runtimes: matches };
19043
- }, "resolveLiveSessionOwner")
19044
- };
19045
- }
19046
- __name(createWorkspaceRegistry, "createWorkspaceRegistry");
19047
- function createSingleWorkspaceRegistry(runtime) {
19048
- return createWorkspaceRegistry([runtime]);
19049
- }
19050
- __name(createSingleWorkspaceRegistry, "createSingleWorkspaceRegistry");
19051
-
19052
19440
  // packages/cli/src/serve/routes/workspace-lifecycle.ts
19053
19441
  init_esbuild_shims();
19054
19442
  function registerWorkspaceLifecycleRoutes(app, deps) {
@@ -19351,6 +19739,10 @@ function describeRegistryPrimaryForConflict(registry) {
19351
19739
  return `registry primary cwd=${JSON.stringify(registry.primary.workspaceCwd)}, workspaceId=${JSON.stringify(registry.primary.workspaceId)}`;
19352
19740
  }
19353
19741
  __name(describeRegistryPrimaryForConflict, "describeRegistryPrimaryForConflict");
19742
+ function getRuntimeEffectiveEnv(metadata) {
19743
+ return metadata?.effectiveEnv;
19744
+ }
19745
+ __name(getRuntimeEffectiveEnv, "getRuntimeEffectiveEnv");
19354
19746
  var DEFAULT_SESSION_IDLE_TIMEOUT_MS = 30 * 6e4;
19355
19747
  var KEEPALIVE_MIN_INTERVAL_MS = 3e4;
19356
19748
  var KEEPALIVE_MAX_INTERVAL_MS = 10 * 6e4;
@@ -19431,6 +19823,8 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19431
19823
  );
19432
19824
  }
19433
19825
  const clientMcpSenderRegistry = injectedWorkspaceRegistry?.primary.clientMcpSenderRegistry ?? deps.clientMcpSenderRegistry ?? new ClientMcpSenderRegistry();
19826
+ const primaryRuntimeEnvMetadata = injectedWorkspaceRegistry?.primary.env ?? deps.primaryRuntimeEnv;
19827
+ const primaryEffectiveEnv = getRuntimeEffectiveEnv(primaryRuntimeEnvMetadata);
19434
19828
  const { languageCodes, currentServeFeatures, invalidateServeFeaturesCache } = createServeFeatures({
19435
19829
  opts,
19436
19830
  boundWorkspace,
@@ -19438,13 +19832,23 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19438
19832
  // Registry injection supplies the primary workspace service through the
19439
19833
  // runtime, so it has the same reload surface as legacy deps.workspace.
19440
19834
  reloadAvailable: deps.workspace !== void 0 || injectedWorkspaceRegistry !== void 0,
19441
- sessionShellCommandEnabled
19835
+ sessionShellCommandEnabled,
19836
+ multiWorkspaceSessionsEnabled: (injectedWorkspaceRegistry?.list().length ?? 1) > 1
19442
19837
  });
19443
- const statusProvider = deps.statusProvider ?? createDaemonStatusProvider();
19838
+ const statusProvider = deps.statusProvider ?? createDaemonStatusProvider(
19839
+ primaryEffectiveEnv ? { env: primaryEffectiveEnv } : {}
19840
+ );
19841
+ let defaultBridgeForAdmission;
19842
+ const totalSessionAdmission = !deps.bridge && !injectedWorkspaceRegistry ? createTotalSessionAdmissionController({
19843
+ maxTotalSessions: opts.maxTotalSessions,
19844
+ getBridges: /* @__PURE__ */ __name(() => defaultBridgeForAdmission ? [defaultBridgeForAdmission] : [], "getBridges")
19845
+ }) : void 0;
19444
19846
  const bridge = injectedWorkspaceRegistry?.primary.bridge ?? deps.bridge ?? createAcpSessionBridge({
19445
19847
  maxSessions: opts.maxSessions,
19848
+ ...totalSessionAdmission ? { freshSessionAdmission: totalSessionAdmission.admit } : {},
19446
19849
  maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession,
19447
19850
  eventRingSize: opts.eventRingSize,
19851
+ compactedReplayMaxBytes: opts.compactedReplayMaxBytes,
19448
19852
  permissionResponseTimeoutMs: opts.permissionResponseTimeoutMs,
19449
19853
  boundWorkspace,
19450
19854
  sessionShellCommandEnabled,
@@ -19458,6 +19862,9 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19458
19862
  // ext-method by reaching the WS connection that hosts the named server.
19459
19863
  clientMcpSender: clientMcpSenderRegistry.lookup
19460
19864
  });
19865
+ if (!injectedWorkspaceRegistry && !deps.bridge) {
19866
+ defaultBridgeForAdmission = bridge;
19867
+ }
19461
19868
  const archiveCoordinator = new SessionArchiveCoordinator();
19462
19869
  installSelfOriginStripMiddleware(app, getPort);
19463
19870
  app.locals.fsFactory = fsFactory;
@@ -19475,7 +19882,9 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19475
19882
  boundWorkspace,
19476
19883
  contextFilename: deps.contextFilename ?? "QWEN.md",
19477
19884
  statusProvider,
19478
- workspaceProvidersStatusProvider: createWorkspaceProvidersStatusProvider(),
19885
+ workspaceProvidersStatusProvider: createWorkspaceProvidersStatusProvider(
19886
+ primaryEffectiveEnv ? { env: primaryEffectiveEnv } : {}
19887
+ ),
19479
19888
  workspaceSkillsStatusProvider: createWorkspaceSkillsStatusProvider(),
19480
19889
  isChannelLive: /* @__PURE__ */ __name(() => bridge.isChannelLive(), "isChannelLive"),
19481
19890
  persistDisabledTools: deps.persistDisabledTools ?? (async () => {
@@ -19500,7 +19909,10 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19500
19909
  workspaceCwd: boundWorkspace,
19501
19910
  primary: true,
19502
19911
  trusted: deps.primaryWorkspaceTrusted ?? false,
19503
- env: { mode: "parent-process", overlayKeys: [] },
19912
+ env: primaryRuntimeEnvMetadata ?? {
19913
+ mode: "parent-process",
19914
+ overlayKeys: []
19915
+ },
19504
19916
  bridge,
19505
19917
  workspaceService: workspace,
19506
19918
  routeFileSystemFactory: fsFactory,
@@ -19566,6 +19978,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19566
19978
  opts,
19567
19979
  boundWorkspace: primaryBoundWorkspace,
19568
19980
  bridge: primaryBridge,
19981
+ workspaceRegistry,
19569
19982
  workspace: primaryWorkspace,
19570
19983
  daemonLog,
19571
19984
  startup: deps.startup,
@@ -19579,14 +19992,18 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19579
19992
  sessionShellCommandEnabled,
19580
19993
  getChannelWorkerSnapshot: deps.getChannelWorkerSnapshot,
19581
19994
  getPerfSnapshot: deps.getPerfSnapshot,
19582
- getMetricsSeries: deps.getMetricsSeries
19995
+ getMetricsSeries: deps.getMetricsSeries,
19996
+ getTotalSessionAdmissionSnapshot: deps.getTotalSessionAdmissionSnapshot ?? totalSessionAdmission?.snapshot
19583
19997
  });
19584
19998
  registerCapabilitiesRoutes(app, {
19585
19999
  qwenCodeVersion: deps.qwenCodeVersion,
19586
20000
  mode: opts.mode,
19587
20001
  currentServeFeatures,
19588
20002
  boundWorkspace: primaryBoundWorkspace,
20003
+ workspaceRegistry,
19589
20004
  permissionPolicy: primaryBridge.permissionPolicy,
20005
+ maxSessionsPerWorkspace: opts.maxSessions,
20006
+ maxTotalSessions: opts.maxTotalSessions,
19590
20007
  maxPendingPromptsPerSession: opts.maxPendingPromptsPerSession,
19591
20008
  languageCodes
19592
20009
  });
@@ -19697,6 +20114,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19697
20114
  boundWorkspace: primaryBoundWorkspace,
19698
20115
  mutate,
19699
20116
  safeBody,
20117
+ env: getRuntimeEffectiveEnv(primaryRuntime.env),
19700
20118
  // UI-server discovery uses the daemon's workspace MCP status, which
19701
20119
  // includes servers registered at runtime.
19702
20120
  getMcpServers: /* @__PURE__ */ __name(async () => {
@@ -19717,6 +20135,7 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19717
20135
  registerSessionRoutes(app, {
19718
20136
  boundWorkspace: primaryBoundWorkspace,
19719
20137
  bridge: primaryBridge,
20138
+ workspaceRegistry,
19720
20139
  archiveCoordinator,
19721
20140
  mutate,
19722
20141
  sendBridgeError: sendBridgeError2,
@@ -19789,11 +20208,14 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19789
20208
  }
19790
20209
  registerPermissionRoutes(app, {
19791
20210
  bridge: primaryBridge,
20211
+ workspaceRegistry,
20212
+ daemonLog,
19792
20213
  mutate,
19793
20214
  sendPermissionVoteError: sendPermissionVoteError2
19794
20215
  });
19795
20216
  registerSseEventsRoutes(app, {
19796
20217
  bridge: primaryBridge,
20218
+ workspaceRegistry,
19797
20219
  daemonLog,
19798
20220
  writerIdleTimeoutMs: opts.writerIdleTimeoutMs,
19799
20221
  sendBridgeError: sendBridgeError2
@@ -19836,7 +20258,9 @@ function createServeApp(opts, getPort = () => opts.port, deps = {}) {
19836
20258
  extraWsRoutes: [
19837
20259
  {
19838
20260
  path: "/voice/stream",
19839
- onConnection: createVoiceWsConnectionHandler(primaryBoundWorkspace)
20261
+ onConnection: createVoiceWsConnectionHandler(primaryBoundWorkspace, {
20262
+ env: getRuntimeEffectiveEnv(primaryRuntime.env)
20263
+ })
19840
20264
  }
19841
20265
  ]
19842
20266
  });