zidane 9.1.1 → 9.1.3

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 (279) hide show
  1. package/dist/{acp-Di9WvMDF.js → acp-CeCavNlg.js} +7 -7
  2. package/dist/{acp-Di9WvMDF.js.map → acp-CeCavNlg.js.map} +1 -1
  3. package/dist/acp-cli.js +5 -5
  4. package/dist/acp.d.ts +2 -2
  5. package/dist/acp.js +1 -1
  6. package/dist/{agent-DJhpTS-B.js → agent-Dh_XZ7fj.js} +74 -19
  7. package/dist/agent-Dh_XZ7fj.js.map +1 -0
  8. package/dist/agent.d.ts +1 -1
  9. package/dist/agent.js +1 -1
  10. package/dist/{auth-store-port-DFgf22oo.js → auth-store-port-BKpjlJ8a.js} +2 -2
  11. package/dist/{auth-store-port-DFgf22oo.js.map → auth-store-port-BKpjlJ8a.js.map} +1 -1
  12. package/dist/{auto-update-restart-BFB7Ek87.js → auto-update-restart-CQJtndMG.js} +277 -41
  13. package/dist/auto-update-restart-CQJtndMG.js.map +1 -0
  14. package/dist/{browser-BcoCCB_n.js → browser-BkdeKnxO.js} +56 -2
  15. package/dist/browser-BkdeKnxO.js.map +1 -0
  16. package/dist/{browser-entry-ypi8CyE-.d.ts → browser-entry-BCwruqNa.d.ts} +10 -10
  17. package/dist/{browser-entry-ypi8CyE-.d.ts.map → browser-entry-BCwruqNa.d.ts.map} +1 -1
  18. package/dist/channels.d.ts +5 -5
  19. package/dist/chat/browser.d.ts +4 -4
  20. package/dist/chat/browser.js +6 -6
  21. package/dist/chat/pure.d.ts +5 -5
  22. package/dist/chat/pure.js +8 -8
  23. package/dist/chat.d.ts +5 -5
  24. package/dist/chat.js +55 -55
  25. package/dist/chat.js.map +1 -1
  26. package/dist/{cli-shared-CabruH8Z.js → cli-shared-DeRHgYvl.js} +4 -4
  27. package/dist/{cli-shared-CabruH8Z.js.map → cli-shared-DeRHgYvl.js.map} +1 -1
  28. package/dist/cli-style-DBEm6CyT.js +105 -0
  29. package/dist/cli-style-DBEm6CyT.js.map +1 -0
  30. package/dist/{client-core-CIixwznM.d.ts → client-core-C_4m_oL6.d.ts} +4 -4
  31. package/dist/{client-core-CIixwznM.d.ts.map → client-core-C_4m_oL6.d.ts.map} +1 -1
  32. package/dist/{client-CCaIXWue.d.ts → client-ygTASGis.d.ts} +2 -2
  33. package/dist/{client-CCaIXWue.d.ts.map → client-ygTASGis.d.ts.map} +1 -1
  34. package/dist/codemode-worker.js +8 -5
  35. package/dist/codemode-worker.js.map +1 -1
  36. package/dist/codemode.d.ts +16 -0
  37. package/dist/codemode.d.ts.map +1 -1
  38. package/dist/codemode.js +2 -2
  39. package/dist/{connection-loop-QmWL-fJf.d.ts → connection-loop-D_pRONCr.d.ts} +4 -4
  40. package/dist/{connection-loop-QmWL-fJf.d.ts.map → connection-loop-D_pRONCr.d.ts.map} +1 -1
  41. package/dist/contexts/daytona.d.ts +3 -3
  42. package/dist/contexts/docker.d.ts +1 -1
  43. package/dist/contexts/e2b.d.ts +2 -2
  44. package/dist/contexts/sandbox.d.ts +1 -1
  45. package/dist/{contexts-C72b0mMa.js → contexts-DLZTSRHU.js} +17 -106
  46. package/dist/contexts-DLZTSRHU.js.map +1 -0
  47. package/dist/contexts.d.ts +4 -4
  48. package/dist/contexts.js +2 -2
  49. package/dist/{credentials-wwETW8rI.js → credentials-Bqg-qNBM.js} +2 -2
  50. package/dist/{credentials-wwETW8rI.js.map → credentials-Bqg-qNBM.js.map} +1 -1
  51. package/dist/{cwd-picker-CcekODCt.js → cwd-picker-BsHA6HKv.js} +4 -4
  52. package/dist/{cwd-picker-CcekODCt.js.map → cwd-picker-BsHA6HKv.js.map} +1 -1
  53. package/dist/daemon-cli.js +4 -3
  54. package/dist/daemon-cli.js.map +1 -1
  55. package/dist/{decisions-CXmK0nz9.js → decisions-hsw5XS2g.js} +3 -1
  56. package/dist/decisions-hsw5XS2g.js.map +1 -0
  57. package/dist/{discovery-DycXFxdA.js → discovery-CX7nbMCn.js} +4 -4
  58. package/dist/{discovery-DycXFxdA.js.map → discovery-CX7nbMCn.js.map} +1 -1
  59. package/dist/durable/sqlite.d.ts +2 -2
  60. package/dist/durable.d.ts +1 -1
  61. package/dist/{engine-VQ86XGdG.js → engine-CxBGgU94.js} +6 -6
  62. package/dist/{engine-VQ86XGdG.js.map → engine-CxBGgU94.js.map} +1 -1
  63. package/dist/{eval-Bod0I1W_.js → eval-CfGUDAkN.js} +3 -3
  64. package/dist/{eval-Bod0I1W_.js.map → eval-CfGUDAkN.js.map} +1 -1
  65. package/dist/eval.d.ts +1 -1
  66. package/dist/eval.js +1 -1
  67. package/dist/{executor-C7RQrkEq.js → executor-j_LFRBwS.js} +4 -4
  68. package/dist/{executor-C7RQrkEq.js.map → executor-j_LFRBwS.js.map} +1 -1
  69. package/dist/{extension-mark-BqKdEZwF.js → extension-mark-_rhkDWL5.js} +9 -6
  70. package/dist/extension-mark-_rhkDWL5.js.map +1 -0
  71. package/dist/extensions/testing.d.ts +1 -1
  72. package/dist/extensions/testing.js +2 -2
  73. package/dist/{extensions-BCx4QuGB.js → extensions-ADlhBQ_1.js} +8 -8
  74. package/dist/{extensions-BCx4QuGB.js.map → extensions-ADlhBQ_1.js.map} +1 -1
  75. package/dist/{extensions-client-D8tEAcMw.d.ts → extensions-client-D4Q2XRKV.d.ts} +31 -5
  76. package/dist/extensions-client-D4Q2XRKV.d.ts.map +1 -0
  77. package/dist/extensions.d.ts +1 -1
  78. package/dist/extensions.js +6 -6
  79. package/dist/{fold-rules-DvLK8pbf.d.ts → fold-rules-1DpDwG9h.d.ts} +2 -2
  80. package/dist/{fold-rules-DvLK8pbf.d.ts.map → fold-rules-1DpDwG9h.d.ts.map} +1 -1
  81. package/dist/{google-Crva32sk.js → google-B-Dhmzzf.js} +2 -2
  82. package/dist/{google-Crva32sk.js.map → google-B-Dhmzzf.js.map} +1 -1
  83. package/dist/{headless-CCm-jLLT.js → headless-CQm19BL0.js} +4 -4
  84. package/dist/{headless-CCm-jLLT.js.map → headless-CQm19BL0.js.map} +1 -1
  85. package/dist/headless.d.ts +1 -1
  86. package/dist/headless.js +1 -1
  87. package/dist/history-worker.js +1 -1
  88. package/dist/{host-wO_6GW0y.js → host-C61ntFBC.js} +276 -103
  89. package/dist/host-C61ntFBC.js.map +1 -0
  90. package/dist/{host-BHMs9jsN.js → host-DEoEzQal.js} +13 -4
  91. package/dist/host-DEoEzQal.js.map +1 -0
  92. package/dist/{host-scoped-settings-CrbcqOkP.js → host-scoped-settings-WBYaCork.js} +2 -2
  93. package/dist/{host-scoped-settings-CrbcqOkP.js.map → host-scoped-settings-WBYaCork.js.map} +1 -1
  94. package/dist/{host-signals-Jsjd_-4g.js → host-signals-Cb2TlGtN.js} +5 -5
  95. package/dist/{host-signals-Jsjd_-4g.js.map → host-signals-Cb2TlGtN.js.map} +1 -1
  96. package/dist/{host-version-CNAr9pov.js → host-version-BIx4CuBM.js} +2 -2
  97. package/dist/{host-version-CNAr9pov.js.map → host-version-BIx4CuBM.js.map} +1 -1
  98. package/dist/{index-C6nnKu32.d.ts → index-B0PLo9jn.d.ts} +4 -4
  99. package/dist/{index-C6nnKu32.d.ts.map → index-B0PLo9jn.d.ts.map} +1 -1
  100. package/dist/{index-Djnc8Peh.d.ts → index-De4x-s76.d.ts} +14 -14
  101. package/dist/{index-Djnc8Peh.d.ts.map → index-De4x-s76.d.ts.map} +1 -1
  102. package/dist/{index-CGbOWa7y.d.ts → index-WlE93Q6d.d.ts} +411 -3
  103. package/dist/index-WlE93Q6d.d.ts.map +1 -0
  104. package/dist/{index-CCf_WeTQ.d.ts → index-f-XWIoYo.d.ts} +2 -2
  105. package/dist/{index-CCf_WeTQ.d.ts.map → index-f-XWIoYo.d.ts.map} +1 -1
  106. package/dist/index.d.ts +5 -5
  107. package/dist/index.js +17 -17
  108. package/dist/ipc/browser-types.d.ts +304 -7
  109. package/dist/ipc/browser-types.d.ts.map +1 -1
  110. package/dist/ipc/browser.d.ts +4 -4
  111. package/dist/ipc/browser.js +2 -2
  112. package/dist/ipc/remote.d.ts +6 -6
  113. package/dist/ipc/remote.js +3 -3
  114. package/dist/{ipc-BzWhIybr.js → ipc-DiH_P-wr.js} +4 -4
  115. package/dist/{ipc-BzWhIybr.js.map → ipc-DiH_P-wr.js.map} +1 -1
  116. package/dist/ipc.d.ts +10 -10
  117. package/dist/ipc.js +8 -8
  118. package/dist/{json-Dj-YATkZ.js → json-BjClr43H.js} +2 -20
  119. package/dist/json-BjClr43H.js.map +1 -0
  120. package/dist/{links-CJG_rFvf.js → links-BbC_lOnn.js} +9 -9
  121. package/dist/{links-CJG_rFvf.js.map → links-BbC_lOnn.js.map} +1 -1
  122. package/dist/{loaded-entry-DTURJo_R.js → loaded-entry-C0vkCVNQ.js} +2 -2
  123. package/dist/{loaded-entry-DTURJo_R.js.map → loaded-entry-C0vkCVNQ.js.map} +1 -1
  124. package/dist/mcp.d.ts +1 -1
  125. package/dist/{media-type-BtA0cbfI.d.ts → media-type-ZSmAGHvg.d.ts} +188 -7
  126. package/dist/media-type-ZSmAGHvg.d.ts.map +1 -0
  127. package/dist/{memory-DuVGrzbl.js → memory-C3w8nO8f.js} +132 -31
  128. package/dist/memory-C3w8nO8f.js.map +1 -0
  129. package/dist/model-test-CAtJ76kM.js.map +1 -1
  130. package/dist/{move-session-kylExJ5H.js → move-session-D7ILECs-.js} +4 -4
  131. package/dist/{move-session-kylExJ5H.js.map → move-session-D7ILECs-.js.map} +1 -1
  132. package/dist/{nested-call-record-DlzPeTB7.js → nested-call-record-OayszZBQ.js} +4 -3
  133. package/dist/nested-call-record-OayszZBQ.js.map +1 -0
  134. package/dist/output/stream-json.d.ts +1 -1
  135. package/dist/output/terminal.d.ts +1 -1
  136. package/dist/{path-display-COVV71Yu.js → path-display-DRAEpKOU.js} +3 -3
  137. package/dist/{path-display-COVV71Yu.js.map → path-display-DRAEpKOU.js.map} +1 -1
  138. package/dist/plugins.d.ts +1 -1
  139. package/dist/{prelude-CVKoUzV8.js → prelude-BwiSR1uA.js} +16 -5
  140. package/dist/prelude-BwiSR1uA.js.map +1 -0
  141. package/dist/{presets-CBt6rFfS.js → presets-CMY43nUP.js} +3 -3
  142. package/dist/{presets-CBt6rFfS.js.map → presets-CMY43nUP.js.map} +1 -1
  143. package/dist/presets.d.ts +1 -1
  144. package/dist/presets.js +1 -1
  145. package/dist/{protocol-CEVqBO-q.d.ts → protocol-C2lqKuMd.d.ts} +50 -7
  146. package/dist/protocol-C2lqKuMd.d.ts.map +1 -0
  147. package/dist/protocol-DOGyHgLQ.js.map +1 -1
  148. package/dist/protocol-NSllElLw.js.map +1 -1
  149. package/dist/providers/anthropic.d.ts +1 -1
  150. package/dist/providers/arcee.d.ts +1 -1
  151. package/dist/providers/baseten.d.ts +1 -1
  152. package/dist/providers/cerebras.d.ts +1 -1
  153. package/dist/providers/google.d.ts +1 -1
  154. package/dist/providers/google.js +1 -1
  155. package/dist/providers/local.d.ts +1 -1
  156. package/dist/providers/neuralwatt.d.ts +1 -1
  157. package/dist/providers/openai-compat.d.ts +1 -1
  158. package/dist/providers/openai.d.ts +1 -1
  159. package/dist/providers/openrouter.d.ts +1 -1
  160. package/dist/providers/xai.d.ts +1 -1
  161. package/dist/{providers-Z0TaBp1O.js → providers-CpXV_uLE.js} +5 -5
  162. package/dist/providers-CpXV_uLE.js.map +1 -0
  163. package/dist/providers.d.ts +1 -1
  164. package/dist/providers.js +1 -1
  165. package/dist/{readonly-db-D7Z-k0pQ.js → readonly-db-DrbT8tX6.js} +2 -2
  166. package/dist/{readonly-db-D7Z-k0pQ.js.map → readonly-db-DrbT8tX6.js.map} +1 -1
  167. package/dist/{registry-BKjeBnoy.js → registry-CJHvmvaP.js} +2 -2
  168. package/dist/{registry-BKjeBnoy.js.map → registry-CJHvmvaP.js.map} +1 -1
  169. package/dist/{registry-B6Ww76iW.js → registry-CN6JlZKj.js} +2 -2
  170. package/dist/{registry-B6Ww76iW.js.map → registry-CN6JlZKj.js.map} +1 -1
  171. package/dist/{registry-B9INJwJR.js → registry-CnnKaY9s.js} +324 -39
  172. package/dist/registry-CnnKaY9s.js.map +1 -0
  173. package/dist/{remote-hosts-BMWoHCWO.js → remote-hosts-DoO9CJUQ.js} +4 -4
  174. package/dist/{remote-hosts-BMWoHCWO.js.map → remote-hosts-DoO9CJUQ.js.map} +1 -1
  175. package/dist/{repo-url-D4Dr8NfZ.js → repo-url-DLjjuVk_.js} +169 -2
  176. package/dist/repo-url-DLjjuVk_.js.map +1 -0
  177. package/dist/restate.d.ts +2 -2
  178. package/dist/{sandbox-BwiPGKF7.d.ts → sandbox-B4OW6oNx.d.ts} +2 -2
  179. package/dist/{sandbox-BwiPGKF7.d.ts.map → sandbox-B4OW6oNx.d.ts.map} +1 -1
  180. package/dist/script-progress-CrZ507Qq.js +900 -0
  181. package/dist/script-progress-CrZ507Qq.js.map +1 -0
  182. package/dist/session/sqlite.d.ts +1 -1
  183. package/dist/session.d.ts +1 -1
  184. package/dist/{setting-BQBSyUq0.js → setting-D_FpKFMw.js} +6 -6
  185. package/dist/{setting-BQBSyUq0.js.map → setting-D_FpKFMw.js.map} +1 -1
  186. package/dist/{settings-catalog-4IU2i_jG.js → settings-catalog-DEZlXP51.js} +14 -2
  187. package/dist/settings-catalog-DEZlXP51.js.map +1 -0
  188. package/dist/{settings-keys-iI_Y-7MC.js → settings-keys-CW2UgHgb.js} +3 -3
  189. package/dist/{settings-keys-iI_Y-7MC.js.map → settings-keys-CW2UgHgb.js.map} +1 -1
  190. package/dist/{skills-CFXRItJ6.js → skills-CEbosUlM.js} +2 -2
  191. package/dist/{skills-CFXRItJ6.js.map → skills-CEbosUlM.js.map} +1 -1
  192. package/dist/skills.d.ts +1 -1
  193. package/dist/skills.js +1 -1
  194. package/dist/{source-Bl1Z501r.js → source-3ZnEPOSa.js} +3 -2
  195. package/dist/source-3ZnEPOSa.js.map +1 -0
  196. package/dist/{sqlite-runtime-BZ2L4RaG.d.ts → sqlite-runtime-CS_LBaAN.d.ts} +2 -2
  197. package/dist/sqlite-runtime-CS_LBaAN.d.ts.map +1 -0
  198. package/dist/{src-BY_ND2xn.js → src-BmTXDta8.js} +2 -2
  199. package/dist/{src-BY_ND2xn.js.map → src-BmTXDta8.js.map} +1 -1
  200. package/dist/{store-C6gI7FfZ.js → store-ByCDaKgJ.js} +14 -3
  201. package/dist/store-ByCDaKgJ.js.map +1 -0
  202. package/dist/{system-freeze-m5o1sGIM.js → system-freeze-XgDPIwQS.js} +3 -3
  203. package/dist/{system-freeze-m5o1sGIM.js.map → system-freeze-XgDPIwQS.js.map} +1 -1
  204. package/dist/{todo-edits-CbukbjyV.js → todo-edits-Dyj32ds6.js} +4 -3
  205. package/dist/todo-edits-Dyj32ds6.js.map +1 -0
  206. package/dist/tools/fetch-url.d.ts +1 -1
  207. package/dist/tools/web-search.d.ts +1 -1
  208. package/dist/{tools-CVTGhggj.js → tools-BsrGQ8K4.js} +2 -2
  209. package/dist/{tools-CVTGhggj.js.map → tools-BsrGQ8K4.js.map} +1 -1
  210. package/dist/tools.d.ts +1 -1
  211. package/dist/tools.js +3 -3
  212. package/dist/{transcript-anchors-CiSi_UBn.js → transcript-anchors-DMjvyUjk.js} +3 -3
  213. package/dist/{transcript-anchors-CiSi_UBn.js.map → transcript-anchors-DMjvyUjk.js.map} +1 -1
  214. package/dist/{transcript-reconcile-jbSBjLq2.js → transcript-reconcile-DpQO85wl.js} +3 -3
  215. package/dist/{transcript-reconcile-jbSBjLq2.js.map → transcript-reconcile-DpQO85wl.js.map} +1 -1
  216. package/dist/tui.d.ts +9 -9
  217. package/dist/tui.d.ts.map +1 -1
  218. package/dist/tui.js +289 -38
  219. package/dist/tui.js.map +1 -1
  220. package/dist/{types-bDQagoiL.d.ts → types-2HrgolQz.d.ts} +20 -8
  221. package/dist/types-2HrgolQz.d.ts.map +1 -0
  222. package/dist/types-4q1bFG53.js +122 -0
  223. package/dist/types-4q1bFG53.js.map +1 -0
  224. package/dist/{types-DnRd9_cA.d.ts → types-SXqk6hLD.d.ts} +3 -3
  225. package/dist/{types-DnRd9_cA.d.ts.map → types-SXqk6hLD.d.ts.map} +1 -1
  226. package/dist/types-myxheQkw.js.map +1 -1
  227. package/dist/types.d.ts +3 -3
  228. package/dist/{usage-summary-BfcXjiSM.js → usage-summary-BM7B3JdI.js} +2 -2
  229. package/dist/{usage-summary-BfcXjiSM.js.map → usage-summary-BM7B3JdI.js.map} +1 -1
  230. package/dist/{version-DqqqvHDP.js → version-szdW1Od9.js} +2 -2
  231. package/dist/{version-DqqqvHDP.js.map → version-szdW1Od9.js.map} +1 -1
  232. package/dist/{wait-task-BX4NcOOm.js → wait-task-BiI5UaZQ.js} +13 -3
  233. package/dist/wait-task-BiI5UaZQ.js.map +1 -0
  234. package/dist/{wire-CLm2rMK0.js → wire-C3l9jl9x.js} +2 -2
  235. package/dist/{wire-CLm2rMK0.js.map → wire-C3l9jl9x.js.map} +1 -1
  236. package/dist/{write-file-0E6TUJ9A.js → write-file-Dquu7MzB.js} +5 -3
  237. package/dist/write-file-Dquu7MzB.js.map +1 -0
  238. package/dist/{ws-DfGGYQ4W.js → ws-CEHi0CiB.js} +4 -4
  239. package/dist/{ws-DfGGYQ4W.js.map → ws-CEHi0CiB.js.map} +1 -1
  240. package/dist/{ws-client-CFMbhsNq.js → ws-client-t8XNWxcq.js} +2 -2
  241. package/dist/{ws-client-CFMbhsNq.js.map → ws-client-t8XNWxcq.js.map} +1 -1
  242. package/docs/CHAT.md +55 -0
  243. package/docs/CODEMODE.md +37 -0
  244. package/docs/EXTENSIONS.md +8 -6
  245. package/docs/RELEASE-NOTES-NEXT.md +48 -1
  246. package/docs/RELEASE.md +9 -1
  247. package/package.json +2 -3
  248. package/dist/agent-DJhpTS-B.js.map +0 -1
  249. package/dist/auto-update-restart-BFB7Ek87.js.map +0 -1
  250. package/dist/browser-BcoCCB_n.js.map +0 -1
  251. package/dist/contexts-C72b0mMa.js.map +0 -1
  252. package/dist/decisions-CXmK0nz9.js.map +0 -1
  253. package/dist/extension-mark-BqKdEZwF.js.map +0 -1
  254. package/dist/extensions-client-D8tEAcMw.d.ts.map +0 -1
  255. package/dist/host-BHMs9jsN.js.map +0 -1
  256. package/dist/host-wO_6GW0y.js.map +0 -1
  257. package/dist/index-CGbOWa7y.d.ts.map +0 -1
  258. package/dist/json-Dj-YATkZ.js.map +0 -1
  259. package/dist/media-type-BtA0cbfI.d.ts.map +0 -1
  260. package/dist/memory-DuVGrzbl.js.map +0 -1
  261. package/dist/nested-call-events-BYk8XvGX.js +0 -182
  262. package/dist/nested-call-events-BYk8XvGX.js.map +0 -1
  263. package/dist/nested-call-record-DlzPeTB7.js.map +0 -1
  264. package/dist/prelude-CVKoUzV8.js.map +0 -1
  265. package/dist/protocol-CEVqBO-q.d.ts.map +0 -1
  266. package/dist/providers-Z0TaBp1O.js.map +0 -1
  267. package/dist/registry-B9INJwJR.js.map +0 -1
  268. package/dist/repo-url-D4Dr8NfZ.js.map +0 -1
  269. package/dist/settings-catalog-4IU2i_jG.js.map +0 -1
  270. package/dist/source-Bl1Z501r.js.map +0 -1
  271. package/dist/sqlite-runtime-BZ2L4RaG.d.ts.map +0 -1
  272. package/dist/store-C6gI7FfZ.js.map +0 -1
  273. package/dist/todo-edits-CbukbjyV.js.map +0 -1
  274. package/dist/types-DTMEhKJO.js +0 -14
  275. package/dist/types-DTMEhKJO.js.map +0 -1
  276. package/dist/types-bDQagoiL.d.ts.map +0 -1
  277. package/dist/wait-task-BX4NcOOm.js.map +0 -1
  278. package/dist/write-file-0E6TUJ9A.js.map +0 -1
  279. package/scripts/eval.ts +0 -179
