@artooi/agents-web-components 0.0.0-stage → 0.1.1

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 +77 -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,14 @@
1
+ /**
2
+ * The host selectors theme rules hang off, as one record so every theme
3
+ * module spells them the same way.
4
+ *
5
+ * Classic and code keep today's structure, so the structural rules the newer
6
+ * themes share apply to every element that wears neither. Quiet is the
7
+ * default, so its own structure applies to every element that wears no other
8
+ * built-in theme -- including one whose theme is a word the library does not
9
+ * know, which is how a host's own named theme starts from Quiet.
10
+ */
11
+ export const THEME_HOST = {
12
+ modern: ':host(:not([theme~="classic"], [theme~="code"]))',
13
+ quiet: ':host(:not([theme~="classic"], [theme~="code"], [theme~="soft"], [theme~="ledger"]))',
14
+ } as const;
@@ -0,0 +1,165 @@
1
+ import { FEEDBACK_EVENT, ICON_RETRY, MESSAGE_ACTIONS } from "../../constants.js";
2
+ import type { AgUiMessageIds } from "../../core/agui_client.js";
3
+ import type { FeedbackDetail } from "../../core/events/feedback_detail.js";
4
+ import { commaTokens } from "../../core/utils.js";
5
+ import { copyPayload } from "../excerpts/copy_payload.js";
6
+ import type { UiStrings } from "../ui_strings.js";
7
+ import { attachMessageActions, messageActionBar, messageActionButton } from "./message_actions.js";
8
+
9
+ /** What the answer actions need from the element that owns them. */
10
+ export interface AnswerActionsHost {
11
+ /** The custom element: its `data-message-actions`, and where feedback is dispatched. */
12
+ readonly element: HTMLElement;
13
+ /** The resolved string table. */
14
+ readonly strings: () => UiStrings;
15
+ /** Retry the last turn, as the element's public `retryLastTurn` does. */
16
+ readonly retry: () => void;
17
+ /** The element's current conversation thread. */
18
+ readonly threadId: () => string;
19
+ /** Follow the transcript's foot, as every site that adds to it does. */
20
+ readonly follow: () => void;
21
+ }
22
+
23
+ /** A finished bubble that is not an answer, and so carries no rating. */
24
+ interface Unrateable {
25
+ readonly rateable: false;
26
+ }
27
+
28
+ /**
29
+ * The action row under a finished answer -- copy, retry, feedback -- and the
30
+ * one row currently holding Retry.
31
+ *
32
+ * Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
33
+ * instance.
34
+ */
35
+ export class AnswerActions {
36
+ readonly #host: AnswerActionsHost;
37
+ /**
38
+ * The one action row currently carrying Retry, if any.
39
+ *
40
+ * Retry belongs to the **last** turn only: re-running an older one is
41
+ * branching, and a page-driving agent's past turns clicked buttons that a
42
+ * re-run does not undo. One owner keeps exactly one offer on screen.
43
+ */
44
+ #retryOwner: HTMLElement | null = null;
45
+
46
+ constructor(host: AnswerActionsHost) {
47
+ this.#host = host;
48
+ }
49
+
50
+ /** Forget the row holding Retry, with the transcript it was in. */
51
+ forget(): void {
52
+ this.#retryOwner = null;
53
+ }
54
+
55
+ /**
56
+ * Give a finished assistant bubble its action row, and hand it Retry.
57
+ *
58
+ * Every finished bubble gets copy and feedback -- both are safe on a message
59
+ * of any age. Retry moves to the newest, because it is the only one where
60
+ * re-running answers the same question rather than rewriting history.
61
+ *
62
+ * `data-message-actions` subtracts from that. The row is built only when
63
+ * something survives to go in it: an empty row still takes its margin, still
64
+ * answers to the `message-actions` part, and still reads to a screen reader
65
+ * as a group of actions with none in it.
66
+ *
67
+ * `message` names the answer, which is what a rating is filed under; a bubble
68
+ * that is not an answer says so instead, and has no id to give.
69
+ */
70
+ attach(bubble: HTMLDivElement, message: AgUiMessageIds | Unrateable): void {
71
+ const enabled = this.#enabled();
72
+ const copyable = enabled.has(MESSAGE_ACTIONS.COPY);
73
+ // A failed run is copyable -- error text is what people paste into a bug
74
+ // report -- but not rateable: a rating is a statement about an *answer*,
75
+ // and mixing "the connection dropped" into that signal makes the host's
76
+ // feedback data say less than it did before.
77
+ const answer = "messageId" in message ? message : null;
78
+ const rateable = answer !== null && enabled.has(MESSAGE_ACTIONS.FEEDBACK);
79
+ // Read now, not at click time: the thread the message was drawn in is the
80
+ // one it is stored under, even if a later path kept bubbles across threads.
81
+ const threadId = this.#host.threadId();
82
+ if (copyable || rateable) {
83
+ attachMessageActions(bubble, {
84
+ strings: this.#host.strings(),
85
+ // Read at click time, not captured: a bubble rendered from markdown
86
+ // holds its text in the DOM, and that is what the user sees and means
87
+ // to copy. Serialised rather than read off `textContent`, which welds
88
+ // a table into one run of digits and picks up the code blocks' own
89
+ // copy buttons on the way past.
90
+ ...(copyable
91
+ ? {
92
+ text: () => copyPayload(bubble).text,
93
+ html: () => copyPayload(bubble).html,
94
+ }
95
+ : {}),
96
+ ...(rateable
97
+ ? {
98
+ onFeedback: (rating: "up" | "down") => {
99
+ this.#host.element.dispatchEvent(
100
+ new CustomEvent<FeedbackDetail>(FEEDBACK_EVENT, {
101
+ detail: {
102
+ content: copyPayload(bubble).text,
103
+ rating,
104
+ messageId: answer.messageId,
105
+ threadId,
106
+ // Omitted rather than undefined: a restored message has
107
+ // no run, and a key holding nothing reads as one that
108
+ // was looked up and came back empty.
109
+ ...(answer.runId === undefined ? {} : { runId: answer.runId }),
110
+ },
111
+ bubbles: true,
112
+ composed: true,
113
+ }),
114
+ );
115
+ },
116
+ }
117
+ : {}),
118
+ });
119
+ }
120
+ if (enabled.has(MESSAGE_ACTIONS.RETRY)) {
121
+ this.#moveRetryTo(messageActionBar(bubble, this.#host.strings()));
122
+ }
123
+ // The row is insertion too: without this a pinned transcript rests one row short of its foot.
124
+ this.#host.follow();
125
+ }
126
+
127
+ /** Move the Retry button onto `bar`, taking it off whoever held it. */
128
+ #moveRetryTo(bar: HTMLElement): void {
129
+ this.#retryOwner?.querySelector(".message-action--retry")?.remove();
130
+ const retry = messageActionButton("retry", this.#host.strings().retryMessage, ICON_RETRY);
131
+ retry.addEventListener("click", () => {
132
+ this.#host.retry();
133
+ });
134
+ // First in the row: it is the action a reader reaches for when the answer
135
+ // was wrong, which is when they are least inclined to hunt for a control.
136
+ bar.prepend(retry);
137
+ this.#retryOwner = bar;
138
+ }
139
+
140
+ /**
141
+ * Which message actions a finished bubble offers, from
142
+ * `data-message-actions`.
143
+ *
144
+ * **Absent means copy and retry, not all three.** Those two work with nothing
145
+ * wired: copy reads the DOM, retry drives this element. The rating pair does
146
+ * not -- it fires `ag-ui-feedback` and stores nothing by design, because a
147
+ * rating belongs to whatever the host already uses for product signal. With no
148
+ * listener the buttons still latch `aria-pressed`, so a reader is told their
149
+ * rating was taken and a screen reader announces it, while nothing recorded
150
+ * anything. This README has always said two buttons that lead nowhere are
151
+ * worse than none; shipping them by default was that sentence being false.
152
+ *
153
+ * A host with a listener asks for them: `data-message-actions="copy,retry,feedback"`.
154
+ * A value names the survivors, which makes `data-message-actions="false"` --
155
+ * the spelling its sibling `data-quote-selection` uses -- an empty set by
156
+ * falling out of the same rule rather than by a case of its own.
157
+ */
158
+ #enabled(): ReadonlySet<string> {
159
+ const attr = this.#host.element.getAttribute("data-message-actions");
160
+ if (attr === null) {
161
+ return new Set([MESSAGE_ACTIONS.COPY, MESSAGE_ACTIONS.RETRY]);
162
+ }
163
+ return new Set(commaTokens(attr));
164
+ }
165
+ }
@@ -0,0 +1,123 @@
1
+ import { renderMarkdown } from "./render_markdown.js";
2
+
3
+ /** What the streamed answer needs from the element that owns it. */
4
+ export interface AnswerStreamHost {
5
+ /** Append an empty assistant bubble to the transcript, and return it. */
6
+ readonly openBubble: () => HTMLDivElement;
7
+ /** The element's `allowImages`, read per render. */
8
+ readonly allowImages: () => boolean;
9
+ /** Keep the transcript at its foot, if the reader is there. */
10
+ readonly follow: () => void;
11
+ }
12
+
13
+ /**
14
+ * The assistant answer currently streaming: the bubble it streams into, the
15
+ * text the next frame will draw, and how many deltas it arrived in.
16
+ *
17
+ * Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
18
+ * instance.
19
+ */
20
+ export class AnswerStream {
21
+ readonly #host: AnswerStreamHost;
22
+ #streamingBubble: HTMLDivElement | null = null;
23
+ // Text deltas applied to the current streaming bubble. >1 ⇒ the message
24
+ // revealed progressively as it streamed, so the word reveal must not re-animate
25
+ // it; ≤1 ⇒ it arrived at once and the word reveal is appropriate.
26
+ #streamDeltas = 0;
27
+ // The accumulated answer the next render will draw. Deltas overwrite it
28
+ // (each one carries the whole answer), so a frame always draws the latest.
29
+ #streamBuffer = "";
30
+ // The frame that render is queued on, or `null` when nothing is queued —
31
+ // also the flag saying a delta is still undrawn.
32
+ #streamFrame: number | null = null;
33
+
34
+ constructor(host: AnswerStreamHost) {
35
+ this.#host = host;
36
+ }
37
+
38
+ /** Text deltas the current answer has arrived in so far. */
39
+ get deltas(): number {
40
+ return this.#streamDeltas;
41
+ }
42
+
43
+ /**
44
+ * Count one delta received. Counted per delta received, not per render: the
45
+ * word reveal asks whether the answer *arrived* progressively, which
46
+ * coalescing renders must not change the answer to.
47
+ */
48
+ countDelta(): void {
49
+ this.#streamDeltas += 1;
50
+ }
51
+
52
+ /**
53
+ * Queue a render of the answer so far, at most one per frame.
54
+ *
55
+ * Each `TEXT_MESSAGE_CONTENT` event carries the *whole* accumulated answer,
56
+ * and drawing it means marked + DOMPurify over the entire document and a
57
+ * wholesale replacement of the bubble's subtree. Once per token that is
58
+ * quadratic in the answer's length — a long answer is agent-controlled, so
59
+ * an ordinary run becomes a progressively stalling tab — and every rebuild
60
+ * takes any selection or focus inside the bubble with it.
61
+ *
62
+ * A frame is the right grain: it is the fastest anything on screen can
63
+ * change anyway, so a burst of tokens costs one parse and the text still
64
+ * appears to flow rather than in visible chunks.
65
+ */
66
+ queue(buffer: string): void {
67
+ this.#streamBuffer = buffer;
68
+ this.#open();
69
+ if (this.#streamFrame !== null) {
70
+ return;
71
+ }
72
+ this.#streamFrame = requestAnimationFrame(() => {
73
+ this.#streamFrame = null;
74
+ this.into(this.#streamBuffer);
75
+ });
76
+ }
77
+
78
+ /** Render `buffer` into the streaming bubble now, dropping any queued frame. */
79
+ into(buffer: string): HTMLDivElement {
80
+ // A frame still queued would otherwise fire after this and repaint the
81
+ // bubble with whatever the last delta held — behind the buffer just drawn.
82
+ if (this.#streamFrame !== null) {
83
+ cancelAnimationFrame(this.#streamFrame);
84
+ this.#streamFrame = null;
85
+ }
86
+ this.#streamBuffer = buffer;
87
+ const bubble = this.#open();
88
+ bubble.innerHTML = renderMarkdown(buffer, { allowImages: this.#host.allowImages() });
89
+ this.#host.follow();
90
+ return bubble;
91
+ }
92
+
93
+ /**
94
+ * Close the current answer's streaming bubble.
95
+ *
96
+ * Draws a queued render first. A run that ends without a text end — a
97
+ * cancel, an error, a round boundary — leaves the last delta sitting in the
98
+ * queue, and simply dropping the bubble here would strand it: the partial
99
+ * answer the user stopped mid-sentence would lose its final tokens, or be an
100
+ * empty bubble above the stopped note.
101
+ */
102
+ end(): void {
103
+ if (this.#streamFrame !== null) {
104
+ this.into(this.#streamBuffer);
105
+ }
106
+ this.#streamingBubble = null;
107
+ }
108
+
109
+ /**
110
+ * The bubble the current answer streams into, opening it on first sight.
111
+ *
112
+ * Opened the moment a token arrives rather than on the frame that draws it,
113
+ * so the answer's container replaces the pending dots straight away and the
114
+ * turn never shows a gap while the first render waits for a frame.
115
+ */
116
+ #open(): HTMLDivElement {
117
+ if (this.#streamingBubble === null) {
118
+ this.#streamingBubble = this.#host.openBubble();
119
+ this.#streamDeltas = 0;
120
+ }
121
+ return this.#streamingBubble;
122
+ }
123
+ }
@@ -0,0 +1,116 @@
1
+ // An attachment chip, in the tray and in a sent message alike, the drop
2
+ // outline, and the note a cancelled run leaves, which sits here only
3
+ // because no rule moved in the split.
4
+ export const ATTACHMENT_CHIP_STYLES: string = `
5
+ /* A chip carries its own text colour because it carries its own background.
6
+ The same chip renders in two places with opposite inherited colours: the
7
+ composer tray gives it the panel's, a sent user bubble gives it the user
8
+ foreground, which is white on the stock light theme and near-invisible
9
+ against the chip. Pairing the colour with the background it belongs to makes
10
+ both placements read alike. Overridden below for an errored chip, which
11
+ keeps its red. */
12
+ .attachment-chip {
13
+ display: inline-flex;
14
+ align-items: center;
15
+ gap: 6px;
16
+ /* Without this the 100% below caps the content box, so the chip still
17
+ overflows its container by its own padding and border. Invisible while a
18
+ character cap kept names short; routine once the container is what bounds
19
+ the name. */
20
+ box-sizing: border-box;
21
+ max-width: 100%;
22
+ padding: 4px 8px;
23
+ border: 1px solid var(--_border);
24
+ border-radius: 999px;
25
+ background: var(--_assistant-bg);
26
+ color: var(--_text);
27
+ font-size: 0.85em;
28
+ position: relative;
29
+ }
30
+
31
+ .attachment-chip--error {
32
+ border-color: var(--_danger);
33
+ color: var(--_danger);
34
+ }
35
+
36
+ /* The type mark. Painted from currentColor, so it carries the chip's state
37
+ with it and turns red along with an errored one; muted by opacity rather
38
+ than a colour, which is what keeps that true. Sized from the chip's own text
39
+ rather than --ag-ui-glyph-size, the way an icon holder's glyph takes the
40
+ holder's size: the composer's 18px buttons would make a chip button-height. */
41
+ .attachment-chip-icon {
42
+ display: inline-flex;
43
+ flex: none;
44
+ opacity: 0.75;
45
+ }
46
+
47
+ .attachment-chip-icon .glyph {
48
+ width: 1.25em;
49
+ height: 1.25em;
50
+ }
51
+
52
+ /* No character cap: the chip is already max-width 100%, so its container is
53
+ what bounds the name, and a fixed cap only truncated names the chip had room
54
+ for. min-width: 0 is what lets the flex item shrink past its content, so the
55
+ ellipsis appears at the container edge instead of the chip overflowing. */
56
+ .attachment-chip-name {
57
+ overflow: hidden;
58
+ text-overflow: ellipsis;
59
+ white-space: nowrap;
60
+ min-width: 0;
61
+ }
62
+
63
+ .attachment-chip-size {
64
+ color: var(--_muted);
65
+ white-space: nowrap;
66
+ }
67
+
68
+ .attachment-chip--error .attachment-chip-size {
69
+ color: var(--_danger);
70
+ }
71
+
72
+ /* The progress bar fills as the file uploads. */
73
+ .attachment-chip-bar {
74
+ flex-basis: 100%;
75
+ height: 3px;
76
+ border-radius: 2px;
77
+ background: var(--_border);
78
+ overflow: hidden;
79
+ }
80
+
81
+ .attachment-chip-bar-fill {
82
+ height: 100%;
83
+ background: var(--_accent);
84
+ transition: width 0.15s ease;
85
+ }
86
+
87
+ .attachment-chip-remove,
88
+ .attachment-chip-retry {
89
+ border: none;
90
+ background: none;
91
+ color: inherit;
92
+ cursor: pointer;
93
+ padding: 0;
94
+ line-height: 1;
95
+ opacity: 0.7;
96
+ }
97
+
98
+ .attachment-chip-remove:hover,
99
+ .attachment-chip-retry:hover {
100
+ opacity: 1;
101
+ }
102
+
103
+ /* A subtle outline while a file is dragged over the shell. */
104
+ .chat--dragover {
105
+ outline: 2px dashed var(--_accent);
106
+ outline-offset: -4px;
107
+ }
108
+
109
+ /* Muted "⏹ Stopped" line after a cancelled run — a note, not an error bubble. */
110
+ .stopped-note {
111
+ align-self: flex-start;
112
+ color: var(--_muted);
113
+ font-size: 12px;
114
+ padding: 2px 4px;
115
+ }
116
+ `;
@@ -0,0 +1,82 @@
1
+ import { ICON_FILE, ICON_FILE_IMAGE, ICON_FILE_PDF, ICON_FILE_TEXT } from "../../constants.js";
2
+ import type { AttachmentRef } from "../../core/attachment.js";
3
+
4
+ /**
5
+ * Render the read-only attachment chips on a sent user message bubble and on
6
+ * restored history — one chip per ref with a type icon, filename, and human
7
+ * size. Static: no progress and no remove, both of which live in the composer
8
+ * tray.
9
+ */
10
+ export function renderAttachmentChips(refs: readonly AttachmentRef[]): HTMLDivElement {
11
+ const list = document.createElement("div");
12
+ list.className = "attachment-chips";
13
+ list.setAttribute("part", "attachment-chips");
14
+ for (const ref of refs) {
15
+ list.appendChild(renderChip(ref));
16
+ }
17
+ return list;
18
+ }
19
+
20
+ function renderChip(ref: AttachmentRef): HTMLDivElement {
21
+ const chip = document.createElement("div");
22
+ chip.className = "attachment-chip attachment-chip--ready";
23
+ chip.setAttribute("part", "attachment-chip");
24
+
25
+ const icon = document.createElement("span");
26
+ icon.className = "attachment-chip-icon";
27
+ icon.setAttribute("part", "attachment-chip-icon");
28
+ icon.innerHTML = iconFor(ref.mime);
29
+ icon.setAttribute("aria-hidden", "true");
30
+
31
+ const name = document.createElement("span");
32
+ name.className = "attachment-chip-name";
33
+ name.setAttribute("part", "attachment-chip-name");
34
+ name.textContent = ref.name;
35
+ name.title = ref.name;
36
+
37
+ const size = document.createElement("span");
38
+ size.className = "attachment-chip-size";
39
+ size.setAttribute("part", "attachment-chip-size");
40
+ size.textContent = formatBytes(ref.size);
41
+
42
+ chip.append(icon, name, size);
43
+ return chip;
44
+ }
45
+
46
+ /**
47
+ * A coarse type mark for a chip — image, PDF, text document, or generic file —
48
+ * as inline SVG markup rather than a character, so it matches the composer's
49
+ * SVG buttons in weight and takes the glyph size and `currentColor`, which
50
+ * emoji do not.
51
+ *
52
+ * The MIME string only selects among author-written constants and is never
53
+ * interpolated into one, so the result is safe to assign as markup.
54
+ */
55
+ export function iconFor(mime: string): string {
56
+ if (mime.startsWith("image/")) {
57
+ return ICON_FILE_IMAGE;
58
+ }
59
+ if (mime === "application/pdf") {
60
+ return ICON_FILE_PDF;
61
+ }
62
+ if (mime.startsWith("text/")) {
63
+ return ICON_FILE_TEXT;
64
+ }
65
+ return ICON_FILE;
66
+ }
67
+
68
+ /** A compact human-readable byte size (e.g. `1.2 MB`). */
69
+ export function formatBytes(bytes: number): string {
70
+ if (bytes < 1024) {
71
+ return `${bytes} B`;
72
+ }
73
+ const units = ["KB", "MB", "GB"];
74
+ let value = bytes / 1024;
75
+ let unit = 0;
76
+ while (value >= 1024 && unit < units.length - 1) {
77
+ value /= 1024;
78
+ unit += 1;
79
+ }
80
+ const rounded = value < 10 ? Math.round(value * 10) / 10 : Math.round(value);
81
+ return `${rounded} ${units[unit]}`;
82
+ }
@@ -0,0 +1,67 @@
1
+ import type { UiStrings } from "../ui_strings.js";
2
+
3
+ /** The transcript's parts, owned by the element, and what fills them. */
4
+ export interface TranscriptOptions {
5
+ readonly messages: HTMLElement;
6
+ readonly jumpButton: HTMLButtonElement;
7
+ readonly emptyWrap: HTMLElement;
8
+ /** The greeting's text node, kept by the element so a new user name updates it. */
9
+ readonly greetingText: HTMLElement;
10
+ /** The starter chips, or `null` when the host configured none. */
11
+ readonly starters: HTMLElement | null;
12
+ readonly strings: UiStrings;
13
+ }
14
+
15
+ /**
16
+ * Ready the message list, its jump-to-latest control and the empty state.
17
+ *
18
+ * The empty state is built but not put into the list: the element mounts the
19
+ * scroller, the quote offer and the announcer first and appends it after, so
20
+ * the scroller's observers see the list fill exactly as they always have.
21
+ */
22
+ export function buildTranscript(options: TranscriptOptions): void {
23
+ const { messages, jumpButton, emptyWrap, strings } = options;
24
+ messages.className = "messages";
25
+ messages.setAttribute("part", "messages");
26
+ messages.setAttribute("role", "log");
27
+ // NOT a live region. The streaming bubble's innerHTML is replaced inside
28
+ // this element on every animation frame, and `role="log"` already implies
29
+ // polite announcement whose default `aria-relevant` includes text
30
+ // additions -- so a screen reader was asked to re-announce the whole answer
31
+ // tens of times as it streamed. `aria-live="off"` is an explicit override
32
+ // of the role's implicit value, which is why the role can stay: the log
33
+ // semantics are what let the transcript be navigated as one, and only the
34
+ // announcing is the defect. Status goes to the announcer instead.
35
+ messages.setAttribute("aria-live", "off");
36
+ messages.setAttribute("aria-label", strings.conversation);
37
+
38
+ jumpButton.className = "jump-latest";
39
+ jumpButton.type = "button";
40
+ jumpButton.setAttribute("part", "jump-latest");
41
+ jumpButton.textContent = strings.jumpToLatest;
42
+
43
+ // Empty-state region: a host slot at the top of the list, hidden as soon as
44
+ // anything renders.
45
+ emptyWrap.className = "empty";
46
+ emptyWrap.setAttribute("part", "empty");
47
+ // The greeting heads the empty state, in a slot of its own: a host that
48
+ // replaces the starters keeps the greeting, and a host that replaces the
49
+ // greeting keeps the starters. A div rather than a heading, because this
50
+ // sits inside somebody else's page, which owns the document outline.
51
+ const greeting = document.createElement("div");
52
+ greeting.className = "greeting";
53
+ greeting.setAttribute("part", "greeting");
54
+ const greetingSlot = document.createElement("slot");
55
+ greetingSlot.name = "greeting";
56
+ greetingSlot.append(options.greetingText);
57
+ greeting.append(greetingSlot);
58
+ const emptySlot = document.createElement("slot");
59
+ emptySlot.name = "empty";
60
+ // Fallback content, so a host that slots its own gets exactly that and
61
+ // nothing of ours: the starters live *inside* the slot rather than beside
62
+ // it, which is the difference between an offer and an imposition.
63
+ if (options.starters !== null) {
64
+ emptySlot.append(options.starters);
65
+ }
66
+ emptyWrap.replaceChildren(greeting, emptySlot);
67
+ }