@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,70 @@
1
+ // The one shape every placement takes on a phone-sized viewport.
2
+ export const SMALL_VIEWPORT_STYLES: string = `
3
+ /* Small viewports: one shape, reached from whichever placement the host chose.
4
+
5
+ A phone is not an eighth placement, it is an override that collapses the
6
+ others onto one of them. The host picked a placement for the desktop it was
7
+ designing; a 380x560 panel with a 24px margin is not a smaller version of
8
+ that decision, it is most of the screen with a frame drawn round it.
9
+
10
+ The breakpoint is a literal because a custom property cannot be read in a
11
+ media query -- which is exactly why there is an opt-out. Everything the block
12
+ sets is a token a host can re-state, but the *trigger* is unreachable, so a
13
+ host whose layout wants a different threshold, or none, sets
14
+ data-small-viewport="off" and keeps its desktop shape at every width. 600px is above every common phone in portrait and below every
15
+ tablet in landscape, and it is a width rather than a pointer test on purpose:
16
+ a touch laptop is coarse-pointered and wide, a narrow desktop window is
17
+ fine-pointered and small, and conflating the two gets both wrong. What the
18
+ pointer decides is which controls make sense, further down.
19
+
20
+ The size the user dragged is deliberately not read here. The desktop
21
+ placements read it before the host token, and this block restates the sizes
22
+ without it, so a persisted or freshly dragged size cannot change the shape
23
+ of a phone, and a window narrowed after a drag goes full-bleed.
24
+
25
+ Two placements are left alone. "page" is already this shape. "embedded" sits
26
+ in a box the host sized and placed, and taking that over would break the app
27
+ shell it was embedded into -- the host is the only party that knows whether
28
+ its column should become the whole screen. */
29
+ @media (max-width: 600px) {
30
+ :host([placement="floating"]:not([data-small-viewport="off"])),
31
+ :host([placement="bottom-left"]:not([data-small-viewport="off"])),
32
+ :host([placement="sidebar"]:not([data-small-viewport="off"])),
33
+ :host([placement="side"]:not([data-small-viewport="off"])),
34
+ :host(:not([placement]):not([data-small-viewport="off"])),
35
+ :host([placement=""]:not([data-small-viewport="off"])) {
36
+ --_inset: var(
37
+ --ag-ui-inset,
38
+ calc(var(--_viewport-inset-top) + var(--_keyboard-inset-top)) var(--_viewport-inset-right)
39
+ calc(var(--_viewport-inset-bottom) + var(--_keyboard-inset))
40
+ var(--_viewport-inset-left)
41
+ );
42
+ --_width: var(--ag-ui-width, var(--_viewport-width));
43
+ --_height: var(--ag-ui-height, var(--_viewport-height));
44
+ --_max-width: var(--ag-ui-max-width, var(--_viewport-width));
45
+ --_max-height: var(--ag-ui-max-height, var(--_viewport-height));
46
+ --_panel-radius: var(--ag-ui-panel-radius, 0);
47
+ --_shadow: var(--ag-ui-shadow, none);
48
+ }
49
+
50
+ /* Nothing to resize once the panel is the screen, and the grips would sit
51
+ under the thumbs holding the phone. */
52
+ :host([placement="floating"]:not([data-small-viewport="off"])) .resize-handle,
53
+ :host([placement="bottom-left"]:not([data-small-viewport="off"])) .resize-handle,
54
+ :host([placement="sidebar"]:not([data-small-viewport="off"])) .resize-handle,
55
+ :host([placement="side"]:not([data-small-viewport="off"])) .resize-handle,
56
+ :host(:not([placement]):not([data-small-viewport="off"])) .resize-handle,
57
+ :host([placement=""]:not([data-small-viewport="off"])) .resize-handle {
58
+ display: none;
59
+ }
60
+
61
+ /* The bottom bar shows only while collapsed. With the panel open the panel
62
+ is the screen, its header's minimise control is the way back, and a
63
+ second strip fixed to the bottom edge would sit under the keyboard while
64
+ the composer has focus. Hidden by display, so the bar measures 0 and the
65
+ host's padding goes with it. */
66
+ :host([data-collapsed-to="bar"]:not([collapsed]):not([data-small-viewport="off"])) .dock-bar {
67
+ display: none;
68
+ }
69
+ }
70
+ `;
@@ -0,0 +1,183 @@
1
+ import type { ResizeAxis } from "./resize_handle.js";
2
+
3
+ /**
4
+ * What a collapsed panel shrinks to, stamped on the element as
5
+ * data-collapsed-to so the stylesheet draws it.
6
+ *
7
+ * - `launcher` -- the round button in a corner.
8
+ * - `rail` -- the slim full-height edge the sidebar docks against; the same
9
+ * launcher element, shaped by the stylesheet.
10
+ * - `header` -- the in-flow collapse: the body hides and the header bar stays
11
+ * in the host's layout, so there is no launcher at all.
12
+ * - `bar` -- `collapse-to="bar"` over a placement that would otherwise
13
+ * collapse to `launcher`: a strip along the bottom edge, the panel rising
14
+ * from its right end.
15
+ * - `none` -- `collapse-to="none"` over any collapsible placement: collapsed
16
+ * is hidden, and the host's own control brings the panel back.
17
+ * - `null` -- no collapsed state. `page` is a dedicated route rather than a
18
+ * panel on someone else's page, so there is no "away" for it to go to:
19
+ * collapsing it left a strip of application chrome fixed over a route with
20
+ * no owner, and it hides the launcher, so the usual way back did not exist.
21
+ * The header drops its collapse control here, but a control removed from
22
+ * the UI is not a state removed from the model: the property, the attribute
23
+ * and a value restored from storage all still reach it, so every one of
24
+ * those paths asks this record; the stylesheet covers the one path that
25
+ * never does, an attribute written straight onto the element.
26
+ */
27
+ export type CollapseTarget = "launcher" | "rail" | "header" | "bar" | "none" | null;
28
+
29
+ /**
30
+ * Everything the script needs to know about one display surface, in one
31
+ * record, so a placement's behaviour is read in one place rather than
32
+ * assembled from a table per question.
33
+ *
34
+ * The stylesheet still carries each surface's look (one module per placement
35
+ * under this directory); this is the part of a surface that code decides.
36
+ */
37
+ export interface Surface {
38
+ /** What collapsing shrinks the panel to; `null` when it cannot collapse. */
39
+ readonly collapseTo: CollapseTarget;
40
+ /**
41
+ * Whether a gesture may move the launcher. The rest have nowhere to put it:
42
+ * the rail is a docked edge, `header` and `null` have no launcher, a
43
+ * full-bleed panel covers the screen it would be opening into, and the bar
44
+ * and the host's own control are not a launcher at all.
45
+ */
46
+ readonly launcherDraggable: boolean;
47
+ /**
48
+ * Whether the header drag and `moveTo` may move the open panel. The same
49
+ * answer as {@link launcherDraggable} for every placement on its own; the two
50
+ * part under `collapse-to="bar"` and `"none"`, where a corner panel still
51
+ * moves like one but has no launcher left to drag.
52
+ */
53
+ readonly panelMovable: boolean;
54
+ /**
55
+ * Which axes the resize grips may change. A full-bleed layout is the whole
56
+ * viewport by definition and cannot be resized; a docked panel owns its
57
+ * height, leaving only its inner edge.
58
+ */
59
+ readonly resizeAxis: ResizeAxis;
60
+ /**
61
+ * Whether a first mount with nothing stored starts collapsed. Only the
62
+ * corner placements do: a launcher is the resting state of every corner chat
63
+ * in the field, and mounting open put a 380x560 panel over the host page's
64
+ * corner on a visitor's first load, uninvited. The placements that place
65
+ * themselves start open -- a host that docks a sidebar has already decided
66
+ * the widget belongs on screen, and one that embeds it has given it a box.
67
+ *
68
+ * Separate from {@link launcherDraggable} although the two agree today:
69
+ * "has a launcher to rest on" and "the launcher can be moved" are different
70
+ * questions, and a surface with a fixed launcher would answer them apart.
71
+ */
72
+ readonly startsCollapsed: boolean;
73
+ /**
74
+ * What the header's maximize control grows: both axes for a corner or docked
75
+ * panel, the width for a side column, and `null` where there is no control
76
+ * (a surface that already fills its box, or that the host sized).
77
+ */
78
+ readonly maximizes: "both" | "width" | null;
79
+ }
80
+
81
+ const CORNER: Surface = {
82
+ collapseTo: "launcher",
83
+ launcherDraggable: true,
84
+ panelMovable: true,
85
+ resizeAxis: "both",
86
+ startsCollapsed: true,
87
+ maximizes: "both",
88
+ };
89
+
90
+ const DOCKED: Surface = {
91
+ collapseTo: "launcher",
92
+ launcherDraggable: false,
93
+ panelMovable: false,
94
+ resizeAxis: "width",
95
+ startsCollapsed: false,
96
+ maximizes: "width",
97
+ };
98
+
99
+ /**
100
+ * One record per `placement` value. Absent (`null`) and empty are the default
101
+ * floating corner, as the stylesheet treats them.
102
+ */
103
+ const SURFACES: ReadonlyMap<string | null, Surface> = new Map<string | null, Surface>([
104
+ [null, CORNER],
105
+ ["", CORNER],
106
+ ["floating", CORNER],
107
+ ["bottom-left", CORNER],
108
+ ["side", DOCKED],
109
+ ["sidebar", { ...DOCKED, collapseTo: "rail" }],
110
+ [
111
+ "full",
112
+ {
113
+ collapseTo: "launcher",
114
+ launcherDraggable: false,
115
+ panelMovable: false,
116
+ resizeAxis: "none",
117
+ startsCollapsed: false,
118
+ maximizes: null,
119
+ },
120
+ ],
121
+ [
122
+ "page",
123
+ {
124
+ collapseTo: null,
125
+ launcherDraggable: false,
126
+ panelMovable: false,
127
+ resizeAxis: "none",
128
+ startsCollapsed: false,
129
+ maximizes: null,
130
+ },
131
+ ],
132
+ [
133
+ "embedded",
134
+ {
135
+ collapseTo: "header",
136
+ launcherDraggable: false,
137
+ panelMovable: false,
138
+ resizeAxis: "both",
139
+ startsCollapsed: false,
140
+ maximizes: null,
141
+ },
142
+ ],
143
+ ]);
144
+
145
+ /**
146
+ * A value no record names. The stylesheet lays it out as the default corner,
147
+ * but the script has never treated an unknown value as one: its launcher stays
148
+ * put and it mounts open, so a typo in a host's markup does not start moving
149
+ * or hiding a panel the host meant to show.
150
+ */
151
+ const UNKNOWN: Surface = {
152
+ collapseTo: "launcher",
153
+ launcherDraggable: false,
154
+ panelMovable: false,
155
+ resizeAxis: "both",
156
+ startsCollapsed: false,
157
+ maximizes: null,
158
+ };
159
+
160
+ /**
161
+ * The surface `placement` and `collapse-to` describe together. Read per
162
+ * interaction by every caller, because both are live attributes.
163
+ *
164
+ * `collapse-to` only ever replaces the round launcher or the whole collapsed
165
+ * state, never a placement's own shape: `bar` applies where the placement
166
+ * collapses to `launcher`, so the sidebar keeps its rail and an embedded chat
167
+ * its header bar, and `none` applies to every collapsible placement. Absent,
168
+ * `auto` and any other value leave the placement as it was. Both turn the
169
+ * launcher drag off, because there is no launcher left to drag, and keep the
170
+ * placement's own answer for moving the panel: a corner panel rises from the
171
+ * bar or the anchor until the user drags it somewhere else, and a placement
172
+ * that owns its position keeps owning it.
173
+ */
174
+ export function surfaceFor(placement: string | null, collapseTo: string | null = null): Surface {
175
+ const surface = SURFACES.get(placement) ?? UNKNOWN;
176
+ if (collapseTo === "bar" && surface.collapseTo === "launcher") {
177
+ return { ...surface, collapseTo: "bar", launcherDraggable: false };
178
+ }
179
+ if (collapseTo === "none" && surface.collapseTo !== null) {
180
+ return { ...surface, collapseTo: "none", launcherDraggable: false };
181
+ }
182
+ return surface;
183
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Prettify a raw tool name for display: separators become spaces and the
3
+ * first letter is capitalised — `list_projects` → "List projects",
4
+ * `invoices.retrieve` → "Invoices retrieve".
5
+ *
6
+ * Final fallback of the tool-card label chain (`x-summary` →
7
+ * `toolSummaries` → fetched catalog → this). Purely cosmetic: the original
8
+ * name still rides on the card's dataset for debugging.
9
+ */
10
+ export function prettifyToolName(name: string): string {
11
+ const spaced = name.replace(/[._-]+/g, " ").trim();
12
+ if (spaced === "") {
13
+ return name;
14
+ }
15
+ return spaced.charAt(0).toUpperCase() + spaced.slice(1);
16
+ }
@@ -0,0 +1,67 @@
1
+ import { ANNOUNCE_CLEAR_MS } from "../../constants.js";
2
+
3
+ /**
4
+ * The screen-reader-only status region, and the one short thing it says at a
5
+ * time about how a run is going.
6
+ *
7
+ * The transcript cannot do this job. It is rewritten on every animation frame
8
+ * while an answer streams, so as a live region it re-announced the whole
9
+ * answer tens of times per turn -- not merely unhelpful but actively hostile.
10
+ * The published fix for this exact bug (Microsoft's Bot Framework WebChat
11
+ * #3236) is architectural rather than a matter of tuning attributes: demote the
12
+ * visible transcript out of live-region duty and put one synthesised status per
13
+ * event into a separate invisible region. MDN and Scott O'Hara prescribe the
14
+ * same empty-region-then-inject shape.
15
+ *
16
+ * Roughly four calls land per turn -- responding, answered, a card is waiting,
17
+ * stopped or failed -- so the user is told what happened and reads the answer
18
+ * itself by navigating the log, at their own pace, rather than having it
19
+ * shouted at them a token at a time.
20
+ *
21
+ * Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
22
+ * instance. The element places {@link region} in its shadow root.
23
+ */
24
+ export class RunAnnouncer {
25
+ /** The invisible `role="status"` region the statuses are written into. */
26
+ readonly region = document.createElement("div");
27
+ /** Pending clear of {@link region}; see {@link announce} for why it is cleared at all. */
28
+ #timer: ReturnType<typeof setTimeout> | null = null;
29
+
30
+ /** Stamp the region's live-region semantics, before the element places it. */
31
+ mount(): void {
32
+ this.region.className = "sr-only";
33
+ this.region.setAttribute("role", "status");
34
+ this.region.setAttribute("aria-live", "polite");
35
+ // Atomic: each announcement replaces the last and is read whole. Without
36
+ // it a reader may announce only the changed words between two statuses.
37
+ this.region.setAttribute("aria-atomic", "true");
38
+ }
39
+
40
+ /**
41
+ * Say one short thing to a screen reader, without touching the transcript.
42
+ *
43
+ * **The clear is load-bearing, twice.** A reader announces a live region when
44
+ * its content *changes*, so setting the same string twice running -- two turns
45
+ * in a row both starting -- is not a change and is silently not announced.
46
+ * Emptying first makes the next set a change again. It also stops a stale
47
+ * status being read out when a reader later lands on the region.
48
+ */
49
+ announce(message: string): void {
50
+ if (this.#timer !== null) {
51
+ clearTimeout(this.#timer);
52
+ }
53
+ this.region.textContent = message;
54
+ this.#timer = setTimeout(() => {
55
+ this.#timer = null;
56
+ this.region.textContent = "";
57
+ }, ANNOUNCE_CLEAR_MS);
58
+ }
59
+
60
+ /** Cancel a pending clear, so no timer outlives the element's connection. */
61
+ dispose(): void {
62
+ if (this.#timer !== null) {
63
+ clearTimeout(this.#timer);
64
+ this.#timer = null;
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,61 @@
1
+ /**
2
+ * A muted one-line notice about something the run did (history condensed, a
3
+ * skill loaded), rendered inline between turns.
4
+ *
5
+ * Distinct from a tool card, which reports work the agent asked for and
6
+ * settles, and from an error, which is a failure. A notice never settles and
7
+ * takes no action of its own.
8
+ *
9
+ * It may carry exactly one control, and only ever an undo. That is a narrower
10
+ * rule than "no controls", which is what this said until the agent could move
11
+ * the panel it speaks from: something that rearranges the user's window without
12
+ * being asked has to be both visible and reversible, and a notice is already
13
+ * the surface that says what the run did. Anything the user has to *decide* is
14
+ * a confirmation card instead -- the difference is that this reports something
15
+ * already done.
16
+ */
17
+ export function renderRunNotice(
18
+ icon: string,
19
+ text: string,
20
+ kind: string,
21
+ undo?: { readonly label: string; readonly onActivate: () => void },
22
+ ): HTMLDivElement {
23
+ const notice = document.createElement("div");
24
+ notice.className = `run-notice run-notice--${kind}`;
25
+ notice.setAttribute("part", `run-notice run-notice-${kind}`);
26
+ // status, not alert: informational, so it must not interrupt a screen reader
27
+ // mid-sentence. Polite announcements land after the current utterance.
28
+ notice.setAttribute("role", "status");
29
+
30
+ const glyph = document.createElement("span");
31
+ glyph.className = "run-notice-icon";
32
+ glyph.setAttribute("part", "run-notice-icon");
33
+ glyph.textContent = icon;
34
+ // Decorative: the adjacent text already says what happened, so announcing the
35
+ // glyph's name would only add noise.
36
+ glyph.setAttribute("aria-hidden", "true");
37
+
38
+ const label = document.createElement("span");
39
+ label.className = "run-notice-text";
40
+ label.setAttribute("part", "run-notice-text");
41
+ label.textContent = text;
42
+
43
+ notice.append(glyph, label);
44
+
45
+ if (undo !== undefined) {
46
+ const button = document.createElement("button");
47
+ button.type = "button";
48
+ button.className = "run-notice-undo";
49
+ button.setAttribute("part", "run-notice-undo");
50
+ button.textContent = undo.label;
51
+ button.addEventListener("click", () => {
52
+ // One use. The state it restores is the state as it was when the notice
53
+ // was written, so offering it twice would put back something that has
54
+ // since moved again.
55
+ button.disabled = true;
56
+ undo.onActivate();
57
+ });
58
+ notice.append(button);
59
+ }
60
+ return notice;
61
+ }
@@ -0,0 +1,52 @@
1
+ // The one-line notice a run leaves in the transcript, with its undo.
2
+ export const RUN_NOTICE_STYLES: string = `
3
+ .run-notice {
4
+ display: inline-flex;
5
+ align-items: center;
6
+ gap: 6px;
7
+ align-self: flex-start;
8
+ max-width: 100%;
9
+ margin: 2px 0;
10
+ padding: 3px 10px;
11
+ border: 1px dashed var(--_border);
12
+ border-radius: 999px;
13
+ background: transparent;
14
+ color: var(--_muted);
15
+ font-size: 0.8em;
16
+ line-height: 1.4;
17
+ }
18
+
19
+ .run-notice-icon {
20
+ flex: none;
21
+ opacity: 0.75;
22
+ }
23
+
24
+ /* The one control a notice may carry. Quiet, because it reports something
25
+ already done rather than asking for a decision. */
26
+ .run-notice-undo {
27
+ flex: 0 0 auto;
28
+ margin-inline-start: auto;
29
+ padding: 2px 8px;
30
+ border: 1px solid var(--_border);
31
+ border-radius: var(--_radius);
32
+ background: var(--_bg);
33
+ color: var(--_accent);
34
+ font: inherit;
35
+ font-size: 0.9em;
36
+ cursor: pointer;
37
+ }
38
+
39
+ .run-notice-undo:hover:not(:disabled) {
40
+ background: var(--_hover);
41
+ }
42
+
43
+ .run-notice-undo:disabled {
44
+ opacity: 0.5;
45
+ cursor: default;
46
+ }
47
+
48
+ .run-notice-text {
49
+ min-width: 0;
50
+ overflow-wrap: anywhere;
51
+ }
52
+ `;
@@ -0,0 +1,227 @@
1
+ import type { SUBAGENT_PHASE } from "../../constants.js";
2
+ import { DEFAULT_UI_STRINGS, type UiStrings } from "../ui_strings.js";
3
+
4
+ /** One phase of a delegation's life, as the server spells it. */
5
+ export type SubAgentPhase = (typeof SUBAGENT_PHASE)[keyof typeof SUBAGENT_PHASE];
6
+
7
+ /**
8
+ * One tool call the child made, as the two tool phases report it.
9
+ *
10
+ * `ok` is a tri-state and stays one here rather than collapsing to a boolean:
11
+ * `null` is the call in flight, `true` a result the child accepted, `false` a
12
+ * result that came back to it. Flattening `null` into `false` would draw a
13
+ * running call as a failed one for as long as it runs.
14
+ */
15
+ export interface SubAgentTool {
16
+ readonly toolCallId: string;
17
+ readonly name: string;
18
+ readonly ok: boolean | null;
19
+ }
20
+
21
+ /**
22
+ * One narrowed progress announcement about a delegation.
23
+ *
24
+ * Every field but `phase` and `delegationId` is nullable because the wire's
25
+ * `value` is `unknown` and a malformed announcement must not take the run down
26
+ * with it. `null` means "said nothing about this", never "said nothing was
27
+ * there" — the panel leaves what it already shows alone.
28
+ */
29
+ export interface SubAgentUpdate {
30
+ /** The **parent's** `delegate_task` tool-call id, not the child's run id. */
31
+ readonly delegationId: string;
32
+ /** The child agent's name, for a host that wants to style or select by it. */
33
+ readonly agent: string | null;
34
+ readonly phase: SubAgentPhase;
35
+ /** The server's pre-rendered line. The collapsed row needs nothing else. */
36
+ readonly status: string | null;
37
+ /** Present on the two tool phases only. */
38
+ readonly tool: SubAgentTool | null;
39
+ }
40
+
41
+ /**
42
+ * The nested surface for one delegation: a collapsed status row that expands
43
+ * onto the child agent's own tool calls.
44
+ *
45
+ * ## Where it goes and why
46
+ *
47
+ * Into {@link ToolCallCard.subagentSlot} — the card the parent's own
48
+ * `delegate_task` call already drew. The wire keys progress on the *parent's*
49
+ * tool-call id, so the thing being narrated is already on screen; a floating
50
+ * element would have duplicated its identity and then had to explain the
51
+ * relationship. Attaching instead means the delegation reuses how tool cards
52
+ * already behave, and there is no second visual language to learn.
53
+ *
54
+ * ## The shape
55
+ *
56
+ * One row per delegation, live, carrying nothing but the server's own `status`
57
+ * line — which is what makes a ten-step child cost one row until somebody opens
58
+ * it. Two alternatives were rejected on the way here and both are worth naming:
59
+ * a bare status line is cheaper and gives up the detail entirely, and inline
60
+ * child cards in the transcript interleave parent and child with nothing marking
61
+ * whose is whose, in an order the persisted transcript will not reproduce.
62
+ *
63
+ * A child's steps are keyed by the child's own `toolCallId`, so the `tool_call`
64
+ * that opens one and the `tool_result` that settles it are the same row updated
65
+ * in place rather than two rows stacked.
66
+ *
67
+ * ## What it never does
68
+ *
69
+ * It never renders failure text. A `failed` phase carries none, on purpose; the
70
+ * detail arrives on the ordinary `TOOL_CALL_RESULT` and lands in the same card's
71
+ * result region, a few pixels below. Anything invented here would be this
72
+ * component guessing at words the server declined to send.
73
+ *
74
+ * Nothing here is persisted: the events ride the imperative carrier, so a thread
75
+ * restore rebuilds the tool card and not the delegation under it.
76
+ *
77
+ * Pure DOM, like the other widgets: the host appends {@link element}, and all
78
+ * chrome text comes from {@link UiStrings}. The status line is server text and
79
+ * is set with `textContent`, never parsed as markup.
80
+ */
81
+ export class SubAgentPanel {
82
+ /** The panel's root; append this into the delegating card's slot. */
83
+ readonly element: HTMLDivElement;
84
+
85
+ /**
86
+ * The child agent's name, as the last update that carried one gave it.
87
+ *
88
+ * Read back rather than only written to the DOM, because the two carriers
89
+ * split the name away from the close: `SUBAGENT_STARTED` names the agent and
90
+ * `SUBAGENT_FINISHED` carries only an id, so whoever words the closing line
91
+ * has to recover the name from what the delegation already told it.
92
+ */
93
+ get agent(): string | null {
94
+ return this.#agent;
95
+ }
96
+
97
+ /**
98
+ * The collapsed row, which is the expander as well as the status.
99
+ *
100
+ * Disabled while the child has called nothing, so a delegation that failed
101
+ * before it started offers no control that expands onto an empty region —
102
+ * the same refusal the card's own Details toggle already makes.
103
+ */
104
+ readonly #row: HTMLButtonElement;
105
+ readonly #status: HTMLSpanElement;
106
+ readonly #steps: HTMLDivElement;
107
+ /** The child's tool calls, keyed by the child's own call id. */
108
+ readonly #stepRows = new Map<string, HTMLDivElement>();
109
+ #agent: string | null = null;
110
+
111
+ constructor(strings: UiStrings = DEFAULT_UI_STRINGS) {
112
+ this.element = document.createElement("div");
113
+ this.element.className = "subagent";
114
+ this.element.setAttribute("part", "subagent");
115
+
116
+ this.#row = document.createElement("button");
117
+ this.#row.type = "button";
118
+ this.#row.className = "subagent-row";
119
+ this.#row.setAttribute("part", "subagent-row");
120
+ this.#row.setAttribute("aria-expanded", "false");
121
+ this.#row.disabled = true;
122
+
123
+ // Left empty in the DOM, like the tool card's: the shadow CSS draws a
124
+ // spinner or a settled mark from the panel's data-phase, so a host themes
125
+ // the glyph without either side reaching into the other's stylesheet.
126
+ const icon = document.createElement("span");
127
+ icon.className = "subagent-icon";
128
+ icon.setAttribute("part", "subagent-icon");
129
+ icon.setAttribute("aria-hidden", "true");
130
+
131
+ this.#status = document.createElement("span");
132
+ this.#status.className = "subagent-status";
133
+ this.#status.setAttribute("part", "subagent-status");
134
+ // Seeded rather than left blank: an announcement whose status field is
135
+ // unusable must still leave a readable row, since the row is the control.
136
+ this.#status.textContent = strings.subAgentWorking;
137
+
138
+ this.#row.append(icon, this.#status);
139
+
140
+ this.#steps = document.createElement("div");
141
+ this.#steps.className = "subagent-steps";
142
+ this.#steps.setAttribute("part", "subagent-steps");
143
+ this.#steps.setAttribute("role", "list");
144
+ this.#steps.setAttribute("aria-label", strings.subAgentSteps);
145
+ this.#steps.hidden = true;
146
+
147
+ // The attribute is the state, as it is on the tool card: one place holds
148
+ // whether the region is open, and it is the one a screen reader reads.
149
+ this.#row.addEventListener("click", () => {
150
+ this.#setExpanded(this.#row.getAttribute("aria-expanded") !== "true");
151
+ });
152
+
153
+ this.element.append(this.#row, this.#steps);
154
+ }
155
+
156
+ /**
157
+ * Fold one announcement in.
158
+ *
159
+ * Every field is applied only when the update actually carried it, so a phase
160
+ * that says nothing about the agent or the status leaves both as they stand.
161
+ * That is what lets `finished` be two keys wide on the wire without blanking
162
+ * the row it closes.
163
+ */
164
+ report(update: SubAgentUpdate): void {
165
+ this.element.setAttribute("data-phase", update.phase);
166
+ if (update.agent !== null) {
167
+ this.#agent = update.agent;
168
+ this.element.setAttribute("data-agent", update.agent);
169
+ }
170
+ if (update.status !== null) {
171
+ this.#status.textContent = update.status;
172
+ }
173
+ if (update.tool !== null) {
174
+ this.#recordStep(update.tool);
175
+ }
176
+ }
177
+
178
+ /**
179
+ * Open or settle one of the child's calls, keyed by its own id.
180
+ *
181
+ * The absence of `data-ok` is what "still running" looks like, mirroring the
182
+ * wire's `null` rather than inventing a third value for it — so the attribute
183
+ * is removed on the way in and written on the way out.
184
+ */
185
+ #recordStep(tool: SubAgentTool): void {
186
+ const row = this.#stepRows.get(tool.toolCallId) ?? this.#createStep(tool);
187
+ if (tool.ok === null) {
188
+ row.removeAttribute("data-ok");
189
+ return;
190
+ }
191
+ row.setAttribute("data-ok", String(tool.ok));
192
+ }
193
+
194
+ #createStep(tool: SubAgentTool): HTMLDivElement {
195
+ const row = document.createElement("div");
196
+ row.className = "subagent-step";
197
+ row.setAttribute("part", "subagent-step");
198
+ row.setAttribute("role", "listitem");
199
+ row.setAttribute("data-tool-call-id", tool.toolCallId);
200
+
201
+ const icon = document.createElement("span");
202
+ icon.className = "subagent-step-icon";
203
+ icon.setAttribute("part", "subagent-step-icon");
204
+ icon.setAttribute("aria-hidden", "true");
205
+
206
+ const name = document.createElement("span");
207
+ name.className = "subagent-step-name";
208
+ name.setAttribute("part", "subagent-step-name");
209
+ // The child's raw tool name. Not prettified and not looked up in the tool
210
+ // catalog: a sub-agent's tools are its own and never reached the browser's
211
+ // schema, and the status line above quotes the same raw name, so relabelling
212
+ // here would make the two lines disagree about one call.
213
+ name.textContent = tool.name;
214
+
215
+ row.append(icon, name);
216
+ this.#steps.appendChild(row);
217
+ this.#stepRows.set(tool.toolCallId, row);
218
+ // There is something behind the row now, so it becomes a control.
219
+ this.#row.disabled = false;
220
+ return row;
221
+ }
222
+
223
+ #setExpanded(expanded: boolean): void {
224
+ this.#steps.hidden = !expanded;
225
+ this.#row.setAttribute("aria-expanded", String(expanded));
226
+ }
227
+ }