@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.
Files changed (323) hide show
  1. package/bundled/qc-helper/docs/configuration/settings.md +14 -6
  2. package/bundled/qc-helper/docs/features/approval-mode.md +2 -2
  3. package/bundled/qc-helper/docs/features/channels/dingtalk.md +33 -0
  4. package/bundled/qc-helper/docs/features/channels/overview.md +64 -20
  5. package/bundled/qc-helper/docs/features/channels/wecom.md +8 -7
  6. package/bundled/qc-helper/docs/features/code-review.md +88 -44
  7. package/bundled/qc-helper/docs/features/commands.md +6 -6
  8. package/bundled/qc-helper/docs/features/hooks.md +29 -0
  9. package/bundled/qc-helper/docs/features/sandbox.md +2 -0
  10. package/bundled/qc-helper/docs/features/sub-agents.md +21 -0
  11. package/bundled/qc-helper/docs/qwen-serve.md +49 -20
  12. package/bundled/qc-helper/docs/reference/keyboard-shortcuts.md +1 -1
  13. package/bundled/review/DESIGN.md +219 -33
  14. package/bundled/review/SKILL.md +429 -382
  15. package/chunks/{MaxSizedBox-6HYJ3ZPJ.js → MaxSizedBox-WOC3YDWA.js} +31 -32
  16. package/chunks/{StandaloneSessionPicker-WS4GXYOG.js → StandaloneSessionPicker-H5HZCAFD.js} +49 -48
  17. package/chunks/{acpAgent-5FWSOZL5.js → acpAgent-55YDJDNM.js} +922 -550
  18. package/chunks/{agent-HOLHB3RT.js → agent-H6VE5W3L.js} +26 -27
  19. package/chunks/{agent-headless-SXL6H56A.js → agent-headless-T4XJOCRU.js} +26 -27
  20. package/chunks/{anthropicContentGenerator-L73TO3DB.js → anthropicContentGenerator-HBRXJSP4.js} +78 -16
  21. package/chunks/{artifact-tool-U7IRTLIV.js → artifact-tool-MIZLXBLF.js} +2 -2
  22. package/chunks/{askUserQuestion-2DLUUZZG.js → askUserQuestion-XMJVPNWM.js} +2 -2
  23. package/chunks/{bridge-BCJQ7BBB.js → bridge-FTB6ZP3R.js} +31 -34
  24. package/chunks/{ca-UJ6HC4H2.js → ca-CODEN7TD.js} +9 -1
  25. package/chunks/channel-worker-group-K7QKH6IG.js +13 -0
  26. package/chunks/channel-worker-manager-CUDPU4CN.js +418 -0
  27. package/chunks/channel-worker-supervisor-4XTO2ZD3.js +20 -0
  28. package/chunks/{chunk-LXNEJD34.js → chunk-2FO5GFKZ.js} +1 -1
  29. package/chunks/{chunk-VA4KQY6V.js → chunk-2JNR4VP2.js} +3 -3
  30. package/chunks/{chunk-L36P3NBD.js → chunk-2W3OOD4W.js} +2 -0
  31. package/chunks/{chunk-7R3CZA3Q.js → chunk-2Z5UX4KI.js} +1 -1
  32. package/chunks/{chunk-CUMMSHH6.js → chunk-3DWIFU7L.js} +1 -1
  33. package/chunks/chunk-3MX7D6QN.js +516 -0
  34. package/chunks/{chunk-SJHDYNHF.js → chunk-4BJVSIS3.js} +3 -3
  35. package/chunks/{chunk-TO6QE22P.js → chunk-5CNYZ7TN.js} +26 -22
  36. package/chunks/{chunk-N3EMS75V.js → chunk-5DEJ4T6C.js} +1333 -1232
  37. package/chunks/chunk-5HBA2Z7V.js +28 -0
  38. package/chunks/{chunk-ZJE7NSL3.js → chunk-5M6IDOMF.js} +34 -97
  39. package/chunks/{chunk-SCGXUJBT.js → chunk-6LI3L22E.js} +3 -3
  40. package/chunks/{chunk-K434OPES.js → chunk-6WPJRYLZ.js} +3 -3
  41. package/chunks/{chunk-YAUFFXDS.js → chunk-7GM2RWCR.js} +12 -11
  42. package/chunks/{chunk-OQ4DRIOA.js → chunk-7HWE2W74.js} +2 -2
  43. package/chunks/{chunk-J4TSQ5EQ.js → chunk-7NFB7LBQ.js} +8 -1
  44. package/chunks/{chunk-MC23XKFE.js → chunk-A2HWMJVO.js} +37 -3
  45. package/chunks/{chunk-3G7CIHVV.js → chunk-ABNYOMDG.js} +4 -4
  46. package/chunks/{chunk-3AHXV67U.js → chunk-AGZLXLBY.js} +1 -1
  47. package/chunks/{chunk-RDJSGHZE.js → chunk-ALGGS7UH.js} +1 -38
  48. package/chunks/{chunk-Q4YQW46J.js → chunk-AMRZVQUY.js} +43 -40
  49. package/chunks/{chunk-W3JHSWRP.js → chunk-AN6C2U46.js} +4 -4
  50. package/chunks/{chunk-GWHYEOV2.js → chunk-ARKANCNX.js} +2 -1
  51. package/chunks/{chunk-5SFOMFG4.js → chunk-AVEOWVOM.js} +36 -2
  52. package/chunks/{chunk-34MW4KTI.js → chunk-BA5JGE5F.js} +2 -2
  53. package/chunks/{chunk-5HOMWMCL.js → chunk-BSJAQUFD.js} +5492 -1336
  54. package/chunks/{chunk-L6P4KPHR.js → chunk-BWJKL5DB.js} +58 -38
  55. package/chunks/{chunk-PVZM22CK.js → chunk-C32JFRGV.js} +5 -5
  56. package/chunks/{chunk-AKIVHSJR.js → chunk-CZIHPO7L.js} +163 -782
  57. package/chunks/chunk-DL7RCO6V.js +493 -0
  58. package/chunks/{chunk-KKNMOEZH.js → chunk-E2UVIFI2.js} +185 -398
  59. package/chunks/{chunk-5VXNZWGF.js → chunk-ENUQSKEY.js} +1 -1
  60. package/chunks/{chunk-PDZ7MBDG.js → chunk-EWILX3BM.js} +27 -6
  61. package/chunks/{chunk-BMGVRZN4.js → chunk-EZWX232B.js} +1 -1
  62. package/chunks/{chunk-4GORAUCN.js → chunk-F333XEAU.js} +1 -1
  63. package/chunks/{chunk-YLV3XXFB.js → chunk-FBU7WRZI.js} +17 -1
  64. package/chunks/chunk-FEOZBUMT.js +77 -0
  65. package/chunks/{chunk-5U27BZ72.js → chunk-FKEGVMPX.js} +269 -83
  66. package/chunks/chunk-FNX3LGAK.js +34 -0
  67. package/chunks/{chunk-LK7KUE55.js → chunk-FSA7ERJ2.js} +1 -1
  68. package/chunks/{chunk-PODM4SZ4.js → chunk-G3BIBPI7.js} +5 -5
  69. package/chunks/{chunk-A3XKDTSH.js → chunk-GA65O2TB.js} +4 -4
  70. package/chunks/{chunk-3BTRNWWD.js → chunk-GOXKNSDZ.js} +1 -64
  71. package/chunks/{channel-worker-supervisor-WSOAAYUO.js → chunk-GXGIM7QP.js} +67 -35
  72. package/chunks/{chunk-6PESIEKJ.js → chunk-GXUWGPYX.js} +68 -6
  73. package/chunks/chunk-GYTKQYDB.js +23 -0
  74. package/chunks/{chunk-GZRTYZ2R.js → chunk-H3XMJV7T.js} +218 -1
  75. package/chunks/{chunk-WQUQVGTF.js → chunk-HGRXW4HQ.js} +467 -106
  76. package/chunks/{chunk-YVEDCAUE.js → chunk-HGT6JR3U.js} +19 -0
  77. package/chunks/{chunk-ECNYL4AA.js → chunk-HUEWOHKV.js} +1 -1
  78. package/chunks/chunk-IDS7MSUP.js +74 -0
  79. package/chunks/{chunk-KHUQZZJ6.js → chunk-IHDRJLLR.js} +382 -36
  80. package/chunks/{chunk-CLFKOZEK.js → chunk-J4SEAF4X.js} +114 -4
  81. package/chunks/{chunk-B5ORX3FG.js → chunk-JGUT3LWZ.js} +6 -1
  82. package/chunks/{chunk-P67PFTUT.js → chunk-KEYEYCHZ.js} +4 -4
  83. package/chunks/{chunk-ORBGV7NJ.js → chunk-KKRTYONM.js} +6 -4
  84. package/chunks/{chunk-7PU4FYLG.js → chunk-KOXFAG6P.js} +4 -18
  85. package/chunks/{chunk-EGYZ275M.js → chunk-KWLVWNF5.js} +55 -7
  86. package/chunks/{chunk-XLA62MYB.js → chunk-KXECVZPD.js} +2 -2
  87. package/chunks/{chunk-IAVB3HM3.js → chunk-L4Y55KIS.js} +33 -1
  88. package/chunks/{chunk-4QLQE5WJ.js → chunk-L5U3ELZX.js} +1 -1
  89. package/chunks/{chunk-4ZVWQHEQ.js → chunk-LQIDP6K5.js} +1 -1
  90. package/chunks/{chunk-DC5Z3DU6.js → chunk-LXLTBIDP.js} +43 -6
  91. package/chunks/chunk-LXXMOYPL.js +22 -0
  92. package/chunks/{chunk-Q6I5QHMH.js → chunk-MFNKBXYH.js} +1 -1
  93. package/chunks/chunk-MR3PXB6E.js +48 -0
  94. package/chunks/{chunk-JZETEN3Z.js → chunk-N45S36AH.js} +3 -3
  95. package/chunks/{chunk-GWLSNBG4.js → chunk-NA3IG6XG.js} +748 -27
  96. package/chunks/{chunk-D5SKC4YG.js → chunk-O3M25JXE.js} +213 -29
  97. package/chunks/{chunk-EAXLGSFP.js → chunk-O6XGHDS5.js} +11 -11
  98. package/chunks/{chunk-WL4L7EZH.js → chunk-OA4JVLSA.js} +27 -1
  99. package/chunks/{chunk-X4NKFGFJ.js → chunk-OJAMDVF5.js} +0 -15
  100. package/chunks/{chunk-BZIFY5TF.js → chunk-OKAIGAYW.js} +3 -3
  101. package/chunks/{chunk-CNEIYWSA.js → chunk-OVIV236K.js} +5 -5
  102. package/chunks/{chunk-3SJSQXNS.js → chunk-PEJWA3QQ.js} +12 -8
  103. package/chunks/{chunk-E2IY465S.js → chunk-PWNOAWXB.js} +59 -12
  104. package/chunks/{chunk-B4G2WOFA.js → chunk-Q5MKHNIR.js} +28 -5
  105. package/chunks/{chunk-MXL5UP4X.js → chunk-Q6TUALBE.js} +1 -1
  106. package/chunks/{chunk-QYMQSECS.js → chunk-QAW7PIHT.js} +2 -2
  107. package/chunks/{chunk-HKMAENAO.js → chunk-QDTGDM2T.js} +14 -9
  108. package/chunks/{chunk-LUODI7WD.js → chunk-RCEEXIOO.js} +6 -4
  109. package/chunks/{chunk-W2UIXQDL.js → chunk-RTV5TUYB.js} +12 -4
  110. package/chunks/chunk-RW7DUKFO.js +91 -0
  111. package/chunks/{chunk-NVYTCB5Z.js → chunk-SA6QVLWI.js} +17325 -16259
  112. package/chunks/chunk-SJSI7PXU.js +59 -0
  113. package/chunks/{chunk-HVY356M2.js → chunk-SMGBWLNU.js} +3 -3
  114. package/chunks/{chunk-CEA3E3JB.js → chunk-SPJQO2CE.js} +2 -2
  115. package/chunks/{chunk-CC2ITGCF.js → chunk-STZQCNN3.js} +49 -6
  116. package/chunks/{chunk-HPDUL5MF.js → chunk-T2ZDAER2.js} +1 -1
  117. package/chunks/{chunk-XUOOWUZS.js → chunk-T3TQ3ACP.js} +1 -1
  118. package/chunks/{chunk-4C5BQ2D2.js → chunk-TIKDHS6V.js} +100 -17
  119. package/chunks/chunk-TV6K2FB4.js +224 -0
  120. package/chunks/{chunk-5XUCZNSY.js → chunk-TYLOFD2U.js} +1 -1
  121. package/chunks/{chunk-D2GFWEXB.js → chunk-UCUUH2JV.js} +6 -6
  122. package/chunks/{chunk-BAPGSC7U.js → chunk-UZP7K33Y.js} +23 -9
  123. package/chunks/{chunk-77XJ3SWN.js → chunk-VDAR6UO2.js} +8 -6
  124. package/chunks/{chunk-XYQSMABS.js → chunk-VKLVGA2D.js} +4 -4
  125. package/chunks/{chunk-JSG7ZSBC.js → chunk-VRR65QYW.js} +251 -3
  126. package/chunks/{chunk-U2NNEY4R.js → chunk-VT5AWJN4.js} +1 -1
  127. package/chunks/{chunk-ZLXQN2QS.js → chunk-WIEO4CWB.js} +1 -1
  128. package/chunks/{chunk-X6TJ3YZV.js → chunk-WKEO3GLZ.js} +160 -60
  129. package/chunks/{chunk-J3JA76CF.js → chunk-WTNZ6DXB.js} +1 -1
  130. package/chunks/{chunk-VWPVHAMO.js → chunk-XIWQ5QST.js} +8 -1
  131. package/chunks/{chunk-TDEXZKMT.js → chunk-Y66VOBRP.js} +2 -2
  132. package/chunks/{chunk-3VAGG5T5.js → chunk-YYBZUIPL.js} +1015 -100
  133. package/chunks/{chunk-CCDMCZPP.js → chunk-YZ3SBNP7.js} +1 -1
  134. package/chunks/{chunk-ATAKVRIF.js → chunk-Z3XA2TNG.js} +7 -7
  135. package/chunks/{chunk-EMDMPBJ4.js → chunk-Z7SVC7PJ.js} +10 -3
  136. package/chunks/{chunk-AURZZYMD.js → chunk-ZIVSSTUG.js} +4 -4
  137. package/chunks/{chunk-UOZWKTQG.js → chunk-ZPAHLFZU.js} +2 -2
  138. package/chunks/{chunk-34Z3U5RQ.js → chunk-ZQIYGQCG.js} +765 -168
  139. package/chunks/{computer-use-HM37RX6A.js → computer-use-NADT7ULB.js} +26 -27
  140. package/chunks/{config-utils-NV2SVGPB.js → config-utils-IQQT3GCI.js} +3 -2
  141. package/chunks/{contextCommand-OF5SFGH2.js → contextCommand-U7NEJYJ7.js} +28 -29
  142. package/chunks/{create-sub-session-INX7TXJI.js → create-sub-session-EAB2U5XW.js} +2 -2
  143. package/chunks/{create-sub-session-KPRT7ECJ.js → create-sub-session-SUN33INC.js} +26 -27
  144. package/chunks/{cron-create-AMBKGZX6.js → cron-create-GMVKSXZT.js} +4 -4
  145. package/chunks/{cron-delete-LRU4OJYG.js → cron-delete-VDZKUAVK.js} +4 -4
  146. package/chunks/{cron-list-WVP2JXER.js → cron-list-UG7C7RAR.js} +4 -4
  147. package/chunks/{daemon-ARHTSTXP.js → daemon-SJXEKP3H.js} +773 -126
  148. package/chunks/daemon-status-provider-WIIYLGZJ.js +74 -0
  149. package/chunks/{de-EBJN3OVN.js → de-NOXPCSYN.js} +9 -1
  150. package/chunks/{dist-XKU3ABM5.js → dist-4WCQEZIN.js} +4 -51
  151. package/chunks/{dist-QYCAEZIT.js → dist-DOPL5LSQ.js} +5 -1
  152. package/chunks/{dist-WKPOYU7O.js → dist-GXJVCOS7.js} +1 -1
  153. package/chunks/{dist-R7LN5AZE.js → dist-PX2ERZ6I.js} +2 -2
  154. package/chunks/{dist-PNVLTKTL.js → dist-V2YVLYOW.js} +215 -33
  155. package/chunks/{dist-VHV4EVHG.js → dist-VYWUKURL.js} +1 -1
  156. package/chunks/{earlyInputCapture-3VTHRC4C.js → earlyInputCapture-6FRM6UMU.js} +27 -28
  157. package/chunks/{edit-VNI4NJ73.js → edit-7GOIQTCZ.js} +27 -28
  158. package/chunks/{en-5A6LA7RK.js → en-JFVULHTB.js} +11 -1
  159. package/chunks/{enter-worktree-IYYBKPZT.js → enter-worktree-476E6WIK.js} +26 -27
  160. package/chunks/{enterPlanMode-GMC5FD5A.js → enterPlanMode-IRJM6W3C.js} +42 -28
  161. package/chunks/{environment-5HSSRMJ7.js → environment-ROMULS2X.js} +30 -30
  162. package/chunks/{errors-HMFCJJ7P.js → errors-OUIWPUDY.js} +28 -29
  163. package/chunks/{exit-worktree-6BHCMP5G.js → exit-worktree-PPSFK753.js} +26 -27
  164. package/chunks/{exitPlanMode-CJW7G74W.js → exitPlanMode-YKQMD4D7.js} +26 -27
  165. package/chunks/{fast-path-FRDMDVHG.js → fast-path-CNK2HHKH.js} +3 -3
  166. package/chunks/{fast-path-settings-5QZE64HR.js → fast-path-settings-DAOVFADC.js} +6 -4
  167. package/chunks/{fr-YXRABLYZ.js → fr-HVFNU42H.js} +9 -1
  168. package/chunks/{gemini-QYSEGHAX.js → gemini-WQNFT6TR.js} +216 -90
  169. package/chunks/{geminiContentGenerator-J7YNZDYP.js → geminiContentGenerator-4QJH2JDP.js} +4 -4
  170. package/chunks/{glob-BRCSGFOT.js → glob-36TVLBWW.js} +28 -28
  171. package/chunks/{grep-EE2DUOSY.js → grep-QTYLNO2M.js} +26 -27
  172. package/chunks/{handleAutoUpdate-5NWTLR67.js → handleAutoUpdate-36FQFODK.js} +30 -31
  173. package/chunks/{i18n-BASPENNQ.js → i18n-JUGYPVSP.js} +27 -28
  174. package/chunks/initializer-OBBJUS25.js +72 -0
  175. package/chunks/{installationInfo-W6V4DT7W.js → installationInfo-MCKTPX64.js} +27 -28
  176. package/chunks/{ja-7VQOANVG.js → ja-PY5AF544.js} +10 -2
  177. package/chunks/{keychain-token-storage-VKUBNCP4.js → keychain-token-storage-AU22CQI6.js} +2 -2
  178. package/chunks/list-VW5QY4VJ.js +75 -0
  179. package/chunks/loadedSettingsAdapter-IELOOXG6.js +69 -0
  180. package/chunks/{loop-wakeup-WX7BLWWP.js → loop-wakeup-QXWZSCYM.js} +5 -5
  181. package/chunks/{ls-ZB2BDP6T.js → ls-2OUTG3IZ.js} +4 -4
  182. package/chunks/{lsp-V5DN4YUJ.js → lsp-4VMNXZW6.js} +2 -2
  183. package/chunks/mcp-Q3EC37ZS.js +69 -0
  184. package/chunks/{monitor-X5Z3H4FY.js → monitor-DCZ27AFR.js} +26 -27
  185. package/chunks/nonInteractiveCli-KXD7PFO4.js +128 -0
  186. package/chunks/{notebook-edit-TRM2QIJK.js → notebook-edit-YU4XF5LI.js} +27 -28
  187. package/chunks/{openaiContentGenerator-AAYONPMF.js → openaiContentGenerator-KL5WER2D.js} +13 -13
  188. package/chunks/{pidfile-D4I4FTVA.js → pidfile-WBOD7EJV.js} +27 -28
  189. package/chunks/processUtils-AOV4R34M.js +29 -0
  190. package/chunks/{pt-2C6YCSHL.js → pt-A3PRQXMU.js} +9 -1
  191. package/chunks/{qwenContentGenerator-K3HZ2H76.js → qwenContentGenerator-YIGBHYE3.js} +28 -29
  192. package/chunks/{qwenOAuth2-PJQ27GSO.js → qwenOAuth2-LEYOU7RU.js} +5 -5
  193. package/chunks/{read-file-7SZSIZOL.js → read-file-WVL4Y76X.js} +9 -9
  194. package/chunks/{read-mcp-resource-SM5DA4RG.js → read-mcp-resource-JUFHCKSC.js} +2 -2
  195. package/chunks/{record-artifact-4XKZX3UW.js → record-artifact-DWSMBXYY.js} +2 -2
  196. package/chunks/{ripGrep-YNPFVCZP.js → ripGrep-6GSWJERP.js} +26 -27
  197. package/chunks/{ru-6BBHVZZV.js → ru-IBCWUTOC.js} +9 -1
  198. package/chunks/{run-qwen-serve-DMWV5N6L.js → run-qwen-serve-QYUQMEDT.js} +1233 -371
  199. package/chunks/{runtime-57WWRVHN.js → runtime-K2YZCNB3.js} +42 -38
  200. package/chunks/{scheduler-YBLGWSIL.js → scheduler-EQCSN7QV.js} +26 -27
  201. package/chunks/{send-message-F36YD6KQ.js → send-message-JZ752NWD.js} +3 -3
  202. package/chunks/{serve-R63NK3CV.js → serve-DX5UGZD4.js} +36 -35
  203. package/chunks/{server-Z22GCAXP.js → server-T6HJH3DR.js} +5869 -1398
  204. package/chunks/{session-HKAAI7BN.js → session-SNU6ACY6.js} +299 -100
  205. package/chunks/{settings-3EYN66GK.js → settings-AKHZZNEL.js} +34 -33
  206. package/chunks/{shell-6YXINTWJ.js → shell-EY74IEZK.js} +28 -27
  207. package/chunks/{skill-OO57P4X6.js → skill-DPU62O3H.js} +11 -11
  208. package/chunks/{spawnChannel-JD7G4VU6.js → spawnChannel-RQZRWJ2V.js} +28 -30
  209. package/chunks/{src-G5UPLZSZ.js → src-7FITDSVC.js} +164 -52
  210. package/chunks/{standalone-update-OB7F4JPZ.js → standalone-update-XO3RK6DO.js} +28 -29
  211. package/chunks/{startInteractiveUI-73EGLIIH.js → startInteractiveUI-DVWZRHYQ.js} +728 -382
  212. package/chunks/{syntheticOutput-34H7LGA7.js → syntheticOutput-LELY6HAI.js} +3 -3
  213. package/chunks/{task-create-FRGOEIKY.js → task-create-QY3BIMNM.js} +8 -7
  214. package/chunks/{task-list-OW766BXZ.js → task-list-D2U47WBJ.js} +6 -5
  215. package/chunks/{task-stop-SIR5SNBN.js → task-stop-N6E5IYLH.js} +2 -2
  216. package/chunks/{task-update-YRA532MT.js → task-update-HJCQILLB.js} +8 -7
  217. package/chunks/{team-create-PECAAPXK.js → team-create-FOSRT62K.js} +26 -27
  218. package/chunks/{team-delete-6OSECUZC.js → team-delete-RCWYDRF4.js} +6 -5
  219. package/chunks/{team-plan-approval-L6F434RY.js → team-plan-approval-6VUDV27J.js} +26 -27
  220. package/chunks/{theme-manager-ZG4RY6GU.js → theme-manager-6UT6IO5T.js} +27 -28
  221. package/chunks/{todoWrite-YDMFEV4G.js → todoWrite-FKCGATPJ.js} +4 -4
  222. package/chunks/{tool-search-THVIWAPB.js → tool-search-ASSFMMN5.js} +10 -10
  223. package/chunks/{total-session-admission-JOKNRIIA.js → total-session-admission-YYWUO23H.js} +32 -35
  224. package/chunks/tree-sitter-YJVE2ZUK.js +2980 -0
  225. package/chunks/{trustedFolders-EOGT3UVS.js → trustedFolders-4BWV2IBK.js} +29 -29
  226. package/chunks/types-ML3TRJQ5.js +16 -0
  227. package/chunks/update-relaunch-74DLGH73.js +87 -0
  228. package/chunks/{updateCheck-2KYEYVSB.js → updateCheck-CRFCGFO5.js} +31 -30
  229. package/chunks/{validateNonInterActiveAuth-EN6ZQSR2.js → validateNonInterActiveAuth-BTTEPBGQ.js} +76 -73
  230. package/chunks/{version-3UEA6ZIR.js → version-Y5JE5Q63.js} +1 -1
  231. package/chunks/{web-fetch-PAAEQKBW.js → web-fetch-CFCWTCAP.js} +5 -6
  232. package/chunks/{workflow-QCCCMYP3.js → workflow-6WC7VPQN.js} +27 -28
  233. package/chunks/workspace-providers-status-RVG2C5ZS.js +72 -0
  234. package/chunks/workspace-registration-store-SLEU3D3X.js +27 -0
  235. package/chunks/{workspace-registry-24QFLQYH.js → workspace-registry-QMWGVOTF.js} +32 -35
  236. package/chunks/workspace-service-G572JSEU.js +84 -0
  237. package/chunks/workspace-skills-status-VSSMSMNK.js +71 -0
  238. package/chunks/{write-file-I3MUDRIE.js → write-file-5XVDRORP.js} +27 -28
  239. package/chunks/{zh-RQE7I22T.js → zh-PAUNIMHQ.js} +12 -2
  240. package/chunks/{zh-TW-TBPQGHKH.js → zh-TW-GNEUIUFF.js} +12 -2
  241. package/cli-entry.js +92 -8
  242. package/cli.js +11 -11
  243. package/locales/ca.js +16 -0
  244. package/locales/de.js +16 -0
  245. package/locales/en.js +19 -0
  246. package/locales/fr.js +16 -0
  247. package/locales/ja.js +17 -1
  248. package/locales/pt.js +16 -0
  249. package/locales/ru.js +16 -0
  250. package/locales/zh-TW.js +20 -1
  251. package/locales/zh.js +20 -1
  252. package/package.json +3 -3
  253. package/web-shell/assets/{arc-C15hqnJe.js → arc-vx1tRwnX.js} +1 -1
  254. package/web-shell/assets/{architectureDiagram-3BPJPVTR-B-At37J_.js → architectureDiagram-3BPJPVTR-DBi6iUA1.js} +1 -1
  255. package/web-shell/assets/{blockDiagram-GPEHLZMM-B51wjcU7.js → blockDiagram-GPEHLZMM-Ga9JJ4Ak.js} +1 -1
  256. package/web-shell/assets/{c4Diagram-AAUBKEIU-xBK7BAwN.js → c4Diagram-AAUBKEIU-D8Vi5FYw.js} +1 -1
  257. package/web-shell/assets/channel-B29zQDTL.js +1 -0
  258. package/web-shell/assets/{chunk-2J33WTMH-xKmLg7Yr.js → chunk-2J33WTMH-CSV6yQpU.js} +1 -1
  259. package/web-shell/assets/{chunk-4BX2VUAB-BfkdKZCM.js → chunk-4BX2VUAB-toYlppdI.js} +1 -1
  260. package/web-shell/assets/{chunk-55IACEB6-DT713sZf.js → chunk-55IACEB6-DbjzuyAr.js} +1 -1
  261. package/web-shell/assets/{chunk-727SXJPM-CYEeAamv.js → chunk-727SXJPM-IkkSjSkk.js} +1 -1
  262. package/web-shell/assets/{chunk-AQP2D5EJ-DBN-5CFd.js → chunk-AQP2D5EJ-D5wUL6Zm.js} +1 -1
  263. package/web-shell/assets/{chunk-FMBD7UC4-CGZKk4PH.js → chunk-FMBD7UC4-C3o2DXG0.js} +1 -1
  264. package/web-shell/assets/{chunk-ND2GUHAM-qQbC2O-y.js → chunk-ND2GUHAM-CutIi14T.js} +1 -1
  265. package/web-shell/assets/{chunk-QZHKN3VN-B3zeXwsX.js → chunk-QZHKN3VN-DZ0NRHH-.js} +1 -1
  266. package/web-shell/assets/classDiagram-4FO5ZUOK-BNGI2SvC.js +1 -0
  267. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-BNGI2SvC.js +1 -0
  268. package/web-shell/assets/{cose-bilkent-S5V4N54A-BKsl1Wvy.js → cose-bilkent-S5V4N54A-B3Dl88UJ.js} +1 -1
  269. package/web-shell/assets/{dagre-BM42HDAG-CuuuLiBK.js → dagre-BM42HDAG-DfTxfF6-.js} +1 -1
  270. package/web-shell/assets/{diagram-2AECGRRQ-CG4_eKiV.js → diagram-2AECGRRQ-CJyH98yO.js} +1 -1
  271. package/web-shell/assets/{diagram-5GNKFQAL-DSFTmZB1.js → diagram-5GNKFQAL-EbOiJNmW.js} +1 -1
  272. package/web-shell/assets/{diagram-KO2AKTUF-BxwlEHn8.js → diagram-KO2AKTUF-AYNqpqqA.js} +1 -1
  273. package/web-shell/assets/{diagram-LMA3HP47-BUAg-jMG.js → diagram-LMA3HP47-BY5VPa4H.js} +1 -1
  274. package/web-shell/assets/{diagram-OG6HWLK6-BFM2jlO5.js → diagram-OG6HWLK6-BhMYAKlk.js} +1 -1
  275. package/web-shell/assets/{erDiagram-TEJ5UH35-CerbFPa2.js → erDiagram-TEJ5UH35-Bp8S_F9l.js} +1 -1
  276. package/web-shell/assets/{flowDiagram-I6XJVG4X-BNeZz5Zz.js → flowDiagram-I6XJVG4X-az3TE9PU.js} +1 -1
  277. package/web-shell/assets/{ganttDiagram-6RSMTGT7-CTOogLaM.js → ganttDiagram-6RSMTGT7-CfkAEpCe.js} +3 -3
  278. package/web-shell/assets/{gitGraphDiagram-PVQCEYII-yxSFkXPj.js → gitGraphDiagram-PVQCEYII-D1QmjMCy.js} +1 -1
  279. package/web-shell/assets/index-C8sDwQUv.js +1130 -0
  280. package/web-shell/assets/index-CaBoc5bb.js +3 -0
  281. package/web-shell/assets/index-Dpg5Wymg.css +5 -0
  282. package/web-shell/assets/{infoDiagram-5YYISTIA-DYdAUevm.js → infoDiagram-5YYISTIA-D3ompLrG.js} +1 -1
  283. package/web-shell/assets/{ishikawaDiagram-YF4QCWOH-CNuijZ90.js → ishikawaDiagram-YF4QCWOH-D3MRWp9I.js} +1 -1
  284. package/web-shell/assets/{journeyDiagram-JHISSGLW-BTyiuonf.js → journeyDiagram-JHISSGLW-DVkKCa44.js} +1 -1
  285. package/web-shell/assets/{kanban-definition-UN3LZRKU-DPJo0Uow.js → kanban-definition-UN3LZRKU-BLif81wF.js} +1 -1
  286. package/web-shell/assets/{linear-C8wKCbIC.js → linear-BDU96EGS.js} +1 -1
  287. package/web-shell/assets/{mermaid.core-BV5o7nW5.js → mermaid.core-B-CwC26B.js} +5 -5
  288. package/web-shell/assets/{mindmap-definition-RKZ34NQL-BtLcBmSt.js → mindmap-definition-RKZ34NQL-CS1WOJ4G.js} +1 -1
  289. package/web-shell/assets/{pieDiagram-4H26LBE5-C22J7A9Q.js → pieDiagram-4H26LBE5-BzgtNXVP.js} +1 -1
  290. package/web-shell/assets/{quadrantDiagram-W4KKPZXB-DSL10wiL.js → quadrantDiagram-W4KKPZXB-BRfGC8MA.js} +1 -1
  291. package/web-shell/assets/{requirementDiagram-4Y6WPE33-feqh0UpX.js → requirementDiagram-4Y6WPE33-CPBZkC7g.js} +1 -1
  292. package/web-shell/assets/{sankeyDiagram-5OEKKPKP-Z4OVaWaZ.js → sankeyDiagram-5OEKKPKP-nqNvinIk.js} +1 -1
  293. package/web-shell/assets/{sequenceDiagram-3UESZ5HK-DIluIcb1.js → sequenceDiagram-3UESZ5HK-CM_Wdjh3.js} +1 -1
  294. package/web-shell/assets/{stateDiagram-AJRCARHV-hlhnuoYH.js → stateDiagram-AJRCARHV-L0y-48VE.js} +1 -1
  295. package/web-shell/assets/stateDiagram-v2-BHNVJYJU-BX1DdF8s.js +1 -0
  296. package/web-shell/assets/{timeline-definition-PNZ67QCA-Dqf_CqgL.js → timeline-definition-PNZ67QCA-B_n5rb3A.js} +1 -1
  297. package/web-shell/assets/{vennDiagram-CIIHVFJN-DD2QhaTX.js → vennDiagram-CIIHVFJN-C9NmLV5e.js} +1 -1
  298. package/web-shell/assets/{wardley-L42UT6IY-B2uI85U_.js → wardley-L42UT6IY-CrefK9gt.js} +1 -1
  299. package/web-shell/assets/{wardleyDiagram-YWT4CUSO-U1aJX71g.js → wardleyDiagram-YWT4CUSO-BUccf-bC.js} +1 -1
  300. package/web-shell/assets/{xychartDiagram-2RQKCTM6-C0ODHUee.js → xychartDiagram-2RQKCTM6-DM6ef92l.js} +1 -1
  301. package/web-shell/index.html +2 -2
  302. package/chunks/chunk-524RQP4Q.js +0 -305
  303. package/chunks/chunk-CARU2RR2.js +0 -24
  304. package/chunks/chunk-CU3L64TP.js +0 -93
  305. package/chunks/chunk-OCPBI7J5.js +0 -18
  306. package/chunks/chunk-TEGEBB2I.js +0 -122
  307. package/chunks/chunk-VTU57BWZ.js +0 -30
  308. package/chunks/daemon-status-provider-B2UTZUJ2.js +0 -76
  309. package/chunks/initializer-UTQ7FB7G.js +0 -71
  310. package/chunks/list-DEICDL65.js +0 -74
  311. package/chunks/loadedSettingsAdapter-NOWEGDYJ.js +0 -68
  312. package/chunks/mcp-L5JXEEIA.js +0 -68
  313. package/chunks/nonInteractiveCli-LS2K4X6A.js +0 -124
  314. package/chunks/types-JNKGKUJT.js +0 -12
  315. package/chunks/workspace-providers-status-4KMGETOJ.js +0 -71
  316. package/chunks/workspace-service-RVLBMSMZ.js +0 -80
  317. package/chunks/workspace-skills-status-DS4ZVFTO.js +0 -70
  318. package/web-shell/assets/channel-CLiQD50f.js +0 -1
  319. package/web-shell/assets/classDiagram-4FO5ZUOK-D3sYqow5.js +0 -1
  320. package/web-shell/assets/classDiagram-v2-Q7XG4LA2-D3sYqow5.js +0 -1
  321. package/web-shell/assets/index-D5IWFVk1.css +0 -5
  322. package/web-shell/assets/index-KFJRDhX7.js +0 -783
  323. 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 live sessions in the given workspace. Used by session-picker
1363
- * UIs. Returns an empty list (not 404) when the workspace has no sessions.
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
- const format = opts.format ?? "html";
1442
- const query = opts.format ? `?format=${urlEncode(opts.format)}` : "";
1443
- return await this.fetchWithTimeout(
1444
- `${this.baseUrl}/session/${urlEncode(sessionId)}/export${query}`,
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}/workspace/voice/transcribe${query}`,
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, "POST /workspace/voice/transcribe");
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 the daemon to have been started with `--channel`; otherwise the
2159
- * route responds 409. Pre-flight the `channel_reload` capability.
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({ cwd })
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
- return this.get(
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
- return this.get(
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
- return (model === null || typeof model === "string") && (mode === null || typeof mode === "string");
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(next, "user", text);
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",