@adonis-agora/agent 0.60.1 → 0.62.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 (707) hide show
  1. package/CHANGELOG.md +96 -0
  2. package/README.md +12 -7
  3. package/dist/configure.d.ts +7 -5
  4. package/dist/configure.d.ts.map +1 -1
  5. package/dist/configure.js +9 -5
  6. package/dist/configure.js.map +1 -1
  7. package/dist/providers/a2a_provider.d.ts +14 -0
  8. package/dist/providers/a2a_provider.d.ts.map +1 -0
  9. package/dist/providers/a2a_provider.js +136 -0
  10. package/dist/providers/a2a_provider.js.map +1 -0
  11. package/dist/providers/agent_provider.d.ts.map +1 -1
  12. package/dist/providers/agent_provider.js +195 -11
  13. package/dist/providers/agent_provider.js.map +1 -1
  14. package/dist/providers/mcp_provider.d.ts +3 -0
  15. package/dist/providers/mcp_provider.d.ts.map +1 -1
  16. package/dist/providers/mcp_provider.js +147 -62
  17. package/dist/providers/mcp_provider.js.map +1 -1
  18. package/dist/src/a2a/auth.d.ts +67 -0
  19. package/dist/src/a2a/auth.d.ts.map +1 -0
  20. package/dist/src/a2a/auth.js +47 -0
  21. package/dist/src/a2a/auth.js.map +1 -0
  22. package/dist/src/a2a/define_config.d.ts +74 -0
  23. package/dist/src/a2a/define_config.d.ts.map +1 -0
  24. package/dist/src/a2a/define_config.js +5 -0
  25. package/dist/src/a2a/define_config.js.map +1 -0
  26. package/dist/src/a2a/gate.d.ts +23 -0
  27. package/dist/src/a2a/gate.d.ts.map +1 -0
  28. package/dist/src/a2a/gate.js +56 -0
  29. package/dist/src/a2a/gate.js.map +1 -0
  30. package/dist/src/a2a/handler.d.ts +65 -0
  31. package/dist/src/a2a/handler.d.ts.map +1 -0
  32. package/dist/src/a2a/handler.js +322 -0
  33. package/dist/src/a2a/handler.js.map +1 -0
  34. package/dist/src/a2a/index.d.ts +15 -0
  35. package/dist/src/a2a/index.d.ts.map +1 -0
  36. package/dist/src/a2a/index.js +9 -0
  37. package/dist/src/a2a/index.js.map +1 -0
  38. package/dist/src/a2a/permission-tool.d.ts +17 -0
  39. package/dist/src/a2a/permission-tool.d.ts.map +1 -0
  40. package/dist/src/a2a/permission-tool.js +70 -0
  41. package/dist/src/a2a/permission-tool.js.map +1 -0
  42. package/dist/src/a2a/protocol.d.ts +100 -0
  43. package/dist/src/a2a/protocol.d.ts.map +1 -0
  44. package/dist/src/a2a/protocol.js +106 -0
  45. package/dist/src/a2a/protocol.js.map +1 -0
  46. package/dist/src/a2a/runtime.d.ts +6 -0
  47. package/dist/src/a2a/runtime.d.ts.map +1 -0
  48. package/dist/src/a2a/runtime.js +13 -0
  49. package/dist/src/a2a/runtime.js.map +1 -0
  50. package/dist/src/a2a/server_middleware.d.ts +13 -0
  51. package/dist/src/a2a/server_middleware.d.ts.map +1 -0
  52. package/dist/src/a2a/server_middleware.js +18 -0
  53. package/dist/src/a2a/server_middleware.js.map +1 -0
  54. package/dist/src/a2a/store.d.ts +79 -0
  55. package/dist/src/a2a/store.d.ts.map +1 -0
  56. package/dist/src/a2a/store.js +151 -0
  57. package/dist/src/a2a/store.js.map +1 -0
  58. package/dist/src/a2a/turn.d.ts +80 -0
  59. package/dist/src/a2a/turn.d.ts.map +1 -0
  60. package/dist/src/a2a/turn.js +211 -0
  61. package/dist/src/a2a/turn.js.map +1 -0
  62. package/dist/src/action-proposal-approval.d.ts +26 -0
  63. package/dist/src/action-proposal-approval.d.ts.map +1 -0
  64. package/dist/src/action-proposal-approval.js +28 -0
  65. package/dist/src/action-proposal-approval.js.map +1 -0
  66. package/dist/src/action-proposal-discovery.d.ts +9 -0
  67. package/dist/src/action-proposal-discovery.d.ts.map +1 -0
  68. package/dist/src/action-proposal-discovery.js +20 -0
  69. package/dist/src/action-proposal-discovery.js.map +1 -0
  70. package/dist/src/action-proposal-executor.d.ts +40 -0
  71. package/dist/src/action-proposal-executor.d.ts.map +1 -0
  72. package/dist/src/action-proposal-executor.js +80 -0
  73. package/dist/src/action-proposal-executor.js.map +1 -0
  74. package/dist/src/action-proposal-outcome.d.ts +12 -0
  75. package/dist/src/action-proposal-outcome.d.ts.map +1 -0
  76. package/dist/src/action-proposal-outcome.js +86 -0
  77. package/dist/src/action-proposal-outcome.js.map +1 -0
  78. package/dist/src/action-proposal-preparation.d.ts +20 -0
  79. package/dist/src/action-proposal-preparation.d.ts.map +1 -0
  80. package/dist/src/action-proposal-preparation.js +27 -0
  81. package/dist/src/action-proposal-preparation.js.map +1 -0
  82. package/dist/src/action-proposal-receipt.d.ts +12 -0
  83. package/dist/src/action-proposal-receipt.d.ts.map +1 -0
  84. package/dist/src/action-proposal-receipt.js +4 -0
  85. package/dist/src/action-proposal-receipt.js.map +1 -0
  86. package/dist/src/action-proposal-runtime.d.ts +9 -0
  87. package/dist/src/action-proposal-runtime.d.ts.map +1 -0
  88. package/dist/src/action-proposal-runtime.js +34 -0
  89. package/dist/src/action-proposal-runtime.js.map +1 -0
  90. package/dist/src/action-proposal-service.d.ts +47 -0
  91. package/dist/src/action-proposal-service.d.ts.map +1 -0
  92. package/dist/src/action-proposal-service.js +136 -0
  93. package/dist/src/action-proposal-service.js.map +1 -0
  94. package/dist/src/action-proposal-text.d.ts +72 -0
  95. package/dist/src/action-proposal-text.d.ts.map +1 -0
  96. package/dist/src/action-proposal-text.js +119 -0
  97. package/dist/src/action-proposal-text.js.map +1 -0
  98. package/dist/src/action-proposal-transitions.d.ts +20 -0
  99. package/dist/src/action-proposal-transitions.d.ts.map +1 -0
  100. package/dist/src/action-proposal-transitions.js +311 -0
  101. package/dist/src/action-proposal-transitions.js.map +1 -0
  102. package/dist/src/action-proposal-worker.d.ts +32 -0
  103. package/dist/src/action-proposal-worker.d.ts.map +1 -0
  104. package/dist/src/action-proposal-worker.js +140 -0
  105. package/dist/src/action-proposal-worker.js.map +1 -0
  106. package/dist/src/ag-ui/adapter.d.ts.map +1 -1
  107. package/dist/src/ag-ui/adapter.js +106 -1
  108. package/dist/src/ag-ui/adapter.js.map +1 -1
  109. package/dist/src/ag-ui/core/encoder.d.ts +105 -0
  110. package/dist/src/ag-ui/core/encoder.d.ts.map +1 -0
  111. package/dist/src/ag-ui/core/encoder.js +523 -0
  112. package/dist/src/ag-ui/core/encoder.js.map +1 -0
  113. package/dist/src/ag-ui/core/index.d.ts +12 -0
  114. package/dist/src/ag-ui/core/index.d.ts.map +1 -0
  115. package/dist/src/ag-ui/core/index.js +12 -0
  116. package/dist/src/ag-ui/core/index.js.map +1 -0
  117. package/dist/src/ag-ui/core/input.d.ts +74 -0
  118. package/dist/src/ag-ui/core/input.d.ts.map +1 -0
  119. package/dist/src/ag-ui/core/input.js +228 -0
  120. package/dist/src/ag-ui/core/input.js.map +1 -0
  121. package/dist/src/ag-ui/core/interrupt-id.d.ts +31 -0
  122. package/dist/src/ag-ui/core/interrupt-id.d.ts.map +1 -0
  123. package/dist/src/ag-ui/core/interrupt-id.js +48 -0
  124. package/dist/src/ag-ui/core/interrupt-id.js.map +1 -0
  125. package/dist/src/ag-ui/core/proposal-decision.d.ts +9 -0
  126. package/dist/src/ag-ui/core/proposal-decision.d.ts.map +1 -0
  127. package/dist/src/ag-ui/core/proposal-decision.js +20 -0
  128. package/dist/src/ag-ui/core/proposal-decision.js.map +1 -0
  129. package/dist/src/ag-ui/core/stream.d.ts +27 -0
  130. package/dist/src/ag-ui/core/stream.d.ts.map +1 -0
  131. package/dist/src/ag-ui/core/stream.js +68 -0
  132. package/dist/src/ag-ui/core/stream.js.map +1 -0
  133. package/dist/src/ag-ui/core/types.d.ts +249 -0
  134. package/dist/src/ag-ui/core/types.d.ts.map +1 -0
  135. package/dist/src/ag-ui/core/types.js +35 -0
  136. package/dist/src/ag-ui/core/types.js.map +1 -0
  137. package/dist/src/ag-ui/encoder.d.ts +3 -4
  138. package/dist/src/ag-ui/encoder.d.ts.map +1 -1
  139. package/dist/src/ag-ui/encoder.js +10 -11
  140. package/dist/src/ag-ui/encoder.js.map +1 -1
  141. package/dist/src/ag-ui/frames.d.ts +4 -5
  142. package/dist/src/ag-ui/frames.d.ts.map +1 -1
  143. package/dist/src/ag-ui/frames.js +9 -4
  144. package/dist/src/ag-ui/frames.js.map +1 -1
  145. package/dist/src/ag-ui/index.d.ts +3 -5
  146. package/dist/src/ag-ui/index.d.ts.map +1 -1
  147. package/dist/src/ag-ui/index.js +3 -5
  148. package/dist/src/ag-ui/index.js.map +1 -1
  149. package/dist/src/ag-ui/stream.d.ts +3 -4
  150. package/dist/src/ag-ui/stream.d.ts.map +1 -1
  151. package/dist/src/ag-ui/stream.js +4 -5
  152. package/dist/src/ag-ui/stream.js.map +1 -1
  153. package/dist/src/agent-deps-factory.d.ts +8 -0
  154. package/dist/src/agent-deps-factory.d.ts.map +1 -1
  155. package/dist/src/agent-deps-factory.js +12 -0
  156. package/dist/src/agent-deps-factory.js.map +1 -1
  157. package/dist/src/agent-deps.d.ts +7 -0
  158. package/dist/src/agent-deps.d.ts.map +1 -1
  159. package/dist/src/agent-deps.js.map +1 -1
  160. package/dist/src/agent-loop.d.ts +8 -3
  161. package/dist/src/agent-loop.d.ts.map +1 -1
  162. package/dist/src/agent-loop.js +398 -63
  163. package/dist/src/agent-loop.js.map +1 -1
  164. package/dist/src/agent-service.d.ts +52 -2
  165. package/dist/src/agent-service.d.ts.map +1 -1
  166. package/dist/src/agent-service.js +62 -2
  167. package/dist/src/agent-service.js.map +1 -1
  168. package/dist/src/ai-sdk/ai-sdk-model.js +4 -1
  169. package/dist/src/ai-sdk/ai-sdk-model.js.map +1 -1
  170. package/dist/src/ai-tool-ref.d.ts +6 -1
  171. package/dist/src/ai-tool-ref.d.ts.map +1 -1
  172. package/dist/src/ai-tool-ref.js +32 -16
  173. package/dist/src/ai-tool-ref.js.map +1 -1
  174. package/dist/src/chat-queue-service.d.ts.map +1 -1
  175. package/dist/src/chat-queue-service.js +4 -0
  176. package/dist/src/chat-queue-service.js.map +1 -1
  177. package/dist/src/client/chat-client.d.ts +12 -0
  178. package/dist/src/client/chat-client.d.ts.map +1 -1
  179. package/dist/src/client/chat-client.js +69 -1
  180. package/dist/src/client/chat-client.js.map +1 -1
  181. package/dist/src/client/sse.d.ts +15 -0
  182. package/dist/src/client/sse.d.ts.map +1 -1
  183. package/dist/src/client/sse.js +45 -0
  184. package/dist/src/client/sse.js.map +1 -1
  185. package/dist/src/define_config.d.ts +70 -12
  186. package/dist/src/define_config.d.ts.map +1 -1
  187. package/dist/src/define_config.js.map +1 -1
  188. package/dist/src/engine.d.ts +77 -0
  189. package/dist/src/engine.d.ts.map +1 -0
  190. package/dist/src/engine.js +27 -0
  191. package/dist/src/engine.js.map +1 -0
  192. package/dist/src/genui/builtins.d.ts +73 -3
  193. package/dist/src/genui/builtins.d.ts.map +1 -1
  194. package/dist/src/genui/builtins.js +298 -3
  195. package/dist/src/genui/builtins.js.map +1 -1
  196. package/dist/src/genui/capabilities.d.ts +24 -0
  197. package/dist/src/genui/capabilities.d.ts.map +1 -0
  198. package/dist/src/genui/capabilities.js +81 -0
  199. package/dist/src/genui/capabilities.js.map +1 -0
  200. package/dist/src/genui/catalog.d.ts +77 -0
  201. package/dist/src/genui/catalog.d.ts.map +1 -0
  202. package/dist/src/genui/catalog.js +88 -0
  203. package/dist/src/genui/catalog.js.map +1 -0
  204. package/dist/src/genui/factory.d.ts +8 -8
  205. package/dist/src/genui/factory.d.ts.map +1 -1
  206. package/dist/src/genui/factory.js +3 -1
  207. package/dist/src/genui/factory.js.map +1 -1
  208. package/dist/src/genui/index.d.ts +4 -12
  209. package/dist/src/genui/index.d.ts.map +1 -1
  210. package/dist/src/genui/index.js +6 -18
  211. package/dist/src/genui/index.js.map +1 -1
  212. package/dist/src/genui/public.d.ts +9 -0
  213. package/dist/src/genui/public.d.ts.map +1 -0
  214. package/dist/src/genui/public.js +9 -0
  215. package/dist/src/genui/public.js.map +1 -0
  216. package/dist/src/genui/registry.d.ts +65 -0
  217. package/dist/src/genui/registry.d.ts.map +1 -0
  218. package/dist/src/genui/registry.js +151 -0
  219. package/dist/src/genui/registry.js.map +1 -0
  220. package/dist/src/genui/schema.d.ts +71 -0
  221. package/dist/src/genui/schema.d.ts.map +1 -0
  222. package/dist/src/genui/schema.js +304 -0
  223. package/dist/src/genui/schema.js.map +1 -0
  224. package/dist/src/genui/text.d.ts +35 -0
  225. package/dist/src/genui/text.d.ts.map +1 -0
  226. package/dist/src/genui/text.js +156 -0
  227. package/dist/src/genui/text.js.map +1 -0
  228. package/dist/src/genui/tools.d.ts +91 -0
  229. package/dist/src/genui/tools.d.ts.map +1 -0
  230. package/dist/src/genui/tools.js +292 -0
  231. package/dist/src/genui/tools.js.map +1 -0
  232. package/dist/src/genui/tree.d.ts +56 -0
  233. package/dist/src/genui/tree.d.ts.map +1 -0
  234. package/dist/src/genui/tree.js +188 -0
  235. package/dist/src/genui/tree.js.map +1 -0
  236. package/dist/src/index.d.ts +21 -3
  237. package/dist/src/index.d.ts.map +1 -1
  238. package/dist/src/index.js +19 -2
  239. package/dist/src/index.js.map +1 -1
  240. package/dist/src/mcp/auth.d.ts +17 -1
  241. package/dist/src/mcp/auth.d.ts.map +1 -1
  242. package/dist/src/mcp/auth.js +14 -3
  243. package/dist/src/mcp/auth.js.map +1 -1
  244. package/dist/src/mcp/define_config.d.ts +81 -2
  245. package/dist/src/mcp/define_config.d.ts.map +1 -1
  246. package/dist/src/mcp/define_config.js.map +1 -1
  247. package/dist/src/mcp/index.d.ts +1 -1
  248. package/dist/src/mcp/index.d.ts.map +1 -1
  249. package/dist/src/mcp/index.js.map +1 -1
  250. package/dist/src/mcp/oauth-resource.d.ts +9 -0
  251. package/dist/src/mcp/oauth-resource.d.ts.map +1 -0
  252. package/dist/src/mcp/oauth-resource.js +16 -0
  253. package/dist/src/mcp/oauth-resource.js.map +1 -0
  254. package/dist/src/mcp/server.d.ts +5 -0
  255. package/dist/src/mcp/server.d.ts.map +1 -1
  256. package/dist/src/mcp/server.js +48 -16
  257. package/dist/src/mcp/server.js.map +1 -1
  258. package/dist/src/negotiated-tool-ui.d.ts +10 -0
  259. package/dist/src/negotiated-tool-ui.d.ts.map +1 -0
  260. package/dist/src/negotiated-tool-ui.js +57 -0
  261. package/dist/src/negotiated-tool-ui.js.map +1 -0
  262. package/dist/src/opencode/client.d.ts +202 -0
  263. package/dist/src/opencode/client.d.ts.map +1 -0
  264. package/dist/src/opencode/client.js +2 -0
  265. package/dist/src/opencode/client.js.map +1 -0
  266. package/dist/src/opencode/durable/index.d.ts +33 -0
  267. package/dist/src/opencode/durable/index.d.ts.map +1 -0
  268. package/dist/src/opencode/durable/index.js +38 -0
  269. package/dist/src/opencode/durable/index.js.map +1 -0
  270. package/dist/src/opencode/durable/runner.d.ts +36 -0
  271. package/dist/src/opencode/durable/runner.d.ts.map +1 -0
  272. package/dist/src/opencode/durable/runner.js +88 -0
  273. package/dist/src/opencode/durable/runner.js.map +1 -0
  274. package/dist/src/opencode/durable/workflow.d.ts +40 -0
  275. package/dist/src/opencode/durable/workflow.d.ts.map +1 -0
  276. package/dist/src/opencode/durable/workflow.js +106 -0
  277. package/dist/src/opencode/durable/workflow.js.map +1 -0
  278. package/dist/src/opencode/engine.d.ts +48 -0
  279. package/dist/src/opencode/engine.d.ts.map +1 -0
  280. package/dist/src/opencode/engine.js +98 -0
  281. package/dist/src/opencode/engine.js.map +1 -0
  282. package/dist/src/opencode/event-hub.d.ts +23 -0
  283. package/dist/src/opencode/event-hub.d.ts.map +1 -0
  284. package/dist/src/opencode/event-hub.js +99 -0
  285. package/dist/src/opencode/event-hub.js.map +1 -0
  286. package/dist/src/opencode/forms.d.ts +19 -0
  287. package/dist/src/opencode/forms.d.ts.map +1 -0
  288. package/dist/src/opencode/forms.js +82 -0
  289. package/dist/src/opencode/forms.js.map +1 -0
  290. package/dist/src/opencode/host.d.ts +179 -0
  291. package/dist/src/opencode/host.d.ts.map +1 -0
  292. package/dist/src/opencode/host.js +34 -0
  293. package/dist/src/opencode/host.js.map +1 -0
  294. package/dist/src/opencode/index.d.ts +15 -0
  295. package/dist/src/opencode/index.d.ts.map +1 -0
  296. package/dist/src/opencode/index.js +9 -0
  297. package/dist/src/opencode/index.js.map +1 -0
  298. package/dist/src/opencode/log.d.ts +9 -0
  299. package/dist/src/opencode/log.d.ts.map +1 -0
  300. package/dist/src/opencode/log.js +15 -0
  301. package/dist/src/opencode/log.js.map +1 -0
  302. package/dist/src/opencode/mcp.d.ts +60 -0
  303. package/dist/src/opencode/mcp.d.ts.map +1 -0
  304. package/dist/src/opencode/mcp.js +258 -0
  305. package/dist/src/opencode/mcp.js.map +1 -0
  306. package/dist/src/opencode/runner.d.ts +40 -0
  307. package/dist/src/opencode/runner.d.ts.map +1 -0
  308. package/dist/src/opencode/runner.js +125 -0
  309. package/dist/src/opencode/runner.js.map +1 -0
  310. package/dist/src/opencode/turn.d.ts +167 -0
  311. package/dist/src/opencode/turn.d.ts.map +1 -0
  312. package/dist/src/opencode/turn.js +761 -0
  313. package/dist/src/opencode/turn.js.map +1 -0
  314. package/dist/src/opencode/turns.d.ts +245 -0
  315. package/dist/src/opencode/turns.d.ts.map +1 -0
  316. package/dist/src/opencode/turns.js +867 -0
  317. package/dist/src/opencode/turns.js.map +1 -0
  318. package/dist/src/personas.d.ts.map +1 -1
  319. package/dist/src/personas.js +4 -1
  320. package/dist/src/personas.js.map +1 -1
  321. package/dist/src/react/ag-ui.d.ts +4 -2
  322. package/dist/src/react/ag-ui.d.ts.map +1 -1
  323. package/dist/src/react/ag-ui.js +2 -2
  324. package/dist/src/react/ag-ui.js.map +1 -1
  325. package/dist/src/react/client.d.ts +1 -1
  326. package/dist/src/react/client.d.ts.map +1 -1
  327. package/dist/src/react/client.js +1 -1
  328. package/dist/src/react/client.js.map +1 -1
  329. package/dist/src/react/core/ag-ui-backend.d.ts +85 -0
  330. package/dist/src/react/core/ag-ui-backend.d.ts.map +1 -0
  331. package/dist/src/react/core/ag-ui-backend.js +409 -0
  332. package/dist/src/react/core/ag-ui-backend.js.map +1 -0
  333. package/dist/src/react/core/agent-chat-transport.d.ts +187 -0
  334. package/dist/src/react/core/agent-chat-transport.d.ts.map +1 -0
  335. package/dist/src/react/core/agent-chat-transport.js +796 -0
  336. package/dist/src/react/core/agent-chat-transport.js.map +1 -0
  337. package/dist/src/react/core/approvals/countdown.d.ts +22 -0
  338. package/dist/src/react/core/approvals/countdown.d.ts.map +1 -0
  339. package/dist/src/react/core/approvals/countdown.js +39 -0
  340. package/dist/src/react/core/approvals/countdown.js.map +1 -0
  341. package/dist/src/react/core/approvals/proposals.d.ts +15 -0
  342. package/dist/src/react/core/approvals/proposals.d.ts.map +1 -0
  343. package/dist/src/react/core/approvals/proposals.js +82 -0
  344. package/dist/src/react/core/approvals/proposals.js.map +1 -0
  345. package/dist/src/react/core/approvals/use-action-proposals.d.ts +10 -0
  346. package/dist/src/react/core/approvals/use-action-proposals.d.ts.map +1 -0
  347. package/dist/src/react/core/approvals/use-action-proposals.js +86 -0
  348. package/dist/src/react/core/approvals/use-action-proposals.js.map +1 -0
  349. package/dist/src/react/core/attachments/files.d.ts +39 -0
  350. package/dist/src/react/core/attachments/files.d.ts.map +1 -0
  351. package/dist/src/react/core/attachments/files.js +89 -0
  352. package/dist/src/react/core/attachments/files.js.map +1 -0
  353. package/dist/src/react/core/attachments/use-attachments.d.ts +106 -0
  354. package/dist/src/react/core/attachments/use-attachments.d.ts.map +1 -0
  355. package/dist/src/react/core/attachments/use-attachments.js +217 -0
  356. package/dist/src/react/core/attachments/use-attachments.js.map +1 -0
  357. package/dist/src/react/core/backend.d.ts +234 -0
  358. package/dist/src/react/core/backend.d.ts.map +1 -0
  359. package/dist/src/react/core/backend.js +21 -0
  360. package/dist/src/react/core/backend.js.map +1 -0
  361. package/dist/src/react/core/background-runs.d.ts +32 -0
  362. package/dist/src/react/core/background-runs.d.ts.map +1 -0
  363. package/dist/src/react/core/background-runs.js +47 -0
  364. package/dist/src/react/core/background-runs.js.map +1 -0
  365. package/dist/src/react/core/catalog/use-agents.d.ts +31 -0
  366. package/dist/src/react/core/catalog/use-agents.d.ts.map +1 -0
  367. package/dist/src/react/core/catalog/use-agents.js +28 -0
  368. package/dist/src/react/core/catalog/use-agents.js.map +1 -0
  369. package/dist/src/react/core/catalog/use-models.d.ts +41 -0
  370. package/dist/src/react/core/catalog/use-models.d.ts.map +1 -0
  371. package/dist/src/react/core/catalog/use-models.js +35 -0
  372. package/dist/src/react/core/catalog/use-models.js.map +1 -0
  373. package/dist/src/react/core/catalog/use-resource.d.ts +12 -0
  374. package/dist/src/react/core/catalog/use-resource.d.ts.map +1 -0
  375. package/dist/src/react/core/catalog/use-resource.js +41 -0
  376. package/dist/src/react/core/catalog/use-resource.js.map +1 -0
  377. package/dist/src/react/core/client-wire.d.ts +14 -0
  378. package/dist/src/react/core/client-wire.d.ts.map +1 -0
  379. package/dist/src/react/core/client-wire.js +2 -0
  380. package/dist/src/react/core/client-wire.js.map +1 -0
  381. package/dist/src/react/core/client.d.ts +222 -0
  382. package/dist/src/react/core/client.d.ts.map +1 -0
  383. package/dist/src/react/core/client.js +435 -0
  384. package/dist/src/react/core/client.js.map +1 -0
  385. package/dist/src/react/core/components/ambient-ui.d.ts +22 -0
  386. package/dist/src/react/core/components/ambient-ui.d.ts.map +1 -0
  387. package/dist/src/react/core/components/ambient-ui.js +30 -0
  388. package/dist/src/react/core/components/ambient-ui.js.map +1 -0
  389. package/dist/src/react/core/components/chat-input.d.ts +44 -0
  390. package/dist/src/react/core/components/chat-input.d.ts.map +1 -0
  391. package/dist/src/react/core/components/chat-input.js +69 -0
  392. package/dist/src/react/core/components/chat-input.js.map +1 -0
  393. package/dist/src/react/core/components/index.d.ts +7 -0
  394. package/dist/src/react/core/components/index.d.ts.map +1 -0
  395. package/dist/src/react/core/components/index.js +7 -0
  396. package/dist/src/react/core/components/index.js.map +1 -0
  397. package/dist/src/react/core/components/message-item.d.ts +101 -0
  398. package/dist/src/react/core/components/message-item.d.ts.map +1 -0
  399. package/dist/src/react/core/components/message-item.js +118 -0
  400. package/dist/src/react/core/components/message-item.js.map +1 -0
  401. package/dist/src/react/core/components/message-list.d.ts +85 -0
  402. package/dist/src/react/core/components/message-list.d.ts.map +1 -0
  403. package/dist/src/react/core/components/message-list.js +45 -0
  404. package/dist/src/react/core/components/message-list.js.map +1 -0
  405. package/dist/src/react/core/components/speech-languages.d.ts +22 -0
  406. package/dist/src/react/core/components/speech-languages.d.ts.map +1 -0
  407. package/dist/src/react/core/components/speech-languages.js +38 -0
  408. package/dist/src/react/core/components/speech-languages.js.map +1 -0
  409. package/dist/src/react/core/components/use-speech-recognition.d.ts +19 -0
  410. package/dist/src/react/core/components/use-speech-recognition.d.ts.map +1 -0
  411. package/dist/src/react/core/components/use-speech-recognition.js +92 -0
  412. package/dist/src/react/core/components/use-speech-recognition.js.map +1 -0
  413. package/dist/src/react/core/composer/index.d.ts +4 -0
  414. package/dist/src/react/core/composer/index.d.ts.map +1 -0
  415. package/dist/src/react/core/composer/index.js +4 -0
  416. package/dist/src/react/core/composer/index.js.map +1 -0
  417. package/dist/src/react/core/composer/model.d.ts +83 -0
  418. package/dist/src/react/core/composer/model.d.ts.map +1 -0
  419. package/dist/src/react/core/composer/model.js +53 -0
  420. package/dist/src/react/core/composer/model.js.map +1 -0
  421. package/dist/src/react/core/composer/skills-source.d.ts +29 -0
  422. package/dist/src/react/core/composer/skills-source.d.ts.map +1 -0
  423. package/dist/src/react/core/composer/skills-source.js +61 -0
  424. package/dist/src/react/core/composer/skills-source.js.map +1 -0
  425. package/dist/src/react/core/composer/use-composer-autocomplete.d.ts +78 -0
  426. package/dist/src/react/core/composer/use-composer-autocomplete.d.ts.map +1 -0
  427. package/dist/src/react/core/composer/use-composer-autocomplete.js +244 -0
  428. package/dist/src/react/core/composer/use-composer-autocomplete.js.map +1 -0
  429. package/dist/src/react/core/config/use-agent-config.d.ts +21 -0
  430. package/dist/src/react/core/config/use-agent-config.d.ts.map +1 -0
  431. package/dist/src/react/core/config/use-agent-config.js +57 -0
  432. package/dist/src/react/core/config/use-agent-config.js.map +1 -0
  433. package/dist/src/react/core/elicitation/answers.d.ts +22 -0
  434. package/dist/src/react/core/elicitation/answers.d.ts.map +1 -0
  435. package/dist/src/react/core/elicitation/answers.js +65 -0
  436. package/dist/src/react/core/elicitation/answers.js.map +1 -0
  437. package/dist/src/react/core/feedback/use-message-feedback.d.ts +32 -0
  438. package/dist/src/react/core/feedback/use-message-feedback.d.ts.map +1 -0
  439. package/dist/src/react/core/feedback/use-message-feedback.js +106 -0
  440. package/dist/src/react/core/feedback/use-message-feedback.js.map +1 -0
  441. package/dist/src/react/core/genui/generative-ui.d.ts +76 -0
  442. package/dist/src/react/core/genui/generative-ui.d.ts.map +1 -0
  443. package/dist/src/react/core/genui/generative-ui.js +210 -0
  444. package/dist/src/react/core/genui/generative-ui.js.map +1 -0
  445. package/dist/src/react/core/genui/index.d.ts +5 -0
  446. package/dist/src/react/core/genui/index.d.ts.map +1 -0
  447. package/dist/src/react/core/genui/index.js +5 -0
  448. package/dist/src/react/core/genui/index.js.map +1 -0
  449. package/dist/src/react/core/genui/json-render.d.ts +54 -0
  450. package/dist/src/react/core/genui/json-render.d.ts.map +1 -0
  451. package/dist/src/react/core/genui/json-render.js +64 -0
  452. package/dist/src/react/core/genui/json-render.js.map +1 -0
  453. package/dist/src/react/core/genui/playwright.d.ts +12 -0
  454. package/dist/src/react/core/genui/playwright.d.ts.map +1 -0
  455. package/dist/src/react/core/genui/playwright.js +141 -0
  456. package/dist/src/react/core/genui/playwright.js.map +1 -0
  457. package/dist/src/react/core/genui/react-registry.d.ts +22 -0
  458. package/dist/src/react/core/genui/react-registry.d.ts.map +1 -0
  459. package/dist/src/react/core/genui/react-registry.js +72 -0
  460. package/dist/src/react/core/genui/react-registry.js.map +1 -0
  461. package/dist/src/react/core/genui/server.d.ts +32 -0
  462. package/dist/src/react/core/genui/server.d.ts.map +1 -0
  463. package/dist/src/react/core/genui/server.js +66 -0
  464. package/dist/src/react/core/genui/server.js.map +1 -0
  465. package/dist/src/react/core/genui/types.d.ts +98 -0
  466. package/dist/src/react/core/genui/types.d.ts.map +1 -0
  467. package/dist/src/react/core/genui/types.js +3 -0
  468. package/dist/src/react/core/genui/types.js.map +1 -0
  469. package/dist/src/react/core/genui/use-generative-ui.d.ts +42 -0
  470. package/dist/src/react/core/genui/use-generative-ui.d.ts.map +1 -0
  471. package/dist/src/react/core/genui/use-generative-ui.js +186 -0
  472. package/dist/src/react/core/genui/use-generative-ui.js.map +1 -0
  473. package/dist/src/react/core/http-error.d.ts +33 -0
  474. package/dist/src/react/core/http-error.d.ts.map +1 -0
  475. package/dist/src/react/core/http-error.js +47 -0
  476. package/dist/src/react/core/http-error.js.map +1 -0
  477. package/dist/src/react/core/index.d.ts +35 -0
  478. package/dist/src/react/core/index.d.ts.map +1 -0
  479. package/dist/src/react/core/index.js +34 -0
  480. package/dist/src/react/core/index.js.map +1 -0
  481. package/dist/src/react/core/markdown/agent-markdown.d.ts +39 -0
  482. package/dist/src/react/core/markdown/agent-markdown.d.ts.map +1 -0
  483. package/dist/src/react/core/markdown/agent-markdown.js +22 -0
  484. package/dist/src/react/core/markdown/agent-markdown.js.map +1 -0
  485. package/dist/src/react/core/markdown/index.d.ts +2 -0
  486. package/dist/src/react/core/markdown/index.d.ts.map +1 -0
  487. package/dist/src/react/core/markdown/index.js +2 -0
  488. package/dist/src/react/core/markdown/index.js.map +1 -0
  489. package/dist/src/react/core/media/index.d.ts +64 -0
  490. package/dist/src/react/core/media/index.d.ts.map +1 -0
  491. package/dist/src/react/core/media/index.js +135 -0
  492. package/dist/src/react/core/media/index.js.map +1 -0
  493. package/dist/src/react/core/media/tus.d.ts +13 -0
  494. package/dist/src/react/core/media/tus.d.ts.map +1 -0
  495. package/dist/src/react/core/media/tus.js +59 -0
  496. package/dist/src/react/core/media/tus.js.map +1 -0
  497. package/dist/src/react/core/presentation/phrasing.d.ts +25 -0
  498. package/dist/src/react/core/presentation/phrasing.d.ts.map +1 -0
  499. package/dist/src/react/core/presentation/phrasing.js +58 -0
  500. package/dist/src/react/core/presentation/phrasing.js.map +1 -0
  501. package/dist/src/react/core/presentation/result-view.d.ts +43 -0
  502. package/dist/src/react/core/presentation/result-view.d.ts.map +1 -0
  503. package/dist/src/react/core/presentation/result-view.js +90 -0
  504. package/dist/src/react/core/presentation/result-view.js.map +1 -0
  505. package/dist/src/react/core/presentation/tool-activity.d.ts +106 -0
  506. package/dist/src/react/core/presentation/tool-activity.d.ts.map +1 -0
  507. package/dist/src/react/core/presentation/tool-activity.js +165 -0
  508. package/dist/src/react/core/presentation/tool-activity.js.map +1 -0
  509. package/dist/src/react/core/presentation/use-tool-catalog.d.ts +39 -0
  510. package/dist/src/react/core/presentation/use-tool-catalog.d.ts.map +1 -0
  511. package/dist/src/react/core/presentation/use-tool-catalog.js +77 -0
  512. package/dist/src/react/core/presentation/use-tool-catalog.js.map +1 -0
  513. package/dist/src/react/core/provider.d.ts +68 -0
  514. package/dist/src/react/core/provider.d.ts.map +1 -0
  515. package/dist/src/react/core/provider.js +61 -0
  516. package/dist/src/react/core/provider.js.map +1 -0
  517. package/dist/src/react/core/queue/model.d.ts +73 -0
  518. package/dist/src/react/core/queue/model.d.ts.map +1 -0
  519. package/dist/src/react/core/queue/model.js +2 -0
  520. package/dist/src/react/core/queue/model.js.map +1 -0
  521. package/dist/src/react/core/quota/use-quota.d.ts +35 -0
  522. package/dist/src/react/core/quota/use-quota.d.ts.map +1 -0
  523. package/dist/src/react/core/quota/use-quota.js +47 -0
  524. package/dist/src/react/core/quota/use-quota.js.map +1 -0
  525. package/dist/src/react/core/reasoning/timing.d.ts +38 -0
  526. package/dist/src/react/core/reasoning/timing.d.ts.map +1 -0
  527. package/dist/src/react/core/reasoning/timing.js +73 -0
  528. package/dist/src/react/core/reasoning/timing.js.map +1 -0
  529. package/dist/src/react/core/run-errors.d.ts +37 -0
  530. package/dist/src/react/core/run-errors.d.ts.map +1 -0
  531. package/dist/src/react/core/run-errors.js +37 -0
  532. package/dist/src/react/core/run-errors.js.map +1 -0
  533. package/dist/src/react/core/stored-message-to-ui-message.d.ts +4 -0
  534. package/dist/src/react/core/stored-message-to-ui-message.d.ts.map +1 -0
  535. package/dist/src/react/core/stored-message-to-ui-message.js +216 -0
  536. package/dist/src/react/core/stored-message-to-ui-message.js.map +1 -0
  537. package/dist/src/react/core/stored-thread-to-ui-messages.d.ts +82 -0
  538. package/dist/src/react/core/stored-thread-to-ui-messages.d.ts.map +1 -0
  539. package/dist/src/react/core/stored-thread-to-ui-messages.js +116 -0
  540. package/dist/src/react/core/stored-thread-to-ui-messages.js.map +1 -0
  541. package/dist/src/react/core/threads/threads-events.d.ts +22 -0
  542. package/dist/src/react/core/threads/threads-events.d.ts.map +1 -0
  543. package/dist/src/react/core/threads/threads-events.js +21 -0
  544. package/dist/src/react/core/threads/threads-events.js.map +1 -0
  545. package/dist/src/react/core/threads/use-threads.d.ts +31 -0
  546. package/dist/src/react/core/threads/use-threads.d.ts.map +1 -0
  547. package/dist/src/react/core/threads/use-threads.js +81 -0
  548. package/dist/src/react/core/threads/use-threads.js.map +1 -0
  549. package/dist/src/react/core/transcript/index.d.ts +4 -0
  550. package/dist/src/react/core/transcript/index.d.ts.map +1 -0
  551. package/dist/src/react/core/transcript/index.js +4 -0
  552. package/dist/src/react/core/transcript/index.js.map +1 -0
  553. package/dist/src/react/core/transcript/model.d.ts +399 -0
  554. package/dist/src/react/core/transcript/model.d.ts.map +1 -0
  555. package/dist/src/react/core/transcript/model.js +725 -0
  556. package/dist/src/react/core/transcript/model.js.map +1 -0
  557. package/dist/src/react/core/transcript/use-chat-transcript.d.ts +254 -0
  558. package/dist/src/react/core/transcript/use-chat-transcript.d.ts.map +1 -0
  559. package/dist/src/react/core/transcript/use-chat-transcript.js +572 -0
  560. package/dist/src/react/core/transcript/use-chat-transcript.js.map +1 -0
  561. package/dist/src/react/core/transcript/use-stick-to-bottom.d.ts +33 -0
  562. package/dist/src/react/core/transcript/use-stick-to-bottom.d.ts.map +1 -0
  563. package/dist/src/react/core/transcript/use-stick-to-bottom.js +48 -0
  564. package/dist/src/react/core/transcript/use-stick-to-bottom.js.map +1 -0
  565. package/dist/src/react/core/use-agent-chat.d.ts +341 -0
  566. package/dist/src/react/core/use-agent-chat.d.ts.map +1 -0
  567. package/dist/src/react/core/use-agent-chat.js +1118 -0
  568. package/dist/src/react/core/use-agent-chat.js.map +1 -0
  569. package/dist/src/react/genui/index.d.ts +1 -7
  570. package/dist/src/react/genui/index.d.ts.map +1 -1
  571. package/dist/src/react/genui/index.js +1 -7
  572. package/dist/src/react/genui/index.js.map +1 -1
  573. package/dist/src/react/genui/json-render.d.ts +1 -5
  574. package/dist/src/react/genui/json-render.d.ts.map +1 -1
  575. package/dist/src/react/genui/json-render.js +1 -5
  576. package/dist/src/react/genui/json-render.js.map +1 -1
  577. package/dist/src/react/genui/server.d.ts +2 -0
  578. package/dist/src/react/genui/server.d.ts.map +1 -0
  579. package/dist/src/react/genui/server.js +2 -0
  580. package/dist/src/react/genui/server.js.map +1 -0
  581. package/dist/src/react/genui/server_playwright.d.ts +2 -0
  582. package/dist/src/react/genui/server_playwright.d.ts.map +1 -0
  583. package/dist/src/react/genui/server_playwright.js +2 -0
  584. package/dist/src/react/genui/server_playwright.js.map +1 -0
  585. package/dist/src/react/index.d.ts +5 -7
  586. package/dist/src/react/index.d.ts.map +1 -1
  587. package/dist/src/react/index.js +5 -7
  588. package/dist/src/react/index.js.map +1 -1
  589. package/dist/src/react/markdown.d.ts +1 -6
  590. package/dist/src/react/markdown.d.ts.map +1 -1
  591. package/dist/src/react/markdown.js +1 -6
  592. package/dist/src/react/markdown.js.map +1 -1
  593. package/dist/src/react/media.d.ts +1 -17
  594. package/dist/src/react/media.d.ts.map +1 -1
  595. package/dist/src/react/media.js +1 -17
  596. package/dist/src/react/media.js.map +1 -1
  597. package/dist/src/refusal.d.ts +3 -0
  598. package/dist/src/refusal.d.ts.map +1 -0
  599. package/dist/src/refusal.js +3 -0
  600. package/dist/src/refusal.js.map +1 -0
  601. package/dist/src/spi/action-proposal-outcome-store.d.ts +43 -0
  602. package/dist/src/spi/action-proposal-outcome-store.d.ts.map +1 -0
  603. package/dist/src/spi/action-proposal-outcome-store.js +2 -0
  604. package/dist/src/spi/action-proposal-outcome-store.js.map +1 -0
  605. package/dist/src/spi/action-proposal-store.d.ts +152 -0
  606. package/dist/src/spi/action-proposal-store.d.ts.map +1 -0
  607. package/dist/src/spi/action-proposal-store.js +2 -0
  608. package/dist/src/spi/action-proposal-store.js.map +1 -0
  609. package/dist/src/spi/action-proposal-worker-store.d.ts +17 -0
  610. package/dist/src/spi/action-proposal-worker-store.d.ts.map +1 -0
  611. package/dist/src/spi/action-proposal-worker-store.js +2 -0
  612. package/dist/src/spi/action-proposal-worker-store.js.map +1 -0
  613. package/dist/src/spi/agent-runner.d.ts +6 -0
  614. package/dist/src/spi/agent-runner.d.ts.map +1 -1
  615. package/dist/src/spi/agent-store.d.ts +5 -0
  616. package/dist/src/spi/agent-store.d.ts.map +1 -1
  617. package/dist/src/spi/agent-store.js.map +1 -1
  618. package/dist/src/spi/approval-policy.d.ts +3 -0
  619. package/dist/src/spi/approval-policy.d.ts.map +1 -1
  620. package/dist/src/spi/approval-policy.js +8 -1
  621. package/dist/src/spi/approval-policy.js.map +1 -1
  622. package/dist/src/spi/background-actor-resolver.d.ts +9 -0
  623. package/dist/src/spi/background-actor-resolver.d.ts.map +1 -0
  624. package/dist/src/spi/background-actor-resolver.js +2 -0
  625. package/dist/src/spi/background-actor-resolver.js.map +1 -0
  626. package/dist/src/spi/chat-queue.d.ts +7 -1
  627. package/dist/src/spi/chat-queue.d.ts.map +1 -1
  628. package/dist/src/spi/chat-queue.js.map +1 -1
  629. package/dist/src/spi/protocol-adapter.d.ts +3 -3
  630. package/dist/src/spi/roles-policy.d.ts +7 -0
  631. package/dist/src/spi/roles-policy.d.ts.map +1 -1
  632. package/dist/src/spi/token-stream-sink.d.ts +9 -0
  633. package/dist/src/spi/token-stream-sink.d.ts.map +1 -1
  634. package/dist/src/spi/token-stream-sink.js.map +1 -1
  635. package/dist/src/spi/tool.d.ts +40 -3
  636. package/dist/src/spi/tool.d.ts.map +1 -1
  637. package/dist/src/sse.d.ts.map +1 -1
  638. package/dist/src/sse.js +6 -0
  639. package/dist/src/sse.js.map +1 -1
  640. package/dist/src/stores/lucid-action-proposal-store.d.ts +55 -0
  641. package/dist/src/stores/lucid-action-proposal-store.d.ts.map +1 -0
  642. package/dist/src/stores/lucid-action-proposal-store.js +465 -0
  643. package/dist/src/stores/lucid-action-proposal-store.js.map +1 -0
  644. package/dist/src/stores/lucid-schema.d.ts +8 -6
  645. package/dist/src/stores/lucid-schema.d.ts.map +1 -1
  646. package/dist/src/stores/lucid-schema.js +61 -6
  647. package/dist/src/stores/lucid-schema.js.map +1 -1
  648. package/dist/src/stores/lucid.d.ts +4 -2
  649. package/dist/src/stores/lucid.d.ts.map +1 -1
  650. package/dist/src/stores/lucid.js +46 -14
  651. package/dist/src/stores/lucid.js.map +1 -1
  652. package/dist/src/stores/sqlite-transactions.d.ts +8 -0
  653. package/dist/src/stores/sqlite-transactions.d.ts.map +1 -0
  654. package/dist/src/stores/sqlite-transactions.js +24 -0
  655. package/dist/src/stores/sqlite-transactions.js.map +1 -0
  656. package/dist/src/stream-events.d.ts +4 -0
  657. package/dist/src/stream-events.d.ts.map +1 -1
  658. package/dist/src/testing/chat-queue-store-contract.d.ts.map +1 -1
  659. package/dist/src/testing/chat-queue-store-contract.js +4 -0
  660. package/dist/src/testing/chat-queue-store-contract.js.map +1 -1
  661. package/dist/src/testing/in-memory-action-proposal-store.d.ts +32 -0
  662. package/dist/src/testing/in-memory-action-proposal-store.d.ts.map +1 -0
  663. package/dist/src/testing/in-memory-action-proposal-store.js +159 -0
  664. package/dist/src/testing/in-memory-action-proposal-store.js.map +1 -0
  665. package/dist/src/testing/in-memory-store.d.ts +9 -1
  666. package/dist/src/testing/in-memory-store.d.ts.map +1 -1
  667. package/dist/src/testing/in-memory-store.js +80 -1
  668. package/dist/src/testing/in-memory-store.js.map +1 -1
  669. package/dist/src/testing/index.d.ts +1 -0
  670. package/dist/src/testing/index.d.ts.map +1 -1
  671. package/dist/src/testing/index.js +1 -0
  672. package/dist/src/testing/index.js.map +1 -1
  673. package/dist/src/tool-discovery.d.ts +1 -1
  674. package/dist/src/tool-discovery.d.ts.map +1 -1
  675. package/dist/src/tool-discovery.js +12 -1
  676. package/dist/src/tool-discovery.js.map +1 -1
  677. package/dist/src/tool-registry.d.ts +28 -1
  678. package/dist/src/tool-registry.d.ts.map +1 -1
  679. package/dist/src/tool-registry.js +85 -3
  680. package/dist/src/tool-registry.js.map +1 -1
  681. package/dist/src/tool-result-presentation.d.ts +12 -0
  682. package/dist/src/tool-result-presentation.d.ts.map +1 -0
  683. package/dist/src/tool-result-presentation.js +44 -0
  684. package/dist/src/tool-result-presentation.js.map +1 -0
  685. package/dist/src/tool-retry.d.ts +0 -11
  686. package/dist/src/tool-retry.d.ts.map +1 -1
  687. package/dist/src/tool-retry.js +5 -1
  688. package/dist/src/tool-retry.js.map +1 -1
  689. package/dist/src/tool-ui.d.ts +4 -1
  690. package/dist/src/tool-ui.d.ts.map +1 -1
  691. package/dist/src/tool-ui.js +32 -4
  692. package/dist/src/tool-ui.js.map +1 -1
  693. package/dist/src/types.d.ts +48 -2
  694. package/dist/src/types.d.ts.map +1 -1
  695. package/dist/src/ui-capabilities.d.ts +2 -0
  696. package/dist/src/ui-capabilities.d.ts.map +1 -0
  697. package/dist/src/ui-capabilities.js +4 -0
  698. package/dist/src/ui-capabilities.js.map +1 -0
  699. package/dist/stubs/database/migrations/add_action_proposal_discovery.stub +24 -0
  700. package/dist/stubs/database/migrations/add_action_proposal_runtime.stub +19 -0
  701. package/dist/stubs/database/migrations/create_agent_tables.stub +3 -3
  702. package/package.json +123 -22
  703. package/skills/agent-governance/SKILL.md +12 -4
  704. package/skills/agent-personas-agents/SKILL.md +2 -1
  705. package/skills/agent-setup/SKILL.md +36 -13
  706. package/skills/agent-testing/SKILL.md +22 -0
  707. package/skills/agent-tools/SKILL.md +54 -9