@@ -1,22 +1,22 @@
1
1
  import { t as __exportAll } from "./rolldown-runtime-BhDjJH2R.js";
2
2
  import { p as errorMessage } from "./errors-C3z7pmOx.js";
3
3
  import { i as ARTIFACT_KIND_PATTERN } from "./artifacts-DPVc-oG0.js";
4
- import { i as extensionStoragePath, o as withProvenance } from "./json-Dj-YATkZ.js";
5
- import { a as readonlyView, i as isKnownHookEvent, n as createDecider, o as unwrapReadonly } from "./decisions-CXmK0nz9.js";
6
- import { D as errorMessage$1, E as checkSchema, G as NoUiError, H as DialogTimeoutError, I as checkSettingsValues, Jt as DisposedError, L as cleanSettingsSchema, N as createFacetRegistry, O as isPlainRecord, R as settingsWire, Rt as validateDefinition, S as createMemoryRegistry, T as validateStoreValue, _ as createMemorySettingsPort, a as systemClock, bt as normalizeChords, ct as track, dt as createWorkspaceSurface, f as EMPTY_MCP_PORT, g as NO_UI_CLIENT_PORT, h as NO_INTEGRATION_FLOWS, lt as createArtifactsSurface, m as NO_CLIENT_DIALOG_PORT, ot as assertAlive, r as createUiRegistry, st as createOwner, u as runtimeSettingsWire, v as createMemoryStoragePort, w as createStorageDomain, xt as resolveMod, yt as createKeymap, zt as actionScope } from "./registry-B9INJwJR.js";
4
+ import { a as withProvenance } from "./json-BjClr43H.js";
5
+ import { a as readonlyView, i as isKnownHookEvent, n as createDecider, o as unwrapReadonly } from "./decisions-hsw5XS2g.js";
6
+ import { Ct as normalizeChords, D as errorMessage$1, E as checkSchema, Ht as actionScope, K as NoUiError, L as checkSettingsValues, O as isPlainRecord, P as createFacetRegistry, R as cleanSettingsSchema, S as createMemoryRegistry, St as createKeymap, T as validateStoreValue, U as DialogTimeoutError, Vt as validateDefinition, Zt as DisposedError, _ as createMemorySettingsPort, a as systemClock, ct as assertUsable, dt as track, f as EMPTY_MCP_PORT, ft as createArtifactsSurface, g as NO_UI_CLIENT_PORT, h as NO_INTEGRATION_FLOWS, k as resolveStoragePath, lt as createOwner, m as NO_CLIENT_DIALOG_PORT, mt as createWorkspaceSurface, r as createUiRegistry, st as assertAlive, u as runtimeSettingsWire, ut as isTornDown, v as createMemoryStoragePort, w as createStorageDomain, wt as resolveMod, z as settingsWire } from "./registry-CnnKaY9s.js";
7
7
  import { t as generateStructuredData } from "./generate-data-Cs86LH2u.js";
