@qwen-code/qwen-code 0.19.9 → 0.19.10-nightly.20260716.506ce0a1a
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/configuration/settings.md +14 -6
- package/bundled/qc-helper/docs/features/approval-mode.md +2 -2
- package/bundled/qc-helper/docs/features/channels/dingtalk.md +33 -0
- package/bundled/qc-helper/docs/features/channels/overview.md +64 -20
- package/bundled/qc-helper/docs/features/channels/wecom.md +8 -7
- package/bundled/qc-helper/docs/features/code-review.md +88 -44
- package/bundled/qc-helper/docs/features/commands.md +6 -6
- package/bundled/qc-helper/docs/features/hooks.md +29 -0
- package/bundled/qc-helper/docs/features/sandbox.md +2 -0
- package/bundled/qc-helper/docs/features/sub-agents.md +21 -0
- package/bundled/qc-helper/docs/qwen-serve.md +49 -20
- package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +1 -1
- package/bundled/review/DESIGN.md +219 -33
- package/bundled/review/SKILL.md +429 -382
- package/chunks/{MaxSizedBox-6HYJ3ZPJ.js → MaxSizedBox-WOC3YDWA.js} +31 -32
- package/chunks/{StandaloneSessionPicker-WS4GXYOG.js → StandaloneSessionPicker-H5HZCAFD.js} +49 -48
- package/chunks/{acpAgent-5FWSOZL5.js → acpAgent-55YDJDNM.js} +922 -550
- package/chunks/{agent-HOLHB3RT.js → agent-H6VE5W3L.js} +26 -27
- package/chunks/{agent-headless-SXL6H56A.js → agent-headless-T4XJOCRU.js} +26 -27
- package/chunks/{anthropicContentGenerator-L73TO3DB.js → anthropicContentGenerator-HBRXJSP4.js} +78 -16
- package/chunks/{artifact-tool-U7IRTLIV.js → artifact-tool-MIZLXBLF.js} +2 -2
- package/chunks/{askUserQuestion-2DLUUZZG.js → askUserQuestion-XMJVPNWM.js} +2 -2
- package/chunks/{bridge-BCJQ7BBB.js → bridge-FTB6ZP3R.js} +31 -34
- package/chunks/{ca-UJ6HC4H2.js → ca-CODEN7TD.js} +9 -1
- package/chunks/channel-worker-group-K7QKH6IG.js +13 -0
- package/chunks/channel-worker-manager-CUDPU4CN.js +418 -0
- package/chunks/channel-worker-supervisor-4XTO2ZD3.js +20 -0
- package/chunks/{chunk-LXNEJD34.js → chunk-2FO5GFKZ.js} +1 -1
- package/chunks/{chunk-VA4KQY6V.js → chunk-2JNR4VP2.js} +3 -3
- package/chunks/{chunk-L36P3NBD.js → chunk-2W3OOD4W.js} +2 -0
- package/chunks/{chunk-7R3CZA3Q.js → chunk-2Z5UX4KI.js} +1 -1
- package/chunks/{chunk-CUMMSHH6.js → chunk-3DWIFU7L.js} +1 -1
- package/chunks/chunk-3MX7D6QN.js +516 -0
- package/chunks/{chunk-SJHDYNHF.js → chunk-4BJVSIS3.js} +3 -3
- package/chunks/{chunk-TO6QE22P.js → chunk-5CNYZ7TN.js} +26 -22
- package/chunks/{chunk-N3EMS75V.js → chunk-5DEJ4T6C.js} +1333 -1232
- package/chunks/chunk-5HBA2Z7V.js +28 -0
- package/chunks/{chunk-ZJE7NSL3.js → chunk-5M6IDOMF.js} +34 -97
- package/chunks/{chunk-SCGXUJBT.js → chunk-6LI3L22E.js} +3 -3
- package/chunks/{chunk-K434OPES.js → chunk-6WPJRYLZ.js} +3 -3
- package/chunks/{chunk-YAUFFXDS.js → chunk-7GM2RWCR.js} +12 -11
- package/chunks/{chunk-OQ4DRIOA.js → chunk-7HWE2W74.js} +2 -2
- package/chunks/{chunk-J4TSQ5EQ.js → chunk-7NFB7LBQ.js} +8 -1
- package/chunks/{chunk-MC23XKFE.js → chunk-A2HWMJVO.js} +37 -3
- package/chunks/{chunk-3G7CIHVV.js → chunk-ABNYOMDG.js} +4 -4
- package/chunks/{chunk-3AHXV67U.js → chunk-AGZLXLBY.js} +1 -1
- package/chunks/{chunk-RDJSGHZE.js → chunk-ALGGS7UH.js} +1 -38
- package/chunks/{chunk-Q4YQW46J.js → chunk-AMRZVQUY.js} +43 -40
- package/chunks/{chunk-W3JHSWRP.js → chunk-AN6C2U46.js} +4 -4
- package/chunks/{chunk-GWHYEOV2.js → chunk-ARKANCNX.js} +2 -1
- package/chunks/{chunk-5SFOMFG4.js → chunk-AVEOWVOM.js} +36 -2
- package/chunks/{chunk-34MW4KTI.js → chunk-BA5JGE5F.js} +2 -2
- package/chunks/{chunk-5HOMWMCL.js → chunk-BSJAQUFD.js} +5492 -1336
- package/chunks/{chunk-L6P4KPHR.js → chunk-BWJKL5DB.js} +58 -38
- package/chunks/{chunk-PVZM22CK.js → chunk-C32JFRGV.js} +5 -5
- package/chunks/{chunk-AKIVHSJR.js → chunk-CZIHPO7L.js} +163 -782
- package/chunks/chunk-DL7RCO6V.js +493 -0
- package/chunks/{chunk-KKNMOEZH.js → chunk-E2UVIFI2.js} +185 -398
- package/chunks/{chunk-5VXNZWGF.js → chunk-ENUQSKEY.js} +1 -1
- package/chunks/{chunk-PDZ7MBDG.js → chunk-EWILX3BM.js} +27 -6
- package/chunks/{chunk-BMGVRZN4.js → chunk-EZWX232B.js} +1 -1
- package/chunks/{chunk-4GORAUCN.js → chunk-F333XEAU.js} +1 -1
- package/chunks/{chunk-YLV3XXFB.js → chunk-FBU7WRZI.js} +17 -1
- package/chunks/chunk-FEOZBUMT.js +77 -0
- package/chunks/{chunk-5U27BZ72.js → chunk-FKEGVMPX.js} +269 -83
- package/chunks/chunk-FNX3LGAK.js +34 -0
- package/chunks/{chunk-LK7KUE55.js → chunk-FSA7ERJ2.js} +1 -1
- package/chunks/{chunk-PODM4SZ4.js → chunk-G3BIBPI7.js} +5 -5
- package/chunks/{chunk-A3XKDTSH.js → chunk-GA65O2TB.js} +4 -4
- package/chunks/{chunk-3BTRNWWD.js → chunk-GOXKNSDZ.js} +1 -64
- package/chunks/{channel-worker-supervisor-WSOAAYUO.js → chunk-GXGIM7QP.js} +67 -35
- package/chunks/{chunk-6PESIEKJ.js → chunk-GXUWGPYX.js} +68 -6
- package/chunks/chunk-GYTKQYDB.js +23 -0
- package/chunks/{chunk-GZRTYZ2R.js → chunk-H3XMJV7T.js} +218 -1
- package/chunks/{chunk-WQUQVGTF.js → chunk-HGRXW4HQ.js} +467 -106
- package/chunks/{chunk-YVEDCAUE.js → chunk-HGT6JR3U.js} +19 -0
- package/chunks/{chunk-ECNYL4AA.js → chunk-HUEWOHKV.js} +1 -1
- package/chunks/chunk-IDS7MSUP.js +74 -0
- package/chunks/{chunk-KHUQZZJ6.js → chunk-IHDRJLLR.js} +382 -36
- package/chunks/{chunk-CLFKOZEK.js → chunk-J4SEAF4X.js} +114 -4
- package/chunks/{chunk-B5ORX3FG.js → chunk-JGUT3LWZ.js} +6 -1
- package/chunks/{chunk-P67PFTUT.js → chunk-KEYEYCHZ.js} +4 -4
- package/chunks/{chunk-ORBGV7NJ.js → chunk-KKRTYONM.js} +6 -4
- package/chunks/{chunk-7PU4FYLG.js → chunk-KOXFAG6P.js} +4 -18
- package/chunks/{chunk-EGYZ275M.js → chunk-KWLVWNF5.js} +55 -7
- package/chunks/{chunk-XLA62MYB.js → chunk-KXECVZPD.js} +2 -2
- package/chunks/{chunk-IAVB3HM3.js → chunk-L4Y55KIS.js} +33 -1
- package/chunks/{chunk-4QLQE5WJ.js → chunk-L5U3ELZX.js} +1 -1
- package/chunks/{chunk-4ZVWQHEQ.js → chunk-LQIDP6K5.js} +1 -1
- package/chunks/{chunk-DC5Z3DU6.js → chunk-LXLTBIDP.js} +43 -6
- package/chunks/chunk-LXXMOYPL.js +22 -0
- package/chunks/{chunk-Q6I5QHMH.js → chunk-MFNKBXYH.js} +1 -1
- package/chunks/chunk-MR3PXB6E.js +48 -0
- package/chunks/{chunk-JZETEN3Z.js → chunk-N45S36AH.js} +3 -3
- package/chunks/{chunk-GWLSNBG4.js → chunk-NA3IG6XG.js} +748 -27
- package/chunks/{chunk-D5SKC4YG.js → chunk-O3M25JXE.js} +213 -29
- package/chunks/{chunk-EAXLGSFP.js → chunk-O6XGHDS5.js} +11 -11
- package/chunks/{chunk-WL4L7EZH.js → chunk-OA4JVLSA.js} +27 -1
- package/chunks/{chunk-X4NKFGFJ.js → chunk-OJAMDVF5.js} +0 -15
- package/chunks/{chunk-BZIFY5TF.js → chunk-OKAIGAYW.js} +3 -3
- package/chunks/{chunk-CNEIYWSA.js → chunk-OVIV236K.js} +5 -5
- package/chunks/{chunk-3SJSQXNS.js → chunk-PEJWA3QQ.js} +12 -8
- package/chunks/{chunk-E2IY465S.js → chunk-PWNOAWXB.js} +59 -12
- package/chunks/{chunk-B4G2WOFA.js → chunk-Q5MKHNIR.js} +28 -5
- package/chunks/{chunk-MXL5UP4X.js → chunk-Q6TUALBE.js} +1 -1
- package/chunks/{chunk-QYMQSECS.js → chunk-QAW7PIHT.js} +2 -2
- package/chunks/{chunk-HKMAENAO.js → chunk-QDTGDM2T.js} +14 -9
- package/chunks/{chunk-LUODI7WD.js → chunk-RCEEXIOO.js} +6 -4
- package/chunks/{chunk-W2UIXQDL.js → chunk-RTV5TUYB.js} +12 -4
- package/chunks/chunk-RW7DUKFO.js +91 -0
- package/chunks/{chunk-NVYTCB5Z.js → chunk-SA6QVLWI.js} +17325 -16259
- package/chunks/chunk-SJSI7PXU.js +59 -0
- package/chunks/{chunk-HVY356M2.js → chunk-SMGBWLNU.js} +3 -3
- package/chunks/{chunk-CEA3E3JB.js → chunk-SPJQO2CE.js} +2 -2
- package/chunks/{chunk-CC2ITGCF.js → chunk-STZQCNN3.js} +49 -6
- package/chunks/{chunk-HPDUL5MF.js → chunk-T2ZDAER2.js} +1 -1
- package/chunks/{chunk-XUOOWUZS.js → chunk-T3TQ3ACP.js} +1 -1
- package/chunks/{chunk-4C5BQ2D2.js → chunk-TIKDHS6V.js} +100 -17
- package/chunks/chunk-TV6K2FB4.js +224 -0
- package/chunks/{chunk-5XUCZNSY.js → chunk-TYLOFD2U.js} +1 -1
- package/chunks/{chunk-D2GFWEXB.js → chunk-UCUUH2JV.js} +6 -6
- package/chunks/{chunk-BAPGSC7U.js → chunk-UZP7K33Y.js} +23 -9
- package/chunks/{chunk-77XJ3SWN.js → chunk-VDAR6UO2.js} +8 -6
- package/chunks/{chunk-XYQSMABS.js → chunk-VKLVGA2D.js} +4 -4
- package/chunks/{chunk-JSG7ZSBC.js → chunk-VRR65QYW.js} +251 -3
- package/chunks/{chunk-U2NNEY4R.js → chunk-VT5AWJN4.js} +1 -1
- package/chunks/{chunk-ZLXQN2QS.js → chunk-WIEO4CWB.js} +1 -1
- package/chunks/{chunk-X6TJ3YZV.js → chunk-WKEO3GLZ.js} +160 -60
- package/chunks/{chunk-J3JA76CF.js → chunk-WTNZ6DXB.js} +1 -1
- package/chunks/{chunk-VWPVHAMO.js → chunk-XIWQ5QST.js} +8 -1
- package/chunks/{chunk-TDEXZKMT.js → chunk-Y66VOBRP.js} +2 -2
- package/chunks/{chunk-3VAGG5T5.js → chunk-YYBZUIPL.js} +1015 -100
- package/chunks/{chunk-CCDMCZPP.js → chunk-YZ3SBNP7.js} +1 -1
- package/chunks/{chunk-ATAKVRIF.js → chunk-Z3XA2TNG.js} +7 -7
- package/chunks/{chunk-EMDMPBJ4.js → chunk-Z7SVC7PJ.js} +10 -3
- package/chunks/{chunk-AURZZYMD.js → chunk-ZIVSSTUG.js} +4 -4
- package/chunks/{chunk-UOZWKTQG.js → chunk-ZPAHLFZU.js} +2 -2
- package/chunks/{chunk-34Z3U5RQ.js → chunk-ZQIYGQCG.js} +765 -168
- package/chunks/{computer-use-HM37RX6A.js → computer-use-NADT7ULB.js} +26 -27
- package/chunks/{config-utils-NV2SVGPB.js → config-utils-IQQT3GCI.js} +3 -2
- package/chunks/{contextCommand-OF5SFGH2.js → contextCommand-U7NEJYJ7.js} +28 -29
- package/chunks/{create-sub-session-INX7TXJI.js → create-sub-session-EAB2U5XW.js} +2 -2
- package/chunks/{create-sub-session-KPRT7ECJ.js → create-sub-session-SUN33INC.js} +26 -27
- package/chunks/{cron-create-AMBKGZX6.js → cron-create-GMVKSXZT.js} +4 -4
- package/chunks/{cron-delete-LRU4OJYG.js → cron-delete-VDZKUAVK.js} +4 -4
- package/chunks/{cron-list-WVP2JXER.js → cron-list-UG7C7RAR.js} +4 -4
- package/chunks/{daemon-ARHTSTXP.js → daemon-SJXEKP3H.js} +773 -126
- package/chunks/daemon-status-provider-WIIYLGZJ.js +74 -0
- package/chunks/{de-EBJN3OVN.js → de-NOXPCSYN.js} +9 -1
- package/chunks/{dist-XKU3ABM5.js → dist-4WCQEZIN.js} +4 -51
- package/chunks/{dist-QYCAEZIT.js → dist-DOPL5LSQ.js} +5 -1
- package/chunks/{dist-WKPOYU7O.js → dist-GXJVCOS7.js} +1 -1
- package/chunks/{dist-R7LN5AZE.js → dist-PX2ERZ6I.js} +2 -2
- package/chunks/{dist-PNVLTKTL.js → dist-V2YVLYOW.js} +215 -33
- package/chunks/{dist-VHV4EVHG.js → dist-VYWUKURL.js} +1 -1
- package/chunks/{earlyInputCapture-3VTHRC4C.js → earlyInputCapture-6FRM6UMU.js} +27 -28
- package/chunks/{edit-VNI4NJ73.js → edit-7GOIQTCZ.js} +27 -28
- package/chunks/{en-5A6LA7RK.js → en-JFVULHTB.js} +11 -1
- package/chunks/{enter-worktree-IYYBKPZT.js → enter-worktree-476E6WIK.js} +26 -27
- package/chunks/{enterPlanMode-GMC5FD5A.js → enterPlanMode-IRJM6W3C.js} +42 -28
- package/chunks/{environment-5HSSRMJ7.js → environment-ROMULS2X.js} +30 -30
- package/chunks/{errors-HMFCJJ7P.js → errors-OUIWPUDY.js} +28 -29
- package/chunks/{exit-worktree-6BHCMP5G.js → exit-worktree-PPSFK753.js} +26 -27
- package/chunks/{exitPlanMode-CJW7G74W.js → exitPlanMode-YKQMD4D7.js} +26 -27
- package/chunks/{fast-path-FRDMDVHG.js → fast-path-CNK2HHKH.js} +3 -3
- package/chunks/{fast-path-settings-5QZE64HR.js → fast-path-settings-DAOVFADC.js} +6 -4
- package/chunks/{fr-YXRABLYZ.js → fr-HVFNU42H.js} +9 -1
- package/chunks/{gemini-QYSEGHAX.js → gemini-WQNFT6TR.js} +216 -90
- package/chunks/{geminiContentGenerator-J7YNZDYP.js → geminiContentGenerator-4QJH2JDP.js} +4 -4
- package/chunks/{glob-BRCSGFOT.js → glob-36TVLBWW.js} +28 -28
- package/chunks/{grep-EE2DUOSY.js → grep-QTYLNO2M.js} +26 -27
- package/chunks/{handleAutoUpdate-5NWTLR67.js → handleAutoUpdate-36FQFODK.js} +30 -31
- package/chunks/{i18n-BASPENNQ.js → i18n-JUGYPVSP.js} +27 -28
- package/chunks/initializer-OBBJUS25.js +72 -0
- package/chunks/{installationInfo-W6V4DT7W.js → installationInfo-MCKTPX64.js} +27 -28
- package/chunks/{ja-7VQOANVG.js → ja-PY5AF544.js} +10 -2
- package/chunks/{keychain-token-storage-VKUBNCP4.js → keychain-token-storage-AU22CQI6.js} +2 -2
- package/chunks/list-VW5QY4VJ.js +75 -0
- package/chunks/loadedSettingsAdapter-IELOOXG6.js +69 -0
- package/chunks/{loop-wakeup-WX7BLWWP.js → loop-wakeup-QXWZSCYM.js} +5 -5
- package/chunks/{ls-ZB2BDP6T.js → ls-2OUTG3IZ.js} +4 -4
- package/chunks/{lsp-V5DN4YUJ.js → lsp-4VMNXZW6.js} +2 -2
- package/chunks/mcp-Q3EC37ZS.js +69 -0
- package/chunks/{monitor-X5Z3H4FY.js → monitor-DCZ27AFR.js} +26 -27
- package/chunks/nonInteractiveCli-KXD7PFO4.js +128 -0
- package/chunks/{notebook-edit-TRM2QIJK.js → notebook-edit-YU4XF5LI.js} +27 -28
- package/chunks/{openaiContentGenerator-AAYONPMF.js → openaiContentGenerator-KL5WER2D.js} +13 -13
- package/chunks/{pidfile-D4I4FTVA.js → pidfile-WBOD7EJV.js} +27 -28
- package/chunks/processUtils-AOV4R34M.js +29 -0
- package/chunks/{pt-2C6YCSHL.js → pt-A3PRQXMU.js} +9 -1
- package/chunks/{qwenContentGenerator-K3HZ2H76.js → qwenContentGenerator-YIGBHYE3.js} +28 -29
- package/chunks/{qwenOAuth2-PJQ27GSO.js → qwenOAuth2-LEYOU7RU.js} +5 -5
- package/chunks/{read-file-7SZSIZOL.js → read-file-WVL4Y76X.js} +9 -9
- package/chunks/{read-mcp-resource-SM5DA4RG.js → read-mcp-resource-JUFHCKSC.js} +2 -2
- package/chunks/{record-artifact-4XKZX3UW.js → record-artifact-DWSMBXYY.js} +2 -2
- package/chunks/{ripGrep-YNPFVCZP.js → ripGrep-6GSWJERP.js} +26 -27
- package/chunks/{ru-6BBHVZZV.js → ru-IBCWUTOC.js} +9 -1
- package/chunks/{run-qwen-serve-DMWV5N6L.js → run-qwen-serve-QYUQMEDT.js} +1233 -371
- package/chunks/{runtime-57WWRVHN.js → runtime-K2YZCNB3.js} +42 -38
- package/chunks/{scheduler-YBLGWSIL.js → scheduler-EQCSN7QV.js} +26 -27
- package/chunks/{send-message-F36YD6KQ.js → send-message-JZ752NWD.js} +3 -3
- package/chunks/{serve-R63NK3CV.js → serve-DX5UGZD4.js} +36 -35
- package/chunks/{server-Z22GCAXP.js → server-T6HJH3DR.js} +5869 -1398
- package/chunks/{session-HKAAI7BN.js → session-SNU6ACY6.js} +299 -100
- package/chunks/{settings-3EYN66GK.js → settings-AKHZZNEL.js} +34 -33
- package/chunks/{shell-6YXINTWJ.js → shell-EY74IEZK.js} +28 -27
- package/chunks/{skill-OO57P4X6.js → skill-DPU62O3H.js} +11 -11
- package/chunks/{spawnChannel-JD7G4VU6.js → spawnChannel-RQZRWJ2V.js} +28 -30
- package/chunks/{src-G5UPLZSZ.js → src-7FITDSVC.js} +164 -52
- package/chunks/{standalone-update-OB7F4JPZ.js → standalone-update-XO3RK6DO.js} +28 -29
- package/chunks/{startInteractiveUI-73EGLIIH.js → startInteractiveUI-DVWZRHYQ.js} +728 -382
- package/chunks/{syntheticOutput-34H7LGA7.js → syntheticOutput-LELY6HAI.js} +3 -3
- package/chunks/{task-create-FRGOEIKY.js → task-create-QY3BIMNM.js} +8 -7
- package/chunks/{task-list-OW766BXZ.js → task-list-D2U47WBJ.js} +6 -5
- package/chunks/{task-stop-SIR5SNBN.js → task-stop-N6E5IYLH.js} +2 -2
- package/chunks/{task-update-YRA532MT.js → task-update-HJCQILLB.js} +8 -7
- package/chunks/{team-create-PECAAPXK.js → team-create-FOSRT62K.js} +26 -27
- package/chunks/{team-delete-6OSECUZC.js → team-delete-RCWYDRF4.js} +6 -5
- package/chunks/{team-plan-approval-L6F434RY.js → team-plan-approval-6VUDV27J.js} +26 -27
- package/chunks/{theme-manager-ZG4RY6GU.js → theme-manager-6UT6IO5T.js} +27 -28
- package/chunks/{todoWrite-YDMFEV4G.js → todoWrite-FKCGATPJ.js} +4 -4
- package/chunks/{tool-search-THVIWAPB.js → tool-search-ASSFMMN5.js} +10 -10
- package/chunks/{total-session-admission-JOKNRIIA.js → total-session-admission-YYWUO23H.js} +32 -35
- package/chunks/tree-sitter-YJVE2ZUK.js +2980 -0
- package/chunks/{trustedFolders-EOGT3UVS.js → trustedFolders-4BWV2IBK.js} +29 -29
- package/chunks/types-ML3TRJQ5.js +16 -0
- package/chunks/update-relaunch-74DLGH73.js +87 -0
- package/chunks/{updateCheck-2KYEYVSB.js → updateCheck-CRFCGFO5.js} +31 -30
- package/chunks/{validateNonInterActiveAuth-EN6ZQSR2.js → validateNonInterActiveAuth-BTTEPBGQ.js} +76 -73
- package/chunks/{version-3UEA6ZIR.js → version-Y5JE5Q63.js} +1 -1
- package/chunks/{web-fetch-PAAEQKBW.js → web-fetch-CFCWTCAP.js} +5 -6
- package/chunks/{workflow-QCCCMYP3.js → workflow-6WC7VPQN.js} +27 -28
- package/chunks/workspace-providers-status-RVG2C5ZS.js +72 -0
- package/chunks/workspace-registration-store-SLEU3D3X.js +27 -0
- package/chunks/{workspace-registry-24QFLQYH.js → workspace-registry-QMWGVOTF.js} +32 -35
- package/chunks/workspace-service-G572JSEU.js +84 -0
- package/chunks/workspace-skills-status-VSSMSMNK.js +71 -0
- package/chunks/{write-file-I3MUDRIE.js → write-file-5XVDRORP.js} +27 -28
- package/chunks/{zh-RQE7I22T.js → zh-PAUNIMHQ.js} +12 -2
- package/chunks/{zh-TW-TBPQGHKH.js → zh-TW-GNEUIUFF.js} +12 -2
- package/cli-entry.js +92 -8
- package/cli.js +11 -11
- package/locales/ca.js +16 -0
- package/locales/de.js +16 -0
- package/locales/en.js +19 -0
- package/locales/fr.js +16 -0
- package/locales/ja.js +17 -1
- package/locales/pt.js +16 -0
- package/locales/ru.js +16 -0
- package/locales/zh-TW.js +20 -1
- package/locales/zh.js +20 -1
- package/package.json +3 -3
- package/web-shell/assets/{arc-C15hqnJe.js → arc-vx1tRwnX.js} +1 -1
- package/web-shell/assets/{architectureDiagram-3BPJPVTR-B-At37J_.js → architectureDiagram-3BPJPVTR-DBi6iUA1.js} +1 -1
- package/web-shell/assets/{blockDiagram-GPEHLZMM-B51wjcU7.js → blockDiagram-GPEHLZMM-Ga9JJ4Ak.js} +1 -1
- package/web-shell/assets/{c4Diagram-AAUBKEIU-xBK7BAwN.js → c4Diagram-AAUBKEIU-D8Vi5FYw.js} +1 -1
- package/web-shell/assets/channel-B29zQDTL.js +1 -0
- package/web-shell/assets/{chunk-2J33WTMH-xKmLg7Yr.js → chunk-2J33WTMH-CSV6yQpU.js} +1 -1
- package/web-shell/assets/{chunk-4BX2VUAB-BfkdKZCM.js → chunk-4BX2VUAB-toYlppdI.js} +1 -1
- package/web-shell/assets/{chunk-55IACEB6-DT713sZf.js → chunk-55IACEB6-DbjzuyAr.js} +1 -1
- package/web-shell/assets/{chunk-727SXJPM-CYEeAamv.js → chunk-727SXJPM-IkkSjSkk.js} +1 -1
- package/web-shell/assets/{chunk-AQP2D5EJ-DBN-5CFd.js → chunk-AQP2D5EJ-D5wUL6Zm.js} +1 -1
- package/web-shell/assets/{chunk-FMBD7UC4-CGZKk4PH.js → chunk-FMBD7UC4-C3o2DXG0.js} +1 -1
- package/web-shell/assets/{chunk-ND2GUHAM-qQbC2O-y.js → chunk-ND2GUHAM-CutIi14T.js} +1 -1
- package/web-shell/assets/{chunk-QZHKN3VN-B3zeXwsX.js → chunk-QZHKN3VN-DZ0NRHH-.js} +1 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-BNGI2SvC.js +1 -0
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BNGI2SvC.js +1 -0
- package/web-shell/assets/{cose-bilkent-S5V4N54A-BKsl1Wvy.js → cose-bilkent-S5V4N54A-B3Dl88UJ.js} +1 -1
- package/web-shell/assets/{dagre-BM42HDAG-CuuuLiBK.js → dagre-BM42HDAG-DfTxfF6-.js} +1 -1
- package/web-shell/assets/{diagram-2AECGRRQ-CG4_eKiV.js → diagram-2AECGRRQ-CJyH98yO.js} +1 -1
- package/web-shell/assets/{diagram-5GNKFQAL-DSFTmZB1.js → diagram-5GNKFQAL-EbOiJNmW.js} +1 -1
- package/web-shell/assets/{diagram-KO2AKTUF-BxwlEHn8.js → diagram-KO2AKTUF-AYNqpqqA.js} +1 -1
- package/web-shell/assets/{diagram-LMA3HP47-BUAg-jMG.js → diagram-LMA3HP47-BY5VPa4H.js} +1 -1
- package/web-shell/assets/{diagram-OG6HWLK6-BFM2jlO5.js → diagram-OG6HWLK6-BhMYAKlk.js} +1 -1
- package/web-shell/assets/{erDiagram-TEJ5UH35-CerbFPa2.js → erDiagram-TEJ5UH35-Bp8S_F9l.js} +1 -1
- package/web-shell/assets/{flowDiagram-I6XJVG4X-BNeZz5Zz.js → flowDiagram-I6XJVG4X-az3TE9PU.js} +1 -1
- package/web-shell/assets/{ganttDiagram-6RSMTGT7-CTOogLaM.js → ganttDiagram-6RSMTGT7-CfkAEpCe.js} +3 -3
- package/web-shell/assets/{gitGraphDiagram-PVQCEYII-yxSFkXPj.js → gitGraphDiagram-PVQCEYII-D1QmjMCy.js} +1 -1
- package/web-shell/assets/index-C8sDwQUv.js +1130 -0
- package/web-shell/assets/index-CaBoc5bb.js +3 -0
- package/web-shell/assets/index-Dpg5Wymg.css +5 -0
- package/web-shell/assets/{infoDiagram-5YYISTIA-DYdAUevm.js → infoDiagram-5YYISTIA-D3ompLrG.js} +1 -1
- package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-CNuijZ90.js → ishikawaDiagram-YF4QCWOH-D3MRWp9I.js} +1 -1
- package/web-shell/assets/{journeyDiagram-JHISSGLW-BTyiuonf.js → journeyDiagram-JHISSGLW-DVkKCa44.js} +1 -1
- package/web-shell/assets/{kanban-definition-UN3LZRKU-DPJo0Uow.js → kanban-definition-UN3LZRKU-BLif81wF.js} +1 -1
- package/web-shell/assets/{linear-C8wKCbIC.js → linear-BDU96EGS.js} +1 -1
- package/web-shell/assets/{mermaid.core-BV5o7nW5.js → mermaid.core-B-CwC26B.js} +5 -5
- package/web-shell/assets/{mindmap-definition-RKZ34NQL-BtLcBmSt.js → mindmap-definition-RKZ34NQL-CS1WOJ4G.js} +1 -1
- package/web-shell/assets/{pieDiagram-4H26LBE5-C22J7A9Q.js → pieDiagram-4H26LBE5-BzgtNXVP.js} +1 -1
- package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DSL10wiL.js → quadrantDiagram-W4KKPZXB-BRfGC8MA.js} +1 -1
- package/web-shell/assets/{requirementDiagram-4Y6WPE33-feqh0UpX.js → requirementDiagram-4Y6WPE33-CPBZkC7g.js} +1 -1
- package/web-shell/assets/{sankeyDiagram-5OEKKPKP-Z4OVaWaZ.js → sankeyDiagram-5OEKKPKP-nqNvinIk.js} +1 -1
- package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DIluIcb1.js → sequenceDiagram-3UESZ5HK-CM_Wdjh3.js} +1 -1
- package/web-shell/assets/{stateDiagram-AJRCARHV-hlhnuoYH.js → stateDiagram-AJRCARHV-L0y-48VE.js} +1 -1
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BX1DdF8s.js +1 -0
- package/web-shell/assets/{timeline-definition-PNZ67QCA-Dqf_CqgL.js → timeline-definition-PNZ67QCA-B_n5rb3A.js} +1 -1
- package/web-shell/assets/{vennDiagram-CIIHVFJN-DD2QhaTX.js → vennDiagram-CIIHVFJN-C9NmLV5e.js} +1 -1
- package/web-shell/assets/{wardley-L42UT6IY-B2uI85U_.js → wardley-L42UT6IY-CrefK9gt.js} +1 -1
- package/web-shell/assets/{wardleyDiagram-YWT4CUSO-U1aJX71g.js → wardleyDiagram-YWT4CUSO-BUccf-bC.js} +1 -1
- package/web-shell/assets/{xychartDiagram-2RQKCTM6-C0ODHUee.js → xychartDiagram-2RQKCTM6-DM6ef92l.js} +1 -1
- package/web-shell/index.html +2 -2
- package/chunks/chunk-524RQP4Q.js +0 -305
- package/chunks/chunk-CARU2RR2.js +0 -24
- package/chunks/chunk-CU3L64TP.js +0 -93
- package/chunks/chunk-OCPBI7J5.js +0 -18
- package/chunks/chunk-TEGEBB2I.js +0 -122
- package/chunks/chunk-VTU57BWZ.js +0 -30
- package/chunks/daemon-status-provider-B2UTZUJ2.js +0 -76
- package/chunks/initializer-UTQ7FB7G.js +0 -71
- package/chunks/list-DEICDL65.js +0 -74
- package/chunks/loadedSettingsAdapter-NOWEGDYJ.js +0 -68
- package/chunks/mcp-L5JXEEIA.js +0 -68
- package/chunks/nonInteractiveCli-LS2K4X6A.js +0 -124
- package/chunks/types-JNKGKUJT.js +0 -12
- package/chunks/workspace-providers-status-4KMGETOJ.js +0 -71
- package/chunks/workspace-service-RVLBMSMZ.js +0 -80
- package/chunks/workspace-skills-status-DS4ZVFTO.js +0 -70
- package/web-shell/assets/channel-CLiQD50f.js +0 -1
- package/web-shell/assets/classDiagram-4FO5ZUOK-D3sYqow5.js +0 -1
- package/web-shell/assets/classDiagram-v2-Q7XG4LA2-D3sYqow5.js +0 -1
- package/web-shell/assets/index-D5IWFVk1.css +0 -5
- package/web-shell/assets/index-KFJRDhX7.js +0 -783
- package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BhQMwgpl.js +0 -1
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
// Force strict mode and setup for ESM
|
|
2
2
|
"use strict";
|
|
3
|
+
import {
|
|
4
|
+
CHANNEL_CONTROL_DEFAULT_TIMEOUT_MS
|
|
5
|
+
} from "./chunk-5HBA2Z7V.js";
|
|
3
6
|
import {
|
|
4
7
|
init_esbuild_shims
|
|
5
8
|
} from "./chunk-5O2XNYP6.js";
|
|
@@ -339,10 +342,12 @@ var RestSseTransport = class {
|
|
|
339
342
|
_disposed = false;
|
|
340
343
|
type = "rest";
|
|
341
344
|
supportsReplay = true;
|
|
345
|
+
restFetch;
|
|
342
346
|
constructor(baseUrl, token, fetchFn) {
|
|
343
347
|
this.baseUrl = baseUrl;
|
|
344
348
|
this.token = token;
|
|
345
349
|
this._fetch = fetchFn;
|
|
350
|
+
this.restFetch = fetchFn;
|
|
346
351
|
}
|
|
347
352
|
get connected() {
|
|
348
353
|
return !this._disposed;
|
|
@@ -469,14 +474,111 @@ function composeAbortSignals(signals) {
|
|
|
469
474
|
}
|
|
470
475
|
__name(composeAbortSignals, "composeAbortSignals");
|
|
471
476
|
|
|
477
|
+
// packages/sdk-typescript/src/daemon/types.ts
|
|
478
|
+
init_esbuild_shims();
|
|
479
|
+
var DaemonCapabilityMissingError = class extends Error {
|
|
480
|
+
static {
|
|
481
|
+
__name(this, "DaemonCapabilityMissingError");
|
|
482
|
+
}
|
|
483
|
+
capability;
|
|
484
|
+
constructor(capability, hint) {
|
|
485
|
+
super(
|
|
486
|
+
`DaemonCapabilities.${capability} is missing \u2014 ${hint}. The daemon you are connected to likely predates the feature that added this field; upgrade the daemon or fall back to a different code path that doesn't require it.`
|
|
487
|
+
);
|
|
488
|
+
this.name = "DaemonCapabilityMissingError";
|
|
489
|
+
this.capability = capability;
|
|
490
|
+
}
|
|
491
|
+
};
|
|
492
|
+
function requireWorkspaceCwd(caps) {
|
|
493
|
+
if (typeof caps.workspaceCwd !== "string" || caps.workspaceCwd.length === 0) {
|
|
494
|
+
throw new DaemonCapabilityMissingError(
|
|
495
|
+
"workspaceCwd",
|
|
496
|
+
caps.workspaceCwd === "" ? "daemon returned an empty workspaceCwd (newer daemon with a bug)" : "daemon predates workspaceCwd support (1 daemon = 1 workspace); upgrade it"
|
|
497
|
+
);
|
|
498
|
+
}
|
|
499
|
+
return caps.workspaceCwd;
|
|
500
|
+
}
|
|
501
|
+
__name(requireWorkspaceCwd, "requireWorkspaceCwd");
|
|
502
|
+
var DAEMON_ERROR_KINDS = [
|
|
503
|
+
"missing_binary",
|
|
504
|
+
"blocked_egress",
|
|
505
|
+
"auth_env_error",
|
|
506
|
+
"init_timeout",
|
|
507
|
+
"protocol_error",
|
|
508
|
+
"missing_file",
|
|
509
|
+
"parse_error",
|
|
510
|
+
// Budget refusal under `--mcp-budget-mode=enforce`.
|
|
511
|
+
"budget_exhausted",
|
|
512
|
+
// Runtime MCP mutation routes (POST/DELETE /workspace/mcp/servers).
|
|
513
|
+
"mcp_budget_would_exceed",
|
|
514
|
+
"mcp_server_spawn_failed",
|
|
515
|
+
"invalid_config",
|
|
516
|
+
// A prompt exceeded the daemon-configured wallclock cap (or the
|
|
517
|
+
// request's own `deadlineMs`, capped at the server flag).
|
|
518
|
+
"prompt_deadline_exceeded",
|
|
519
|
+
// An SSE writer's last successful flush was older than the daemon's
|
|
520
|
+
// writer-idle deadline.
|
|
521
|
+
"writer_idle_timeout",
|
|
522
|
+
// The model response stream ended before a complete turn could be read.
|
|
523
|
+
"model_stream_interrupted"
|
|
524
|
+
];
|
|
525
|
+
var DAEMON_CONTENT_HASH_RE = /^sha256:[0-9a-f]{64}$/;
|
|
526
|
+
function isDaemonContentHash(value) {
|
|
527
|
+
return typeof value === "string" && DAEMON_CONTENT_HASH_RE.test(value);
|
|
528
|
+
}
|
|
529
|
+
__name(isDaemonContentHash, "isDaemonContentHash");
|
|
530
|
+
var DAEMON_APPROVAL_MODES = [
|
|
531
|
+
"plan",
|
|
532
|
+
"default",
|
|
533
|
+
"auto-edit",
|
|
534
|
+
"auto",
|
|
535
|
+
"yolo"
|
|
536
|
+
];
|
|
537
|
+
|
|
472
538
|
// packages/sdk-typescript/src/daemon/DaemonClient.ts
|
|
473
539
|
var WORKSPACE_MEMORY_REMEMBER_PATH = "/workspace/memory/remember";
|
|
474
540
|
var WORKSPACE_MEMORY_FORGET_PATH = "/workspace/memory/forget";
|
|
475
541
|
var WORKSPACE_MEMORY_DREAM_PATH = "/workspace/memory/dream";
|
|
542
|
+
function parseSessionGenerationEvent(value) {
|
|
543
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
544
|
+
return void 0;
|
|
545
|
+
}
|
|
546
|
+
const event = value;
|
|
547
|
+
if (event["v"] !== 1 || typeof event["type"] !== "string") return void 0;
|
|
548
|
+
const requestId = event["requestId"];
|
|
549
|
+
const modelSource = event["modelSource"];
|
|
550
|
+
const validRequestId = typeof requestId === "string" && requestId.length > 0;
|
|
551
|
+
const validModelSource = modelSource === "fast" || modelSource === "main";
|
|
552
|
+
const validTokenCount = /* @__PURE__ */ __name((count) => count === void 0 || typeof count === "number" && Number.isSafeInteger(count) && count >= 0, "validTokenCount");
|
|
553
|
+
if (event["type"] === "started") {
|
|
554
|
+
if (!validRequestId || typeof event["model"] !== "string" || !validModelSource) {
|
|
555
|
+
return void 0;
|
|
556
|
+
}
|
|
557
|
+
} else if (event["type"] === "thinking") {
|
|
558
|
+
if (!validRequestId) return void 0;
|
|
559
|
+
} else if (event["type"] === "delta") {
|
|
560
|
+
if (!validRequestId || !Number.isSafeInteger(event["seq"]) || event["seq"] < 0 || typeof event["text"] !== "string" || event["text"].length === 0) {
|
|
561
|
+
return void 0;
|
|
562
|
+
}
|
|
563
|
+
} else if (event["type"] === "done") {
|
|
564
|
+
if (!validRequestId || typeof event["model"] !== "string" || !validModelSource || !validTokenCount(event["inputTokens"]) || !validTokenCount(event["outputTokens"])) {
|
|
565
|
+
return void 0;
|
|
566
|
+
}
|
|
567
|
+
} else if (event["type"] === "error") {
|
|
568
|
+
if (typeof event["code"] !== "string" || typeof event["message"] !== "string") {
|
|
569
|
+
return void 0;
|
|
570
|
+
}
|
|
571
|
+
} else {
|
|
572
|
+
return void 0;
|
|
573
|
+
}
|
|
574
|
+
return event;
|
|
575
|
+
}
|
|
576
|
+
__name(parseSessionGenerationEvent, "parseSessionGenerationEvent");
|
|
476
577
|
var DEFAULT_SESSION_LIST_PAGE_SIZE = 20;
|
|
477
578
|
var DEFAULT_FETCH_TIMEOUT_MS = 3e4;
|
|
478
579
|
var VOICE_TRANSCRIPTION_DEFAULT_TIMEOUT_MS = 65e3;
|
|
479
580
|
var GITHUB_SETUP_DEFAULT_TIMEOUT_MS = 9e4;
|
|
581
|
+
var MAX_TIMER_DELAY_MS = 2147483647;
|
|
480
582
|
var DEFAULT_MAX_PENDING_PROMPTS_PER_SESSION = 5;
|
|
481
583
|
var MCP_RESTART_DEFAULT_TIMEOUT_MS = MCP_RESTART_SERVER_DEADLINE_MS + MCP_RESTART_CLIENT_HEADROOM_MS;
|
|
482
584
|
var CLIENT_ID_HEADER = "X-Qwen-Client-Id";
|
|
@@ -567,7 +669,7 @@ var DaemonClient = class {
|
|
|
567
669
|
constructor(opts) {
|
|
568
670
|
this.baseUrl = stripTrailingSlashes(opts.baseUrl);
|
|
569
671
|
this.token = opts.token ?? readTokenFromEnv();
|
|
570
|
-
this._fetch = opts.fetch ?? globalThis.fetch.bind(globalThis);
|
|
672
|
+
this._fetch = opts.fetch ?? opts.transport?.restFetch ?? globalThis.fetch.bind(globalThis);
|
|
571
673
|
const raw = opts.fetchTimeoutMs ?? DEFAULT_FETCH_TIMEOUT_MS;
|
|
572
674
|
this.fetchTimeoutMs = Number.isFinite(raw) && raw > 0 ? raw : 0;
|
|
573
675
|
this.promptLimit = normalizePendingPromptLimit(
|
|
@@ -677,7 +779,8 @@ var DaemonClient = class {
|
|
|
677
779
|
hasBody ? { "Content-Type": "application/json" } : {},
|
|
678
780
|
opts.clientId
|
|
679
781
|
),
|
|
680
|
-
...hasBody ? { body: JSON.stringify(opts.body) } : {}
|
|
782
|
+
...hasBody ? { body: JSON.stringify(opts.body) } : {},
|
|
783
|
+
...opts.signal ? { signal: opts.signal } : {}
|
|
681
784
|
},
|
|
682
785
|
async (res) => {
|
|
683
786
|
if (!res.ok) throw await this.failOnError(res, label);
|
|
@@ -696,6 +799,33 @@ var DaemonClient = class {
|
|
|
696
799
|
);
|
|
697
800
|
}
|
|
698
801
|
/** @internal */
|
|
802
|
+
async sessionExportRequest(path, label, opts = {}) {
|
|
803
|
+
const format = opts.format ?? "html";
|
|
804
|
+
const query = opts.format ? `?format=${urlEncode(opts.format)}` : "";
|
|
805
|
+
return await this.fetchWithTimeout(
|
|
806
|
+
`${this.baseUrl}${path}${query}`,
|
|
807
|
+
{ headers: this.headers({}, opts.clientId) },
|
|
808
|
+
async (res) => {
|
|
809
|
+
if (!res.ok) {
|
|
810
|
+
throw await this.failOnError(res, label);
|
|
811
|
+
}
|
|
812
|
+
const content = await res.text();
|
|
813
|
+
const mimeType = res.headers.get("content-type") ?? "";
|
|
814
|
+
const filename = /filename="([^"]+)"/i.exec(
|
|
815
|
+
res.headers.get("content-disposition") ?? ""
|
|
816
|
+
)?.[1] ?? `export.${format}`;
|
|
817
|
+
return {
|
|
818
|
+
content,
|
|
819
|
+
filename,
|
|
820
|
+
mimeType,
|
|
821
|
+
format
|
|
822
|
+
};
|
|
823
|
+
},
|
|
824
|
+
void 0,
|
|
825
|
+
"rest"
|
|
826
|
+
);
|
|
827
|
+
}
|
|
828
|
+
/** @internal */
|
|
699
829
|
async workspaceNoContentRequest(workspaceSelector, path, label, opts = {}) {
|
|
700
830
|
return await this.fetchWithTimeout(
|
|
701
831
|
`${this.baseUrl}/workspaces/${workspaceSelector}${path}`,
|
|
@@ -749,6 +879,15 @@ var DaemonClient = class {
|
|
|
749
879
|
}
|
|
750
880
|
);
|
|
751
881
|
}
|
|
882
|
+
async requireCapability(capability) {
|
|
883
|
+
const caps = await this.capabilities();
|
|
884
|
+
if (!caps.features.includes(capability)) {
|
|
885
|
+
throw new DaemonCapabilityMissingError(
|
|
886
|
+
capability,
|
|
887
|
+
`daemon does not advertise the ${capability} feature`
|
|
888
|
+
);
|
|
889
|
+
}
|
|
890
|
+
}
|
|
752
891
|
/**
|
|
753
892
|
* Consolidated daemon status report (`GET /daemon/status`). The default
|
|
754
893
|
* `summary` detail reads cheap in-memory counters; `full` adds per-session,
|
|
@@ -790,6 +929,13 @@ var DaemonClient = class {
|
|
|
790
929
|
}
|
|
791
930
|
);
|
|
792
931
|
}
|
|
932
|
+
async workspaceGit() {
|
|
933
|
+
return await this.jsonRequest(
|
|
934
|
+
"/workspace/git",
|
|
935
|
+
"GET /workspace/git",
|
|
936
|
+
{ mode: "rest" }
|
|
937
|
+
);
|
|
938
|
+
}
|
|
793
939
|
async workspaceMcpTools(serverName) {
|
|
794
940
|
return await this.fetchWithTimeout(
|
|
795
941
|
`${this.baseUrl}/workspace/mcp/${urlEncode(serverName)}/tools`,
|
|
@@ -892,64 +1038,230 @@ var DaemonClient = class {
|
|
|
892
1038
|
async workspaceExtensions() {
|
|
893
1039
|
return await this.jsonRequest(
|
|
894
1040
|
"/workspace/extensions",
|
|
895
|
-
"GET /workspace/extensions"
|
|
1041
|
+
"GET /workspace/extensions",
|
|
1042
|
+
{ mode: "rest" }
|
|
896
1043
|
);
|
|
897
1044
|
}
|
|
898
1045
|
async installExtension(params, clientId) {
|
|
899
1046
|
return await this.jsonRequest(
|
|
900
1047
|
"/workspace/extensions/install",
|
|
901
1048
|
"POST /workspace/extensions/install",
|
|
902
|
-
{ method: "POST", body: params, clientId }
|
|
1049
|
+
{ method: "POST", body: params, clientId, mode: "rest" }
|
|
903
1050
|
);
|
|
904
1051
|
}
|
|
905
1052
|
async extensionOperationStatus(operationId) {
|
|
906
1053
|
return await this.jsonRequest(
|
|
907
1054
|
`/workspace/extensions/operations/${urlEncode(operationId)}`,
|
|
908
|
-
"GET /workspace/extensions/operations/:operationId"
|
|
1055
|
+
"GET /workspace/extensions/operations/:operationId",
|
|
1056
|
+
{ mode: "rest" }
|
|
1057
|
+
);
|
|
1058
|
+
}
|
|
1059
|
+
async activeExtensionOperations() {
|
|
1060
|
+
return await this.jsonRequest(
|
|
1061
|
+
"/workspace/extensions/operations",
|
|
1062
|
+
"GET /workspace/extensions/operations",
|
|
1063
|
+
{ mode: "rest" }
|
|
1064
|
+
);
|
|
1065
|
+
}
|
|
1066
|
+
async respondToExtensionInteraction(operationId, interactionId, response, clientId) {
|
|
1067
|
+
return await this.jsonRequest(
|
|
1068
|
+
`/workspace/extensions/operations/${urlEncode(operationId)}/interactions/${urlEncode(interactionId)}`,
|
|
1069
|
+
"POST /workspace/extensions/operations/:operationId/interactions/:interactionId",
|
|
1070
|
+
{ method: "POST", body: response, clientId, mode: "rest" }
|
|
909
1071
|
);
|
|
910
1072
|
}
|
|
911
1073
|
async checkExtensionUpdates(clientId) {
|
|
912
1074
|
return await this.jsonRequest(
|
|
913
1075
|
"/workspace/extensions/check-updates",
|
|
914
1076
|
"POST /workspace/extensions/check-updates",
|
|
915
|
-
{ method: "POST", body: {}, clientId }
|
|
1077
|
+
{ method: "POST", body: {}, clientId, mode: "rest" }
|
|
916
1078
|
);
|
|
917
1079
|
}
|
|
918
1080
|
async refreshExtensions(clientId) {
|
|
919
1081
|
return await this.jsonRequest(
|
|
920
1082
|
"/workspace/extensions/refresh",
|
|
921
1083
|
"POST /workspace/extensions/refresh",
|
|
922
|
-
{ method: "POST", body: {}, clientId }
|
|
1084
|
+
{ method: "POST", body: {}, clientId, mode: "rest" }
|
|
923
1085
|
);
|
|
924
1086
|
}
|
|
925
1087
|
async enableExtension(name, params, clientId) {
|
|
926
1088
|
return await this.jsonRequest(
|
|
927
1089
|
`/workspace/extensions/${urlEncode(name)}/enable`,
|
|
928
1090
|
"POST /workspace/extensions/:name/enable",
|
|
929
|
-
{ method: "POST", body: params, clientId }
|
|
1091
|
+
{ method: "POST", body: params, clientId, mode: "rest" }
|
|
930
1092
|
);
|
|
931
1093
|
}
|
|
932
1094
|
async disableExtension(name, params, clientId) {
|
|
933
1095
|
return await this.jsonRequest(
|
|
934
1096
|
`/workspace/extensions/${urlEncode(name)}/disable`,
|
|
935
1097
|
"POST /workspace/extensions/:name/disable",
|
|
936
|
-
{ method: "POST", body: params, clientId }
|
|
1098
|
+
{ method: "POST", body: params, clientId, mode: "rest" }
|
|
937
1099
|
);
|
|
938
1100
|
}
|
|
939
1101
|
async updateExtension(name, clientId) {
|
|
940
1102
|
return await this.jsonRequest(
|
|
941
1103
|
`/workspace/extensions/${urlEncode(name)}/update`,
|
|
942
1104
|
"POST /workspace/extensions/:name/update",
|
|
943
|
-
{ method: "POST", body: {}, clientId }
|
|
1105
|
+
{ method: "POST", body: {}, clientId, mode: "rest" }
|
|
944
1106
|
);
|
|
945
1107
|
}
|
|
946
1108
|
async uninstallExtension(name, clientId) {
|
|
947
1109
|
return await this.jsonRequest(
|
|
948
1110
|
`/workspace/extensions/${urlEncode(name)}`,
|
|
949
1111
|
"DELETE /workspace/extensions/:name",
|
|
950
|
-
{ method: "DELETE", clientId }
|
|
1112
|
+
{ method: "DELETE", clientId, mode: "rest" }
|
|
1113
|
+
);
|
|
1114
|
+
}
|
|
1115
|
+
async extensionCatalog() {
|
|
1116
|
+
return await this.jsonRequest(
|
|
1117
|
+
"/extensions",
|
|
1118
|
+
"GET /extensions",
|
|
1119
|
+
{ mode: "rest" }
|
|
1120
|
+
);
|
|
1121
|
+
}
|
|
1122
|
+
async installUserExtension(params, clientId) {
|
|
1123
|
+
return await this.jsonRequest(
|
|
1124
|
+
"/extensions/install",
|
|
1125
|
+
"POST /extensions/install",
|
|
1126
|
+
{ method: "POST", body: params, clientId, mode: "rest" }
|
|
1127
|
+
);
|
|
1128
|
+
}
|
|
1129
|
+
async checkUserExtensionUpdates(clientId) {
|
|
1130
|
+
return await this.jsonRequest(
|
|
1131
|
+
"/extensions/check-updates",
|
|
1132
|
+
"POST /extensions/check-updates",
|
|
1133
|
+
{ method: "POST", body: {}, clientId, mode: "rest" }
|
|
1134
|
+
);
|
|
1135
|
+
}
|
|
1136
|
+
async updateUserExtension(extensionId, clientId) {
|
|
1137
|
+
return await this.jsonRequest(
|
|
1138
|
+
`/extensions/${urlEncode(extensionId)}/update`,
|
|
1139
|
+
"POST /extensions/:extensionId/update",
|
|
1140
|
+
{ method: "POST", body: {}, clientId, mode: "rest" }
|
|
951
1141
|
);
|
|
952
1142
|
}
|
|
1143
|
+
async uninstallUserExtension(extensionId, clientId) {
|
|
1144
|
+
return await this.fetchWithTimeout(
|
|
1145
|
+
`${this.baseUrl}/extensions/${urlEncode(extensionId)}`,
|
|
1146
|
+
{
|
|
1147
|
+
method: "DELETE",
|
|
1148
|
+
headers: this.headers({}, clientId)
|
|
1149
|
+
},
|
|
1150
|
+
async (res) => {
|
|
1151
|
+
if (res.status === 204) {
|
|
1152
|
+
await res.body?.cancel().catch(() => void 0);
|
|
1153
|
+
return void 0;
|
|
1154
|
+
}
|
|
1155
|
+
if (!res.ok) {
|
|
1156
|
+
throw await this.failOnError(res, "DELETE /extensions/:extensionId");
|
|
1157
|
+
}
|
|
1158
|
+
return await res.json();
|
|
1159
|
+
},
|
|
1160
|
+
void 0,
|
|
1161
|
+
"rest"
|
|
1162
|
+
);
|
|
1163
|
+
}
|
|
1164
|
+
async setExtensionDefaultActivation(extensionId, state, clientId) {
|
|
1165
|
+
return await this.jsonRequest(
|
|
1166
|
+
`/extensions/${urlEncode(extensionId)}/activation`,
|
|
1167
|
+
"PUT /extensions/:extensionId/activation",
|
|
1168
|
+
{ method: "PUT", body: { state }, clientId, mode: "rest" }
|
|
1169
|
+
);
|
|
1170
|
+
}
|
|
1171
|
+
async extensionOperation(operationId, signal) {
|
|
1172
|
+
return await this.jsonRequest(
|
|
1173
|
+
`/extensions/operations/${urlEncode(operationId)}`,
|
|
1174
|
+
"GET /extensions/operations/:operationId",
|
|
1175
|
+
signal ? { signal, mode: "rest" } : { mode: "rest" }
|
|
1176
|
+
);
|
|
1177
|
+
}
|
|
1178
|
+
async waitForExtensionOperation(handle, options = {}) {
|
|
1179
|
+
const pollIntervalMs = options.pollIntervalMs ?? 1e3;
|
|
1180
|
+
const timeoutMs = options.timeoutMs ?? 10 * 6e4;
|
|
1181
|
+
const hasDeadline = timeoutMs !== Number.POSITIVE_INFINITY;
|
|
1182
|
+
const deadline = Date.now() + timeoutMs;
|
|
1183
|
+
const timeoutError = /* @__PURE__ */ __name(() => new Error(
|
|
1184
|
+
`Timed out waiting for extension operation ${handle.operationId}. The server operation was not cancelled.`
|
|
1185
|
+
), "timeoutError");
|
|
1186
|
+
for (; ; ) {
|
|
1187
|
+
options.signal?.throwIfAborted();
|
|
1188
|
+
const pollBudgetMs = deadline - Date.now();
|
|
1189
|
+
if (pollBudgetMs <= 0 || Number.isNaN(pollBudgetMs)) {
|
|
1190
|
+
throw timeoutError();
|
|
1191
|
+
}
|
|
1192
|
+
let operation;
|
|
1193
|
+
if (!hasDeadline) {
|
|
1194
|
+
operation = await this.extensionOperation(
|
|
1195
|
+
handle.operationId,
|
|
1196
|
+
options.signal
|
|
1197
|
+
);
|
|
1198
|
+
} else {
|
|
1199
|
+
const deadlineController = new AbortController();
|
|
1200
|
+
const pollSignal = options.signal ? composeAbortSignals2([options.signal, deadlineController.signal]) : deadlineController.signal;
|
|
1201
|
+
let deadlineTimer;
|
|
1202
|
+
const deadlinePromise = new Promise((_, reject) => {
|
|
1203
|
+
const expire = /* @__PURE__ */ __name(() => {
|
|
1204
|
+
const error = timeoutError();
|
|
1205
|
+
reject(error);
|
|
1206
|
+
deadlineController.abort(error);
|
|
1207
|
+
}, "expire");
|
|
1208
|
+
const schedule = /* @__PURE__ */ __name(() => {
|
|
1209
|
+
const remainingMs2 = deadline - Date.now();
|
|
1210
|
+
if (remainingMs2 <= 0) {
|
|
1211
|
+
expire();
|
|
1212
|
+
return;
|
|
1213
|
+
}
|
|
1214
|
+
deadlineTimer = setTimeout(
|
|
1215
|
+
() => {
|
|
1216
|
+
if (Date.now() >= deadline) {
|
|
1217
|
+
expire();
|
|
1218
|
+
} else {
|
|
1219
|
+
schedule();
|
|
1220
|
+
}
|
|
1221
|
+
},
|
|
1222
|
+
Math.min(remainingMs2, MAX_TIMER_DELAY_MS)
|
|
1223
|
+
);
|
|
1224
|
+
}, "schedule");
|
|
1225
|
+
schedule();
|
|
1226
|
+
});
|
|
1227
|
+
try {
|
|
1228
|
+
operation = await Promise.race([
|
|
1229
|
+
this.extensionOperation(handle.operationId, pollSignal),
|
|
1230
|
+
deadlinePromise
|
|
1231
|
+
]);
|
|
1232
|
+
} finally {
|
|
1233
|
+
if (deadlineTimer !== void 0) clearTimeout(deadlineTimer);
|
|
1234
|
+
deadlineController.abort();
|
|
1235
|
+
}
|
|
1236
|
+
}
|
|
1237
|
+
if (operation.status !== "queued" && operation.status !== "running") {
|
|
1238
|
+
return operation;
|
|
1239
|
+
}
|
|
1240
|
+
const remainingMs = deadline - Date.now();
|
|
1241
|
+
if (remainingMs <= 0) {
|
|
1242
|
+
throw timeoutError();
|
|
1243
|
+
}
|
|
1244
|
+
await new Promise((resolve, reject) => {
|
|
1245
|
+
const finish = /* @__PURE__ */ __name(() => {
|
|
1246
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
1247
|
+
resolve();
|
|
1248
|
+
}, "finish");
|
|
1249
|
+
const timer = setTimeout(
|
|
1250
|
+
finish,
|
|
1251
|
+
Math.min(pollIntervalMs, remainingMs, MAX_TIMER_DELAY_MS)
|
|
1252
|
+
);
|
|
1253
|
+
const onAbort = /* @__PURE__ */ __name(() => {
|
|
1254
|
+
clearTimeout(timer);
|
|
1255
|
+
options.signal?.removeEventListener("abort", onAbort);
|
|
1256
|
+
reject(
|
|
1257
|
+
options.signal?.reason ?? new DOMException("Aborted", "AbortError")
|
|
1258
|
+
);
|
|
1259
|
+
}, "onAbort");
|
|
1260
|
+
options.signal?.addEventListener("abort", onAbort, { once: true });
|
|
1261
|
+
if (options.signal?.aborted) onAbort();
|
|
1262
|
+
});
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
953
1265
|
// -- Workspace files (workspace files) -------------------------------
|
|
954
1266
|
async readWorkspaceFile(filePath, opts = {}, clientId) {
|
|
955
1267
|
const url = new URL(`${this.baseUrl}/file`);
|
|
@@ -1334,6 +1646,9 @@ var DaemonClient = class {
|
|
|
1334
1646
|
}
|
|
1335
1647
|
// -- Sessions ----------------------------------------------------------
|
|
1336
1648
|
async createOrAttachSession(req, clientId) {
|
|
1649
|
+
if (req.sourceType !== void 0 || req.sourceId !== void 0) {
|
|
1650
|
+
await this.requireCapability("session_source_metadata");
|
|
1651
|
+
}
|
|
1337
1652
|
return await this.fetchWithTimeout(
|
|
1338
1653
|
`${this.baseUrl}/session`,
|
|
1339
1654
|
{
|
|
@@ -1349,7 +1664,9 @@ var DaemonClient = class {
|
|
|
1349
1664
|
// bridge's own validation uses (`httpAcpBridge.ts:
|
|
1350
1665
|
// spawnOrAttach`); SDK should be a transparent layer here.
|
|
1351
1666
|
...req.sessionScope !== void 0 ? { sessionScope: req.sessionScope } : {},
|
|
1352
|
-
...req.approvalMode !== void 0 ? { approvalMode: req.approvalMode } : {}
|
|
1667
|
+
...req.approvalMode !== void 0 ? { approvalMode: req.approvalMode } : {},
|
|
1668
|
+
...req.sourceType !== void 0 ? { sourceType: req.sourceType } : {},
|
|
1669
|
+
...req.sourceId !== void 0 ? { sourceId: req.sourceId } : {}
|
|
1353
1670
|
})
|
|
1354
1671
|
},
|
|
1355
1672
|
async (res) => {
|
|
@@ -1359,14 +1676,17 @@ var DaemonClient = class {
|
|
|
1359
1676
|
);
|
|
1360
1677
|
}
|
|
1361
1678
|
/**
|
|
1362
|
-
* Enumerate
|
|
1363
|
-
*
|
|
1679
|
+
* Enumerate the session catalog for a workspace. Used by session-picker UIs.
|
|
1680
|
+
* Returns an empty list (not 404) when the workspace has no sessions.
|
|
1364
1681
|
*/
|
|
1365
1682
|
async listWorkspaceSessions(workspaceCwd, options) {
|
|
1366
1683
|
const page = await this.listWorkspaceSessionsPage(workspaceCwd, options);
|
|
1367
1684
|
return page.sessions;
|
|
1368
1685
|
}
|
|
1369
1686
|
async listWorkspaceSessionsPage(workspaceCwd, options) {
|
|
1687
|
+
if (options?.sourceType !== void 0 || options?.sourceId !== void 0) {
|
|
1688
|
+
await this.requireCapability("session_source_metadata");
|
|
1689
|
+
}
|
|
1370
1690
|
const requestedPageSize = options?.pageSize ?? DEFAULT_SESSION_LIST_PAGE_SIZE;
|
|
1371
1691
|
const pageSize = Math.max(
|
|
1372
1692
|
1,
|
|
@@ -1393,6 +1713,12 @@ var DaemonClient = class {
|
|
|
1393
1713
|
if (options?.parentSessionId !== void 0) {
|
|
1394
1714
|
query.set("parentSessionId", options.parentSessionId);
|
|
1395
1715
|
}
|
|
1716
|
+
if (options?.sourceType !== void 0) {
|
|
1717
|
+
query.set("sourceType", options.sourceType);
|
|
1718
|
+
}
|
|
1719
|
+
if (options?.sourceId !== void 0) {
|
|
1720
|
+
query.set("sourceId", options.sourceId);
|
|
1721
|
+
}
|
|
1396
1722
|
return await this.jsonRequest(
|
|
1397
1723
|
`/workspace/${urlEncode(workspaceCwd)}/sessions?${query.toString()}`,
|
|
1398
1724
|
"GET /workspace/sessions"
|
|
@@ -1438,29 +1764,10 @@ var DaemonClient = class {
|
|
|
1438
1764
|
return this.restoreSession("load", sessionId, req, clientId);
|
|
1439
1765
|
}
|
|
1440
1766
|
async exportSession(sessionId, opts = {}) {
|
|
1441
|
-
|
|
1442
|
-
|
|
1443
|
-
|
|
1444
|
-
|
|
1445
|
-
{ headers: this.headers({}, opts.clientId) },
|
|
1446
|
-
async (res) => {
|
|
1447
|
-
if (!res.ok) {
|
|
1448
|
-
throw await this.failOnError(res, "GET /session/:id/export");
|
|
1449
|
-
}
|
|
1450
|
-
const content = await res.text();
|
|
1451
|
-
const mimeType = res.headers.get("content-type") ?? "";
|
|
1452
|
-
const filename = /filename="([^"]+)"/i.exec(
|
|
1453
|
-
res.headers.get("content-disposition") ?? ""
|
|
1454
|
-
)?.[1] ?? `export.${format}`;
|
|
1455
|
-
return {
|
|
1456
|
-
content,
|
|
1457
|
-
filename,
|
|
1458
|
-
mimeType,
|
|
1459
|
-
format
|
|
1460
|
-
};
|
|
1461
|
-
},
|
|
1462
|
-
void 0,
|
|
1463
|
-
"rest"
|
|
1767
|
+
return await this.sessionExportRequest(
|
|
1768
|
+
`/session/${urlEncode(sessionId)}/export`,
|
|
1769
|
+
"GET /session/:id/export",
|
|
1770
|
+
opts
|
|
1464
1771
|
);
|
|
1465
1772
|
}
|
|
1466
1773
|
async getSessionTranscriptPage(sessionId, opts = {}) {
|
|
@@ -1715,7 +2022,9 @@ var DaemonClient = class {
|
|
|
1715
2022
|
);
|
|
1716
2023
|
}
|
|
1717
2024
|
return await res.json();
|
|
1718
|
-
}
|
|
2025
|
+
},
|
|
2026
|
+
void 0,
|
|
2027
|
+
"rest"
|
|
1719
2028
|
);
|
|
1720
2029
|
}
|
|
1721
2030
|
async rewindSession(sessionId, promptId, opts) {
|
|
@@ -1737,7 +2046,9 @@ var DaemonClient = class {
|
|
|
1737
2046
|
throw await this.failOnError(res, "POST /session/:id/rewind");
|
|
1738
2047
|
}
|
|
1739
2048
|
return await res.json();
|
|
1740
|
-
}
|
|
2049
|
+
},
|
|
2050
|
+
void 0,
|
|
2051
|
+
"rest"
|
|
1741
2052
|
);
|
|
1742
2053
|
}
|
|
1743
2054
|
/**
|
|
@@ -1782,6 +2093,31 @@ var DaemonClient = class {
|
|
|
1782
2093
|
if (!res.ok) throw await this.failOnError(res, "POST /session/:id/recap");
|
|
1783
2094
|
return await res.json();
|
|
1784
2095
|
}
|
|
2096
|
+
async *generateSessionContent(sessionId, prompt, opts) {
|
|
2097
|
+
const res = await this.transport.fetch(
|
|
2098
|
+
`${this.baseUrl}/session/${urlEncode(sessionId)}/generate`,
|
|
2099
|
+
{
|
|
2100
|
+
method: "POST",
|
|
2101
|
+
headers: this.headers(
|
|
2102
|
+
{
|
|
2103
|
+
"Content-Type": "application/json",
|
|
2104
|
+
Accept: "text/event-stream"
|
|
2105
|
+
},
|
|
2106
|
+
opts?.clientId
|
|
2107
|
+
),
|
|
2108
|
+
body: JSON.stringify({ prompt }),
|
|
2109
|
+
signal: opts?.signal
|
|
2110
|
+
}
|
|
2111
|
+
);
|
|
2112
|
+
if (!res.ok) {
|
|
2113
|
+
throw await this.failOnError(res, "POST /session/:id/generate");
|
|
2114
|
+
}
|
|
2115
|
+
if (!res.body) throw new Error("Generation response body is missing");
|
|
2116
|
+
for await (const event of parseSseStream(res.body, opts?.signal)) {
|
|
2117
|
+
const generationEvent = parseSessionGenerationEvent(event);
|
|
2118
|
+
if (generationEvent) yield generationEvent;
|
|
2119
|
+
}
|
|
2120
|
+
}
|
|
1785
2121
|
async btwSession(sessionId, question, opts) {
|
|
1786
2122
|
const res = await this.transport.fetch(
|
|
1787
2123
|
`${this.baseUrl}/session/${urlEncode(sessionId)}/btw`,
|
|
@@ -1932,6 +2268,35 @@ var DaemonClient = class {
|
|
|
1932
2268
|
}
|
|
1933
2269
|
);
|
|
1934
2270
|
}
|
|
2271
|
+
/**
|
|
2272
|
+
* Toggle a user-invocable skill in workspace `skills.disabled` settings.
|
|
2273
|
+
* Active ACP sessions refresh their skill validation and command lists before
|
|
2274
|
+
* the response returns; `activation` reports deferred or partial refreshes.
|
|
2275
|
+
*
|
|
2276
|
+
* Pre-flight `caps.features.includes('workspace_skill_toggle')` before calling.
|
|
2277
|
+
*/
|
|
2278
|
+
async setWorkspaceSkillEnabled(skillName, enabled, opts) {
|
|
2279
|
+
return await this.fetchWithTimeout(
|
|
2280
|
+
`${this.baseUrl}/workspace/skills/${urlEncode(skillName)}/enable`,
|
|
2281
|
+
{
|
|
2282
|
+
method: "POST",
|
|
2283
|
+
headers: this.headers(
|
|
2284
|
+
{ "Content-Type": "application/json" },
|
|
2285
|
+
opts?.clientId
|
|
2286
|
+
),
|
|
2287
|
+
body: JSON.stringify({ enabled })
|
|
2288
|
+
},
|
|
2289
|
+
async (res) => {
|
|
2290
|
+
if (!res.ok) {
|
|
2291
|
+
throw await this.failOnError(
|
|
2292
|
+
res,
|
|
2293
|
+
"POST /workspace/skills/:name/enable"
|
|
2294
|
+
);
|
|
2295
|
+
}
|
|
2296
|
+
return await res.json();
|
|
2297
|
+
}
|
|
2298
|
+
);
|
|
2299
|
+
}
|
|
1935
2300
|
async workspaceSettings(opts) {
|
|
1936
2301
|
return await this.fetchWithTimeout(
|
|
1937
2302
|
`${this.baseUrl}/workspace/settings`,
|
|
@@ -1966,6 +2331,25 @@ var DaemonClient = class {
|
|
|
1966
2331
|
}
|
|
1967
2332
|
);
|
|
1968
2333
|
}
|
|
2334
|
+
async deleteModel(target, opts) {
|
|
2335
|
+
return await this.fetchWithTimeout(
|
|
2336
|
+
`${this.baseUrl}/workspace/models`,
|
|
2337
|
+
{
|
|
2338
|
+
method: "DELETE",
|
|
2339
|
+
headers: this.headers(
|
|
2340
|
+
{ "Content-Type": "application/json" },
|
|
2341
|
+
opts?.clientId
|
|
2342
|
+
),
|
|
2343
|
+
body: JSON.stringify(target)
|
|
2344
|
+
},
|
|
2345
|
+
async (res) => {
|
|
2346
|
+
if (!res.ok) {
|
|
2347
|
+
throw await this.failOnError(res, "DELETE /workspace/models");
|
|
2348
|
+
}
|
|
2349
|
+
return await res.json();
|
|
2350
|
+
}
|
|
2351
|
+
);
|
|
2352
|
+
}
|
|
1969
2353
|
async workspaceVoice(clientId) {
|
|
1970
2354
|
return await this.jsonRequest(
|
|
1971
2355
|
"/workspace/voice",
|
|
@@ -1981,9 +2365,26 @@ var DaemonClient = class {
|
|
|
1981
2365
|
);
|
|
1982
2366
|
}
|
|
1983
2367
|
async transcribeWorkspaceVoice(audio, opts) {
|
|
2368
|
+
return await this.voiceTranscriptionRequest(
|
|
2369
|
+
"/workspace/voice/transcribe",
|
|
2370
|
+
"POST /workspace/voice/transcribe",
|
|
2371
|
+
audio,
|
|
2372
|
+
opts
|
|
2373
|
+
);
|
|
2374
|
+
}
|
|
2375
|
+
/** @internal */
|
|
2376
|
+
async workspaceVoiceTranscriptionRequest(workspaceSelector, audio, opts) {
|
|
2377
|
+
return await this.voiceTranscriptionRequest(
|
|
2378
|
+
`/workspaces/${workspaceSelector}/voice/transcribe`,
|
|
2379
|
+
"POST /workspaces/:workspace/voice/transcribe",
|
|
2380
|
+
audio,
|
|
2381
|
+
opts
|
|
2382
|
+
);
|
|
2383
|
+
}
|
|
2384
|
+
async voiceTranscriptionRequest(path, label, audio, opts) {
|
|
1984
2385
|
const query = opts.voiceModel ? `?${new URLSearchParams({ voiceModel: opts.voiceModel }).toString()}` : "";
|
|
1985
2386
|
return await this.fetchWithTimeout(
|
|
1986
|
-
`${this.baseUrl}
|
|
2387
|
+
`${this.baseUrl}${path}${query}`,
|
|
1987
2388
|
{
|
|
1988
2389
|
method: "POST",
|
|
1989
2390
|
headers: this.headers({ "Content-Type": opts.mimeType }, opts.clientId),
|
|
@@ -1991,11 +2392,11 @@ var DaemonClient = class {
|
|
|
1991
2392
|
},
|
|
1992
2393
|
async (res) => {
|
|
1993
2394
|
if (!res.ok) {
|
|
1994
|
-
throw await this.failOnError(res,
|
|
2395
|
+
throw await this.failOnError(res, label);
|
|
1995
2396
|
}
|
|
1996
2397
|
return await res.json();
|
|
1997
2398
|
},
|
|
1998
|
-
VOICE_TRANSCRIPTION_DEFAULT_TIMEOUT_MS,
|
|
2399
|
+
opts.timeoutMs ?? VOICE_TRANSCRIPTION_DEFAULT_TIMEOUT_MS,
|
|
1999
2400
|
"rest"
|
|
2000
2401
|
);
|
|
2001
2402
|
}
|
|
@@ -2155,8 +2556,8 @@ var DaemonClient = class {
|
|
|
2155
2556
|
/**
|
|
2156
2557
|
* Reload the daemon-managed channel worker: the daemon stops and relaunches
|
|
2157
2558
|
* it so it re-reads settings.json (channels / proxy / per-channel model).
|
|
2158
|
-
* Requires
|
|
2159
|
-
*
|
|
2559
|
+
* Requires an enabled runtime selection; otherwise the route responds 409.
|
|
2560
|
+
* Pre-flight the dynamic `channel_reload` capability.
|
|
2160
2561
|
*/
|
|
2161
2562
|
async reloadChannelWorker(opts) {
|
|
2162
2563
|
return await this.fetchWithTimeout(
|
|
@@ -2175,9 +2576,61 @@ var DaemonClient = class {
|
|
|
2175
2576
|
}
|
|
2176
2577
|
return await res.json();
|
|
2177
2578
|
},
|
|
2579
|
+
opts?.timeoutMs ?? CHANNEL_CONTROL_DEFAULT_TIMEOUT_MS
|
|
2580
|
+
);
|
|
2581
|
+
}
|
|
2582
|
+
async getChannelWorkerControl(opts) {
|
|
2583
|
+
return await this.fetchWithTimeout(
|
|
2584
|
+
`${this.baseUrl}/workspace/channel`,
|
|
2585
|
+
{
|
|
2586
|
+
method: "GET",
|
|
2587
|
+
headers: this.headers({}, opts?.clientId)
|
|
2588
|
+
},
|
|
2589
|
+
async (res) => {
|
|
2590
|
+
if (!res.ok) {
|
|
2591
|
+
throw await this.failOnError(res, "GET /workspace/channel");
|
|
2592
|
+
}
|
|
2593
|
+
return await res.json();
|
|
2594
|
+
},
|
|
2178
2595
|
opts?.timeoutMs
|
|
2179
2596
|
);
|
|
2180
2597
|
}
|
|
2598
|
+
async setChannelWorkerSelection(selection, opts) {
|
|
2599
|
+
return await this.fetchWithTimeout(
|
|
2600
|
+
`${this.baseUrl}/workspace/channel`,
|
|
2601
|
+
{
|
|
2602
|
+
method: "PUT",
|
|
2603
|
+
headers: this.headers(
|
|
2604
|
+
{ "Content-Type": "application/json" },
|
|
2605
|
+
opts?.clientId
|
|
2606
|
+
),
|
|
2607
|
+
body: JSON.stringify({ selection })
|
|
2608
|
+
},
|
|
2609
|
+
async (res) => {
|
|
2610
|
+
if (!res.ok) {
|
|
2611
|
+
throw await this.failOnError(res, "PUT /workspace/channel");
|
|
2612
|
+
}
|
|
2613
|
+
return await res.json();
|
|
2614
|
+
},
|
|
2615
|
+
opts?.timeoutMs ?? CHANNEL_CONTROL_DEFAULT_TIMEOUT_MS
|
|
2616
|
+
);
|
|
2617
|
+
}
|
|
2618
|
+
async stopChannelWorker(opts) {
|
|
2619
|
+
return await this.fetchWithTimeout(
|
|
2620
|
+
`${this.baseUrl}/workspace/channel`,
|
|
2621
|
+
{
|
|
2622
|
+
method: "DELETE",
|
|
2623
|
+
headers: this.headers({}, opts?.clientId)
|
|
2624
|
+
},
|
|
2625
|
+
async (res) => {
|
|
2626
|
+
if (!res.ok) {
|
|
2627
|
+
throw await this.failOnError(res, "DELETE /workspace/channel");
|
|
2628
|
+
}
|
|
2629
|
+
return await res.json();
|
|
2630
|
+
},
|
|
2631
|
+
opts?.timeoutMs ?? CHANNEL_CONTROL_DEFAULT_TIMEOUT_MS
|
|
2632
|
+
);
|
|
2633
|
+
}
|
|
2181
2634
|
async manageMcpServer(serverName, action, opts) {
|
|
2182
2635
|
return await this.fetchWithTimeout(
|
|
2183
2636
|
`${this.baseUrl}/workspace/mcp/${urlEncode(serverName)}/${urlEncode(action)}`,
|
|
@@ -2784,13 +3237,16 @@ var DaemonClient = class {
|
|
|
2784
3237
|
}
|
|
2785
3238
|
);
|
|
2786
3239
|
}
|
|
2787
|
-
async addWorkspace(cwd) {
|
|
3240
|
+
async addWorkspace(cwd, options = {}) {
|
|
2788
3241
|
return await this.fetchWithTimeout(
|
|
2789
3242
|
`${this.baseUrl}/workspaces`,
|
|
2790
3243
|
{
|
|
2791
3244
|
method: "POST",
|
|
2792
3245
|
headers: this.headers({ "Content-Type": "application/json" }),
|
|
2793
|
-
body: JSON.stringify({
|
|
3246
|
+
body: JSON.stringify({
|
|
3247
|
+
cwd,
|
|
3248
|
+
...options.persist ? { persist: true } : {}
|
|
3249
|
+
})
|
|
2794
3250
|
},
|
|
2795
3251
|
async (res) => {
|
|
2796
3252
|
if (!res.ok) {
|
|
@@ -2872,6 +3328,37 @@ var WorkspaceDaemonClient = class {
|
|
|
2872
3328
|
workspaceMcp() {
|
|
2873
3329
|
return this.get("/mcp", "GET /workspaces/:workspace/mcp");
|
|
2874
3330
|
}
|
|
3331
|
+
workspaceVoice(clientId) {
|
|
3332
|
+
return this.client.workspaceJsonRequest(
|
|
3333
|
+
this.workspaceSelector,
|
|
3334
|
+
"/voice",
|
|
3335
|
+
"GET /workspaces/:workspace/voice",
|
|
3336
|
+
{ clientId, mode: "rest" }
|
|
3337
|
+
);
|
|
3338
|
+
}
|
|
3339
|
+
setWorkspaceVoice(update, clientId) {
|
|
3340
|
+
return this.client.workspaceJsonRequest(
|
|
3341
|
+
this.workspaceSelector,
|
|
3342
|
+
"/voice",
|
|
3343
|
+
"POST /workspaces/:workspace/voice",
|
|
3344
|
+
{ method: "POST", body: update, clientId, mode: "rest" }
|
|
3345
|
+
);
|
|
3346
|
+
}
|
|
3347
|
+
transcribeWorkspaceVoice(audio, opts) {
|
|
3348
|
+
return this.client.workspaceVoiceTranscriptionRequest(
|
|
3349
|
+
this.workspaceSelector,
|
|
3350
|
+
audio,
|
|
3351
|
+
opts
|
|
3352
|
+
);
|
|
3353
|
+
}
|
|
3354
|
+
workspaceGit() {
|
|
3355
|
+
return this.client.workspaceJsonRequest(
|
|
3356
|
+
this.workspaceSelector,
|
|
3357
|
+
"/git",
|
|
3358
|
+
"GET /workspaces/:workspace/git",
|
|
3359
|
+
{ mode: "rest" }
|
|
3360
|
+
);
|
|
3361
|
+
}
|
|
2875
3362
|
workspaceSkills() {
|
|
2876
3363
|
return this.get("/skills", "GET /workspaces/:workspace/skills");
|
|
2877
3364
|
}
|
|
@@ -2893,6 +3380,22 @@ var WorkspaceDaemonClient = class {
|
|
|
2893
3380
|
workspaceMemory() {
|
|
2894
3381
|
return this.get("/memory", "GET /workspaces/:workspace/memory");
|
|
2895
3382
|
}
|
|
3383
|
+
remove(options) {
|
|
3384
|
+
const body = options?.force === void 0 ? void 0 : {
|
|
3385
|
+
force: options.force
|
|
3386
|
+
};
|
|
3387
|
+
return this.client.workspaceJsonRequest(
|
|
3388
|
+
this.workspaceSelector,
|
|
3389
|
+
"",
|
|
3390
|
+
"DELETE /workspaces/:workspace",
|
|
3391
|
+
{
|
|
3392
|
+
method: "DELETE",
|
|
3393
|
+
...body ? { body } : {},
|
|
3394
|
+
...options?.timeoutMs !== void 0 ? { timeoutMs: options.timeoutMs } : {},
|
|
3395
|
+
mode: "rest"
|
|
3396
|
+
}
|
|
3397
|
+
);
|
|
3398
|
+
}
|
|
2896
3399
|
writeWorkspaceMemory(req, clientId) {
|
|
2897
3400
|
return this.post(
|
|
2898
3401
|
"/memory",
|
|
@@ -2940,7 +3443,10 @@ var WorkspaceDaemonClient = class {
|
|
|
2940
3443
|
}
|
|
2941
3444
|
);
|
|
2942
3445
|
}
|
|
2943
|
-
listWorkspaceSessionsPage(options) {
|
|
3446
|
+
async listWorkspaceSessionsPage(options) {
|
|
3447
|
+
if (options?.sourceType !== void 0 || options?.sourceId !== void 0) {
|
|
3448
|
+
await this.client.requireCapability("session_source_metadata");
|
|
3449
|
+
}
|
|
2944
3450
|
const requestedPageSize = options?.pageSize ?? DEFAULT_SESSION_LIST_PAGE_SIZE;
|
|
2945
3451
|
const pageSize = Math.max(
|
|
2946
3452
|
1,
|
|
@@ -2961,7 +3467,13 @@ var WorkspaceDaemonClient = class {
|
|
|
2961
3467
|
if (options?.parentSessionId !== void 0) {
|
|
2962
3468
|
query.set("parentSessionId", options.parentSessionId);
|
|
2963
3469
|
}
|
|
2964
|
-
|
|
3470
|
+
if (options?.sourceType !== void 0) {
|
|
3471
|
+
query.set("sourceType", options.sourceType);
|
|
3472
|
+
}
|
|
3473
|
+
if (options?.sourceId !== void 0) {
|
|
3474
|
+
query.set("sourceId", options.sourceId);
|
|
3475
|
+
}
|
|
3476
|
+
return await this.get(
|
|
2965
3477
|
`/sessions?${query.toString()}`,
|
|
2966
3478
|
"GET /workspaces/:workspace/sessions"
|
|
2967
3479
|
);
|
|
@@ -2970,6 +3482,40 @@ var WorkspaceDaemonClient = class {
|
|
|
2970
3482
|
const page = await this.listWorkspaceSessionsPage(options);
|
|
2971
3483
|
return page.sessions;
|
|
2972
3484
|
}
|
|
3485
|
+
/**
|
|
3486
|
+
* Read one page from an active persisted session transcript in this
|
|
3487
|
+
* workspace.
|
|
3488
|
+
* The daemon performs replay locally without attaching to the session or
|
|
3489
|
+
* starting ACP. This method always uses native REST transport.
|
|
3490
|
+
*/
|
|
3491
|
+
getSessionTranscriptPage(sessionId, opts = {}) {
|
|
3492
|
+
const query = new URLSearchParams();
|
|
3493
|
+
if (opts.cursor !== void 0) query.set("cursor", opts.cursor);
|
|
3494
|
+
if (opts.limit !== void 0) query.set("limit", String(opts.limit));
|
|
3495
|
+
const suffix = query.size > 0 ? `?${query.toString()}` : "";
|
|
3496
|
+
return this.client.workspaceJsonRequest(
|
|
3497
|
+
this.workspaceSelector,
|
|
3498
|
+
`/session/${urlEncode(sessionId)}/transcript${suffix}`,
|
|
3499
|
+
"GET /workspaces/:workspace/session/:id/transcript",
|
|
3500
|
+
{ clientId: opts.clientId, mode: "rest" }
|
|
3501
|
+
);
|
|
3502
|
+
}
|
|
3503
|
+
/** Export an active persisted session from this registered workspace. */
|
|
3504
|
+
exportSession(sessionId, opts = {}) {
|
|
3505
|
+
return this.client.sessionExportRequest(
|
|
3506
|
+
`/workspaces/${this.workspaceSelector}/session/${urlEncode(sessionId)}/export`,
|
|
3507
|
+
"GET /workspaces/:workspace/session/:id/export",
|
|
3508
|
+
opts
|
|
3509
|
+
);
|
|
3510
|
+
}
|
|
3511
|
+
/** Export an archived persisted session from this registered workspace. */
|
|
3512
|
+
exportArchivedSession(sessionId, opts = {}) {
|
|
3513
|
+
return this.client.sessionExportRequest(
|
|
3514
|
+
`/workspaces/${this.workspaceSelector}/session/${urlEncode(sessionId)}/archive/export`,
|
|
3515
|
+
"GET /workspaces/:workspace/session/:id/archive/export",
|
|
3516
|
+
opts
|
|
3517
|
+
);
|
|
3518
|
+
}
|
|
2973
3519
|
listSessionGroups() {
|
|
2974
3520
|
return this.get(
|
|
2975
3521
|
"/session-groups",
|
|
@@ -3001,6 +3547,14 @@ var WorkspaceDaemonClient = class {
|
|
|
3001
3547
|
{ method: "DELETE" }
|
|
3002
3548
|
);
|
|
3003
3549
|
}
|
|
3550
|
+
updateSessionOrganization(sessionId, update, clientId) {
|
|
3551
|
+
return this.client.workspaceJsonRequest(
|
|
3552
|
+
this.workspaceSelector,
|
|
3553
|
+
`/session/${urlEncode(sessionId)}/organization`,
|
|
3554
|
+
"PATCH /workspaces/:workspace/session/:id/organization",
|
|
3555
|
+
{ method: "PATCH", body: update, clientId }
|
|
3556
|
+
);
|
|
3557
|
+
}
|
|
3004
3558
|
deleteSessionsData(sessionIds, clientId) {
|
|
3005
3559
|
return this.post(
|
|
3006
3560
|
"/sessions/delete",
|
|
@@ -3062,11 +3616,16 @@ var WorkspaceDaemonClient = class {
|
|
|
3062
3616
|
"GET /workspaces/:workspace/list"
|
|
3063
3617
|
);
|
|
3064
3618
|
}
|
|
3065
|
-
glob(pattern) {
|
|
3619
|
+
glob(pattern, opts = {}) {
|
|
3066
3620
|
const query = new URLSearchParams({ pattern });
|
|
3067
|
-
|
|
3621
|
+
if (opts.maxResults !== void 0) {
|
|
3622
|
+
query.set("maxResults", String(opts.maxResults));
|
|
3623
|
+
}
|
|
3624
|
+
return this.client.workspaceJsonRequest(
|
|
3625
|
+
this.workspaceSelector,
|
|
3068
3626
|
`/glob?${query.toString()}`,
|
|
3069
|
-
"GET /workspaces/:workspace/glob"
|
|
3627
|
+
"GET /workspaces/:workspace/glob",
|
|
3628
|
+
{ signal: opts.signal }
|
|
3070
3629
|
);
|
|
3071
3630
|
}
|
|
3072
3631
|
writeWorkspaceFile(req, clientId) {
|
|
@@ -3138,6 +3697,14 @@ var WorkspaceDaemonClient = class {
|
|
|
3138
3697
|
opts?.clientId
|
|
3139
3698
|
);
|
|
3140
3699
|
}
|
|
3700
|
+
setWorkspaceSkillEnabled(skillName, enabled, opts) {
|
|
3701
|
+
return this.post(
|
|
3702
|
+
`/skills/${urlEncode(skillName)}/enable`,
|
|
3703
|
+
"POST /workspaces/:workspace/skills/:name/enable",
|
|
3704
|
+
{ enabled },
|
|
3705
|
+
opts?.clientId
|
|
3706
|
+
);
|
|
3707
|
+
}
|
|
3141
3708
|
restartMcpServer(serverName, opts) {
|
|
3142
3709
|
const query = opts?.entryIndex === void 0 ? "" : `?entryIndex=${urlEncode(String(opts.entryIndex))}`;
|
|
3143
3710
|
return this.post(
|
|
@@ -3165,6 +3732,38 @@ var WorkspaceDaemonClient = class {
|
|
|
3165
3732
|
opts?.clientId
|
|
3166
3733
|
);
|
|
3167
3734
|
}
|
|
3735
|
+
workspaceExtensions() {
|
|
3736
|
+
return this.client.workspaceJsonRequest(
|
|
3737
|
+
this.workspaceSelector,
|
|
3738
|
+
"/extensions",
|
|
3739
|
+
"GET /workspaces/:workspace/extensions",
|
|
3740
|
+
{ mode: "rest" }
|
|
3741
|
+
);
|
|
3742
|
+
}
|
|
3743
|
+
setExtensionActivation(extensionId, state, clientId) {
|
|
3744
|
+
return this.client.workspaceJsonRequest(
|
|
3745
|
+
this.workspaceSelector,
|
|
3746
|
+
`/extensions/${urlEncode(extensionId)}/activation`,
|
|
3747
|
+
"PUT /workspaces/:workspace/extensions/:extensionId/activation",
|
|
3748
|
+
{ method: "PUT", body: { state }, clientId, mode: "rest" }
|
|
3749
|
+
);
|
|
3750
|
+
}
|
|
3751
|
+
clearExtensionActivation(extensionId, clientId) {
|
|
3752
|
+
return this.client.workspaceJsonRequest(
|
|
3753
|
+
this.workspaceSelector,
|
|
3754
|
+
`/extensions/${urlEncode(extensionId)}/activation`,
|
|
3755
|
+
"DELETE /workspaces/:workspace/extensions/:extensionId/activation",
|
|
3756
|
+
{ method: "DELETE", clientId, mode: "rest" }
|
|
3757
|
+
);
|
|
3758
|
+
}
|
|
3759
|
+
refreshExtensionRuntime(clientId) {
|
|
3760
|
+
return this.client.workspaceJsonRequest(
|
|
3761
|
+
this.workspaceSelector,
|
|
3762
|
+
"/extensions/refresh",
|
|
3763
|
+
"POST /workspaces/:workspace/extensions/refresh",
|
|
3764
|
+
{ method: "POST", body: {}, clientId, mode: "rest" }
|
|
3765
|
+
);
|
|
3766
|
+
}
|
|
3168
3767
|
get(path, label, clientId) {
|
|
3169
3768
|
return this.client.workspaceJsonRequest(
|
|
3170
3769
|
this.workspaceSelector,
|
|
@@ -3535,6 +4134,12 @@ var DaemonSessionClient = class _DaemonSessionClient {
|
|
|
3535
4134
|
...this.clientId ? { clientId: this.clientId } : {}
|
|
3536
4135
|
});
|
|
3537
4136
|
}
|
|
4137
|
+
generateContent(prompt, opts) {
|
|
4138
|
+
return this.client.generateSessionContent(this.sessionId, prompt, {
|
|
4139
|
+
...opts?.signal ? { signal: opts.signal } : {},
|
|
4140
|
+
...this.clientId ? { clientId: this.clientId } : {}
|
|
4141
|
+
});
|
|
4142
|
+
}
|
|
3538
4143
|
async btw(question, opts) {
|
|
3539
4144
|
return await this.client.btwSession(this.sessionId, question, {
|
|
3540
4145
|
...opts?.signal ? { signal: opts.signal } : {},
|
|
@@ -3775,6 +4380,7 @@ var DAEMON_KNOWN_EVENT_TYPE_VALUES = [
|
|
|
3775
4380
|
"session_died",
|
|
3776
4381
|
"session_closed",
|
|
3777
4382
|
"session_metadata_updated",
|
|
4383
|
+
"session_recording_degraded",
|
|
3778
4384
|
"artifact_changed",
|
|
3779
4385
|
MID_TURN_MESSAGE_INJECTED_EVENT,
|
|
3780
4386
|
PENDING_PROMPT_ADDED_EVENT,
|
|
@@ -3885,7 +4491,8 @@ var DAEMON_KNOWN_EVENT_TYPE_VALUES = [
|
|
|
3885
4491
|
// `replay_complete` when `?snapshot=1` is set on the SSE endpoint.
|
|
3886
4492
|
// Carries `currentModelId` and `currentApprovalMode` so reconnecting
|
|
3887
4493
|
// clients can seed their reducer without an extra round-trip.
|
|
3888
|
-
"session_snapshot"
|
|
4494
|
+
"session_snapshot",
|
|
4495
|
+
"git_branch_changed"
|
|
3889
4496
|
];
|
|
3890
4497
|
var DAEMON_KNOWN_EVENT_TYPES = new Set(
|
|
3891
4498
|
DAEMON_KNOWN_EVENT_TYPE_VALUES
|
|
@@ -3899,6 +4506,7 @@ var RESYNC_PASSTHROUGH_TYPES = /* @__PURE__ */ new Set([
|
|
|
3899
4506
|
"session_closed",
|
|
3900
4507
|
"client_evicted",
|
|
3901
4508
|
"stream_error",
|
|
4509
|
+
"session_recording_degraded",
|
|
3902
4510
|
// A5 (#4511): the snapshot is a full-state authoritative frame, not a
|
|
3903
4511
|
// delta, so it is safe to apply during resync — and it is exactly what
|
|
3904
4512
|
// lets a client that reconnected past the ring recover currentModelId /
|
|
@@ -3913,6 +4521,7 @@ function createDaemonSessionViewState(seed = {}) {
|
|
|
3913
4521
|
sessionId: seed.sessionId,
|
|
3914
4522
|
currentModelId: seed.currentModelId,
|
|
3915
4523
|
displayName: seed.displayName,
|
|
4524
|
+
recordingDegraded: seed.recordingDegraded ?? false,
|
|
3916
4525
|
lastSessionUpdate: seed.lastSessionUpdate,
|
|
3917
4526
|
lastModelSwitchFailure: seed.lastModelSwitchFailure,
|
|
3918
4527
|
terminalEvent: seed.terminalEvent,
|
|
@@ -3998,6 +4607,8 @@ function asKnownDaemonEvent(event) {
|
|
|
3998
4607
|
return isSessionClosedData(event.data) ? event : void 0;
|
|
3999
4608
|
case "session_metadata_updated":
|
|
4000
4609
|
return isSessionMetadataUpdatedData(event.data) ? event : void 0;
|
|
4610
|
+
case "session_recording_degraded":
|
|
4611
|
+
return isSessionRecordingDegradedData(event.data) ? event : void 0;
|
|
4001
4612
|
case "artifact_changed":
|
|
4002
4613
|
return isArtifactChangedData(event.data) ? event : void 0;
|
|
4003
4614
|
case MID_TURN_MESSAGE_INJECTED_EVENT:
|
|
@@ -4380,7 +4991,14 @@ function reduceDaemonSessionEvent(state, rawEvent) {
|
|
|
4380
4991
|
...base,
|
|
4381
4992
|
sessionId: event.data.sessionId,
|
|
4382
4993
|
...event.data.currentModelId != null ? { currentModelId: event.data.currentModelId } : {},
|
|
4383
|
-
...event.data.currentApprovalMode != null ? { approvalMode: event.data.currentApprovalMode } : {}
|
|
4994
|
+
...event.data.currentApprovalMode != null ? { approvalMode: event.data.currentApprovalMode } : {},
|
|
4995
|
+
...event.data.recordingDegraded !== void 0 ? { recordingDegraded: event.data.recordingDegraded } : {}
|
|
4996
|
+
};
|
|
4997
|
+
case "session_recording_degraded":
|
|
4998
|
+
return {
|
|
4999
|
+
...base,
|
|
5000
|
+
sessionId: event.data.sessionId,
|
|
5001
|
+
recordingDegraded: true
|
|
4384
5002
|
};
|
|
4385
5003
|
case "session_branched":
|
|
4386
5004
|
return {
|
|
@@ -4841,9 +5459,14 @@ function isSessionSnapshotData(value) {
|
|
|
4841
5459
|
if (!isRecord(value) || !isNonEmptyString(value["sessionId"])) return false;
|
|
4842
5460
|
const model = value["currentModelId"];
|
|
4843
5461
|
const mode = value["currentApprovalMode"];
|
|
4844
|
-
|
|
5462
|
+
const recordingDegraded = value["recordingDegraded"];
|
|
5463
|
+
return (model === null || typeof model === "string") && (mode === null || typeof mode === "string") && (recordingDegraded === void 0 || typeof recordingDegraded === "boolean");
|
|
4845
5464
|
}
|
|
4846
5465
|
__name(isSessionSnapshotData, "isSessionSnapshotData");
|
|
5466
|
+
function isSessionRecordingDegradedData(value) {
|
|
5467
|
+
return isRecord(value) && isNonEmptyString(value["sessionId"]) && value["reason"] === "write_failed";
|
|
5468
|
+
}
|
|
5469
|
+
__name(isSessionRecordingDegradedData, "isSessionRecordingDegradedData");
|
|
4847
5470
|
function isPermissionOption(value) {
|
|
4848
5471
|
return isRecord(value) && isNonEmptyString(value["optionId"]);
|
|
4849
5472
|
}
|
|
@@ -4912,67 +5535,6 @@ init_esbuild_shims();
|
|
|
4912
5535
|
// packages/sdk-typescript/src/daemon/ui/normalizer.ts
|
|
4913
5536
|
init_esbuild_shims();
|
|
4914
5537
|
|
|
4915
|
-
// packages/sdk-typescript/src/daemon/types.ts
|
|
4916
|
-
init_esbuild_shims();
|
|
4917
|
-
var DaemonCapabilityMissingError = class extends Error {
|
|
4918
|
-
static {
|
|
4919
|
-
__name(this, "DaemonCapabilityMissingError");
|
|
4920
|
-
}
|
|
4921
|
-
capability;
|
|
4922
|
-
constructor(capability, hint) {
|
|
4923
|
-
super(
|
|
4924
|
-
`DaemonCapabilities.${capability} is missing \u2014 ${hint}. The daemon you are connected to likely predates the feature that added this field; upgrade the daemon or fall back to a different code path that doesn't require it.`
|
|
4925
|
-
);
|
|
4926
|
-
this.name = "DaemonCapabilityMissingError";
|
|
4927
|
-
this.capability = capability;
|
|
4928
|
-
}
|
|
4929
|
-
};
|
|
4930
|
-
function requireWorkspaceCwd(caps) {
|
|
4931
|
-
if (typeof caps.workspaceCwd !== "string" || caps.workspaceCwd.length === 0) {
|
|
4932
|
-
throw new DaemonCapabilityMissingError(
|
|
4933
|
-
"workspaceCwd",
|
|
4934
|
-
caps.workspaceCwd === "" ? "daemon returned an empty workspaceCwd (newer daemon with a bug)" : "daemon predates workspaceCwd support (1 daemon = 1 workspace); upgrade it"
|
|
4935
|
-
);
|
|
4936
|
-
}
|
|
4937
|
-
return caps.workspaceCwd;
|
|
4938
|
-
}
|
|
4939
|
-
__name(requireWorkspaceCwd, "requireWorkspaceCwd");
|
|
4940
|
-
var DAEMON_ERROR_KINDS = [
|
|
4941
|
-
"missing_binary",
|
|
4942
|
-
"blocked_egress",
|
|
4943
|
-
"auth_env_error",
|
|
4944
|
-
"init_timeout",
|
|
4945
|
-
"protocol_error",
|
|
4946
|
-
"missing_file",
|
|
4947
|
-
"parse_error",
|
|
4948
|
-
// Budget refusal under `--mcp-budget-mode=enforce`.
|
|
4949
|
-
"budget_exhausted",
|
|
4950
|
-
// Runtime MCP mutation routes (POST/DELETE /workspace/mcp/servers).
|
|
4951
|
-
"mcp_budget_would_exceed",
|
|
4952
|
-
"mcp_server_spawn_failed",
|
|
4953
|
-
"invalid_config",
|
|
4954
|
-
// A prompt exceeded the daemon-configured wallclock cap (or the
|
|
4955
|
-
// request's own `deadlineMs`, capped at the server flag).
|
|
4956
|
-
"prompt_deadline_exceeded",
|
|
4957
|
-
// An SSE writer's last successful flush was older than the daemon's
|
|
4958
|
-
// writer-idle deadline.
|
|
4959
|
-
"writer_idle_timeout",
|
|
4960
|
-
// The model response stream ended before a complete turn could be read.
|
|
4961
|
-
"model_stream_interrupted"
|
|
4962
|
-
];
|
|
4963
|
-
var DAEMON_CONTENT_HASH_RE = /^sha256:[0-9a-f]{64}$/;
|
|
4964
|
-
function isDaemonContentHash(value) {
|
|
4965
|
-
return typeof value === "string" && DAEMON_CONTENT_HASH_RE.test(value);
|
|
4966
|
-
}
|
|
4967
|
-
__name(isDaemonContentHash, "isDaemonContentHash");
|
|
4968
|
-
var DAEMON_APPROVAL_MODES = [
|
|
4969
|
-
"plan",
|
|
4970
|
-
"default",
|
|
4971
|
-
"auto-edit",
|
|
4972
|
-
"auto",
|
|
4973
|
-
"yolo"
|
|
4974
|
-
];
|
|
4975
|
-
|
|
4976
5538
|
// packages/sdk-typescript/src/daemon/ui/types.ts
|
|
4977
5539
|
init_esbuild_shims();
|
|
4978
5540
|
var DAEMON_PLAN_TOOL_CALL_ID = "daemon-plan";
|
|
@@ -5171,6 +5733,7 @@ var MCP_RESTART_REFUSED_REASONS2 = /* @__PURE__ */ new Set([
|
|
|
5171
5733
|
]);
|
|
5172
5734
|
var MALFORMED_MEMORY_CHANGED = "malformed memory_changed payload";
|
|
5173
5735
|
var MAX_DETAILS_LENGTH = 4096;
|
|
5736
|
+
var SESSION_RECORDING_DEGRADED_MESSAGE = "Session recording stopped after a write failure. New messages for the affected session will not be saved. Check disk space and permissions, then start a new session to resume recording.";
|
|
5174
5737
|
function normalizeDaemonEvent(event, opts = {}) {
|
|
5175
5738
|
const base = createBase(event, opts);
|
|
5176
5739
|
switch (event.type) {
|
|
@@ -5231,6 +5794,42 @@ function normalizeDaemonEvent(event, opts = {}) {
|
|
|
5231
5794
|
text: `Session closed: ${getString2(event.data, "reason") ?? "closed"}`
|
|
5232
5795
|
}
|
|
5233
5796
|
];
|
|
5797
|
+
case "session_recording_degraded": {
|
|
5798
|
+
const sessionId = getString2(event.data, "sessionId");
|
|
5799
|
+
if (!sessionId || getString2(event.data, "reason") !== "write_failed") {
|
|
5800
|
+
return fallbackDebug(event, base, "malformed recording state");
|
|
5801
|
+
}
|
|
5802
|
+
return [
|
|
5803
|
+
{
|
|
5804
|
+
...base,
|
|
5805
|
+
type: "error",
|
|
5806
|
+
recoverable: true,
|
|
5807
|
+
code: "session_recording_degraded",
|
|
5808
|
+
text: SESSION_RECORDING_DEGRADED_MESSAGE
|
|
5809
|
+
}
|
|
5810
|
+
];
|
|
5811
|
+
}
|
|
5812
|
+
case "session_snapshot": {
|
|
5813
|
+
if (!isRecord2(event.data) || !getString2(event.data, "sessionId")) {
|
|
5814
|
+
return fallbackDebug(event, base, "malformed recording snapshot");
|
|
5815
|
+
}
|
|
5816
|
+
const recordingDegraded = event.data["recordingDegraded"];
|
|
5817
|
+
if (recordingDegraded !== void 0 && typeof recordingDegraded !== "boolean") {
|
|
5818
|
+
return fallbackDebug(event, base, "malformed recording snapshot");
|
|
5819
|
+
}
|
|
5820
|
+
if (recordingDegraded === true) {
|
|
5821
|
+
return [
|
|
5822
|
+
{
|
|
5823
|
+
...base,
|
|
5824
|
+
type: "error",
|
|
5825
|
+
recoverable: true,
|
|
5826
|
+
code: "session_recording_degraded",
|
|
5827
|
+
text: SESSION_RECORDING_DEGRADED_MESSAGE
|
|
5828
|
+
}
|
|
5829
|
+
];
|
|
5830
|
+
}
|
|
5831
|
+
return [];
|
|
5832
|
+
}
|
|
5234
5833
|
case "client_evicted":
|
|
5235
5834
|
return [
|
|
5236
5835
|
{
|
|
@@ -5336,6 +5935,8 @@ function normalizeDaemonEvent(event, opts = {}) {
|
|
|
5336
5935
|
case "approval_mode_changed":
|
|
5337
5936
|
return normalizeApprovalModeChanged(event, base);
|
|
5338
5937
|
// ── Workspace events ──────────────────────────────────────
|
|
5938
|
+
case "git_branch_changed":
|
|
5939
|
+
return [];
|
|
5339
5940
|
case "memory_changed":
|
|
5340
5941
|
return normalizeMemoryChanged(event, base);
|
|
5341
5942
|
case "agent_changed":
|
|
@@ -5362,6 +5963,8 @@ function normalizeDaemonEvent(event, opts = {}) {
|
|
|
5362
5963
|
return normalizeMcpServerRestartRefused(event, base);
|
|
5363
5964
|
case "extensions_changed":
|
|
5364
5965
|
return normalizeExtensionsChanged(event, base);
|
|
5966
|
+
case "artifact_changed":
|
|
5967
|
+
return normalizeArtifactChanged(event, base);
|
|
5365
5968
|
// ── Auth device-flow events (RFC 8628) ─────────────────
|
|
5366
5969
|
case "auth_device_flow_started":
|
|
5367
5970
|
return normalizeAuthDeviceFlowStarted(event, base);
|
|
@@ -5374,16 +5977,20 @@ function normalizeDaemonEvent(event, opts = {}) {
|
|
|
5374
5977
|
case "auth_device_flow_cancelled":
|
|
5375
5978
|
return normalizeAuthDeviceFlowCancelled(event, base);
|
|
5376
5979
|
default:
|
|
5377
|
-
return
|
|
5378
|
-
{
|
|
5379
|
-
...base,
|
|
5380
|
-
type: "debug",
|
|
5381
|
-
text: `${event.type} (unrecognized daemon event): ${stringifyRedactedJson(event.data)}`
|
|
5382
|
-
}
|
|
5383
|
-
];
|
|
5980
|
+
return normalizeUnrecognizedEvent(event, base);
|
|
5384
5981
|
}
|
|
5385
5982
|
}
|
|
5386
5983
|
__name(normalizeDaemonEvent, "normalizeDaemonEvent");
|
|
5984
|
+
function normalizeUnrecognizedEvent(event, base) {
|
|
5985
|
+
return [
|
|
5986
|
+
{
|
|
5987
|
+
...base,
|
|
5988
|
+
type: "debug",
|
|
5989
|
+
text: `${event.type} (unrecognized daemon event): ${stringifyRedactedJson(event.data)}`
|
|
5990
|
+
}
|
|
5991
|
+
];
|
|
5992
|
+
}
|
|
5993
|
+
__name(normalizeUnrecognizedEvent, "normalizeUnrecognizedEvent");
|
|
5387
5994
|
function normalizeStateResyncRequired(event, base) {
|
|
5388
5995
|
const reason = getString2(event.data, "reason");
|
|
5389
5996
|
const lastDeliveredId = numberField(event.data, "lastDeliveredId");
|
|
@@ -5637,8 +6244,13 @@ function normalizeSessionUpdate(event, base, opts) {
|
|
|
5637
6244
|
];
|
|
5638
6245
|
}
|
|
5639
6246
|
case "tool_call":
|
|
5640
|
-
case "tool_call_update":
|
|
6247
|
+
case "tool_call_update": {
|
|
6248
|
+
const meta = isRecord2(update["_meta"]) ? update["_meta"] : void 0;
|
|
6249
|
+
if (getString2(update, "status") === "in_progress" && getString2(update, "kind") === void 0 && meta?.["shellProgress"] !== void 0) {
|
|
6250
|
+
return [];
|
|
6251
|
+
}
|
|
5641
6252
|
return [normalizeToolUpdate(update, base)];
|
|
6253
|
+
}
|
|
5642
6254
|
case "shell_output":
|
|
5643
6255
|
case "tool_output": {
|
|
5644
6256
|
const text = getOutputText(update);
|
|
@@ -5959,6 +6571,27 @@ function normalizeSessionMetadataUpdated(event, base) {
|
|
|
5959
6571
|
];
|
|
5960
6572
|
}
|
|
5961
6573
|
__name(normalizeSessionMetadataUpdated, "normalizeSessionMetadataUpdated");
|
|
6574
|
+
function normalizeArtifactChanged(event, base) {
|
|
6575
|
+
const sessionId = getString2(event.data, "sessionId");
|
|
6576
|
+
const change = isRecord2(event.data) ? event.data["change"] : void 0;
|
|
6577
|
+
if (!sessionId || !isRecord2(change)) {
|
|
6578
|
+
return fallbackDebug(event, base, "malformed artifact_changed payload");
|
|
6579
|
+
}
|
|
6580
|
+
const action = getString2(change, "action");
|
|
6581
|
+
const artifactId = getString2(change, "artifactId");
|
|
6582
|
+
if (!action || !artifactId) {
|
|
6583
|
+
return fallbackDebug(event, base, "missing action or artifactId");
|
|
6584
|
+
}
|
|
6585
|
+
return [
|
|
6586
|
+
{
|
|
6587
|
+
...base,
|
|
6588
|
+
type: "session.artifact.changed",
|
|
6589
|
+
sessionId,
|
|
6590
|
+
change
|
|
6591
|
+
}
|
|
6592
|
+
];
|
|
6593
|
+
}
|
|
6594
|
+
__name(normalizeArtifactChanged, "normalizeArtifactChanged");
|
|
5962
6595
|
function normalizeApprovalModeChanged(event, base) {
|
|
5963
6596
|
const sessionId = getString2(event.data, "sessionId");
|
|
5964
6597
|
const previous = getString2(event.data, "previous");
|
|
@@ -6819,7 +7452,14 @@ var RESYNC_PASSTHROUGH_TYPES2 = /* @__PURE__ */ new Set([
|
|
|
6819
7452
|
function appendLocalUserTranscriptMessage(state, text, opts = {}) {
|
|
6820
7453
|
const next = cloneTranscriptState(state, opts);
|
|
6821
7454
|
finishAssistant(next);
|
|
6822
|
-
const block = createTextBlock(
|
|
7455
|
+
const block = createTextBlock(
|
|
7456
|
+
next,
|
|
7457
|
+
"user",
|
|
7458
|
+
text,
|
|
7459
|
+
void 0,
|
|
7460
|
+
void 0,
|
|
7461
|
+
opts.meta
|
|
7462
|
+
);
|
|
6823
7463
|
if (opts.images && opts.images.length > 0) {
|
|
6824
7464
|
block.images = [...opts.images];
|
|
6825
7465
|
}
|
|
@@ -6958,6 +7598,7 @@ function applyDaemonTranscriptEvent(next, event) {
|
|
|
6958
7598
|
next.approvalMode = event.next;
|
|
6959
7599
|
break;
|
|
6960
7600
|
case "session.metadata.changed":
|
|
7601
|
+
case "session.artifact.changed":
|
|
6961
7602
|
case "session.available_commands":
|
|
6962
7603
|
break;
|
|
6963
7604
|
case "session.state_resync_required":
|
|
@@ -7912,8 +8553,8 @@ function createDaemonTranscriptStore(seed = {}) {
|
|
|
7912
8553
|
state = reduceDaemonTranscriptEvents(state, events);
|
|
7913
8554
|
scheduleNotify();
|
|
7914
8555
|
},
|
|
7915
|
-
appendLocalUserMessage(text, images) {
|
|
7916
|
-
state = appendLocalUserTranscriptMessage(state, text, { images });
|
|
8556
|
+
appendLocalUserMessage(text, images, meta) {
|
|
8557
|
+
state = appendLocalUserTranscriptMessage(state, text, { images, meta });
|
|
7917
8558
|
scheduleNotify();
|
|
7918
8559
|
},
|
|
7919
8560
|
reset(nextSeed = {}) {
|
|
@@ -8058,6 +8699,12 @@ function daemonUiEventToTerminalText(event) {
|
|
|
8058
8699
|
`metadata: ${event.displayName ?? "(no display name)"}`,
|
|
8059
8700
|
"36"
|
|
8060
8701
|
);
|
|
8702
|
+
case "session.artifact.changed":
|
|
8703
|
+
return terminalLine(
|
|
8704
|
+
"artifact",
|
|
8705
|
+
`${event.change.action} ${event.change.artifact?.title ?? event.change.artifactId}`,
|
|
8706
|
+
"36"
|
|
8707
|
+
);
|
|
8061
8708
|
case "session.approval_mode.changed":
|
|
8062
8709
|
return terminalLine(
|
|
8063
8710
|
"approval-mode",
|