@artooi/agents-web-components 0.0.0-stage → 0.1.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 (543) hide show
  1. package/CHANGELOG.md +68 -0
  2. package/LICENSE +21 -0
  3. package/README.md +4397 -2
  4. package/dist/agents-web-components.bundle.js +5708 -0
  5. package/dist/agents-web-components.bundle.js.map +7 -0
  6. package/dist/bundle.d.ts +3 -0
  7. package/dist/bundle.d.ts.map +1 -0
  8. package/dist/chat.d.ts +3 -0
  9. package/dist/chat.d.ts.map +1 -0
  10. package/dist/chat.js +16373 -0
  11. package/dist/chat.js.map +7 -0
  12. package/dist/chunk-ARNLFGCC.js +7715 -0
  13. package/dist/chunk-ARNLFGCC.js.map +7 -0
  14. package/dist/constants.d.ts +575 -0
  15. package/dist/constants.d.ts.map +1 -0
  16. package/dist/core/activity_registration.d.ts +19 -0
  17. package/dist/core/activity_registration.d.ts.map +1 -0
  18. package/dist/core/activity_registry.d.ts +46 -0
  19. package/dist/core/activity_registry.d.ts.map +1 -0
  20. package/dist/core/activity_renderer.d.ts +20 -0
  21. package/dist/core/activity_renderer.d.ts.map +1 -0
  22. package/dist/core/ag_ui_chat.d.ts +836 -0
  23. package/dist/core/ag_ui_chat.d.ts.map +1 -0
  24. package/dist/core/agui_client.d.ts +370 -0
  25. package/dist/core/agui_client.d.ts.map +1 -0
  26. package/dist/core/attachment.d.ts +42 -0
  27. package/dist/core/attachment.d.ts.map +1 -0
  28. package/dist/core/chat_registry.d.ts +23 -0
  29. package/dist/core/chat_registry.d.ts.map +1 -0
  30. package/dist/core/client_seed.d.ts +27 -0
  31. package/dist/core/client_seed.d.ts.map +1 -0
  32. package/dist/core/conversation_store.d.ts +195 -0
  33. package/dist/core/conversation_store.d.ts.map +1 -0
  34. package/dist/core/create_http_agent.d.ts +57 -0
  35. package/dist/core/create_http_agent.d.ts.map +1 -0
  36. package/dist/core/define_chat.d.ts +13 -0
  37. package/dist/core/define_chat.d.ts.map +1 -0
  38. package/dist/core/events/attachments_detail.d.ts +9 -0
  39. package/dist/core/events/attachments_detail.d.ts.map +1 -0
  40. package/dist/core/events/bar_height_detail.d.ts +6 -0
  41. package/dist/core/events/bar_height_detail.d.ts.map +1 -0
  42. package/dist/core/events/custom_agent_detail.d.ts +8 -0
  43. package/dist/core/events/custom_agent_detail.d.ts.map +1 -0
  44. package/dist/core/events/dock_width_detail.d.ts +8 -0
  45. package/dist/core/events/dock_width_detail.d.ts.map +1 -0
  46. package/dist/core/events/feedback_detail.d.ts +28 -0
  47. package/dist/core/events/feedback_detail.d.ts.map +1 -0
  48. package/dist/core/events/invalidate_detail.d.ts +16 -0
  49. package/dist/core/events/invalidate_detail.d.ts.map +1 -0
  50. package/dist/core/events/maximize_detail.d.ts +5 -0
  51. package/dist/core/events/maximize_detail.d.ts.map +1 -0
  52. package/dist/core/events/run_finished_detail.d.ts +36 -0
  53. package/dist/core/events/run_finished_detail.d.ts.map +1 -0
  54. package/dist/core/events/state_detail.d.ts +5 -0
  55. package/dist/core/events/state_detail.d.ts.map +1 -0
  56. package/dist/core/events/submit_detail.d.ts +8 -0
  57. package/dist/core/events/submit_detail.d.ts.map +1 -0
  58. package/dist/core/events/thread_detail.d.ts +27 -0
  59. package/dist/core/events/thread_detail.d.ts.map +1 -0
  60. package/dist/core/events/thread_title_detail.d.ts +8 -0
  61. package/dist/core/events/thread_title_detail.d.ts.map +1 -0
  62. package/dist/core/events/toggle_detail.d.ts +5 -0
  63. package/dist/core/events/toggle_detail.d.ts.map +1 -0
  64. package/dist/core/events/tool_run.d.ts +11 -0
  65. package/dist/core/events/tool_run.d.ts.map +1 -0
  66. package/dist/core/events/unread_detail.d.ts +11 -0
  67. package/dist/core/events/unread_detail.d.ts.map +1 -0
  68. package/dist/core/message_role.d.ts +4 -0
  69. package/dist/core/message_role.d.ts.map +1 -0
  70. package/dist/core/read_flag.d.ts +11 -0
  71. package/dist/core/read_flag.d.ts.map +1 -0
  72. package/dist/core/read_json_attribute.d.ts +15 -0
  73. package/dist/core/read_json_attribute.d.ts.map +1 -0
  74. package/dist/core/read_max_tool_rounds.d.ts +9 -0
  75. package/dist/core/read_max_tool_rounds.d.ts.map +1 -0
  76. package/dist/core/remote_conversation_store.d.ts +71 -0
  77. package/dist/core/remote_conversation_store.d.ts.map +1 -0
  78. package/dist/core/run_handlers.d.ts +85 -0
  79. package/dist/core/run_handlers.d.ts.map +1 -0
  80. package/dist/core/run_index.d.ts +58 -0
  81. package/dist/core/run_index.d.ts.map +1 -0
  82. package/dist/core/storage_scope.d.ts +118 -0
  83. package/dist/core/storage_scope.d.ts.map +1 -0
  84. package/dist/core/tool_outcome.d.ts +27 -0
  85. package/dist/core/tool_outcome.d.ts.map +1 -0
  86. package/dist/core/transcribe_audio.d.ts +32 -0
  87. package/dist/core/transcribe_audio.d.ts.map +1 -0
  88. package/dist/core/upload_attachment.d.ts +44 -0
  89. package/dist/core/upload_attachment.d.ts.map +1 -0
  90. package/dist/core/utils.d.ts +117 -0
  91. package/dist/core/utils.d.ts.map +1 -0
  92. package/dist/dom/animations.d.ts +122 -0
  93. package/dist/dom/animations.d.ts.map +1 -0
  94. package/dist/dom/dom_driver.d.ts +28 -0
  95. package/dist/dom/dom_driver.d.ts.map +1 -0
  96. package/dist/dom/highlight_overlay.d.ts +39 -0
  97. package/dist/dom/highlight_overlay.d.ts.map +1 -0
  98. package/dist/dom/native_setter.d.ts +5 -0
  99. package/dist/dom/native_setter.d.ts.map +1 -0
  100. package/dist/dom/ring_color.d.ts +16 -0
  101. package/dist/dom/ring_color.d.ts.map +1 -0
  102. package/dist/dom/utils.d.ts +3 -0
  103. package/dist/dom/utils.d.ts.map +1 -0
  104. package/dist/index.d.ts +62 -0
  105. package/dist/index.d.ts.map +1 -0
  106. package/dist/index.js +223 -0
  107. package/dist/index.js.map +7 -0
  108. package/dist/skills/fill_template.d.ts +16 -0
  109. package/dist/skills/fill_template.d.ts.map +1 -0
  110. package/dist/skills/parse_skills.d.ts +8 -0
  111. package/dist/skills/parse_skills.d.ts.map +1 -0
  112. package/dist/skills/skill.d.ts +33 -0
  113. package/dist/skills/skill.d.ts.map +1 -0
  114. package/dist/skills/skill_catalog.d.ts +69 -0
  115. package/dist/skills/skill_catalog.d.ts.map +1 -0
  116. package/dist/skills/skill_name_from.d.ts +12 -0
  117. package/dist/skills/skill_name_from.d.ts.map +1 -0
  118. package/dist/tools/chat_surface_tools.d.ts +77 -0
  119. package/dist/tools/chat_surface_tools.d.ts.map +1 -0
  120. package/dist/tools/client_tool_registry.d.ts +58 -0
  121. package/dist/tools/client_tool_registry.d.ts.map +1 -0
  122. package/dist/tools/is_destructive.d.ts +14 -0
  123. package/dist/tools/is_destructive.d.ts.map +1 -0
  124. package/dist/tools/is_navigates.d.ts +9 -0
  125. package/dist/tools/is_navigates.d.ts.map +1 -0
  126. package/dist/tools/page_action_tools.d.ts +30 -0
  127. package/dist/tools/page_action_tools.d.ts.map +1 -0
  128. package/dist/tools/page_map.d.ts +16 -0
  129. package/dist/tools/page_map.d.ts.map +1 -0
  130. package/dist/tools/page_state.d.ts +27 -0
  131. package/dist/tools/page_state.d.ts.map +1 -0
  132. package/dist/tools/parse_tool_catalog.d.ts +21 -0
  133. package/dist/tools/parse_tool_catalog.d.ts.map +1 -0
  134. package/dist/tools/route_map.d.ts +37 -0
  135. package/dist/tools/route_map.d.ts.map +1 -0
  136. package/dist/tools/tool_catalog.d.ts +86 -0
  137. package/dist/tools/tool_catalog.d.ts.map +1 -0
  138. package/dist/tools/tool_dispatch.d.ts +82 -0
  139. package/dist/tools/tool_dispatch.d.ts.map +1 -0
  140. package/dist/ui/charts/chart_block.d.ts +57 -0
  141. package/dist/ui/charts/chart_block.d.ts.map +1 -0
  142. package/dist/ui/charts/chart_spec_from.d.ts +12 -0
  143. package/dist/ui/charts/chart_spec_from.d.ts.map +1 -0
  144. package/dist/ui/charts/chart_styles.d.ts +2 -0
  145. package/dist/ui/charts/chart_styles.d.ts.map +1 -0
  146. package/dist/ui/charts/chart_tool.d.ts +15 -0
  147. package/dist/ui/charts/chart_tool.d.ts.map +1 -0
  148. package/dist/ui/composer/attachment_styles.d.ts +2 -0
  149. package/dist/ui/composer/attachment_styles.d.ts.map +1 -0
  150. package/dist/ui/composer/attachment_tray.d.ts +53 -0
  151. package/dist/ui/composer/attachment_tray.d.ts.map +1 -0
  152. package/dist/ui/composer/auto_grow.d.ts +10 -0
  153. package/dist/ui/composer/auto_grow.d.ts.map +1 -0
  154. package/dist/ui/composer/build_composer.d.ts +32 -0
  155. package/dist/ui/composer/build_composer.d.ts.map +1 -0
  156. package/dist/ui/composer/composer_attachments.d.ts +57 -0
  157. package/dist/ui/composer/composer_attachments.d.ts.map +1 -0
  158. package/dist/ui/composer/composer_styles.d.ts +2 -0
  159. package/dist/ui/composer/composer_styles.d.ts.map +1 -0
  160. package/dist/ui/composer/composer_voice.d.ts +48 -0
  161. package/dist/ui/composer/composer_voice.d.ts.map +1 -0
  162. package/dist/ui/composer/skill_styles.d.ts +2 -0
  163. package/dist/ui/composer/skill_styles.d.ts.map +1 -0
  164. package/dist/ui/composer/skills_menu.d.ts +34 -0
  165. package/dist/ui/composer/skills_menu.d.ts.map +1 -0
  166. package/dist/ui/composer/voice_input.d.ts +46 -0
  167. package/dist/ui/composer/voice_input.d.ts.map +1 -0
  168. package/dist/ui/excerpts/attach_copy_buttons.d.ts +13 -0
  169. package/dist/ui/excerpts/attach_copy_buttons.d.ts.map +1 -0
  170. package/dist/ui/excerpts/copy_payload.d.ts +30 -0
  171. package/dist/ui/excerpts/copy_payload.d.ts.map +1 -0
  172. package/dist/ui/excerpts/page_quote_offer.d.ts +33 -0
  173. package/dist/ui/excerpts/page_quote_offer.d.ts.map +1 -0
  174. package/dist/ui/excerpts/place_offer.d.ts +9 -0
  175. package/dist/ui/excerpts/place_offer.d.ts.map +1 -0
  176. package/dist/ui/excerpts/quote_selection.d.ts +66 -0
  177. package/dist/ui/excerpts/quote_selection.d.ts.map +1 -0
  178. package/dist/ui/excerpts/transcript_quote_offer.d.ts +57 -0
  179. package/dist/ui/excerpts/transcript_quote_offer.d.ts.map +1 -0
  180. package/dist/ui/fill_ui_string.d.ts +32 -0
  181. package/dist/ui/fill_ui_string.d.ts.map +1 -0
  182. package/dist/ui/history/checkpoint_menu.d.ts +41 -0
  183. package/dist/ui/history/checkpoint_menu.d.ts.map +1 -0
  184. package/dist/ui/history/conversation_history.d.ts +317 -0
  185. package/dist/ui/history/conversation_history.d.ts.map +1 -0
  186. package/dist/ui/history/history_styles.d.ts +2 -0
  187. package/dist/ui/history/history_styles.d.ts.map +1 -0
  188. package/dist/ui/history/relative_time.d.ts +23 -0
  189. package/dist/ui/history/relative_time.d.ts.map +1 -0
  190. package/dist/ui/history/thread_drawer.d.ts +64 -0
  191. package/dist/ui/history/thread_drawer.d.ts.map +1 -0
  192. package/dist/ui/history/utils.d.ts +2 -0
  193. package/dist/ui/history/utils.d.ts.map +1 -0
  194. package/dist/ui/interrupts/approval_card.d.ts +64 -0
  195. package/dist/ui/interrupts/approval_card.d.ts.map +1 -0
  196. package/dist/ui/interrupts/approval_styles.d.ts +2 -0
  197. package/dist/ui/interrupts/approval_styles.d.ts.map +1 -0
  198. package/dist/ui/interrupts/confirmation_card.d.ts +51 -0
  199. package/dist/ui/interrupts/confirmation_card.d.ts.map +1 -0
  200. package/dist/ui/interrupts/confirmation_styles.d.ts +2 -0
  201. package/dist/ui/interrupts/confirmation_styles.d.ts.map +1 -0
  202. package/dist/ui/interrupts/pending_decision.d.ts +22 -0
  203. package/dist/ui/interrupts/pending_decision.d.ts.map +1 -0
  204. package/dist/ui/interrupts/question_card.d.ts +49 -0
  205. package/dist/ui/interrupts/question_card.d.ts.map +1 -0
  206. package/dist/ui/interrupts/question_styles.d.ts +2 -0
  207. package/dist/ui/interrupts/question_styles.d.ts.map +1 -0
  208. package/dist/ui/place/place.d.ts +17 -0
  209. package/dist/ui/place/place.d.ts.map +1 -0
  210. package/dist/ui/place/place_chip.d.ts +26 -0
  211. package/dist/ui/place/place_chip.d.ts.map +1 -0
  212. package/dist/ui/place/place_from_route.d.ts +9 -0
  213. package/dist/ui/place/place_from_route.d.ts.map +1 -0
  214. package/dist/ui/place/place_styles.d.ts +2 -0
  215. package/dist/ui/place/place_styles.d.ts.map +1 -0
  216. package/dist/ui/placement/clamp_launcher.d.ts +20 -0
  217. package/dist/ui/placement/clamp_launcher.d.ts.map +1 -0
  218. package/dist/ui/placement/clamp_panel.d.ts +13 -0
  219. package/dist/ui/placement/clamp_panel.d.ts.map +1 -0
  220. package/dist/ui/placement/collapse_styles.d.ts +2 -0
  221. package/dist/ui/placement/collapse_styles.d.ts.map +1 -0
  222. package/dist/ui/placement/dock_styles.d.ts +2 -0
  223. package/dist/ui/placement/dock_styles.d.ts.map +1 -0
  224. package/dist/ui/placement/embedded_styles.d.ts +2 -0
  225. package/dist/ui/placement/embedded_styles.d.ts.map +1 -0
  226. package/dist/ui/placement/launcher_drag.d.ts +49 -0
  227. package/dist/ui/placement/launcher_drag.d.ts.map +1 -0
  228. package/dist/ui/placement/launcher_placement.d.ts +77 -0
  229. package/dist/ui/placement/launcher_placement.d.ts.map +1 -0
  230. package/dist/ui/placement/launcher_styles.d.ts +2 -0
  231. package/dist/ui/placement/launcher_styles.d.ts.map +1 -0
  232. package/dist/ui/placement/page_styles.d.ts +2 -0
  233. package/dist/ui/placement/page_styles.d.ts.map +1 -0
  234. package/dist/ui/placement/panel_drag.d.ts +40 -0
  235. package/dist/ui/placement/panel_drag.d.ts.map +1 -0
  236. package/dist/ui/placement/panel_placement.d.ts +173 -0
  237. package/dist/ui/placement/panel_placement.d.ts.map +1 -0
  238. package/dist/ui/placement/place_widget.d.ts +31 -0
  239. package/dist/ui/placement/place_widget.d.ts.map +1 -0
  240. package/dist/ui/placement/preset_styles.d.ts +2 -0
  241. package/dist/ui/placement/preset_styles.d.ts.map +1 -0
  242. package/dist/ui/placement/resize_handle.d.ts +78 -0
  243. package/dist/ui/placement/resize_handle.d.ts.map +1 -0
  244. package/dist/ui/placement/resize_styles.d.ts +2 -0
  245. package/dist/ui/placement/resize_styles.d.ts.map +1 -0
  246. package/dist/ui/placement/sidebar_styles.d.ts +2 -0
  247. package/dist/ui/placement/sidebar_styles.d.ts.map +1 -0
  248. package/dist/ui/placement/small_viewport_styles.d.ts +2 -0
  249. package/dist/ui/placement/small_viewport_styles.d.ts.map +1 -0
  250. package/dist/ui/placement/surface_for.d.ts +93 -0
  251. package/dist/ui/placement/surface_for.d.ts.map +1 -0
  252. package/dist/ui/progress/prettify_tool_name.d.ts +11 -0
  253. package/dist/ui/progress/prettify_tool_name.d.ts.map +1 -0
  254. package/dist/ui/progress/run_announcer.d.ts +41 -0
  255. package/dist/ui/progress/run_announcer.d.ts.map +1 -0
  256. package/dist/ui/progress/run_notice.d.ts +21 -0
  257. package/dist/ui/progress/run_notice.d.ts.map +1 -0
  258. package/dist/ui/progress/run_notice_styles.d.ts +2 -0
  259. package/dist/ui/progress/run_notice_styles.d.ts.map +1 -0
  260. package/dist/ui/progress/subagent_panel.d.ts +101 -0
  261. package/dist/ui/progress/subagent_panel.d.ts.map +1 -0
  262. package/dist/ui/progress/subagent_progress.d.ts +57 -0
  263. package/dist/ui/progress/subagent_progress.d.ts.map +1 -0
  264. package/dist/ui/progress/subagent_update.d.ts +28 -0
  265. package/dist/ui/progress/subagent_update.d.ts.map +1 -0
  266. package/dist/ui/progress/thoughts_block.d.ts +57 -0
  267. package/dist/ui/progress/thoughts_block.d.ts.map +1 -0
  268. package/dist/ui/progress/thoughts_styles.d.ts +2 -0
  269. package/dist/ui/progress/thoughts_styles.d.ts.map +1 -0
  270. package/dist/ui/progress/tool_call_card.d.ts +167 -0
  271. package/dist/ui/progress/tool_call_card.d.ts.map +1 -0
  272. package/dist/ui/progress/tool_group_styles.d.ts +2 -0
  273. package/dist/ui/progress/tool_group_styles.d.ts.map +1 -0
  274. package/dist/ui/progress/tool_step_group.d.ts +50 -0
  275. package/dist/ui/progress/tool_step_group.d.ts.map +1 -0
  276. package/dist/ui/progress/tool_step_styles.d.ts +2 -0
  277. package/dist/ui/progress/tool_step_styles.d.ts.map +1 -0
  278. package/dist/ui/shell/adopt_styles.d.ts +28 -0
  279. package/dist/ui/shell/adopt_styles.d.ts.map +1 -0
  280. package/dist/ui/shell/build_header.d.ts +45 -0
  281. package/dist/ui/shell/build_header.d.ts.map +1 -0
  282. package/dist/ui/shell/build_launcher.d.ts +33 -0
  283. package/dist/ui/shell/build_launcher.d.ts.map +1 -0
  284. package/dist/ui/shell/collapse_glyph.d.ts +14 -0
  285. package/dist/ui/shell/collapse_glyph.d.ts.map +1 -0
  286. package/dist/ui/shell/frame_styles.d.ts +2 -0
  287. package/dist/ui/shell/frame_styles.d.ts.map +1 -0
  288. package/dist/ui/shell/glyph_slot.d.ts +7 -0
  289. package/dist/ui/shell/glyph_slot.d.ts.map +1 -0
  290. package/dist/ui/shell/header_button.d.ts +11 -0
  291. package/dist/ui/shell/header_button.d.ts.map +1 -0
  292. package/dist/ui/shell/icon_element.d.ts +12 -0
  293. package/dist/ui/shell/icon_element.d.ts.map +1 -0
  294. package/dist/ui/shell/is_unread_badge_enabled.d.ts +10 -0
  295. package/dist/ui/shell/is_unread_badge_enabled.d.ts.map +1 -0
  296. package/dist/ui/shell/read_launcher_icon_url.d.ts +8 -0
  297. package/dist/ui/shell/read_launcher_icon_url.d.ts.map +1 -0
  298. package/dist/ui/shell/theme_styles.d.ts +2 -0
  299. package/dist/ui/shell/theme_styles.d.ts.map +1 -0
  300. package/dist/ui/shell/token_styles.d.ts +2 -0
  301. package/dist/ui/shell/token_styles.d.ts.map +1 -0
  302. package/dist/ui/styles.d.ts +2 -0
  303. package/dist/ui/styles.d.ts.map +1 -0
  304. package/dist/ui/themes/classic_styles.d.ts +2 -0
  305. package/dist/ui/themes/classic_styles.d.ts.map +1 -0
  306. package/dist/ui/themes/classic_tokens.d.ts +2 -0
  307. package/dist/ui/themes/classic_tokens.d.ts.map +1 -0
  308. package/dist/ui/themes/code_tokens.d.ts +2 -0
  309. package/dist/ui/themes/code_tokens.d.ts.map +1 -0
  310. package/dist/ui/themes/ledger_styles.d.ts +2 -0
  311. package/dist/ui/themes/ledger_styles.d.ts.map +1 -0
  312. package/dist/ui/themes/ledger_tokens.d.ts +2 -0
  313. package/dist/ui/themes/ledger_tokens.d.ts.map +1 -0
  314. package/dist/ui/themes/modern_styles.d.ts +2 -0
  315. package/dist/ui/themes/modern_styles.d.ts.map +1 -0
  316. package/dist/ui/themes/quiet_styles.d.ts +2 -0
  317. package/dist/ui/themes/quiet_styles.d.ts.map +1 -0
  318. package/dist/ui/themes/scheme_styles.d.ts +2 -0
  319. package/dist/ui/themes/scheme_styles.d.ts.map +1 -0
  320. package/dist/ui/themes/soft_styles.d.ts +2 -0
  321. package/dist/ui/themes/soft_styles.d.ts.map +1 -0
  322. package/dist/ui/themes/soft_tokens.d.ts +2 -0
  323. package/dist/ui/themes/soft_tokens.d.ts.map +1 -0
  324. package/dist/ui/themes/theme_hosts.d.ts +15 -0
  325. package/dist/ui/themes/theme_hosts.d.ts.map +1 -0
  326. package/dist/ui/transcript/answer_actions.d.ts +50 -0
  327. package/dist/ui/transcript/answer_actions.d.ts.map +1 -0
  328. package/dist/ui/transcript/answer_stream.d.ts +56 -0
  329. package/dist/ui/transcript/answer_stream.d.ts.map +1 -0
  330. package/dist/ui/transcript/attachment_chip_styles.d.ts +2 -0
  331. package/dist/ui/transcript/attachment_chip_styles.d.ts.map +1 -0
  332. package/dist/ui/transcript/attachment_chips.d.ts +21 -0
  333. package/dist/ui/transcript/attachment_chips.d.ts.map +1 -0
  334. package/dist/ui/transcript/build_transcript.d.ts +21 -0
  335. package/dist/ui/transcript/build_transcript.d.ts.map +1 -0
  336. package/dist/ui/transcript/greeting_styles.d.ts +2 -0
  337. package/dist/ui/transcript/greeting_styles.d.ts.map +1 -0
  338. package/dist/ui/transcript/groups_tool_steps.d.ts +13 -0
  339. package/dist/ui/transcript/groups_tool_steps.d.ts.map +1 -0
  340. package/dist/ui/transcript/message_action_styles.d.ts +2 -0
  341. package/dist/ui/transcript/message_action_styles.d.ts.map +1 -0
  342. package/dist/ui/transcript/message_actions.d.ts +74 -0
  343. package/dist/ui/transcript/message_actions.d.ts.map +1 -0
  344. package/dist/ui/transcript/message_styles.d.ts +2 -0
  345. package/dist/ui/transcript/message_styles.d.ts.map +1 -0
  346. package/dist/ui/transcript/render_markdown.d.ts +40 -0
  347. package/dist/ui/transcript/render_markdown.d.ts.map +1 -0
  348. package/dist/ui/transcript/render_or_warn.d.ts +16 -0
  349. package/dist/ui/transcript/render_or_warn.d.ts.map +1 -0
  350. package/dist/ui/transcript/reveal_words.d.ts +8 -0
  351. package/dist/ui/transcript/reveal_words.d.ts.map +1 -0
  352. package/dist/ui/transcript/starter_chips.d.ts +21 -0
  353. package/dist/ui/transcript/starter_chips.d.ts.map +1 -0
  354. package/dist/ui/transcript/stick_to_bottom.d.ts +55 -0
  355. package/dist/ui/transcript/stick_to_bottom.d.ts.map +1 -0
  356. package/dist/ui/transcript/suggestion_chips.d.ts +29 -0
  357. package/dist/ui/transcript/suggestion_chips.d.ts.map +1 -0
  358. package/dist/ui/transcript/transcript.d.ts +196 -0
  359. package/dist/ui/transcript/transcript.d.ts.map +1 -0
  360. package/dist/ui/transcript/transcript_styles.d.ts +2 -0
  361. package/dist/ui/transcript/transcript_styles.d.ts.map +1 -0
  362. package/dist/ui/ui_strings.d.ts +352 -0
  363. package/dist/ui/ui_strings.d.ts.map +1 -0
  364. package/dist/version.d.ts +2 -0
  365. package/dist/version.d.ts.map +1 -0
  366. package/package.json +86 -3
  367. package/src/bundle.ts +2 -0
  368. package/src/chat.ts +2 -0
  369. package/src/constants.ts +650 -0
  370. package/src/core/activity_registration.ts +19 -0
  371. package/src/core/activity_registry.ts +133 -0
  372. package/src/core/activity_renderer.ts +19 -0
  373. package/src/core/ag_ui_chat.ts +3966 -0
  374. package/src/core/agui_client.ts +1028 -0
  375. package/src/core/attachment.ts +62 -0
  376. package/src/core/chat_registry.ts +53 -0
  377. package/src/core/client_seed.ts +27 -0
  378. package/src/core/conversation_store.ts +478 -0
  379. package/src/core/create_http_agent.ts +97 -0
  380. package/src/core/define_chat.ts +25 -0
  381. package/src/core/events/attachments_detail.ts +9 -0
  382. package/src/core/events/bar_height_detail.ts +5 -0
  383. package/src/core/events/custom_agent_detail.ts +7 -0
  384. package/src/core/events/dock_width_detail.ts +7 -0
  385. package/src/core/events/feedback_detail.ts +27 -0
  386. package/src/core/events/invalidate_detail.ts +15 -0
  387. package/src/core/events/maximize_detail.ts +4 -0
  388. package/src/core/events/run_finished_detail.ts +36 -0
  389. package/src/core/events/state_detail.ts +4 -0
  390. package/src/core/events/submit_detail.ts +8 -0
  391. package/src/core/events/thread_detail.ts +26 -0
  392. package/src/core/events/thread_title_detail.ts +7 -0
  393. package/src/core/events/toggle_detail.ts +4 -0
  394. package/src/core/events/tool_run.ts +10 -0
  395. package/src/core/events/unread_detail.ts +10 -0
  396. package/src/core/message_role.ts +4 -0
  397. package/src/core/read_flag.ts +13 -0
  398. package/src/core/read_json_attribute.ts +30 -0
  399. package/src/core/read_max_tool_rounds.ts +13 -0
  400. package/src/core/remote_conversation_store.ts +279 -0
  401. package/src/core/run_handlers.ts +524 -0
  402. package/src/core/run_index.ts +114 -0
  403. package/src/core/storage_scope.ts +291 -0
  404. package/src/core/tool_outcome.ts +39 -0
  405. package/src/core/transcribe_audio.ts +76 -0
  406. package/src/core/upload_attachment.ts +130 -0
  407. package/src/core/utils.ts +230 -0
  408. package/src/dom/animations.ts +341 -0
  409. package/src/dom/dom_driver.ts +91 -0
  410. package/src/dom/highlight_overlay.ts +204 -0
  411. package/src/dom/native_setter.ts +40 -0
  412. package/src/dom/ring_color.ts +206 -0
  413. package/src/dom/utils.ts +5 -0
  414. package/src/index.ts +220 -0
  415. package/src/skills/fill_template.ts +31 -0
  416. package/src/skills/parse_skills.ts +31 -0
  417. package/src/skills/skill.ts +32 -0
  418. package/src/skills/skill_catalog.ts +172 -0
  419. package/src/skills/skill_name_from.ts +19 -0
  420. package/src/tools/chat_surface_tools.ts +183 -0
  421. package/src/tools/client_tool_registry.ts +80 -0
  422. package/src/tools/is_destructive.ts +17 -0
  423. package/src/tools/is_navigates.ts +12 -0
  424. package/src/tools/page_action_tools.ts +123 -0
  425. package/src/tools/page_map.ts +26 -0
  426. package/src/tools/page_state.ts +57 -0
  427. package/src/tools/parse_tool_catalog.ts +41 -0
  428. package/src/tools/route_map.ts +132 -0
  429. package/src/tools/tool_catalog.ts +334 -0
  430. package/src/tools/tool_dispatch.ts +453 -0
  431. package/src/ui/charts/chart_block.ts +519 -0
  432. package/src/ui/charts/chart_spec_from.ts +125 -0
  433. package/src/ui/charts/chart_styles.ts +63 -0
  434. package/src/ui/charts/chart_tool.ts +72 -0
  435. package/src/ui/composer/attachment_styles.ts +71 -0
  436. package/src/ui/composer/attachment_tray.ts +295 -0
  437. package/src/ui/composer/auto_grow.ts +12 -0
  438. package/src/ui/composer/build_composer.ts +114 -0
  439. package/src/ui/composer/composer_attachments.ts +324 -0
  440. package/src/ui/composer/composer_styles.ts +177 -0
  441. package/src/ui/composer/composer_voice.ts +93 -0
  442. package/src/ui/composer/skill_styles.ts +120 -0
  443. package/src/ui/composer/skills_menu.ts +188 -0
  444. package/src/ui/composer/voice_input.ts +282 -0
  445. package/src/ui/excerpts/attach_copy_buttons.ts +73 -0
  446. package/src/ui/excerpts/copy_payload.ts +156 -0
  447. package/src/ui/excerpts/page_quote_offer.ts +203 -0
  448. package/src/ui/excerpts/place_offer.ts +24 -0
  449. package/src/ui/excerpts/quote_selection.ts +345 -0
  450. package/src/ui/excerpts/transcript_quote_offer.ts +175 -0
  451. package/src/ui/fill_ui_string.ts +41 -0
  452. package/src/ui/history/checkpoint_menu.ts +300 -0
  453. package/src/ui/history/conversation_history.ts +1169 -0
  454. package/src/ui/history/history_styles.ts +492 -0
  455. package/src/ui/history/relative_time.ts +50 -0
  456. package/src/ui/history/thread_drawer.ts +471 -0
  457. package/src/ui/history/utils.ts +11 -0
  458. package/src/ui/interrupts/approval_card.ts +202 -0
  459. package/src/ui/interrupts/approval_styles.ts +52 -0
  460. package/src/ui/interrupts/confirmation_card.ts +138 -0
  461. package/src/ui/interrupts/confirmation_styles.ts +114 -0
  462. package/src/ui/interrupts/pending_decision.ts +33 -0
  463. package/src/ui/interrupts/question_card.ts +213 -0
  464. package/src/ui/interrupts/question_styles.ts +73 -0
  465. package/src/ui/place/place.ts +16 -0
  466. package/src/ui/place/place_chip.ts +146 -0
  467. package/src/ui/place/place_from_route.ts +27 -0
  468. package/src/ui/place/place_styles.ts +108 -0
  469. package/src/ui/placement/clamp_launcher.ts +38 -0
  470. package/src/ui/placement/clamp_panel.ts +30 -0
  471. package/src/ui/placement/collapse_styles.ts +472 -0
  472. package/src/ui/placement/dock_styles.ts +116 -0
  473. package/src/ui/placement/embedded_styles.ts +14 -0
  474. package/src/ui/placement/launcher_drag.ts +206 -0
  475. package/src/ui/placement/launcher_placement.ts +133 -0
  476. package/src/ui/placement/launcher_styles.ts +189 -0
  477. package/src/ui/placement/page_styles.ts +47 -0
  478. package/src/ui/placement/panel_drag.ts +138 -0
  479. package/src/ui/placement/panel_placement.ts +1975 -0
  480. package/src/ui/placement/place_widget.ts +64 -0
  481. package/src/ui/placement/preset_styles.ts +49 -0
  482. package/src/ui/placement/resize_handle.ts +229 -0
  483. package/src/ui/placement/resize_styles.ts +201 -0
  484. package/src/ui/placement/sidebar_styles.ts +113 -0
  485. package/src/ui/placement/small_viewport_styles.ts +70 -0
  486. package/src/ui/placement/surface_for.ts +183 -0
  487. package/src/ui/progress/prettify_tool_name.ts +16 -0
  488. package/src/ui/progress/run_announcer.ts +67 -0
  489. package/src/ui/progress/run_notice.ts +61 -0
  490. package/src/ui/progress/run_notice_styles.ts +52 -0
  491. package/src/ui/progress/subagent_panel.ts +227 -0
  492. package/src/ui/progress/subagent_progress.ts +200 -0
  493. package/src/ui/progress/subagent_update.ts +89 -0
  494. package/src/ui/progress/thoughts_block.ts +165 -0
  495. package/src/ui/progress/thoughts_styles.ts +74 -0
  496. package/src/ui/progress/tool_call_card.ts +429 -0
  497. package/src/ui/progress/tool_group_styles.ts +313 -0
  498. package/src/ui/progress/tool_step_group.ts +317 -0
  499. package/src/ui/progress/tool_step_styles.ts +486 -0
  500. package/src/ui/shell/adopt_styles.ts +34 -0
  501. package/src/ui/shell/build_header.ts +121 -0
  502. package/src/ui/shell/build_launcher.ts +79 -0
  503. package/src/ui/shell/collapse_glyph.ts +42 -0
  504. package/src/ui/shell/frame_styles.ts +147 -0
  505. package/src/ui/shell/glyph_slot.ts +12 -0
  506. package/src/ui/shell/header_button.ts +22 -0
  507. package/src/ui/shell/icon_element.ts +33 -0
  508. package/src/ui/shell/is_unread_badge_enabled.ts +11 -0
  509. package/src/ui/shell/read_launcher_icon_url.ts +9 -0
  510. package/src/ui/shell/theme_styles.ts +11 -0
  511. package/src/ui/shell/token_styles.ts +480 -0
  512. package/src/ui/styles.ts +110 -0
  513. package/src/ui/themes/classic_styles.ts +32 -0
  514. package/src/ui/themes/classic_tokens.ts +51 -0
  515. package/src/ui/themes/code_tokens.ts +21 -0
  516. package/src/ui/themes/ledger_styles.ts +169 -0
  517. package/src/ui/themes/ledger_tokens.ts +33 -0
  518. package/src/ui/themes/modern_styles.ts +80 -0
  519. package/src/ui/themes/quiet_styles.ts +118 -0
  520. package/src/ui/themes/scheme_styles.ts +26 -0
  521. package/src/ui/themes/soft_styles.ts +149 -0
  522. package/src/ui/themes/soft_tokens.ts +29 -0
  523. package/src/ui/themes/theme_hosts.ts +14 -0
  524. package/src/ui/transcript/answer_actions.ts +165 -0
  525. package/src/ui/transcript/answer_stream.ts +123 -0
  526. package/src/ui/transcript/attachment_chip_styles.ts +116 -0
  527. package/src/ui/transcript/attachment_chips.ts +82 -0
  528. package/src/ui/transcript/build_transcript.ts +67 -0
  529. package/src/ui/transcript/greeting_styles.ts +171 -0
  530. package/src/ui/transcript/groups_tool_steps.ts +16 -0
  531. package/src/ui/transcript/message_action_styles.ts +155 -0
  532. package/src/ui/transcript/message_actions.ts +234 -0
  533. package/src/ui/transcript/message_styles.ts +262 -0
  534. package/src/ui/transcript/render_markdown.ts +181 -0
  535. package/src/ui/transcript/render_or_warn.ts +22 -0
  536. package/src/ui/transcript/reveal_words.ts +41 -0
  537. package/src/ui/transcript/starter_chips.ts +42 -0
  538. package/src/ui/transcript/stick_to_bottom.ts +126 -0
  539. package/src/ui/transcript/suggestion_chips.ts +73 -0
  540. package/src/ui/transcript/transcript.ts +555 -0
  541. package/src/ui/transcript/transcript_styles.ts +153 -0
  542. package/src/ui/ui_strings.ts +550 -0
  543. package/src/version.ts +1 -0
