@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.
- package/CHANGELOG.md +77 -0
- package/LICENSE +21 -0
- package/README.md +4397 -2
- package/dist/agents-web-components.bundle.js +5708 -0
- package/dist/agents-web-components.bundle.js.map +7 -0
- package/dist/bundle.d.ts +3 -0
- package/dist/bundle.d.ts.map +1 -0
- package/dist/chat.d.ts +3 -0
- package/dist/chat.d.ts.map +1 -0
- package/dist/chat.js +16373 -0
- package/dist/chat.js.map +7 -0
- package/dist/chunk-ARNLFGCC.js +7715 -0
- package/dist/chunk-ARNLFGCC.js.map +7 -0
- package/dist/constants.d.ts +575 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/core/activity_registration.d.ts +19 -0
- package/dist/core/activity_registration.d.ts.map +1 -0
- package/dist/core/activity_registry.d.ts +46 -0
- package/dist/core/activity_registry.d.ts.map +1 -0
- package/dist/core/activity_renderer.d.ts +20 -0
- package/dist/core/activity_renderer.d.ts.map +1 -0
- package/dist/core/ag_ui_chat.d.ts +836 -0
- package/dist/core/ag_ui_chat.d.ts.map +1 -0
- package/dist/core/agui_client.d.ts +370 -0
- package/dist/core/agui_client.d.ts.map +1 -0
- package/dist/core/attachment.d.ts +42 -0
- package/dist/core/attachment.d.ts.map +1 -0
- package/dist/core/chat_registry.d.ts +23 -0
- package/dist/core/chat_registry.d.ts.map +1 -0
- package/dist/core/client_seed.d.ts +27 -0
- package/dist/core/client_seed.d.ts.map +1 -0
- package/dist/core/conversation_store.d.ts +195 -0
- package/dist/core/conversation_store.d.ts.map +1 -0
- package/dist/core/create_http_agent.d.ts +57 -0
- package/dist/core/create_http_agent.d.ts.map +1 -0
- package/dist/core/define_chat.d.ts +13 -0
- package/dist/core/define_chat.d.ts.map +1 -0
- package/dist/core/events/attachments_detail.d.ts +9 -0
- package/dist/core/events/attachments_detail.d.ts.map +1 -0
- package/dist/core/events/bar_height_detail.d.ts +6 -0
- package/dist/core/events/bar_height_detail.d.ts.map +1 -0
- package/dist/core/events/custom_agent_detail.d.ts +8 -0
- package/dist/core/events/custom_agent_detail.d.ts.map +1 -0
- package/dist/core/events/dock_width_detail.d.ts +8 -0
- package/dist/core/events/dock_width_detail.d.ts.map +1 -0
- package/dist/core/events/feedback_detail.d.ts +28 -0
- package/dist/core/events/feedback_detail.d.ts.map +1 -0
- package/dist/core/events/invalidate_detail.d.ts +16 -0
- package/dist/core/events/invalidate_detail.d.ts.map +1 -0
- package/dist/core/events/maximize_detail.d.ts +5 -0
- package/dist/core/events/maximize_detail.d.ts.map +1 -0
- package/dist/core/events/run_finished_detail.d.ts +36 -0
- package/dist/core/events/run_finished_detail.d.ts.map +1 -0
- package/dist/core/events/state_detail.d.ts +5 -0
- package/dist/core/events/state_detail.d.ts.map +1 -0
- package/dist/core/events/submit_detail.d.ts +8 -0
- package/dist/core/events/submit_detail.d.ts.map +1 -0
- package/dist/core/events/thread_detail.d.ts +27 -0
- package/dist/core/events/thread_detail.d.ts.map +1 -0
- package/dist/core/events/thread_title_detail.d.ts +8 -0
- package/dist/core/events/thread_title_detail.d.ts.map +1 -0
- package/dist/core/events/toggle_detail.d.ts +5 -0
- package/dist/core/events/toggle_detail.d.ts.map +1 -0
- package/dist/core/events/tool_run.d.ts +11 -0
- package/dist/core/events/tool_run.d.ts.map +1 -0
- package/dist/core/events/unread_detail.d.ts +11 -0
- package/dist/core/events/unread_detail.d.ts.map +1 -0
- package/dist/core/message_role.d.ts +4 -0
- package/dist/core/message_role.d.ts.map +1 -0
- package/dist/core/read_flag.d.ts +11 -0
- package/dist/core/read_flag.d.ts.map +1 -0
- package/dist/core/read_json_attribute.d.ts +15 -0
- package/dist/core/read_json_attribute.d.ts.map +1 -0
- package/dist/core/read_max_tool_rounds.d.ts +9 -0
- package/dist/core/read_max_tool_rounds.d.ts.map +1 -0
- package/dist/core/remote_conversation_store.d.ts +71 -0
- package/dist/core/remote_conversation_store.d.ts.map +1 -0
- package/dist/core/run_handlers.d.ts +85 -0
- package/dist/core/run_handlers.d.ts.map +1 -0
- package/dist/core/run_index.d.ts +58 -0
- package/dist/core/run_index.d.ts.map +1 -0
- package/dist/core/storage_scope.d.ts +118 -0
- package/dist/core/storage_scope.d.ts.map +1 -0
- package/dist/core/tool_outcome.d.ts +27 -0
- package/dist/core/tool_outcome.d.ts.map +1 -0
- package/dist/core/transcribe_audio.d.ts +32 -0
- package/dist/core/transcribe_audio.d.ts.map +1 -0
- package/dist/core/upload_attachment.d.ts +44 -0
- package/dist/core/upload_attachment.d.ts.map +1 -0
- package/dist/core/utils.d.ts +117 -0
- package/dist/core/utils.d.ts.map +1 -0
- package/dist/dom/animations.d.ts +122 -0
- package/dist/dom/animations.d.ts.map +1 -0
- package/dist/dom/dom_driver.d.ts +28 -0
- package/dist/dom/dom_driver.d.ts.map +1 -0
- package/dist/dom/highlight_overlay.d.ts +39 -0
- package/dist/dom/highlight_overlay.d.ts.map +1 -0
- package/dist/dom/native_setter.d.ts +5 -0
- package/dist/dom/native_setter.d.ts.map +1 -0
- package/dist/dom/ring_color.d.ts +16 -0
- package/dist/dom/ring_color.d.ts.map +1 -0
- package/dist/dom/utils.d.ts +3 -0
- package/dist/dom/utils.d.ts.map +1 -0
- package/dist/index.d.ts +62 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +223 -0
- package/dist/index.js.map +7 -0
- package/dist/skills/fill_template.d.ts +16 -0
- package/dist/skills/fill_template.d.ts.map +1 -0
- package/dist/skills/parse_skills.d.ts +8 -0
- package/dist/skills/parse_skills.d.ts.map +1 -0
- package/dist/skills/skill.d.ts +33 -0
- package/dist/skills/skill.d.ts.map +1 -0
- package/dist/skills/skill_catalog.d.ts +69 -0
- package/dist/skills/skill_catalog.d.ts.map +1 -0
- package/dist/skills/skill_name_from.d.ts +12 -0
- package/dist/skills/skill_name_from.d.ts.map +1 -0
- package/dist/tools/chat_surface_tools.d.ts +77 -0
- package/dist/tools/chat_surface_tools.d.ts.map +1 -0
- package/dist/tools/client_tool_registry.d.ts +58 -0
- package/dist/tools/client_tool_registry.d.ts.map +1 -0
- package/dist/tools/is_destructive.d.ts +14 -0
- package/dist/tools/is_destructive.d.ts.map +1 -0
- package/dist/tools/is_navigates.d.ts +9 -0
- package/dist/tools/is_navigates.d.ts.map +1 -0
- package/dist/tools/page_action_tools.d.ts +30 -0
- package/dist/tools/page_action_tools.d.ts.map +1 -0
- package/dist/tools/page_map.d.ts +16 -0
- package/dist/tools/page_map.d.ts.map +1 -0
- package/dist/tools/page_state.d.ts +27 -0
- package/dist/tools/page_state.d.ts.map +1 -0
- package/dist/tools/parse_tool_catalog.d.ts +21 -0
- package/dist/tools/parse_tool_catalog.d.ts.map +1 -0
- package/dist/tools/route_map.d.ts +37 -0
- package/dist/tools/route_map.d.ts.map +1 -0
- package/dist/tools/tool_catalog.d.ts +86 -0
- package/dist/tools/tool_catalog.d.ts.map +1 -0
- package/dist/tools/tool_dispatch.d.ts +82 -0
- package/dist/tools/tool_dispatch.d.ts.map +1 -0
- package/dist/ui/charts/chart_block.d.ts +57 -0
- package/dist/ui/charts/chart_block.d.ts.map +1 -0
- package/dist/ui/charts/chart_spec_from.d.ts +12 -0
- package/dist/ui/charts/chart_spec_from.d.ts.map +1 -0
- package/dist/ui/charts/chart_styles.d.ts +2 -0
- package/dist/ui/charts/chart_styles.d.ts.map +1 -0
- package/dist/ui/charts/chart_tool.d.ts +15 -0
- package/dist/ui/charts/chart_tool.d.ts.map +1 -0
- package/dist/ui/composer/attachment_styles.d.ts +2 -0
- package/dist/ui/composer/attachment_styles.d.ts.map +1 -0
- package/dist/ui/composer/attachment_tray.d.ts +53 -0
- package/dist/ui/composer/attachment_tray.d.ts.map +1 -0
- package/dist/ui/composer/auto_grow.d.ts +10 -0
- package/dist/ui/composer/auto_grow.d.ts.map +1 -0
- package/dist/ui/composer/build_composer.d.ts +32 -0
- package/dist/ui/composer/build_composer.d.ts.map +1 -0
- package/dist/ui/composer/composer_attachments.d.ts +57 -0
- package/dist/ui/composer/composer_attachments.d.ts.map +1 -0
- package/dist/ui/composer/composer_styles.d.ts +2 -0
- package/dist/ui/composer/composer_styles.d.ts.map +1 -0
- package/dist/ui/composer/composer_voice.d.ts +48 -0
- package/dist/ui/composer/composer_voice.d.ts.map +1 -0
- package/dist/ui/composer/skill_styles.d.ts +2 -0
- package/dist/ui/composer/skill_styles.d.ts.map +1 -0
- package/dist/ui/composer/skills_menu.d.ts +34 -0
- package/dist/ui/composer/skills_menu.d.ts.map +1 -0
- package/dist/ui/composer/voice_input.d.ts +46 -0
- package/dist/ui/composer/voice_input.d.ts.map +1 -0
- package/dist/ui/excerpts/attach_copy_buttons.d.ts +13 -0
- package/dist/ui/excerpts/attach_copy_buttons.d.ts.map +1 -0
- package/dist/ui/excerpts/copy_payload.d.ts +30 -0
- package/dist/ui/excerpts/copy_payload.d.ts.map +1 -0
- package/dist/ui/excerpts/page_quote_offer.d.ts +33 -0
- package/dist/ui/excerpts/page_quote_offer.d.ts.map +1 -0
- package/dist/ui/excerpts/place_offer.d.ts +9 -0
- package/dist/ui/excerpts/place_offer.d.ts.map +1 -0
- package/dist/ui/excerpts/quote_selection.d.ts +66 -0
- package/dist/ui/excerpts/quote_selection.d.ts.map +1 -0
- package/dist/ui/excerpts/transcript_quote_offer.d.ts +57 -0
- package/dist/ui/excerpts/transcript_quote_offer.d.ts.map +1 -0
- package/dist/ui/fill_ui_string.d.ts +32 -0
- package/dist/ui/fill_ui_string.d.ts.map +1 -0
- package/dist/ui/history/checkpoint_menu.d.ts +41 -0
- package/dist/ui/history/checkpoint_menu.d.ts.map +1 -0
- package/dist/ui/history/conversation_history.d.ts +317 -0
- package/dist/ui/history/conversation_history.d.ts.map +1 -0
- package/dist/ui/history/history_styles.d.ts +2 -0
- package/dist/ui/history/history_styles.d.ts.map +1 -0
- package/dist/ui/history/relative_time.d.ts +23 -0
- package/dist/ui/history/relative_time.d.ts.map +1 -0
- package/dist/ui/history/thread_drawer.d.ts +64 -0
- package/dist/ui/history/thread_drawer.d.ts.map +1 -0
- package/dist/ui/history/utils.d.ts +2 -0
- package/dist/ui/history/utils.d.ts.map +1 -0
- package/dist/ui/interrupts/approval_card.d.ts +64 -0
- package/dist/ui/interrupts/approval_card.d.ts.map +1 -0
- package/dist/ui/interrupts/approval_styles.d.ts +2 -0
- package/dist/ui/interrupts/approval_styles.d.ts.map +1 -0
- package/dist/ui/interrupts/confirmation_card.d.ts +51 -0
- package/dist/ui/interrupts/confirmation_card.d.ts.map +1 -0
- package/dist/ui/interrupts/confirmation_styles.d.ts +2 -0
- package/dist/ui/interrupts/confirmation_styles.d.ts.map +1 -0
- package/dist/ui/interrupts/pending_decision.d.ts +22 -0
- package/dist/ui/interrupts/pending_decision.d.ts.map +1 -0
- package/dist/ui/interrupts/question_card.d.ts +49 -0
- package/dist/ui/interrupts/question_card.d.ts.map +1 -0
- package/dist/ui/interrupts/question_styles.d.ts +2 -0
- package/dist/ui/interrupts/question_styles.d.ts.map +1 -0
- package/dist/ui/place/place.d.ts +17 -0
- package/dist/ui/place/place.d.ts.map +1 -0
- package/dist/ui/place/place_chip.d.ts +26 -0
- package/dist/ui/place/place_chip.d.ts.map +1 -0
- package/dist/ui/place/place_from_route.d.ts +9 -0
- package/dist/ui/place/place_from_route.d.ts.map +1 -0
- package/dist/ui/place/place_styles.d.ts +2 -0
- package/dist/ui/place/place_styles.d.ts.map +1 -0
- package/dist/ui/placement/clamp_launcher.d.ts +20 -0
- package/dist/ui/placement/clamp_launcher.d.ts.map +1 -0
- package/dist/ui/placement/clamp_panel.d.ts +13 -0
- package/dist/ui/placement/clamp_panel.d.ts.map +1 -0
- package/dist/ui/placement/collapse_styles.d.ts +2 -0
- package/dist/ui/placement/collapse_styles.d.ts.map +1 -0
- package/dist/ui/placement/dock_styles.d.ts +2 -0
- package/dist/ui/placement/dock_styles.d.ts.map +1 -0
- package/dist/ui/placement/embedded_styles.d.ts +2 -0
- package/dist/ui/placement/embedded_styles.d.ts.map +1 -0
- package/dist/ui/placement/launcher_drag.d.ts +49 -0
- package/dist/ui/placement/launcher_drag.d.ts.map +1 -0
- package/dist/ui/placement/launcher_placement.d.ts +77 -0
- package/dist/ui/placement/launcher_placement.d.ts.map +1 -0
- package/dist/ui/placement/launcher_styles.d.ts +2 -0
- package/dist/ui/placement/launcher_styles.d.ts.map +1 -0
- package/dist/ui/placement/page_styles.d.ts +2 -0
- package/dist/ui/placement/page_styles.d.ts.map +1 -0
- package/dist/ui/placement/panel_drag.d.ts +40 -0
- package/dist/ui/placement/panel_drag.d.ts.map +1 -0
- package/dist/ui/placement/panel_placement.d.ts +173 -0
- package/dist/ui/placement/panel_placement.d.ts.map +1 -0
- package/dist/ui/placement/place_widget.d.ts +31 -0
- package/dist/ui/placement/place_widget.d.ts.map +1 -0
- package/dist/ui/placement/preset_styles.d.ts +2 -0
- package/dist/ui/placement/preset_styles.d.ts.map +1 -0
- package/dist/ui/placement/resize_handle.d.ts +78 -0
- package/dist/ui/placement/resize_handle.d.ts.map +1 -0
- package/dist/ui/placement/resize_styles.d.ts +2 -0
- package/dist/ui/placement/resize_styles.d.ts.map +1 -0
- package/dist/ui/placement/sidebar_styles.d.ts +2 -0
- package/dist/ui/placement/sidebar_styles.d.ts.map +1 -0
- package/dist/ui/placement/small_viewport_styles.d.ts +2 -0
- package/dist/ui/placement/small_viewport_styles.d.ts.map +1 -0
- package/dist/ui/placement/surface_for.d.ts +93 -0
- package/dist/ui/placement/surface_for.d.ts.map +1 -0
- package/dist/ui/progress/prettify_tool_name.d.ts +11 -0
- package/dist/ui/progress/prettify_tool_name.d.ts.map +1 -0
- package/dist/ui/progress/run_announcer.d.ts +41 -0
- package/dist/ui/progress/run_announcer.d.ts.map +1 -0
- package/dist/ui/progress/run_notice.d.ts +21 -0
- package/dist/ui/progress/run_notice.d.ts.map +1 -0
- package/dist/ui/progress/run_notice_styles.d.ts +2 -0
- package/dist/ui/progress/run_notice_styles.d.ts.map +1 -0
- package/dist/ui/progress/subagent_panel.d.ts +101 -0
- package/dist/ui/progress/subagent_panel.d.ts.map +1 -0
- package/dist/ui/progress/subagent_progress.d.ts +57 -0
- package/dist/ui/progress/subagent_progress.d.ts.map +1 -0
- package/dist/ui/progress/subagent_update.d.ts +28 -0
- package/dist/ui/progress/subagent_update.d.ts.map +1 -0
- package/dist/ui/progress/thoughts_block.d.ts +57 -0
- package/dist/ui/progress/thoughts_block.d.ts.map +1 -0
- package/dist/ui/progress/thoughts_styles.d.ts +2 -0
- package/dist/ui/progress/thoughts_styles.d.ts.map +1 -0
- package/dist/ui/progress/tool_call_card.d.ts +167 -0
- package/dist/ui/progress/tool_call_card.d.ts.map +1 -0
- package/dist/ui/progress/tool_group_styles.d.ts +2 -0
- package/dist/ui/progress/tool_group_styles.d.ts.map +1 -0
- package/dist/ui/progress/tool_step_group.d.ts +50 -0
- package/dist/ui/progress/tool_step_group.d.ts.map +1 -0
- package/dist/ui/progress/tool_step_styles.d.ts +2 -0
- package/dist/ui/progress/tool_step_styles.d.ts.map +1 -0
- package/dist/ui/shell/adopt_styles.d.ts +28 -0
- package/dist/ui/shell/adopt_styles.d.ts.map +1 -0
- package/dist/ui/shell/build_header.d.ts +45 -0
- package/dist/ui/shell/build_header.d.ts.map +1 -0
- package/dist/ui/shell/build_launcher.d.ts +33 -0
- package/dist/ui/shell/build_launcher.d.ts.map +1 -0
- package/dist/ui/shell/collapse_glyph.d.ts +14 -0
- package/dist/ui/shell/collapse_glyph.d.ts.map +1 -0
- package/dist/ui/shell/frame_styles.d.ts +2 -0
- package/dist/ui/shell/frame_styles.d.ts.map +1 -0
- package/dist/ui/shell/glyph_slot.d.ts +7 -0
- package/dist/ui/shell/glyph_slot.d.ts.map +1 -0
- package/dist/ui/shell/header_button.d.ts +11 -0
- package/dist/ui/shell/header_button.d.ts.map +1 -0
- package/dist/ui/shell/icon_element.d.ts +12 -0
- package/dist/ui/shell/icon_element.d.ts.map +1 -0
- package/dist/ui/shell/is_unread_badge_enabled.d.ts +10 -0
- package/dist/ui/shell/is_unread_badge_enabled.d.ts.map +1 -0
- package/dist/ui/shell/read_launcher_icon_url.d.ts +8 -0
- package/dist/ui/shell/read_launcher_icon_url.d.ts.map +1 -0
- package/dist/ui/shell/theme_styles.d.ts +2 -0
- package/dist/ui/shell/theme_styles.d.ts.map +1 -0
- package/dist/ui/shell/token_styles.d.ts +2 -0
- package/dist/ui/shell/token_styles.d.ts.map +1 -0
- package/dist/ui/styles.d.ts +2 -0
- package/dist/ui/styles.d.ts.map +1 -0
- package/dist/ui/themes/classic_styles.d.ts +2 -0
- package/dist/ui/themes/classic_styles.d.ts.map +1 -0
- package/dist/ui/themes/classic_tokens.d.ts +2 -0
- package/dist/ui/themes/classic_tokens.d.ts.map +1 -0
- package/dist/ui/themes/code_tokens.d.ts +2 -0
- package/dist/ui/themes/code_tokens.d.ts.map +1 -0
- package/dist/ui/themes/ledger_styles.d.ts +2 -0
- package/dist/ui/themes/ledger_styles.d.ts.map +1 -0
- package/dist/ui/themes/ledger_tokens.d.ts +2 -0
- package/dist/ui/themes/ledger_tokens.d.ts.map +1 -0
- package/dist/ui/themes/modern_styles.d.ts +2 -0
- package/dist/ui/themes/modern_styles.d.ts.map +1 -0
- package/dist/ui/themes/quiet_styles.d.ts +2 -0
- package/dist/ui/themes/quiet_styles.d.ts.map +1 -0
- package/dist/ui/themes/scheme_styles.d.ts +2 -0
- package/dist/ui/themes/scheme_styles.d.ts.map +1 -0
- package/dist/ui/themes/soft_styles.d.ts +2 -0
- package/dist/ui/themes/soft_styles.d.ts.map +1 -0
- package/dist/ui/themes/soft_tokens.d.ts +2 -0
- package/dist/ui/themes/soft_tokens.d.ts.map +1 -0
- package/dist/ui/themes/theme_hosts.d.ts +15 -0
- package/dist/ui/themes/theme_hosts.d.ts.map +1 -0
- package/dist/ui/transcript/answer_actions.d.ts +50 -0
- package/dist/ui/transcript/answer_actions.d.ts.map +1 -0
- package/dist/ui/transcript/answer_stream.d.ts +56 -0
- package/dist/ui/transcript/answer_stream.d.ts.map +1 -0
- package/dist/ui/transcript/attachment_chip_styles.d.ts +2 -0
- package/dist/ui/transcript/attachment_chip_styles.d.ts.map +1 -0
- package/dist/ui/transcript/attachment_chips.d.ts +21 -0
- package/dist/ui/transcript/attachment_chips.d.ts.map +1 -0
- package/dist/ui/transcript/build_transcript.d.ts +21 -0
- package/dist/ui/transcript/build_transcript.d.ts.map +1 -0
- package/dist/ui/transcript/greeting_styles.d.ts +2 -0
- package/dist/ui/transcript/greeting_styles.d.ts.map +1 -0
- package/dist/ui/transcript/groups_tool_steps.d.ts +13 -0
- package/dist/ui/transcript/groups_tool_steps.d.ts.map +1 -0
- package/dist/ui/transcript/message_action_styles.d.ts +2 -0
- package/dist/ui/transcript/message_action_styles.d.ts.map +1 -0
- package/dist/ui/transcript/message_actions.d.ts +74 -0
- package/dist/ui/transcript/message_actions.d.ts.map +1 -0
- package/dist/ui/transcript/message_styles.d.ts +2 -0
- package/dist/ui/transcript/message_styles.d.ts.map +1 -0
- package/dist/ui/transcript/render_markdown.d.ts +40 -0
- package/dist/ui/transcript/render_markdown.d.ts.map +1 -0
- package/dist/ui/transcript/render_or_warn.d.ts +16 -0
- package/dist/ui/transcript/render_or_warn.d.ts.map +1 -0
- package/dist/ui/transcript/reveal_words.d.ts +8 -0
- package/dist/ui/transcript/reveal_words.d.ts.map +1 -0
- package/dist/ui/transcript/starter_chips.d.ts +21 -0
- package/dist/ui/transcript/starter_chips.d.ts.map +1 -0
- package/dist/ui/transcript/stick_to_bottom.d.ts +55 -0
- package/dist/ui/transcript/stick_to_bottom.d.ts.map +1 -0
- package/dist/ui/transcript/suggestion_chips.d.ts +29 -0
- package/dist/ui/transcript/suggestion_chips.d.ts.map +1 -0
- package/dist/ui/transcript/transcript.d.ts +196 -0
- package/dist/ui/transcript/transcript.d.ts.map +1 -0
- package/dist/ui/transcript/transcript_styles.d.ts +2 -0
- package/dist/ui/transcript/transcript_styles.d.ts.map +1 -0
- package/dist/ui/ui_strings.d.ts +352 -0
- package/dist/ui/ui_strings.d.ts.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/package.json +86 -3
- package/src/bundle.ts +2 -0
- package/src/chat.ts +2 -0
- package/src/constants.ts +650 -0
- package/src/core/activity_registration.ts +19 -0
- package/src/core/activity_registry.ts +133 -0
- package/src/core/activity_renderer.ts +19 -0
- package/src/core/ag_ui_chat.ts +3966 -0
- package/src/core/agui_client.ts +1028 -0
- package/src/core/attachment.ts +62 -0
- package/src/core/chat_registry.ts +53 -0
- package/src/core/client_seed.ts +27 -0
- package/src/core/conversation_store.ts +478 -0
- package/src/core/create_http_agent.ts +97 -0
- package/src/core/define_chat.ts +25 -0
- package/src/core/events/attachments_detail.ts +9 -0
- package/src/core/events/bar_height_detail.ts +5 -0
- package/src/core/events/custom_agent_detail.ts +7 -0
- package/src/core/events/dock_width_detail.ts +7 -0
- package/src/core/events/feedback_detail.ts +27 -0
- package/src/core/events/invalidate_detail.ts +15 -0
- package/src/core/events/maximize_detail.ts +4 -0
- package/src/core/events/run_finished_detail.ts +36 -0
- package/src/core/events/state_detail.ts +4 -0
- package/src/core/events/submit_detail.ts +8 -0
- package/src/core/events/thread_detail.ts +26 -0
- package/src/core/events/thread_title_detail.ts +7 -0
- package/src/core/events/toggle_detail.ts +4 -0
- package/src/core/events/tool_run.ts +10 -0
- package/src/core/events/unread_detail.ts +10 -0
- package/src/core/message_role.ts +4 -0
- package/src/core/read_flag.ts +13 -0
- package/src/core/read_json_attribute.ts +30 -0
- package/src/core/read_max_tool_rounds.ts +13 -0
- package/src/core/remote_conversation_store.ts +279 -0
- package/src/core/run_handlers.ts +524 -0
- package/src/core/run_index.ts +114 -0
- package/src/core/storage_scope.ts +291 -0
- package/src/core/tool_outcome.ts +39 -0
- package/src/core/transcribe_audio.ts +76 -0
- package/src/core/upload_attachment.ts +130 -0
- package/src/core/utils.ts +230 -0
- package/src/dom/animations.ts +341 -0
- package/src/dom/dom_driver.ts +91 -0
- package/src/dom/highlight_overlay.ts +204 -0
- package/src/dom/native_setter.ts +40 -0
- package/src/dom/ring_color.ts +206 -0
- package/src/dom/utils.ts +5 -0
- package/src/index.ts +220 -0
- package/src/skills/fill_template.ts +31 -0
- package/src/skills/parse_skills.ts +31 -0
- package/src/skills/skill.ts +32 -0
- package/src/skills/skill_catalog.ts +172 -0
- package/src/skills/skill_name_from.ts +19 -0
- package/src/tools/chat_surface_tools.ts +183 -0
- package/src/tools/client_tool_registry.ts +80 -0
- package/src/tools/is_destructive.ts +17 -0
- package/src/tools/is_navigates.ts +12 -0
- package/src/tools/page_action_tools.ts +123 -0
- package/src/tools/page_map.ts +26 -0
- package/src/tools/page_state.ts +57 -0
- package/src/tools/parse_tool_catalog.ts +41 -0
- package/src/tools/route_map.ts +132 -0
- package/src/tools/tool_catalog.ts +334 -0
- package/src/tools/tool_dispatch.ts +453 -0
- package/src/ui/charts/chart_block.ts +519 -0
- package/src/ui/charts/chart_spec_from.ts +125 -0
- package/src/ui/charts/chart_styles.ts +63 -0
- package/src/ui/charts/chart_tool.ts +72 -0
- package/src/ui/composer/attachment_styles.ts +71 -0
- package/src/ui/composer/attachment_tray.ts +295 -0
- package/src/ui/composer/auto_grow.ts +12 -0
- package/src/ui/composer/build_composer.ts +114 -0
- package/src/ui/composer/composer_attachments.ts +324 -0
- package/src/ui/composer/composer_styles.ts +177 -0
- package/src/ui/composer/composer_voice.ts +93 -0
- package/src/ui/composer/skill_styles.ts +120 -0
- package/src/ui/composer/skills_menu.ts +188 -0
- package/src/ui/composer/voice_input.ts +282 -0
- package/src/ui/excerpts/attach_copy_buttons.ts +73 -0
- package/src/ui/excerpts/copy_payload.ts +156 -0
- package/src/ui/excerpts/page_quote_offer.ts +203 -0
- package/src/ui/excerpts/place_offer.ts +24 -0
- package/src/ui/excerpts/quote_selection.ts +345 -0
- package/src/ui/excerpts/transcript_quote_offer.ts +175 -0
- package/src/ui/fill_ui_string.ts +41 -0
- package/src/ui/history/checkpoint_menu.ts +300 -0
- package/src/ui/history/conversation_history.ts +1169 -0
- package/src/ui/history/history_styles.ts +492 -0
- package/src/ui/history/relative_time.ts +50 -0
- package/src/ui/history/thread_drawer.ts +471 -0
- package/src/ui/history/utils.ts +11 -0
- package/src/ui/interrupts/approval_card.ts +202 -0
- package/src/ui/interrupts/approval_styles.ts +52 -0
- package/src/ui/interrupts/confirmation_card.ts +138 -0
- package/src/ui/interrupts/confirmation_styles.ts +114 -0
- package/src/ui/interrupts/pending_decision.ts +33 -0
- package/src/ui/interrupts/question_card.ts +213 -0
- package/src/ui/interrupts/question_styles.ts +73 -0
- package/src/ui/place/place.ts +16 -0
- package/src/ui/place/place_chip.ts +146 -0
- package/src/ui/place/place_from_route.ts +27 -0
- package/src/ui/place/place_styles.ts +108 -0
- package/src/ui/placement/clamp_launcher.ts +38 -0
- package/src/ui/placement/clamp_panel.ts +30 -0
- package/src/ui/placement/collapse_styles.ts +472 -0
- package/src/ui/placement/dock_styles.ts +116 -0
- package/src/ui/placement/embedded_styles.ts +14 -0
- package/src/ui/placement/launcher_drag.ts +206 -0
- package/src/ui/placement/launcher_placement.ts +133 -0
- package/src/ui/placement/launcher_styles.ts +189 -0
- package/src/ui/placement/page_styles.ts +47 -0
- package/src/ui/placement/panel_drag.ts +138 -0
- package/src/ui/placement/panel_placement.ts +1975 -0
- package/src/ui/placement/place_widget.ts +64 -0
- package/src/ui/placement/preset_styles.ts +49 -0
- package/src/ui/placement/resize_handle.ts +229 -0
- package/src/ui/placement/resize_styles.ts +201 -0
- package/src/ui/placement/sidebar_styles.ts +113 -0
- package/src/ui/placement/small_viewport_styles.ts +70 -0
- package/src/ui/placement/surface_for.ts +183 -0
- package/src/ui/progress/prettify_tool_name.ts +16 -0
- package/src/ui/progress/run_announcer.ts +67 -0
- package/src/ui/progress/run_notice.ts +61 -0
- package/src/ui/progress/run_notice_styles.ts +52 -0
- package/src/ui/progress/subagent_panel.ts +227 -0
- package/src/ui/progress/subagent_progress.ts +200 -0
- package/src/ui/progress/subagent_update.ts +89 -0
- package/src/ui/progress/thoughts_block.ts +165 -0
- package/src/ui/progress/thoughts_styles.ts +74 -0
- package/src/ui/progress/tool_call_card.ts +429 -0
- package/src/ui/progress/tool_group_styles.ts +313 -0
- package/src/ui/progress/tool_step_group.ts +317 -0
- package/src/ui/progress/tool_step_styles.ts +486 -0
- package/src/ui/shell/adopt_styles.ts +34 -0
- package/src/ui/shell/build_header.ts +121 -0
- package/src/ui/shell/build_launcher.ts +79 -0
- package/src/ui/shell/collapse_glyph.ts +42 -0
- package/src/ui/shell/frame_styles.ts +147 -0
- package/src/ui/shell/glyph_slot.ts +12 -0
- package/src/ui/shell/header_button.ts +22 -0
- package/src/ui/shell/icon_element.ts +33 -0
- package/src/ui/shell/is_unread_badge_enabled.ts +11 -0
- package/src/ui/shell/read_launcher_icon_url.ts +9 -0
- package/src/ui/shell/theme_styles.ts +11 -0
- package/src/ui/shell/token_styles.ts +480 -0
- package/src/ui/styles.ts +110 -0
- package/src/ui/themes/classic_styles.ts +32 -0
- package/src/ui/themes/classic_tokens.ts +51 -0
- package/src/ui/themes/code_tokens.ts +21 -0
- package/src/ui/themes/ledger_styles.ts +169 -0
- package/src/ui/themes/ledger_tokens.ts +33 -0
- package/src/ui/themes/modern_styles.ts +80 -0
- package/src/ui/themes/quiet_styles.ts +118 -0
- package/src/ui/themes/scheme_styles.ts +26 -0
- package/src/ui/themes/soft_styles.ts +149 -0
- package/src/ui/themes/soft_tokens.ts +29 -0
- package/src/ui/themes/theme_hosts.ts +14 -0
- package/src/ui/transcript/answer_actions.ts +165 -0
- package/src/ui/transcript/answer_stream.ts +123 -0
- package/src/ui/transcript/attachment_chip_styles.ts +116 -0
- package/src/ui/transcript/attachment_chips.ts +82 -0
- package/src/ui/transcript/build_transcript.ts +67 -0
- package/src/ui/transcript/greeting_styles.ts +171 -0
- package/src/ui/transcript/groups_tool_steps.ts +16 -0
- package/src/ui/transcript/message_action_styles.ts +155 -0
- package/src/ui/transcript/message_actions.ts +234 -0
- package/src/ui/transcript/message_styles.ts +262 -0
- package/src/ui/transcript/render_markdown.ts +181 -0
- package/src/ui/transcript/render_or_warn.ts +22 -0
- package/src/ui/transcript/reveal_words.ts +41 -0
- package/src/ui/transcript/starter_chips.ts +42 -0
- package/src/ui/transcript/stick_to_bottom.ts +126 -0
- package/src/ui/transcript/suggestion_chips.ts +73 -0
- package/src/ui/transcript/transcript.ts +555 -0
- package/src/ui/transcript/transcript_styles.ts +153 -0
- package/src/ui/ui_strings.ts +550 -0
- 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
|
+
}
|