@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,52 @@
1
+ // The approval card that gates a server-side tool call.
2
+ export const APPROVAL_STYLES: string = `
3
+ /* Approval card — the server-side-tool gate (approve/deny an interrupt). */
4
+ .approval {
5
+ align-self: stretch;
6
+ box-sizing: border-box;
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 8px;
10
+ padding: 12px;
11
+ background: var(--_bg);
12
+ border: 1px solid var(--_accent);
13
+ border-radius: 10px;
14
+ }
15
+
16
+ .approval[data-resolved] {
17
+ opacity: 0.7;
18
+ border-color: var(--_border);
19
+ }
20
+
21
+ .approval-body {
22
+ font-weight: 600;
23
+ }
24
+
25
+ .approval-actions {
26
+ display: flex;
27
+ gap: 8px;
28
+ justify-content: flex-end;
29
+ }
30
+
31
+ .approval-btn {
32
+ border: 1px solid var(--_border);
33
+ border-radius: 8px;
34
+ padding: 8px 14px;
35
+ font: inherit;
36
+ font-weight: 600;
37
+ cursor: pointer;
38
+ background: var(--_bg);
39
+ color: var(--_fg);
40
+ }
41
+
42
+ .approval-btn:disabled {
43
+ cursor: default;
44
+ opacity: 0.6;
45
+ }
46
+
47
+ .approval-btn--approve {
48
+ border-color: var(--_accent);
49
+ background: var(--_accent);
50
+ color: var(--_on-accent);
51
+ }
52
+ `;
@@ -0,0 +1,138 @@
1
+ import { fillUiString } from "../fill_ui_string.js";
2
+ import { DEFAULT_UI_STRINGS, type UiStrings } from "../ui_strings.js";
3
+
4
+ /** What the inline confirmation card displays. */
5
+ export interface ConfirmationRequest {
6
+ toolName: string;
7
+ args: Record<string, unknown>;
8
+ /**
9
+ * Human-readable prompt (from the tool's `x-confirm` metadata), e.g.
10
+ * "Activate this project?". Falls back to the generic `confirmRun` template.
11
+ */
12
+ message?: string;
13
+ }
14
+
15
+ /** Build a labelled action button. */
16
+ function actionButton(modifier: string, label: string): HTMLButtonElement {
17
+ const button = document.createElement("button");
18
+ button.type = "button";
19
+ button.className = `confirm-btn confirm-btn--${modifier}`;
20
+ button.setAttribute("part", `confirm-button confirm-${modifier}`);
21
+ button.textContent = label;
22
+ return button;
23
+ }
24
+
25
+ /** Options for {@link requestConfirmation}. */
26
+ export interface ConfirmationOptions {
27
+ /**
28
+ * Aborting this signal resolves the card as declined, with buttons disabled
29
+ * and `data-resolved="declined"` — how a Stop control dismisses a pending
30
+ * confirmation.
31
+ */
32
+ signal?: AbortSignal;
33
+ /** Localized strings; defaults to the English {@link DEFAULT_UI_STRINGS}. */
34
+ strings?: UiStrings;
35
+ /**
36
+ * Offer a third button — "always allow, this session" — and call this when
37
+ * the user picks it. The card still resolves `true`: the extra decision is
38
+ * *in addition to* approving this call, not instead of it.
39
+ *
40
+ * Absent means no button, which is deliberate: presence of the handler is
41
+ * what enables it, so the affordance can never be rendered with nothing
42
+ * listening. A caller that cannot honour the waiver simply does not pass one.
43
+ */
44
+ onAlwaysAllow?: () => void;
45
+ }
46
+
47
+ /**
48
+ * Append an inline confirmation card to `host` (the chat message list) and
49
+ * resolve `true` on confirm, `false` on cancel.
50
+ *
51
+ * The card lives in the transcript rather than in a modal overlay, so it reads
52
+ * after the assistant's explanation and never steals focus from the page.
53
+ *
54
+ * Answering it removes it: the record of the decision belongs to the tool card
55
+ * this gates, which settles to `done` or `declined` and carries it. A spent
56
+ * form left in place reads as still outstanding.
57
+ *
58
+ * With `onAlwaysAllow` set the card offers a third button. A prompt that is
59
+ * approved nearly every time is not a decision, it is a speed bump — and the
60
+ * reflex it trains is what makes the rare refusal easy to miss. Letting the
61
+ * user say "not this one again, this session" is the affordance that keeps the
62
+ * remaining prompts meaningful.
63
+ */
64
+ export function requestConfirmation(
65
+ host: Node & ParentNode,
66
+ request: ConfirmationRequest,
67
+ options: ConfirmationOptions = {},
68
+ ): Promise<boolean> {
69
+ const strings = options.strings ?? DEFAULT_UI_STRINGS;
70
+ return new Promise<boolean>((resolve) => {
71
+ const card = document.createElement("div");
72
+ card.className = "confirm";
73
+ card.setAttribute("part", "confirm");
74
+ card.setAttribute("data-tool-name", request.toolName);
75
+ card.setAttribute("role", "group");
76
+ card.setAttribute("aria-label", strings.confirmAction);
77
+
78
+ const body = document.createElement("div");
79
+ body.className = "confirm-body";
80
+ body.setAttribute("part", "confirm-body");
81
+ body.textContent =
82
+ request.message ?? fillUiString(strings.confirmRun, { tool: request.toolName });
83
+
84
+ const args = document.createElement("pre");
85
+ args.className = "confirm-args";
86
+ args.setAttribute("part", "confirm-args");
87
+ args.textContent = JSON.stringify(request.args, null, 2);
88
+ // A call with no arguments rendered the string "{}" in a box of its own.
89
+ args.hidden = Object.keys(request.args).length === 0;
90
+
91
+ const actions = document.createElement("div");
92
+ actions.className = "confirm-actions";
93
+ actions.setAttribute("part", "confirm-actions");
94
+
95
+ const cancel = actionButton("cancel", strings.cancel);
96
+ const always =
97
+ options.onAlwaysAllow === undefined
98
+ ? null
99
+ : actionButton("always", fillUiString(strings.confirmAlways, { tool: request.toolName }));
100
+ const confirm = actionButton("confirm", strings.confirm);
101
+
102
+ let settled = false;
103
+ const close = (accepted: boolean): void => {
104
+ if (settled) {
105
+ return;
106
+ }
107
+ settled = true;
108
+ // The prompt leaves once it has been answered. What stays is the tool
109
+ // card next to it, which settles to the outcome and scrolls with the rest
110
+ // of the transcript -- a record of the action rather than a spent form
111
+ // sitting there as a standing reminder of one.
112
+ card.remove();
113
+ resolve(accepted);
114
+ };
115
+
116
+ cancel.addEventListener("click", () => close(false));
117
+ confirm.addEventListener("click", () => close(true));
118
+ always?.addEventListener("click", () => {
119
+ // Recorded before resolving, so a caller that reads its own allowlist
120
+ // synchronously on the next call already sees this one.
121
+ options.onAlwaysAllow?.();
122
+ close(true);
123
+ });
124
+ options.signal?.addEventListener("abort", () => close(false), { once: true });
125
+
126
+ // Confirm stays last, and rightmost: the waiver is the wider decision, and
127
+ // putting it where the eye lands for "yes" is how it gets taken by accident.
128
+ actions.append(cancel, ...(always === null ? [] : [always]), confirm);
129
+ card.append(body, args, actions);
130
+ host.appendChild(card);
131
+ if (options.signal?.aborted === true) {
132
+ // The run was cancelled before the card could ask; record the decline.
133
+ close(false);
134
+ return;
135
+ }
136
+ confirm.focus();
137
+ });
138
+ }
@@ -0,0 +1,114 @@
1
+ // The confirmation card for a destructive client tool, and the editable
2
+ // arguments an approval shares with it.
3
+ export const CONFIRMATION_STYLES: string = `
4
+ /* Inline confirmation card — lives in the transcript, no focus-stealing overlay. */
5
+ .confirm {
6
+ align-self: stretch;
7
+ box-sizing: border-box;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 8px;
11
+ padding: 12px;
12
+ background: var(--_bg);
13
+ border: 1px solid var(--_accent);
14
+ border-radius: 10px;
15
+ }
16
+
17
+ .confirm[data-resolved] {
18
+ opacity: 0.7;
19
+ border-color: var(--_border);
20
+ }
21
+
22
+ .confirm-body {
23
+ font-weight: 600;
24
+ }
25
+
26
+ .confirm-args {
27
+ margin: 0;
28
+ padding: 8px 10px;
29
+ max-height: 140px;
30
+ overflow: auto;
31
+ font-size: 12px;
32
+ font-family: ui-monospace, "SF Mono", Menlo, monospace;
33
+ background: var(--_assistant-bg);
34
+ border-radius: 8px;
35
+ white-space: pre-wrap;
36
+ word-break: break-word;
37
+ }
38
+
39
+ .confirm-actions {
40
+ display: flex;
41
+ flex-wrap: wrap;
42
+ gap: 8px;
43
+ justify-content: flex-end;
44
+ }
45
+
46
+ .confirm-btn {
47
+ border: 1px solid var(--_border);
48
+ border-radius: 8px;
49
+ padding: 8px 14px;
50
+ font: inherit;
51
+ font-weight: 600;
52
+ cursor: pointer;
53
+ background: var(--_bg);
54
+ color: var(--_fg);
55
+ }
56
+
57
+ .confirm-btn:disabled {
58
+ cursor: default;
59
+ opacity: 0.6;
60
+ }
61
+
62
+ .confirm-btn--confirm {
63
+ border-color: var(--_accent);
64
+ background: var(--_accent);
65
+ color: var(--_on-accent);
66
+ }
67
+
68
+ /* The session waiver. Deliberately the quietest of the three: it is the widest
69
+ decision on the card, so it should be reachable without being the one the eye
70
+ lands on when the user means to say yes once. */
71
+ .confirm-btn--always {
72
+ font-weight: 500;
73
+ opacity: 0.85;
74
+ }
75
+
76
+ .confirm-btn--always:hover,
77
+ .confirm-btn--always:focus-visible {
78
+ opacity: 1;
79
+ }
80
+
81
+ /* Editable arguments on an approval card. A plain field rather than a code
82
+ editor: it holds the JSON a card already displays, and the only interaction
83
+ is correcting a value before letting the call run. */
84
+ .approval-edit {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 6px;
88
+ }
89
+
90
+ .approval-args {
91
+ box-sizing: border-box;
92
+ width: 100%;
93
+ resize: vertical;
94
+ border: 1px solid var(--_border);
95
+ border-radius: 8px;
96
+ padding: 8px;
97
+ font-family: ui-monospace, SFMono-Regular, Menlo, monospace;
98
+ font-size: 0.85em;
99
+ background: var(--_bg);
100
+ color: var(--_fg);
101
+ }
102
+
103
+ .approval-args:focus-visible {
104
+ border-color: var(--_accent);
105
+ outline: none;
106
+ }
107
+
108
+ .approval-error {
109
+ font-size: 0.85em;
110
+ color: var(--_danger);
111
+ }
112
+
113
+ /* Message action row. Sits under a finished assistant bubble.
114
+ `;
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The decision a run is suspended on, and the one way to abandon it.
3
+ *
4
+ * A run pauses on a person in three places -- a client-side confirmation, a
5
+ * batch of server interrupts, and the `ask_user` question -- and a Stop has to
6
+ * reach whichever of them is open. Holding the abort controller here gives
7
+ * it one owner: a wait opens, the Stop aborts what is open, and the wait closes
8
+ * when it is answered.
9
+ *
10
+ * Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
11
+ * instance.
12
+ */
13
+ export class PendingDecision {
14
+ // Aborting this dismisses (declines) an open confirmation card when the run
15
+ // is cancelled while the card awaits a decision. One controller per wait.
16
+ #controller: AbortController | null = null;
17
+
18
+ /** Start waiting on a person; aborting the returned signal abandons the wait. */
19
+ open(): AbortSignal {
20
+ this.#controller = new AbortController();
21
+ return this.#controller.signal;
22
+ }
23
+
24
+ /** The wait was answered; a later Stop has nothing of this wait's to abandon. */
25
+ close(): void {
26
+ this.#controller = null;
27
+ }
28
+
29
+ /** Abandon whatever wait is open, resolving it as declined. A no-op when none is. */
30
+ abort(): void {
31
+ this.#controller?.abort();
32
+ }
33
+ }
@@ -0,0 +1,213 @@
1
+ import { DEFAULT_UI_STRINGS, type UiStrings } from "../ui_strings.js";
2
+
3
+ /** What the inline question card asks (the `ask_user` frontend tool's args). */
4
+ export interface QuestionRequest {
5
+ /** The question shown to the user. */
6
+ question: string;
7
+ /**
8
+ * Preset choices rendered as radios. When empty/omitted the card is a plain
9
+ * free-text prompt.
10
+ */
11
+ options?: readonly string[];
12
+ /**
13
+ * Whether the user may type a custom answer. With `options`, adds an "other"
14
+ * radio revealing a text field; without options the card is free-text anyway.
15
+ */
16
+ allowCustom?: boolean;
17
+ }
18
+
19
+ /** Options for {@link requestQuestion}. */
20
+ export interface QuestionOptions {
21
+ /**
22
+ * Aborting this signal resolves the card with an empty answer and disabled
23
+ * fields — how a Stop control dismisses an open question.
24
+ */
25
+ signal?: AbortSignal;
26
+ /** Localized strings; defaults to the English {@link DEFAULT_UI_STRINGS}. */
27
+ strings?: UiStrings;
28
+ }
29
+
30
+ /**
31
+ * A fully custom renderer for the `ask_user` question, set via
32
+ * `AgUiChat.askUserRenderer`. Receives the parsed {@link QuestionRequest} and an
33
+ * `AbortSignal` that fires when the run is stopped, and resolves with the user's
34
+ * answer; an empty string means no answer. Replaces the built-in
35
+ * {@link requestQuestion} card entirely — see {@link ApprovalRenderer} for the
36
+ * same seam on approvals.
37
+ */
38
+ export type QuestionRenderer = (
39
+ request: QuestionRequest,
40
+ options: { signal: AbortSignal },
41
+ ) => Promise<string>;
42
+
43
+ /** A single custom-answer text field. */
44
+ function answerInput(placeholder: string): HTMLInputElement {
45
+ const input = document.createElement("input");
46
+ input.type = "text";
47
+ input.className = "question-input";
48
+ input.setAttribute("part", "question-input");
49
+ input.placeholder = placeholder;
50
+ return input;
51
+ }
52
+
53
+ /**
54
+ * Append an inline question card to `host` and resolve with the user's answer —
55
+ * the browser half of the built-in `ask_user` frontend tool.
56
+ *
57
+ * Collects a typed answer rather than the yes/no the confirmation and approval
58
+ * cards return: a radio pick from `options`, or free text when `allowCustom` is
59
+ * set or no `options` are given. Stays in the transcript as a resolved record,
60
+ * controls disabled and `data-resolved` set; a Stop while it is open resolves
61
+ * it with an empty string.
62
+ */
63
+ export function requestQuestion(
64
+ host: Node & ParentNode,
65
+ request: QuestionRequest,
66
+ options: QuestionOptions = {},
67
+ ): Promise<string> {
68
+ const strings = options.strings ?? DEFAULT_UI_STRINGS;
69
+ const choices = request.options ?? [];
70
+ const hasChoices = choices.length > 0;
71
+ // Free text is offered when there are no preset choices, or when custom
72
+ // answers are explicitly allowed alongside them (via an "other" radio).
73
+ const allowsText = !hasChoices || request.allowCustom === true;
74
+
75
+ return new Promise<string>((resolve) => {
76
+ const card = document.createElement("div");
77
+ card.className = "question";
78
+ card.setAttribute("part", "question");
79
+ card.setAttribute("role", "group");
80
+ card.setAttribute("aria-label", strings.askUserAction);
81
+
82
+ const body = document.createElement("div");
83
+ body.className = "question-body";
84
+ body.setAttribute("part", "question-body");
85
+ body.textContent = request.question;
86
+
87
+ const form = document.createElement("div");
88
+ form.className = "question-options";
89
+ form.setAttribute("part", "question-options");
90
+
91
+ // `name` scopes the radio group to this card so multiple open cards don't
92
+ // interfere; a per-card token keeps it unique without module state.
93
+ const group = `q-${choices.length}-${request.question.length}`;
94
+ const radios: HTMLInputElement[] = [];
95
+ for (const choice of choices) {
96
+ const label = document.createElement("label");
97
+ label.className = "question-choice";
98
+ label.setAttribute("part", "question-choice");
99
+ const radio = document.createElement("input");
100
+ radio.type = "radio";
101
+ radio.name = group;
102
+ radio.value = choice;
103
+ radio.setAttribute("part", "question-radio");
104
+ const text = document.createElement("span");
105
+ text.setAttribute("part", "question-choice-text");
106
+ text.textContent = choice;
107
+ label.append(radio, text);
108
+ form.appendChild(label);
109
+ radios.push(radio);
110
+ }
111
+
112
+ // The "other" radio (only alongside choices) toggles the free-text field.
113
+ let otherRadio: HTMLInputElement | null = null;
114
+ let input: HTMLInputElement | null = null;
115
+ if (allowsText) {
116
+ input = answerInput(strings.answerPlaceholder);
117
+ if (hasChoices) {
118
+ const label = document.createElement("label");
119
+ label.className = "question-choice";
120
+ label.setAttribute("part", "question-choice");
121
+ otherRadio = document.createElement("input");
122
+ otherRadio.type = "radio";
123
+ otherRadio.name = group;
124
+ otherRadio.value = "";
125
+ otherRadio.setAttribute("part", "question-radio");
126
+ const text = document.createElement("span");
127
+ text.setAttribute("part", "question-choice-text");
128
+ text.textContent = strings.otherOption;
129
+ label.append(otherRadio, text);
130
+ form.appendChild(label);
131
+ input.disabled = true;
132
+ }
133
+ form.appendChild(input);
134
+ }
135
+
136
+ const actions = document.createElement("div");
137
+ actions.className = "question-actions";
138
+ actions.setAttribute("part", "question-actions");
139
+ const submit = document.createElement("button");
140
+ submit.type = "button";
141
+ submit.className = "question-btn";
142
+ submit.setAttribute("part", "question-button");
143
+ submit.textContent = strings.submit;
144
+ actions.appendChild(submit);
145
+
146
+ let settled = false;
147
+ const answerFor = (): string | null => {
148
+ const picked = radios.find((r) => r.checked);
149
+ if (picked !== undefined) {
150
+ return picked.value;
151
+ }
152
+ if (input !== null && (otherRadio === null || otherRadio.checked)) {
153
+ const typed = input.value.trim();
154
+ return typed === "" ? null : typed;
155
+ }
156
+ return null;
157
+ };
158
+ const refresh = (): void => {
159
+ if (input !== null && otherRadio !== null) {
160
+ input.disabled = !otherRadio.checked;
161
+ }
162
+ submit.disabled = answerFor() === null;
163
+ };
164
+ const close = (answer: string): void => {
165
+ if (settled) {
166
+ return;
167
+ }
168
+ settled = true;
169
+ submit.disabled = true;
170
+ for (const radio of radios) {
171
+ radio.disabled = true;
172
+ }
173
+ if (otherRadio !== null) {
174
+ otherRadio.disabled = true;
175
+ }
176
+ if (input !== null) {
177
+ input.disabled = true;
178
+ }
179
+ card.setAttribute("data-resolved", answer === "" ? "cancelled" : "answered");
180
+ resolve(answer);
181
+ };
182
+
183
+ for (const radio of [...radios, ...(otherRadio !== null ? [otherRadio] : [])]) {
184
+ radio.addEventListener("change", refresh);
185
+ }
186
+ input?.addEventListener("input", refresh);
187
+ input?.addEventListener("keydown", (event) => {
188
+ if (event.key === "Enter") {
189
+ event.preventDefault();
190
+ const answer = answerFor();
191
+ if (answer !== null) {
192
+ close(answer);
193
+ }
194
+ }
195
+ });
196
+ submit.addEventListener("click", () => {
197
+ const answer = answerFor();
198
+ if (answer !== null) {
199
+ close(answer);
200
+ }
201
+ });
202
+ options.signal?.addEventListener("abort", () => close(""), { once: true });
203
+
204
+ card.append(body, form, actions);
205
+ host.appendChild(card);
206
+ if (options.signal?.aborted === true) {
207
+ close("");
208
+ return;
209
+ }
210
+ refresh();
211
+ (hasChoices ? radios[0] : input)?.focus();
212
+ });
213
+ }
@@ -0,0 +1,73 @@
1
+ // The question card the agent asks the user through.
2
+ export const QUESTION_STYLES: string = `
3
+ /* Question card — the built-in ask_user prompt (radios and/or free text). */
4
+ .question {
5
+ align-self: stretch;
6
+ box-sizing: border-box;
7
+ display: flex;
8
+ flex-direction: column;
9
+ gap: 8px;
10
+ padding: 12px;
11
+ background: var(--_bg);
12
+ border: 1px solid var(--_accent);
13
+ border-radius: 10px;
14
+ }
15
+
16
+ .question[data-resolved] {
17
+ opacity: 0.7;
18
+ border-color: var(--_border);
19
+ }
20
+
21
+ .question-body {
22
+ font-weight: 600;
23
+ }
24
+
25
+ .question-options {
26
+ display: flex;
27
+ flex-direction: column;
28
+ gap: 6px;
29
+ }
30
+
31
+ .question-choice {
32
+ display: flex;
33
+ align-items: center;
34
+ gap: 8px;
35
+ cursor: pointer;
36
+ }
37
+
38
+ .question-input {
39
+ box-sizing: border-box;
40
+ width: 100%;
41
+ padding: 8px 10px;
42
+ font: inherit;
43
+ color: var(--_fg);
44
+ background: var(--_bg);
45
+ border: 1px solid var(--_border);
46
+ border-radius: 8px;
47
+ }
48
+
49
+ .question-input:disabled {
50
+ opacity: 0.6;
51
+ }
52
+
53
+ .question-actions {
54
+ display: flex;
55
+ justify-content: flex-end;
56
+ }
57
+
58
+ .question-btn {
59
+ border: 1px solid var(--_accent);
60
+ border-radius: 8px;
61
+ padding: 8px 14px;
62
+ font: inherit;
63
+ font-weight: 600;
64
+ cursor: pointer;
65
+ background: var(--_accent);
66
+ color: var(--_on-accent);
67
+ }
68
+
69
+ .question-btn:disabled {
70
+ cursor: default;
71
+ opacity: 0.6;
72
+ }
73
+ `;
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Where in the host application the user is: the page, tab or record on
3
+ * screen. The chip in the composer draws it and the next round sends it as one
4
+ * context entry, both from the same read, so the place the user sees is the
5
+ * place the agent is told.
6
+ */
7
+ export interface Place {
8
+ /** Short name of the place, e.g. "Order #4821" or "Billing settings". */
9
+ readonly label: string;
10
+ /** A quieter second part, e.g. the section or the tab. */
11
+ readonly detail?: string;
12
+ /** An image URL for the chip's mark; a pin when absent. Never sent. */
13
+ readonly icon?: string;
14
+ /** Where the place lives. Sent to the agent, and what identifies the place. */
15
+ readonly href?: string;
16
+ }