@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,429 @@
1
+ import { TOOL_CALL_STATUS, type TOOL_DISPLAY } from "../../constants.js";
2
+ import { DEFAULT_UI_STRINGS, type UiStrings } from "../ui_strings.js";
3
+
4
+ /** Any state a tool-call card can be in. */
5
+ export type ToolCallStatus = (typeof TOOL_CALL_STATUS)[keyof typeof TOOL_CALL_STATUS];
6
+
7
+ /** How much detail a card renders. */
8
+ export type ToolDisplayMode = (typeof TOOL_DISPLAY)[keyof typeof TOOL_DISPLAY];
9
+
10
+ /** The two states a card can sit in before an outcome exists. */
11
+ export type UnsettledStatus = typeof TOOL_CALL_STATUS.PENDING | typeof TOOL_CALL_STATUS.DEFERRED;
12
+
13
+ /** The terminal states a card settles into (everything unsettled excluded). */
14
+ export type SettledStatus = Exclude<ToolCallStatus, UnsettledStatus>;
15
+
16
+ /** Short pill text shown for each status, drawn from the string table. */
17
+ function statusLabels(strings: UiStrings): Record<ToolCallStatus, string> {
18
+ return {
19
+ [TOOL_CALL_STATUS.PENDING]: strings.toolRunning,
20
+ [TOOL_CALL_STATUS.DEFERRED]: strings.toolDeferred,
21
+ [TOOL_CALL_STATUS.DONE]: strings.toolDone,
22
+ [TOOL_CALL_STATUS.ERROR]: strings.toolError,
23
+ [TOOL_CALL_STATUS.DECLINED]: strings.toolDeclined,
24
+ [TOOL_CALL_STATUS.INTERRUPTED]: strings.toolInterrupted,
25
+ };
26
+ }
27
+
28
+ /** Section-heading text for each settled outcome's result region. */
29
+ function resultLabels(strings: UiStrings): Record<SettledStatus, string> {
30
+ return {
31
+ [TOOL_CALL_STATUS.DONE]: strings.resultLabel,
32
+ [TOOL_CALL_STATUS.ERROR]: strings.errorLabel,
33
+ [TOOL_CALL_STATUS.DECLINED]: strings.declinedLabel,
34
+ [TOOL_CALL_STATUS.INTERRUPTED]: strings.interruptedLabel,
35
+ };
36
+ }
37
+
38
+ /** Pretty-print a JSON payload; fall back to the raw text if it isn't JSON. */
39
+ function formatPayload(text: string): string {
40
+ try {
41
+ return JSON.stringify(JSON.parse(text), null, 2);
42
+ } catch {
43
+ return text;
44
+ }
45
+ }
46
+
47
+ /**
48
+ * One region of a card's body, handed to a host {@link ToolPayloadFormatter}.
49
+ *
50
+ * A discriminated union rather than three positional parameters because the two
51
+ * halves do not carry the same thing: arguments are the parsed record the call
52
+ * was made with, and a result is the raw string the tool returned, which may not
53
+ * be JSON at all. Flattening both into one `payload` parameter would force every
54
+ * formatter to re-derive which it had before it could read it, and the
55
+ * arguments would arrive re-serialised for no reason.
56
+ *
57
+ * `toolName` is the raw tool name, not the card's `x-summary` label -- a
58
+ * formatter dispatches on identity, and the label is a display string a server
59
+ * may change.
60
+ */
61
+ export type ToolPayload =
62
+ | {
63
+ readonly kind: "arguments";
64
+ readonly toolName: string;
65
+ readonly args: Record<string, unknown>;
66
+ }
67
+ | {
68
+ readonly kind: "result";
69
+ readonly toolName: string;
70
+ readonly status: SettledStatus;
71
+ readonly text: string;
72
+ };
73
+
74
+ /**
75
+ * Renders one region of a tool card's body, for a host that would rather show a
76
+ * table or a summary line than a wall of pretty-printed JSON.
77
+ *
78
+ * Return a `Node` to take the region over, a `string` to replace its text, or
79
+ * `null` to fall through to the built-in pretty-print -- so a formatter that
80
+ * only cares about one tool, or only about results, declines the rest rather
81
+ * than reimplementing them.
82
+ *
83
+ * **Presentation only.** The model reads the tool result from its own copy of
84
+ * the message, which this never touches, so anything said here is said to the
85
+ * person and not to the agent. Translating a value -- an enum constant into a
86
+ * friendly label, an epoch into a date -- belongs on the server, where it also
87
+ * reaches the model's prose; doing it here would make the card and the answer
88
+ * beside it disagree about what happened.
89
+ *
90
+ * A returned string is set as text, never parsed as markup: this is not a
91
+ * second HTML channel into the transcript, and a host that wants elements
92
+ * builds them itself and returns the node.
93
+ */
94
+ export type ToolPayloadFormatter = (payload: ToolPayload) => Node | string | null;
95
+
96
+ /** Optional per-card wiring beyond the name, arguments, label and strings. */
97
+ export interface ToolCallCardOptions {
98
+ /** Host presentation hook for both body regions. See {@link ToolPayloadFormatter}. */
99
+ readonly formatPayload?: ToolPayloadFormatter;
100
+ }
101
+
102
+ /**
103
+ * A live tool-call card for the chat transcript.
104
+ *
105
+ * Construction renders a status icon, the tool name, a status pill, and a body
106
+ * of two separately-headed regions — arguments and result — each with its own
107
+ * `part`. {@link settle} fills in the result and flips the pill. Both payloads
108
+ * are pretty-printed and never concatenated into one block.
109
+ *
110
+ * The card renders one DOM shape in every display mode and lets CSS decide what
111
+ * shows, selecting visibility from the host attribute rather than a value
112
+ * copied onto the card at construction. That is what lets `data-tool-display`
113
+ * be flipped on the host and re-read by every card already on screen; building
114
+ * a different structure per mode would leave existing cards stale.
115
+ *
116
+ * The leading icon carries no text: the shadow CSS draws its glyph or spinner
117
+ * from the card's `data-status`, so a host themes it through the
118
+ * `--ag-ui-tool-icon-*` custom properties or the `tool-card-icon` part without
119
+ * the card reaching into the host stylesheet.
120
+ *
121
+ * Either region may be drawn by the host instead: `options.formatPayload` is
122
+ * asked about each one and pretty-prints as before whenever it declines. The
123
+ * arguments are offered from the constructor and the result from {@link settle},
124
+ * because that is when each exists -- so a formatter is asked twice per card,
125
+ * potentially long apart.
126
+ *
127
+ * Pure DOM. The host appends {@link element} into its shadow root; all visible
128
+ * text comes from {@link UiStrings}.
129
+ */
130
+ export class ToolCallCard {
131
+ /** The card's root element; append this into the message list. */
132
+ readonly element: HTMLDivElement;
133
+
134
+ /**
135
+ * Where a question about *this* call renders — the approval prompt for a
136
+ * server-side tool the run deferred.
137
+ *
138
+ * It belongs to the card rather than to the transcript because a run can defer
139
+ * several calls at once, and a prompt written per *tool* ("Add this event to
140
+ * the board?") is identical for every one of them. Rendered into the answer
141
+ * group they were three anonymous copies of one question, below the three
142
+ * cards they gated; rendered here, position identifies them and the arguments
143
+ * are already on screen above the question.
144
+ *
145
+ * Empty until used, and hidden while empty by the shadow CSS.
146
+ */
147
+ readonly approvalSlot: HTMLDivElement;
148
+
149
+ /**
150
+ * Where a *nested* run's progress renders — the sub-agent this call delegated
151
+ * to, narrating itself while the card waits.
152
+ *
153
+ * A slot rather than a rendered thing, on the same reasoning as
154
+ * {@link approvalSlot}: the card owns the position and something else owns the
155
+ * content. What makes the position right is that the wire keys a delegation on
156
+ * this card's own `toolCallId`, so the run being narrated is the one this card
157
+ * already stands for.
158
+ *
159
+ * Placed above the Details toggle rather than inside the body, because the
160
+ * body is what the display modes hide — and a progress line that only appears
161
+ * in `full` mode would leave exactly the stall it exists to end. Empty on every
162
+ * card that delegated nothing, and hidden while empty by the shadow CSS.
163
+ */
164
+ readonly subagentSlot: HTMLDivElement;
165
+
166
+ readonly #status: HTMLSpanElement;
167
+ readonly #decision: HTMLSpanElement;
168
+ readonly #toggle: HTMLButtonElement;
169
+ readonly #resultSection: HTMLDivElement;
170
+ readonly #resultLabel: HTMLSpanElement;
171
+ readonly #resultBody: HTMLPreElement;
172
+ readonly #strings: UiStrings;
173
+ /**
174
+ * The arguments this call was made with.
175
+ *
176
+ * Retained rather than only rendered, because an approval interrupt names a
177
+ * `toolCallId` and nothing else -- so this card is the only place the args
178
+ * still exist when the user is asked to approve, edit or deny the call.
179
+ */
180
+ readonly args: Record<string, unknown>;
181
+ /** The raw tool name, kept for the payloads handed to {@link ToolPayloadFormatter}. */
182
+ readonly #name: string;
183
+ readonly #formatPayload: ToolPayloadFormatter | null;
184
+ #settled = false;
185
+
186
+ constructor(
187
+ name: string,
188
+ args: Record<string, unknown>,
189
+ summary?: string,
190
+ strings: UiStrings = DEFAULT_UI_STRINGS,
191
+ options: ToolCallCardOptions = {},
192
+ ) {
193
+ this.#strings = strings;
194
+ this.args = args;
195
+ this.#name = name;
196
+ this.#formatPayload = options.formatPayload ?? null;
197
+
198
+ this.element = document.createElement("div");
199
+ this.element.className = "tool-call";
200
+ this.element.setAttribute("data-tool-name", name);
201
+ this.element.setAttribute("data-expanded", "false");
202
+
203
+ const head = document.createElement("div");
204
+ head.className = "tool-call-head";
205
+ head.setAttribute("part", "tool-card-head");
206
+
207
+ // Left empty in the DOM on purpose: the shadow CSS draws the spinner or
208
+ // settled mark from `data-status`, keeping the glyphs themeable.
209
+ const icon = document.createElement("span");
210
+ icon.className = "tool-call-icon";
211
+ icon.setAttribute("part", "tool-card-icon");
212
+ icon.setAttribute("aria-hidden", "true");
213
+
214
+ const label = document.createElement("span");
215
+ label.className = "tool-call-name";
216
+ label.setAttribute("part", "tool-card-name");
217
+ // A server-provided `x-summary` label reads better than the raw tool name.
218
+ label.textContent = summary ?? name;
219
+
220
+ this.#status = document.createElement("span");
221
+ this.#status.className = "tool-call-status";
222
+ this.#setStatus(TOOL_CALL_STATUS.PENDING);
223
+
224
+ this.#decision = document.createElement("span");
225
+ this.#decision.className = "tool-call-decision";
226
+ this.#decision.setAttribute("part", "tool-card-decision");
227
+ this.#decision.hidden = true;
228
+
229
+ head.append(icon, label, this.#status, this.#decision);
230
+
231
+ const argsSection = this.#section("args", strings.argumentsLabel);
232
+ this.#renderPayload(
233
+ argsSection.body,
234
+ { kind: "arguments", toolName: name, args },
235
+ JSON.stringify(args, null, 2),
236
+ );
237
+ // Drop the region rather than frame an empty object. The marker is what
238
+ // the shadow CSS reads to tell whether the toggle has anything to open:
239
+ // in compact the arguments are behind it too.
240
+ const hasArgs = Object.keys(args).length > 0;
241
+ argsSection.root.hidden = !hasArgs;
242
+ this.element.toggleAttribute("data-has-args", hasArgs);
243
+
244
+ const resultSection = this.#section("result", strings.resultLabel);
245
+ this.#resultSection = resultSection.root;
246
+ this.#resultLabel = resultSection.label;
247
+ this.#resultBody = resultSection.body;
248
+ // Nothing to show until `settle` supplies it, or a pending card expands
249
+ // onto an empty region.
250
+ resultSection.root.hidden = true;
251
+
252
+ this.#toggle = document.createElement("button");
253
+ this.#toggle.type = "button";
254
+ this.#toggle.className = "tool-call-toggle";
255
+ this.#toggle.setAttribute("part", "tool-card-toggle");
256
+ this.#toggle.setAttribute("aria-expanded", "false");
257
+ this.#toggle.textContent = strings.details;
258
+ this.#toggle.addEventListener("click", () => this.#setExpanded(!this.#expanded()));
259
+
260
+ const body = document.createElement("div");
261
+ body.className = "tool-call-body";
262
+ body.setAttribute("part", "tool-card-body");
263
+ body.append(argsSection.root, resultSection.root);
264
+
265
+ this.approvalSlot = document.createElement("div");
266
+ this.approvalSlot.className = "tool-call-approval";
267
+ this.approvalSlot.setAttribute("part", "tool-card-approval");
268
+
269
+ this.subagentSlot = document.createElement("div");
270
+ this.subagentSlot.className = "tool-call-subagent";
271
+ this.subagentSlot.setAttribute("part", "tool-card-subagent");
272
+
273
+ this.element.append(head, this.subagentSlot, this.#toggle, body, this.approvalSlot);
274
+ }
275
+
276
+ /**
277
+ * Move between the two states that are not an outcome — `pending` (running)
278
+ * and `deferred` (gated, waiting on a person).
279
+ *
280
+ * Ignored once {@link settle} has run: a card that was declined must not be
281
+ * talked back into looking live by a late event.
282
+ */
283
+ mark(status: UnsettledStatus): void {
284
+ if (this.#settled) {
285
+ return;
286
+ }
287
+ this.#setStatus(status);
288
+ }
289
+
290
+ /**
291
+ * Say whether a prompt is open on this call, a question it asked or a
292
+ * confirmation it needs. A flag of its own beside the status, which stays
293
+ * `pending`: the call is still running as far as the status goes, and a card
294
+ * display mode that reads the status draws it exactly as before. The step
295
+ * group reads the flag to tell a call waiting on a person from one working.
296
+ */
297
+ setAsking(asking: boolean): void {
298
+ this.element.toggleAttribute("data-asking", asking);
299
+ }
300
+
301
+ /**
302
+ * Record that a human approved or declined this call, as a line in the card.
303
+ * The prompt disappears once answered, so this is the only lasting trace that
304
+ * the call was gated at all.
305
+ */
306
+ recordDecision(kind: "approved" | "declined"): void {
307
+ this.element.setAttribute("data-decision", kind);
308
+ this.#decision.textContent =
309
+ kind === "approved" ? this.#strings.decisionApproved : this.#strings.decisionDeclined;
310
+ this.#decision.hidden = false;
311
+ }
312
+
313
+ /** Whether {@link settle} has already run (so a terminal sweep can skip it). */
314
+ get settled(): boolean {
315
+ return this.#settled;
316
+ }
317
+
318
+ /**
319
+ * Flip the status pill to `status` and fill in the result region, whose
320
+ * heading names the outcome (result / error / declined).
321
+ *
322
+ * A blank `text` leaves the region out, as the constructor does for empty
323
+ * arguments: the call settled with nothing to show, so the card stays a
324
+ * status row and its toggle is not offered. The formatter is not asked about
325
+ * a result that is not there.
326
+ */
327
+ settle(status: SettledStatus, text: string): void {
328
+ // Idempotent: a duplicate `TOOL_CALL_RESULT`, or a replayed tool message
329
+ // for an already-settled card, must not overwrite the first outcome.
330
+ if (this.#settled) {
331
+ return;
332
+ }
333
+ this.#settled = true;
334
+ this.#setStatus(status);
335
+ if (text.trim() === "") {
336
+ return;
337
+ }
338
+ this.#resultLabel.textContent = resultLabels(this.#strings)[status];
339
+ this.#renderPayload(
340
+ this.#resultBody,
341
+ { kind: "result", toolName: this.#name, status, text },
342
+ formatPayload(text),
343
+ );
344
+ this.#resultSection.hidden = false;
345
+ // Read by the shadow CSS, which offers the toggle only over something, and
346
+ // by a step group, which offers its row on the same terms.
347
+ this.element.setAttribute("data-has-result", "");
348
+ }
349
+
350
+ /**
351
+ * Write the status everywhere it is read from, in one place so they cannot
352
+ * disagree: `data-status` for the shadow CSS, the pill's text, and the part
353
+ * lists. `::part()` takes no attribute selector, so the card and its pill also
354
+ * name the status as a part (`tool-card-error`, `tool-card-status-error`), the
355
+ * modifier convention a run notice uses, and a host styles failures alone.
356
+ * Setting the whole list replaces the previous modifier.
357
+ */
358
+ #setStatus(status: ToolCallStatus): void {
359
+ this.element.setAttribute("data-status", status);
360
+ this.element.setAttribute("part", `tool-card tool-card-${status}`);
361
+ this.#status.setAttribute("part", `tool-card-status tool-card-status-${status}`);
362
+ this.#status.textContent = statusLabels(this.#strings)[status];
363
+ }
364
+
365
+ /**
366
+ * Fill one body region, offering it to the host formatter first.
367
+ *
368
+ * `fallback` is computed by the caller rather than here because the two
369
+ * regions build it differently -- arguments are already parsed, a result is a
370
+ * string that may or may not be JSON -- and because a formatter that takes
371
+ * the region over should not have paid for a pretty-print nobody sees. It is
372
+ * cheap either way; the point is that the built-in rendering stays written
373
+ * once, beside the payload it belongs to.
374
+ *
375
+ * The `data-formatted` marker is what the shadow CSS reads to relax the
376
+ * preformatted whitespace on a region a host owns -- a table inherits it as
377
+ * mangled cell spacing, a sentence as line breaks nobody typed. Marked for a
378
+ * returned string too: one rule, and a summary line wants ordinary wrapping
379
+ * as much as a table does.
380
+ */
381
+ #renderPayload(body: HTMLPreElement, payload: ToolPayload, fallback: string): void {
382
+ const rendered = this.#formatPayload === null ? null : this.#formatPayload(payload);
383
+ if (rendered === null) {
384
+ body.textContent = fallback;
385
+ return;
386
+ }
387
+ body.setAttribute("data-formatted", "true");
388
+ if (typeof rendered === "string") {
389
+ body.textContent = rendered;
390
+ return;
391
+ }
392
+ body.replaceChildren(rendered);
393
+ }
394
+
395
+ /** Build one labelled region of the body: a heading plus a payload block. */
396
+ #section(
397
+ kind: string,
398
+ labelText: string,
399
+ ): {
400
+ root: HTMLDivElement;
401
+ label: HTMLSpanElement;
402
+ body: HTMLPreElement;
403
+ } {
404
+ const root = document.createElement("div");
405
+ root.className = `tool-call-section tool-call-section--${kind}`;
406
+ root.setAttribute("part", `tool-card-section tool-card-${kind}-section`);
407
+
408
+ const label = document.createElement("span");
409
+ label.className = "tool-call-section-label";
410
+ label.setAttribute("part", `tool-card-section-label tool-card-${kind}-label`);
411
+ label.textContent = labelText;
412
+
413
+ const body = document.createElement("pre");
414
+ body.className = `tool-call-${kind}`;
415
+ body.setAttribute("part", `tool-card-${kind}`);
416
+
417
+ root.append(label, body);
418
+ return { root, label, body };
419
+ }
420
+
421
+ #expanded(): boolean {
422
+ return this.element.getAttribute("data-expanded") === "true";
423
+ }
424
+
425
+ #setExpanded(expand: boolean): void {
426
+ this.element.setAttribute("data-expanded", String(expand));
427
+ this.#toggle.setAttribute("aria-expanded", String(expand));
428
+ }
429
+ }