8
8
  import { t as createArtifactDetectHook } from "./artifact-detect-BkDNUhfB.js";
9
- import { t as ZIDANE_VERSION } from "./version-DqqqvHDP.js";
10
- import { n as satisfiesVersionRange } from "./host-version-CNAr9pov.js";
9
+ import { t as ZIDANE_VERSION } from "./version-szdW1Od9.js";
10
+ import { n as satisfiesVersionRange } from "./host-version-BIx4CuBM.js";
11
11
  import { F as parseBindingSpec } from "./references-DZ5qTYDl.js";
12
12
  import { r as createLogger, t as consoleSink } from "./logger-BQj8QCJp.js";
13
- import { a as createSettingsDomain, n as RpcErrorType, r as jsonBytes } from "./wire-CLm2rMK0.js";
13
+ import { a as createSettingsDomain, n as RpcErrorType, r as jsonBytes } from "./wire-C3l9jl9x.js";
14
14
  import { t as IMAGE_ASPECT_RATIOS } from "./types-JzccL5GE.js";
15
- import { s as onProviderAccountsChange } from "./credentials-wwETW8rI.js";
16
- import { n as integrationRegistry, t as createIntegrationRegistry } from "./registry-BKjeBnoy.js";
15
+ import { s as onProviderAccountsChange } from "./credentials-Bqg-qNBM.js";
16
+ import { n as integrationRegistry, t as createIntegrationRegistry } from "./registry-CJHvmvaP.js";
17
17
  import { n as RpcCallError } from "./rpc-Daec0xVh.js";