@@ -1,9 +1,16 @@
1
+ import { DEFAULT_REFUSAL_REASON } from './refusal.js';
2
+ export { DEFAULT_REFUSAL_REASON } from './refusal.js';
3
+ import { createHash } from 'node:crypto';
4
+ import { resolveActionProposalApproval } from './action-proposal-approval.js';
5
+ import { prepareActionProposal } from './action-proposal-preparation.js';
6
+ import { actionProposalReceipt } from './action-proposal-receipt.js';
1
7
  import { danglingToolCallIds, settleDanglingToolCalls } from './dangling-tool-calls.js';
2
8
  import { detachedDelivered, detachedStarted, } from './delegation.js';
3
9
  import { publishAgentDelegated, publishAgentMessage, publishAgentRetrieved, publishAgentRunFinished, publishAgentRunStarted, publishAgentToolCall, publishAgentToolRetry, spannedAgent, } from './diagnostics.js';
4
10
  import { ASK_TOOL_NAME, askInputSchema, askToolDefinition, DEFAULT_INTAKE_PREAMBLE, isHumanDecision, normalizeElicitationReply, settleElicitation, } from './elicitation.js';
5
11
  import { buildMemoryBlock, offerMemories, REMEMBER_TOOL_NAME, rememberInputSchema, rememberToolDefinition, writeMemory, } from './memory.js';
