@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,313 @@
1
+ // The folded tool-step group: one row per run of consecutive tool calls,
2
+ // with the per-call cards one click down.
3
+
4
+ /** The four per-call card modes, as attribute selectors on the host. */
5
+ const CARD_MODES = [
6
+ '[data-tool-display="inline"]',
7
+ '[data-tool-display="minimal"]',
8
+ '[data-tool-display="compact"]',
9
+ '[data-tool-display="full"]',
10
+ ].join(", ");
11
+
12
+ /**
13
+ * The host in grouped mode: any data-tool-display but the four card modes,
14
+ * which is how the element's toolDisplay getter reads it, so an absent or
15
+ * unknown value groups here as it does there. Wrapped in :where so it weighs
16
+ * what a bare :host weighs, and a theme restating a group rule on its own
17
+ * :host selector still wins at equal weight.
18
+ */
19
+ const GROUPED = `:host(:where(:not(${CARD_MODES})))`;
20
+
21
+ /** The host in one of the four card modes, where a group drawn earlier is flattened. */
22
+ const CARDS = `:host(:is(${CARD_MODES}))`;
23
+
24
+ /**
25
+ * A card inside an opened group, with the host in grouped mode and the given
26
+ * data-tool-group-display. The inner attribute sits inside the same :host()
27
+ * as the grouped test, since the host is featureless outside it, and being
28
+ * grouped-only is what lets an outer card mode flatten the group into its own
29
+ * cards: none of these rules match there. Full is no rule at all, so an absent
30
+ * or unknown inner value draws the full card a group always drew.
31
+ */
32
+ function inner(mode: string): string {
33
+ return `:host(:where(:not(${CARD_MODES}))[data-tool-group-display="${mode}"]) .tool-group-list .tool-call`;
34
+ }
35
+
36
+ export const TOOL_GROUP_STYLES: string = `
37
+ /* ── The folded tool-step group ──────────────────────────────────
38
+ One quiet row per run of consecutive calls, the cards one click down as
39
+ plain lines rather than boxes. Every rule is scoped to grouped mode, so
40
+ none of it reaches a group drawn earlier once the host moves to a card
41
+ mode. */
42
+ ${GROUPED} .tool-group {
43
+ align-self: stretch;
44
+ display: flex;
45
+ flex-direction: column;
46
+ min-width: 0;
47
+ }
48
+
49
+ ${GROUPED} .tool-group-head {
50
+ appearance: none;
51
+ align-self: flex-start;
52
+ max-width: 100%;
53
+ display: inline-flex;
54
+ align-items: center;
55
+ gap: 8px;
56
+ margin: 0 0 0 -6px;
57
+ padding: 4px 6px;
58
+ border: 0;
59
+ border-radius: 6px;
60
+ background: transparent;
61
+ color: var(--_muted);
62
+ font: inherit;
63
+ font-size: var(--_text-sm);
64
+ line-height: 1.3;
65
+ text-align: left;
66
+ cursor: pointer;
67
+ }
68
+
69
+ ${GROUPED} .tool-group-head:not(:disabled):hover {
70
+ background: var(--_hover);
71
+ color: var(--_fg);
72
+ }
73
+
74
+ /* A one-step row with nothing behind it -- a call with no arguments and no
75
+ result yet, or a blank one -- is a label, not a control: the step group
76
+ disables it and drops its expanded state, and this drops the pointer and
77
+ the chevron. Disabled rather than enabled-and-inert, so it takes no focus. */
78
+ ${GROUPED} .tool-group-head:disabled {
79
+ cursor: default;
80
+ }
81
+
82
+ ${GROUPED} .tool-group-head:disabled .tool-group-chevron {
83
+ display: none;
84
+ }
85
+
86
+ ${GROUPED} .tool-group-head:focus-visible {
87
+ outline: 2px solid var(--_ring);
88
+ outline-offset: 1px;
89
+ }
90
+
91
+ ${GROUPED} .tool-group-label {
92
+ min-width: 0;
93
+ font-weight: 500;
94
+ color: var(--_ink-2);
95
+ overflow-wrap: anywhere;
96
+ }
97
+
98
+ ${GROUPED} .tool-group-meta {
99
+ min-width: 0;
100
+ color: var(--_muted);
101
+ overflow-wrap: anywhere;
102
+ }
103
+
104
+ /* Each note opens with a middle dot, which also parts the first note from
105
+ the label. */
106
+ ${GROUPED} .tool-group-note::before {
107
+ content: "\\00B7";
108
+ margin: 0 6px 0 2px;
109
+ }
110
+
111
+ ${GROUPED} .tool-group[data-state="error"] .tool-group-meta {
112
+ color: var(--_danger);
113
+ }
114
+
115
+ ${GROUPED} .tool-group-icon {
116
+ flex: none;
117
+ box-sizing: border-box;
118
+ width: 14px;
119
+ height: 14px;
120
+ background: currentColor;
121
+ mask: var(--_ico-check) center / contain no-repeat;
122
+ color: var(--_success);
123
+ }
124
+
125
+ ${GROUPED} .tool-group[data-state="error"] .tool-group-icon {
126
+ mask-image: var(--_ico-error);
127
+ color: var(--_danger);
128
+ }
129
+
130
+ ${GROUPED} .tool-group[data-state="running"] .tool-group-icon {
131
+ mask: none;
132
+ background: none;
133
+ border: 2px solid var(--_muted);
134
+ border-top-color: transparent;
135
+ border-radius: 50%;
136
+ animation: ag-ui-tool-spin var(--_tool-spin-duration) linear infinite;
137
+ }
138
+
139
+ /* Waiting on the user: a steady accent dot rather than a spinner, and the
140
+ count in the accent's ink. */
141
+ ${GROUPED} .tool-group[data-state="waiting"] .tool-group-icon {
142
+ mask: none;
143
+ border-radius: 50%;
144
+ transform: scale(0.6);
145
+ background: var(--_accent);
146
+ }
147
+
148
+ ${GROUPED} .tool-group[data-state="waiting"] .tool-group-meta {
149
+ color: var(--_accent-ink);
150
+ font-weight: 500;
151
+ }
152
+
153
+ ${GROUPED} .tool-group-chevron {
154
+ flex: none;
155
+ width: 12px;
156
+ height: 12px;
157
+ background: currentColor;
158
+ mask: var(--_ico-chevron) center / contain no-repeat;
159
+ opacity: 0.7;
160
+ transition: transform var(--_motion) var(--_ease);
161
+ }
162
+
163
+ ${GROUPED} .tool-group[data-open="true"] .tool-group-chevron {
164
+ transform: rotate(90deg);
165
+ }
166
+
167
+ @media (prefers-reduced-motion: reduce) {
168
+ ${GROUPED} .tool-group[data-state="running"] .tool-group-icon {
169
+ animation: none;
170
+ }
171
+ }
172
+
173
+ ${GROUPED} .tool-group-list {
174
+ display: flex;
175
+ flex-direction: column;
176
+ gap: 2px;
177
+ margin: 2px 0 4px 6px;
178
+ padding-left: 13px;
179
+ border-left: 1px solid var(--_border);
180
+ }
181
+
182
+ ${GROUPED} .tool-group[data-open="false"] .tool-group-list {
183
+ display: none;
184
+ }
185
+
186
+ /* A card inside the group is one line of the list: icon, name, and its
187
+ Details control at the end, with the arguments and result opening under
188
+ the whole row. Its ink is the second ink in every theme, unless the host
189
+ set the tool token, which then reaches the grouped calls too. */
190
+ ${GROUPED} .tool-group .tool-call {
191
+ max-width: 100%;
192
+ align-self: stretch;
193
+ flex-flow: row wrap;
194
+ align-items: center;
195
+ gap: 2px 10px;
196
+ padding: 3px 0;
197
+ border: 0;
198
+ border-radius: 0;
199
+ background: transparent;
200
+ color: var(--_tool-fg-set, var(--_ink-2));
201
+ font-family: inherit;
202
+ font-size: var(--_text-sm);
203
+ }
204
+
205
+ ${GROUPED} .tool-group .tool-call-head {
206
+ flex: 1 1 auto;
207
+ justify-content: flex-start;
208
+ }
209
+
210
+ ${GROUPED} .tool-group .tool-call-name {
211
+ flex: 0 1 auto;
212
+ font-weight: 450;
213
+ }
214
+
215
+ /* The repeat ordinal on a step whose label an earlier step has. */
216
+ ${GROUPED} .tool-call-repeat {
217
+ color: var(--_muted);
218
+ font-variant-numeric: tabular-nums;
219
+ }
220
+
221
+ ${GROUPED} .tool-group .tool-call-toggle {
222
+ font-family: inherit;
223
+ font-size: var(--_text-xs);
224
+ color: var(--_muted);
225
+ }
226
+
227
+ ${GROUPED} .tool-group .tool-call-body,
228
+ ${GROUPED} .tool-group .tool-call-approval,
229
+ ${GROUPED} .tool-group .tool-call-subagent {
230
+ flex-basis: 100%;
231
+ }
232
+
233
+ /* The inner display mode: how an opened group draws its calls. The same
234
+ visibility rules the card modes apply to a flat card, so a call inside the
235
+ group shows the regions the flat card of that mode shows. The flat inline
236
+ mode's chrome rule is left out on purpose: a card in the group has already
237
+ lost its box and is laid out as a row of the list, and that rule's padding
238
+ and gap would undo the row. Selected from the host attribute, so changing it
239
+ restyles groups already on screen. */
240
+ ${inner("compact")}[data-expanded="false"] .tool-call-section {
241
+ display: none;
242
+ }
243
+
244
+ ${inner("inline")} .tool-call-section--args {
245
+ display: none;
246
+ }
247
+
248
+ ${inner("minimal")} .tool-call-toggle,
249
+ ${inner("minimal")} .tool-call-body {
250
+ display: none;
251
+ }
252
+
253
+ /* The toggle over nothing, as the card modes refuse it: under every inner mode
254
+ but compact the arguments are not behind the toggle, so a call whose result
255
+ is missing or blank has nothing for it to open. */
256
+ :host(:where(:not(${CARD_MODES})):not([data-tool-group-display="compact"])) .tool-group-list .tool-call:not([data-has-result]) .tool-call-toggle {
257
+ display: none;
258
+ }
259
+
260
+ /* A call waiting on an approval shows its arguments in every inner mode, as it
261
+ does in every card mode, and for the same reason: the arguments are what
262
+ tell three gated calls of one tool apart. These come after the hides above,
263
+ which they tie with on weight. The arguments region only, never every
264
+ section, since the result region carries the hidden attribute until a
265
+ result exists and a display value here would override it. The arguments
266
+ region carries it too when the call has none, so it is excluded while
267
+ hidden rather than framed empty. */
268
+ ${inner("minimal")}[data-status="deferred"] .tool-call-body {
269
+ display: flex;
270
+ }
271
+
272
+ ${inner("compact")}[data-status="deferred"] .tool-call-section--args:not([hidden]),
273
+ ${inner("inline")}[data-status="deferred"] .tool-call-section--args:not([hidden]) {
274
+ display: flex;
275
+ }
276
+
277
+ /* A one-step group already names its call in the row, so the card's own head
278
+ is not drawn inside it. Under the minimal inner mode a card is only its head,
279
+ so the row has nothing to open onto and draws no chevron. Grouped-only, so a
280
+ card mode keeps the head. data-count is rewritten live as a run grows. */
281
+ ${GROUPED} .tool-group[data-count="1"] .tool-call-head {
282
+ display: none;
283
+ }
284
+
285
+ :host(:where(:not(${CARD_MODES}))[data-tool-group-display="minimal"]) .tool-group[data-count="1"] .tool-group-chevron {
286
+ display: none;
287
+ }
288
+
289
+ /* Grouping is decided as each card is built, so a card mode set afterwards
290
+ finds groups already drawn. It flattens them: the group and its list stop
291
+ generating boxes, the row and the repeat ordinals go, and every card lays
292
+ out as a direct child of the answer, exactly as a card built in that mode
293
+ does. */
294
+ ${CARDS} .tool-group,
295
+ ${CARDS} .tool-group-list {
296
+ display: contents;
297
+ }
298
+
299
+ ${CARDS} .tool-group-head,
300
+ ${CARDS} .tool-call-repeat {
301
+ display: none;
302
+ }
303
+
304
+ /* Each of these declares its own display, which beats the user-agent rule for
305
+ the hidden attribute, so each needs its own. The host prefix is there for
306
+ weight, not scope: it lifts these over the card-mode rules above that set
307
+ display, which are heavier than a bare class and attribute. */
308
+ :host .tool-group[hidden],
309
+ :host .tool-group-head[hidden],
310
+ :host .tool-group-list[hidden] {
311
+ display: none;
312
+ }
313
+ `;
@@ -0,0 +1,317 @@
1
+ import {
2
+ SUBAGENT_PHASE,
3
+ TOOL_CALL_STATUS,
4
+ TOOL_GROUP_DISPLAY,
5
+ type ToolGroupDisplayMode,
6
+ } from "../../constants.js";
7
+ import { fillUiString } from "../fill_ui_string.js";
8
+ import type { UiStrings } from "../ui_strings.js";
9
+
10
+ /** What a group says about itself, read by the shadow CSS from `data-state`. */
11
+ type GroupState = "waiting" | "running" | "done" | "error";
12
+
13
+ /** The statuses a step is still open in. */
14
+ const OPEN_STATUSES: ReadonlySet<string> = new Set([
15
+ TOOL_CALL_STATUS.PENDING,
16
+ TOOL_CALL_STATUS.DEFERRED,
17
+ ]);
18
+
19
+ /**
20
+ * A sub-agent panel still working, by the phase it stamps on itself. A panel
21
+ * outlives the delegation it drew, so a settled one does not match.
22
+ */
23
+ const RUNNING_SUBAGENT = `.tool-call-subagent > .subagent:is(${[
24
+ SUBAGENT_PHASE.STARTED,
25
+ SUBAGENT_PHASE.TOOL_CALL,
26
+ SUBAGENT_PHASE.TOOL_RESULT,
27
+ ]
28
+ .map((phase) => `[data-phase="${phase}"]`)
29
+ .join(", ")})`;
30
+
31
+ /** One step of the group: its card, and its label as the row names it. */
32
+ interface Step {
33
+ readonly element: HTMLElement;
34
+ readonly name: string;
35
+ readonly label: string;
36
+ }
37
+
38
+ /**
39
+ * The attributes the row is drawn from: each card's `data-status`, its
40
+ * `data-asking` while a question or a confirmation is open on it, its
41
+ * `data-has-result` once a result with text arrived, and the `data-phase` and
42
+ * `data-agent` a sub-agent panel stamps on itself inside the card that
43
+ * delegated to it. Watched rather than told, so a step settled, asked about or
44
+ * delegated by any path updates the row without the group being called.
45
+ */
46
+ const WATCHED_ATTRIBUTES: readonly string[] = [
47
+ "data-status",
48
+ "data-asking",
49
+ "data-has-result",
50
+ "data-phase",
51
+ "data-agent",
52
+ ];
53
+
54
+ /**
55
+ * Whether a lone step's card has anything to show under the row, which hides
56
+ * the card's own head: arguments, a result with text, an approval prompt (drawn
57
+ * while the call is deferred) or a sub-agent's progress. Which of the first two
58
+ * the inner display draws decides which count: inline draws no arguments, and
59
+ * minimal draws neither, so a call is not offered over what it would not show.
60
+ */
61
+ function hasDetails(card: HTMLElement, display: ToolGroupDisplayMode): boolean {
62
+ const minimal = display === TOOL_GROUP_DISPLAY.MINIMAL;
63
+ const args = !minimal && display !== TOOL_GROUP_DISPLAY.INLINE;
64
+ return (
65
+ (args && card.hasAttribute("data-has-args")) ||
66
+ (!minimal && card.hasAttribute("data-has-result")) ||
67
+ card.getAttribute("data-status") === TOOL_CALL_STATUS.DEFERRED ||
68
+ card.querySelector(".tool-call-subagent > *") !== null
69
+ );
70
+ }
71
+
72
+ /**
73
+ * Consecutive tool calls folded into one quiet row, "Worked through 5 steps",
74
+ * with the per-call cards one click down. Built by the transcript for each run
75
+ * of calls when the element's `toolDisplay` is `grouped`.
76
+ *
77
+ * The group owns no state of its own beyond its nodes and two facts: each
78
+ * step's label, and whether it has already opened itself for the current wait.
79
+ * Everything else is read back off the cards each time one changes.
80
+ *
81
+ * It opens itself while a step waits on the user, because a deferred step
82
+ * carries its approval prompt inside its card and a folded group would hide
83
+ * the very question it is asking. Once per wait, so the user can fold it
84
+ * again. A running sub-agent does not open it: the row names the sub-agent
85
+ * instead, beside the running mark.
86
+ */
87
+ export class ToolStepGroup {
88
+ readonly element: HTMLDivElement;
89
+ readonly #strings: UiStrings;
90
+ readonly #display: () => ToolGroupDisplayMode;
91
+ readonly #list: HTMLDivElement;
92
+ readonly #head: HTMLButtonElement;
93
+ readonly #label: HTMLSpanElement;
94
+ readonly #meta: HTMLSpanElement;
95
+ /** The steps, in order. Cards only ever join a group, so this is its list's children. */
96
+ readonly #steps: Step[] = [];
97
+ /** Whether the group has already opened itself for the current wait. */
98
+ #openedForWait = false;
99
+
100
+ constructor(strings: UiStrings, display: () => ToolGroupDisplayMode) {
101
+ this.#strings = strings;
102
+ this.#display = display;
103
+ this.element = document.createElement("div");
104
+ this.element.className = "tool-group";
105
+ this.element.setAttribute("part", "tool-group");
106
+ this.element.setAttribute("data-open", "false");
107
+
108
+ this.#head = document.createElement("button");
109
+ this.#head.type = "button";
110
+ this.#head.className = "tool-group-head";
111
+ this.#head.setAttribute("part", "tool-group-head");
112
+ this.#head.setAttribute("aria-expanded", "false");
113
+
114
+ const icon = document.createElement("span");
115
+ icon.className = "tool-group-icon";
116
+ icon.setAttribute("part", "tool-group-icon");
117
+ icon.setAttribute("aria-hidden", "true");
118
+
119
+ this.#label = document.createElement("span");
120
+ this.#label.className = "tool-group-label";
121
+ this.#label.setAttribute("part", "tool-group-label");
122
+
123
+ this.#meta = document.createElement("span");
124
+ this.#meta.className = "tool-group-meta";
125
+ this.#meta.setAttribute("part", "tool-group-meta");
126
+
127
+ const chevron = document.createElement("span");
128
+ chevron.className = "tool-group-chevron";
129
+ chevron.setAttribute("aria-hidden", "true");
130
+
131
+ this.#head.append(icon, this.#label, this.#meta, chevron);
132
+ this.#head.addEventListener("click", () => {
133
+ this.setOpen(this.element.getAttribute("data-open") !== "true");
134
+ });
135
+
136
+ this.#list = document.createElement("div");
137
+ this.#list.className = "tool-group-list";
138
+ this.#list.setAttribute("part", "tool-group-list");
139
+
140
+ this.element.append(this.#head, this.#list);
141
+
142
+ new MutationObserver(() => {
143
+ this.refresh();
144
+ }).observe(this.#list, {
145
+ attributes: true,
146
+ attributeFilter: [...WATCHED_ATTRIBUTES],
147
+ subtree: true,
148
+ });
149
+ }
150
+
151
+ /**
152
+ * Add a card's element as the group's next step, under the label the card
153
+ * was built with.
154
+ *
155
+ * A step whose label an earlier step already has gets a repeat ordinal,
156
+ * "Fill field (2)", in an element of its own beside the card's name. The
157
+ * name itself is never rewritten, so a group flattened back into per-call
158
+ * cards by a card display mode shows exactly the label the card was built
159
+ * with, and the CSS hides the ordinal there.
160
+ */
161
+ add(card: HTMLElement, name: string): void {
162
+ const seen = this.#steps.filter((step) => step.name === name).length + 1;
163
+ let label = name;
164
+ if (seen > 1) {
165
+ const repeat = document.createElement("span");
166
+ repeat.className = "tool-call-repeat";
167
+ repeat.setAttribute("part", "tool-card-repeat");
168
+ repeat.textContent = fillUiString(this.#strings.toolStepRepeat, { n: seen });
169
+ card.querySelector(".tool-call-name")?.after(repeat);
170
+ label = `${name} ${repeat.textContent}`;
171
+ }
172
+ this.#steps.push({ element: card, name, label });
173
+ this.#list.append(card);
174
+ this.refresh();
175
+ }
176
+
177
+ /** Show or hide the per-step cards. */
178
+ setOpen(open: boolean): void {
179
+ this.element.setAttribute("data-open", String(open));
180
+ this.#head.setAttribute("aria-expanded", String(open));
181
+ }
182
+
183
+ /**
184
+ * Offer the row as a disclosure only while something is behind it. Several
185
+ * steps always are, since each shows its own head; a lone step's head is not
186
+ * drawn in the group, so the row is a label until its card has details. A
187
+ * row that loses them, a gated call with no arguments once it is answered,
188
+ * folds as it goes.
189
+ */
190
+ #setExpandable(expandable: boolean): void {
191
+ this.#head.disabled = !expandable;
192
+ if (expandable) {
193
+ this.#head.setAttribute("aria-expanded", this.element.getAttribute("data-open") as string);
194
+ return;
195
+ }
196
+ this.element.setAttribute("data-open", "false");
197
+ this.#head.removeAttribute("aria-expanded");
198
+ }
199
+
200
+ /**
201
+ * Open the group now, for the wait that is about to start.
202
+ *
203
+ * The group opens itself from its mutation observer, which runs a tick after
204
+ * the card is marked deferred. The approval prompt is drawn, and takes focus,
205
+ * in the same tick as the mark, while the list is still out of the layout: the
206
+ * focus is dropped and the scroll it would cause never happens. So the caller
207
+ * that is about to draw the prompt opens the group first, and this marks the
208
+ * wait as already answered for, so the observer's later refresh does not open
209
+ * it again over a user who folded it.
210
+ */
211
+ reveal(): void {
212
+ this.#openedForWait = true;
213
+ this.setOpen(true);
214
+ }
215
+
216
+ /**
217
+ * The row's note for a running sub-agent, naming it, or `null` when no step
218
+ * is delegating right now. Only a step that is itself still running counts.
219
+ */
220
+ #delegation(): string | null {
221
+ for (const { element } of this.#steps) {
222
+ const panel =
223
+ element.getAttribute("data-status") === TOOL_CALL_STATUS.PENDING
224
+ ? element.querySelector(RUNNING_SUBAGENT)
225
+ : null;
226
+ if (panel !== null) {
227
+ const agent = panel.getAttribute("data-agent");
228
+ return agent === null
229
+ ? this.#strings.subAgentWorking
230
+ : fillUiString(this.#strings.subAgentDelegatedTo, { agent });
231
+ }
232
+ }
233
+ return null;
234
+ }
235
+
236
+ /** Redraw the row from the cards, for a change the cards do not announce. */
237
+ refresh(): void {
238
+ const strings = this.#strings;
239
+ const steps = this.#steps;
240
+ const statuses = steps.map((step) => step.element.getAttribute("data-status") ?? "");
241
+ const open = steps.filter((_, i) => OPEN_STATUSES.has(statuses[i] as string));
242
+ const count = (status: string): number => statuses.filter((s) => s === status).length;
243
+ const failed = count(TOOL_CALL_STATUS.ERROR);
244
+ const declined = count(TOOL_CALL_STATUS.DECLINED);
245
+ const deferred = count(TOOL_CALL_STATUS.DEFERRED);
246
+ // A step is waiting on the user when its approval is pending on the server,
247
+ // or when a question or confirmation is open on it. The second kind keeps
248
+ // its status at running, so it is read off its own flag.
249
+ const asking = steps.filter((step) => step.element.hasAttribute("data-asking")).length;
250
+ const waiting = deferred + asking;
251
+ const total = steps.length;
252
+
253
+ // Opens for a deferred step only. An approval renders inside its card, which
254
+ // a folded group would hide; a question or confirmation renders beside the
255
+ // group, in view, so there is nothing for it to open.
256
+ if (deferred > 0 && !this.#openedForWait) {
257
+ this.#openedForWait = true;
258
+ this.setOpen(true);
259
+ } else if (deferred === 0) {
260
+ this.#openedForWait = false;
261
+ }
262
+
263
+ let state: GroupState = "done";
264
+ if (waiting > 0) {
265
+ state = "waiting";
266
+ } else if (open.length > 0) {
267
+ state = "running";
268
+ } else if (failed > 0) {
269
+ state = "error";
270
+ }
271
+ this.element.setAttribute("data-state", state);
272
+ // The state is also a part, because `::part()` takes no attribute selector;
273
+ // the whole list is rewritten so the old modifier goes.
274
+ this.element.setAttribute("part", `tool-group tool-group-${state}`);
275
+ this.element.setAttribute("data-count", String(total));
276
+
277
+ const only = total === 1 ? steps[0] : undefined;
278
+ this.#setExpandable(only === undefined || hasDetails(only.element, this.#display()));
279
+ if (only !== undefined) {
280
+ this.#label.textContent = only.label;
281
+ } else {
282
+ const template =
283
+ state === "waiting"
284
+ ? strings.toolGroupSteps
285
+ : state === "running"
286
+ ? strings.toolGroupWorking
287
+ : strings.toolGroupWorked;
288
+ this.#label.textContent = fillUiString(template, { count: total });
289
+ }
290
+
291
+ const notes: string[] = [];
292
+ const delegation = this.#delegation();
293
+ const current = open[0];
294
+ if (waiting > 0) {
295
+ notes.push(fillUiString(strings.toolGroupWaiting, { count: waiting }));
296
+ } else if (delegation !== null) {
297
+ notes.push(delegation);
298
+ } else if (current !== undefined && total > 1) {
299
+ notes.push(current.label);
300
+ }
301
+ if (failed > 0) {
302
+ notes.push(fillUiString(strings.toolGroupFailed, { count: failed }));
303
+ }
304
+ if (declined > 0) {
305
+ notes.push(fillUiString(strings.toolGroupDeclined, { count: declined }));
306
+ }
307
+ this.#meta.replaceChildren(
308
+ ...notes.map((text) => {
309
+ const note = document.createElement("span");
310
+ note.className = "tool-group-note";
311
+ note.textContent = text;
312
+ return note;
313
+ }),
314
+ );
315
+ this.#meta.hidden = notes.length === 0;
316
+ }
317
+ }