@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,64 @@
1
+ import type { ExpandCorner, Extent, LauncherBox } from "./launcher_placement.js";
2
+ import type { PanelRect } from "./resize_handle.js";
3
+
4
+ /** Where to put the host box, and where the launcher sits inside it. */
5
+ export interface WidgetInsets {
6
+ /** An `inset` shorthand for the host box. */
7
+ readonly hostInset: string;
8
+ /** An `inset` shorthand for the launcher, relative to the host box. */
9
+ readonly launcherInset: string;
10
+ }
11
+
12
+ /**
13
+ * Express a panel and its launcher, both already positioned, as the two
14
+ * `inset` shorthands the element writes.
15
+ *
16
+ * Both are measured from the **same** corner, which is what stops a later
17
+ * resize from dragging the launcher: the pinned corner is the one edge a
18
+ * resize cannot move. Which corner that is says nothing about where either box
19
+ * ends up -- the positions are absolute and arrive decided -- so re-picking it
20
+ * moves nothing, and the launcher may sit outside its own host box. Nothing
21
+ * clips it there, and that is what lets a launcher be flush to a screen corner
22
+ * while the panel it opens keeps its margin.
23
+ *
24
+ * `screen` is the **whole** viewport, not the part a host has left free. These
25
+ * are CSS `inset` values on a fixed element, and the browser measures those
26
+ * from the real edges -- so a `bottom` expressed against a box inset from the
27
+ * top comes out short by exactly that inset. It only shows when the corner
28
+ * flips mid-drag, because that is when the same point stops being expressed
29
+ * from `top` and starts being expressed from `bottom`: the widget then leaps by
30
+ * the reserved edge, which is a jump the gesture cannot explain.
31
+ */
32
+ export function placeWidget(
33
+ host: PanelRect,
34
+ launcher: LauncherBox,
35
+ corner: ExpandCorner,
36
+ screen: Extent,
37
+ ): WidgetInsets {
38
+ return {
39
+ hostInset: inset({
40
+ top: corner.y === "top" ? host.top : null,
41
+ right: corner.x === "right" ? screen.width - host.right : null,
42
+ bottom: corner.y === "bottom" ? screen.height - host.bottom : null,
43
+ left: corner.x === "left" ? host.left : null,
44
+ }),
45
+ launcherInset: inset({
46
+ top: corner.y === "top" ? launcher.top - host.top : null,
47
+ right: corner.x === "right" ? host.right - (launcher.left + launcher.width) : null,
48
+ bottom: corner.y === "bottom" ? host.bottom - (launcher.top + launcher.height) : null,
49
+ left: corner.x === "left" ? launcher.left - host.left : null,
50
+ }),
51
+ };
52
+ }
53
+
54
+ /** An `inset` shorthand; a null side is `auto`, so the opposite one pins it. */
55
+ function inset(sides: {
56
+ top: number | null;
57
+ right: number | null;
58
+ bottom: number | null;
59
+ left: number | null;
60
+ }): string {
61
+ const side = (value: number | null): string =>
62
+ value === null ? "auto" : `${Math.round(value)}px`;
63
+ return `${side(sides.top)} ${side(sides.right)} ${side(sides.bottom)} ${side(sides.left)}`;
64
+ }
@@ -0,0 +1,49 @@
1
+ // The token values the bottom-left, side and full placements start from;
2
+ // the default bottom-right corner is the token defaults themselves.
3
+ export const PRESET_STYLES: string = `
4
+ /* ── Placement presets ──────────────────────────────────────────────────── */
5
+ /* Maximized, from the header control: a corner or docked panel takes the
6
+ maximized size on both axes. Set on the box rather than the size aliases, so
7
+ the size the user dragged is not read and the aliases stay the host's. The
8
+ element refuses the state on page, full, embedded and at 600px or less, so
9
+ no rule here has to. A collapsed attribute written straight on, which the
10
+ element is not told of, still draws the collapsed box. A side column grows
11
+ its width only, below and in the sidebar module. */
12
+ :host([maximized]:not([collapsed]):not([placement="side"]):not([placement="sidebar"])) {
13
+ width: var(--_maximized-width);
14
+ height: var(--_maximized-height);
15
+ }
16
+
17
+ :host([placement="bottom-left"]) {
18
+ --_inset: var(
19
+ --ag-ui-inset,
20
+ auto auto calc(var(--_edge-gutter) + var(--_viewport-inset-bottom) + var(--_keyboard-inset))
21
+ calc(var(--_edge-gutter) + var(--_viewport-inset-left))
22
+ );
23
+ }
24
+
25
+ :host([placement="side"]) {
26
+ --_inset: var(--ag-ui-inset, calc(var(--_viewport-inset-top) + var(--_keyboard-inset-top)) var(--_viewport-inset-right) var(--_viewport-inset-bottom) auto);
27
+ --_width: var(--_drag-width, var(--ag-ui-width, 420px));
28
+ --_height: var(--ag-ui-height, var(--_viewport-height));
29
+ --_max-height: var(--ag-ui-max-height, var(--_viewport-height));
30
+ --_panel-radius: var(--ag-ui-panel-radius, 0);
31
+ }
32
+
33
+ :host([placement="side"][maximized]:not([collapsed])) {
34
+ width: var(--_maximized-width);
35
+ }
36
+
37
+ :host([placement="full"]) {
38
+ --_inset: var(
39
+ --ag-ui-inset,
40
+ calc(var(--_viewport-inset-top) + var(--_keyboard-inset-top)) var(--_viewport-inset-right)
41
+ var(--_viewport-inset-bottom) var(--_viewport-inset-left)
42
+ );
43
+ --_width: var(--ag-ui-width, var(--_viewport-width));
44
+ --_height: var(--ag-ui-height, var(--_viewport-height));
45
+ --_max-width: var(--ag-ui-max-width, var(--_viewport-width));
46
+ --_max-height: var(--ag-ui-max-height, var(--_viewport-height));
47
+ --_panel-radius: var(--ag-ui-panel-radius, 0);
48
+ }
49
+ `;
@@ -0,0 +1,229 @@
1
+ /**
2
+ * Which edges a grip drags. An axis left out is an axis the grip does not
3
+ * move: the left-edge grip is `{ x: "left" }`, the top-right corner is
4
+ * `{ x: "right", y: "top" }`.
5
+ */
6
+ export interface ResizeGrip {
7
+ readonly x?: "left" | "right";
8
+ readonly y?: "top" | "bottom";
9
+ }
10
+
11
+ /** Which edges the layout holds still while the panel changes size. */
12
+ export interface ResizeAnchor {
13
+ /** The horizontal edge that does not move. */
14
+ readonly x: "left" | "right";
15
+ /** The vertical edge that does not move. */
16
+ readonly y: "top" | "bottom";
17
+ }
18
+
19
+ /**
20
+ * What the current placement allows: both axes, width only, or nothing. Which
21
+ * edges a given grip drags is separate, and fixed when the grip is built.
22
+ */
23
+ export type ResizeAxis = "none" | "width" | "both";
24
+
25
+ /** Persisted size, in CSS pixels. Either axis may be absent. */
26
+ export interface ResizeSize {
27
+ readonly width?: number;
28
+ readonly height?: number;
29
+ }
30
+
31
+ /** The panel's position on screen, in viewport coordinates. */
32
+ export interface PanelRect {
33
+ readonly left: number;
34
+ readonly top: number;
35
+ readonly right: number;
36
+ readonly bottom: number;
37
+ }
38
+
39
+ /** What the handle needs from its host to do its job. */
40
+ export interface ResizeOptions {
41
+ /**
42
+ * Which axes the current placement allows, read per interaction. A getter
43
+ * because `placement` is a live attribute, and a value read at construction
44
+ * would survive the host switching to a docked or full-bleed layout.
45
+ */
46
+ readonly axis: () => ResizeAxis;
47
+ /** The panel's current bounding box. */
48
+ readonly rect: () => PanelRect;
49
+ /** Apply a box (the host decides what that costs in properties). */
50
+ readonly apply: (box: PanelRect) => void;
51
+ /**
52
+ * Called once per completed resize, for persistence: on `pointerup` for a
53
+ * drag, and when the key comes up (or focus leaves the handle) for a key
54
+ * press. Never per pointer move, and never per key repeat.
55
+ */
56
+ readonly commit: (box: PanelRect) => void;
57
+ /** Accessible label. */
58
+ readonly label: string;
59
+ }
60
+
61
+ /** Smallest usable panel; below this the composer and header collide. */
62
+ const MIN_WIDTH = 280;
63
+ const MIN_HEIGHT = 240;
64
+
65
+ /** Keyboard step, and the larger one Shift asks for. */
66
+ const STEP = 16;
67
+ const COARSE_STEP = 64;
68
+
69
+ /**
70
+ * A drag handle that resizes the chat panel from one edge or corner.
71
+ *
72
+ * The rule that keeps it correct is that **the edge a grip does not drag is the
73
+ * one that stays put**. That is the whole model, and it is what lets the same
74
+ * code serve all eight grips: the left-edge grip moves the left edge and holds
75
+ * the right, the right-edge grip does the reverse, a corner does both axes.
76
+ *
77
+ * Which edge the *layout* pins is a different question and is deliberately not
78
+ * asked here. It matters only to the host, which has to rewrite its own
79
+ * position when a grip drags the very edge the layout was holding still --
80
+ * dragging the pinned edge of a panel is a move as much as a resize. The
81
+ * handle reports the box it wants; what that costs in CSS properties is the
82
+ * host's problem.
83
+ *
84
+ * An earlier version took the anchor and derived the direction from it, which
85
+ * is where the asymmetries lived: whether an arrow key grew or shrank the
86
+ * panel depended on which corner the single grip had been placed on. With the
87
+ * grip stated outright, an arrow simply moves the edge it names.
88
+ */
89
+ export function createResizeHandle(grip: ResizeGrip, options: ResizeOptions): HTMLDivElement {
90
+ const handle = document.createElement("div");
91
+ handle.className = `resize-handle resize-handle--${gripName(grip)}`;
92
+ handle.setAttribute("part", `resize-handle resize-handle-${gripName(grip)}`);
93
+ // A separator with an orientation: an edge grip splits along one axis, and a
94
+ // corner has no single one to report.
95
+ handle.setAttribute("role", "separator");
96
+ if (grip.x === undefined) {
97
+ handle.setAttribute("aria-orientation", "horizontal");
98
+ } else if (grip.y === undefined) {
99
+ handle.setAttribute("aria-orientation", "vertical");
100
+ }
101
+ handle.setAttribute("aria-label", options.label);
102
+ handle.tabIndex = 0;
103
+
104
+ handle.addEventListener("pointerdown", (event: PointerEvent) => {
105
+ const axis = options.axis();
106
+ if (axis === "none" || !movable(grip, axis)) {
107
+ return;
108
+ }
109
+ // Captured once: the edges this grip is not dragging cannot move during
110
+ // the drag, and reading them live would chase the panel as it resizes.
111
+ const rect = options.rect();
112
+
113
+ const onMove = (move: PointerEvent): void => {
114
+ options.apply(boxAt(grip, axis, rect, move.clientX, move.clientY));
115
+ };
116
+
117
+ const onUp = (up: PointerEvent): void => {
118
+ window.removeEventListener("pointermove", onMove);
119
+ window.removeEventListener("pointerup", onUp);
120
+ handle.removeAttribute("data-dragging");
121
+ options.commit(boxAt(grip, axis, rect, up.clientX, up.clientY));
122
+ };
123
+
124
+ handle.setAttribute("data-dragging", "true");
125
+ // Listeners on `window`, not the handle: a fast drag outruns the pointer
126
+ // and would otherwise strand the panel mid-resize with no pointerup.
127
+ window.addEventListener("pointermove", onMove);
128
+ window.addEventListener("pointerup", onUp);
129
+ event.preventDefault();
130
+ });
131
+
132
+ // The box the current key gesture has applied but not yet persisted. The
133
+ // pointer path can commit inline because a drag has one unambiguous end;
134
+ // a key press does not, so the gesture's result is held here until it does.
135
+ let pending: PanelRect | null = null;
136
+
137
+ /** End a key gesture: persist what it applied, once. */
138
+ const settle = (): void => {
139
+ if (pending === null) {
140
+ return;
141
+ }
142
+ const box = pending;
143
+ pending = null;
144
+ options.commit(box);
145
+ };
146
+
147
+ // Keyboard parity: a pointer-only resize is unreachable without a mouse, and
148
+ // this control has no equivalent elsewhere in the UI. An arrow moves the edge
149
+ // this grip names, in the direction it names -- so the same key grows one
150
+ // side's grip and shrinks the opposite one, which is what a pointer does too.
151
+ handle.addEventListener("keydown", (event: KeyboardEvent) => {
152
+ const axis = options.axis();
153
+ if (axis === "none" || !movable(grip, axis)) {
154
+ return;
155
+ }
156
+ const step = event.shiftKey ? COARSE_STEP : STEP;
157
+ const rect = options.rect();
158
+ const delta = ARROWS[event.key];
159
+ if (delta === undefined) {
160
+ return;
161
+ }
162
+ // An arrow across this grip's fixed axis has no edge to move.
163
+ if ((delta.x !== 0 && grip.x === undefined) || (delta.y !== 0 && grip.y === undefined)) {
164
+ return;
165
+ }
166
+ event.preventDefault();
167
+ const x = (grip.x === "left" ? rect.left : rect.right) + delta.x * step;
168
+ const y = (grip.y === "top" ? rect.top : rect.bottom) + delta.y * step;
169
+ const next = boxAt(grip, axis, rect, x, y);
170
+ // Live feedback per key event, persistence only when the gesture ends:
171
+ // `commit` promises one call per completed resize, and a held arrow key
172
+ // repeats at the OS rate (20-30 events a second), so committing here would
173
+ // put that many storage writes or PATCHes behind a single press — landing
174
+ // hardest on the keyboard users this path exists for.
175
+ options.apply(next);
176
+ pending = next;
177
+ });
178
+
179
+ // The key coming up ends the gesture, mirroring `pointerup`. `blur` closes one
180
+ // whose keyup never arrives here — focus moved on mid-press — because a size
181
+ // that was applied but never committed is a resize the host silently forgets.
182
+ handle.addEventListener("keyup", settle);
183
+ handle.addEventListener("blur", settle);
184
+
185
+ return handle;
186
+ }
187
+
188
+ /** Which way each arrow key pushes the edge under it. */
189
+ const ARROWS: Record<string, { x: number; y: number } | undefined> = {
190
+ ArrowLeft: { x: -1, y: 0 },
191
+ ArrowRight: { x: 1, y: 0 },
192
+ ArrowUp: { x: 0, y: -1 },
193
+ ArrowDown: { x: 0, y: 1 },
194
+ };
195
+
196
+ /** The hyphenated name of a grip, for its class and part. */
197
+ export function gripName(grip: ResizeGrip): string {
198
+ return [grip.y, grip.x].filter((side) => side !== undefined).join("-");
199
+ }
200
+
201
+ /** Whether the current placement leaves this grip anything to move. */
202
+ function movable(grip: ResizeGrip, axis: ResizeAxis): boolean {
203
+ // A docked panel owns its height, so a grip that only moves a horizontal
204
+ // edge has nothing to do and must not pretend otherwise.
205
+ return axis === "both" || grip.x !== undefined;
206
+ }
207
+
208
+ /**
209
+ * The box a pointer at (x, y) implies for this grip.
210
+ *
211
+ * Each axis is clamped by pushing the *dragged* edge back to the minimum,
212
+ * never by moving the edge that is supposed to be standing still: clamping the
213
+ * wrong one is how a panel dragged past its minimum starts travelling.
214
+ */
215
+ function boxAt(
216
+ grip: ResizeGrip,
217
+ axis: ResizeAxis,
218
+ rect: PanelRect,
219
+ x: number,
220
+ y: number,
221
+ ): PanelRect {
222
+ const left = grip.x === "left" ? Math.min(x, rect.right - MIN_WIDTH) : rect.left;
223
+ const right = grip.x === "right" ? Math.max(x, rect.left + MIN_WIDTH) : rect.right;
224
+ // A placement that owns its height leaves the vertical edges where they are.
225
+ const vertical = axis === "both";
226
+ const top = vertical && grip.y === "top" ? Math.min(y, rect.bottom - MIN_HEIGHT) : rect.top;
227
+ const bottom = vertical && grip.y === "bottom" ? Math.max(y, rect.top + MIN_HEIGHT) : rect.bottom;
228
+ return { left, top, right, bottom };
229
+ }
@@ -0,0 +1,201 @@
1
+ // The resize grips on every edge and corner, and which placements keep them.
2
+ export const RESIZE_STYLES: string = `
3
+ /* Resize grips: every edge and every corner, so the panel can be dragged from
4
+ whichever side the reader is already near. Absent entirely where the
5
+ placement is full-bleed, since there is nothing to drag.
6
+
7
+ The whole set is always laid out. Which edges the *layout* pins is not a
8
+ question the stylesheet needs to answer any more -- it decided where the one
9
+ grip went, and there is no longer one grip. The element still measures and
10
+ stamps data-resize-anchor, because it decides what a drag on a pinned edge
11
+ costs in position and which grip carries the tab stop, but no rule here
12
+ reads it. */
13
+ .resize-handle {
14
+ position: absolute;
15
+ z-index: 2;
16
+ background: transparent;
17
+ touch-action: none;
18
+ }
19
+
20
+ /* No grips while maximized: the element refuses the resize, so restore always
21
+ lands on the size stored before it. */
22
+ :host([maximized]) .resize-handle {
23
+ display: none;
24
+ }
25
+
26
+ .resize-handle:focus-visible {
27
+ outline: 2px solid var(--_accent);
28
+ outline-offset: -2px;
29
+ }
30
+
31
+ /* Corners first in the file and last in the DOM, so they take the pointer
32
+ where they overlap an edge strip. */
33
+ .resize-handle--top-left,
34
+ .resize-handle--top-right,
35
+ .resize-handle--bottom-left,
36
+ .resize-handle--bottom-right {
37
+ width: var(--_grip-corner);
38
+ height: var(--_grip-corner);
39
+ }
40
+
41
+ .resize-handle--top-left {
42
+ top: 0;
43
+ left: 0;
44
+ cursor: nwse-resize;
45
+ }
46
+
47
+ .resize-handle--top-right {
48
+ top: 0;
49
+ right: 0;
50
+ cursor: nesw-resize;
51
+ }
52
+
53
+ .resize-handle--bottom-left {
54
+ bottom: 0;
55
+ left: 0;
56
+ cursor: nesw-resize;
57
+ }
58
+
59
+ .resize-handle--bottom-right {
60
+ bottom: 0;
61
+ right: 0;
62
+ cursor: nwse-resize;
63
+ }
64
+
65
+ /* Edge strips, held clear of the corners at both ends so a corner drag is
66
+ never swallowed by the edge next to it. */
67
+ .resize-handle--left,
68
+ .resize-handle--right {
69
+ top: var(--_grip-corner);
70
+ bottom: var(--_grip-corner);
71
+ width: var(--_grip-edge);
72
+ cursor: ew-resize;
73
+ }
74
+
75
+ .resize-handle--left {
76
+ left: 0;
77
+ }
78
+
79
+ .resize-handle--right {
80
+ right: 0;
81
+ }
82
+
83
+ .resize-handle--top,
84
+ .resize-handle--bottom {
85
+ left: var(--_grip-corner);
86
+ right: var(--_grip-corner);
87
+ height: var(--_grip-edge);
88
+ cursor: ns-resize;
89
+ }
90
+
91
+ .resize-handle--top {
92
+ top: 0;
93
+ }
94
+
95
+ .resize-handle--bottom {
96
+ bottom: 0;
97
+ }
98
+
99
+ /* A docked panel a host sized to the whole window has nothing to give a grip: its size
100
+ is the host's, and a place a grip left would outlast that size with the bar back
101
+ under it. They go as they do on a phone. A corner panel keeps them, since it has no
102
+ bar to stand clear of and a grip's place is its own. */
103
+ :host([data-collapsed-to="bar"][data-fills-window]) .resize-handle,
104
+ :host([data-collapsed-to="none"][data-fills-window]) .resize-handle {
105
+ display: none;
106
+ }
107
+
108
+ /* Docked: the placement owns the height, so the horizontal edges and every
109
+ corner are inert and must not advertise a drag that does nothing. The two
110
+ vertical edges remain, which is the same affordance these placements had
111
+ when there was one grip -- now on both sides, since either may be the inner
112
+ one depending on which side the rail is docked to. */
113
+ :host([placement="sidebar"]) .resize-handle--top,
114
+ :host([placement="sidebar"]) .resize-handle--bottom,
115
+ :host([placement="sidebar"]) .resize-handle--top-left,
116
+ :host([placement="sidebar"]) .resize-handle--top-right,
117
+ :host([placement="sidebar"]) .resize-handle--bottom-left,
118
+ :host([placement="sidebar"]) .resize-handle--bottom-right,
119
+ :host([placement="side"]) .resize-handle--top,
120
+ :host([placement="side"]) .resize-handle--bottom,
121
+ :host([placement="side"]) .resize-handle--top-left,
122
+ :host([placement="side"]) .resize-handle--top-right,
123
+ :host([placement="side"]) .resize-handle--bottom-left,
124
+ :host([placement="side"]) .resize-handle--bottom-right {
125
+ display: none;
126
+ }
127
+
128
+ /* The vertical edges run the full height once no corner shares them. */
129
+ :host([placement="sidebar"]) .resize-handle--left,
130
+ :host([placement="sidebar"]) .resize-handle--right,
131
+ :host([placement="side"]) .resize-handle--left,
132
+ :host([placement="side"]) .resize-handle--right {
133
+ top: 0;
134
+ bottom: 0;
135
+ width: var(--_grip-edge-docked);
136
+ }
137
+
138
+ /* Full-bleed: nothing to drag. */
139
+ :host([placement="full"]) .resize-handle,
140
+ :host([placement="page"]) .resize-handle {
141
+ display: none;
142
+ }
143
+
144
+ /* The visible mark on a grip.
145
+
146
+ Filling the whole strip was what the single corner grip did, and at 14px
147
+ square nobody ever saw it. On a strip running the length of an edge the same
148
+ fill reads as a border the panel grew -- square ended, stopping short of the
149
+ corner radius at both ends, and easily mistaken for a rendering fault rather
150
+ than for something to grab.
151
+
152
+ So the hit area stays the full strip and the mark is a short pill centred on
153
+ it, which cannot be read as an edge of anything and never meets the radius.
154
+
155
+ It shows on hover and focus as well as during the drag. With eight grips, a
156
+ mark that appears only once you are already dragging is a mark that never
157
+ told anyone the grips were there. */
158
+ .resize-handle::after {
159
+ content: "";
160
+ position: absolute;
161
+ top: 50%;
162
+ left: 50%;
163
+ transform: translate(-50%, -50%);
164
+ border-radius: 999px;
165
+ background: var(--_accent);
166
+ opacity: 0;
167
+ transition: opacity var(--_motion) var(--_ease);
168
+ }
169
+
170
+ .resize-handle--top::after,
171
+ .resize-handle--bottom::after {
172
+ width: var(--_grip-mark-length);
173
+ height: var(--_grip-mark-thickness);
174
+ }
175
+
176
+ .resize-handle--left::after,
177
+ .resize-handle--right::after {
178
+ width: var(--_grip-mark-thickness);
179
+ height: var(--_grip-mark-length);
180
+ }
181
+
182
+ /* A corner has no length to run along, so it gets a dot instead of a pill. */
183
+ .resize-handle--top-left::after,
184
+ .resize-handle--top-right::after,
185
+ .resize-handle--bottom-left::after,
186
+ .resize-handle--bottom-right::after {
187
+ width: var(--_grip-mark-thickness);
188
+ height: var(--_grip-mark-thickness);
189
+ }
190
+
191
+ .resize-handle:hover::after,
192
+ .resize-handle:focus-visible::after {
193
+ opacity: 0.5;
194
+ }
195
+
196
+ /* Equal specificity to the pair above, so source order is what makes the drag
197
+ the stronger of the two states. */
198
+ .resize-handle[data-dragging]::after {
199
+ opacity: 0.9;
200
+ }
201
+ `;
@@ -0,0 +1,113 @@
1
+ // The sidebar placement: a docked full-height panel that slides to a rail.
2
+ export const SIDEBAR_STYLES: string = `
3
+ /* Sidebar: a full-height docked panel that slides open/closed and
4
+ collapses to a slim icon rail (not the floating launcher). Docked right by
5
+ default; data-side="left" docks it left. Overlay by default — set
6
+ --ag-ui-position: static (and place this element in your own layout) for a
7
+ host-managed push instead. */
8
+ :host([placement="sidebar"]) {
9
+ --_inset: var(--ag-ui-inset, calc(var(--_viewport-inset-top) + var(--_keyboard-inset-top)) var(--_viewport-inset-right) var(--_viewport-inset-bottom) auto);
10
+ --_width: var(--_drag-width, var(--ag-ui-width, 420px));
11
+ --_height: var(--ag-ui-height, var(--_viewport-height));
12
+ --_max-height: var(--ag-ui-max-height, var(--_viewport-height));
13
+ --_panel-radius: var(--ag-ui-panel-radius, 0);
14
+ transition: width var(--_motion) var(--_ease);
15
+ }
16
+
17
+ /* Maximized grows the column's width only: the host and the panel pinned
18
+ inside it, which reads its own width. */
19
+ :host([placement="sidebar"][maximized]:not([collapsed])),
20
+ :host([placement="sidebar"][maximized]:not([collapsed])) .chat {
21
+ width: var(--_maximized-width);
22
+ }
23
+
24
+ /* A side column leaves --ag-ui-min-page-width of the page beside it, whatever
25
+ its width came from: a drag, the token or maximize. Unset, the host keeps its
26
+ own cap (the fallback makes the second term endless) and the panel reads no
27
+ cap at all. Above the phone width only, where the column is the screen. */
28
+ @media (min-width: 601px) {
29
+ :host([placement="sidebar"]),
30
+ :host([placement="side"]) {
31
+ max-width: min(
32
+ var(--_max-width),
33
+ calc(var(--_viewport-width) - var(--_min-page-width-set, calc(-1px * infinity)))
34
+ );
35
+ }
36
+
37
+ :host([placement="sidebar"]) .chat {
38
+ max-width: calc(var(--_viewport-width) - var(--_min-page-width-set));
39
+ }
40
+ }
41
+
42
+ :host([placement="sidebar"][data-side="left"]) {
43
+ --_inset: var(
44
+ --ag-ui-inset,
45
+ calc(var(--_viewport-inset-top) + var(--_keyboard-inset-top)) auto var(--_viewport-inset-bottom)
46
+ var(--_viewport-inset-left)
47
+ );
48
+ }
49
+
50
+ /* The docked panel is pinned to the edge it docks against rather than filling
51
+ the host as a flex child. Collapsing shrinks the host to the rail width, and
52
+ a flex child would be squashed to 52px on the way out instead of sliding out
53
+ at full width. */
54
+ /* The panel is taken out of flow so the collapse can slide it out at full
55
+ width; see the note above. That makes the host its containing block, and the
56
+ host is only one by accident: it is position: fixed by default. A host that
57
+ takes the documented route to a pushed layout instead of an overlay sets
58
+ --ag-ui-position: static, and a static element establishes nothing -- so the
59
+ panel resolved against the initial containing block, landed at the document
60
+ origin, and scrolled away with the page. Docked left it pinned to the
61
+ document's left edge rather than the host's.
62
+
63
+ It looked correct wherever it was first tried, because a full-height column
64
+ at the top of an unscrolled document is exactly where those two answers
65
+ coincide. Containment makes the host a containing block whatever its
66
+ position, so the panel stays in the box the host was given. It is a no-op in
67
+ the default case, which is already positioned. */
68
+ :host([placement="sidebar"]) {
69
+ contain: layout;
70
+ }
71
+
72
+ :host([placement="sidebar"]) .chat {
73
+ position: absolute;
74
+ inset: 0 0 0 auto;
75
+ width: var(--_width);
76
+ transform-origin: right center;
77
+ }
78
+
79
+ :host([placement="sidebar"][data-side="left"]) .chat {
80
+ inset: 0 auto 0 0;
81
+ transform-origin: left center;
82
+ }
83
+
84
+ /* Collapsed sidebar: shrink the host to the rail width and slide the panel out
85
+ through the edge it docks against. Higher specificity than the generic
86
+ collapse rules, so it wins regardless of source order. */
87
+ /* The rail is the full height of what the host left, not of the screen. It
88
+ said 100vh and pinned its own bottom, which put it under any chrome the host
89
+ had reserved -- and the icon lives at the top of the rail, so the one control
90
+ that reopens the panel was the first thing to disappear behind a sticky
91
+ header. */
92
+ :host([placement="sidebar"][collapsed]) {
93
+ width: var(--_rail-width);
94
+ height: var(--_viewport-height);
95
+ max-height: var(--_viewport-height);
96
+ pointer-events: auto;
97
+ }
98
+
99
+ :host([placement="sidebar"][collapsed]) .chat {
100
+ transform: translateX(100%);
101
+ }
102
+
103
+ :host([placement="sidebar"][data-side="left"][collapsed]) .chat {
104
+ transform: translateX(-100%);
105
+ }
106
+
107
+ @media (prefers-reduced-motion: reduce) {
108
+ :host([placement="sidebar"]),
109
+ :host([placement="sidebar"]) .chat {
110
+ transition: none;
111
+ }
112
+ }
113
+ `;