@ai-agent-forge/agent-forge 0.86.7 → 0.87.0

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 (665) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/README.md +8 -9
  3. package/dist/artifacts/artifact-store.d.ts.map +1 -1
  4. package/dist/artifacts/artifact-store.js +9 -5
  5. package/dist/artifacts/artifact-store.js.map +1 -1
  6. package/dist/bundle/.build-manifest.json +410 -371
  7. package/dist/bundle/chunks/{chunk-A7GUOX2H.js → chunk-6ZKDNZHA.js} +5 -1
  8. package/dist/bundle/chunks/chunk-BFC2BDVJ.js +13 -0
  9. package/dist/bundle/chunks/chunk-MOHOLL3F.js +1456 -0
  10. package/dist/bundle/chunks/image-resize-worker.js +12 -1
  11. package/dist/bundle/chunks/{virtual-modules-3IZ4MYSQ.js → virtual-modules-KZ5DRH7Q.js} +1 -1
  12. package/dist/bundle/cli.js +1 -1
  13. package/dist/bundle/client.js +1 -1
  14. package/dist/bundle/index.js +2 -2
  15. package/dist/bundle/rpc-entry.js +1 -1
  16. package/dist/cli/args.d.ts.map +1 -1
  17. package/dist/cli/args.js +231 -185
  18. package/dist/cli/args.js.map +1 -1
  19. package/dist/cli/auth-check.d.ts.map +1 -1
  20. package/dist/cli/auth-check.js +3 -2
  21. package/dist/cli/auth-check.js.map +1 -1
  22. package/dist/cli/auth-command.d.ts.map +1 -1
  23. package/dist/cli/auth-command.js +15 -9
  24. package/dist/cli/auth-command.js.map +1 -1
  25. package/dist/cli/credential-print.d.ts.map +1 -1
  26. package/dist/cli/credential-print.js +14 -7
  27. package/dist/cli/credential-print.js.map +1 -1
  28. package/dist/cli/experimental/command.d.ts.map +1 -1
  29. package/dist/cli/experimental/command.js +6 -5
  30. package/dist/cli/experimental/command.js.map +1 -1
  31. package/dist/cli/list-models.d.ts.map +1 -1
  32. package/dist/cli/list-models.js +9 -8
  33. package/dist/cli/list-models.js.map +1 -1
  34. package/dist/cli/plugin-manager-controller.d.ts.map +1 -1
  35. package/dist/cli/plugin-manager-controller.js +2 -1
  36. package/dist/cli/plugin-manager-controller.js.map +1 -1
  37. package/dist/cli/serve.d.ts.map +1 -1
  38. package/dist/cli/serve.js +8 -5
  39. package/dist/cli/serve.js.map +1 -1
  40. package/dist/client/remote-session.d.ts.map +1 -1
  41. package/dist/client/remote-session.js +16 -9
  42. package/dist/client/remote-session.js.map +1 -1
  43. package/dist/config.d.ts.map +1 -1
  44. package/dist/config.js +2 -1
  45. package/dist/config.js.map +1 -1
  46. package/dist/core/agent-capability-contract.d.ts +0 -7
  47. package/dist/core/agent-capability-contract.d.ts.map +1 -1
  48. package/dist/core/agent-capability-contract.js +72 -68
  49. package/dist/core/agent-capability-contract.js.map +1 -1
  50. package/dist/core/agent-session-bash.d.ts.map +1 -1
  51. package/dist/core/agent-session-bash.js +5 -4
  52. package/dist/core/agent-session-bash.js.map +1 -1
  53. package/dist/core/agent-session-compaction.d.ts.map +1 -1
  54. package/dist/core/agent-session-compaction.js +28 -22
  55. package/dist/core/agent-session-compaction.js.map +1 -1
  56. package/dist/core/agent-session-context.d.ts.map +1 -1
  57. package/dist/core/agent-session-context.js +18 -13
  58. package/dist/core/agent-session-context.js.map +1 -1
  59. package/dist/core/agent-session-model.d.ts.map +1 -1
  60. package/dist/core/agent-session-model.js +2 -1
  61. package/dist/core/agent-session-model.js.map +1 -1
  62. package/dist/core/agent-session-retry.d.ts.map +1 -1
  63. package/dist/core/agent-session-retry.js +3 -2
  64. package/dist/core/agent-session-retry.js.map +1 -1
  65. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  66. package/dist/core/agent-session-runtime.js +7 -6
  67. package/dist/core/agent-session-runtime.js.map +1 -1
  68. package/dist/core/agent-session-services.d.ts +1 -1
  69. package/dist/core/agent-session-services.d.ts.map +1 -1
  70. package/dist/core/agent-session-services.js.map +1 -1
  71. package/dist/core/agent-session-tools.d.ts.map +1 -1
  72. package/dist/core/agent-session-tools.js +3 -2
  73. package/dist/core/agent-session-tools.js.map +1 -1
  74. package/dist/core/agent-session.d.ts +40 -2
  75. package/dist/core/agent-session.d.ts.map +1 -1
  76. package/dist/core/agent-session.js +142 -34
  77. package/dist/core/agent-session.js.map +1 -1
  78. package/dist/core/auth-guidance.d.ts.map +1 -1
  79. package/dist/core/auth-guidance.js +11 -5
  80. package/dist/core/auth-guidance.js.map +1 -1
  81. package/dist/core/auth-storage.d.ts.map +1 -1
  82. package/dist/core/auth-storage.js +9 -6
  83. package/dist/core/auth-storage.js.map +1 -1
  84. package/dist/core/compaction/compaction.d.ts.map +1 -1
  85. package/dist/core/compaction/compaction.js +2 -1
  86. package/dist/core/compaction/compaction.js.map +1 -1
  87. package/dist/core/embedded-sdk.d.ts.map +1 -1
  88. package/dist/core/embedded-sdk.js +10 -6
  89. package/dist/core/embedded-sdk.js.map +1 -1
  90. package/dist/core/export-html/index.d.ts.map +1 -1
  91. package/dist/core/export-html/index.js +9 -4
  92. package/dist/core/export-html/index.js.map +1 -1
  93. package/dist/core/extensions/agent-composition.d.ts.map +1 -1
  94. package/dist/core/extensions/agent-composition.js +26 -19
  95. package/dist/core/extensions/agent-composition.js.map +1 -1
  96. package/dist/core/extensions/bootstrap-agent-loop.d.ts.map +1 -1
  97. package/dist/core/extensions/bootstrap-agent-loop.js +3 -2
  98. package/dist/core/extensions/bootstrap-agent-loop.js.map +1 -1
  99. package/dist/core/extensions/bootstrap-lifecycle.d.ts.map +1 -1
  100. package/dist/core/extensions/bootstrap-lifecycle.js +20 -17
  101. package/dist/core/extensions/bootstrap-lifecycle.js.map +1 -1
  102. package/dist/core/extensions/bootstrap-overflow-policy.d.ts.map +1 -1
  103. package/dist/core/extensions/bootstrap-overflow-policy.js +2 -1
  104. package/dist/core/extensions/bootstrap-overflow-policy.js.map +1 -1
  105. package/dist/core/extensions/bootstrap-retry-policy.d.ts.map +1 -1
  106. package/dist/core/extensions/bootstrap-retry-policy.js +2 -1
  107. package/dist/core/extensions/bootstrap-retry-policy.js.map +1 -1
  108. package/dist/core/extensions/bootstrap-skills.d.ts.map +1 -1
  109. package/dist/core/extensions/bootstrap-skills.js +7 -6
  110. package/dist/core/extensions/bootstrap-skills.js.map +1 -1
  111. package/dist/core/extensions/bootstrap-tools.d.ts.map +1 -1
  112. package/dist/core/extensions/bootstrap-tools.js +2 -1
  113. package/dist/core/extensions/bootstrap-tools.js.map +1 -1
  114. package/dist/core/extensions/capability-plugin.d.ts.map +1 -1
  115. package/dist/core/extensions/capability-plugin.js +37 -13
  116. package/dist/core/extensions/capability-plugin.js.map +1 -1
  117. package/dist/core/extensions/capability-runtime-events.d.ts.map +1 -1
  118. package/dist/core/extensions/capability-runtime-events.js +17 -13
  119. package/dist/core/extensions/capability-runtime-events.js.map +1 -1
  120. package/dist/core/extensions/capability-runtime-guards.d.ts.map +1 -1
  121. package/dist/core/extensions/capability-runtime-guards.js +16 -15
  122. package/dist/core/extensions/capability-runtime-guards.js.map +1 -1
  123. package/dist/core/extensions/capability-runtime-manifest.d.ts.map +1 -1
  124. package/dist/core/extensions/capability-runtime-manifest.js +52 -30
  125. package/dist/core/extensions/capability-runtime-manifest.js.map +1 -1
  126. package/dist/core/extensions/capability-runtime-validation.d.ts.map +1 -1
  127. package/dist/core/extensions/capability-runtime-validation.js +66 -65
  128. package/dist/core/extensions/capability-runtime-validation.js.map +1 -1
  129. package/dist/core/extensions/capability-runtime.d.ts.map +1 -1
  130. package/dist/core/extensions/capability-runtime.js +147 -127
  131. package/dist/core/extensions/capability-runtime.js.map +1 -1
  132. package/dist/core/extensions/compaction-memory-failure-mode.d.ts.map +1 -1
  133. package/dist/core/extensions/compaction-memory-failure-mode.js +3 -2
  134. package/dist/core/extensions/compaction-memory-failure-mode.js.map +1 -1
  135. package/dist/core/extensions/context-strategy-binding.d.ts.map +1 -1
  136. package/dist/core/extensions/context-strategy-binding.js +7 -4
  137. package/dist/core/extensions/context-strategy-binding.js.map +1 -1
  138. package/dist/core/extensions/lifecycle-catalog.d.ts.map +1 -1
  139. package/dist/core/extensions/lifecycle-catalog.js +290 -279
  140. package/dist/core/extensions/lifecycle-catalog.js.map +1 -1
  141. package/dist/core/extensions/lifecycle-delivery-queue.d.ts.map +1 -1
  142. package/dist/core/extensions/lifecycle-delivery-queue.js +3 -2
  143. package/dist/core/extensions/lifecycle-delivery-queue.js.map +1 -1
  144. package/dist/core/facade/coding-agent-facade.d.ts +6 -0
  145. package/dist/core/facade/coding-agent-facade.d.ts.map +1 -1
  146. package/dist/core/facade/coding-agent-facade.js +2 -0
  147. package/dist/core/facade/coding-agent-facade.js.map +1 -1
  148. package/dist/core/http-dispatcher.d.ts.map +1 -1
  149. package/dist/core/http-dispatcher.js +2 -1
  150. package/dist/core/http-dispatcher.js.map +1 -1
  151. package/dist/core/i18n/index.d.ts +14 -0
  152. package/dist/core/i18n/index.d.ts.map +1 -0
  153. package/dist/core/i18n/index.js +67 -0
  154. package/dist/core/i18n/index.js.map +1 -0
  155. package/dist/core/i18n/locales/en/example.d.ts +7 -0
  156. package/dist/core/i18n/locales/en/example.d.ts.map +1 -0
  157. package/dist/core/i18n/locales/en/example.js +7 -0
  158. package/dist/core/i18n/locales/en/example.js.map +1 -0
  159. package/dist/core/i18n/locales/zh-cn/cli.d.ts +8 -0
  160. package/dist/core/i18n/locales/zh-cn/cli.d.ts.map +1 -0
  161. package/dist/core/i18n/locales/zh-cn/cli.js +227 -0
  162. package/dist/core/i18n/locales/zh-cn/cli.js.map +1 -0
  163. package/dist/core/i18n/locales/zh-cn/common.d.ts +6 -0
  164. package/dist/core/i18n/locales/zh-cn/common.d.ts.map +1 -0
  165. package/dist/core/i18n/locales/zh-cn/common.js +6 -0
  166. package/dist/core/i18n/locales/zh-cn/common.js.map +1 -0
  167. package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts +13 -0
  168. package/dist/core/i18n/locales/zh-cn/core-contract-core.d.ts.map +1 -0
  169. package/dist/core/i18n/locales/zh-cn/core-contract-core.js +173 -0
  170. package/dist/core/i18n/locales/zh-cn/core-contract-core.js.map +1 -0
  171. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts +12 -0
  172. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.d.ts.map +1 -0
  173. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js +582 -0
  174. package/dist/core/i18n/locales/zh-cn/core-contract-extensions.js.map +1 -0
  175. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts +9 -0
  176. package/dist/core/i18n/locales/zh-cn/core-contract-final.d.ts.map +1 -0
  177. package/dist/core/i18n/locales/zh-cn/core-contract-final.js +55 -0
  178. package/dist/core/i18n/locales/zh-cn/core-contract-final.js.map +1 -0
  179. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts +11 -0
  180. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.d.ts.map +1 -0
  181. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js +455 -0
  182. package/dist/core/i18n/locales/zh-cn/core-contract-plugins.js.map +1 -0
  183. package/dist/core/i18n/locales/zh-cn/core-errors.d.ts +9 -0
  184. package/dist/core/i18n/locales/zh-cn/core-errors.d.ts.map +1 -0
  185. package/dist/core/i18n/locales/zh-cn/core-errors.js +191 -0
  186. package/dist/core/i18n/locales/zh-cn/core-errors.js.map +1 -0
  187. package/dist/core/i18n/locales/zh-cn/example.d.ts +7 -0
  188. package/dist/core/i18n/locales/zh-cn/example.d.ts.map +1 -0
  189. package/dist/core/i18n/locales/zh-cn/example.js +10 -0
  190. package/dist/core/i18n/locales/zh-cn/example.js.map +1 -0
  191. package/dist/core/i18n/locales/zh-cn/index.d.ts +2 -0
  192. package/dist/core/i18n/locales/zh-cn/index.d.ts.map +1 -0
  193. package/dist/core/i18n/locales/zh-cn/index.js +41 -0
  194. package/dist/core/i18n/locales/zh-cn/index.js.map +1 -0
  195. package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts +10 -0
  196. package/dist/core/i18n/locales/zh-cn/interactive-mode.d.ts.map +1 -0
  197. package/dist/core/i18n/locales/zh-cn/interactive-mode.js +265 -0
  198. package/dist/core/i18n/locales/zh-cn/interactive-mode.js.map +1 -0
  199. package/dist/core/i18n/locales/zh-cn/keybindings.d.ts +11 -0
  200. package/dist/core/i18n/locales/zh-cn/keybindings.d.ts.map +1 -0
  201. package/dist/core/i18n/locales/zh-cn/keybindings.js +67 -0
  202. package/dist/core/i18n/locales/zh-cn/keybindings.js.map +1 -0
  203. package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts +7 -0
  204. package/dist/core/i18n/locales/zh-cn/slash-commands.d.ts.map +1 -0
  205. package/dist/core/i18n/locales/zh-cn/slash-commands.js +39 -0
  206. package/dist/core/i18n/locales/zh-cn/slash-commands.js.map +1 -0
  207. package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts +10 -0
  208. package/dist/core/i18n/locales/zh-cn/tui-builtin.d.ts.map +1 -0
  209. package/dist/core/i18n/locales/zh-cn/tui-builtin.js +15 -0
  210. package/dist/core/i18n/locales/zh-cn/tui-builtin.js.map +1 -0
  211. package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts +13 -0
  212. package/dist/core/i18n/locales/zh-cn/tui-components-misc.d.ts.map +1 -0
  213. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js +102 -0
  214. package/dist/core/i18n/locales/zh-cn/tui-components-misc.js.map +1 -0
  215. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts +12 -0
  216. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.d.ts.map +1 -0
  217. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js +288 -0
  218. package/dist/core/i18n/locales/zh-cn/tui-components-selectors.js.map +1 -0
  219. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts +9 -0
  220. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.d.ts.map +1 -0
  221. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js +79 -0
  222. package/dist/core/i18n/locales/zh-cn/tui-interactive-misc.js.map +1 -0
  223. package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts +8 -0
  224. package/dist/core/i18n/locales/zh-cn/tui-self-owned.d.ts.map +1 -0
  225. package/dist/core/i18n/locales/zh-cn/tui-self-owned.js +72 -0
  226. package/dist/core/i18n/locales/zh-cn/tui-self-owned.js.map +1 -0
  227. package/dist/core/keybindings.d.ts +15 -0
  228. package/dist/core/keybindings.d.ts.map +1 -1
  229. package/dist/core/keybindings.js +18 -0
  230. package/dist/core/keybindings.js.map +1 -1
  231. package/dist/core/logger.d.ts.map +1 -1
  232. package/dist/core/logger.js +5 -1
  233. package/dist/core/logger.js.map +1 -1
  234. package/dist/core/model-registry.d.ts.map +1 -1
  235. package/dist/core/model-registry.js +2 -1
  236. package/dist/core/model-registry.js.map +1 -1
  237. package/dist/core/model-runtime.d.ts.map +1 -1
  238. package/dist/core/model-runtime.js +8 -4
  239. package/dist/core/model-runtime.js.map +1 -1
  240. package/dist/core/package-install-host.d.ts.map +1 -1
  241. package/dist/core/package-install-host.js +4 -3
  242. package/dist/core/package-install-host.js.map +1 -1
  243. package/dist/core/package-manager.d.ts.map +1 -1
  244. package/dist/core/package-manager.js +15 -10
  245. package/dist/core/package-manager.js.map +1 -1
  246. package/dist/core/package-resource-collection.d.ts.map +1 -1
  247. package/dist/core/package-resource-collection.js +2 -1
  248. package/dist/core/package-resource-collection.js.map +1 -1
  249. package/dist/core/package-source.d.ts.map +1 -1
  250. package/dist/core/package-source.js +3 -2
  251. package/dist/core/package-source.js.map +1 -1
  252. package/dist/core/provider-composer.d.ts.map +1 -1
  253. package/dist/core/provider-composer.js +22 -13
  254. package/dist/core/provider-composer.js.map +1 -1
  255. package/dist/core/remote-catalog-provider.d.ts.map +1 -1
  256. package/dist/core/remote-catalog-provider.js +6 -2
  257. package/dist/core/remote-catalog-provider.js.map +1 -1
  258. package/dist/core/resolve-config-value.d.ts.map +1 -1
  259. package/dist/core/resolve-config-value.js +15 -5
  260. package/dist/core/resolve-config-value.js.map +1 -1
  261. package/dist/core/sdk.d.ts +19 -5
  262. package/dist/core/sdk.d.ts.map +1 -1
  263. package/dist/core/sdk.js +74 -54
  264. package/dist/core/sdk.js.map +1 -1
  265. package/dist/core/session-cwd.d.ts.map +1 -1
  266. package/dist/core/session-cwd.js +5 -2
  267. package/dist/core/session-cwd.js.map +1 -1
  268. package/dist/core/session-export.d.ts.map +1 -1
  269. package/dist/core/session-export.js +2 -1
  270. package/dist/core/session-export.js.map +1 -1
  271. package/dist/core/session-manager.d.ts.map +1 -1
  272. package/dist/core/session-manager.js +39 -29
  273. package/dist/core/session-manager.js.map +1 -1
  274. package/dist/core/session-storage.d.ts.map +1 -1
  275. package/dist/core/session-storage.js +3 -3
  276. package/dist/core/session-storage.js.map +1 -1
  277. package/dist/core/settings-manager.d.ts +11 -0
  278. package/dist/core/settings-manager.d.ts.map +1 -1
  279. package/dist/core/settings-manager.js +27 -5
  280. package/dist/core/settings-manager.js.map +1 -1
  281. package/dist/core/slash-commands.d.ts.map +1 -1
  282. package/dist/core/slash-commands.js +53 -32
  283. package/dist/core/slash-commands.js.map +1 -1
  284. package/dist/core/system-prompt.d.ts.map +1 -1
  285. package/dist/core/system-prompt.js +25 -2
  286. package/dist/core/system-prompt.js.map +1 -1
  287. package/dist/core/tools/bash.d.ts.map +1 -1
  288. package/dist/core/tools/bash.js +11 -7
  289. package/dist/core/tools/bash.js.map +1 -1
  290. package/dist/core/tools/edit-diff.d.ts.map +1 -1
  291. package/dist/core/tools/edit-diff.js +9 -4
  292. package/dist/core/tools/edit-diff.js.map +1 -1
  293. package/dist/core/tools/edit.d.ts.map +1 -1
  294. package/dist/core/tools/edit.js +4 -3
  295. package/dist/core/tools/edit.js.map +1 -1
  296. package/dist/core/tools/index.d.ts.map +1 -1
  297. package/dist/core/tools/index.js +3 -2
  298. package/dist/core/tools/index.js.map +1 -1
  299. package/dist/core/tools/output-accumulator.d.ts.map +1 -1
  300. package/dist/core/tools/output-accumulator.js +2 -1
  301. package/dist/core/tools/output-accumulator.js.map +1 -1
  302. package/dist/core/tools/read.d.ts.map +1 -1
  303. package/dist/core/tools/read.js +6 -2
  304. package/dist/core/tools/read.js.map +1 -1
  305. package/dist/core/tools/write.d.ts.map +1 -1
  306. package/dist/core/tools/write.js +2 -1
  307. package/dist/core/tools/write.js.map +1 -1
  308. package/dist/durable/durable-service.d.ts.map +1 -1
  309. package/dist/durable/durable-service.js +25 -18
  310. package/dist/durable/durable-service.js.map +1 -1
  311. package/dist/host/checkpoint-commit.d.ts.map +1 -1
  312. package/dist/host/checkpoint-commit.js +2 -1
  313. package/dist/host/checkpoint-commit.js.map +1 -1
  314. package/dist/host/manual-compaction.d.ts.map +1 -1
  315. package/dist/host/manual-compaction.js +2 -1
  316. package/dist/host/manual-compaction.js.map +1 -1
  317. package/dist/host/output-projection.d.ts +0 -13
  318. package/dist/host/output-projection.d.ts.map +1 -1
  319. package/dist/host/output-projection.js +16 -2
  320. package/dist/host/output-projection.js.map +1 -1
  321. package/dist/host/summary-retry.d.ts.map +1 -1
  322. package/dist/host/summary-retry.js +3 -2
  323. package/dist/host/summary-retry.js.map +1 -1
  324. package/dist/main.d.ts.map +1 -1
  325. package/dist/main.js +94 -58
  326. package/dist/main.js.map +1 -1
  327. package/dist/modes/interactive/components/agents-view.d.ts.map +1 -1
  328. package/dist/modes/interactive/components/agents-view.js +18 -15
  329. package/dist/modes/interactive/components/agents-view.js.map +1 -1
  330. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  331. package/dist/modes/interactive/components/assistant-message.js +6 -5
  332. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  333. package/dist/modes/interactive/components/bash-execution.d.ts.map +1 -1
  334. package/dist/modes/interactive/components/bash-execution.js +12 -7
  335. package/dist/modes/interactive/components/bash-execution.js.map +1 -1
  336. package/dist/modes/interactive/components/bordered-loader.d.ts.map +1 -1
  337. package/dist/modes/interactive/components/bordered-loader.js +2 -1
  338. package/dist/modes/interactive/components/bordered-loader.js.map +1 -1
  339. package/dist/modes/interactive/components/branch-summary-message.d.ts.map +1 -1
  340. package/dist/modes/interactive/components/branch-summary-message.js +6 -5
  341. package/dist/modes/interactive/components/branch-summary-message.js.map +1 -1
  342. package/dist/modes/interactive/components/compaction-summary-message.d.ts.map +1 -1
  343. package/dist/modes/interactive/components/compaction-summary-message.js +9 -5
  344. package/dist/modes/interactive/components/compaction-summary-message.js.map +1 -1
  345. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  346. package/dist/modes/interactive/components/config-selector.js +18 -15
  347. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  348. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  349. package/dist/modes/interactive/components/custom-entry.js +2 -1
  350. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  351. package/dist/modes/interactive/components/dialog-editor.d.ts.map +1 -1
  352. package/dist/modes/interactive/components/dialog-editor.js +5 -4
  353. package/dist/modes/interactive/components/dialog-editor.js.map +1 -1
  354. package/dist/modes/interactive/components/dialog-input.d.ts.map +1 -1
  355. package/dist/modes/interactive/components/dialog-input.js +2 -1
  356. package/dist/modes/interactive/components/dialog-input.js.map +1 -1
  357. package/dist/modes/interactive/components/dialog-selector.d.ts.map +1 -1
  358. package/dist/modes/interactive/components/dialog-selector.js +4 -3
  359. package/dist/modes/interactive/components/dialog-selector.js.map +1 -1
  360. package/dist/modes/interactive/components/first-time-setup.d.ts.map +1 -1
  361. package/dist/modes/interactive/components/first-time-setup.js +11 -10
  362. package/dist/modes/interactive/components/first-time-setup.js.map +1 -1
  363. package/dist/modes/interactive/components/footer.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/footer.js +7 -4
  365. package/dist/modes/interactive/components/footer.js.map +1 -1
  366. package/dist/modes/interactive/components/index.d.ts +1 -0
  367. package/dist/modes/interactive/components/index.d.ts.map +1 -1
  368. package/dist/modes/interactive/components/index.js +1 -0
  369. package/dist/modes/interactive/components/index.js.map +1 -1
  370. package/dist/modes/interactive/components/keybinding-hints.d.ts.map +1 -1
  371. package/dist/modes/interactive/components/keybinding-hints.js +3 -2
  372. package/dist/modes/interactive/components/keybinding-hints.js.map +1 -1
  373. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  374. package/dist/modes/interactive/components/login-dialog.js +12 -11
  375. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  376. package/dist/modes/interactive/components/mermaid.d.ts.map +1 -1
  377. package/dist/modes/interactive/components/mermaid.js +6 -2
  378. package/dist/modes/interactive/components/mermaid.js.map +1 -1
  379. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  380. package/dist/modes/interactive/components/model-selector.js +28 -16
  381. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  382. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  383. package/dist/modes/interactive/components/oauth-selector.js +10 -9
  384. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  385. package/dist/modes/interactive/components/plugin-manager-entry.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/plugin-manager-entry.js +22 -13
  387. package/dist/modes/interactive/components/plugin-manager-entry.js.map +1 -1
  388. package/dist/modes/interactive/components/plugin-selection-entry.d.ts.map +1 -1
  389. package/dist/modes/interactive/components/plugin-selection-entry.js +27 -12
  390. package/dist/modes/interactive/components/plugin-selection-entry.js.map +1 -1
  391. package/dist/modes/interactive/components/queue-manager-selector.d.ts +60 -0
  392. package/dist/modes/interactive/components/queue-manager-selector.d.ts.map +1 -0
  393. package/dist/modes/interactive/components/queue-manager-selector.js +166 -0
  394. package/dist/modes/interactive/components/queue-manager-selector.js.map +1 -0
  395. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  396. package/dist/modes/interactive/components/scoped-models-selector.js +16 -14
  397. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  398. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  399. package/dist/modes/interactive/components/session-selector.js +43 -31
  400. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  401. package/dist/modes/interactive/components/settings-selector.d.ts +2 -0
  402. package/dist/modes/interactive/components/settings-selector.d.ts.map +1 -1
  403. package/dist/modes/interactive/components/settings-selector.js +113 -96
  404. package/dist/modes/interactive/components/settings-selector.js.map +1 -1
  405. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  406. package/dist/modes/interactive/components/settings-submenu.js +5 -4
  407. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  408. package/dist/modes/interactive/components/show-images-selector.d.ts.map +1 -1
  409. package/dist/modes/interactive/components/show-images-selector.js +3 -2
  410. package/dist/modes/interactive/components/show-images-selector.js.map +1 -1
  411. package/dist/modes/interactive/components/skill-invocation-message.d.ts.map +1 -1
  412. package/dist/modes/interactive/components/skill-invocation-message.js +4 -3
  413. package/dist/modes/interactive/components/skill-invocation-message.js.map +1 -1
  414. package/dist/modes/interactive/components/status-indicator.d.ts.map +1 -1
  415. package/dist/modes/interactive/components/status-indicator.js +14 -5
  416. package/dist/modes/interactive/components/status-indicator.js.map +1 -1
  417. package/dist/modes/interactive/components/theme-selector.d.ts.map +1 -1
  418. package/dist/modes/interactive/components/theme-selector.js +2 -1
  419. package/dist/modes/interactive/components/theme-selector.js.map +1 -1
  420. package/dist/modes/interactive/components/thinking-selector.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/thinking-selector.js +11 -4
  422. package/dist/modes/interactive/components/thinking-selector.js.map +1 -1
  423. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  424. package/dist/modes/interactive/components/tool-execution.js +8 -3
  425. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  426. package/dist/modes/interactive/components/tree-list.d.ts.map +1 -1
  427. package/dist/modes/interactive/components/tree-list.js +7 -6
  428. package/dist/modes/interactive/components/tree-list.js.map +1 -1
  429. package/dist/modes/interactive/components/tree-render.d.ts.map +1 -1
  430. package/dist/modes/interactive/components/tree-render.js +28 -23
  431. package/dist/modes/interactive/components/tree-render.js.map +1 -1
  432. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  433. package/dist/modes/interactive/components/tree-selector.js +9 -7
  434. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  435. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  436. package/dist/modes/interactive/components/user-message-selector.js +5 -4
  437. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  438. package/dist/modes/interactive/components/workflow-view.d.ts.map +1 -1
  439. package/dist/modes/interactive/components/workflow-view.js +36 -21
  440. package/dist/modes/interactive/components/workflow-view.js.map +1 -1
  441. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  442. package/dist/modes/interactive/external-editor.js +2 -1
  443. package/dist/modes/interactive/external-editor.js.map +1 -1
  444. package/dist/modes/interactive/interactive-auth.d.ts.map +1 -1
  445. package/dist/modes/interactive/interactive-auth.js +71 -40
  446. package/dist/modes/interactive/interactive-auth.js.map +1 -1
  447. package/dist/modes/interactive/interactive-commands.d.ts +1 -0
  448. package/dist/modes/interactive/interactive-commands.d.ts.map +1 -1
  449. package/dist/modes/interactive/interactive-commands.js +3 -0
  450. package/dist/modes/interactive/interactive-commands.js.map +1 -1
  451. package/dist/modes/interactive/interactive-dialog-ui.d.ts.map +1 -1
  452. package/dist/modes/interactive/interactive-dialog-ui.js +5 -5
  453. package/dist/modes/interactive/interactive-dialog-ui.js.map +1 -1
  454. package/dist/modes/interactive/interactive-format.d.ts.map +1 -1
  455. package/dist/modes/interactive/interactive-format.js +34 -18
  456. package/dist/modes/interactive/interactive-format.js.map +1 -1
  457. package/dist/modes/interactive/interactive-helpers.d.ts.map +1 -1
  458. package/dist/modes/interactive/interactive-helpers.js +7 -2
  459. package/dist/modes/interactive/interactive-helpers.js.map +1 -1
  460. package/dist/modes/interactive/interactive-mode.d.ts +4 -1
  461. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  462. package/dist/modes/interactive/interactive-mode.js +327 -243
  463. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  464. package/dist/modes/interactive/interactive-selectors.d.ts +9 -0
  465. package/dist/modes/interactive/interactive-selectors.d.ts.map +1 -1
  466. package/dist/modes/interactive/interactive-selectors.js +79 -25
  467. package/dist/modes/interactive/interactive-selectors.js.map +1 -1
  468. package/dist/modes/interactive/theme/theme-controller.d.ts.map +1 -1
  469. package/dist/modes/interactive/theme/theme-controller.js +5 -1
  470. package/dist/modes/interactive/theme/theme-controller.js.map +1 -1
  471. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  472. package/dist/modes/interactive/theme/theme.js +26 -23
  473. package/dist/modes/interactive/theme/theme.js.map +1 -1
  474. package/dist/modes/json-event.d.ts.map +1 -1
  475. package/dist/modes/json-event.js +3 -2
  476. package/dist/modes/json-event.js.map +1 -1
  477. package/dist/modes/print-mode.d.ts.map +1 -1
  478. package/dist/modes/print-mode.js +3 -2
  479. package/dist/modes/print-mode.js.map +1 -1
  480. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  481. package/dist/modes/rpc/rpc-client.js +3 -2
  482. package/dist/modes/rpc/rpc-client.js.map +1 -1
  483. package/dist/package-manager-cli.d.ts.map +1 -1
  484. package/dist/package-manager-cli.js +28 -13
  485. package/dist/package-manager-cli.js.map +1 -1
  486. package/dist/plugins/ecosystem/catalog.d.ts.map +1 -1
  487. package/dist/plugins/ecosystem/catalog.js +3 -2
  488. package/dist/plugins/ecosystem/catalog.js.map +1 -1
  489. package/dist/plugins/ecosystem/cli.d.ts.map +1 -1
  490. package/dist/plugins/ecosystem/cli.js +2 -1
  491. package/dist/plugins/ecosystem/cli.js.map +1 -1
  492. package/dist/plugins/ecosystem/default-plugin-market.d.ts.map +1 -1
  493. package/dist/plugins/ecosystem/default-plugin-market.js +3 -2
  494. package/dist/plugins/ecosystem/default-plugin-market.js.map +1 -1
  495. package/dist/plugins/ecosystem/distribution.d.ts.map +1 -1
  496. package/dist/plugins/ecosystem/distribution.js +2 -1
  497. package/dist/plugins/ecosystem/distribution.js.map +1 -1
  498. package/dist/plugins/ecosystem/installer.d.ts.map +1 -1
  499. package/dist/plugins/ecosystem/installer.js +3 -2
  500. package/dist/plugins/ecosystem/installer.js.map +1 -1
  501. package/dist/plugins/ecosystem/node-disk-registry-source.d.ts.map +1 -1
  502. package/dist/plugins/ecosystem/node-disk-registry-source.js +20 -17
  503. package/dist/plugins/ecosystem/node-disk-registry-source.js.map +1 -1
  504. package/dist/plugins/ecosystem/node-distribution-host.d.ts.map +1 -1
  505. package/dist/plugins/ecosystem/node-distribution-host.js +35 -34
  506. package/dist/plugins/ecosystem/node-distribution-host.js.map +1 -1
  507. package/dist/plugins/ecosystem/node-npm-registry-source.d.ts.map +1 -1
  508. package/dist/plugins/ecosystem/node-npm-registry-source.js +35 -34
  509. package/dist/plugins/ecosystem/node-npm-registry-source.js.map +1 -1
  510. package/dist/plugins/ecosystem/node-package-install-host.d.ts.map +1 -1
  511. package/dist/plugins/ecosystem/node-package-install-host.js +9 -8
  512. package/dist/plugins/ecosystem/node-package-install-host.js.map +1 -1
  513. package/dist/plugins/ecosystem/node-package-install-persistence.d.ts.map +1 -1
  514. package/dist/plugins/ecosystem/node-package-install-persistence.js +4 -3
  515. package/dist/plugins/ecosystem/node-package-install-persistence.js.map +1 -1
  516. package/dist/plugins/ecosystem/node-plugin-bootstrap.d.ts.map +1 -1
  517. package/dist/plugins/ecosystem/node-plugin-bootstrap.js +21 -5
  518. package/dist/plugins/ecosystem/node-plugin-bootstrap.js.map +1 -1
  519. package/dist/plugins/ecosystem/node-plugin-trust-root.d.ts.map +1 -1
  520. package/dist/plugins/ecosystem/node-plugin-trust-root.js +10 -9
  521. package/dist/plugins/ecosystem/node-plugin-trust-root.js.map +1 -1
  522. package/dist/plugins/ecosystem/node-registry-source.d.ts.map +1 -1
  523. package/dist/plugins/ecosystem/node-registry-source.js +31 -30
  524. package/dist/plugins/ecosystem/node-registry-source.js.map +1 -1
  525. package/dist/plugins/ecosystem/node-release-package-source.d.ts.map +1 -1
  526. package/dist/plugins/ecosystem/node-release-package-source.js +30 -29
  527. package/dist/plugins/ecosystem/node-release-package-source.js.map +1 -1
  528. package/dist/plugins/ecosystem/node-tar-writer.d.ts.map +1 -1
  529. package/dist/plugins/ecosystem/node-tar-writer.js +11 -10
  530. package/dist/plugins/ecosystem/node-tar-writer.js.map +1 -1
  531. package/dist/plugins/ecosystem/node-url-package-source.d.ts.map +1 -1
  532. package/dist/plugins/ecosystem/node-url-package-source.js +21 -20
  533. package/dist/plugins/ecosystem/node-url-package-source.js.map +1 -1
  534. package/dist/plugins/ecosystem/plugin-acquisition.d.ts.map +1 -1
  535. package/dist/plugins/ecosystem/plugin-acquisition.js +3 -2
  536. package/dist/plugins/ecosystem/plugin-acquisition.js.map +1 -1
  537. package/dist/plugins/ecosystem/registry-cli-adapter.d.ts.map +1 -1
  538. package/dist/plugins/ecosystem/registry-cli-adapter.js +2 -1
  539. package/dist/plugins/ecosystem/registry-cli-adapter.js.map +1 -1
  540. package/dist/plugins/ecosystem/registry.d.ts.map +1 -1
  541. package/dist/plugins/ecosystem/registry.js +35 -32
  542. package/dist/plugins/ecosystem/registry.js.map +1 -1
  543. package/dist/plugins/ecosystem/resolver.d.ts.map +1 -1
  544. package/dist/plugins/ecosystem/resolver.js +3 -2
  545. package/dist/plugins/ecosystem/resolver.js.map +1 -1
  546. package/dist/plugins/ecosystem/selection-store.d.ts.map +1 -1
  547. package/dist/plugins/ecosystem/selection-store.js +11 -10
  548. package/dist/plugins/ecosystem/selection-store.js.map +1 -1
  549. package/dist/plugins/ecosystem/selection.d.ts.map +1 -1
  550. package/dist/plugins/ecosystem/selection.js +8 -7
  551. package/dist/plugins/ecosystem/selection.js.map +1 -1
  552. package/dist/plugins/ecosystem/state.d.ts.map +1 -1
  553. package/dist/plugins/ecosystem/state.js +24 -23
  554. package/dist/plugins/ecosystem/state.js.map +1 -1
  555. package/dist/plugins/ecosystem/updates.d.ts.map +1 -1
  556. package/dist/plugins/ecosystem/updates.js +5 -4
  557. package/dist/plugins/ecosystem/updates.js.map +1 -1
  558. package/dist/plugins/mcp-http.d.ts +0 -17
  559. package/dist/plugins/mcp-http.d.ts.map +1 -1
  560. package/dist/plugins/mcp-http.js +30 -7
  561. package/dist/plugins/mcp-http.js.map +1 -1
  562. package/dist/plugins/plugin-supervisor.d.ts.map +1 -1
  563. package/dist/plugins/plugin-supervisor.js +19 -1
  564. package/dist/plugins/plugin-supervisor.js.map +1 -1
  565. package/dist/profile/first-roles.d.ts.map +1 -1
  566. package/dist/profile/first-roles.js +10 -1
  567. package/dist/profile/first-roles.js.map +1 -1
  568. package/dist/profile/goal-plugin.d.ts.map +1 -1
  569. package/dist/profile/goal-plugin.js +24 -5
  570. package/dist/profile/goal-plugin.js.map +1 -1
  571. package/dist/profile/identity.d.ts.map +1 -1
  572. package/dist/profile/identity.js +7 -6
  573. package/dist/profile/identity.js.map +1 -1
  574. package/dist/profile/lock.d.ts.map +1 -1
  575. package/dist/profile/lock.js +15 -1
  576. package/dist/profile/lock.js.map +1 -1
  577. package/dist/profile/plan-plugin.d.ts.map +1 -1
  578. package/dist/profile/plan-plugin.js +26 -13
  579. package/dist/profile/plan-plugin.js.map +1 -1
  580. package/dist/profile/plugin-profiles.d.ts.map +1 -1
  581. package/dist/profile/plugin-profiles.js +2 -1
  582. package/dist/profile/plugin-profiles.js.map +1 -1
  583. package/dist/profile/policy-manifest.d.ts.map +1 -1
  584. package/dist/profile/policy-manifest.js +5 -4
  585. package/dist/profile/policy-manifest.js.map +1 -1
  586. package/dist/profile/profile-registry.d.ts +0 -12
  587. package/dist/profile/profile-registry.d.ts.map +1 -1
  588. package/dist/profile/profile-registry.js +14 -1
  589. package/dist/profile/profile-registry.js.map +1 -1
  590. package/dist/profile/role-catalog.d.ts +0 -1
  591. package/dist/profile/role-catalog.d.ts.map +1 -1
  592. package/dist/profile/role-catalog.js +17 -15
  593. package/dist/profile/role-catalog.js.map +1 -1
  594. package/dist/profile/role-orchestrator.d.ts.map +1 -1
  595. package/dist/profile/role-orchestrator.js +8 -7
  596. package/dist/profile/role-orchestrator.js.map +1 -1
  597. package/dist/profile/role-runner.d.ts.map +1 -1
  598. package/dist/profile/role-runner.js +3 -2
  599. package/dist/profile/role-runner.js.map +1 -1
  600. package/dist/profile/root-facade.d.ts.map +1 -1
  601. package/dist/profile/root-facade.js +2 -1
  602. package/dist/profile/root-facade.js.map +1 -1
  603. package/dist/profile/skill-discovery-wiring.d.ts.map +1 -1
  604. package/dist/profile/skill-discovery-wiring.js +7 -2
  605. package/dist/profile/skill-discovery-wiring.js.map +1 -1
  606. package/dist/profile/state-store.d.ts.map +1 -1
  607. package/dist/profile/state-store.js +13 -9
  608. package/dist/profile/state-store.js.map +1 -1
  609. package/dist/profile/todo-plugin.d.ts.map +1 -1
  610. package/dist/profile/todo-plugin.js +9 -4
  611. package/dist/profile/todo-plugin.js.map +1 -1
  612. package/dist/profiles/builtin-suites.d.ts +13 -6
  613. package/dist/profiles/builtin-suites.d.ts.map +1 -1
  614. package/dist/profiles/builtin-suites.js +15 -6
  615. package/dist/profiles/builtin-suites.js.map +1 -1
  616. package/dist/profiles/suite-loader.d.ts +25 -1
  617. package/dist/profiles/suite-loader.d.ts.map +1 -1
  618. package/dist/profiles/suite-loader.js +34 -9
  619. package/dist/profiles/suite-loader.js.map +1 -1
  620. package/dist/remote/server-entry.d.ts.map +1 -1
  621. package/dist/remote/server-entry.js +3 -2
  622. package/dist/remote/server-entry.js.map +1 -1
  623. package/dist/remote/session-source.d.ts.map +1 -1
  624. package/dist/remote/session-source.js +8 -4
  625. package/dist/remote/session-source.js.map +1 -1
  626. package/dist/share/session-share.d.ts.map +1 -1
  627. package/dist/share/session-share.js +14 -2
  628. package/dist/share/session-share.js.map +1 -1
  629. package/dist/testing/plugin-testkit.d.ts.map +1 -1
  630. package/dist/testing/plugin-testkit.js +4 -3
  631. package/dist/testing/plugin-testkit.js.map +1 -1
  632. package/dist/testing/runtime-delivery-queue.d.ts.map +1 -1
  633. package/dist/testing/runtime-delivery-queue.js +2 -1
  634. package/dist/testing/runtime-delivery-queue.js.map +1 -1
  635. package/dist/testing/session-plugin-testkit.d.ts.map +1 -1
  636. package/dist/testing/session-plugin-testkit.js +10 -7
  637. package/dist/testing/session-plugin-testkit.js.map +1 -1
  638. package/dist/utils/ansi.d.ts.map +1 -1
  639. package/dist/utils/ansi.js +2 -1
  640. package/dist/utils/ansi.js.map +1 -1
  641. package/dist/utils/clipboard.d.ts.map +1 -1
  642. package/dist/utils/clipboard.js +7 -6
  643. package/dist/utils/clipboard.js.map +1 -1
  644. package/dist/utils/image-resize-worker.d.ts.map +1 -1
  645. package/dist/utils/image-resize-worker.js +3 -2
  646. package/dist/utils/image-resize-worker.js.map +1 -1
  647. package/dist/utils/shell.d.ts.map +1 -1
  648. package/dist/utils/shell.js +9 -8
  649. package/dist/utils/shell.js.map +1 -1
  650. package/dist/utils/tools-manager.d.ts.map +1 -1
  651. package/dist/utils/tools-manager.js +23 -13
  652. package/dist/utils/tools-manager.js.map +1 -1
  653. package/dist/utils/version-check.d.ts.map +1 -1
  654. package/dist/utils/version-check.js +5 -1
  655. package/dist/utils/version-check.js.map +1 -1
  656. package/docs/keybindings.md +3 -0
  657. package/docs/quickstart.md +1 -1
  658. package/docs/settings.md +1 -0
  659. package/docs/terminal-setup.md +2 -3
  660. package/docs/usage.md +6 -5
  661. package/examples/extensions/with-deps/package-lock.json +2 -2
  662. package/examples/extensions/with-deps/package.json +1 -1
  663. package/examples/extensions/with-deps/plugin.json +1 -1
  664. package/package.json +1 -1
  665. package/dist/bundle/chunks/chunk-EALJ5DDX.js +0 -1452