18
18
  import { r as loadAgentPlugin } from "./plugins-CNj4kHpO.js";
19
- import { a as createModelsCatalog, c as addTransform, d as reloadWith, f as createCatalogSet, h as createSessionsDomain, i as watchProviderAccounts, l as extensionOrigin, m as clonePlain, n as createProvidersCatalog, o as createModelsDomain, p as once, r as createProvidersDomain, u as owned } from "./providers-Z0TaBp1O.js";
19
+ import { a as createModelsCatalog, c as addTransform, d as reloadWith, f as createCatalogSet, h as createSessionsDomain, i as watchProviderAccounts, l as extensionOrigin, m as clonePlain, n as createProvidersCatalog, o as createModelsDomain, p as once, r as createProvidersDomain, u as owned } from "./providers-CpXV_uLE.js";
20
20
  import { basename, isAbsolute, resolve } from "node:path";
21
21
  import { createHooks } from "hookable";
22
22
  import { AsyncLocalStorage } from "node:async_hooks";
@@ -914,6 +914,54 @@ function paletteProviderEntry(deps, spec, group) {
914
914
  } } : {}
915
915
  };
916
916
  }
917
+ /** Marks a run in flight (`Guard.lease`): an unload meanwhile tears down only once it ends. Throws `DisposedError` once unloaded. */
918
+ function lease(guard, label) {
919
+ return guard.lease?.(label) ?? (() => {});
920
+ }
921
+ /** `fn` holding a lease while it runs. */
922
+ function leased(guard, label, fn) {
923
+ return (...args) => {
924
+ const release = lease(guard, label);
925
+ let result;
926
+ try {
927
+ result = fn(...args);
928
+ } catch (error) {
929
+ release();
930
+ throw error;
931
+ }
932
+ if (result && typeof result.then === "function") return result.finally(release);
933
+ release();
934
+ return result;
935
+ };
936
+ }
937
+ /**
938
+ * The steps of one pipeline share one lease, from the first step to the last
939
+ * (or the step that throws, or an abort), so an unload between two steps does
940
+ * not tear the extension down under the next one. Keyed by the run's context,
941
+ * which `executeCommand` hands to every step.
942
+ */
943
+ function pipeline(guard, label, steps) {
944
+ const runs = /* @__PURE__ */ new WeakMap();
945
+ const end = (ctx) => {
946
+ const release = runs.get(ctx);
947
+ runs.delete(ctx);
948
+ release?.();
949
+ };
950
+ return steps.map((step, i) => ({ run: async (ctx) => {
951
+ if (!runs.has(ctx)) {
952
+ runs.set(ctx, lease(guard, label));
953
+ ctx.signal?.addEventListener("abort", () => end(ctx), { once: true });
954
+ }
955
+ try {
956
+ const result = await step.run(ctx);
957
+ if (i === steps.length - 1) end(ctx);
958
+ return result;
959
+ } catch (error) {
960
+ end(ctx);
961
+ throw error;
962
+ }
963
+ } }));
964
+ }
917
965
  /**
918
966
  * Makes `ctx.commands` and `ctx.keymap` for one extension.
919
967
  *
@@ -1012,7 +1060,7 @@ function createCommandsDomain(deps, port, opts = {}) {
1012
1060
  }
1013
1061
  const run = spec.run;
1014
1062
  const complete = spec.slash?.complete;
1015
- const steps = hasSteps ? spec.steps.map((step, i) => ({ run: attributed(`command ${id} step ${i + 1}`, step.run) })) : void 0;
1063
+ const steps = hasSteps ? pipeline(guard, `command ${id}`, spec.steps.map((step, i) => ({ run: attributed(`command ${id} step ${i + 1}`, step.run) }))) : void 0;
1016
1064
  const entry = {
1017
1065
  id,
1018
1066
  extensionId,
@@ -1040,7 +1088,7 @@ function createCommandsDomain(deps, port, opts = {}) {
1040
1088
  for (const stop of stops) guard.callSync(`command ${id} unsubscribe`, stop);
1041
1089
  };
1042
1090
  },
1043
- ...typeof run === "function" ? { run: attributed(`command ${id}`, run) } : {},
1091
+ ...typeof run === "function" ? { run: leased(guard, `command ${id}`, attributed(`command ${id}`, run)) } : {},
1044
1092
  ...steps ? { steps } : {},
1045
1093
  ...typeof complete === "function" ? { complete: async (prefix) => await guard.call(`command ${id} complete`, () => complete(prefix), { fallback: [] }) ?? [] } : {}
1046
1094
  };
@@ -2118,6 +2166,16 @@ function createGuard(options) {
2118
2166
  const threw = (label, cause) => {
2119
2167
  fail(new ExtensionCallbackError(extensionId, label, "error", errorMessage(cause), cause));
2120
2168
  };
2169
+ const lease = (label, opts = {}) => options.lease ? options.lease(`[${extensionId}] ${label}`, opts) : () => {};
2170
+ /** A lease for a guarded call, or `undefined` when the extension is unloaded (the call does not run). */
2171
+ const tryLease = (label, timeoutMs) => {
2172
+ try {
2173
+ return lease(label, timeoutMs !== void 0 && Number.isFinite(timeoutMs) ? { timeoutMs } : {});
2174
+ } catch (error) {
2175
+ if (error instanceof DisposedError) return void 0;
2176
+ throw error;
2177
+ }
2178
+ };
2121
2179
  return {
2122
2180
  extensionId,
2123
2181
  get tripped() {
@@ -2128,56 +2186,74 @@ function createGuard(options) {
2128
2186
  return [...failures];
2129
2187
  },
2130
2188
  report: threw,
2189
+ lease,
2131
2190
  async call(label, fn, opts = {}) {
2132
2191
  if (tripped && !opts.teardown) return opts.fallback;
2133
- const controller = new AbortController();
2134
- let result;
2135
- try {
2136
- result = stalls.run(extensionId, label, () => fn(controller.signal));
2137
- } catch (error) {
2138
- threw(label, error);
2139
- return opts.fallback;
2140
- }
2141
- if (!isThenable(result)) return result;
2142
- const pending = Promise.resolve(result);
2143
- const timeoutMs = opts.timeoutMs ?? defaultTimeout;
2144
- if (!Number.isFinite(timeoutMs)) try {
2145
- return await pending;
2146
- } catch (error) {
2147
- threw(label, error);
2148
- return opts.fallback;
2149
- }
2150
- let timer;
2151
- const timedOut = new Promise((resolve) => {
2152
- timer = setTimeout(resolve, timeoutMs, TIMED_OUT);
2153
- });
2192
+ const release = opts.teardown ? () => {} : tryLease(label, opts.timeoutMs ?? defaultTimeout);
2193
+ if (!release) return opts.fallback;
2154
2194
  try {
2155
- const value = await Promise.race([pending, timedOut]);
2156
- if (value !== TIMED_OUT) return value;
2157
- const message = `timed out after ${timeoutMs}ms`;
2158
- controller.abort(/* @__PURE__ */ new Error(`${label} ${message}`));
2159
- pending.catch(() => {});
2160
- fail(new ExtensionCallbackError(extensionId, label, "timeout", message));
2161
- return opts.fallback;
2162
- } catch (error) {
2163
- threw(label, error);
2164
- return opts.fallback;
2195
+ return await runCall(label, fn, opts);
2165
2196
  } finally {
2166
- clearTimeout(timer);
2197
+ release();
2167
2198
  }
2168
2199
  },
2169
2200
  callSync(label, fn, opts = {}) {
2170
2201
  if (tripped) return opts.fallback;
2202
+ const release = tryLease(label);
2203
+ if (!release) return opts.fallback;
2204
+ let value;
2171
2205
  try {
2172
- const value = stalls.run(extensionId, label, fn);
2173
- if (isThenable(value)) Promise.resolve(value).catch((error) => threw(label, error));
2174
- return value;
2206
+ value = stalls.run(extensionId, label, fn);
2175
2207
  } catch (error) {
2208
+ release();
2176
2209
  threw(label, error);
2177
2210
  return opts.fallback;
2178
2211
  }
2212
+ if (isThenable(value)) {
2213
+ Promise.resolve(value).catch((error) => threw(label, error)).finally(release);
2214
+ return value;
2215
+ }
2216
+ release();
2217
+ return value;
2179
2218
  }
2180
2219
  };
2220
+ async function runCall(label, fn, opts) {
2221
+ const controller = new AbortController();
2222
+ let result;
2223
+ try {
2224
+ result = stalls.run(extensionId, label, () => fn(controller.signal));
2225
+ } catch (error) {
2226
+ threw(label, error);
2227
+ return opts.fallback;
2228
+ }
2229
+ if (!isThenable(result)) return result;
2230
+ const pending = Promise.resolve(result);
2231
+ const timeoutMs = opts.timeoutMs ?? defaultTimeout;
2232
+ if (!Number.isFinite(timeoutMs)) try {
2233
+ return await pending;
2234
+ } catch (error) {
2235
+ threw(label, error);
2236
+ return opts.fallback;
2237
+ }
2238
+ let timer;
2239
+ const timedOut = new Promise((resolve) => {
2240
+ timer = setTimeout(resolve, timeoutMs, TIMED_OUT);
2241
+ });
2242
+ try {
2243
+ const value = await Promise.race([pending, timedOut]);
2244
+ if (value !== TIMED_OUT) return value;
2245
+ const message = `timed out after ${timeoutMs}ms`;
2246
+ controller.abort(/* @__PURE__ */ new Error(`${label} ${message}`));
2247
+ pending.catch(() => {});
2248
+ fail(new ExtensionCallbackError(extensionId, label, "timeout", message));
2249
+ return opts.fallback;
2250
+ } catch (error) {
2251
+ threw(label, error);
2252
+ return opts.fallback;
2253
+ } finally {
2254
+ clearTimeout(timer);
2255
+ }
2256
+ }
2181
2257
  }
