@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.
- package/bundled/qc-helper/docs/features/channels/overview.md +6 -3
- package/bundled/qc-helper/docs/features/channels/plugins.md +1 -0
- package/bundled/qc-helper/docs/features/hooks.md +36 -34
- package/bundled/qc-helper/docs/features/memory.md +1 -1
- package/bundled/qc-helper/docs/qwen-serve.md +17 -10
- package/bundled/review/SKILL.md +6 -2
- package/chunks/{MaxSizedBox-XS37LWTD.js → MaxSizedBox-5DT2SD7B.js} +7 -7
- package/chunks/{StandaloneSessionPicker-LPALJTKN.js → StandaloneSessionPicker-EYRGH6PJ.js} +23 -21
- package/chunks/{acpAgent-4VE3FGJX.js → acpAgent-GRFTTRHW.js} +74 -69
- package/chunks/{agent-CCHERW6L.js → agent-H2DGKS77.js} +4 -4
- package/chunks/{agent-headless-55N6UBUU.js → agent-headless-KFMFIT6J.js} +4 -4
- package/chunks/{anthropicContentGenerator-AKYPSZIV.js → anthropicContentGenerator-CPF22MA7.js} +28 -1
- package/chunks/{bridge-U6HXOHE7.js → bridge-NA3ZQQKJ.js} +11 -10
- package/chunks/{ca-HCMB2I54.js → ca-MKD32FQL.js} +26 -1
- package/chunks/{channel-worker-supervisor-CRCVYQIE.js → channel-worker-supervisor-NZQUOEFJ.js} +3 -3
- package/chunks/{chunk-J43WPR6U.js → chunk-27BHARDE.js} +8 -8
- package/chunks/{chunk-KKWO4IX2.js → chunk-2EM7ECZD.js} +251 -71
- package/chunks/{chunk-E7HM76PR.js → chunk-3GNOQZDC.js} +1562 -1025
- package/chunks/{chunk-G7ZG7CA6.js → chunk-3UP777ZS.js} +8 -7
- package/chunks/{chunk-VEB3NYSO.js → chunk-5MBO76SL.js} +5 -0
- package/chunks/{chunk-N74BA4VP.js → chunk-6VK6FIMQ.js} +1 -1
- package/chunks/{chunk-2FHWCKWA.js → chunk-A5JOJ77H.js} +35 -14
- package/chunks/{chunk-PLGONYEL.js → chunk-AYNCLGTW.js} +5 -5
- package/chunks/{chunk-K34DD7FH.js → chunk-BOBOCR5H.js} +4 -3
- package/chunks/chunk-BOBRZZKD.js +468 -0
- package/chunks/{chunk-7I4MGFBN.js → chunk-BUZ6HGL4.js} +5 -5
- package/chunks/{chunk-FK77ILF5.js → chunk-BVYU3ZTI.js} +2 -2
- package/chunks/{chunk-TBAZMRW3.js → chunk-CD6USWHZ.js} +1 -1
- package/chunks/{chunk-PVXPDMGP.js → chunk-CHB5SLZZ.js} +2 -2
- package/chunks/{chunk-SJHAUELE.js → chunk-DCZWC4PF.js} +2 -2
- package/chunks/{chunk-YYU6H66M.js → chunk-DHOLNQLC.js} +11 -11
- package/chunks/{chunk-MOQOAH7N.js → chunk-DICGXFAI.js} +1 -1
- package/chunks/{chunk-KT3SI3CQ.js → chunk-DIWVZ3VM.js} +8 -8
- package/chunks/{chunk-2DYY5XUZ.js → chunk-E7EMCSUG.js} +1 -1
- package/chunks/{chunk-XQ2GVLNJ.js → chunk-EEN2TKST.js} +1 -1
- package/chunks/{chunk-DNV4FSN5.js → chunk-FBET5XZ2.js} +6 -4
- package/chunks/{chunk-GIY6JTTC.js → chunk-FQNC62B2.js} +4 -4
- package/chunks/{chunk-B34OV7K2.js → chunk-GGQQA4JW.js} +13 -0
- package/chunks/chunk-GLE2YUPU.js +34 -0
- package/chunks/{chunk-X265R5C6.js → chunk-GN3F6PIU.js} +1 -1
- package/chunks/{chunk-LC4SMGYY.js → chunk-GSHQYYIV.js} +45 -9
- package/chunks/{chunk-BGL43SJ3.js → chunk-HDOH3QYE.js} +1 -1
- package/chunks/{chunk-4AFOWB47.js → chunk-I6WGFJJ3.js} +63 -4
- package/chunks/{chunk-2NPS2UDH.js → chunk-IBY3Q3HG.js} +390 -9
- package/chunks/{chunk-AXTPFMRS.js → chunk-J7RCB6N5.js} +1 -1
- package/chunks/{chunk-QCSLZO6J.js → chunk-JCH35JB3.js} +1 -1
- package/chunks/{chunk-JYOWO2F7.js → chunk-JPALE3PA.js} +3 -3
- package/chunks/{chunk-5FL2K3ZB.js → chunk-JRQ7EVGE.js} +1 -1
- package/chunks/{chunk-BHRU4SDF.js → chunk-JZHIQJOE.js} +3 -3
- package/chunks/{chunk-FB2ULV4M.js → chunk-L46XKEGM.js} +14 -153
- package/chunks/{chunk-LKXDC3AW.js → chunk-L4AMBVQG.js} +9 -9
- package/chunks/{chunk-ME344634.js → chunk-LAXNEOBG.js} +1 -1
- package/chunks/{chunk-QHT5USLK.js → chunk-M7S4GK5Z.js} +66 -445
- package/chunks/{chunk-4RQIB5UZ.js → chunk-O2YT7VB4.js} +0 -34
- package/chunks/{chunk-TBLJNMI7.js → chunk-O33TBKDC.js} +10 -10
- package/chunks/chunk-O7FIRWJV.js +168 -0
- package/chunks/{chunk-4KJ2BPIT.js → chunk-OACJLMLD.js} +2 -38
- package/chunks/{chunk-CR5IU2RX.js → chunk-ON3JA3RU.js} +2 -2
- package/chunks/{chunk-VTCPREC7.js → chunk-OQXDAMKY.js} +3 -3
- package/chunks/{chunk-ELMPRVCB.js → chunk-P3XEEI3X.js} +1 -1
- package/chunks/{chunk-OU6FPTJZ.js → chunk-PMFULMLX.js} +296 -81
- package/chunks/{chunk-2YELHTUE.js → chunk-PUVCVELY.js} +1 -1
- package/chunks/{chunk-5OSSOBZC.js → chunk-RMLZAUWH.js} +4 -4
- package/chunks/{chunk-B6WUEODT.js → chunk-SQ2UATK7.js} +14 -8
- package/chunks/{chunk-TEYGKLIZ.js → chunk-TI3BWD4D.js} +1 -1
- package/chunks/{chunk-T2EJHSE3.js → chunk-TSPB77TG.js} +57 -35
- package/chunks/{chunk-L7IWK7JY.js → chunk-UX6OTBVD.js} +1 -1
- package/chunks/{chunk-XUSONNJ4.js → chunk-UXEW557D.js} +1 -1
- package/chunks/chunk-V35MD7KN.js +13 -0
- package/chunks/{chunk-B5FOCTEZ.js → chunk-VGGOPZUL.js} +6 -5
- package/chunks/{chunk-MYZWWRVW.js → chunk-WF4FAXDL.js} +2 -2
- package/chunks/{chunk-2SWMCXVR.js → chunk-WHJQ3JUS.js} +20 -8
- package/chunks/{chunk-VQJ64BIQ.js → chunk-WQTHLB5T.js} +3 -3
- package/chunks/chunk-XNXVCNAT.js +88 -0
- package/chunks/{chunk-TDGF35EN.js → chunk-XOHNA2S6.js} +1 -1
- package/chunks/{chunk-ZK5EI6NR.js → chunk-XYR5RUA5.js} +14 -5
- package/chunks/{chunk-YMWIKAEE.js → chunk-YDOXPLYL.js} +244 -47
- package/chunks/{chunk-UZCT5OLN.js → chunk-YHKAK72D.js} +11 -11
- package/chunks/{chunk-RFIL6REB.js → chunk-YKZIAK7C.js} +119 -29
- package/chunks/chunk-Z3I3QJK3.js +47 -0
- package/chunks/{chunk-3QDZDAJG.js → chunk-ZE6E424U.js} +1 -1
- package/chunks/chunk-ZL5HN75Q.js +61 -0
- package/chunks/{computer-use-4CTF6WS3.js → computer-use-WMY3UOBX.js} +4 -4
- package/chunks/{contextCommand-Z3XWQCY6.js → contextCommand-LXFZRP4L.js} +6 -6
- package/chunks/{daemon-F3I2RXP6.js → daemon-WPAENEBW.js} +48 -0
- package/chunks/{daemon-status-provider-6A4QCG6Q.js → daemon-status-provider-GJRXY5EN.js} +15 -13
- package/chunks/{de-PLLFDERI.js → de-ZFPPQVSF.js} +26 -1
- package/chunks/{dist-IMFFBMAT.js → dist-BEXOZXLQ.js} +1 -1
- package/chunks/{dist-OT7G2WNM.js → dist-E6UANPIM.js} +1 -1
- package/chunks/{dist-FQ5WRJPL.js → dist-H2AEJCZ5.js} +2 -2
- package/chunks/{dist-YTRKAVUB.js → dist-O2IRTRPP.js} +1 -1
- package/chunks/{dist-573HNSVO.js → dist-SCFLLYMK.js} +1 -1
- package/chunks/{dist-PKFTNUHO.js → dist-Z34QPAQW.js} +1 -1
- package/chunks/{earlyInputCapture-7O47HW62.js → earlyInputCapture-KNOYZ4MJ.js} +4 -4
- package/chunks/{edit-E32KWLF2.js → edit-OTYWAXGP.js} +5 -5
- package/chunks/{en-GA2RMXY5.js → en-N4EPZAQI.js} +26 -1
- package/chunks/{enter-worktree-ZKFFMHUD.js → enter-worktree-HNYBDVCX.js} +4 -4
- package/chunks/{enterPlanMode-HLDC6NGX.js → enterPlanMode-CJCNGT63.js} +4 -4
- package/chunks/environment-ATFTYMLZ.js +88 -0
- package/chunks/{errors-MTIDDXX7.js → errors-A54HAADA.js} +6 -6
- package/chunks/{exit-worktree-YHY72XA2.js → exit-worktree-DUUKOE3X.js} +4 -4
- package/chunks/{exitPlanMode-JNXKBZ2C.js → exitPlanMode-AMMSXOAJ.js} +4 -4
- package/chunks/{fast-path-DVAGBROV.js → fast-path-OV6NIP3K.js} +12 -3
- package/chunks/{fast-path-settings-RCRXH2JG.js → fast-path-settings-7RIFI3PK.js} +3 -2
- package/chunks/{fr-GWNQG4XH.js → fr-5WWMY53B.js} +26 -1
- package/chunks/{gemini-2TMHJVRC.js → gemini-NQ3WWBKB.js} +431 -135
- package/chunks/{geminiContentGenerator-WCH4GWD3.js → geminiContentGenerator-CDUNEJQE.js} +1 -1
- package/chunks/{glob-I6Y4AGKO.js → glob-ROV3YS4R.js} +4 -4
- package/chunks/{grep-3P2J3LU5.js → grep-NRITKDCD.js} +4 -4
- package/chunks/{handleAutoUpdate-4IVRMRG4.js → handleAutoUpdate-CEZJAARW.js} +6 -6
- package/chunks/{initializer-DVNCPVTC.js → initializer-BRFJKRRX.js} +11 -9
- package/chunks/{ja-2HOTA47X.js → ja-CUHZOLEJ.js} +26 -1
- package/chunks/{list-4D6QK2KZ.js → list-KVHF7O4X.js} +13 -11
- package/chunks/{loadedSettingsAdapter-GNGELH6Q.js → loadedSettingsAdapter-LL5PSFKX.js} +11 -9
- package/chunks/{ls-L654WOAT.js → ls-7MFU2QYW.js} +1 -1
- package/chunks/{lsp-M35KE54Y.js → lsp-XHDTPTGV.js} +2 -4
- package/chunks/{mcp-2IL72YJP.js → mcp-3GCXRTOQ.js} +11 -9
- package/chunks/{monitor-BLVCZAVX.js → monitor-FL2ZO33W.js} +4 -4
- package/chunks/{nonInteractiveCli-UD3V7UOO.js → nonInteractiveCli-PTQI3DV6.js} +44 -41
- package/chunks/{notebook-edit-5TVMWIWY.js → notebook-edit-6PULTHL5.js} +5 -5
- package/chunks/{openaiContentGenerator-5LJ5A7YY.js → openaiContentGenerator-YE42PKCY.js} +3 -3
- package/chunks/{pidfile-AN5JQJ2T.js → pidfile-NZYSCFRK.js} +4 -4
- package/chunks/{pt-2THT3YHA.js → pt-OLYN42DS.js} +26 -1
- package/chunks/{qwenContentGenerator-E2JSB4FJ.js → qwenContentGenerator-NX2E7PB7.js} +5 -5
- package/chunks/{read-file-N5DEFUDU.js → read-file-33XGP5HF.js} +2 -2
- package/chunks/{record-artifact-PP3LKHTS.js → record-artifact-SQ2OKRJW.js} +3 -3
- package/chunks/{ripGrep-BLJHTHKE.js → ripGrep-QWZLGTAN.js} +4 -4
- package/chunks/{ru-Z67YJHBG.js → ru-LDM3GWVQ.js} +26 -1
- package/chunks/{run-qwen-serve-4JDO64RN.js → run-qwen-serve-JK2DL7PI.js} +596 -143
- package/chunks/{scheduler-FQR4XA7J.js → scheduler-O4IGVZKK.js} +4 -4
- package/chunks/{send-message-OA6MV4EU.js → send-message-76GT3JMC.js} +1 -1
- package/chunks/{serve-ZOCFC7YM.js → serve-JTMIGANH.js} +13 -10
- package/chunks/{server-GEOYEPYT.js → server-SGNPKX2O.js} +667 -243
- package/chunks/{session-NJCONHGX.js → session-5BNM25EZ.js} +45 -42
- package/chunks/{settings-QBGGXANI.js → settings-3MI4XXP6.js} +20 -16
- package/chunks/{shell-2DVPSEKT.js → shell-YJKBE67T.js} +4 -4
- package/chunks/{skill-HIPXUHV7.js → skill-I22QK5XS.js} +2 -2
- package/chunks/{spawnChannel-3JYXY52G.js → spawnChannel-UNV6W4DU.js} +6 -6
- package/chunks/{src-NLEX4CUC.js → src-BBQSM46M.js} +8 -4
- package/chunks/{startInteractiveUI-TYGZIU27.js → startInteractiveUI-JII36UGN.js} +619 -288
- package/chunks/{task-create-RPFZNB4B.js → task-create-WCHTB435.js} +2 -2
- package/chunks/{task-update-5WUG5MVQ.js → task-update-XYWMHJGJ.js} +2 -2
- package/chunks/{team-create-MGX57SZJ.js → team-create-A7NUU5AQ.js} +4 -4
- package/chunks/{team-plan-approval-BO2N7J3E.js → team-plan-approval-TOQRJ2KI.js} +4 -4
- package/chunks/{theme-manager-WU7LOA64.js → theme-manager-WZ4RRMMB.js} +4 -4
- package/chunks/{tool-search-CLBKVEVK.js → tool-search-SZ4EFS2T.js} +3 -3
- package/chunks/total-session-admission-ULXJWXFV.js +72 -0
- package/chunks/{trustedFolders-GAQM2GHB.js → trustedFolders-LAZZPZ3D.js} +5 -5
- package/chunks/{updateCheck-RIK2YIQE.js → updateCheck-KONLM73X.js} +5 -5
- package/chunks/{validateNonInterActiveAuth-NS3GBIJZ.js → validateNonInterActiveAuth-MPKSRCXD.js} +41 -38
- package/chunks/{version-B3RSLP54.js → version-NO2XSNNP.js} +1 -1
- package/chunks/{workflow-7APPIGND.js → workflow-WO2H6NRI.js} +5 -5
- package/chunks/{workspace-providers-status-SC67GLMY.js → workspace-providers-status-3W7E7DFW.js} +14 -11
- package/chunks/workspace-registry-SXJZNN3O.js +74 -0
- package/chunks/{workspace-service-ZJHF22WA.js → workspace-service-CZRQZ4Q4.js} +17 -15
- package/chunks/{workspace-skills-status-NJEK6P6Y.js → workspace-skills-status-K7WFREPD.js} +12 -10
- package/chunks/{write-file-R6Z3VLRY.js → write-file-PX2Z7IBE.js} +5 -5
- package/chunks/{zh-7XVVRTDH.js → zh-J4F6QWQV.js} +26 -1
- package/chunks/{zh-TW-DPH554OG.js → zh-TW-XVDWOLSW.js} +26 -1
- package/cli.js +11 -11
- package/locales/ca.js +30 -0
- package/locales/de.js +30 -0
- package/locales/en.js +30 -0
- package/locales/fr.js +30 -0
- package/locales/ja.js +30 -0
- package/locales/pt.js +30 -0
- package/locales/ru.js +30 -0
- package/locales/zh-TW.js +30 -0
- package/locales/zh.js +30 -0
- package/node_modules/@qwen-code/audio-capture/package.json +1 -1
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-arm64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/darwin-x64/@qwen-code+audio-capture.node +0 -0
- package/node_modules/@qwen-code/audio-capture/prebuilds/win32-x64/@qwen-code+audio-capture.node +0 -0
- package/package.json +3 -3
- package/web-shell/assets/{arc-C7hjaa7g.js → arc-BWyoJpY2.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-pm9KtMZY.js → architectureDiagram-3BPJPVTR-BT0mGrz2.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-CApElKsU.js → blockDiagram-GPEHLZMM-BLgUWvyf.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-BeDe0-9N.js → c4Diagram-AAUBKEIU-DYx9M7oU.js} +1 -1
- package/web-shell/assets/channel-wmPUGHtg.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-DJEkmLdl.js → chunk-2J33WTMH-CfMHWbuZ.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-DXX8gdpe.js → chunk-4BX2VUAB-B1URoqEV.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DORmk1kQ.js → chunk-55IACEB6-DAIaM4QF.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-DWmO4mCZ.js → chunk-727SXJPM-B2X34knw.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-C7LRaYw2.js → chunk-AQP2D5EJ-Cif-zLTQ.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CCdXgyC5.js → chunk-FMBD7UC4-H18WCXdY.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-SyL_xvWc.js → chunk-ND2GUHAM-YFtetHi0.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-BzOuCKxa.js → chunk-QZHKN3VN-By2hiH3r.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BA2ljEjW.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BA2ljEjW.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BMPWyDKc.js → cose-bilkent-S5V4N54A-VrcnnLZu.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-B_GnPWik.js → dagre-BM42HDAG-CGo-IaVV.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-fJqMc3S_.js → diagram-2AECGRRQ-Dl4QjzIB.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-ximV3O9D.js → diagram-5GNKFQAL-qMLmsO0u.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-2vVyjzqw.js → diagram-KO2AKTUF-CHlmuxPI.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-Dckcx1sT.js → diagram-LMA3HP47-BUwU3GwT.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-BAVv47ga.js → diagram-OG6HWLK6-HEhwPDUM.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-Bn3nf5J0.js → erDiagram-TEJ5UH35-1n0llBmM.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-BIbGF9JT.js → flowDiagram-I6XJVG4X-BN74uMnt.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-CDbhb3AH.js → ganttDiagram-6RSMTGT7-BoOq78i3.js} +1 -1
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-CbKG1a_w.js → gitGraphDiagram-PVQCEYII-CN8b00c8.js} +1 -1
- package/web-shell/assets/index-CNwoO1Cn.js +783 -0
- package/web-shell/assets/index-CWQ0z6kZ.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-DUFxTy8m.js → infoDiagram-5YYISTIA-CCurnIna.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-D69hrBG8.js → ishikawaDiagram-YF4QCWOH-AwuRqdUP.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-DsvEw51Y.js → journeyDiagram-JHISSGLW-B7IICk-E.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-lFFjZEYd.js → kanban-definition-UN3LZRKU-BYF0OKhx.js} +1 -1
- package/web-shell/assets/{linear-Bo5bWzvo.js → linear-GWWguGfD.js} +1 -1
- package/web-shell/assets/{mermaid.core-C_HKMJx5.js → mermaid.core-JqtkxvCl.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-DlV-NUTs.js → mindmap-definition-RKZ34NQL-B0MmHsZ6.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-B2e6FH2a.js → pieDiagram-4H26LBE5-DhImUZLQ.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-D75kSk-b.js → quadrantDiagram-W4KKPZXB-DGeSC3DT.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-CQ6xakhM.js → requirementDiagram-4Y6WPE33-DkspY6Re.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-J_XTKrcY.js → sankeyDiagram-5OEKKPKP-CaOofS2x.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-D7jTcBtf.js → sequenceDiagram-3UESZ5HK-DFQ_kFnN.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-CrlM_OT3.js → stateDiagram-AJRCARHV-D3snw0Tz.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BbSm_9d0.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-5oZi76Ef.js → timeline-definition-PNZ67QCA-l4zH8nLM.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-DO5YptPK.js → vennDiagram-CIIHVFJN-BnRlA98M.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-4t1eJDvM.js → wardley-L42UT6IY-BS0xUdmd.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-DKZc661S.js → wardleyDiagram-YWT4CUSO-DKGBUWyQ.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-su9hp08G.js → xychartDiagram-2RQKCTM6-DVb2HuOB.js} +1 -1
- package/web-shell/index.html +2 -2
- package/web-shell/assets/channel-BNf1dW-j.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-uOIGlzgi.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-uOIGlzgi.js +0 -1
- package/web-shell/assets/index-CnE2ur2L.js +0 -779
- package/web-shell/assets/index-hSKXrlSE.css +0 -5
- 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-
|
|
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-
|
|
26
|
-
import "./chunk-
|
|
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-
|
|
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
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
141
|
-
} from "./chunk-
|
|
142
|
-
import
|
|
143
|
-
|
|
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-
|
|
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-
|
|
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
|
-
|
|
186
|
-
|
|
187
|
-
} from "./chunk-G7ZG7CA6.js";
|
|
189
|
+
QWEN_SERVER_TOKEN_ENV
|
|
190
|
+
} from "./chunk-S6RLAIUR.js";
|
|
188
191
|
import "./chunk-VRDMOSQS.js";
|
|
189
|
-
import
|
|
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-
|
|
212
|
+
} from "./chunk-LAXNEOBG.js";
|
|
196
213
|
import "./chunk-HLKG6CZN.js";
|
|
197
|
-
import "./chunk-
|
|
214
|
+
import "./chunk-UXEW557D.js";
|
|
198
215
|
import "./chunk-43W4YSO6.js";
|
|
199
216
|
import {
|
|
200
217
|
getWorkspaceTrustStatus
|
|
201
|
-
} from "./chunk-
|
|
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
|
-
|
|
252
|
+
loadUsageHistoryWithLive,
|
|
236
253
|
parseInstallSource,
|
|
237
254
|
redactUrlCredentials,
|
|
238
255
|
shouldShowStep,
|
|
239
256
|
stripTerminalControlSequences,
|
|
240
257
|
writeWorkspaceContextFile
|
|
241
|
-
} from "./chunk-
|
|
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-
|
|
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-
|
|
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-
|
|
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:
|
|
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 {
|
|
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
|
|
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(
|
|
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(
|
|
11474
|
-
|
|
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
|
-
{
|
|
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 {
|
|
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
|
-
|
|
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
|
|
14839
|
-
if (
|
|
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
|
|
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(
|
|
15272
|
+
await assertSessionLoadable(primaryCwd, sessionId);
|
|
14905
15273
|
return action === "load" ? await bridge.loadSession({
|
|
14906
15274
|
sessionId,
|
|
14907
|
-
workspaceCwd:
|
|
15275
|
+
workspaceCwd: primaryCwd,
|
|
14908
15276
|
historyReplay: "response",
|
|
14909
15277
|
...clientId !== void 0 ? { clientId } : {}
|
|
14910
15278
|
}) : await bridge.resumeSession({
|
|
14911
15279
|
sessionId,
|
|
14912
|
-
workspaceCwd:
|
|
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
|
-
|
|
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 =
|
|
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 =
|
|
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
|
-
|
|
15438
|
-
|
|
15439
|
-
|
|
15440
|
-
|
|
15441
|
-
|
|
15442
|
-
|
|
15443
|
-
|
|
15444
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
15738
|
-
if (
|
|
15739
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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 ?? (() =>
|
|
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
|
|
17228
|
-
//
|
|
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 {
|
|
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
|
-
//
|
|
18223
|
-
//
|
|
18224
|
-
|
|
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:
|
|
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
|
});
|