@@ -1 +1 @@
1
- {"version":3,"file":"capability-runtime-events.js","sourceRoot":"","sources":["../../../src/core/extensions/capability-runtime-events.ts"],"names":[],"mappings":"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","sourcesContent":["import { isPluginConfigValue } from \"./capability-runtime-manifest.ts\";\nimport { cancellationError } from \"./capability-runtime-operation.ts\";\nimport { detachedSnapshot, lifecycleErrorSnapshot } from \"./capability-runtime-snapshot.ts\";\nimport {\n\tcreateRevokedCapabilityError,\n\tinvokeRegisteredCapabilityWithSignal,\n\tisRevokedCapabilityError,\n} from \"./capability-runtime-store.ts\";\nimport type {\n\tCapabilityRuntimeOptions,\n\tCapabilityRuntimeState,\n\tOperationTerminalStatus,\n\tRegisteredPluginCapability,\n\tStoredLifecycleDefinition,\n} from \"./capability-runtime-types.ts\";\nimport { lifecycleEventKey, lifecyclePhases } from \"./capability-runtime-validation.ts\";\nimport {\n\tCAPABILITY_CALL_EVENT_ID,\n\tCAPABILITY_CALL_EVENT_VERSION,\n\tOPERATION_CANCEL_EVENT_ID,\n\tOPERATION_END_EVENT_ID,\n\tOPERATION_START_EVENT_ID,\n\tOPERATION_STEP_EVENT_ID,\n} from \"./lifecycle-catalog.ts\";\nimport { LifecycleDeliveryQueueOverflowError } from \"./lifecycle-delivery-queue.ts\";\nimport {\n\ttype LifecycleDeliveryFailure,\n\ttype LifecycleDeliveryReport,\n\ttype LifecycleDispatchRequest,\n\ttype LifecycleDispatchResult,\n\ttype LifecycleEvent,\n\tLifecycleExecuteError,\n\ttype LifecycleExecuteHandler,\n\ttype LifecycleObserveHandler,\n\tLifecycleTransformError,\n\ttype LifecycleTransformHandler,\n\ttype OperationProgress,\n} from \"./public-api.ts\";\n\nconst MAX_RUNTIME_INSPECTOR_LIFECYCLE_REPORTS = 64;\n\nexport interface LifecycleRuntime {\n\tdispatchLifecycle: <TData>(request: LifecycleDispatchRequest<TData>) => Promise<LifecycleDispatchResult<TData>>;\n\treportOperationEnd: (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\tstatus: OperationTerminalStatus,\n\t\townerTokens: readonly symbol[],\n\t) => void;\n\treportOperationStart: (operationId: string, operationKind: string, ownerTokens: readonly symbol[]) => void;\n\treportOperationStep: (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\townerTokens: readonly symbol[],\n\t\tprogress: OperationProgress,\n\t\tstep: number,\n\t) => boolean;\n\treportOperationCancel: (operationId: string, operationKind: string, ownerTokens: readonly symbol[]) => void;\n\treportCapabilityCall: (\n\t\tevent: \"start\" | \"cancel\" | \"end\",\n\t\toperationId: string,\n\t\tcallerPluginId: string,\n\t\tcapability: RegisteredPluginCapability,\n\t\townerTokens: readonly symbol[],\n\t\tstatus?: OperationTerminalStatus,\n\t) => void;\n}\n\n/**\n * Create the lifecycle dispatch and operation-fact machinery for one runtime.\n * All mutable state is shared through {@link CapabilityRuntimeState}; the\n * returned functions close over the same state object as the runtime entry.\n */\nexport function createLifecycleRuntime(deps: {\n\tstate: CapabilityRuntimeState;\n\tclock: () => number;\n\tcreateRuntimeId: (kind: string, sequence: number, fallback: string) => string;\n\tonLifecycleDispatch?: CapabilityRuntimeOptions[\"onLifecycleDispatch\"];\n}): LifecycleRuntime {\n\tconst { state, clock, createRuntimeId, onLifecycleDispatch } = deps;\n\tconst lifecycleReport = (\n\t\tevent: LifecycleEvent,\n\t\tstatus: LifecycleDeliveryReport[\"status\"],\n\t\tattempted: number,\n\t\tsucceeded: number,\n\t\tfailures: readonly LifecycleDeliveryFailure[],\n\t\tqueued = 0,\n\t): LifecycleDeliveryReport =>\n\t\tObject.freeze({\n\t\t\teventId: event.id,\n\t\t\ttype: event.type,\n\t\t\tversion: event.version,\n\t\t\tphase: event.phase,\n\t\t\tstatus,\n\t\t\tattempted,\n\t\t\tsucceeded,\n\t\t\t...(queued === 0 ? {} : { queued }),\n\t\t\tfailed: failures.length,\n\t\t\tfailures: Object.freeze([...failures]),\n\t\t});\n\tconst recordLifecycleReport = (report: LifecycleDeliveryReport): void => {\n\t\tconst snapshot = detachedSnapshot({\n\t\t\teventId: report.eventId,\n\t\t\ttype: report.type,\n\t\t\tversion: report.version,\n\t\t\tphase: report.phase,\n\t\t\tstatus: report.status,\n\t\t\tattempted: report.attempted,\n\t\t\tsucceeded: report.succeeded,\n\t\t\t...(report.queued === undefined ? {} : { queued: report.queued }),\n\t\t\tfailed: report.failed,\n\t\t\tcompletedAt: clock(),\n\t\t\tfailures: report.failures.map((failure) => ({\n\t\t\t\tpluginId: failure.pluginId,\n\t\t\t\tregistrationId: failure.registrationId,\n\t\t\t\tkind: failure.kind,\n\t\t\t\terror: lifecycleErrorSnapshot(failure.error),\n\t\t\t})),\n\t\t});\n\t\tstate.lifecycleReports.push(snapshot);\n\t\tif (state.lifecycleReports.length > MAX_RUNTIME_INSPECTOR_LIFECYCLE_REPORTS) state.lifecycleReports.shift();\n\t};\n\tconst assertLifecycleDefinitionActive = (stored: StoredLifecycleDefinition): void => {\n\t\tif (!state.activeOwnerTokens.has(stored.ownerToken)) {\n\t\t\tthrow createRevokedCapabilityError(stored.owner);\n\t\t}\n\t};\n\n\tconst dispatchLifecycleImpl = async <TData>(\n\t\trequest: LifecycleDispatchRequest<TData>,\n\t): Promise<LifecycleDispatchResult<TData>> => {\n\t\tif (!request || typeof request !== \"object\") throw new Error(\"Lifecycle dispatch request is required\");\n\t\tif (request.signal?.aborted) throw cancellationError(request.signal.reason);\n\t\tif (typeof request.type !== \"string\" || !request.type.trim()) {\n\t\t\tthrow new Error(\"Lifecycle dispatch requires a non-empty type\");\n\t\t}\n\t\tif (!Number.isSafeInteger(request.version) || request.version < 1) {\n\t\t\tthrow new Error(\"Lifecycle dispatch version must be a positive safe integer\");\n\t\t}\n\t\tif (!lifecyclePhases.has(request.phase)) throw new Error(`Lifecycle dispatch phase is invalid: ${request.phase}`);\n\t\tconst stored = state.lifecycleDefinitions.get(lifecycleEventKey(request.type, request.version));\n\t\tif (!stored || !state.activeOwnerTokens.has(stored.ownerToken)) {\n\t\t\tthrow new Error(`Lifecycle event is not defined: ${request.type}@${request.version}`);\n\t\t}\n\t\tif (!(stored.definition.allowedPhases ?? [stored.definition.phase]).includes(request.phase)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Lifecycle dispatch phase does not match event definition: ${request.type}@${request.version}`,\n\t\t\t);\n\t\t}\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tconst sequence = ++state.eventSequence;\n\t\tconst deliveryId = createRuntimeId(\"lifecycle-delivery\", sequence, `lifecycle-delivery:${sequence}`);\n\t\tconst operationId = request.operationId;\n\t\tconst correlationId = request.correlationId ?? operationId;\n\t\tif (operationId !== undefined && (typeof operationId !== \"string\" || !operationId.trim()))\n\t\t\tthrow new Error(\"Lifecycle operationId must be non-empty\");\n\t\tif (correlationId !== undefined && (typeof correlationId !== \"string\" || !correlationId.trim())) {\n\t\t\tthrow new Error(\"Lifecycle correlationId must be non-empty\");\n\t\t}\n\t\tif (\n\t\t\trequest.causationId !== undefined &&\n\t\t\t(typeof request.causationId !== \"string\" || !request.causationId.trim())\n\t\t) {\n\t\t\tthrow new Error(\"Lifecycle causationId must be non-empty\");\n\t\t}\n\t\tconst source = request.source ?? \"host\";\n\t\tif (typeof source !== \"string\" || !source.trim()) throw new Error(\"Lifecycle source must be non-empty\");\n\n\t\tconst validated = stored.definition.validate(detachedSnapshot(request.data));\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tlet data = detachedSnapshot(validated) as TData;\n\t\tconst makeEvent = (): LifecycleEvent<TData> =>\n\t\t\tdetachedSnapshot({\n\t\t\t\tid: createRuntimeId(\"lifecycle-event\", sequence, `lifecycle-event:${sequence}`),\n\t\t\t\tdeliveryId,\n\t\t\t\ttype: request.type,\n\t\t\t\tversion: request.version,\n\t\t\t\tphase: request.phase,\n\t\t\t\tsource,\n\t\t\t\ttimestamp: clock(),\n\t\t\t\t...(operationId === undefined ? {} : { operationId }),\n\t\t\t\t...(correlationId === undefined ? {} : { correlationId }),\n\t\t\t\t...(request.causationId === undefined ? {} : { causationId: request.causationId }),\n\t\t\t\tdata,\n\t\t\t});\n\t\tlet event = makeEvent();\n\t\tconst registrations = Array.from(\n\t\t\tstate.lifecycleRegistrations.get(lifecycleEventKey(request.type, request.version))?.values() ?? [],\n\t\t).sort((left, right) => left.sequence - right.sequence);\n\t\tconst transforms = registrations.filter((registration) => registration.kind === \"transform\");\n\t\tfor (let index = 0; index < transforms.length; index++) {\n\t\t\tconst registration = transforms[index];\n\t\t\ttry {\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tconst registered = {\n\t\t\t\t\towner: registration.owner,\n\t\t\t\t\townerToken: registration.ownerToken,\n\t\t\t\t\tvalue: registration.handler,\n\t\t\t\t};\n\t\t\t\tconst result = await invokeRegisteredCapabilityWithSignal(state, registered, request.signal, (handler) =>\n\t\t\t\t\t(handler as LifecycleTransformHandler<TData>)(detachedSnapshot(event), request.signal),\n\t\t\t\t);\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tdata = detachedSnapshot(stored.definition.validate(detachedSnapshot(result))) as TData;\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tevent = makeEvent();\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t} catch (error) {\n\t\t\t\tconst failure: LifecycleDeliveryFailure = {\n\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\terror,\n\t\t\t\t};\n\t\t\t\tconst report = lifecycleReport(event, \"transform-failed\", index + 1, index, [failure]);\n\t\t\t\trecordLifecycleReport(report);\n\t\t\t\tthrow new LifecycleTransformError(error, report);\n\t\t\t}\n\t\t}\n\t\tconst executes = registrations.filter(\n\t\t\t(registration) => request.phase === \"committed\" && registration.kind === \"execute\",\n\t\t);\n\t\tconst executeResults: unknown[] = [];\n\t\tfor (let index = 0; index < executes.length; index++) {\n\t\t\tconst registration = executes[index];\n\t\t\ttry {\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tconst registered = {\n\t\t\t\t\towner: registration.owner,\n\t\t\t\t\townerToken: registration.ownerToken,\n\t\t\t\t\tvalue: registration.handler,\n\t\t\t\t};\n\t\t\t\tconst result = await invokeRegisteredCapabilityWithSignal(state, registered, request.signal, (handler) =>\n\t\t\t\t\t(handler as LifecycleExecuteHandler<TData>)(detachedSnapshot(event), request.signal),\n\t\t\t\t);\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\texecuteResults.push(detachedSnapshot(result));\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t} catch (error) {\n\t\t\t\tconst failure: LifecycleDeliveryFailure = {\n\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\terror,\n\t\t\t\t};\n\t\t\t\tconst report = lifecycleReport(event, \"execute-failed\", index + 1, index, [failure]);\n\t\t\t\trecordLifecycleReport(report);\n\t\t\t\tthrow new LifecycleExecuteError(error, report);\n\t\t\t}\n\t\t}\n\n\t\tconst deliveries = registrations.filter(\n\t\t\t(registration) =>\n\t\t\t\tregistration.kind === \"observe\" || (request.phase === \"committed\" && registration.kind === \"after-commit\"),\n\t\t);\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tconst results = await Promise.allSettled(\n\t\t\tdeliveries\n\t\t\t\t.filter((registration) => registration.queue === undefined)\n\t\t\t\t.map((registration) => {\n\t\t\t\t\tconst registered = {\n\t\t\t\t\t\towner: registration.owner,\n\t\t\t\t\t\townerToken: registration.ownerToken,\n\t\t\t\t\t\tvalue: registration.handler,\n\t\t\t\t\t};\n\t\t\t\t\treturn invokeRegisteredCapabilityWithSignal(state, registered, request.signal, (handler) =>\n\t\t\t\t\t\t(handler as LifecycleObserveHandler<TData>)(detachedSnapshot(event), request.signal),\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t);\n\t\tif (request.signal?.aborted) throw cancellationError(request.signal.reason);\n\t\tconst failures: LifecycleDeliveryFailure[] = [];\n\t\tlet succeeded = 0;\n\t\tconst inlineDeliveries = deliveries.filter((registration) => registration.queue === undefined);\n\t\tfor (let index = 0; index < results.length; index++) {\n\t\t\tconst result = results[index];\n\t\t\tif (result.status === \"fulfilled\") {\n\t\t\t\tsucceeded++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (isRevokedCapabilityError(result.reason)) continue;\n\t\t\tconst registration = inlineDeliveries[index];\n\t\t\tfailures.push({\n\t\t\t\tpluginId: registration.owner,\n\t\t\t\tregistrationId: registration.id,\n\t\t\t\tkind: registration.kind,\n\t\t\t\terror: result.reason,\n\t\t\t});\n\t\t}\n\t\tlet queued = 0;\n\t\tfor (const registration of deliveries) {\n\t\t\tconst queue = registration.queue;\n\t\t\tif (!queue) continue;\n\t\t\ttry {\n\t\t\t\tconst acceptedBefore = queue.snapshot().accepted;\n\t\t\t\tconst delivery = queue.enqueue({ event: detachedSnapshot(event), signal: request.signal });\n\t\t\t\tconst queueSnapshot = queue.snapshot();\n\t\t\t\tif (queueSnapshot.accepted > acceptedBefore) queued += 1;\n\t\t\t\tif (queueSnapshot.status === \"overflowed\") {\n\t\t\t\t\tfailures.push({\n\t\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\t\terror: new LifecycleDeliveryQueueOverflowError(\n\t\t\t\t\t\t\tevent.type === \"model.stream\"\n\t\t\t\t\t\t\t\t? \"model_stream_backpressure_overflow\"\n\t\t\t\t\t\t\t\t: \"lifecycle_delivery_backpressure_overflow\",\n\t\t\t\t\t\t\tqueueSnapshot.maxPendingEvents,\n\t\t\t\t\t\t\tqueueSnapshot.maxPendingBytes,\n\t\t\t\t\t\t\tqueueSnapshot.pendingEvents,\n\t\t\t\t\t\t\tqueueSnapshot.pendingBytes,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvoid delivery.then(\n\t\t\t\t\t() => recordLifecycleReport(lifecycleReport(event, \"delivered\", 1, 1, [])),\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\tif (isRevokedCapabilityError(error)) return;\n\t\t\t\t\t\tif (error instanceof LifecycleDeliveryQueueOverflowError) return;\n\t\t\t\t\t\tconst failure: LifecycleDeliveryFailure = {\n\t\t\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t};\n\t\t\t\t\t\trecordLifecycleReport(lifecycleReport(event, \"delivered\", 1, 0, [failure]));\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tfailures.push({\n\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tconst report = lifecycleReport(\n\t\t\tevent,\n\t\t\tqueued > 0 ? \"queued\" : \"delivered\",\n\t\t\tdeliveries.length,\n\t\t\tsucceeded,\n\t\t\tfailures,\n\t\t\tqueued,\n\t\t);\n\t\trecordLifecycleReport(report);\n\t\tassertLifecycleDefinitionActive(stored);\n\t\treturn Object.freeze({ event, data: event.data, executeResults: Object.freeze(executeResults), report });\n\t};\n\tconst dispatchLifecycle = <TData>(\n\t\trequest: LifecycleDispatchRequest<TData>,\n\t): Promise<LifecycleDispatchResult<TData>> => {\n\t\tconst settled = dispatchLifecycleImpl(request);\n\t\ttry {\n\t\t\tonLifecycleDispatch?.(\n\t\t\t\trequest as LifecycleDispatchRequest<unknown>,\n\t\t\t\tsettled as Promise<LifecycleDispatchResult<unknown>>,\n\t\t\t);\n\t\t} catch {\n\t\t\t// Test observers must never alter lifecycle delivery or operation results.\n\t\t}\n\t\treturn settled;\n\t};\n\tconst reportOperationFact = (\n\t\teventId: string,\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\tstatus: OperationTerminalStatus,\n\t\townerTokens: readonly symbol[],\n\t): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tconst data = {\n\t\t\tversion: 1 as const,\n\t\t\toperationId,\n\t\t\toperationKind,\n\t\t\tstatus,\n\t\t\t...(status === \"failed\" ? { errorMessage: \"operation failed\" } : {}),\n\t\t\t...(status === \"cancelled\" ? { reason: \"cancelled\" } : {}),\n\t\t};\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: eventId,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata,\n\t\t}).catch(() => {});\n\t};\n\tconst reportOperationEnd = (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\tstatus: OperationTerminalStatus,\n\t\townerTokens: readonly symbol[],\n\t): void => {\n\t\treportOperationFact(OPERATION_END_EVENT_ID, operationId, operationKind, status, ownerTokens);\n\t};\n\t// operation.start fires when execution begins; operation.cancel fires at the\n\t// cancellation request, before the terminal operation.end fact. Both stay\n\t// within CapabilityAPI-registered operations and never carry input, results,\n\t// or caller cancellation reasons.\n\tconst reportOperationStart = (operationId: string, operationKind: string, ownerTokens: readonly symbol[]): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: OPERATION_START_EVENT_ID,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata: { version: 1, operationId, operationKind },\n\t\t}).catch(() => {});\n\t};\n\tconst reportOperationStep = (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\townerTokens: readonly symbol[],\n\t\tprogress: OperationProgress,\n\t\tstep: number,\n\t): boolean => {\n\t\tif (\n\t\t\townerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken)) ||\n\t\t\tstate.statuses.get(operationId) !== \"running\"\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!progress || typeof progress !== \"object\" || Array.isArray(progress)) {\n\t\t\tthrow new Error(\"Operation progress must be an object\");\n\t\t}\n\t\tif (progress.message !== undefined && (typeof progress.message !== \"string\" || !progress.message.trim())) {\n\t\t\tthrow new Error(\"Operation progress message must be a non-empty string\");\n\t\t}\n\t\tif (progress.data !== undefined && !isPluginConfigValue(progress.data)) {\n\t\t\tthrow new Error(\"Operation progress data must be serializable\");\n\t\t}\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: OPERATION_STEP_EVENT_ID,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata: {\n\t\t\t\tversion: 1,\n\t\t\t\toperationId,\n\t\t\t\toperationKind,\n\t\t\t\tstep,\n\t\t\t\t...(progress.message === undefined ? {} : { message: progress.message }),\n\t\t\t\t...(progress.data === undefined ? {} : { data: detachedSnapshot(progress.data) }),\n\t\t\t},\n\t\t}).catch(() => {});\n\t\treturn true;\n\t};\n\tconst reportOperationCancel = (operationId: string, operationKind: string, ownerTokens: readonly symbol[]): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: OPERATION_CANCEL_EVENT_ID,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata: { version: 1, operationId, operationKind },\n\t\t}).catch(() => {});\n\t};\n\tconst reportCapabilityCall = (\n\t\tevent: \"start\" | \"cancel\" | \"end\",\n\t\toperationId: string,\n\t\tcallerPluginId: string,\n\t\tcapability: RegisteredPluginCapability,\n\t\townerTokens: readonly symbol[],\n\t\tstatus?: OperationTerminalStatus,\n\t): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tconst data = {\n\t\t\tversion: 1 as const,\n\t\t\tevent,\n\t\t\toperationId,\n\t\t\tcallerPluginId,\n\t\t\tcapabilityId: capability.declaration.id,\n\t\t\tcapabilityVersion: capability.declaration.version,\n\t\t\tcapabilityKind: capability.declaration.kind,\n\t\t\tproviderPluginId: capability.owner,\n\t\t\t...(status === undefined ? {} : { status }),\n\t\t};\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: CAPABILITY_CALL_EVENT_ID,\n\t\t\tversion: CAPABILITY_CALL_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata,\n\t\t}).catch(() => {});\n\t};\n\n\treturn {\n\t\tdispatchLifecycle,\n\t\treportOperationEnd,\n\t\treportOperationStart,\n\t\treportOperationStep,\n\t\treportOperationCancel,\n\t\treportCapabilityCall,\n\t};\n}\n"]}
1
+ {"version":3,"file":"capability-runtime-events.js","sourceRoot":"","sources":["../../../src/core/extensions/capability-runtime-events.ts"],"names":[],"mappings":"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","sourcesContent":["import { t } from \"../i18n/index.ts\";\nimport { isPluginConfigValue } from \"./capability-runtime-manifest.ts\";\nimport { cancellationError } from \"./capability-runtime-operation.ts\";\nimport { detachedSnapshot, lifecycleErrorSnapshot } from \"./capability-runtime-snapshot.ts\";\nimport {\n\tcreateRevokedCapabilityError,\n\tinvokeRegisteredCapabilityWithSignal,\n\tisRevokedCapabilityError,\n} from \"./capability-runtime-store.ts\";\nimport type {\n\tCapabilityRuntimeOptions,\n\tCapabilityRuntimeState,\n\tOperationTerminalStatus,\n\tRegisteredPluginCapability,\n\tStoredLifecycleDefinition,\n} from \"./capability-runtime-types.ts\";\nimport { lifecycleEventKey, lifecyclePhases } from \"./capability-runtime-validation.ts\";\nimport {\n\tCAPABILITY_CALL_EVENT_ID,\n\tCAPABILITY_CALL_EVENT_VERSION,\n\tOPERATION_CANCEL_EVENT_ID,\n\tOPERATION_END_EVENT_ID,\n\tOPERATION_START_EVENT_ID,\n\tOPERATION_STEP_EVENT_ID,\n} from \"./lifecycle-catalog.ts\";\nimport { LifecycleDeliveryQueueOverflowError } from \"./lifecycle-delivery-queue.ts\";\nimport {\n\ttype LifecycleDeliveryFailure,\n\ttype LifecycleDeliveryReport,\n\ttype LifecycleDispatchRequest,\n\ttype LifecycleDispatchResult,\n\ttype LifecycleEvent,\n\tLifecycleExecuteError,\n\ttype LifecycleExecuteHandler,\n\ttype LifecycleObserveHandler,\n\tLifecycleTransformError,\n\ttype LifecycleTransformHandler,\n\ttype OperationProgress,\n} from \"./public-api.ts\";\n\nconst MAX_RUNTIME_INSPECTOR_LIFECYCLE_REPORTS = 64;\n\nexport interface LifecycleRuntime {\n\tdispatchLifecycle: <TData>(request: LifecycleDispatchRequest<TData>) => Promise<LifecycleDispatchResult<TData>>;\n\treportOperationEnd: (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\tstatus: OperationTerminalStatus,\n\t\townerTokens: readonly symbol[],\n\t) => void;\n\treportOperationStart: (operationId: string, operationKind: string, ownerTokens: readonly symbol[]) => void;\n\treportOperationStep: (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\townerTokens: readonly symbol[],\n\t\tprogress: OperationProgress,\n\t\tstep: number,\n\t) => boolean;\n\treportOperationCancel: (operationId: string, operationKind: string, ownerTokens: readonly symbol[]) => void;\n\treportCapabilityCall: (\n\t\tevent: \"start\" | \"cancel\" | \"end\",\n\t\toperationId: string,\n\t\tcallerPluginId: string,\n\t\tcapability: RegisteredPluginCapability,\n\t\townerTokens: readonly symbol[],\n\t\tstatus?: OperationTerminalStatus,\n\t) => void;\n}\n\n/**\n * Create the lifecycle dispatch and operation-fact machinery for one runtime.\n * All mutable state is shared through {@link CapabilityRuntimeState}; the\n * returned functions close over the same state object as the runtime entry.\n */\nexport function createLifecycleRuntime(deps: {\n\tstate: CapabilityRuntimeState;\n\tclock: () => number;\n\tcreateRuntimeId: (kind: string, sequence: number, fallback: string) => string;\n\tonLifecycleDispatch?: CapabilityRuntimeOptions[\"onLifecycleDispatch\"];\n}): LifecycleRuntime {\n\tconst { state, clock, createRuntimeId, onLifecycleDispatch } = deps;\n\tconst lifecycleReport = (\n\t\tevent: LifecycleEvent,\n\t\tstatus: LifecycleDeliveryReport[\"status\"],\n\t\tattempted: number,\n\t\tsucceeded: number,\n\t\tfailures: readonly LifecycleDeliveryFailure[],\n\t\tqueued = 0,\n\t): LifecycleDeliveryReport =>\n\t\tObject.freeze({\n\t\t\teventId: event.id,\n\t\t\ttype: event.type,\n\t\t\tversion: event.version,\n\t\t\tphase: event.phase,\n\t\t\tstatus,\n\t\t\tattempted,\n\t\t\tsucceeded,\n\t\t\t...(queued === 0 ? {} : { queued }),\n\t\t\tfailed: failures.length,\n\t\t\tfailures: Object.freeze([...failures]),\n\t\t});\n\tconst recordLifecycleReport = (report: LifecycleDeliveryReport): void => {\n\t\tconst snapshot = detachedSnapshot({\n\t\t\teventId: report.eventId,\n\t\t\ttype: report.type,\n\t\t\tversion: report.version,\n\t\t\tphase: report.phase,\n\t\t\tstatus: report.status,\n\t\t\tattempted: report.attempted,\n\t\t\tsucceeded: report.succeeded,\n\t\t\t...(report.queued === undefined ? {} : { queued: report.queued }),\n\t\t\tfailed: report.failed,\n\t\t\tcompletedAt: clock(),\n\t\t\tfailures: report.failures.map((failure) => ({\n\t\t\t\tpluginId: failure.pluginId,\n\t\t\t\tregistrationId: failure.registrationId,\n\t\t\t\tkind: failure.kind,\n\t\t\t\terror: lifecycleErrorSnapshot(failure.error),\n\t\t\t})),\n\t\t});\n\t\tstate.lifecycleReports.push(snapshot);\n\t\tif (state.lifecycleReports.length > MAX_RUNTIME_INSPECTOR_LIFECYCLE_REPORTS) state.lifecycleReports.shift();\n\t};\n\tconst assertLifecycleDefinitionActive = (stored: StoredLifecycleDefinition): void => {\n\t\tif (!state.activeOwnerTokens.has(stored.ownerToken)) {\n\t\t\tthrow createRevokedCapabilityError(stored.owner);\n\t\t}\n\t};\n\n\tconst dispatchLifecycleImpl = async <TData>(\n\t\trequest: LifecycleDispatchRequest<TData>,\n\t): Promise<LifecycleDispatchResult<TData>> => {\n\t\tif (!request || typeof request !== \"object\") throw new Error(t(\"Lifecycle dispatch request is required\"));\n\t\tif (request.signal?.aborted) throw cancellationError(request.signal.reason);\n\t\tif (typeof request.type !== \"string\" || !request.type.trim()) {\n\t\t\tthrow new Error(t(\"Lifecycle dispatch requires a non-empty type\"));\n\t\t}\n\t\tif (!Number.isSafeInteger(request.version) || request.version < 1) {\n\t\t\tthrow new Error(t(\"Lifecycle dispatch version must be a positive safe integer\"));\n\t\t}\n\t\tif (!lifecyclePhases.has(request.phase))\n\t\t\tthrow new Error(t(\"Lifecycle dispatch phase is invalid: {phase}\", { phase: request.phase }));\n\t\tconst stored = state.lifecycleDefinitions.get(lifecycleEventKey(request.type, request.version));\n\t\tif (!stored || !state.activeOwnerTokens.has(stored.ownerToken)) {\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Lifecycle event is not defined: {type}@{version}\", { type: request.type, version: request.version }),\n\t\t\t);\n\t\t}\n\t\tif (!(stored.definition.allowedPhases ?? [stored.definition.phase]).includes(request.phase)) {\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Lifecycle dispatch phase does not match event definition: {type}@{version}\", {\n\t\t\t\t\ttype: request.type,\n\t\t\t\t\tversion: request.version,\n\t\t\t\t}),\n\t\t\t);\n\t\t}\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tconst sequence = ++state.eventSequence;\n\t\tconst deliveryId = createRuntimeId(\"lifecycle-delivery\", sequence, `lifecycle-delivery:${sequence}`);\n\t\tconst operationId = request.operationId;\n\t\tconst correlationId = request.correlationId ?? operationId;\n\t\tif (operationId !== undefined && (typeof operationId !== \"string\" || !operationId.trim()))\n\t\t\tthrow new Error(t(\"Lifecycle operationId must be non-empty\"));\n\t\tif (correlationId !== undefined && (typeof correlationId !== \"string\" || !correlationId.trim())) {\n\t\t\tthrow new Error(t(\"Lifecycle correlationId must be non-empty\"));\n\t\t}\n\t\tif (\n\t\t\trequest.causationId !== undefined &&\n\t\t\t(typeof request.causationId !== \"string\" || !request.causationId.trim())\n\t\t) {\n\t\t\tthrow new Error(t(\"Lifecycle causationId must be non-empty\"));\n\t\t}\n\t\tconst source = request.source ?? \"host\";\n\t\tif (typeof source !== \"string\" || !source.trim()) throw new Error(t(\"Lifecycle source must be non-empty\"));\n\n\t\tconst validated = stored.definition.validate(detachedSnapshot(request.data));\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tlet data = detachedSnapshot(validated) as TData;\n\t\tconst makeEvent = (): LifecycleEvent<TData> =>\n\t\t\tdetachedSnapshot({\n\t\t\t\tid: createRuntimeId(\"lifecycle-event\", sequence, `lifecycle-event:${sequence}`),\n\t\t\t\tdeliveryId,\n\t\t\t\ttype: request.type,\n\t\t\t\tversion: request.version,\n\t\t\t\tphase: request.phase,\n\t\t\t\tsource,\n\t\t\t\ttimestamp: clock(),\n\t\t\t\t...(operationId === undefined ? {} : { operationId }),\n\t\t\t\t...(correlationId === undefined ? {} : { correlationId }),\n\t\t\t\t...(request.causationId === undefined ? {} : { causationId: request.causationId }),\n\t\t\t\tdata,\n\t\t\t});\n\t\tlet event = makeEvent();\n\t\tconst registrations = Array.from(\n\t\t\tstate.lifecycleRegistrations.get(lifecycleEventKey(request.type, request.version))?.values() ?? [],\n\t\t).sort((left, right) => left.sequence - right.sequence);\n\t\tconst transforms = registrations.filter((registration) => registration.kind === \"transform\");\n\t\tfor (let index = 0; index < transforms.length; index++) {\n\t\t\tconst registration = transforms[index];\n\t\t\ttry {\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tconst registered = {\n\t\t\t\t\towner: registration.owner,\n\t\t\t\t\townerToken: registration.ownerToken,\n\t\t\t\t\tvalue: registration.handler,\n\t\t\t\t};\n\t\t\t\tconst result = await invokeRegisteredCapabilityWithSignal(state, registered, request.signal, (handler) =>\n\t\t\t\t\t(handler as LifecycleTransformHandler<TData>)(detachedSnapshot(event), request.signal),\n\t\t\t\t);\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tdata = detachedSnapshot(stored.definition.validate(detachedSnapshot(result))) as TData;\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tevent = makeEvent();\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t} catch (error) {\n\t\t\t\tconst failure: LifecycleDeliveryFailure = {\n\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\terror,\n\t\t\t\t};\n\t\t\t\tconst report = lifecycleReport(event, \"transform-failed\", index + 1, index, [failure]);\n\t\t\t\trecordLifecycleReport(report);\n\t\t\t\tthrow new LifecycleTransformError(error, report);\n\t\t\t}\n\t\t}\n\t\tconst executes = registrations.filter(\n\t\t\t(registration) => request.phase === \"committed\" && registration.kind === \"execute\",\n\t\t);\n\t\tconst executeResults: unknown[] = [];\n\t\tfor (let index = 0; index < executes.length; index++) {\n\t\t\tconst registration = executes[index];\n\t\t\ttry {\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\tconst registered = {\n\t\t\t\t\towner: registration.owner,\n\t\t\t\t\townerToken: registration.ownerToken,\n\t\t\t\t\tvalue: registration.handler,\n\t\t\t\t};\n\t\t\t\tconst result = await invokeRegisteredCapabilityWithSignal(state, registered, request.signal, (handler) =>\n\t\t\t\t\t(handler as LifecycleExecuteHandler<TData>)(detachedSnapshot(event), request.signal),\n\t\t\t\t);\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t\texecuteResults.push(detachedSnapshot(result));\n\t\t\t\tassertLifecycleDefinitionActive(stored);\n\t\t\t} catch (error) {\n\t\t\t\tconst failure: LifecycleDeliveryFailure = {\n\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\terror,\n\t\t\t\t};\n\t\t\t\tconst report = lifecycleReport(event, \"execute-failed\", index + 1, index, [failure]);\n\t\t\t\trecordLifecycleReport(report);\n\t\t\t\tthrow new LifecycleExecuteError(error, report);\n\t\t\t}\n\t\t}\n\n\t\tconst deliveries = registrations.filter(\n\t\t\t(registration) =>\n\t\t\t\tregistration.kind === \"observe\" || (request.phase === \"committed\" && registration.kind === \"after-commit\"),\n\t\t);\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tconst results = await Promise.allSettled(\n\t\t\tdeliveries\n\t\t\t\t.filter((registration) => registration.queue === undefined)\n\t\t\t\t.map((registration) => {\n\t\t\t\t\tconst registered = {\n\t\t\t\t\t\towner: registration.owner,\n\t\t\t\t\t\townerToken: registration.ownerToken,\n\t\t\t\t\t\tvalue: registration.handler,\n\t\t\t\t\t};\n\t\t\t\t\treturn invokeRegisteredCapabilityWithSignal(state, registered, request.signal, (handler) =>\n\t\t\t\t\t\t(handler as LifecycleObserveHandler<TData>)(detachedSnapshot(event), request.signal),\n\t\t\t\t\t);\n\t\t\t\t}),\n\t\t);\n\t\tif (request.signal?.aborted) throw cancellationError(request.signal.reason);\n\t\tconst failures: LifecycleDeliveryFailure[] = [];\n\t\tlet succeeded = 0;\n\t\tconst inlineDeliveries = deliveries.filter((registration) => registration.queue === undefined);\n\t\tfor (let index = 0; index < results.length; index++) {\n\t\t\tconst result = results[index];\n\t\t\tif (result.status === \"fulfilled\") {\n\t\t\t\tsucceeded++;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tif (isRevokedCapabilityError(result.reason)) continue;\n\t\t\tconst registration = inlineDeliveries[index];\n\t\t\tfailures.push({\n\t\t\t\tpluginId: registration.owner,\n\t\t\t\tregistrationId: registration.id,\n\t\t\t\tkind: registration.kind,\n\t\t\t\terror: result.reason,\n\t\t\t});\n\t\t}\n\t\tlet queued = 0;\n\t\tfor (const registration of deliveries) {\n\t\t\tconst queue = registration.queue;\n\t\t\tif (!queue) continue;\n\t\t\ttry {\n\t\t\t\tconst acceptedBefore = queue.snapshot().accepted;\n\t\t\t\tconst delivery = queue.enqueue({ event: detachedSnapshot(event), signal: request.signal });\n\t\t\t\tconst queueSnapshot = queue.snapshot();\n\t\t\t\tif (queueSnapshot.accepted > acceptedBefore) queued += 1;\n\t\t\t\tif (queueSnapshot.status === \"overflowed\") {\n\t\t\t\t\tfailures.push({\n\t\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\t\terror: new LifecycleDeliveryQueueOverflowError(\n\t\t\t\t\t\t\tevent.type === \"model.stream\"\n\t\t\t\t\t\t\t\t? \"model_stream_backpressure_overflow\"\n\t\t\t\t\t\t\t\t: \"lifecycle_delivery_backpressure_overflow\",\n\t\t\t\t\t\t\tqueueSnapshot.maxPendingEvents,\n\t\t\t\t\t\t\tqueueSnapshot.maxPendingBytes,\n\t\t\t\t\t\t\tqueueSnapshot.pendingEvents,\n\t\t\t\t\t\t\tqueueSnapshot.pendingBytes,\n\t\t\t\t\t\t\t0,\n\t\t\t\t\t\t),\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tvoid delivery.then(\n\t\t\t\t\t() => recordLifecycleReport(lifecycleReport(event, \"delivered\", 1, 1, [])),\n\t\t\t\t\t(error) => {\n\t\t\t\t\t\tif (isRevokedCapabilityError(error)) return;\n\t\t\t\t\t\tif (error instanceof LifecycleDeliveryQueueOverflowError) return;\n\t\t\t\t\t\tconst failure: LifecycleDeliveryFailure = {\n\t\t\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\t\t\terror,\n\t\t\t\t\t\t};\n\t\t\t\t\t\trecordLifecycleReport(lifecycleReport(event, \"delivered\", 1, 0, [failure]));\n\t\t\t\t\t},\n\t\t\t\t);\n\t\t\t} catch (error) {\n\t\t\t\tfailures.push({\n\t\t\t\t\tpluginId: registration.owner,\n\t\t\t\t\tregistrationId: registration.id,\n\t\t\t\t\tkind: registration.kind,\n\t\t\t\t\terror,\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\tassertLifecycleDefinitionActive(stored);\n\t\tconst report = lifecycleReport(\n\t\t\tevent,\n\t\t\tqueued > 0 ? \"queued\" : \"delivered\",\n\t\t\tdeliveries.length,\n\t\t\tsucceeded,\n\t\t\tfailures,\n\t\t\tqueued,\n\t\t);\n\t\trecordLifecycleReport(report);\n\t\tassertLifecycleDefinitionActive(stored);\n\t\treturn Object.freeze({ event, data: event.data, executeResults: Object.freeze(executeResults), report });\n\t};\n\tconst dispatchLifecycle = <TData>(\n\t\trequest: LifecycleDispatchRequest<TData>,\n\t): Promise<LifecycleDispatchResult<TData>> => {\n\t\tconst settled = dispatchLifecycleImpl(request);\n\t\ttry {\n\t\t\tonLifecycleDispatch?.(\n\t\t\t\trequest as LifecycleDispatchRequest<unknown>,\n\t\t\t\tsettled as Promise<LifecycleDispatchResult<unknown>>,\n\t\t\t);\n\t\t} catch {\n\t\t\t// Test observers must never alter lifecycle delivery or operation results.\n\t\t}\n\t\treturn settled;\n\t};\n\tconst reportOperationFact = (\n\t\teventId: string,\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\tstatus: OperationTerminalStatus,\n\t\townerTokens: readonly symbol[],\n\t): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tconst data = {\n\t\t\tversion: 1 as const,\n\t\t\toperationId,\n\t\t\toperationKind,\n\t\t\tstatus,\n\t\t\t...(status === \"failed\" ? { errorMessage: \"operation failed\" } : {}),\n\t\t\t...(status === \"cancelled\" ? { reason: \"cancelled\" } : {}),\n\t\t};\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: eventId,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata,\n\t\t}).catch(() => {});\n\t};\n\tconst reportOperationEnd = (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\tstatus: OperationTerminalStatus,\n\t\townerTokens: readonly symbol[],\n\t): void => {\n\t\treportOperationFact(OPERATION_END_EVENT_ID, operationId, operationKind, status, ownerTokens);\n\t};\n\t// operation.start fires when execution begins; operation.cancel fires at the\n\t// cancellation request, before the terminal operation.end fact. Both stay\n\t// within CapabilityAPI-registered operations and never carry input, results,\n\t// or caller cancellation reasons.\n\tconst reportOperationStart = (operationId: string, operationKind: string, ownerTokens: readonly symbol[]): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: OPERATION_START_EVENT_ID,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata: { version: 1, operationId, operationKind },\n\t\t}).catch(() => {});\n\t};\n\tconst reportOperationStep = (\n\t\toperationId: string,\n\t\toperationKind: string,\n\t\townerTokens: readonly symbol[],\n\t\tprogress: OperationProgress,\n\t\tstep: number,\n\t): boolean => {\n\t\tif (\n\t\t\townerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken)) ||\n\t\t\tstate.statuses.get(operationId) !== \"running\"\n\t\t) {\n\t\t\treturn false;\n\t\t}\n\t\tif (!progress || typeof progress !== \"object\" || Array.isArray(progress)) {\n\t\t\tthrow new Error(t(\"Operation progress must be an object\"));\n\t\t}\n\t\tif (progress.message !== undefined && (typeof progress.message !== \"string\" || !progress.message.trim())) {\n\t\t\tthrow new Error(t(\"Operation progress message must be a non-empty string\"));\n\t\t}\n\t\tif (progress.data !== undefined && !isPluginConfigValue(progress.data)) {\n\t\t\tthrow new Error(t(\"Operation progress data must be serializable\"));\n\t\t}\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: OPERATION_STEP_EVENT_ID,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata: {\n\t\t\t\tversion: 1,\n\t\t\t\toperationId,\n\t\t\t\toperationKind,\n\t\t\t\tstep,\n\t\t\t\t...(progress.message === undefined ? {} : { message: progress.message }),\n\t\t\t\t...(progress.data === undefined ? {} : { data: detachedSnapshot(progress.data) }),\n\t\t\t},\n\t\t}).catch(() => {});\n\t\treturn true;\n\t};\n\tconst reportOperationCancel = (operationId: string, operationKind: string, ownerTokens: readonly symbol[]): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: OPERATION_CANCEL_EVENT_ID,\n\t\t\tversion: 1,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata: { version: 1, operationId, operationKind },\n\t\t}).catch(() => {});\n\t};\n\tconst reportCapabilityCall = (\n\t\tevent: \"start\" | \"cancel\" | \"end\",\n\t\toperationId: string,\n\t\tcallerPluginId: string,\n\t\tcapability: RegisteredPluginCapability,\n\t\townerTokens: readonly symbol[],\n\t\tstatus?: OperationTerminalStatus,\n\t): void => {\n\t\tif (ownerTokens.some((ownerToken) => !state.activeOwnerTokens.has(ownerToken))) return;\n\t\tconst data = {\n\t\t\tversion: 1 as const,\n\t\t\tevent,\n\t\t\toperationId,\n\t\t\tcallerPluginId,\n\t\t\tcapabilityId: capability.declaration.id,\n\t\t\tcapabilityVersion: capability.declaration.version,\n\t\t\tcapabilityKind: capability.declaration.kind,\n\t\t\tproviderPluginId: capability.owner,\n\t\t\t...(status === undefined ? {} : { status }),\n\t\t};\n\t\tvoid dispatchLifecycle({\n\t\t\ttype: CAPABILITY_CALL_EVENT_ID,\n\t\t\tversion: CAPABILITY_CALL_EVENT_VERSION,\n\t\t\tphase: \"committed\",\n\t\t\tsource: \"host\",\n\t\t\toperationId,\n\t\t\tcorrelationId: operationId,\n\t\t\tdata,\n\t\t}).catch(() => {});\n\t};\n\n\treturn {\n\t\tdispatchLifecycle,\n\t\treportOperationEnd,\n\t\treportOperationStart,\n\t\treportOperationStep,\n\t\treportOperationCancel,\n\t\treportCapabilityCall,\n\t};\n}\n"]}
@@ -1 +1 @@
1
- {"version":3,"file":"capability-runtime-guards.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/capability-runtime-guards.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport { SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES } from \"@agent-forge/protocol/subagent\";\nimport type { DurableServiceV1 } from \"../../durable/durable-service.ts\";\nimport type { AgentCompositionLifecycleDispatcher } from \"./agent-composition.ts\";\nimport { cancellationError } from \"./capability-runtime-operation.ts\";\nimport { definitionSnapshot, detachedSnapshot } from \"./capability-runtime-snapshot.ts\";\nimport {\n\tvalidateCredentialRequest,\n\tvalidateInteractionNotifyRequest,\n\tvalidateInteractionRequest,\n\tvalidateInteractionTimeoutMs,\n} from \"./capability-runtime-validation.ts\";\nimport {\n\ttype AgentCompositionAPI,\n\ttype AgentCompositionScopedHostBinding,\n\ttype AgentControllerLease,\n\ttype AgentDefinition,\n\ttype AgentHostPrimitivesFactory,\n\ttype AgentInstance,\n\ttype AgentTaskCreateRequest,\n\ttype AgentTaskHandle,\n\ttype AgentTaskHost,\n\ttype AgentTaskResultV1,\n\ttype AgentTaskStatus,\n\ttype AgentTaskWaitResult,\n\ttype CredentialAPI,\n\tcreateDisposableRegistration,\n\ttype DisposableRegistration,\n\ttype InteractionAPI,\n\ttype InteractionHostV1,\n\ttype InteractionOutcomeV1,\n\ttype OutputArtifactAPI,\n\ttype PluginManifest,\n\ttype SessionAPI,\n\ttype SessionExportArtifact,\n\ttype SessionMessageContent,\n} from \"./public-api.ts\";\n\nexport function guardedSession(\n\tsession: SessionAPI,\n\tassertUsable: () => void,\n\toptions: { allowExport: boolean; allowRevision: boolean },\n): SessionAPI {\n\tconst detachedExportArtifact = (artifact: SessionExportArtifact): SessionExportArtifact => ({\n\t\t...detachedSnapshot(artifact),\n\t\tbytes: new Uint8Array(artifact.bytes),\n\t});\n\tconst exportArtifact = session.exportArtifact;\n\tconst getRevision = session.getRevision;\n\tconst setSessionName = session.setSessionName;\n\tconst getSessionName = session.getSessionName;\n\tconst setLabel = session.setLabel;\n\tconst getLabel = session.getLabel;\n\tconst getActiveTools = session.getActiveTools;\n\tconst setActiveTools = session.setActiveTools;\n\tconst getAllTools = session.getAllTools;\n\tconst getCommands = session.getCommands;\n\tconst getModel = session.getModel;\n\tconst getScopedModels = session.getScopedModels;\n\tconst getThinkingLevel = session.getThinkingLevel;\n\tconst setThinkingLevel = session.setThinkingLevel;\n\tconst setModel = session.setModel;\n\tconst getSystemPrompt = session.getSystemPrompt;\n\tconst getSystemPromptOptions = session.getSystemPromptOptions;\n\tconst getContextUsage = session.getContextUsage;\n\tconst steer = session.steer;\n\tconst queueFollowUp = session.queueFollowUp;\n\tconst sendMessage = session.sendMessage;\n\treturn {\n\t\tgetSessionId: () => {\n\t\t\tassertUsable();\n\t\t\treturn session.getSessionId();\n\t\t},\n\t\t...(options.allowRevision && getRevision\n\t\t\t? {\n\t\t\t\t\tgetRevision: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getRevision());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\tgetMessages: () => {\n\t\t\tassertUsable();\n\t\t\treturn detachedSnapshot(session.getMessages());\n\t\t},\n\t\tisIdle: () => {\n\t\t\tassertUsable();\n\t\t\treturn session.isIdle();\n\t\t},\n\t\tprompt: async (text) => {\n\t\t\tassertUsable();\n\t\t\treturn session.prompt(text);\n\t\t},\n\t\tabort: async () => {\n\t\t\tassertUsable();\n\t\t\tawait session.abort();\n\t\t},\n\t\twaitForIdle: async () => {\n\t\t\tassertUsable();\n\t\t\tawait session.waitForIdle();\n\t\t},\n\t\t...(session.compact\n\t\t\t? {\n\t\t\t\t\tcompact: async (customInstructions?: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn session.compact?.(customInstructions);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(session.navigateTree\n\t\t\t? {\n\t\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn session.navigateTree?.(targetId, options);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\tappendEntry: (customType, data) => {\n\t\t\tassertUsable();\n\t\t\treturn session.appendEntry(customType, data);\n\t\t},\n\t\t...(setSessionName\n\t\t\t? {\n\t\t\t\t\tsetSessionName: (name: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tsetSessionName(name);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getSessionName\n\t\t\t? {\n\t\t\t\t\tgetSessionName: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getSessionName();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setLabel\n\t\t\t? {\n\t\t\t\t\tsetLabel: (entryId: string, label: string | undefined) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn setLabel(entryId, label);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getLabel\n\t\t\t? {\n\t\t\t\t\tgetLabel: (entryId: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getLabel(entryId);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getActiveTools\n\t\t\t? {\n\t\t\t\t\tgetActiveTools: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getActiveTools();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setActiveTools\n\t\t\t? {\n\t\t\t\t\tsetActiveTools: (toolNames: string[]) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tsetActiveTools(toolNames);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// Tool parameters are TypeBox schemas carrying symbol values; detachedSnapshot's\n\t\t// structuredClone would throw DataCloneError, so the definition snapshot keeps\n\t\t// symbol values by reference instead.\n\t\t...(getAllTools\n\t\t\t? {\n\t\t\t\t\tgetAllTools: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn definitionSnapshot(getAllTools());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getCommands\n\t\t\t? {\n\t\t\t\t\tgetCommands: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getCommands());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// Model facts are plain data; detachedSnapshot's structuredClone is safe here.\n\t\t...(getModel\n\t\t\t? {\n\t\t\t\t\tgetModel: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getModel());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getScopedModels\n\t\t\t? {\n\t\t\t\t\tgetScopedModels: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getScopedModels());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getThinkingLevel\n\t\t\t? {\n\t\t\t\t\tgetThinkingLevel: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getThinkingLevel();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setThinkingLevel\n\t\t\t? {\n\t\t\t\t\tsetThinkingLevel: (level: ThinkingLevel) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tsetThinkingLevel(level);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setModel\n\t\t\t? {\n\t\t\t\t\tsetModel: async (modelId: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn setModel(modelId);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getSystemPrompt\n\t\t\t? {\n\t\t\t\t\tgetSystemPrompt: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getSystemPrompt();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getSystemPromptOptions\n\t\t\t? {\n\t\t\t\t\tgetSystemPromptOptions: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getSystemPromptOptions());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// ContextUsage 是纯数值投影事实;detachedSnapshot 让插件拿到的是冻结副本。\n\t\t...(getContextUsage\n\t\t\t? {\n\t\t\t\t\tgetContextUsage: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getContextUsage());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(steer\n\t\t\t? {\n\t\t\t\t\tsteer: async (text: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tawait steer(text);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(queueFollowUp\n\t\t\t? {\n\t\t\t\t\tqueueFollowUp: async (text: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tawait queueFollowUp(text);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// 逐字转发宿主 sendCustomMessage:不在此层发明校验或默认值。\n\t\t...(sendMessage\n\t\t\t? {\n\t\t\t\t\tsendMessage: async (\n\t\t\t\t\t\tmessage: { customType: string; content: SessionMessageContent; display: boolean },\n\t\t\t\t\t\toptions?: { triggerTurn?: boolean },\n\t\t\t\t\t) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tawait sendMessage(message, options);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\tgetBranchEntries: () => {\n\t\t\tassertUsable();\n\t\t\treturn detachedSnapshot(session.getBranchEntries());\n\t\t},\n\t\t...(options.allowExport && exportArtifact\n\t\t\t? {\n\t\t\t\t\texportArtifact: (request) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedExportArtifact(exportArtifact(request));\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nexport function guardedCredentials(credentials: CredentialAPI, assertUsable: () => void): CredentialAPI {\n\treturn {\n\t\tresolve: async (request) => {\n\t\t\tassertUsable();\n\t\t\tvalidateCredentialRequest(request);\n\t\t\tconst result = await credentials.resolve(request);\n\t\t\tassertUsable();\n\t\t\treturn result === undefined ? undefined : detachedSnapshot(result);\n\t\t},\n\t};\n}\n\n/**\n * Allowed host-resolved outcome shapes by status, per the frozen 1A.8\n * semantics of {@link InteractionOutcomeV1}.\n */\nconst HOST_INTERACTION_OUTCOME_KEYS: ReadonlyMap<string, readonly string[]> = new Map([\n\t[\"delivered\", [\"status\"]],\n\t[\"answered\", [\"status\", \"value\"]],\n\t[\"cancelled\", [\"status\"]],\n\t[\"timeout\", [\"status\"]],\n\t[\"unavailable\", [\"status\"]],\n]);\n\n/**\n * Validate a host-resolved interaction outcome before it crosses the plugin\n * boundary. The host side is app-owned, so a malformed result is a host bug:\n * it rejects the pending request() instead of silently passing broken data to\n * the plugin (previously any host-resolved value was accepted verbatim).\n * Beyond shape, the frozen production conditions are enforced: `timeout` is\n * only ever produced by `options.timeoutMs` (never by a host), and\n * `delivered` is only valid for notify-kind requests.\n */\nfunction validateHostInteractionOutcome(outcome: InteractionOutcomeV1, requestKind: string): void {\n\tif (!outcome || typeof outcome !== \"object\" || Array.isArray(outcome)) {\n\t\tthrow new Error(\"Interaction prompt outcome must be an object\");\n\t}\n\tconst record: Record<string, unknown> = outcome;\n\tconst status = record.status;\n\tif (typeof status !== \"string\" || !HOST_INTERACTION_OUTCOME_KEYS.has(status)) {\n\t\tthrow new Error(`Interaction prompt outcome has an unknown status: ${String(status)}`);\n\t}\n\tif (status === \"timeout\") {\n\t\tthrow new Error(\n\t\t\t\"Interaction prompt outcome timeout can only be produced by options.timeoutMs, never by the host\",\n\t\t);\n\t}\n\tif (status === \"delivered\" && requestKind !== \"notify\") {\n\t\tthrow new Error(\"Interaction prompt outcome delivered is only valid for notify requests\");\n\t}\n\tconst expectedKeys = HOST_INTERACTION_OUTCOME_KEYS.get(status) ?? [];\n\tconst unexpected = Object.keys(record).filter((key) => !expectedKeys.includes(key));\n\tif (unexpected.length > 0) {\n\t\tthrow new Error(`Interaction prompt outcome has unsupported fields: ${unexpected.join(\", \")}`);\n\t}\n\tif (status === \"answered\" && typeof record.value !== \"boolean\" && typeof record.value !== \"string\") {\n\t\tthrow new Error(\"Interaction prompt outcome answered requires a boolean or string value\");\n\t}\n}\n\n/**\n * Guard the host interaction surface for one plugin API. Requests and outcomes\n * cross the boundary as detached, deep-frozen snapshots, and every pending\n * request settles as \"cancelled\" when the wrapper's registration is disposed.\n * Cancellation is per request: `options.signal` aborts (and `timeoutMs`\n * expires) only the request that declared it — concurrent requests of the same\n * plugin are independent. Owner-level teardown (registration dispose) is the\n * only path that cancels all in-flight requests.\n */\nexport function guardedInteraction(\n\tinteraction: InteractionHostV1,\n\towner: string,\n\tassertUsable: () => void,\n\town: (registration: DisposableRegistration) => DisposableRegistration,\n): InteractionAPI {\n\tconst pendingControllers = new Set<AbortController>();\n\town(\n\t\tcreateDisposableRegistration(\n\t\t\t\"interaction\",\n\t\t\t() => {\n\t\t\t\tfor (const controller of pendingControllers) controller.abort();\n\t\t\t\tpendingControllers.clear();\n\t\t\t\treturn interaction.dispose?.();\n\t\t\t},\n\t\t\t`registration:${owner}:interaction`,\n\t\t),\n\t);\n\treturn {\n\t\tnotify: (request) => {\n\t\t\tassertUsable();\n\t\t\tvalidateInteractionNotifyRequest(request);\n\t\t\tinteraction.notify(detachedSnapshot(request));\n\t\t},\n\t\trequest: (request, options) => {\n\t\t\tassertUsable();\n\t\t\tvalidateInteractionRequest(request);\n\t\t\tvalidateInteractionTimeoutMs(options?.timeoutMs);\n\t\t\tconst externalSignal = options?.signal;\n\t\t\tif (externalSignal?.aborted) return Promise.resolve({ status: \"cancelled\" });\n\n\t\t\tconst hostRequest = detachedSnapshot(request);\n\t\t\tconst controller = new AbortController();\n\t\t\tpendingControllers.add(controller);\n\t\t\treturn new Promise<InteractionOutcomeV1>((resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\t\t\t\tconst onExternalAbort = (): void => {\n\t\t\t\t\t// Settle first so the internal-abort listener below cannot win the\n\t\t\t\t\t// race with \"cancelled\"; then propagate the abort so the host can\n\t\t\t\t\t// dismiss its dialog per its ctx.signal contract.\n\t\t\t\t\tsettle({ status: \"cancelled\" });\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t};\n\t\t\t\tconst onInternalAbort = (): void => settle({ status: \"cancelled\" });\n\t\t\t\tconst cleanup = (): void => {\n\t\t\t\t\tif (timeoutId !== undefined) clearTimeout(timeoutId);\n\t\t\t\t\texternalSignal?.removeEventListener(\"abort\", onExternalAbort);\n\t\t\t\t\tcontroller.signal.removeEventListener(\"abort\", onInternalAbort);\n\t\t\t\t\tpendingControllers.delete(controller);\n\t\t\t\t};\n\t\t\t\tconst settle = (outcome: InteractionOutcomeV1): void => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(outcome);\n\t\t\t\t};\n\t\t\t\texternalSignal?.addEventListener(\"abort\", onExternalAbort, { once: true });\n\t\t\t\tcontroller.signal.addEventListener(\"abort\", onInternalAbort, { once: true });\n\t\t\t\tif (options?.timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\t\tsettle({ status: \"timeout\" });\n\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t}, options.timeoutMs);\n\t\t\t\t}\n\t\t\t\tinteraction.prompt(hostRequest, { signal: controller.signal }).then(\n\t\t\t\t\t(outcome) => {\n\t\t\t\t\t\t// A late host result loses the race against local settlement\n\t\t\t\t\t\t// (external abort, timeout, revoke/dispose) and is discarded.\n\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// A host result delivered to a plainly revoked API (revoke\n\t\t\t\t\t\t\t// without disposal) is the sanctioned request() rejection.\n\t\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\t\t// A malformed host outcome fails the request visibly\n\t\t\t\t\t\t\t// instead of reaching the plugin.\n\t\t\t\t\t\t\tvalidateHostInteractionOutcome(outcome, hostRequest.kind);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve(detachedSnapshot(outcome));\n\t\t\t\t\t},\n\t\t\t\t\t() => settle({ status: \"unavailable\" }),\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function guardedOutput(output: OutputArtifactAPI, assertUsable: () => void): OutputArtifactAPI {\n\treturn {\n\t\tput: async (input, options) => {\n\t\t\tassertUsable();\n\t\t\tconst result = await output.put(input, options);\n\t\t\tassertUsable();\n\t\t\treturn result;\n\t\t},\n\t\tstat: async (ref) => {\n\t\t\tassertUsable();\n\t\t\tconst result = await output.stat(ref);\n\t\t\tassertUsable();\n\t\t\treturn result;\n\t\t},\n\t\tread: async (ref, options) => {\n\t\t\tassertUsable();\n\t\t\tconst result = await output.read(ref, options);\n\t\t\tassertUsable();\n\t\t\treturn result;\n\t\t},\n\t};\n}\n\n/**\n * Terminal-state classification for agent task runs (D-044 §5.2): an\n * AbortError thrown out of the adapter's run is treated as a cancelled\n * terminal outcome, not a failure, so an aborted child prompt is never\n * recorded as succeeded.\n */\nfunction isCancellationClassError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\n/** steer 结构化拒绝:带 code 的普通错误,调用方按码分支(未知任务/非运行态/无 steer 面)。 */\nfunction steerError(\n\tcode: \"subagent_message_too_large\" | \"subagent_not_running\" | \"subagent_steer_unsupported\",\n\tmessage: string,\n): Error {\n\treturn Object.assign(new Error(message), { code });\n}\n\nexport class RuntimeAgentTask implements AgentTaskHandle {\n\tpublic readonly id: string;\n\tpublic readonly parentSessionId: string;\n\tpublic readonly session: SessionAPI;\n\tprivate currentStatus: AgentTaskStatus = \"created\";\n\tprivate started = false;\n\tprivate disposed = false;\n\tprivate readonly controller = new AbortController();\n\tprivate runPromise: Promise<void> | undefined;\n\tprivate disposePromise: Promise<void> | undefined;\n\tprivate readonly request: AgentTaskCreateRequest;\n\tprivate readonly host: AgentTaskHost;\n\tprivate readonly assertApiUsable: () => void;\n\tprivate readonly agentResults: { readonly store: DurableServiceV1; readonly writerId: string } | undefined;\n\t/**\n\t * Runtime-owned release hook: the runtime keeps each task in its live-task\n\t * set and on the parent fence signal so runtime/plugin disposal can still\n\t * reach in-flight work. Both references must be dropped when the task itself\n\t * is disposed, otherwise every settled task keeps its host — and with it the\n\t * whole child session graph — reachable for the rest of the parent session.\n\t */\n\tprivate readonly releaseRuntimeReferences: (() => void) | undefined;\n\tprivate terminalResult: AgentTaskResultV1 | undefined;\n\n\tconstructor(\n\t\tid: string,\n\t\tparentSessionId: string,\n\t\trequest: AgentTaskCreateRequest,\n\t\thost: AgentTaskHost,\n\t\tassertApiUsable: () => void,\n\t\tallowRevision: boolean,\n\t\tagentResults?: { readonly store: DurableServiceV1; readonly writerId: string },\n\t\treleaseRuntimeReferences?: () => void,\n\t) {\n\t\tthis.id = id;\n\t\tthis.parentSessionId = parentSessionId;\n\t\tthis.request = request;\n\t\tthis.host = host;\n\t\tthis.assertApiUsable = assertApiUsable;\n\t\tthis.agentResults = agentResults;\n\t\tthis.releaseRuntimeReferences = releaseRuntimeReferences;\n\t\tthis.session = guardedSession(host.session, () => this.assertUsable(), {\n\t\t\tallowExport: host.session.exportArtifact !== undefined,\n\t\t\tallowRevision,\n\t\t});\n\t}\n\n\tstatus(): AgentTaskStatus {\n\t\tthis.assertUsable();\n\t\treturn this.currentStatus;\n\t}\n\n\t/**\n\t * 父→子引导(D-060 S4):向**运行中**的任务宿主会话投递一条有界引导消息,\n\t * 复用会话自身 steer 语义,不新增队列。未启动/已终态/宿主无 steer 面都以\n\t * 带 code 的错误拒绝(`subagent_not_running` / `subagent_steer_unsupported`)。\n\t */\n\tasync steer(text: string): Promise<void> {\n\t\tthis.assertUsable();\n\t\tif (text.length === 0 || new TextEncoder().encode(text).length > SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES) {\n\t\t\tthrow steerError(\n\t\t\t\t\"subagent_message_too_large\",\n\t\t\t\t`steer text must be 1..${SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES} utf-8 bytes`,\n\t\t\t);\n\t\t}\n\t\tif (!this.started || this.currentStatus !== \"running\") {\n\t\t\tthrow steerError(\"subagent_not_running\", `Agent task is not running: ${this.id}`);\n\t\t}\n\t\tconst steerFn = this.host.session.steer;\n\t\tif (typeof steerFn !== \"function\") {\n\t\t\tthrow steerError(\"subagent_steer_unsupported\", `Agent task host session exposes no steer: ${this.id}`);\n\t\t}\n\t\tawait steerFn.call(this.host.session, text);\n\t}\n\n\t/**\n\t * Run the task's prompt on the host adapter exactly once. Resolves when the\n\t * run settles succeeded or cancelled; rejects only on failure or when a\n\t * terminal outcome could not be persisted. An AbortError escaping\n\t * `host.run` is a cancelled terminal state (D-044 §5.2), not a failure.\n\t */\n\trun(): Promise<void> {\n\t\tthis.assertUsable();\n\t\tif (this.started || this.currentStatus !== \"created\") {\n\t\t\tthrow new Error(`Agent task can only run once: ${this.id}`);\n\t\t}\n\t\tthis.started = true;\n\t\tthis.currentStatus = \"running\";\n\t\tthis.runPromise = (async () => {\n\t\t\ttry {\n\t\t\t\tawait this.host.run(this.request.prompt, this.controller.signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (this.currentStatus === \"cancelled\") return;\n\t\t\t\tif (isCancellationClassError(error)) {\n\t\t\t\t\tthis.currentStatus = \"cancelled\";\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.settleTerminalResult(\"cancelled\");\n\t\t\t\t\t} catch (persistError) {\n\t\t\t\t\t\t// The task's own cancellation stays the primary rejection;\n\t\t\t\t\t\t// the replay-channel failure is attached as its cause instead\n\t\t\t\t\t\t// of shadowing it.\n\t\t\t\t\t\tif (error instanceof Error && !(\"cause\" in error)) {\n\t\t\t\t\t\t\t(error as { cause?: unknown }).cause = persistError;\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new Error(\"Agent task was cancelled and its result could not be persisted\", {\n\t\t\t\t\t\t\tcause: { task: error, persist: persistError },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.currentStatus = \"failed\";\n\t\t\t\ttry {\n\t\t\t\t\tawait this.settleTerminalResult(\"failed\");\n\t\t\t\t} catch (persistError) {\n\t\t\t\t\t// The task's own failure stays the primary rejection; the\n\t\t\t\t\t// replay-channel failure is attached as its cause instead of\n\t\t\t\t\t// shadowing it.\n\t\t\t\t\tif (error instanceof Error && !(\"cause\" in error)) {\n\t\t\t\t\t\t(error as { cause?: unknown }).cause = persistError;\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(\"Agent task failed and its result could not be persisted\", {\n\t\t\t\t\t\tcause: { task: error, persist: persistError },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (this.currentStatus === \"running\") {\n\t\t\t\tthis.currentStatus = \"succeeded\";\n\t\t\t\tawait this.settleTerminalResult(\"succeeded\");\n\t\t\t}\n\t\t})();\n\t\tvoid this.runPromise.catch(() => {});\n\t\treturn this.runPromise;\n\t}\n\n\twait(options?: { signal?: AbortSignal }): Promise<AgentTaskWaitResult> {\n\t\tthis.assertUsable();\n\t\tif (this.currentStatus === \"created\") throw new Error(`Agent task has not been started: ${this.id}`);\n\t\tconst completion = this.runPromise ?? Promise.resolve();\n\t\tconst result = completion.then(() => ({\n\t\t\tsessionId: this.host.session.getSessionId(),\n\t\t\tmessages: this.host.session.getMessages(),\n\t\t}));\n\t\tconst signal = options?.signal;\n\t\tif (!signal) return result;\n\t\tif (signal.aborted) return Promise.reject(cancellationError(signal.reason));\n\t\treturn Promise.race([\n\t\t\tresult,\n\t\t\tnew Promise<AgentTaskWaitResult>((_resolve, reject) => {\n\t\t\t\tsignal.addEventListener(\"abort\", () => reject(cancellationError(signal.reason)), { once: true });\n\t\t\t}),\n\t\t]);\n\t}\n\n\tasync cancel(reason = \"cancelled\"): Promise<void> {\n\t\tthis.assertUsable();\n\t\tif (this.currentStatus === \"succeeded\" || this.currentStatus === \"failed\" || this.currentStatus === \"cancelled\") {\n\t\t\treturn;\n\t\t}\n\t\tthis.currentStatus = \"cancelled\";\n\t\tthis.controller.abort(reason);\n\t\tawait this.host.cancel(reason);\n\t\tawait this.settleTerminalResult(\"cancelled\");\n\t}\n\n\tdispose(): Promise<void> {\n\t\tthis.disposePromise ??= (async () => {\n\t\t\tthis.disposed = true;\n\t\t\ttry {\n\t\t\t\tif (this.currentStatus === \"created\" || this.currentStatus === \"running\") {\n\t\t\t\t\tthis.currentStatus = \"cancelled\";\n\t\t\t\t\tthis.controller.abort(\"agent task disposed\");\n\t\t\t\t\t// The terminal record captures the session messages before the\n\t\t\t\t\t// adapter disposes them; a settle after host.dispose() could read\n\t\t\t\t\t// already-released session state.\n\t\t\t\t\tawait this.settleTerminalResult(\"cancelled\");\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.host.cancel(\"agent task disposed\");\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tawait this.host.dispose();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait this.host.dispose();\n\t\t\t} finally {\n\t\t\t\t// Also on a failing host disposal: a disposed task must not stay\n\t\t\t\t// reachable from the runtime's live-task set or the parent fence.\n\t\t\t\tthis.releaseRuntimeReferences?.();\n\t\t\t}\n\t\t})();\n\t\treturn this.disposePromise;\n\t}\n\n\tresult(): AgentTaskResultV1 | undefined {\n\t\t// Replay read: no liveness assertion, the frozen terminal outcome\n\t\t// stays readable after dispose.\n\t\treturn this.terminalResult;\n\t}\n\n\t/**\n\t * Capture the frozen terminal outcome at settle: the record is detached and\n\t * deep-frozen so the replay read survives dispose and shares no identity\n\t * with live session state. When a durable replay channel is configured, the\n\t * record is persisted under the deterministic artifact id\n\t * `agent-task:<taskId>`; a persist failure propagates verbatim from the\n\t * originating settle call (run/cancel/dispose) without affecting the\n\t * already-captured in-memory result.\n\t */\n\tprivate async settleTerminalResult(status: AgentTaskStatus): Promise<void> {\n\t\t// detachedSnapshot deep-clones and recursively freezes; the session\n\t\t// snapshot in public-api.ts clones without freezing, so the frozen\n\t\t// terminal outcome requires this projection.\n\t\tconst record = detachedSnapshot({\n\t\t\ttaskId: this.id,\n\t\t\tparentSessionId: this.parentSessionId,\n\t\t\tstatus,\n\t\t\tsessionId: this.host.session.getSessionId(),\n\t\t\tmessages: this.host.session.getMessages(),\n\t\t} as AgentTaskResultV1);\n\t\tthis.terminalResult = record;\n\t\tif (!this.agentResults) return;\n\t\tawait this.agentResults.store.persistArtifact({\n\t\t\twriterId: this.agentResults.writerId,\n\t\t\tartifactId: `agent-task:${this.id}`,\n\t\t\tsessionId: this.parentSessionId,\n\t\t\tdata: record,\n\t\t});\n\t}\n\n\tprivate assertUsable(): void {\n\t\tthis.assertApiUsable();\n\t\tif (this.disposed) throw new Error(`Agent task handle is disposed: ${this.id}`);\n\t}\n}\n\n/**\n * Normalize a capability tool's execute outcome into an AgentToolResult shape.\n *\n * Capability tools execute to plain domain objects ({memoryId, kind, ...}); the\n * agent core's tool-result message reads `result.content` and would surface an\n * empty result to the model. Strings become the text directly, objects without\n * a content array are serialized as stable pretty JSON, results that already\n * carry a content array pass through untouched, and undefined/null keep the\n * existing empty-content normalization the agent core performs.\n */\nexport function normalizeCapabilityToolResult(result: unknown): unknown {\n\tif (result === undefined || result === null) return result;\n\tif (typeof result === \"string\") {\n\t\treturn { content: [{ type: \"text\", text: result }], details: {} };\n\t}\n\tif (typeof result === \"object\" && Array.isArray((result as { content?: unknown }).content)) return result;\n\treturn { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }], details: {} };\n}\n\n/**\n * Wrap a listed tool definition's execute with {@link normalizeCapabilityToolResult}.\n *\n * listTools() is the only face the model-facing chain reads (the session's\n * capability tool registry), so wrapping here fixes the model result surface\n * for every capability tool at one point while runtime.invokeTool keeps\n * returning raw values to deterministic callers. The wrapper forwards all\n * arguments and propagates rejections untouched (the agent core already maps\n * thrown errors to error tool results).\n */\nexport function withNormalizedToolResultExecute(definition: unknown): unknown {\n\tif (!definition || typeof definition !== \"object\") return definition;\n\tconst execute = (definition as { execute?: unknown }).execute;\n\tif (typeof execute !== \"function\") return definition;\n\tconst run = execute as (...args: unknown[]) => unknown;\n\tconst wrapped = (...args: unknown[]): unknown => {\n\t\tconst outcome = run(...args);\n\t\tif (outcome instanceof Promise) return outcome.then(normalizeCapabilityToolResult);\n\t\treturn normalizeCapabilityToolResult(outcome);\n\t};\n\treturn Object.freeze({ ...(definition as Record<string, unknown>), execute: wrapped });\n}\n\nexport function guardedComposition(\n\tcomposition: AgentCompositionAPI,\n\tassertUsable: () => void,\n\ttrackInstance: (instance: AgentInstance) => void,\n\ttrackDefinition: (definition: AgentDefinition) => void,\n\thostPrimitivesFactory: AgentHostPrimitivesFactory,\n\tlifecycleDispatcher: AgentCompositionLifecycleDispatcher,\n\tmanifest: PluginManifest,\n): AgentCompositionAPI {\n\tconst declaredAgent = (id: string, version: number, role?: string): void => {\n\t\tconst declaration = manifest.agents?.find(\n\t\t\t(agent) => agent.id === id && agent.version === version && (role === undefined || agent.role === role),\n\t\t);\n\t\tif (!declaration) throw new Error(`Agent definition must be declared by plugin manifest: ${id}@${version}`);\n\t};\n\tconst assertOwnedDefinition = (definition: AgentDefinition): void => {\n\t\tdeclaredAgent(definition.id, definition.version, definition.role);\n\t\tif (definition.owner !== undefined && definition.owner !== manifest.id) {\n\t\t\tthrow new Error(`Agent definition owner must match plugin manifest: ${manifest.id}`);\n\t\t}\n\t};\n\tconst assertOwnedParent = (parentInstanceId: string | undefined): void => {\n\t\tif (parentInstanceId === undefined) return;\n\t\tconst parent = composition.listInstances().find((instance) => instance.id === parentInstanceId);\n\t\tif (!parent) return;\n\t\tconst definition = composition.get(parent.definitionId, parent.definitionVersion);\n\t\tif (definition.owner !== undefined && definition.owner !== manifest.id) {\n\t\t\tthrow new Error(`Parent Agent instance must belong to plugin manifest: ${parentInstanceId}`);\n\t\t}\n\t\tassertOwnedDefinition(definition);\n\t};\n\treturn Object.freeze({\n\t\tdefine: <TInput = unknown, TResult = unknown>(definition: AgentDefinition<TInput, TResult>) => {\n\t\t\tassertUsable();\n\t\t\tassertOwnedDefinition(definition);\n\t\t\tconst registered = composition.define({ ...definition, owner: manifest.id });\n\t\t\ttrackDefinition(registered);\n\t\t\treturn registered;\n\t\t},\n\t\tget: <TInput = unknown, TResult = unknown>(id: string, version: number) => {\n\t\t\tassertUsable();\n\t\t\tdeclaredAgent(id, version);\n\t\t\tconst definition = composition.get<TInput, TResult>(id, version);\n\t\t\tassertOwnedDefinition(definition);\n\t\t\treturn definition;\n\t\t},\n\t\tcreate: <TInput = unknown, TResult = unknown>(\n\t\t\tdefinition: AgentDefinition<TInput, TResult> | { id: string; version: number },\n\t\t\toptions?: { id?: string; parentInstanceId?: string },\n\t\t) => {\n\t\t\tassertUsable();\n\t\t\tif (\"run\" in definition) {\n\t\t\t\tassertOwnedDefinition(definition);\n\t\t\t} else {\n\t\t\t\tdeclaredAgent(definition.id, definition.version);\n\t\t\t\tassertOwnedDefinition(composition.get(definition.id, definition.version));\n\t\t\t}\n\t\t\tassertOwnedParent(options?.parentInstanceId);\n\t\t\tconst scopedBinding = composition as Partial<AgentCompositionScopedHostBinding> & {\n\t\t\t\tcreateWithHostPrimitives?: <TInput = unknown, TResult = unknown>(\n\t\t\t\t\tdefinition: AgentDefinition<TInput, TResult> | { id: string; version: number },\n\t\t\t\t\toptions: { id?: string; parentInstanceId?: string } | undefined,\n\t\t\t\t\thostPrimitivesFactory: AgentHostPrimitivesFactory,\n\t\t\t\t\tlifecycleDispatcher?: AgentCompositionLifecycleDispatcher,\n\t\t\t\t) => AgentInstance<TInput, TResult>;\n\t\t\t};\n\t\t\tif (!scopedBinding.createWithHostPrimitives) {\n\t\t\t\tthrow new Error(\"Agent composition runtime does not support owner-scoped host primitives\");\n\t\t\t}\n\t\t\tconst instance = scopedBinding.createWithHostPrimitives<TInput, TResult>(\n\t\t\t\tdefinition,\n\t\t\t\toptions,\n\t\t\t\thostPrimitivesFactory,\n\t\t\t\tlifecycleDispatcher,\n\t\t\t);\n\t\t\tconst guarded = Object.freeze({\n\t\t\t\tid: instance.id,\n\t\t\t\tdefinition: instance.definition,\n\t\t\t\tsnapshot: () => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.snapshot();\n\t\t\t\t},\n\t\t\t\tacquireControllerLease: (owner?: string) => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.acquireControllerLease(owner);\n\t\t\t\t},\n\t\t\t\trun: (input: TInput, runOptions?: { lease?: AgentControllerLease; signal?: AbortSignal }) => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.run(input, runOptions);\n\t\t\t\t},\n\t\t\t\twait: () => instance.wait(),\n\t\t\t\tcancel: (reason?: string) => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.cancel(reason);\n\t\t\t\t},\n\t\t\t\tdispose: () => instance.dispose(),\n\t\t\t}) as AgentInstance<TInput, TResult>;\n\t\t\ttrackInstance(guarded);\n\t\t\treturn guarded;\n\t\t},\n\t\tlistInstances: () => {\n\t\t\tassertUsable();\n\t\t\treturn composition.listInstances().filter((instance) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn composition.get(instance.definitionId, instance.definitionVersion).owner === manifest.id;\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t}) satisfies AgentCompositionAPI;\n}\n"]}
1
+ {"version":3,"file":"capability-runtime-guards.d.ts","sourceRoot":"","sources":["../../../src/core/extensions/capability-runtime-guards.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ThinkingLevel } from \"@agent-forge/agent-core\";\nimport { SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES } from \"@agent-forge/protocol/subagent\";\nimport type { DurableServiceV1 } from \"../../durable/durable-service.ts\";\nimport { t } from \"../i18n/index.ts\";\nimport type { AgentCompositionLifecycleDispatcher } from \"./agent-composition.ts\";\nimport { cancellationError } from \"./capability-runtime-operation.ts\";\nimport { definitionSnapshot, detachedSnapshot } from \"./capability-runtime-snapshot.ts\";\nimport {\n\tvalidateCredentialRequest,\n\tvalidateInteractionNotifyRequest,\n\tvalidateInteractionRequest,\n\tvalidateInteractionTimeoutMs,\n} from \"./capability-runtime-validation.ts\";\nimport {\n\ttype AgentCompositionAPI,\n\ttype AgentCompositionScopedHostBinding,\n\ttype AgentControllerLease,\n\ttype AgentDefinition,\n\ttype AgentHostPrimitivesFactory,\n\ttype AgentInstance,\n\ttype AgentTaskCreateRequest,\n\ttype AgentTaskHandle,\n\ttype AgentTaskHost,\n\ttype AgentTaskResultV1,\n\ttype AgentTaskStatus,\n\ttype AgentTaskWaitResult,\n\ttype CredentialAPI,\n\tcreateDisposableRegistration,\n\ttype DisposableRegistration,\n\ttype InteractionAPI,\n\ttype InteractionHostV1,\n\ttype InteractionOutcomeV1,\n\ttype OutputArtifactAPI,\n\ttype PluginManifest,\n\ttype SessionAPI,\n\ttype SessionExportArtifact,\n\ttype SessionMessageContent,\n} from \"./public-api.ts\";\n\nexport function guardedSession(\n\tsession: SessionAPI,\n\tassertUsable: () => void,\n\toptions: { allowExport: boolean; allowRevision: boolean },\n): SessionAPI {\n\tconst detachedExportArtifact = (artifact: SessionExportArtifact): SessionExportArtifact => ({\n\t\t...detachedSnapshot(artifact),\n\t\tbytes: new Uint8Array(artifact.bytes),\n\t});\n\tconst exportArtifact = session.exportArtifact;\n\tconst getRevision = session.getRevision;\n\tconst setSessionName = session.setSessionName;\n\tconst getSessionName = session.getSessionName;\n\tconst setLabel = session.setLabel;\n\tconst getLabel = session.getLabel;\n\tconst getActiveTools = session.getActiveTools;\n\tconst setActiveTools = session.setActiveTools;\n\tconst getAllTools = session.getAllTools;\n\tconst getCommands = session.getCommands;\n\tconst getModel = session.getModel;\n\tconst getScopedModels = session.getScopedModels;\n\tconst getThinkingLevel = session.getThinkingLevel;\n\tconst setThinkingLevel = session.setThinkingLevel;\n\tconst setModel = session.setModel;\n\tconst getSystemPrompt = session.getSystemPrompt;\n\tconst getSystemPromptOptions = session.getSystemPromptOptions;\n\tconst getContextUsage = session.getContextUsage;\n\tconst steer = session.steer;\n\tconst queueFollowUp = session.queueFollowUp;\n\tconst sendMessage = session.sendMessage;\n\treturn {\n\t\tgetSessionId: () => {\n\t\t\tassertUsable();\n\t\t\treturn session.getSessionId();\n\t\t},\n\t\t...(options.allowRevision && getRevision\n\t\t\t? {\n\t\t\t\t\tgetRevision: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getRevision());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\tgetMessages: () => {\n\t\t\tassertUsable();\n\t\t\treturn detachedSnapshot(session.getMessages());\n\t\t},\n\t\tisIdle: () => {\n\t\t\tassertUsable();\n\t\t\treturn session.isIdle();\n\t\t},\n\t\tprompt: async (text) => {\n\t\t\tassertUsable();\n\t\t\treturn session.prompt(text);\n\t\t},\n\t\tabort: async () => {\n\t\t\tassertUsable();\n\t\t\tawait session.abort();\n\t\t},\n\t\twaitForIdle: async () => {\n\t\t\tassertUsable();\n\t\t\tawait session.waitForIdle();\n\t\t},\n\t\t...(session.compact\n\t\t\t? {\n\t\t\t\t\tcompact: async (customInstructions?: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn session.compact?.(customInstructions);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(session.navigateTree\n\t\t\t? {\n\t\t\t\t\tnavigateTree: async (targetId, options) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn session.navigateTree?.(targetId, options);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\tappendEntry: (customType, data) => {\n\t\t\tassertUsable();\n\t\t\treturn session.appendEntry(customType, data);\n\t\t},\n\t\t...(setSessionName\n\t\t\t? {\n\t\t\t\t\tsetSessionName: (name: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tsetSessionName(name);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getSessionName\n\t\t\t? {\n\t\t\t\t\tgetSessionName: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getSessionName();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setLabel\n\t\t\t? {\n\t\t\t\t\tsetLabel: (entryId: string, label: string | undefined) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn setLabel(entryId, label);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getLabel\n\t\t\t? {\n\t\t\t\t\tgetLabel: (entryId: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getLabel(entryId);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getActiveTools\n\t\t\t? {\n\t\t\t\t\tgetActiveTools: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getActiveTools();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setActiveTools\n\t\t\t? {\n\t\t\t\t\tsetActiveTools: (toolNames: string[]) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tsetActiveTools(toolNames);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// Tool parameters are TypeBox schemas carrying symbol values; detachedSnapshot's\n\t\t// structuredClone would throw DataCloneError, so the definition snapshot keeps\n\t\t// symbol values by reference instead.\n\t\t...(getAllTools\n\t\t\t? {\n\t\t\t\t\tgetAllTools: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn definitionSnapshot(getAllTools());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getCommands\n\t\t\t? {\n\t\t\t\t\tgetCommands: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getCommands());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// Model facts are plain data; detachedSnapshot's structuredClone is safe here.\n\t\t...(getModel\n\t\t\t? {\n\t\t\t\t\tgetModel: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getModel());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getScopedModels\n\t\t\t? {\n\t\t\t\t\tgetScopedModels: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getScopedModels());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getThinkingLevel\n\t\t\t? {\n\t\t\t\t\tgetThinkingLevel: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getThinkingLevel();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setThinkingLevel\n\t\t\t? {\n\t\t\t\t\tsetThinkingLevel: (level: ThinkingLevel) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tsetThinkingLevel(level);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(setModel\n\t\t\t? {\n\t\t\t\t\tsetModel: async (modelId: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn setModel(modelId);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getSystemPrompt\n\t\t\t? {\n\t\t\t\t\tgetSystemPrompt: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn getSystemPrompt();\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(getSystemPromptOptions\n\t\t\t? {\n\t\t\t\t\tgetSystemPromptOptions: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getSystemPromptOptions());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// ContextUsage 是纯数值投影事实;detachedSnapshot 让插件拿到的是冻结副本。\n\t\t...(getContextUsage\n\t\t\t? {\n\t\t\t\t\tgetContextUsage: () => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedSnapshot(getContextUsage());\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(steer\n\t\t\t? {\n\t\t\t\t\tsteer: async (text: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tawait steer(text);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t...(queueFollowUp\n\t\t\t? {\n\t\t\t\t\tqueueFollowUp: async (text: string) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tawait queueFollowUp(text);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\t// 逐字转发宿主 sendCustomMessage:不在此层发明校验或默认值。\n\t\t...(sendMessage\n\t\t\t? {\n\t\t\t\t\tsendMessage: async (\n\t\t\t\t\t\tmessage: { customType: string; content: SessionMessageContent; display: boolean },\n\t\t\t\t\t\toptions?: { triggerTurn?: boolean },\n\t\t\t\t\t) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\tawait sendMessage(message, options);\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t\tgetBranchEntries: () => {\n\t\t\tassertUsable();\n\t\t\treturn detachedSnapshot(session.getBranchEntries());\n\t\t},\n\t\t...(options.allowExport && exportArtifact\n\t\t\t? {\n\t\t\t\t\texportArtifact: (request) => {\n\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\treturn detachedExportArtifact(exportArtifact(request));\n\t\t\t\t\t},\n\t\t\t\t}\n\t\t\t: {}),\n\t};\n}\n\nexport function guardedCredentials(credentials: CredentialAPI, assertUsable: () => void): CredentialAPI {\n\treturn {\n\t\tresolve: async (request) => {\n\t\t\tassertUsable();\n\t\t\tvalidateCredentialRequest(request);\n\t\t\tconst result = await credentials.resolve(request);\n\t\t\tassertUsable();\n\t\t\treturn result === undefined ? undefined : detachedSnapshot(result);\n\t\t},\n\t};\n}\n\n/**\n * Allowed host-resolved outcome shapes by status, per the frozen 1A.8\n * semantics of {@link InteractionOutcomeV1}.\n */\nconst HOST_INTERACTION_OUTCOME_KEYS: ReadonlyMap<string, readonly string[]> = new Map([\n\t[\"delivered\", [\"status\"]],\n\t[\"answered\", [\"status\", \"value\"]],\n\t[\"cancelled\", [\"status\"]],\n\t[\"timeout\", [\"status\"]],\n\t[\"unavailable\", [\"status\"]],\n]);\n\n/**\n * Validate a host-resolved interaction outcome before it crosses the plugin\n * boundary. The host side is app-owned, so a malformed result is a host bug:\n * it rejects the pending request() instead of silently passing broken data to\n * the plugin (previously any host-resolved value was accepted verbatim).\n * Beyond shape, the frozen production conditions are enforced: `timeout` is\n * only ever produced by `options.timeoutMs` (never by a host), and\n * `delivered` is only valid for notify-kind requests.\n */\nfunction validateHostInteractionOutcome(outcome: InteractionOutcomeV1, requestKind: string): void {\n\tif (!outcome || typeof outcome !== \"object\" || Array.isArray(outcome)) {\n\t\tthrow new Error(t(\"Interaction prompt outcome must be an object\"));\n\t}\n\tconst record: Record<string, unknown> = outcome;\n\tconst status = record.status;\n\tif (typeof status !== \"string\" || !HOST_INTERACTION_OUTCOME_KEYS.has(status)) {\n\t\tthrow new Error(t(\"Interaction prompt outcome has an unknown status: {value}\", { value: String(status) }));\n\t}\n\tif (status === \"timeout\") {\n\t\tthrow new Error(\n\t\t\tt(\"Interaction prompt outcome timeout can only be produced by options.timeoutMs, never by the host\"),\n\t\t);\n\t}\n\tif (status === \"delivered\" && requestKind !== \"notify\") {\n\t\tthrow new Error(t(\"Interaction prompt outcome delivered is only valid for notify requests\"));\n\t}\n\tconst expectedKeys = HOST_INTERACTION_OUTCOME_KEYS.get(status) ?? [];\n\tconst unexpected = Object.keys(record).filter((key) => !expectedKeys.includes(key));\n\tif (unexpected.length > 0) {\n\t\tthrow new Error(\n\t\t\tt(\"Interaction prompt outcome has unsupported fields: {value}\", { value: unexpected.join(\", \") }),\n\t\t);\n\t}\n\tif (status === \"answered\" && typeof record.value !== \"boolean\" && typeof record.value !== \"string\") {\n\t\tthrow new Error(t(\"Interaction prompt outcome answered requires a boolean or string value\"));\n\t}\n}\n\n/**\n * Guard the host interaction surface for one plugin API. Requests and outcomes\n * cross the boundary as detached, deep-frozen snapshots, and every pending\n * request settles as \"cancelled\" when the wrapper's registration is disposed.\n * Cancellation is per request: `options.signal` aborts (and `timeoutMs`\n * expires) only the request that declared it — concurrent requests of the same\n * plugin are independent. Owner-level teardown (registration dispose) is the\n * only path that cancels all in-flight requests.\n */\nexport function guardedInteraction(\n\tinteraction: InteractionHostV1,\n\towner: string,\n\tassertUsable: () => void,\n\town: (registration: DisposableRegistration) => DisposableRegistration,\n): InteractionAPI {\n\tconst pendingControllers = new Set<AbortController>();\n\town(\n\t\tcreateDisposableRegistration(\n\t\t\t\"interaction\",\n\t\t\t() => {\n\t\t\t\tfor (const controller of pendingControllers) controller.abort();\n\t\t\t\tpendingControllers.clear();\n\t\t\t\treturn interaction.dispose?.();\n\t\t\t},\n\t\t\t`registration:${owner}:interaction`,\n\t\t),\n\t);\n\treturn {\n\t\tnotify: (request) => {\n\t\t\tassertUsable();\n\t\t\tvalidateInteractionNotifyRequest(request);\n\t\t\tinteraction.notify(detachedSnapshot(request));\n\t\t},\n\t\trequest: (request, options) => {\n\t\t\tassertUsable();\n\t\t\tvalidateInteractionRequest(request);\n\t\t\tvalidateInteractionTimeoutMs(options?.timeoutMs);\n\t\t\tconst externalSignal = options?.signal;\n\t\t\tif (externalSignal?.aborted) return Promise.resolve({ status: \"cancelled\" });\n\n\t\t\tconst hostRequest = detachedSnapshot(request);\n\t\t\tconst controller = new AbortController();\n\t\t\tpendingControllers.add(controller);\n\t\t\treturn new Promise<InteractionOutcomeV1>((resolve, reject) => {\n\t\t\t\tlet settled = false;\n\t\t\t\tlet timeoutId: ReturnType<typeof setTimeout> | undefined;\n\t\t\t\tconst onExternalAbort = (): void => {\n\t\t\t\t\t// Settle first so the internal-abort listener below cannot win the\n\t\t\t\t\t// race with \"cancelled\"; then propagate the abort so the host can\n\t\t\t\t\t// dismiss its dialog per its ctx.signal contract.\n\t\t\t\t\tsettle({ status: \"cancelled\" });\n\t\t\t\t\tcontroller.abort();\n\t\t\t\t};\n\t\t\t\tconst onInternalAbort = (): void => settle({ status: \"cancelled\" });\n\t\t\t\tconst cleanup = (): void => {\n\t\t\t\t\tif (timeoutId !== undefined) clearTimeout(timeoutId);\n\t\t\t\t\texternalSignal?.removeEventListener(\"abort\", onExternalAbort);\n\t\t\t\t\tcontroller.signal.removeEventListener(\"abort\", onInternalAbort);\n\t\t\t\t\tpendingControllers.delete(controller);\n\t\t\t\t};\n\t\t\t\tconst settle = (outcome: InteractionOutcomeV1): void => {\n\t\t\t\t\tif (settled) return;\n\t\t\t\t\tsettled = true;\n\t\t\t\t\tcleanup();\n\t\t\t\t\tresolve(outcome);\n\t\t\t\t};\n\t\t\t\texternalSignal?.addEventListener(\"abort\", onExternalAbort, { once: true });\n\t\t\t\tcontroller.signal.addEventListener(\"abort\", onInternalAbort, { once: true });\n\t\t\t\tif (options?.timeoutMs !== undefined) {\n\t\t\t\t\ttimeoutId = setTimeout(() => {\n\t\t\t\t\t\tsettle({ status: \"timeout\" });\n\t\t\t\t\t\tcontroller.abort();\n\t\t\t\t\t}, options.timeoutMs);\n\t\t\t\t}\n\t\t\t\tinteraction.prompt(hostRequest, { signal: controller.signal }).then(\n\t\t\t\t\t(outcome) => {\n\t\t\t\t\t\t// A late host result loses the race against local settlement\n\t\t\t\t\t\t// (external abort, timeout, revoke/dispose) and is discarded.\n\t\t\t\t\t\tif (settled) return;\n\t\t\t\t\t\tsettled = true;\n\t\t\t\t\t\tcleanup();\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t// A host result delivered to a plainly revoked API (revoke\n\t\t\t\t\t\t\t// without disposal) is the sanctioned request() rejection.\n\t\t\t\t\t\t\tassertUsable();\n\t\t\t\t\t\t\t// A malformed host outcome fails the request visibly\n\t\t\t\t\t\t\t// instead of reaching the plugin.\n\t\t\t\t\t\t\tvalidateHostInteractionOutcome(outcome, hostRequest.kind);\n\t\t\t\t\t\t} catch (error) {\n\t\t\t\t\t\t\treject(error);\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve(detachedSnapshot(outcome));\n\t\t\t\t\t},\n\t\t\t\t\t() => settle({ status: \"unavailable\" }),\n\t\t\t\t);\n\t\t\t});\n\t\t},\n\t};\n}\n\nexport function guardedOutput(output: OutputArtifactAPI, assertUsable: () => void): OutputArtifactAPI {\n\treturn {\n\t\tput: async (input, options) => {\n\t\t\tassertUsable();\n\t\t\tconst result = await output.put(input, options);\n\t\t\tassertUsable();\n\t\t\treturn result;\n\t\t},\n\t\tstat: async (ref) => {\n\t\t\tassertUsable();\n\t\t\tconst result = await output.stat(ref);\n\t\t\tassertUsable();\n\t\t\treturn result;\n\t\t},\n\t\tread: async (ref, options) => {\n\t\t\tassertUsable();\n\t\t\tconst result = await output.read(ref, options);\n\t\t\tassertUsable();\n\t\t\treturn result;\n\t\t},\n\t};\n}\n\n/**\n * Terminal-state classification for agent task runs (D-044 §5.2): an\n * AbortError thrown out of the adapter's run is treated as a cancelled\n * terminal outcome, not a failure, so an aborted child prompt is never\n * recorded as succeeded.\n */\nfunction isCancellationClassError(error: unknown): boolean {\n\treturn error instanceof Error && error.name === \"AbortError\";\n}\n\n/** steer 结构化拒绝:带 code 的普通错误,调用方按码分支(未知任务/非运行态/无 steer 面)。 */\nfunction steerError(\n\tcode: \"subagent_message_too_large\" | \"subagent_not_running\" | \"subagent_steer_unsupported\",\n\tmessage: string,\n): Error {\n\treturn Object.assign(new Error(message), { code });\n}\n\nexport class RuntimeAgentTask implements AgentTaskHandle {\n\tpublic readonly id: string;\n\tpublic readonly parentSessionId: string;\n\tpublic readonly session: SessionAPI;\n\tprivate currentStatus: AgentTaskStatus = \"created\";\n\tprivate started = false;\n\tprivate disposed = false;\n\tprivate readonly controller = new AbortController();\n\tprivate runPromise: Promise<void> | undefined;\n\tprivate disposePromise: Promise<void> | undefined;\n\tprivate readonly request: AgentTaskCreateRequest;\n\tprivate readonly host: AgentTaskHost;\n\tprivate readonly assertApiUsable: () => void;\n\tprivate readonly agentResults: { readonly store: DurableServiceV1; readonly writerId: string } | undefined;\n\t/**\n\t * Runtime-owned release hook: the runtime keeps each task in its live-task\n\t * set and on the parent fence signal so runtime/plugin disposal can still\n\t * reach in-flight work. Both references must be dropped when the task itself\n\t * is disposed, otherwise every settled task keeps its host — and with it the\n\t * whole child session graph — reachable for the rest of the parent session.\n\t */\n\tprivate readonly releaseRuntimeReferences: (() => void) | undefined;\n\tprivate terminalResult: AgentTaskResultV1 | undefined;\n\n\tconstructor(\n\t\tid: string,\n\t\tparentSessionId: string,\n\t\trequest: AgentTaskCreateRequest,\n\t\thost: AgentTaskHost,\n\t\tassertApiUsable: () => void,\n\t\tallowRevision: boolean,\n\t\tagentResults?: { readonly store: DurableServiceV1; readonly writerId: string },\n\t\treleaseRuntimeReferences?: () => void,\n\t) {\n\t\tthis.id = id;\n\t\tthis.parentSessionId = parentSessionId;\n\t\tthis.request = request;\n\t\tthis.host = host;\n\t\tthis.assertApiUsable = assertApiUsable;\n\t\tthis.agentResults = agentResults;\n\t\tthis.releaseRuntimeReferences = releaseRuntimeReferences;\n\t\tthis.session = guardedSession(host.session, () => this.assertUsable(), {\n\t\t\tallowExport: host.session.exportArtifact !== undefined,\n\t\t\tallowRevision,\n\t\t});\n\t}\n\n\tstatus(): AgentTaskStatus {\n\t\tthis.assertUsable();\n\t\treturn this.currentStatus;\n\t}\n\n\t/**\n\t * 父→子引导(D-060 S4):向**运行中**的任务宿主会话投递一条有界引导消息,\n\t * 复用会话自身 steer 语义,不新增队列。未启动/已终态/宿主无 steer 面都以\n\t * 带 code 的错误拒绝(`subagent_not_running` / `subagent_steer_unsupported`)。\n\t */\n\tasync steer(text: string): Promise<void> {\n\t\tthis.assertUsable();\n\t\tif (text.length === 0 || new TextEncoder().encode(text).length > SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES) {\n\t\t\tthrow steerError(\n\t\t\t\t\"subagent_message_too_large\",\n\t\t\t\t`steer text must be 1..${SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES} utf-8 bytes`,\n\t\t\t);\n\t\t}\n\t\tif (!this.started || this.currentStatus !== \"running\") {\n\t\t\tthrow steerError(\"subagent_not_running\", `Agent task is not running: ${this.id}`);\n\t\t}\n\t\tconst steerFn = this.host.session.steer;\n\t\tif (typeof steerFn !== \"function\") {\n\t\t\tthrow steerError(\"subagent_steer_unsupported\", `Agent task host session exposes no steer: ${this.id}`);\n\t\t}\n\t\tawait steerFn.call(this.host.session, text);\n\t}\n\n\t/**\n\t * Run the task's prompt on the host adapter exactly once. Resolves when the\n\t * run settles succeeded or cancelled; rejects only on failure or when a\n\t * terminal outcome could not be persisted. An AbortError escaping\n\t * `host.run` is a cancelled terminal state (D-044 §5.2), not a failure.\n\t */\n\trun(): Promise<void> {\n\t\tthis.assertUsable();\n\t\tif (this.started || this.currentStatus !== \"created\") {\n\t\t\tthrow new Error(t(\"Agent task can only run once: {id}\", { id: this.id }));\n\t\t}\n\t\tthis.started = true;\n\t\tthis.currentStatus = \"running\";\n\t\tthis.runPromise = (async () => {\n\t\t\ttry {\n\t\t\t\tawait this.host.run(this.request.prompt, this.controller.signal);\n\t\t\t} catch (error) {\n\t\t\t\tif (this.currentStatus === \"cancelled\") return;\n\t\t\t\tif (isCancellationClassError(error)) {\n\t\t\t\t\tthis.currentStatus = \"cancelled\";\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.settleTerminalResult(\"cancelled\");\n\t\t\t\t\t} catch (persistError) {\n\t\t\t\t\t\t// The task's own cancellation stays the primary rejection;\n\t\t\t\t\t\t// the replay-channel failure is attached as its cause instead\n\t\t\t\t\t\t// of shadowing it.\n\t\t\t\t\t\tif (error instanceof Error && !(\"cause\" in error)) {\n\t\t\t\t\t\t\t(error as { cause?: unknown }).cause = persistError;\n\t\t\t\t\t\t\tthrow error;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tthrow new Error(t(\"Agent task was cancelled and its result could not be persisted\"), {\n\t\t\t\t\t\t\tcause: { task: error, persist: persistError },\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tthis.currentStatus = \"failed\";\n\t\t\t\ttry {\n\t\t\t\t\tawait this.settleTerminalResult(\"failed\");\n\t\t\t\t} catch (persistError) {\n\t\t\t\t\t// The task's own failure stays the primary rejection; the\n\t\t\t\t\t// replay-channel failure is attached as its cause instead of\n\t\t\t\t\t// shadowing it.\n\t\t\t\t\tif (error instanceof Error && !(\"cause\" in error)) {\n\t\t\t\t\t\t(error as { cause?: unknown }).cause = persistError;\n\t\t\t\t\t\tthrow error;\n\t\t\t\t\t}\n\t\t\t\t\tthrow new Error(t(\"Agent task failed and its result could not be persisted\"), {\n\t\t\t\t\t\tcause: { task: error, persist: persistError },\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tthrow error;\n\t\t\t}\n\t\t\tif (this.currentStatus === \"running\") {\n\t\t\t\tthis.currentStatus = \"succeeded\";\n\t\t\t\tawait this.settleTerminalResult(\"succeeded\");\n\t\t\t}\n\t\t})();\n\t\tvoid this.runPromise.catch(() => {});\n\t\treturn this.runPromise;\n\t}\n\n\twait(options?: { signal?: AbortSignal }): Promise<AgentTaskWaitResult> {\n\t\tthis.assertUsable();\n\t\tif (this.currentStatus === \"created\")\n\t\t\tthrow new Error(t(\"Agent task has not been started: {id}\", { id: this.id }));\n\t\tconst completion = this.runPromise ?? Promise.resolve();\n\t\tconst result = completion.then(() => ({\n\t\t\tsessionId: this.host.session.getSessionId(),\n\t\t\tmessages: this.host.session.getMessages(),\n\t\t}));\n\t\tconst signal = options?.signal;\n\t\tif (!signal) return result;\n\t\tif (signal.aborted) return Promise.reject(cancellationError(signal.reason));\n\t\treturn Promise.race([\n\t\t\tresult,\n\t\t\tnew Promise<AgentTaskWaitResult>((_resolve, reject) => {\n\t\t\t\tsignal.addEventListener(\"abort\", () => reject(cancellationError(signal.reason)), { once: true });\n\t\t\t}),\n\t\t]);\n\t}\n\n\tasync cancel(reason = \"cancelled\"): Promise<void> {\n\t\tthis.assertUsable();\n\t\tif (this.currentStatus === \"succeeded\" || this.currentStatus === \"failed\" || this.currentStatus === \"cancelled\") {\n\t\t\treturn;\n\t\t}\n\t\tthis.currentStatus = \"cancelled\";\n\t\tthis.controller.abort(reason);\n\t\tawait this.host.cancel(reason);\n\t\tawait this.settleTerminalResult(\"cancelled\");\n\t}\n\n\tdispose(): Promise<void> {\n\t\tthis.disposePromise ??= (async () => {\n\t\t\tthis.disposed = true;\n\t\t\ttry {\n\t\t\t\tif (this.currentStatus === \"created\" || this.currentStatus === \"running\") {\n\t\t\t\t\tthis.currentStatus = \"cancelled\";\n\t\t\t\t\tthis.controller.abort(\"agent task disposed\");\n\t\t\t\t\t// The terminal record captures the session messages before the\n\t\t\t\t\t// adapter disposes them; a settle after host.dispose() could read\n\t\t\t\t\t// already-released session state.\n\t\t\t\t\tawait this.settleTerminalResult(\"cancelled\");\n\t\t\t\t\ttry {\n\t\t\t\t\t\tawait this.host.cancel(\"agent task disposed\");\n\t\t\t\t\t} finally {\n\t\t\t\t\t\tawait this.host.dispose();\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tawait this.host.dispose();\n\t\t\t} finally {\n\t\t\t\t// Also on a failing host disposal: a disposed task must not stay\n\t\t\t\t// reachable from the runtime's live-task set or the parent fence.\n\t\t\t\tthis.releaseRuntimeReferences?.();\n\t\t\t}\n\t\t})();\n\t\treturn this.disposePromise;\n\t}\n\n\tresult(): AgentTaskResultV1 | undefined {\n\t\t// Replay read: no liveness assertion, the frozen terminal outcome\n\t\t// stays readable after dispose.\n\t\treturn this.terminalResult;\n\t}\n\n\t/**\n\t * Capture the frozen terminal outcome at settle: the record is detached and\n\t * deep-frozen so the replay read survives dispose and shares no identity\n\t * with live session state. When a durable replay channel is configured, the\n\t * record is persisted under the deterministic artifact id\n\t * `agent-task:<taskId>`; a persist failure propagates verbatim from the\n\t * originating settle call (run/cancel/dispose) without affecting the\n\t * already-captured in-memory result.\n\t */\n\tprivate async settleTerminalResult(status: AgentTaskStatus): Promise<void> {\n\t\t// detachedSnapshot deep-clones and recursively freezes; the session\n\t\t// snapshot in public-api.ts clones without freezing, so the frozen\n\t\t// terminal outcome requires this projection.\n\t\tconst record = detachedSnapshot({\n\t\t\ttaskId: this.id,\n\t\t\tparentSessionId: this.parentSessionId,\n\t\t\tstatus,\n\t\t\tsessionId: this.host.session.getSessionId(),\n\t\t\tmessages: this.host.session.getMessages(),\n\t\t} as AgentTaskResultV1);\n\t\tthis.terminalResult = record;\n\t\tif (!this.agentResults) return;\n\t\tawait this.agentResults.store.persistArtifact({\n\t\t\twriterId: this.agentResults.writerId,\n\t\t\tartifactId: `agent-task:${this.id}`,\n\t\t\tsessionId: this.parentSessionId,\n\t\t\tdata: record,\n\t\t});\n\t}\n\n\tprivate assertUsable(): void {\n\t\tthis.assertApiUsable();\n\t\tif (this.disposed) throw new Error(t(\"Agent task handle is disposed: {id}\", { id: this.id }));\n\t}\n}\n\n/**\n * Normalize a capability tool's execute outcome into an AgentToolResult shape.\n *\n * Capability tools execute to plain domain objects ({memoryId, kind, ...}); the\n * agent core's tool-result message reads `result.content` and would surface an\n * empty result to the model. Strings become the text directly, objects without\n * a content array are serialized as stable pretty JSON, results that already\n * carry a content array pass through untouched, and undefined/null keep the\n * existing empty-content normalization the agent core performs.\n */\nexport function normalizeCapabilityToolResult(result: unknown): unknown {\n\tif (result === undefined || result === null) return result;\n\tif (typeof result === \"string\") {\n\t\treturn { content: [{ type: \"text\", text: result }], details: {} };\n\t}\n\tif (typeof result === \"object\" && Array.isArray((result as { content?: unknown }).content)) return result;\n\treturn { content: [{ type: \"text\", text: JSON.stringify(result, null, 2) }], details: {} };\n}\n\n/**\n * Wrap a listed tool definition's execute with {@link normalizeCapabilityToolResult}.\n *\n * listTools() is the only face the model-facing chain reads (the session's\n * capability tool registry), so wrapping here fixes the model result surface\n * for every capability tool at one point while runtime.invokeTool keeps\n * returning raw values to deterministic callers. The wrapper forwards all\n * arguments and propagates rejections untouched (the agent core already maps\n * thrown errors to error tool results).\n */\nexport function withNormalizedToolResultExecute(definition: unknown): unknown {\n\tif (!definition || typeof definition !== \"object\") return definition;\n\tconst execute = (definition as { execute?: unknown }).execute;\n\tif (typeof execute !== \"function\") return definition;\n\tconst run = execute as (...args: unknown[]) => unknown;\n\tconst wrapped = (...args: unknown[]): unknown => {\n\t\tconst outcome = run(...args);\n\t\tif (outcome instanceof Promise) return outcome.then(normalizeCapabilityToolResult);\n\t\treturn normalizeCapabilityToolResult(outcome);\n\t};\n\treturn Object.freeze({ ...(definition as Record<string, unknown>), execute: wrapped });\n}\n\nexport function guardedComposition(\n\tcomposition: AgentCompositionAPI,\n\tassertUsable: () => void,\n\ttrackInstance: (instance: AgentInstance) => void,\n\ttrackDefinition: (definition: AgentDefinition) => void,\n\thostPrimitivesFactory: AgentHostPrimitivesFactory,\n\tlifecycleDispatcher: AgentCompositionLifecycleDispatcher,\n\tmanifest: PluginManifest,\n): AgentCompositionAPI {\n\tconst declaredAgent = (id: string, version: number, role?: string): void => {\n\t\tconst declaration = manifest.agents?.find(\n\t\t\t(agent) => agent.id === id && agent.version === version && (role === undefined || agent.role === role),\n\t\t);\n\t\tif (!declaration)\n\t\t\tthrow new Error(t(\"Agent definition must be declared by plugin manifest: {id}@{version}\", { id, version }));\n\t};\n\tconst assertOwnedDefinition = (definition: AgentDefinition): void => {\n\t\tdeclaredAgent(definition.id, definition.version, definition.role);\n\t\tif (definition.owner !== undefined && definition.owner !== manifest.id) {\n\t\t\tthrow new Error(t(\"Agent definition owner must match plugin manifest: {id}\", { id: manifest.id }));\n\t\t}\n\t};\n\tconst assertOwnedParent = (parentInstanceId: string | undefined): void => {\n\t\tif (parentInstanceId === undefined) return;\n\t\tconst parent = composition.listInstances().find((instance) => instance.id === parentInstanceId);\n\t\tif (!parent) return;\n\t\tconst definition = composition.get(parent.definitionId, parent.definitionVersion);\n\t\tif (definition.owner !== undefined && definition.owner !== manifest.id) {\n\t\t\tthrow new Error(\n\t\t\t\tt(\"Parent Agent instance must belong to plugin manifest: {parentInstanceId}\", { parentInstanceId }),\n\t\t\t);\n\t\t}\n\t\tassertOwnedDefinition(definition);\n\t};\n\treturn Object.freeze({\n\t\tdefine: <TInput = unknown, TResult = unknown>(definition: AgentDefinition<TInput, TResult>) => {\n\t\t\tassertUsable();\n\t\t\tassertOwnedDefinition(definition);\n\t\t\tconst registered = composition.define({ ...definition, owner: manifest.id });\n\t\t\ttrackDefinition(registered);\n\t\t\treturn registered;\n\t\t},\n\t\tget: <TInput = unknown, TResult = unknown>(id: string, version: number) => {\n\t\t\tassertUsable();\n\t\t\tdeclaredAgent(id, version);\n\t\t\tconst definition = composition.get<TInput, TResult>(id, version);\n\t\t\tassertOwnedDefinition(definition);\n\t\t\treturn definition;\n\t\t},\n\t\tcreate: <TInput = unknown, TResult = unknown>(\n\t\t\tdefinition: AgentDefinition<TInput, TResult> | { id: string; version: number },\n\t\t\toptions?: { id?: string; parentInstanceId?: string },\n\t\t) => {\n\t\t\tassertUsable();\n\t\t\tif (\"run\" in definition) {\n\t\t\t\tassertOwnedDefinition(definition);\n\t\t\t} else {\n\t\t\t\tdeclaredAgent(definition.id, definition.version);\n\t\t\t\tassertOwnedDefinition(composition.get(definition.id, definition.version));\n\t\t\t}\n\t\t\tassertOwnedParent(options?.parentInstanceId);\n\t\t\tconst scopedBinding = composition as Partial<AgentCompositionScopedHostBinding> & {\n\t\t\t\tcreateWithHostPrimitives?: <TInput = unknown, TResult = unknown>(\n\t\t\t\t\tdefinition: AgentDefinition<TInput, TResult> | { id: string; version: number },\n\t\t\t\t\toptions: { id?: string; parentInstanceId?: string } | undefined,\n\t\t\t\t\thostPrimitivesFactory: AgentHostPrimitivesFactory,\n\t\t\t\t\tlifecycleDispatcher?: AgentCompositionLifecycleDispatcher,\n\t\t\t\t) => AgentInstance<TInput, TResult>;\n\t\t\t};\n\t\t\tif (!scopedBinding.createWithHostPrimitives) {\n\t\t\t\tthrow new Error(t(\"Agent composition runtime does not support owner-scoped host primitives\"));\n\t\t\t}\n\t\t\tconst instance = scopedBinding.createWithHostPrimitives<TInput, TResult>(\n\t\t\t\tdefinition,\n\t\t\t\toptions,\n\t\t\t\thostPrimitivesFactory,\n\t\t\t\tlifecycleDispatcher,\n\t\t\t);\n\t\t\tconst guarded = Object.freeze({\n\t\t\t\tid: instance.id,\n\t\t\t\tdefinition: instance.definition,\n\t\t\t\tsnapshot: () => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.snapshot();\n\t\t\t\t},\n\t\t\t\tacquireControllerLease: (owner?: string) => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.acquireControllerLease(owner);\n\t\t\t\t},\n\t\t\t\trun: (input: TInput, runOptions?: { lease?: AgentControllerLease; signal?: AbortSignal }) => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.run(input, runOptions);\n\t\t\t\t},\n\t\t\t\twait: () => instance.wait(),\n\t\t\t\tcancel: (reason?: string) => {\n\t\t\t\t\tassertUsable();\n\t\t\t\t\treturn instance.cancel(reason);\n\t\t\t\t},\n\t\t\t\tdispose: () => instance.dispose(),\n\t\t\t}) as AgentInstance<TInput, TResult>;\n\t\t\ttrackInstance(guarded);\n\t\t\treturn guarded;\n\t\t},\n\t\tlistInstances: () => {\n\t\t\tassertUsable();\n\t\t\treturn composition.listInstances().filter((instance) => {\n\t\t\t\ttry {\n\t\t\t\t\treturn composition.get(instance.definitionId, instance.definitionVersion).owner === manifest.id;\n\t\t\t\t} catch {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t});\n\t\t},\n\t}) satisfies AgentCompositionAPI;\n}\n"]}
@@ -1,4 +1,5 @@
1
1
  import { SUBAGENT_MAILBOX_MAX_MESSAGE_BYTES } from "@agent-forge/protocol/subagent";