6
- import { intersectAllowLists, personaFromTurn } from './personas.js';
12
+ import { createNegotiatedUiCollector } from './negotiated-tool-ui.js';
13
+ import { personaFromTurn } from './personas.js';
7
14
  import { createFrameBuffer, createIncrementalGate, gateTail, releaseGatedFrames, resolveGateLookback, resolveOutputGateMode, runInputProcessors, runOutputProcessors, } from './processors.js';
8
15
  import { isReplayIntegrityError } from './replay-integrity.js';
9
16
  import { buildSkillsBlock, loadSkill, offerSkills, SKILL_TOOL_NAME, skillInputSchema, skillToolDefinition, } from './skills.js';
@@ -12,9 +19,9 @@ import { withSelectedModel } from './spi/model-catalog.js';
12
19
  import { estimateCost, resolveModelPrice, } from './spi/pricing-store.js';
13
20
  import { OutputRejectedError, } from './spi/processors.js';
14
21
  import { DEFAULT_STRUCTURED_OUTPUT_INSTRUCTION, repairInstruction, StructuredOutputError, validateStructured, } from './structured-output.js';
15
- import { ToolForbiddenError, ToolInputInvalidError } from './tool-registry.js';
22
+ import { ToolForbiddenError, ToolInputInvalidError, ToolPreflightDeniedError, } from './tool-registry.js';
16
23
  import { invokeWithTransientRetry } from './tool-retry.js';
