@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,206 @@
1
+ import { clampLauncher } from "./clamp_launcher.js";
2
+ import type { LauncherBox, ViewportBox } from "./launcher_placement.js";
3
+
4
+ /** What the drag needs from its host to do its job. */
5
+ export interface LauncherDragOptions {
6
+ /**
7
+ * Whether the current placement lets the launcher move, read per interaction
8
+ * because `placement` is a live attribute. A docked rail and a full-bleed
9
+ * layout have nowhere to move it to.
10
+ */
11
+ readonly enabled: () => boolean;
12
+ /** The launcher's current box, in viewport coordinates. */
13
+ readonly rect: () => LauncherBox;
14
+ /** The viewport the launcher has to stay inside. */
15
+ readonly viewport: () => ViewportBox;
16
+ /** Put the launcher's top-left at this point. Called per pointer move. */
17
+ readonly apply: (left: number, top: number) => void;
18
+ /**
19
+ * Called once per completed move, for persistence: on `pointerup` for a
20
+ * drag, and when the key comes up (or focus leaves) for a key press. Never
21
+ * per pointer move, and never per key repeat.
22
+ */
23
+ readonly commit: (left: number, top: number) => void;
24
+ /**
25
+ * Ends the launcher's own listeners when aborted. The launcher outlives the
26
+ * element's connection to the document and this is called on every connect,
27
+ * so without it a re-inserted element moved one arrow press two steps.
28
+ */
29
+ readonly signal: AbortSignal;
30
+ }
31
+
32
+ /**
33
+ * How far the pointer must travel before this counts as a drag rather than a
34
+ * click. The launcher's first job is still to expand the panel, so a press
35
+ * that wanders by a pixel has to remain a press.
36
+ */
37
+ const DRAG_THRESHOLD = 4;
38
+
39
+ /** Keyboard step, and the larger one Shift asks for. */
40
+ const STEP = 16;
41
+ const COARSE_STEP = 64;
42
+
43
+ /**
44
+ * Let the user drag the collapsed launcher anywhere on screen.
45
+ *
46
+ * The launcher is a button before it is a handle, and that ordering is the
47
+ * whole difficulty: every drag ends in a `click` the browser synthesises, which
48
+ * would expand the panel the user was only repositioning. So a completed drag
49
+ * arms a one-shot capture listener that eats exactly one click.
50
+ *
51
+ * Two things stop that from eating a click it should not have. A drag ending
52
+ * off the launcher never produces the click it armed, so the arming is cleared
53
+ * on the next `pointerdown` -- a pointer click is always preceded by a press,
54
+ * which puts the clearing ahead of any click it could reach.
55
+ *
56
+ * That leaves the clicks with no press in front of them at all: `Enter` and
57
+ * `Space` on the focused button, assistive technology activating it, and a host
58
+ * calling `click()` itself. None of those is the tail of a drag, and all of them
59
+ * are the only way in for someone not using a pointer, so the suppression is
60
+ * narrowed to clicks carrying a click count -- which is the pointer's own.
61
+ */
62
+ export function enableLauncherDrag(launcher: HTMLElement, options: LauncherDragOptions): void {
63
+ let suppressClick = false;
64
+ const { signal } = options;
65
+
66
+ launcher.addEventListener(
67
+ "click",
68
+ (event: MouseEvent) => {
69
+ // detail is the click count on a pointer click and zero on a keyboard,
70
+ // assistive or programmatic one. Only the first kind can end a drag.
71
+ if (!suppressClick || event.detail === 0) {
72
+ return;
73
+ }
74
+ suppressClick = false;
75
+ // Capture phase, so this runs before the expand handler bound to the
76
+ // same element rather than after it.
77
+ event.stopPropagation();
78
+ event.preventDefault();
79
+ },
80
+ { capture: true, signal },
81
+ );
82
+
83
+ launcher.addEventListener(
84
+ "pointerdown",
85
+ (event: PointerEvent) => {
86
+ // Any suppression left armed by a drag that ended elsewhere dies here,
87
+ // before it can reach a click belonging to this new gesture.
88
+ suppressClick = false;
89
+ if (!options.enabled()) {
90
+ return;
91
+ }
92
+ const start = options.rect();
93
+ const originX = event.clientX;
94
+ const originY = event.clientY;
95
+ let dragging = false;
96
+
97
+ const onMove = (move: PointerEvent): void => {
98
+ const dx = move.clientX - originX;
99
+ const dy = move.clientY - originY;
100
+ if (!dragging && Math.hypot(dx, dy) < DRAG_THRESHOLD) {
101
+ return;
102
+ }
103
+ dragging = true;
104
+ launcher.setAttribute("data-dragging", "true");
105
+ // Measured from the box the press started on, never from the live one:
106
+ // reading it each move would chase the launcher as it moves and the
107
+ // travel would compound.
108
+ const next = clampLauncher(
109
+ { ...start, left: start.left + dx, top: start.top + dy },
110
+ options.viewport(),
111
+ );
112
+ options.apply(next.left, next.top);
113
+ };
114
+
115
+ const onUp = (up: PointerEvent): void => {
116
+ window.removeEventListener("pointermove", onMove);
117
+ window.removeEventListener("pointerup", onUp);
118
+ window.removeEventListener("pointercancel", onUp);
119
+ if (!dragging) {
120
+ return;
121
+ }
122
+ launcher.removeAttribute("data-dragging");
123
+ suppressClick = true;
124
+ const next = clampLauncher(
125
+ {
126
+ ...start,
127
+ left: start.left + (up.clientX - originX),
128
+ top: start.top + (up.clientY - originY),
129
+ },
130
+ options.viewport(),
131
+ );
132
+ options.commit(next.left, next.top);
133
+ };
134
+
135
+ // Listeners on `window`, not the launcher: a fast drag outruns the pointer
136
+ // and would otherwise strand it mid-move with no pointerup.
137
+ //
138
+ // pointercancel matters on touch, where it is routine rather than
139
+ // exceptional: the browser takes the pointer back for a scroll or a system
140
+ // gesture and never sends pointerup. Without this the move listeners stay
141
+ // attached and the drag stamp never clears, which leaves the launcher
142
+ // following a finger that has stopped and the element believing a gesture
143
+ // is still in flight.
144
+ window.addEventListener("pointermove", onMove);
145
+ window.addEventListener("pointerup", onUp);
146
+ window.addEventListener("pointercancel", onUp);
147
+ },
148
+ { signal },
149
+ );
150
+
151
+ // The position this key gesture has applied but not yet persisted. The
152
+ // pointer path can commit inline because a drag has one unambiguous end; a
153
+ // key press does not, so the gesture's result is held here until it does.
154
+ let pending: { left: number; top: number } | null = null;
155
+
156
+ /** End a key gesture: persist what it applied, once. */
157
+ const settle = (): void => {
158
+ if (pending === null) {
159
+ return;
160
+ }
161
+ const { left, top } = pending;
162
+ pending = null;
163
+ options.commit(left, top);
164
+ };
165
+
166
+ // Keyboard parity: a pointer-only move is unreachable without a mouse, and
167
+ // the launcher has no equivalent control elsewhere. Arrow keys are free on a
168
+ // button, so Enter and Space still expand.
169
+ launcher.addEventListener(
170
+ "keydown",
171
+ (event: KeyboardEvent) => {
172
+ if (!options.enabled()) {
173
+ return;
174
+ }
175
+ const step = event.shiftKey ? COARSE_STEP : STEP;
176
+ const rect = options.rect();
177
+ let moved: { left: number; top: number } | null = null;
178
+ if (event.key === "ArrowLeft") {
179
+ moved = { left: rect.left - step, top: rect.top };
180
+ } else if (event.key === "ArrowRight") {
181
+ moved = { left: rect.left + step, top: rect.top };
182
+ } else if (event.key === "ArrowUp") {
183
+ moved = { left: rect.left, top: rect.top - step };
184
+ } else if (event.key === "ArrowDown") {
185
+ moved = { left: rect.left, top: rect.top + step };
186
+ }
187
+ if (moved === null) {
188
+ return;
189
+ }
190
+ event.preventDefault();
191
+ const next = clampLauncher({ ...rect, ...moved }, options.viewport());
192
+ // Live feedback per key event, persistence only when the gesture ends: a
193
+ // held arrow repeats at the OS rate, and committing here would put that
194
+ // many storage writes behind a single press.
195
+ options.apply(next.left, next.top);
196
+ pending = next;
197
+ },
198
+ { signal },
199
+ );
200
+
201
+ // The key coming up ends the gesture, mirroring `pointerup`. `blur` closes
202
+ // one whose keyup never arrives here -- focus moved on mid-press -- because a
203
+ // position applied but never committed is a move the host silently forgets.
204
+ launcher.addEventListener("keyup", settle, { signal });
205
+ launcher.addEventListener("blur", settle, { signal });
206
+ }
@@ -0,0 +1,133 @@
1
+ import { SCREEN_EDGE_MARGIN } from "../../constants.js";
2
+ import { clampPanel } from "./clamp_panel.js";
3
+ import { placeWidget } from "./place_widget.js";
4
+
5
+ /** A box in viewport coordinates. */
6
+ export interface LauncherBox {
7
+ readonly left: number;
8
+ readonly top: number;
9
+ readonly width: number;
10
+ readonly height: number;
11
+ }
12
+
13
+ /**
14
+ * The part of the screen a widget may rest in: a width and height, and the
15
+ * corner they start from.
16
+ *
17
+ * The origin is not always zero. A host can reserve the edges its own chrome
18
+ * occupies, and a panel clamped against a viewport that starts at the top-left
19
+ * of the screen will happily park itself underneath a sticky header -- where it
20
+ * cannot be reached, and where collapsing it only hides it further.
21
+ */
22
+ export interface ViewportBox extends Extent {
23
+ readonly left: number;
24
+ readonly top: number;
25
+ }
26
+
27
+ /** A width/height pair, in CSS pixels. */
28
+ export interface Extent {
29
+ readonly width: number;
30
+ readonly height: number;
31
+ }
32
+
33
+ /**
34
+ * The corner the panel is pinned by, and therefore grows away from: pinned
35
+ * `top-left` opens down and to the right. It is also the corner the resize grip
36
+ * must stay off, which is why the element stamps it rather than measuring it
37
+ * once the launcher has been moved.
38
+ */
39
+ export interface ExpandCorner {
40
+ readonly x: "left" | "right";
41
+ readonly y: "top" | "bottom";
42
+ }
43
+
44
+ /** Where to put the host box, and where the launcher sits inside it. */
45
+ export interface LauncherPlacement {
46
+ /** The corner the panel opens away from. */
47
+ readonly corner: ExpandCorner;
48
+ /** An `inset` shorthand for the host box. */
49
+ readonly hostInset: string;
50
+ /** An `inset` shorthand for the launcher, relative to the host box. */
51
+ readonly launcherInset: string;
52
+ }
53
+
54
+ /**
55
+ * Decide where a panel should open from a launcher the user has dragged.
56
+ *
57
+ * The launcher is the fixed point: wherever it was dropped is where it stays,
58
+ * collapsed and expanded alike. Everything here decides what happens *around*
59
+ * it.
60
+ *
61
+ * Two steps, and they are separate on purpose:
62
+ *
63
+ * 1. **Pick the corner with the most clear space.** For each axis, compare the
64
+ * room a panel would have on either side of the launcher and pin the side
65
+ * with more of it. Pinning `left` means the panel runs rightward from the
66
+ * launcher's left edge, so the room that decides it is the distance from
67
+ * that edge to the far side of the viewport -- not "which half of the screen
68
+ * is the launcher in", which gives a different and worse answer for a
69
+ * launcher near the middle.
70
+ *
71
+ * 2. **Clamp the panel into the viewport, then put the launcher back.** A
72
+ * launcher near the centre of a short viewport has a panel taller than
73
+ * either side, so the winning corner still overflows. Clamping moves the
74
+ * host box -- and the launcher is positioned inside that box, so it would be
75
+ * dragged along with it. The launcher's own inset therefore carries the
76
+ * difference: zero in the ordinary case, and exactly the distance the clamp
77
+ * moved the box in the case that needs it. That the launcher may end up
78
+ * outside its own host box is fine; nothing clips it, and it keeps its own
79
+ * pointer events.
80
+ *
81
+ * Both insets are expressed from the *same* corner, which is what stops a
82
+ * later panel resize from dragging the launcher: the pinned corner is the one
83
+ * edge a resize cannot move.
84
+ */
85
+ export function launcherPlacement(
86
+ launcher: LauncherBox,
87
+ panel: Extent,
88
+ viewport: ViewportBox,
89
+ screen: Extent,
90
+ margin: number = SCREEN_EDGE_MARGIN,
91
+ ): LauncherPlacement {
92
+ // Room for a panel pinned to each side of the launcher. A tie goes to the
93
+ // first branch, so the result is deterministic for a centred launcher.
94
+ //
95
+ // Measured against the usable box's own edges, not against its width and
96
+ // height as if it started at the origin. The launcher's coordinates are the
97
+ // screen's, while the extents have already had the host's reserved edges
98
+ // taken out of them, so mixing the two understates the room on one side and
99
+ // overstates it on the other -- by the same reserved inset, in opposite
100
+ // directions, which is what makes the comparison flip rather than merely
101
+ // drift. The clamp below reads `viewport.left`/`top`; this had to as well.
102
+ const roomRunningRight = viewport.left + viewport.width - launcher.left;
103
+ const roomRunningLeft = launcher.left + launcher.width - viewport.left;
104
+ const roomRunningDown = viewport.top + viewport.height - launcher.top;
105
+ const roomRunningUp = launcher.top + launcher.height - viewport.top;
106
+ const corner: ExpandCorner = {
107
+ x: roomRunningRight >= roomRunningLeft ? "left" : "right",
108
+ y: roomRunningDown >= roomRunningUp ? "top" : "bottom",
109
+ };
110
+
111
+ // The box the panel wants, then the box it can actually have. The launcher
112
+ // is not moved by that clamp -- it is the fixed point of this gesture, so its
113
+ // own inset carries the difference and it can end up outside the host box.
114
+ const wantedLeft =
115
+ corner.x === "left" ? launcher.left : launcher.left + launcher.width - panel.width;
116
+ const wantedTop =
117
+ corner.y === "top" ? launcher.top : launcher.top + launcher.height - panel.height;
118
+ const host = clampPanel(
119
+ {
120
+ left: wantedLeft,
121
+ top: wantedTop,
122
+ right: wantedLeft + panel.width,
123
+ bottom: wantedTop + panel.height,
124
+ },
125
+ viewport,
126
+ margin,
127
+ );
128
+
129
+ // The usable box decides where things may rest; the screen is what the
130
+ // resulting insets are measured from. They are the same only when the host
131
+ // has reserved nothing.
132
+ return { corner, ...placeWidget(host, launcher, corner, screen) };
133
+ }
@@ -0,0 +1,189 @@
1
+ // The launcher a collapsed widget shrinks to: the round button, its unread
2
+ // badge, and the sidebar's edge rail, which is the same element styled again.
3
+ export const LAUNCHER_STYLES: string = `
4
+ /* ── Launcher ───────────────────────────────────────────────────────────────
5
+ What a collapsed widget shrinks to: a round floating button by default, the
6
+ sidebar's slim edge rail under that placement. A sibling of the panel, so it
7
+ survives the panel being hidden, and the only part of a collapsed widget
8
+ that takes pointer events. */
9
+ .launcher {
10
+ display: flex;
11
+ position: absolute;
12
+ inset: var(--_launcher-inset);
13
+ align-items: center;
14
+ justify-content: center;
15
+ width: var(--_launcher-size);
16
+ height: var(--_launcher-size);
17
+ padding: 0;
18
+ border: none;
19
+ border-radius: var(--_launcher-radius);
20
+ background: var(--_launcher-bg);
21
+ color: var(--_launcher-fg);
22
+ box-shadow: var(--_shadow);
23
+ font: inherit;
24
+ cursor: pointer;
25
+ pointer-events: auto;
26
+ /* A touch drag on the launcher moves it; without this the page scrolls under
27
+ the finger instead and the launcher never moves at all. */
28
+ touch-action: none;
29
+ opacity: 0;
30
+ transform: scale(0.4);
31
+ visibility: hidden;
32
+ transition:
33
+ opacity var(--_motion) var(--_ease),
34
+ transform var(--_motion) var(--_ease-pop),
35
+ visibility var(--_motion) var(--_ease);
36
+ }
37
+
38
+ /* The launcher grows out of the corner the panel shrank into. It stays laid
39
+ out at rest rather than display:none, which is what lets it animate both in
40
+ and out: an unrendered element has no before-change style to transition
41
+ from, and one flipping display to none cannot transition at all. visibility
42
+ keeps it unpaintable, untabbable and unclickable in between, so the expanded
43
+ panel's own controls underneath stay reachable. */
44
+ :host([collapsed]) .launcher {
45
+ opacity: 1;
46
+ transform: none;
47
+ visibility: visible;
48
+ }
49
+
50
+ :host([collapsed]) .launcher:hover {
51
+ transform: scale(1.06);
52
+ }
53
+
54
+ :host([collapsed]) .launcher:active {
55
+ transform: scale(0.94);
56
+ }
57
+
58
+ /* A drag is a press and a hover at the same time, so both scale rules above are
59
+ live throughout it. Cancelling them is what keeps the launcher the size of
60
+ the thing under the pointer while it travels; the position itself comes from
61
+ inset, which nothing here transitions, so it tracks the pointer exactly. */
62
+ :host([collapsed]) .launcher[data-dragging] {
63
+ transform: none;
64
+ cursor: grabbing;
65
+ }
66
+
67
+ .launcher .icon-holder {
68
+ width: var(--_launcher-icon-size);
69
+ height: var(--_launcher-icon-size);
70
+ }
71
+
72
+ /* The unread badge rides the launcher's top-right corner. The ring in the
73
+ widget's own background is what separates it from the launcher underneath,
74
+ whatever colour the host themes either one. */
75
+ .launcher-badge {
76
+ position: absolute;
77
+ top: -2px;
78
+ right: -2px;
79
+ display: inline-flex;
80
+ align-items: center;
81
+ justify-content: center;
82
+ box-sizing: border-box;
83
+ min-width: var(--_badge-size);
84
+ height: var(--_badge-size);
85
+ padding: 0 5px;
86
+ border-radius: 999px;
87
+ background: var(--_badge-bg);
88
+ color: var(--_badge-fg);
89
+ font-size: var(--_badge-font-size);
90
+ font-weight: 600;
91
+ line-height: 1;
92
+ box-shadow: 0 0 0 2px var(--_bg);
93
+ }
94
+
95
+ .launcher-badge[hidden] {
96
+ display: none;
97
+ }
98
+
99
+ /* The sidebar collapses to an edge rail instead: full height, square, flush
100
+ against the dock. It slides in with the panel rather than popping. */
101
+ /* The edge rail. It reads as the docked edge of a panel rather than a coloured
102
+ stripe: the surface the panel is made of, a border on the side it docks
103
+ against, and the accent kept for the icon -- a full-height slab of accent is
104
+ the loudest thing on the page and says the least about itself.
105
+
106
+ Content sits at the top rather than centred, because a control floating in
107
+ the middle of a screen-high column has nothing to belong to. */
108
+ :host([placement="sidebar"][collapsed]) .launcher {
109
+ inset: 0;
110
+ width: auto;
111
+ height: auto;
112
+ flex-direction: column;
113
+ align-items: center;
114
+ justify-content: flex-start;
115
+ gap: 12px;
116
+ padding-top: 14px;
117
+ border: 0;
118
+ border-inline-start: 1px solid var(--_border);
119
+ border-radius: 0;
120
+ background: var(--_bg);
121
+ color: var(--_fg);
122
+ box-shadow: none;
123
+ transform: none;
124
+ }
125
+
126
+ :host([placement="sidebar"][data-side="left"][collapsed]) .launcher {
127
+ border-inline-start: 0;
128
+ border-inline-end: 1px solid var(--_border);
129
+ }
130
+
131
+ /* The icon keeps the accent, so there is one obvious thing to press.
132
+
133
+ The glyph is sized here rather than left to fill the holder. A glyph in an
134
+ icon holder takes the holder's whole box by default, which is right where the
135
+ holder is only a box and wrong the moment it becomes a filled circle: the
136
+ mark then runs edge to edge and reads as a square crammed into a disc. The
137
+ proportion is the floating launcher's own -- a 26px glyph in a 56px bubble --
138
+ so the two collapsed states look like the same widget. */
139
+ :host([placement="sidebar"][collapsed]) .launcher .icon-holder {
140
+ display: inline-flex;
141
+ align-items: center;
142
+ justify-content: center;
143
+ width: 34px;
144
+ height: 34px;
145
+ border-radius: 50%;
146
+ background: var(--_header-bg);
147
+ color: var(--_header-fg);
148
+ }
149
+
150
+ :host([placement="sidebar"][collapsed]) .launcher .icon-holder .glyph,
151
+ :host([placement="sidebar"][collapsed]) .launcher .icon-holder .icon-img {
152
+ width: 16px;
153
+ height: 16px;
154
+ }
155
+
156
+ /* Written down the rail, which is the only direction it fits. Reading upward
157
+ is the convention for a right-hand edge and matches how a docked panel's
158
+ label is set everywhere it appears. */
159
+ .rail-label {
160
+ display: none;
161
+ }
162
+
163
+ :host([placement="sidebar"][collapsed]) .rail-label {
164
+ display: block;
165
+ writing-mode: vertical-rl;
166
+ transform: rotate(180deg);
167
+ max-height: calc(100% - 96px);
168
+ overflow: hidden;
169
+ font-size: 0.9em;
170
+ font-weight: 600;
171
+ letter-spacing: 0.02em;
172
+ white-space: nowrap;
173
+ text-overflow: ellipsis;
174
+ }
175
+
176
+ :host([placement="sidebar"][data-side="left"][collapsed]) .rail-label {
177
+ writing-mode: vertical-rl;
178
+ transform: none;
179
+ }
180
+
181
+ /* Every transition in the stylesheet is timed by --_motion, so collapsing it to a
182
+ frame is the whole reduced-motion story: states still change (and display
183
+ still flips at the end of its discrete transition), nothing travels. */
184
+ @media (prefers-reduced-motion: reduce) {
185
+ :host {
186
+ --_motion: var(--ag-ui-motion, 0.001s);
187
+ }
188
+ }
189
+ `;
@@ -0,0 +1,47 @@
1
+ // The page and full placements: a full-bleed surface with a reading column.
2
+ export const PAGE_STYLES: string = `
3
+ /* Page: full-bleed background with a centred reading column capped at
4
+ --ag-ui-content-max-width, where "full" is edge-to-edge and left-aligned.
5
+ The column comes from symmetric auto padding on the scroll area and
6
+ composer rather than a per-row wrapper, so user pills still right-align and
7
+ the assistant well spans the column. */
8
+ :host([placement="page"]) {
9
+ --_inset: var(
10
+ --ag-ui-inset,
11
+ calc(var(--_viewport-inset-top) + var(--_keyboard-inset-top)) var(--_viewport-inset-right)
12
+ var(--_viewport-inset-bottom) var(--_viewport-inset-left)
13
+ );
14
+ --_width: var(--ag-ui-width, var(--_viewport-width));
15
+ --_height: var(--ag-ui-height, var(--_viewport-height));
16
+ --_max-width: var(--ag-ui-max-width, var(--_viewport-width));
17
+ --_max-height: var(--ag-ui-max-height, var(--_viewport-height));
18
+ --_panel-radius: var(--ag-ui-panel-radius, 0);
19
+ }
20
+
21
+ :host([placement="page"]) .messages {
22
+ padding-inline: max(var(--_pad), calc((100% - var(--_content-max-width)) / 2));
23
+ }
24
+
25
+ :host([placement="page"]) .input-row {
26
+ padding-inline: max(12px, calc((100% - var(--_content-max-width)) / 2));
27
+ }
28
+
29
+ /* The rows between the message list and the composer line up with the column
30
+ too. Chips and tray are padding-based while palette and hint are
31
+ margin-based, so each gets its own inline axis nudged by the same gutter. */
32
+ :host([placement="page"]) .skill-chips,
33
+ :host([placement="page"]) .attachment-tray {
34
+ padding-inline: max(12px, calc((100% - var(--_content-max-width)) / 2));
35
+ }
36
+
37
+ :host([placement="page"]) .skill-palette,
38
+ :host([placement="page"]) .skill-hint {
39
+ margin-inline: max(12px, calc((100% - var(--_content-max-width)) / 2));
40
+ }
41
+
42
+ /* In the reading column the assistant well uses the full width; the user
43
+ message stays a right-aligned pill (its default align-self + max-width). */
44
+ :host([placement="page"]) .message--assistant {
45
+ max-width: 100%;
46
+ }
47
+ `;