2
+ import { t } from "../i18n/index.js";
2
3
  import { cancellationError } from "./capability-runtime-operation.js";
3
4
  import { definitionSnapshot, detachedSnapshot } from "./capability-runtime-snapshot.js";
4
5
  import { validateCredentialRequest, validateInteractionNotifyRequest, validateInteractionRequest, validateInteractionTimeoutMs, } from "./capability-runtime-validation.js";
@@ -287,26 +288,26 @@ const HOST_INTERACTION_OUTCOME_KEYS = new Map([
287
288
  */
288
289
  function validateHostInteractionOutcome(outcome, requestKind) {
289
290
  if (!outcome || typeof outcome !== "object" || Array.isArray(outcome)) {
290
- throw new Error("Interaction prompt outcome must be an object");
291
+ throw new Error(t("Interaction prompt outcome must be an object"));
291
292
  }
292
293
  const record = outcome;
293
294
  const status = record.status;
294
295
  if (typeof status !== "string" || !HOST_INTERACTION_OUTCOME_KEYS.has(status)) {
295
- throw new Error(`Interaction prompt outcome has an unknown status: ${String(status)}`);
296
+ throw new Error(t("Interaction prompt outcome has an unknown status: {value}", { value: String(status) }));
296
297
  }
297
298
  if (status === "timeout") {
298
- throw new Error("Interaction prompt outcome timeout can only be produced by options.timeoutMs, never by the host");
299
+ throw new Error(t("Interaction prompt outcome timeout can only be produced by options.timeoutMs, never by the host"));
299
300
  }
300
301
  if (status === "delivered" && requestKind !== "notify") {
301
- throw new Error("Interaction prompt outcome delivered is only valid for notify requests");
302
+ throw new Error(t("Interaction prompt outcome delivered is only valid for notify requests"));
302
303
  }
303
304
  const expectedKeys = HOST_INTERACTION_OUTCOME_KEYS.get(status) ?? [];
304
305
  const unexpected = Object.keys(record).filter((key) => !expectedKeys.includes(key));
305
306
  if (unexpected.length > 0) {
306
- throw new Error(`Interaction prompt outcome has unsupported fields: ${unexpected.join(", ")}`);
307
+ throw new Error(t("Interaction prompt outcome has unsupported fields: {value}", { value: unexpected.join(", ") }));
307
308
  }
308
309
  if (status === "answered" && typeof record.value !== "boolean" && typeof record.value !== "string") {
309
- throw new Error("Interaction prompt outcome answered requires a boolean or string value");
310
+ throw new Error(t("Interaction prompt outcome answered requires a boolean or string value"));
310
311
  }
311
312
  }
312
313
  /**
@@ -503,7 +504,7 @@ export class RuntimeAgentTask {
503
504
  run() {
504
505
  this.assertUsable();
505
506
  if (this.started || this.currentStatus !== "created") {
506
- throw new Error(`Agent task can only run once: ${this.id}`);
507
+ throw new Error(t("Agent task can only run once: {id}", { id: this.id }));
507
508
  }
508
509
  this.started = true;
509
510
  this.currentStatus = "running";
@@ -527,7 +528,7 @@ export class RuntimeAgentTask {
527
528
  error.cause = persistError;
528
529
  throw error;
529
530
  }
530
- throw new Error("Agent task was cancelled and its result could not be persisted", {
531
+ throw new Error(t("Agent task was cancelled and its result could not be persisted"), {
531
532
  cause: { task: error, persist: persistError },
532
533
  });
533
534
  }
@@ -545,7 +546,7 @@ export class RuntimeAgentTask {
545
546
  error.cause = persistError;
546
547
  throw error;
547
548
  }
548
- throw new Error("Agent task failed and its result could not be persisted", {
549
+ throw new Error(t("Agent task failed and its result could not be persisted"), {
549
550
  cause: { task: error, persist: persistError },
550
551
  });
551
552
  }
@@ -562,7 +563,7 @@ export class RuntimeAgentTask {
562
563
  wait(options) {
563
564
  this.assertUsable();
564
565
  if (this.currentStatus === "created")
565
- throw new Error(`Agent task has not been started: ${this.id}`);
566
+ throw new Error(t("Agent task has not been started: {id}", { id: this.id }));
566
567
  const completion = this.runPromise ?? Promise.resolve();
567
568
  const result = completion.then(() => ({
568
569
  sessionId: this.host.session.getSessionId(),
@@ -657,7 +658,7 @@ export class RuntimeAgentTask {
657
658
  assertUsable() {
658
659
  this.assertApiUsable();
659
660
  if (this.disposed)
660
- throw new Error(`Agent task handle is disposed: ${this.id}`);
661
+ throw new Error(t("Agent task handle is disposed: {id}", { id: this.id }));
661
662
  }
662
663
  }
663
664
  /**
@@ -709,12 +710,12 @@ export function guardedComposition(composition, assertUsable, trackInstance, tra
709
710
  const declaredAgent = (id, version, role) => {
710
711
  const declaration = manifest.agents?.find((agent) => agent.id === id && agent.version === version && (role === undefined || agent.role === role));
711
712
  if (!declaration)
712
- throw new Error(`Agent definition must be declared by plugin manifest: ${id}@${version}`);
713
+ throw new Error(t("Agent definition must be declared by plugin manifest: {id}@{version}", { id, version }));
713
714
  };
714
715
  const assertOwnedDefinition = (definition) => {
715
716
  declaredAgent(definition.id, definition.version, definition.role);
716
717
  if (definition.owner !== undefined && definition.owner !== manifest.id) {
717
- throw new Error(`Agent definition owner must match plugin manifest: ${manifest.id}`);
718
+ throw new Error(t("Agent definition owner must match plugin manifest: {id}", { id: manifest.id }));
718
719
  }
719
720
  };
720
721
  const assertOwnedParent = (parentInstanceId) => {
@@ -725,7 +726,7 @@ export function guardedComposition(composition, assertUsable, trackInstance, tra
725
726
  return;
726
727
  const definition = composition.get(parent.definitionId, parent.definitionVersion);
727
728
  if (definition.owner !== undefined && definition.owner !== manifest.id) {
728
- throw new Error(`Parent Agent instance must belong to plugin manifest: ${parentInstanceId}`);
729
+ throw new Error(t("Parent Agent instance must belong to plugin manifest: {parentInstanceId}", { parentInstanceId }));
729
730
  }
730
731
  assertOwnedDefinition(definition);
731
732
  };
@@ -756,7 +757,7 @@ export function guardedComposition(composition, assertUsable, trackInstance, tra
756
757
  assertOwnedParent(options?.parentInstanceId);
757
758
  const scopedBinding = composition;
758
759
  if (!scopedBinding.createWithHostPrimitives) {
759
- throw new Error("Agent composition runtime does not support owner-scoped host primitives");
760
+ throw new Error(t("Agent composition runtime does not support owner-scoped host primitives"));
760
761
  }
761
762
  const instance = scopedBinding.createWithHostPrimitives(definition, options, hostPrimitivesFactory, lifecycleDispatcher);
762
763
  const guarded = Object.freeze({