2182
2258
  function isThenable(value) {
2183
2259
  return value !== null && (typeof value === "object" || typeof value === "function") && typeof value.then === "function";
@@ -2509,6 +2585,32 @@ function createToolsCatalog(port, options = {}) {
2509
2585
  }
2510
2586
  };
2511
2587
  }
2588
+ /**
2589
+ * `def` whose `execute` holds a lease on the extension (`Guard.lease`) while
2590
+ * it runs: an agent that took the tool before an unload finishes the call
2591
+ * on live domains. A call that starts after the unload throws
2592
+ * `DisposedError`. Same prototype and properties, like {@link cloneTool}.
2593
+ */
2594
+ function leasedTool(deps, name, def) {
2595
+ const lease = deps.guard.lease;
2596
+ if (!lease) return def;
2597
+ const execute = def.execute;
2598
+ const wrapped = Object.create(Object.getPrototypeOf(def), Object.getOwnPropertyDescriptors(def));
2599
+ wrapped.execute = function(...args) {
2600
+ const release = lease(`tool ${name}`);
2601
+ let result;
2602
+ try {
2603
+ result = execute.apply(this, args);
2604
+ } catch (error) {
2605
+ release();
2606
+ throw error;
2607
+ }
2608
+ if (result && typeof result.then === "function") return result.finally(release);
2609
+ release();
2610
+ return result;
2611
+ };
2612
+ return wrapped;
2613
+ }
2512
2614
  /** Creates one extension's `ctx.tools` over the shared catalog. */