@@ -0,0 +1,453 @@
1
+ import type { Context, Interrupt } from "@ag-ui/core";
2
+ import { READ_PAGE_TOOL, TOOL_CALL_STATUS, TOOL_OUTCOME, X_CONFIRM_KEY } from "../constants.js";
3
+ import type { AgUiToolCall, InterruptResponse, ToolExecution } from "../core/agui_client.js";
4
+ import type { ClientConversationStore } from "../core/conversation_store.js";
5
+ import { skillNameFrom } from "../skills/skill_name_from.js";
6
+ import { fillUiString } from "../ui/fill_ui_string.js";
7
+ import {
8
+ type ApprovalRenderer,
9
+ type ApprovalRequest,
10
+ requestApproval,
11
+ } from "../ui/interrupts/approval_card.js";
12
+ import {
13
+ type ConfirmationRequest,
14
+ requestConfirmation,
15
+ } from "../ui/interrupts/confirmation_card.js";
16
+ import type { PendingDecision } from "../ui/interrupts/pending_decision.js";
17
+ import type { ToolCallCard } from "../ui/progress/tool_call_card.js";
18
+ import type { Transcript } from "../ui/transcript/transcript.js";
19
+ import type { UiStrings } from "../ui/ui_strings.js";
20
+ import type { ClientTool } from "./client_tool_registry.js";
21
+ import { isDestructive } from "./is_destructive.js";
22
+ import { isNavigates } from "./is_navigates.js";
23
+ import type { ToolCatalog } from "./tool_catalog.js";
24
+
25
+ /** What tool dispatch needs from the element that owns it. */
26
+ export interface ToolDispatchHost {
27
+ /** The custom element, which a host's predicate and renderer are called on. */
28
+ readonly element: HTMLElement;
29
+ /** The transcript the cards and prompts are drawn in. */
30
+ readonly transcript: Transcript;
31
+ /** The tools this round advertised, and their implementations. */
32
+ readonly tools: ToolCatalog;
33
+ /** The decision a run is suspended on, which a Stop abandons. */
34
+ readonly decision: PendingDecision;
35
+ /** The resolved string table. */
36
+ readonly strings: () => UiStrings;
37
+ /** Say one short thing to a screen reader. */
38
+ readonly announce: (message: string) => void;
39
+ /** The element's `autoConfirm`. */
40
+ readonly autoConfirm: () => boolean;
41
+ /** The element's `confirmPredicate`. */
42
+ readonly confirmPredicate: () =>
43
+ | ((toolName: string, args: Record<string, unknown>) => boolean | Promise<boolean>)
44
+ | null;
45
+ /** The element's `navigate`. */
46
+ readonly navigate: () => ((path: string) => void) | null;
47
+ /** The element's `approveWithEdits`. */
48
+ readonly approveWithEdits: () => boolean;
49
+ /** The element's `approvalRenderer`. */
50
+ readonly approvalRenderer: () => ApprovalRenderer | null;
51
+ /** The element's `getContext`, which a host may have replaced. */
52
+ readonly getContext: () => Context[];
53
+ /** The element's `conversationStore`, read per use. */
54
+ readonly conversationStore: () => ClientConversationStore;
55
+ /** The active thread's id. */
56
+ readonly threadId: () => string;
57
+ /** An identity replaced on every handover to another principal; only compared. */
58
+ readonly tenure: () => object;
59
+ /** An identity replaced whenever the transcript is cleared for another conversation; only compared. */
60
+ readonly conversation: () => object;
61
+ }
62
+
63
+ /**
64
+ * Running the frontend tool calls a round produced, and answering the server's
65
+ * interrupts: the page each round's context described, the confirmation rules,
66
+ * and the tools the user waived confirmation for.
67
+ *
68
+ * Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
69
+ * instance.
70
+ */
71
+ export class ToolDispatch {
72
+ readonly #host: ToolDispatchHost;
73
+ /** Tool names the user waived confirmation for; never persisted, since that would be a permanent grant. */
74
+ readonly #sessionApproved = new Set<string>();
75
+ // The page the current round's context describes; `null` until the first round.
76
+ #contextHref: string | null = null;
77
+
78
+ constructor(host: ToolDispatchHost) {
79
+ this.#host = host;
80
+ }
81
+
82
+ /** Forget every waiver: a logout is not a remount, so the next principal must not inherit one. */
83
+ forgetWaivers(): void {
84
+ this.#sessionApproved.clear();
85
+ }
86
+
87
+ /** Build a round's context, recording its page; the client calls this at the top of every tool round. */
88
+ buildContext(): Context[] {
89
+ this.#contextHref = window.location.href;
90
+ return this.#host.getContext();
91
+ }
92
+
93
+ /**
94
+ * Execute one frontend tool call the round produced, against its own card:
95
+ * refused when the page moved under the round, asked about when a rule gates
96
+ * it, and settled with what the handler returned or threw.
97
+ *
98
+ * Every await is a place the run can end, so each is followed by a check. A handover
99
+ * leaves the call no transcript or store, so it draws and writes nothing; any other
100
+ * reset (New chat, a drawer switch, `reload()`) still settles it but shows no pending
101
+ * indicator in the new conversation.
102
+ */
103
+ async execute(call: AgUiToolCall): Promise<ToolExecution | null> {
104
+ // A skill load is already a notice on the stream; it must not acquire a card here.
105
+ if (skillNameFrom(call) !== null) {
106
+ return null;
107
+ }
108
+ // Fixed at dispatch: read after the handler, they would be whoever is current by then.
109
+ const tenure = this.#host.tenure();
110
+ const conversation = this.#host.conversation();
111
+ const threadId = this.#host.threadId();
112
+ const card = this.#host.transcript.cardFor(call);
113
+ this.#host.transcript.forgetCard(call.id);
114
+ // A tool that renders into the transcript places itself against its card, no longer reachable by id.
115
+ this.#host.transcript.setCardElement(call.id, card.element);
116
+ this.#host.transcript.holdRunning(call.id, card);
117
+ // A tool this round did not advertise is treated as an unknown name, so a hallucinated
118
+ // or steered call cannot reach a handler that is merely registered mount-wide.
119
+ const tool = this.#host.tools.wasAdvertised(call.name)
120
+ ? this.#host.tools.resolve(call.name)
121
+ : null;
122
+ if (tool === null) {
123
+ // A server tool's result arrives via `onToolResult` and already settled the card; with
124
+ // none, neither side ran the call, so say it did not finish. No pending indicator:
125
+ // no client round follows, so it would hang.
126
+ if (!this.#host.transcript.isServerSettled(call.id)) {
127
+ card.settle(TOOL_CALL_STATUS.INTERRUPTED, this.#host.strings().callNotFinished);
128
+ }
129
+ return null;
130
+ }
131
+ // The page moved under this round: a same-named control would match silently on the new
132
+ // page. Precedes the confirmation prompt so no one approves a refused action. Navigating
133
+ // tools and read_page (the recovery) are exempt; the refusal names read_page, so it
134
+ // applies only when this round offered it.
135
+ if (
136
+ this.#host.tools.wasAdvertised(READ_PAGE_TOOL) &&
137
+ call.name !== READ_PAGE_TOOL &&
138
+ !isNavigates(tool.parameters) &&
139
+ this.#pageMoved()
140
+ ) {
141
+ const message = this.#host.strings().pageMoved;
142
+ card.settle(TOOL_CALL_STATUS.ERROR, message);
143
+ this.#host.transcript.showPending();
144
+ // Returned so a reload settles this card the same way; the card's status lives only in the DOM.
145
+ return { content: `Error: ${message}`, error: message, outcome: TOOL_OUTCOME.FAILED };
146
+ }
147
+ // The run is suspended on the host's predicate (it may ask a server) as on a card, so a
148
+ // Stop or handover aborts the wait.
149
+ const asking = this.#host.decision.open();
150
+ const rule = await this.#confirmationRule(call, tool);
151
+ this.#host.decision.close();
152
+ if (asking.aborted) {
153
+ return this.#abandoned(card);
154
+ }
155
+ if (rule === "unanswered") {
156
+ // A refusal, not a recorded decision: no person was asked.
157
+ const message = this.#host.strings().confirmCheckFailed;
158
+ card.settle(TOOL_CALL_STATUS.DECLINED, message);
159
+ this.#host.transcript.showPending();
160
+ return { content: message, outcome: TOOL_OUTCOME.DENIED };
161
+ }
162
+ if (rule !== null) {
163
+ const request: ConfirmationRequest = { toolName: call.name, args: call.args };
164
+ const confirmText = tool.parameters[X_CONFIRM_KEY];
165
+ if (typeof confirmText === "string") {
166
+ request.message = confirmText;
167
+ }
168
+ // Into the turn's answer group: appending to the message list put the prompt after later streamed content.
169
+ // A Stop while the card is open aborts the signal, declining it.
170
+ const signal = this.#host.decision.open();
171
+ // Asking for as long as the prompt is open, so a step row reads "waiting for you".
172
+ card.setAsking(true);
173
+ let accepted: boolean;
174
+ try {
175
+ const decision = requestConfirmation(this.#host.transcript.ensureGroup(), request, {
176
+ signal,
177
+ strings: this.#host.strings(),
178
+ // Only where it can be honoured: see `#confirmationRule`.
179
+ ...(rule === "destructive"
180
+ ? { onAlwaysAllow: () => this.#sessionApproved.add(call.name) }
181
+ : {}),
182
+ });
183
+ this.#host.transcript.updateEmptyState();
184
+ this.#host.transcript.follow();
185
+ accepted = await decision;
186
+ } finally {
187
+ card.setAsking(false);
188
+ }
189
+ this.#host.decision.close();
190
+ // A handover declines the card, but the transcript is the next principal's by now.
191
+ if (this.#host.tenure() !== tenure) {
192
+ return null;
193
+ }
194
+ card.recordDecision(accepted ? "approved" : "declined");
195
+ if (!accepted) {
196
+ const message = this.#host.strings().declinedAction;
197
+ card.settle(TOOL_CALL_STATUS.DECLINED, message);
198
+ // New chat or a drawer switch declines it too: skip only the drawing, not the refusal.
199
+ if (this.#host.conversation() === conversation) {
200
+ this.#host.transcript.showPending();
201
+ }
202
+ // The outcome annotation lets a reload show a refused action as denied.
203
+ return { content: message, outcome: TOOL_OUTCOME.DENIED };
204
+ }
205
+ // Confirm and Stop in the same task: not declined, but the run is over, so it does not run
206
+ // (the server-side gate treats approve-then-Stop the same way).
207
+ if (signal.aborted) {
208
+ return this.#abandoned(card);
209
+ }
210
+ }
211
+ // With a host `navigate()` (SPA) a navigating tool routes in-page and the loop continues.
212
+ const navigates = isNavigates(tool.parameters) && this.#host.navigate() === null;
213
+ if (navigates) {
214
+ // Checkpoint before the reload; the result is supplied on the next mount via the resume path.
215
+ this.#host.conversationStore().saveCheckpoint(threadId, { toolCallId: call.id });
216
+ }
217
+ try {
218
+ const result = await tool.handler(call.args, call.id);
219
+ // A Stop keeps the result (the action happened); a handover leaves it no one to reach.
220
+ if (this.#host.tenure() !== tenure) {
221
+ return null;
222
+ }
223
+ // Drawn from the arguments, so live and replay render the same.
224
+ if (tool.render !== undefined) {
225
+ this.#host.transcript.renderToolOutput(tool.render, call);
226
+ }
227
+ if (navigates) {
228
+ card.settle(TOOL_CALL_STATUS.DONE, this.#host.strings().navigating);
229
+ return { content: "", halt: true };
230
+ }
231
+ const content = JSON.stringify(result ?? null);
232
+ card.settle(TOOL_CALL_STATUS.DONE, content);
233
+ // A reset that is not a handover keeps the result but shows no run waiting there.
234
+ if (this.#host.conversation() === conversation) {
235
+ this.#host.transcript.showPending();
236
+ }
237
+ return { content };
238
+ } catch (error) {
239
+ // Also guards a write: after a handover the store is the next principal's.
240
+ if (this.#host.tenure() !== tenure) {
241
+ return null;
242
+ }
243
+ if (navigates) {
244
+ // The navigation never happened; drop the checkpoint from the thread it was written to.
245
+ this.#host.conversationStore().saveCheckpoint(threadId, null);
246
+ }
247
+ // Verbatim, on the card and in the result replayed to the model: a real reason lets it recover.
248
+ const message = error instanceof Error ? error.message : String(error);
249
+ card.settle(TOOL_CALL_STATUS.ERROR, message);
250
+ if (this.#host.conversation() === conversation) {
251
+ this.#host.transcript.showPending();
252
+ }
253
+ return { content: `Error: ${message}`, error: message, outcome: TOOL_OUTCOME.FAILED };
254
+ }
255
+ }
256
+
257
+ /**
258
+ * Render an approval card per server-side-tool interrupt and collect the
259
+ * user's decisions (approve → run it, deny → decline it).
260
+ *
261
+ * One card per gated call, in that call's own tool card, all at once: the prompt is
262
+ * identical for every call of a tool, so position tells them apart, and serial asking
263
+ * hides that more are coming. Each is marked `deferred` for the wait, else it reads
264
+ * "running...". A Stop aborts the shared decision, denying every open card. An approved
265
+ * tool runs on the resume run into the same card; a denied one settles here.
266
+ */
267
+ async resolveInterrupts(
268
+ interrupts: readonly Interrupt[],
269
+ ): Promise<Record<string, InterruptResponse>> {
270
+ const signal = this.#host.decision.open();
271
+ // The transcript is not a live region, so a screen reader needs this to know the run awaits a person.
272
+ this.#host.announce(
273
+ fillUiString(this.#host.strings().announceAwaitingDecision, { count: interrupts.length }),
274
+ );
275
+ this.#host.transcript.hidePending();
276
+ const answered = await Promise.all(
277
+ interrupts.map(async (interrupt) => {
278
+ const card =
279
+ interrupt.toolCallId !== undefined
280
+ ? this.#host.transcript.card(interrupt.toolCallId)
281
+ : undefined;
282
+ const request: ApprovalRequest = {};
283
+ const phrase = confirmPhrase(interrupt) ?? interrupt.message;
284
+ if (phrase !== undefined) {
285
+ request.message = phrase;
286
+ }
287
+ const toolName = card?.element.getAttribute("data-tool-name");
288
+ if (toolName !== null && toolName !== undefined) {
289
+ request.toolName = toolName;
290
+ }
291
+ // Only where honoured: the agent accepts `editedArgs` and we hold the call's arguments.
292
+ let editedArgs: Record<string, unknown> | undefined;
293
+ const editable = this.#host.approveWithEdits() && card !== undefined;
294
+ if (editable) {
295
+ request.args = card.args;
296
+ }
297
+ card?.mark(TOOL_CALL_STATUS.DEFERRED);
298
+ // Before either renderer: a folded step group has no box to focus in.
299
+ if (card !== undefined) {
300
+ this.#host.transcript.revealStep(card);
301
+ }
302
+ // Falls back to the answer group when the interrupt names no call we hold.
303
+ const builtIn = (): Promise<boolean> =>
304
+ requestApproval(card?.approvalSlot ?? this.#host.transcript.ensureGroup(), request, {
305
+ signal,
306
+ strings: this.#host.strings(),
307
+ ...(editable
308
+ ? {
309
+ onEdit: (args: Record<string, unknown>) => {
310
+ editedArgs = args;
311
+ },
312
+ }
313
+ : {}),
314
+ });
315
+ const renderer = this.#host.approvalRenderer();
316
+ let approved: boolean;
317
+ if (renderer === null) {
318
+ approved = await builtIn();
319
+ } else {
320
+ // Awaited here, not in a helper, to keep the microtask count of an answering renderer.
321
+ try {
322
+ approved = await renderer.call(this.#host.element, request, { signal });
323
+ } catch (error) {
324
+ approved = await this.#afterRendererFailed(error, signal, interrupt.id, builtIn);
325
+ }
326
+ }
327
+ // The same annotation as the client-side gate, so both read alike.
328
+ card?.recordDecision(approved ? "approved" : "declined");
329
+ if (approved) {
330
+ card?.mark(TOOL_CALL_STATUS.PENDING);
331
+ } else {
332
+ // No TOOL_CALL_RESULT will stream for a denied tool.
333
+ card?.settle(TOOL_CALL_STATUS.DECLINED, this.#host.strings().declinedAction);
334
+ }
335
+ return { id: interrupt.id, approved, editedArgs };
336
+ }),
337
+ );
338
+ this.#host.transcript.updateEmptyState();
339
+ this.#host.transcript.follow();
340
+ this.#host.decision.close();
341
+ const responses: Record<string, InterruptResponse> = {};
342
+ for (const { id, approved, editedArgs } of answered) {
343
+ // `editedArgs` rides only when changed, so "approved as proposed" differs from "approved, but like this".
344
+ responses[id] = approved
345
+ ? {
346
+ status: "resolved",
347
+ payload: editedArgs === undefined ? { approved: true } : { approved: true, editedArgs },
348
+ }
349
+ : { status: "cancelled" };
350
+ }
351
+ return responses;
352
+ }
353
+
354
+ /**
355
+ * Answer an interrupt whose host renderer failed: the built-in card asks instead.
356
+ *
357
+ * A renderer is presentation, not a guard; uncaught, its failure would reject the whole
358
+ * batch. A rejection after a Stop is the signal working: it resolves as not approved,
359
+ * silently.
360
+ */
361
+ #afterRendererFailed(
362
+ error: unknown,
363
+ signal: AbortSignal,
364
+ interruptId: string,
365
+ builtIn: () => Promise<boolean>,
366
+ ): Promise<boolean> {
367
+ if (signal.aborted) {
368
+ return Promise.resolve(false);
369
+ }
370
+ // Named by interrupt id: a batch can gate several calls of one tool.
371
+ console.warn(
372
+ `ag-ui-chat: approvalRenderer failed for interrupt ${interruptId}, so the built-in approval card asks instead`,
373
+ error,
374
+ );
375
+ return builtIn();
376
+ }
377
+
378
+ /**
379
+ * Which rule gates `call`, or `null` when it runs straight through, or
380
+ * `"unanswered"` when the host's predicate threw instead of deciding.
381
+ *
382
+ * The rule decides whether the prompt may be waived for the session: only the default
383
+ * `x-destructive` gate is, since `confirmPredicate` is authoritative.
384
+ */
385
+ async #confirmationRule(call: AgUiToolCall, tool: ClientTool): Promise<ConfirmationRule | null> {
386
+ if (this.#host.autoConfirm()) {
387
+ return null;
388
+ }
389
+ const predicate = this.#host.confirmPredicate();
390
+ if (predicate !== null) {
391
+ try {
392
+ return (await predicate.call(this.#host.element, call.name, call.args)) === true
393
+ ? "predicate"
394
+ : null;
395
+ } catch (error) {
396
+ // Fails closed: a guard that cannot answer has not said the call is safe. The message
397
+ // goes to the console, not the endpoint, since it was never written for the model.
398
+ console.warn(
399
+ `ag-ui-chat: confirmPredicate failed for tool ${call.name}, so the call was refused`,
400
+ error,
401
+ );
402
+ return "unanswered";
403
+ }
404
+ }
405
+ if (this.#sessionApproved.has(call.name)) {
406
+ return null;
407
+ }
408
+ return isDestructive(tool.parameters) ? "destructive" : null;
409
+ }
410
+
411
+ /**
412
+ * Settle a call whose run ended while it waited, and give the loop nothing.
413
+ *
414
+ * Dispatch took the card out of the end-of-run sweep, so nothing else settles it. `null`
415
+ * because a stopped run has no next round; the client answers the call as not finished
416
+ * on the next request, in the card's words.
417
+ */
418
+ #abandoned(card: ToolCallCard): null {
419
+ card.settle(TOOL_CALL_STATUS.INTERRUPTED, this.#host.strings().callNotFinished);
420
+ return null;
421
+ }
422
+
423
+ /**
424
+ * Whether the page moved since the current round's context was built.
425
+ *
426
+ * `null` means no round has built context yet (nothing to compare), which is
427
+ * not a move.
428
+ */
429
+ #pageMoved(): boolean {
430
+ return this.#contextHref !== null && this.#contextHref !== window.location.href;
431
+ }
432
+ }
433
+
434
+ /**
435
+ * A server-authored question for a gated call, read off the interrupt's metadata under
436
+ * `x-confirm`, as a client-side confirmation reads it from the schema. Narrowed because
437
+ * `metadata` is untyped on the wire and a non-string would render as "[object Object]".
438
+ */
439
+ function confirmPhrase(interrupt: Interrupt): string | undefined {
440
+ const phrase = interrupt.metadata?.[X_CONFIRM_KEY];
441
+ return typeof phrase === "string" && phrase.trim() !== "" ? phrase : undefined;
442
+ }
443
+
444
+ /**
445
+ * Why a client tool call is gated behind the confirmation card, or refused
446
+ * before one is drawn.
447
+ *
448
+ * Only `"destructive"` -- the default `x-destructive` gate -- may be waived for
449
+ * the session. `confirmPredicate` is documented as authoritative, so a call it
450
+ * gates keeps asking. `"unanswered"` is a predicate that threw instead of
451
+ * answering, and the call it was asked about is refused without a card.
452
+ */
453
+ type ConfirmationRule = "destructive" | "predicate" | "unanswered";