17
- import { createNoopEmitUi, createUiCollector, mergeUi, unwrapToolStepOutput, wrapToolStepOutput, } from './tool-ui.js';
24
+ import { createNoopEmitUi, escapeUnsafeToolUiText, mergeUi, unwrapToolStepOutput, wrapToolStepOutput, } from './tool-ui.js';
18
25
  import { observeTurnFrames, withTurnFrames } from './turn-frames.js';
19
26
  /** Renders retrieved passages as a numbered, citable context block appended to the system prompt. */
20
27
  function buildContextBlock(passages) {
@@ -93,6 +100,7 @@ function promptContext(input, persona) {
93
100
  actor: input.actor,
94
101
  ...(persona !== undefined ? { persona: personaFromTurn(persona) } : {}),
95
102
  ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
103
+ ...(input.uiCapabilities !== undefined ? { uiCapabilities: input.uiCapabilities } : {}),
96
104
  };
97
105
  }
98
106
  /**
@@ -313,6 +321,7 @@ function threadForTurn(recorded) {
313
321
  const messages = settleDanglingToolCalls((recorded?.messages ?? []).map(toModelMessage));
314
322
  return {
315
323
  messages,
324
+ actionApprovalMode: recorded?.actionApprovalMode ?? 'blocking',
316
325
  title: recorded?.title ?? null,
317
326
  hasAssistantMessage: recorded?.hasAssistantMessage ?? messages.some((message) => message.role === 'assistant'),
318
327
  };
@@ -622,6 +631,7 @@ function elicitationContext(deps, input, hooks) {
622
631
  ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
623
632
  ...personaContext(input),
624
633
  ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
634
+ ...(input.uiCapabilities !== undefined ? { uiCapabilities: input.uiCapabilities } : {}),
625
635
  ...(deps.host !== undefined ? { host: deps.host } : {}),
626
636
  };
627
637
  }
@@ -653,6 +663,30 @@ const MESSAGE_TOOL_RESULTS_PATCH = 'agent:message-tool-results';
653
663
  async function claimToolCall(turn, call) {
654
664
  const { deps, input, hooks, messageId, writer } = turn;
655
665
  const persona = personaOf(input);
666
+ const ctx = {
667
+ actor: input.actor,
668
+ threadId: input.threadId,
669
+ runId: hooks.runId,
670
+ requestId: hooks.runId,
671
+ // Replaced by the call's own collector inside its `tool:` step (see invokeClaimedTool); a
672
+ // kind that never reaches a handler keeps this no-op.
673
+ emitUi: createNoopEmitUi(call.id),
674
+ ...(deps.onPresentationError !== undefined
675
+ ? {
676
+ onPresentationError: (error, details) => deps.onPresentationError(error, {
677
+ ...details,
678
+ toolCallId: call.id,
679
+ runId: hooks.runId,
680
+ threadId: input.threadId,
681
+ }),
682
+ }
683
+ : {}),
684
+ ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
685
+ ...(persona !== undefined ? { persona } : {}),
686
+ ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
687
+ ...(input.uiCapabilities !== undefined ? { uiCapabilities: input.uiCapabilities } : {}),
688
+ ...(deps.host !== undefined ? { host: deps.host } : {}),
689
+ };
656
690
  const persisted = (await hooks.step(`persist:toolcall:${call.id}`, async () => {
657
691
  // The kind the llm checkpoint stamped WINS: it came from the process that offered the tool,
658
692
  // whereas this one is only the process claiming the call — and the two disagree exactly when
@@ -682,15 +716,138 @@ async function claimToolCall(turn, call) {
682
716
  // set can both change while a run is parked, and the branch below (park or run) has to be the
683
717
  // one the journal recorded. A run claimed before this existed reads `approval` back as
684
718
  // undefined and waits on the requester, exactly as it did.
685
- const approval = kind === 'action' ? await claimApproval(turn, call) : undefined;
686
- const parks = kind === 'ask' || approval?.mode === 'ask';
719
+ let actionApproval = call.actionApproval;
720
+ if (kind === 'action' &&
721
+ turn.actionApprovalMode === 'independent' &&
722
+ actionApproval === undefined)
723
+ actionApproval = await resolveActionProposalApproval({
724
+ actor: input.actor,
725
+ thread: {
726
+ threadId: input.threadId,
727
+ runId: hooks.runId,
728
+ ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
729
+ },
730
+ tool: {
731
+ name: call.name,
732
+ kind: 'action',
733
+ ...(deps.registry.spec(call.name) !== undefined
734
+ ? { spec: deps.registry.spec(call.name) }
735
+ : {}),
736
+ },
737
+ store: deps.store,
738
+ ...(deps.approvalPolicy !== undefined ? { policy: deps.approvalPolicy } : {}),
739
+ });
740
+ let preflight = call.preflight;
741
+ let prepared = call.prepared;
742
+ if (kind === 'action' && preflight === undefined && deps.registry.has(call.name)) {
743
+ try {
744
+ const allowedTools = intersectAllow(persona?.allowedTools, deps.toolAllowList);
745
+ if (turn.actionApprovalMode === 'independent' && actionApproval?.mode === 'ask') {
746
+ prepared = await prepareActionProposal(deps.registry, call.name, call.input, { ...ctx, toolCallId: call.id, idempotencyKey: `${hooks.runId}:${call.id}` }, deps.rolesPolicy, allowedTools === undefined ? {} : { allowedTools });
747
+ preflight = prepared.preflight;
748
+ }
749
+ else
750
+ preflight = await deps.registry.prepare(call.name, call.input, {
751
+ ...ctx,
752
+ toolCallId: call.id,
753
+ idempotencyKey: `${hooks.runId}:${call.id}`,
754
+ }, deps.rolesPolicy, allowedTools === undefined ? {} : { allowedTools });
755
+ }
756
+ catch (error) {
757
+ if (isReplayIntegrityError(error) || hooks.isControlFlowError?.(error) === true)
758
+ throw error;
759
+ preflight = {
760
+ status: 'failed',
761
+ error: error instanceof Error ? error.message : String(error),
762
+ };
763
+ }
764
+ }
765
+ const early = preflight !== undefined && preflight.status !== 'ready';
766
+ let confirmation = preflight?.status === 'ready' ? preflight.confirmation : undefined;
767
+ const approval = kind === 'action' && !early
768
+ ? (actionApproval ?? (await claimApproval(turn, call)))
769
+ : undefined;
770
+ let proposalId;
771
+ if (turn.actionApprovalMode === 'independent' && approval?.mode === 'ask') {
772
+ if (!prepared)
773
+ throw new Error('Independent action lacks trusted prepared input');
774
+ const store = deps.store;
775
+ if (typeof store.createActionProposal !== 'function')
776
+ throw new Error('Independent proposal store unavailable');
777
+ proposalId = `proposal-${createHash('sha256')
778
+ .update(JSON.stringify([hooks.runId, call.id]))
779
+ .digest('hex')}`;
780
+ const display = confirmation ??
781
+ deps.registry.spec(call.name)?.presentation?.confirm ?? {
782
+ title: `Allow ${call.name}?`,
783
+ verb: 'Approve',
784
+ };
785
+ const fill = (value) => value.replace(/\{([^}]+)\}/g, (_match, path) => {
786
+ let current = prepared.input;
787
+ for (const part of path.split('.'))
788
+ current =
789
+ current !== null && typeof current === 'object'
790
+ ? current[part]
791
+ : undefined;
792
+ return current === undefined ? '' : String(current);
793
+ });
794
+ const create = prepared.replacementKey === undefined
795
+ ? store.createActionProposal.bind(store)
796
+ : store.createReplacingActionProposal.bind(store);
797
+ const created = await create({
798
+ ...(prepared.replacementKey !== undefined
799
+ ? { replacementKey: prepared.replacementKey }
800
+ : {}),
801
+ id: proposalId,
802
+ tenantRef: input.actor.tenantRef ?? null,
803
+ actorRef: input.actor.id,
804
+ threadId: input.threadId,
805
+ originRunId: hooks.runId,
806
+ originMessageId: messageId,
807
+ originToolCallId: call.id,
808
+ toolName: call.name,
809
+ input: prepared.input,
810
+ preparationInput: prepared.preparationInput,
811
+ executionContext: {
812
+ requestId: hooks.runId,
813
+ ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
814
+ ...(persona !== undefined ? { persona: persona.id } : {}),
815
+ ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
816
+ ...(input.uiCapabilities !== undefined ? { uiCapabilities: input.uiCapabilities } : {}),
817
+ },
818
+ confirmation: confirmation ?? {
819
+ title: fill(display.title),
820
+ verb: fill(display.verb),
821
+ ...(display.detail !== undefined ? { detail: fill(display.detail) } : {}),
822
+ },
823
+ approver: approval.approver,
824
+ expiresAt: approval.expiresAt === undefined ? null : Date.parse(approval.expiresAt),
825
+ idempotencyKey: `${hooks.runId}:${call.id}`,
826
+ });
827
+ if (created.status === 'conflict')
828
+ throw new Error('Action proposal replay payload conflict');
829
+ confirmation = created.proposal?.confirmation ?? confirmation;
830
+ }
831
+ const parks = kind === 'ask' || (approval?.mode === 'ask' && proposalId === undefined);
687
832
  await deps.store.recordToolCall({
688
833
  toolCallId: call.id,
689
834
  messageId,
690
835
  toolName: call.name,
691
836
  toolType: awaitsHuman ? 'action' : 'read',
692
837
  input: call.input,
693
- status: parks ? 'pending_approval' : 'auto_executed',
838
+ ...(proposalId !== undefined ? { proposalId } : {}),
839
+ status: proposalId !== undefined
840
+ ? 'proposed'
841
+ : early
842
+ ? preflight?.status === 'denied'
843
+ ? 'rejected'
844
+ : preflight?.status === 'failed'
845
+ ? 'failed'
846
+ : 'executed'
847
+ : parks
848
+ ? 'pending_approval'
849
+ : 'auto_executed',
850
+ ...(confirmation !== undefined ? { confirmation } : {}),
694
851
  runId: hooks.runId,
695
852
  ...(approval !== undefined && approval.mode !== 'auto'
696
853
  ? { approver: approval.approver }
@@ -699,6 +856,19 @@ async function claimToolCall(turn, call) {
699
856
  ? { expiresAt: approval.expiresAt }
700
857
  : {}),
701
858
  });
859
+ if (early) {
860
+ await deps.store.updateToolCall({
861
+ toolCallId: call.id,
862
+ status: preflight?.status === 'denied'
863
+ ? 'rejected'
864
+ : preflight?.status === 'failed'
865
+ ? 'failed'
866
+ : 'executed',
867
+ ...(preflight?.status === 'completed' ? { output: preflight.output } : {}),
868
+ ...(preflight?.status === 'denied' ? { error: preflight.reason } : {}),
869
+ ...(preflight?.status === 'failed' ? { error: preflight.error } : {}),
870
+ });
871
+ }
702
872
  // Written from INSIDE this checkpoint, so the frame is streamed once and a replay — which
703
873
  // returns the memoized result without re-running the body — never re-posts a form for a
704
874
  // decision already made. That is also why it spends no position of its own.
@@ -708,11 +878,15 @@ async function claimToolCall(turn, call) {
708
878
  if (approval?.mode === 'ask') {
709
879
  await writer.write({
710
880
  t: 'approval',
881
+ ...(proposalId !== undefined
882
+ ? { target: { kind: 'proposal', proposalId } }
883
+ : {}),
711
884
  runId: hooks.runId,
712
885
  id: call.id,
713
886
  toolName: call.name,
714
887
  input: call.input,
715
888
  approver: approval.approver,
889
+ ...(confirmation !== undefined ? { confirmation } : {}),
716
890
  ...(approval.expiresAt !== undefined ? { expiresAt: approval.expiresAt } : {}),
717
891
  });
718
892
  }
@@ -721,8 +895,13 @@ async function claimToolCall(turn, call) {
721
895
  const terminal = deps.registry.spec(call.name)?.terminal === true;
722
896
  return {
723
897
  kind,
898
+ ...(proposalId !== undefined ? { proposalId } : {}),
899
+ ...(preflight !== undefined ? { preflight } : {}),
724
900
  ...(approval !== undefined ? { approval } : {}),
725
901
  ...(terminal ? { terminal: true } : {}),
902
+ ...(preflight?.status === 'completed' && deps.registry.hasPresentation(call.name)
903
+ ? { presentCompletedPreflight: true }
904
+ : {}),
726
905
  };
727
906
  }));
728
907
  // A checkpoint written before the kind was journaled carries no output. Such a run is already
@@ -732,24 +911,15 @@ async function claimToolCall(turn, call) {
732
911
  return {
733
912
  call,
734
913
  toolType,
914
+ ...(persisted?.preflight !== undefined ? { preflight: persisted.preflight } : {}),
735
915
  ...(persisted?.terminal === true ? { terminal: true } : {}),
916
+ ...(persisted?.presentCompletedPreflight === true ? { presentCompletedPreflight: true } : {}),
917
+ ...(persisted?.proposalId !== undefined ? { proposalId: persisted.proposalId } : {}),
736
918
  ...(persisted?.delegation !== undefined ? { delegation: persisted.delegation } : {}),
737
919
  ...(toolType === 'action' && persisted?.approval !== undefined
738
920
  ? { approval: persisted.approval }
739
921
  : {}),
740
- ctx: {
741
- actor: input.actor,
742
- threadId: input.threadId,
743
- runId: hooks.runId,
744
- requestId: hooks.runId,
745
- // Replaced by the call's own collector inside its `tool:` step (see invokeClaimedTool); a
746
- // kind that never reaches a handler keeps this no-op.
747
- emitUi: createNoopEmitUi(call.id),
748
- ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
749
- ...(persona !== undefined ? { persona } : {}),
750
- ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
751
- ...(deps.host !== undefined ? { host: deps.host } : {}),
752
- },
922
+ ctx,
753
923
  };
754
924
  }
755
925
  /**
@@ -811,20 +981,22 @@ function spanToolType(kind) {
811
981
  }
812
982
  return kind === 'skill' || kind === 'memory' ? 'read' : kind;
813
983
  }
814
- async function invokeClaimedTool(turn, claimed) {
984
+ async function invokeClaimedTool(turn, claimed, presentationOnly) {
815
985
  const { deps, hooks } = turn;
816
986
  const { call, ctx, toolType } = claimed;
817
- // Under a persona with an allow-list, the same narrowing the offer had — agent ∩ persona — is what
818
- // `invoke` holds the call to. Without one, nothing new is checked.
819
- const personaAllow = personaOf(turn.input)?.allowedTools;
820
- const invokeOptions = personaAllow === undefined
821
- ? {}
822
- : { allowedTools: intersectAllowLists(deps.toolAllowList, personaAllow) ?? [] };
987
+ // Execution retains every narrowing the offer and preparation had, including an agent-only list.
988
+ const allowedTools = intersectAllow(personaOf(turn.input)?.allowedTools, deps.toolAllowList);
989
+ const invokeOptions = allowedTools === undefined ? {} : { allowedTools };
823
990
  try {
824
991
  const raw = await hooks.step(`tool:${call.id}`, async () => {
825
992
  // Pushed components stream as they happen and ride this step's RESULT into the journal (see
826
993
  // `wrapToolStepOutput`), so a replay neither re-streams nor re-persists them.
827
- const ui = createUiCollector(call.id, turn.writer);
994
+ const ui = createNegotiatedUiCollector(call.id, {
995
+ actor: ctx.actor,
996
+ threadId: ctx.threadId,
997
+ ...(ctx.agentName !== undefined ? { agentName: ctx.agentName } : {}),
998
+ ...(ctx.uiCapabilities !== undefined ? { uiCapabilities: ctx.uiCapabilities } : {}),
999
+ }, deps.resolveUiCatalog, turn.writer);
828
1000
  const toolCtx = {
829
1001
  ...ctx,
830
1002
  // The same for every execution of THIS call (a replay after a crash, a transient retry).
@@ -838,31 +1010,56 @@ async function invokeClaimedTool(turn, claimed) {
838
1010
  : { value: data });
839
1011
  },
840
1012
  };
841
- const output = await spannedAgent('tool.execution', hooks.runId, {
842
- runId: hooks.runId,
843
- toolCallId: call.id,
844
- toolName: call.name,
845
- toolType: spanToolType(toolType),
846
- }, () => invokeWithTransientRetry(() => {
847
- ui.restart();
848
- return deps.registry.invoke(call.name, call.input, toolCtx, deps.rolesPolicy, invokeOptions);
849
- }, deps.toolTransientRetry ?? {}, {
850
- ...(hooks.isControlFlowError !== undefined
851
- ? { isControlFlowError: hooks.isControlFlowError }
852
- : {}),
853
- onRetry: (attempt, retryError) => {
854
- publishAgentToolRetry({
1013
+ let output;
1014
+ try {
1015
+ if (presentationOnly !== undefined) {
1016
+ output = presentationOnly.output;
1017
+ await deps.registry.presentResult(call.name, output, toolCtx);
1018
+ }
1019
+ else {
1020
+ output = await spannedAgent('tool.execution', hooks.runId, {
855
1021
  runId: hooks.runId,
856
- toolName: call.name,
857
1022
  toolCallId: call.id,
858
- attempt,
859
- message: retryError instanceof Error ? retryError.message : String(retryError),
860
- });
861
- },
862
- }), () => ({}));
863
- return wrapToolStepOutput(output, ui.components());
1023
+ toolName: call.name,
1024
+ toolType: spanToolType(toolType),
1025
+ }, () => invokeWithTransientRetry(() => {
1026
+ ui.restart();
1027
+ return deps.registry.invoke(call.name, call.input, toolCtx, deps.rolesPolicy, invokeOptions);
1028
+ }, deps.toolTransientRetry ?? {}, {
1029
+ ...(hooks.isControlFlowError !== undefined
1030
+ ? { isControlFlowError: hooks.isControlFlowError }
1031
+ : {}),
1032
+ onRetry: (attempt, retryError) => {
1033
+ publishAgentToolRetry({
1034
+ runId: hooks.runId,
1035
+ toolName: call.name,
1036
+ toolCallId: call.id,
1037
+ attempt,
1038
+ message: retryError instanceof Error ? retryError.message : String(retryError),
1039
+ });
1040
+ },
1041
+ }), () => ({}));
1042
+ }
1043
+ }
1044
+ catch (error) {
1045
+ // A domain refusal is a settled result, so a durable replay must not re-run the check.
1046
+ if (!(error instanceof ToolPreflightDeniedError))
1047
+ throw error;
1048
+ return { '@@adonis-agent/tool-preflight-denied': 1, reason: error.reason };
1049
+ }
1050
+ return wrapToolStepOutput(output, ui.components(), ui.text());
864
1051
  });
865
- const { output, ui } = unwrapToolStepOutput(raw);
1052
+ if (typeof raw === 'object' &&
1053
+ raw !== null &&
1054
+ '@@adonis-agent/tool-preflight-denied' in raw &&
1055
+ raw['@@adonis-agent/tool-preflight-denied'] === 1 &&
1056
+ 'reason' in raw &&
1057
+ typeof raw.reason === 'string') {
1058
+ return { status: 'failed', error: raw.reason, denied: true };
1059
+ }
1060
+ const { output, ui, text } = unwrapToolStepOutput(raw);
1061
+ if (text)
1062
+ turn.toolText.set(call.id, text);
866
1063
  if (ui.length > 0) {
867
1064
  turn.toolUi.set(call.id, ui);
868
1065
  }
@@ -875,7 +1072,11 @@ async function invokeClaimedTool(turn, claimed) {
875
1072
  if (isReplayIntegrityError(error) || hooks.isControlFlowError?.(error) === true) {
876
1073
  throw error;
877
1074
  }
878
- return { status: 'failed', error: error instanceof Error ? error.message : String(error) };
1075
+ return {
1076
+ status: 'failed',
1077
+ error: error instanceof Error ? error.message : String(error),
1078
+ ...(error instanceof ToolPreflightDeniedError ? { denied: true } : {}),
1079
+ };
879
1080
  }
880
1081
  }
881
1082
  /** Persist one settled invocation and shape the result the model is fed. */