2513
2615
  function createToolsDomain(deps, catalog) {
2514
2616
  return {
@@ -2517,7 +2619,7 @@ function createToolsDomain(deps, catalog) {
2517
2619
  if (!def || typeof def.execute !== "function") throw new TypeError(`tools.register: "${name}" needs a ToolDef with execute`);
2518
2620
  return owned(deps, "tools.register", () => catalog.register({
2519
2621
  name,
2520
- def
2622
+ def: leasedTool(deps, name, def)
2521
2623
  }, extensionOrigin(deps)));
2522
2624
  },
2523
2625
  metadata(namespace, spec) {
@@ -2795,15 +2897,15 @@ function createArtifactsDomain(deps, port) {
2795
2897
  }));
2796
2898
  } },
2797
2899
  list: async (query) => {
2798
- assertAlive(owner, "artifacts.list");
2900
+ assertUsable(owner, "artifacts.list");
2799
2901
  return surface.list(query);
2800
2902
  },
2801
2903
  find: async (kind, uri) => {
2802
- assertAlive(owner, "artifacts.find");
2904
+ assertUsable(owner, "artifacts.find");
2803
2905
  return (await surface.find(kind, uri))[0];
2804
2906
  },
2805
2907
  record: async (input) => {
2806
- assertAlive(owner, "artifacts.record");
2908
+ assertUsable(owner, "artifacts.record");
2807
2909
  return surface.record(input);
2808
2910
  }
2809
2911
  };
@@ -2890,9 +2992,9 @@ function createGenerateDomain(deps, port) {
2890
2992
  hooks: createHooks()
2891
2993
  }).forRun(void 0));
2892
2994
  const resolve = async (method, model) => {
2893
- assertAlive(owner, `generate.${method}`);
2995
+ assertUsable(owner, `generate.${method}`);
2894
2996
  const resolved = await port.resolve(model);
2895
- assertAlive(owner, `generate.${method}`);
2997
+ assertUsable(owner, `generate.${method}`);
2896
2998
  const counted = counting(resolved.provider, (usage) => {
2897
2999
  try {
2898
3000
  port.recordUsage?.({
@@ -2912,14 +3014,14 @@ function createGenerateDomain(deps, port) {
2912
3014
  };
2913
3015
  };
2914
3016
  const decide = ((request, options) => {
2915
- assertAlive(owner, "generate.decide");
3017
+ assertUsable(owner, "generate.decide");
2916
3018
  const scoped = {
2917
3019
  ...request,
2918
3020
  signal: combined(owner.signal, request.signal)
2919
3021
  };
2920
3022
  return options ? decider()(scoped, options) : decider()(scoped);
2921
3023
  });
2922
- Object.defineProperty(decide, "available", { get: () => !owner.disposed && decider().available });
3024
+ Object.defineProperty(decide, "available", { get: () => !isTornDown(owner) && decider().available });
2923
3025
  return {
2924
3026
  async text(opts) {
2925
3027
  const { counted, modelId } = await resolve("text", opts.model);
@@ -2947,11 +3049,11 @@ function createGenerateDomain(deps, port) {
2947
3049
  },
2948
3050
  decide,
2949
3051
  async image(opts) {
2950
- assertAlive(owner, "generate.image");
3052
+ assertUsable(owner, "generate.image");
2951
3053
  const request = imageRequest(extensionId, opts, combined(owner.signal, opts?.signal));
2952
3054
  if (!port.image) throw new Error("generate.image: this host cannot generate images");
2953
3055
  const result = await port.image(request);
2954
- assertAlive(owner, "generate.image");
3056
+ assertUsable(owner, "generate.image");
2955
3057
  try {
2956
3058
  port.recordUsage?.({
2957
3059
  extensionId,
@@ -3069,7 +3171,12 @@ function createPluginsDomain(deps, port) {
3069
3171
  const source = skillSource(extension.source);
3070
3172
  const loaded = await loadAgentPlugin(target, {
3071
3173
  source,
3072
- dataRoot: extensionStoragePath(extension.paths, extensionId, "data", "plugin-data"),
3174
+ dataRoot: extension.storagePath?.("data", "plugin-data") ?? resolveStoragePath({
3175
+ paths: extension.paths,
3176
+ extensionId,
3177
+ ...extension.dir !== void 0 ? { dir: extension.dir } : {},
3178
+ logger
3179
+ }, "data", "plugin-data"),
3073
3180
  ...options.skills !== void 0 ? { skills: options.skills } : {},
3074
3181
  ...options.mcp !== void 0 ? { mcp: options.mcp } : {},
3075
3182
  ...options.namePrefix !== void 0 ? { namePrefix: options.namePrefix } : {}
@@ -3134,11 +3241,11 @@ function createWorkspaceDomain(deps, port) {
3134
3241
  const surface = createWorkspaceSurface(async () => await port.current()?.workspace?.() ?? null, () => port.current()?.workspaceAvailable?.());
3135
3242
  return {
3136
3243
  available: async () => {
3137
- assertAlive(owner, "workspace.available");
3244
+ assertUsable(owner, "workspace.available");
3138
3245
  return surface.available();
3139
3246
  },
3140
3247
  exec: async (command, options = {}) => {
3141
- assertAlive(owner, "workspace.exec");
3248
+ assertUsable(owner, "workspace.exec");
3142
3249
  const signal = options.signal ? AbortSignal.any([options.signal, owner.signal]) : owner.signal;
3143
3250
  return surface.exec(command, {
3144
3251
  ...options,
@@ -3146,19 +3253,19 @@ function createWorkspaceDomain(deps, port) {
3146
3253
  });
3147
3254
  },
3148
3255
  readFile: async (path) => {
3149
- assertAlive(owner, "workspace.readFile");
3256
+ assertUsable(owner, "workspace.readFile");
3150
3257
  return surface.readFile(path);
3151
3258
  },
3152
3259
  writeFile: async (path, content) => {
3153
- assertAlive(owner, "workspace.writeFile");
3260
+ assertUsable(owner, "workspace.writeFile");
3154
3261
  return surface.writeFile(path, content);
3155
3262
  },
3156
3263
  listFiles: async (path, options) => {
3157
- assertAlive(owner, "workspace.listFiles");
3264
+ assertUsable(owner, "workspace.listFiles");
3158
3265
  return surface.listFiles(path, options);
3159
3266
  },
3160
3267
  fileSize: async (path) => {
3161
- assertAlive(owner, "workspace.fileSize");
3268
+ assertUsable(owner, "workspace.fileSize");
3162
3269
  return surface.fileSize(path);
3163
3270
  }
3164
3271
  };
@@ -3303,7 +3410,7 @@ function createExtensionContext(input, services, owner) {
3303
3410
  const childCtx = createExtensionContext(input, services, child);
3304
3411
  return Object.assign(childCtx, { dispose: () => child.dispose() });
3305
3412
  },
3306
- onCleanup: (cleanup) => owner.onCleanup(cleanup),
3413
+ onCleanup: (cleanup) => owner.onTeardown(cleanup),
3307
3414
  add: createUiAdd(deps, services.ui),
3308
3415
  tools: createToolsDomain(deps, catalogs.tools),
3309
3416
  hooks: createHooksDomain(deps, input.hooks, { interceptors: services.interceptors }),
@@ -3341,6 +3448,8 @@ function desktopDomain(port, owner) {
3341
3448
  }
3342
3449
  };
3343
3450
  }
3451
+ /** How long unload waits for async cleanups, in ms. */
3452
+ const UNLOAD_TIMEOUT_MS = 5e3;
3344
3453
  const NOT_SETTLED = Symbol("not settled");
3345
3454
  /**
3346
3455
  * Runs `definition.setup` with a context bound to `owner`.
@@ -3408,7 +3517,7 @@ async function runSetup(definition, ctxFactory, owner, guard, options = {}) {
3408
3517
  const warnings = [];
3409
3518
  if (typeof result === "function") {
3410
3519
  const cleanup = result;
3411
- owner.onCleanup(() => runCleanup(cleanup));
3520
+ owner.onTeardown(() => runCleanup(cleanup));
3412
3521
  } else if (result !== void 0) warnings.push(`setup returned ${typeof result}; only a cleanup function or nothing is used`);
3413
3522
  return {
3414
3523
  ok: true,
@@ -3416,9 +3525,11 @@ async function runSetup(definition, ctxFactory, owner, guard, options = {}) {
3416
3525
  };
3417
3526
  }
3418
3527
  /**
3419
- * Unloads an extension: disposes its owner (aborting `ctx.signal`, then
3420
- * every registration and cleanup in reverse order) and waits for the async
3421
- * cleanups up to a bound. Calling it again is harmless.
3528
+ * Unloads an extension: disposes its owner (every registration withdrawn,
3529
+ * then `ctx.signal` aborted and the teardown cleanups run) and waits for the
3530
+ * async cleanups up to a bound. With calls in flight the teardown waits for
3531
+ * them (`owner.ts`): unload then waits only for the withdrawal and reports
3532
+ * `draining`. Calling it again is harmless.
3422
3533
  *
3423
3534
  * @param owner - The extension's root owner.
3424
3535
  * @param options - `timeoutMs`, default {@link UNLOAD_TIMEOUT_MS}.
@@ -3426,14 +3537,26 @@ async function runSetup(definition, ctxFactory, owner, guard, options = {}) {
3426
3537
  * @returns Whether every cleanup finished in time.
3427
3538
  */
3428
3539
  async function unload(owner, options = {}) {
3429
- const timeoutMs = options.timeoutMs ?? 5e3;
3430
3540
  owner.dispose();
3541
+ if (owner.draining) return {
3542
+ ...await settleWithin(owner.withdrawn, options.timeoutMs),
3543
+ draining: true
3544
+ };
3545
+ return settleWithin(owner.settled, options.timeoutMs);
3546
+ }
3547
+ /**
3548
+ * Waits for `done` up to `timeoutMs` (default {@link UNLOAD_TIMEOUT_MS}).
3549
+ *
3550
+ * @param done - Async cleanups settling.
3551
+ * @param timeoutMs - The bound.
3552
+ */
3553
+ async function settleWithin(done, timeoutMs = UNLOAD_TIMEOUT_MS) {
3431
3554
  let timer;
3432
3555
  const timedOut = new Promise((resolve) => {
3433
3556
  timer = setTimeout(resolve, timeoutMs, NOT_SETTLED);
3434
3557
  });
3435
3558
  try {
3436
- return await Promise.race([owner.settled, timedOut]) === NOT_SETTLED ? {
3559
+ return await Promise.race([done, timedOut]) === NOT_SETTLED ? {
3437
3560
  ok: false,
3438
3561
  error: `cleanup still running after ${timeoutMs}ms`
3439
3562
  } : { ok: true };
@@ -3627,7 +3750,9 @@ function createShared(options, ports, baseLogger, records, order, rank) {
3627
3750
  changeListeners.delete(listener);
3628
3751
  };
3629
3752
  };
3753
+ let withdrawals = 0;
3630
3754
  const outputs = {
3755
+ withdrawals: () => withdrawals,
3631
3756
  interceptors: createInterceptorRegistry({ loadOrder: rank }),
3632
3757
  catalogs: {
3633
3758
  tools: createToolsCatalog(ports.catalogs?.tools ?? { base: () => [] }, loadOrder),
@@ -3675,7 +3800,8 @@ function createShared(options, ports, baseLogger, records, order, rank) {
3675
3800
  return r ? {
3676
3801
  ...r.entry.dir !== void 0 ? { dir: r.entry.dir } : {},
3677
3802
  source: r.entry.source,
3678
- paths: options.paths
3803
+ paths: options.paths,
3804
+ ...r.storage ? { storagePath: r.storage.storage.path } : {}
3679
3805
  } : void 0;
3680
3806
  },
3681
3807
  registerSkill: (skill, origin) => outputs.catalogs.skills.register(skill, origin),
@@ -3729,6 +3855,9 @@ function createShared(options, ports, baseLogger, records, order, rank) {
3729
3855
  commands.dispose();
3730
3856
  services.dialogs.dispose();
3731
3857
  };
3858
+ const withdrawn = () => {
3859
+ withdrawals++;
3860
+ };
3732
3861
  return {
3733
3862
  outputs,
3734
3863
  services,
@@ -3741,7 +3870,8 @@ function createShared(options, ports, baseLogger, records, order, rank) {
3741
3870
  subscribe,
3742
3871
  changeListeners,
3743
3872
  ...rpcBridge ? { rpcBridge } : {},
3744
- release
3873
+ release,
3874
+ withdrawn
3745
3875
  };
3746
3876
  }
3747
3877
  /** The per-extension hooks port: the host's bus when given, else the extension's own. */
@@ -3882,8 +4012,9 @@ async function preloadSessions(records, sessionId, logger) {
3882
4012
  * withdrawn, cleanups run) and its async cleanups get the unload bound; one
3883
4013
  * still running then is logged and left alone. Called again while that runs
3884
4014
  * (an unload after the guard tripped), it waits for the same teardown.
4015
+ * `withdrawn` is told before an active owner's registrations go.
3885
4016
  */
3886
- function deactivateRecord(r, logger) {
4017
+ function deactivateRecord(r, logger, withdrawn) {
3887
4018
  const owner = r.owner;
3888
4019
  r.owner = void 0;
3889
4020
  r.guard = void 0;
@@ -3894,6 +4025,9 @@ function deactivateRecord(r, logger) {
3894
4025
  r.host.clear();
3895
4026
  return r.deactivating ?? Promise.resolve();
3896
4027
  }
4028
+ withdrawn();
4029
+ owner.dispose();
4030
+ if (owner.draining) r.teardown = awaitTeardown(owner, r.id, logger);
3897
4031
  r.deactivating = (async () => {
3898
4032
  const outcome = await unload(owner);
3899
4033
  if (!outcome.ok) logger.warn(`unload: ${outcome.error}`, { extension: r.id });
@@ -3902,6 +4036,61 @@ function deactivateRecord(r, logger) {
3902
4036
  })();
3903
4037
  return r.deactivating;
3904
4038
  }
4039
+ /**
4040
+ * Waits for a draining owner's teardown: it runs once its calls in flight
4041
+ * ended (bounded by the drain bound), then its async cleanups get the unload bound.
4042
+ */
4043
+ function awaitTeardown(owner, id, logger) {
4044
+ return new Promise((resolve) => {
4045
+ const started = () => {
4046
+ settleWithin(owner.settled).then((outcome) => {
4047
+ if (!outcome.ok) logger.warn(`unload: ${outcome.error}`, { extension: id });
4048
+ resolve();
4049
+ });
4050
+ };
4051
+ if (owner.tornDown) started();
4052
+ else owner.signal.addEventListener("abort", started, { once: true });
4053
+ });
4054
+ }
4055
+ /**
4056
+ * One extension's guard and root owner. Every guarded call holds a lease on
4057
+ * the owner, and the owner logs a deferred teardown on the extension's logger.
4058
+ */
4059
+ function createGuardedOwner(id, logger, stalls, options, onTrip) {
4060
+ let owner;
4061
+ const guard = createGuard({
4062
+ extensionId: id,
4063
+ logger,
4064
+ stalls,
4065
+ ...options.budget !== void 0 ? { budget: options.budget } : {},
4066
+ ...options.callbackTimeoutMs !== void 0 ? { timeoutMs: options.callbackTimeoutMs } : {},
4067
+ lease: (label, leaseOpts) => owner.lease(label, leaseOpts),
4068
+ onTrip: (trip) => onTrip(trip, guard)
4069
+ });
4070
+ const track = options.trackCalls;
4071
+ if (track) {
4072
+ const call = guard.call;
4073
+ guard.call = (label, fn, opts) => {
4074
+ const pending = call(label, fn, opts);
4075
+ track(pending);
4076
+ return pending;
4077
+ };
4078
+ }
4079
+ owner = createOwner(void 0, {
4080
+ onError: (error, label) => guard.report(label, error),
4081
+ label: id,
4082
+ ...options.drainTimeoutMs !== void 0 ? { drainMs: options.drainTimeoutMs } : {},
4083
+ onDrain: ({ active, ms }) => logger.warn(`unloaded with ${active.length} call${active.length === 1 ? "" : "s"} in flight (${active.join(", ")}): its registrations are withdrawn, the rest is torn down once they finish (at most ${Math.round(ms / 1e3)}s)`, {
4084
+ active,
4085
+ boundMs: ms
4086
+ }),
4087
+ onDrainTimeout: ({ active, ms }) => logger.warn(`calls still running ${Math.round(ms / 1e3)}s after unload (${active.join(", ")}): tearing down now`, { active })
4088
+ });
4089
+ return {
4090
+ guard,
4091
+ owner
4092
+ };
4093
+ }
3905
4094
  /** Runs async work one at a time, in call order; a failure does not stop the next. */
3906
4095
  function createSerial() {
3907
4096
  let queue = Promise.resolve();
@@ -3929,7 +4118,7 @@ async function reloadInPlace(c, id, opts) {
3929
4118
  ...entry,
3930
4119
  enabled: r.entry.enabled
3931
4120
  };
3932
- await deactivateRecord(r, c.logger);
4121
+ await deactivateRecord(r, c.logger, c.withdrawn);
3933
4122
  c.removeUi(id);
3934
4123
  if (c.disposed() || c.records.get(id) !== r) return void 0;
3935
4124
  const known = c.order.filter((other) => other !== id).map((other) => c.records.get(other));
@@ -3959,7 +4148,7 @@ async function reloadInPlace(c, id, opts) {
3959
4148
  function defaultReimport() {
3960
4149
  return async (entry) => {
3961
4150
  if (entry.dir === void 0 || entry.source === "inline" || entry.source === "builtin") return entry;
3962
- const [{ loadExtensionFolder }, { runtimeEntryOf }] = await Promise.all([import("./discovery-DycXFxdA.js").then((n) => n.a), import("./loaded-entry-DTURJo_R.js").then((n) => n.r)]);
4151
+ const [{ loadExtensionFolder }, { runtimeEntryOf }] = await Promise.all([import("./discovery-CX7nbMCn.js").then((n) => n.a), import("./loaded-entry-C0vkCVNQ.js").then((n) => n.r)]);
3963
4152
  return {
3964
4153
  ...runtimeEntryOf(await loadExtensionFolder(entry.dir, { source: entry.source === "project" ? "project" : "user" }), entry.enabled),
3965
4154
  source: entry.source
@@ -3986,7 +4175,7 @@ function createExtensionRuntime(options) {
3986
4175
  const at = order.indexOf(id);
3987
4176
  return at === -1 ? Number.MAX_SAFE_INTEGER : at;
3988
4177
  };
3989
- const { outputs, services, hostListeners, refreshObservers, artifactKinds, pluginRecords, changed, statusChanged, subscribe, changeListeners, rpcBridge, release } = createShared(options, ports, baseLogger, records, order, rank);
4178
+ const { outputs, services, hostListeners, refreshObservers, artifactKinds, pluginRecords, changed, statusChanged, subscribe, changeListeners, rpcBridge, release, withdrawn } = createShared(options, ports, baseLogger, records, order, rank);
3990
4179
  const { ui } = outputs;
3991
4180
  const stalls = createStallMonitor({ onStall: (report) => {
3992
4181
  baseLogger.warn(`${report.label} blocked the event loop for ${Math.round(report.durationMs)}ms`, {
@@ -4014,30 +4203,10 @@ function createExtensionRuntime(options) {
4014
4203
  const activate = async (r) => {
4015
4204
  const def = r.definition;
4016
4205
  const logger = baseLogger.with({ extension: r.id });
4017
- const guard = createGuard({
4018
- extensionId: r.id,
4019
- logger,
4020
- stalls,
4021
- ...options.budget !== void 0 ? { budget: options.budget } : {},
4022
- ...options.callbackTimeoutMs !== void 0 ? { timeoutMs: options.callbackTimeoutMs } : {},
4023
- onTrip: (trip) => {
4024
- if (r.guard !== guard) return;
4025
- setStatus(r, "failed", `Disabled: ${trip.reason}`);
4026
- deactivateRecord(r, baseLogger);
4027
- }
4028
- });
4029
- const track = options.trackCalls;
4030
- if (track) {
4031
- const call = guard.call;
4032
- guard.call = (label, fn, opts) => {
4033
- const pending = call(label, fn, opts);
4034
- track(pending);
4035
- return pending;
4036
- };
4037
- }
4038
- const owner = createOwner(void 0, {
4039
- onError: (error, label) => guard.report(label, error),
4040
- label: r.id
4206
+ const { guard, owner } = createGuardedOwner(r.id, logger, stalls, options, (trip, tripped) => {
4207
+ if (r.guard !== tripped) return;
4208
+ setStatus(r, "failed", `Disabled: ${trip.reason}`);
4209
+ deactivateRecord(r, baseLogger, withdrawn);
4041
4210
  });
4042
4211
  const deps = {
4043
4212
  extensionId: r.id,
@@ -4048,6 +4217,7 @@ function createExtensionRuntime(options) {
4048
4217
  const settings = createSettingsDomain(deps, settingsPort, def.settings);
4049
4218
  const storage = createStorageDomain(deps, storagePort, {
4050
4219
  paths: options.paths,
4220
+ ...r.entry.dir !== void 0 ? { dir: r.entry.dir } : {},
4051
4221
  memory,
4052
4222
  ...ports.currentSessionId ? { currentSessionId: ports.currentSessionId } : {}
4053
4223
  });
@@ -4119,7 +4289,7 @@ function createExtensionRuntime(options) {
4119
4289
  if (!r) return;
4120
4290
  records.delete(id);
4121
4291
  order.splice(order.indexOf(id), 1);
4122
- await deactivateRecord(r, baseLogger);
4292
+ await deactivateRecord(r, baseLogger, withdrawn);
4123
4293
  ui.removeExtension(id);
4124
4294
  if (opts.forget) {
4125
4295
  memory.clear(id);
@@ -4137,6 +4307,7 @@ function createExtensionRuntime(options) {
4137
4307
  logger: baseLogger,
4138
4308
  reimport: options.reimport ?? defaultReimport(),
4139
4309
  disposed: () => disposed,
4310
+ withdrawn,
4140
4311
  setStatus,
4141
4312
  activate,
4142
4313
  unload: unloadNow,
@@ -4181,13 +4352,15 @@ function createExtensionRuntime(options) {
4181
4352
  dispose: async () => {
4182
4353
  if (disposed) return;
4183
4354
  disposed = true;
4355
+ withdrawn();
4184
4356
  services.facets.close();
4185
4357
  const all = [...order].reverse().map((id) => records.get(id));
4186
- await Promise.all(all.map((r) => deactivateRecord(r, baseLogger)));
4358
+ await Promise.all(all.map((r) => deactivateRecord(r, baseLogger, withdrawn)));
4187
4359
  for (const r of all) ui.removeExtension(r.id);
4188
4360
  records.clear();
4189
4361
  order.length = 0;
4190
4362
  changeListeners.clear();
4363
+ await Promise.all(all.map((r) => r.teardown));
4191
4364
  release();
4192
4365
  }
4193
4366
  };
@@ -4195,4 +4368,4 @@ function createExtensionRuntime(options) {
4195
4368
  //#endregion
4196
4369
  export { HOST_EVENT_NAMES as a, createRpcDomain as i, host_exports as n, isSyncInterceptor as o, createGuard as r, createExtensionRuntime as t };
4197
4370
 
4198
- //# sourceMappingURL=host-wO_6GW0y.js.map
4371
+ //# sourceMappingURL=host-C61ntFBC.js.map