@@ -922,7 +1123,13 @@ async function recordToolOutcome(turn, claimed, outcome, deciderRef = turn.input
922
1123
  await settle();
923
1124
  });
924
1125
  publishAgentToolCall({ runId: hooks.runId, toolName: call.name, toolType, status: 'failed' });
925
- return { id: call.id, name: call.name, output: null, error: outcome.error };
1126
+ return {
1127
+ id: call.id,
1128
+ name: call.name,
1129
+ output: outcome.denied ? { reason: outcome.error } : null,
1130
+ error: outcome.error,
1131
+ ...(outcome.denied ? { denied: true } : {}),
1132
+ };
926
1133
  }
927
1134
  await hooks.step(`persist:toolexec:${call.id}`, async () => {
928
1135
  await deps.store.updateToolCall({
@@ -986,14 +1193,95 @@ async function delegateToolCall(turn, claimed) {
986
1193
  * what puts the kind in the journal — so the branch a call takes is a fact about the turn rather
987
1194
  * than about whichever process happened to replay it (see {@link claimToolCall}).
988
1195
  *
989
- * Only unstamped calls are touched: a kind already on a call was settled upstream, and a process
990
- * further down never second-guesses it.
1196
+ * Provider-supplied preparation is discarded. The trusted result rides this same model checkpoint
1197
+ * so a process that first claims the call without its handler still follows the offering process's verdict.
991
1198
  */
992
- function stampToolKinds(result, deps) {
993
- return {
994
- ...result,
995
- toolCalls: result.toolCalls.map((call) => call.kind === undefined ? { ...call, kind: declaredKind(deps, call.name) } : call),
996
- };
1199
+ async function stampToolKinds(result, deps, input, hooks) {
1200
+ const persona = personaOf(input);
1201
+ const allowedTools = intersectAllow(persona?.allowedTools, deps.toolAllowList);
1202
+ const toolCalls = [];
1203
+ for (const incoming of result.toolCalls) {
1204
+ // The provider cannot supply trusted preparation. Resolve it only where the tool was offered.
1205
+ const { preflight: _untrusted, prepared: _untrustedPrepared, actionApproval: _untrustedApproval, ...call } = incoming;
1206
+ const kind = declaredKind(deps, call.name);
1207
+ let preflight;
1208
+ let prepared;
1209
+ let actionApproval;
1210
+ if (kind === 'action') {
1211
+ try {
1212
+ if (deps.actionApprovalMode === 'independent')
1213
+ actionApproval = await resolveActionProposalApproval({
1214
+ actor: input.actor,
1215
+ thread: {
1216
+ threadId: input.threadId,
1217
+ runId: hooks.runId,
1218
+ ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
1219
+ },
1220
+ tool: {
1221
+ name: call.name,
1222
+ kind: 'action',
1223
+ ...(deps.registry.spec(call.name) !== undefined
1224
+ ? { spec: deps.registry.spec(call.name) }
1225
+ : {}),
1226
+ },
1227
+ store: deps.store,
1228
+ ...(deps.approvalPolicy !== undefined ? { policy: deps.approvalPolicy } : {}),
1229
+ });
1230
+ if (deps.actionApprovalMode === 'independent' && actionApproval?.mode === 'ask') {
1231
+ prepared = await prepareActionProposal(deps.registry, call.name, call.input, {
1232
+ actor: input.actor,
1233
+ threadId: input.threadId,
1234
+ runId: hooks.runId,
1235
+ requestId: hooks.runId,
1236
+ toolCallId: call.id,
1237
+ idempotencyKey: `${hooks.runId}:${call.id}`,
1238
+ emitUi: createNoopEmitUi(call.id),
1239
+ ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
1240
+ ...(persona !== undefined ? { persona } : {}),
1241
+ ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
1242
+ ...(input.uiCapabilities !== undefined
1243
+ ? { uiCapabilities: input.uiCapabilities }
1244
+ : {}),
1245
+ ...(deps.host !== undefined ? { host: deps.host } : {}),
1246
+ }, deps.rolesPolicy, allowedTools === undefined ? {} : { allowedTools });
1247
+ preflight = prepared.preflight;
1248
+ }
1249
+ else
1250
+ preflight = await deps.registry.prepare(call.name, call.input, {
1251
+ actor: input.actor,
1252
+ threadId: input.threadId,
1253
+ runId: hooks.runId,
1254
+ requestId: hooks.runId,
1255
+ toolCallId: call.id,
1256
+ idempotencyKey: `${hooks.runId}:${call.id}`,
1257
+ emitUi: createNoopEmitUi(call.id),
1258
+ ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
1259
+ ...(persona !== undefined ? { persona } : {}),
1260
+ ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
1261
+ ...(input.uiCapabilities !== undefined
1262
+ ? { uiCapabilities: input.uiCapabilities }
1263
+ : {}),
1264
+ ...(deps.host !== undefined ? { host: deps.host } : {}),
1265
+ }, deps.rolesPolicy, allowedTools === undefined ? {} : { allowedTools });
1266
+ }
1267
+ catch (error) {
1268
+ if (isReplayIntegrityError(error) || hooks.isControlFlowError?.(error) === true)
1269
+ throw error;
1270
+ preflight = {
1271
+ status: 'failed',
1272
+ error: error instanceof Error ? error.message : String(error),
1273
+ };
1274
+ }
1275
+ }
1276
+ toolCalls.push({
1277
+ ...call,
1278
+ ...(actionApproval !== undefined ? { actionApproval } : {}),
1279
+ kind,
1280
+ ...(prepared !== undefined ? { prepared } : {}),
1281
+ ...(preflight !== undefined ? { preflight } : {}),
1282
+ });
1283
+ }
1284
+ return { ...result, toolCalls };
997
1285
  }
998
1286
  /**
999
1287
  * A call's declared kind, resolved from this process's own configuration and registry.
@@ -1077,6 +1365,7 @@ function skillContext(input) {
1077
1365
  threadId: input.threadId,
1078
1366
  ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
1079
1367
  ...(input.pageContext !== undefined ? { pageContext: input.pageContext } : {}),
1368
+ ...(input.uiCapabilities !== undefined ? { uiCapabilities: input.uiCapabilities } : {}),
1080
1369
  };
1081
1370
  }
1082
1371
  /**
@@ -1200,6 +1489,31 @@ function invokeClaimed(turn, claimed) {
1200
1489
  async function runClaimedToolCall(turn, claimed) {
1201
1490
  const { deps, hooks } = turn;
1202
1491
  const { call, toolType, ctx } = claimed;
1492
+ if (claimed.proposalId !== undefined) {
1493
+ turn.halt.independentProposal = true;
1494
+ return { id: call.id, name: call.name, output: actionProposalReceipt(claimed.proposalId) };
1495
+ }
1496
+ if (claimed.preflight !== undefined && claimed.preflight.status !== 'ready') {
1497
+ const result = claimed.preflight;
1498
+ if (result.status === 'completed') {
1499
+ // The claim freezes this branch: adding/removing a hook in a rolling deployment must
1500
+ // not change existing checkpoint positions. Old claims have no opt-in and skip UI.
1501
+ if (claimed.presentCompletedPreflight === true) {
1502
+ await invokeClaimedTool(turn, claimed, { output: result.output });
1503
+ }
1504
+ if (claimed.terminal === true)
1505
+ turn.halt.terminal = true;
1506
+ return { id: call.id, name: call.name, output: result.output };
1507
+ }
1508
+ const reason = result.status === 'denied' ? result.reason : result.error;
1509
+ return {
1510
+ id: call.id,
1511
+ name: call.name,
1512
+ output: result.status === 'denied' ? { reason } : null,
1513
+ error: reason,
1514
+ ...(result.status === 'denied' ? { denied: true } : {}),
1515
+ };
1516
+ }
1203
1517
  if (toolType === 'agent') {
1204
1518
  return delegateToolCall(turn, claimed);
1205
1519
  }
@@ -1332,8 +1646,6 @@ function expiryNarrative() {
1332
1646
  'Nothing ran and nothing changed. Do not run it again on your own; tell the person it was not ' +
1333
1647
  'approved in time and ask whether they still want it.');
1334
1648
  }
1335
- /** Stored as the reason when someone declines without giving one — a placeholder, not a quote. */
1336
- export const DEFAULT_REFUSAL_REASON = 'rejected by user';
1337
1649
  /**
1338
1650
  * How a refusal is put to the model. Written as instructions rather than as a status because the
1339
1651
  * model's next move is the whole problem: told only that something was "rejected", it treats the
@@ -1704,7 +2016,9 @@ export async function runAgentLoop(boundDeps, requested, hooks) {
1704
2016
  ...(input.attachments !== undefined ? { attachments: input.attachments } : {}),
1705
2017
  }));
1706
2018
  }
1707
- const thread = threadForTurn(await hooks.step('load:thread', () => readThreadForTurn(deps, input.threadId, turnMessageLimit(deps.historyWindow))));
2019
+ const thread = threadForTurn(await hooks.step('load:thread', () => readThreadForTurn(deps, input.threadId, turnMessageLimit(deps.historyWindow)).then((loaded) => loaded === null
2020
+ ? { messages: [], actionApprovalMode: deps.actionApprovalMode ?? 'blocking' }
2021
+ : { ...loaded, actionApprovalMode: deps.actionApprovalMode ?? 'blocking' })));
1708
2022
  // With no window configured this whole block is skipped, so an existing deployment sends the
1709
2023
  // messages `load:thread` returned and records byte-identical checkpoints.
1710
2024
  let modelMessages = thread.messages;
@@ -1884,6 +2198,7 @@ export async function runAgentLoop(boundDeps, requested, hooks) {
1884
2198
  const tools = withBuiltInTools({
1885
2199
  tools: await deps.registry.definitionsFor(input.actor, deps.rolesPolicy, intersectAllow(persona?.allowedTools, deps.toolAllowList), {
1886
2200
  threadId: input.threadId,
2201
+ ...(input.uiCapabilities !== undefined ? { uiCapabilities: input.uiCapabilities } : {}),
1887
2202
  ...(input.agentName !== undefined ? { agentName: input.agentName } : {}),
1888
2203
  }),
1889
2204
  ask: deps.ask,
@@ -1945,7 +2260,7 @@ export async function runAgentLoop(boundDeps, requested, hooks) {
1945
2260
  outputTokens: result.usage.outputTokens,
1946
2261
  textLength: result.text.length,
1947
2262
  toolCalls: result.toolCalls.length,
1948
- })), deps));
2263
+ })), { ...deps, actionApprovalMode: thread.actionApprovalMode ?? 'blocking' }, input, hooks));
1949
2264
  // The gate runs before ANYTHING downstream: before the held frames reach the subscriber, before
1950
2265
  // the assistant message is persisted, before this text becomes the next step's context.
1951
2266
  let rejection;
@@ -2171,7 +2486,9 @@ export async function runAgentLoop(boundDeps, requested, hooks) {
2171
2486
  messageId: assistant.id,
2172
2487
  writer,
2173
2488
  toolUi: new Map(),
2489
+ toolText: new Map(),
2174
2490
  halt: { terminal: false },
2491
+ actionApprovalMode: thread.actionApprovalMode ?? 'blocking',
2175
2492
  ...(skillOffer !== undefined ? { skills: skillOffer } : {}),
2176
2493
  ...(memoryDigest !== undefined ? { memory: memoryDigest } : {}),
2177
2494
  };
@@ -2231,6 +2548,16 @@ export async function runAgentLoop(boundDeps, requested, hooks) {
2231
2548
  await deps.store.setMessageToolResults(assistant.id, [...results, ...syntheticResults]);
2232
2549
  // What the tools pushed joins what the model turn streamed, on the same message, in call
2233
2550
  // order. Every list here was read off a checkpoint above, so a replay writes the same value.
2551
+ const fallbackText = escapeUnsafeToolUiText(turn.toolCalls
2552
+ .map((call) => turnCalls.toolText.get(call.id))
2553
+ .filter(Boolean)
2554
+ .join('\n'));
2555
+ if (fallbackText)
2556
+ await deps.store.appendMessage({
2557
+ threadId: input.threadId,
2558
+ role: 'assistant',
2559
+ content: fallbackText,
2560
+ });
2234
2561
  const toolUi = turn.toolCalls.flatMap((call) => turnCalls.toolUi.get(call.id) ?? []);
2235
2562
  if (toolUi.length > 0) {
2236
2563
  await deps.store.setMessageUi?.(assistant.id, mergeUi(turn.ui, toolUi));
@@ -2244,9 +2571,17 @@ export async function runAgentLoop(boundDeps, requested, hooks) {
2244
2571
  });
2245
2572
  }
2246
2573
  modelMessages.push({ role: 'user', content: '', toolResults: results });
2574
+ const toolText = escapeUnsafeToolUiText(turn.toolCalls
2575
+ .map((call) => turnCalls.toolText.get(call.id))
2576
+ .filter(Boolean)
2577
+ .join('\n'));
2578
+ if (toolText) {
2579
+ modelMessages.push({ role: 'assistant', content: toolText });
2580
+ lastText += `\n${toolText}`;
2581
+ }
2247
2582
  // A `terminal` tool succeeded: its effect is the answer, so no model call narrates it. Read off
2248
2583
  // the calls' `persist:toolcall` checkpoints and their outcomes, so a replay ends here too.
2249
- if (turnCalls.halt.terminal) {
2584
+ if (turnCalls.halt.terminal || turnCalls.halt.independentProposal) {
2250
2585
  break;
2251
2586
  }
2252
2587
  }