@artooi/agents-web-components 0.0.0-stage → 0.1.0
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 +68 -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,31 @@
|
|
|
1
|
+
/** Result of {@link fillTemplate}: the filled text plus any unresolved keys. */
|
|
2
|
+
export interface TemplateResult {
|
|
3
|
+
/** The prompt with resolved `{placeholder}`s substituted. */
|
|
4
|
+
readonly text: string;
|
|
5
|
+
/** Placeholder names with no value available (deduped, in first-seen order). */
|
|
6
|
+
readonly missing: readonly string[];
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
const PLACEHOLDER_RE = /\{([a-zA-Z_][a-zA-Z0-9_]*)\}/g;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Substitute `{name}` placeholders in `template` from `values`.
|
|
13
|
+
*
|
|
14
|
+
* A placeholder whose value is missing, `null`, or an empty string is left
|
|
15
|
+
* verbatim and reported in `missing`, so the caller can block the send rather
|
|
16
|
+
* than dispatch a half-filled prompt.
|
|
17
|
+
*/
|
|
18
|
+
export function fillTemplate(template: string, values: Record<string, unknown>): TemplateResult {
|
|
19
|
+
const missing: string[] = [];
|
|
20
|
+
const text = template.replace(PLACEHOLDER_RE, (token, key: string) => {
|
|
21
|
+
const value = values[key];
|
|
22
|
+
if (value === undefined || value === null || value === "") {
|
|
23
|
+
if (!missing.includes(key)) {
|
|
24
|
+
missing.push(key);
|
|
25
|
+
}
|
|
26
|
+
return token;
|
|
27
|
+
}
|
|
28
|
+
return String(value);
|
|
29
|
+
});
|
|
30
|
+
return { text, missing };
|
|
31
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { Skill } from "./skill.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether `value` has the required string fields of a {@link Skill}.
|
|
5
|
+
*
|
|
6
|
+
* `prompt` must stay optional: a server-resolved skill omits it, and requiring
|
|
7
|
+
* it would silently drop exactly the skills kept off the client.
|
|
8
|
+
*/
|
|
9
|
+
function isSkill(value: unknown): value is Skill {
|
|
10
|
+
if (typeof value !== "object" || value === null) {
|
|
11
|
+
return false;
|
|
12
|
+
}
|
|
13
|
+
const record = value as Record<string, unknown>;
|
|
14
|
+
return (
|
|
15
|
+
typeof record["name"] === "string" &&
|
|
16
|
+
typeof record["title"] === "string" &&
|
|
17
|
+
(record["prompt"] === undefined || typeof record["prompt"] === "string")
|
|
18
|
+
);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Parse an untrusted value (parsed JSON from `data-skills` or a skills
|
|
23
|
+
* endpoint) into a list of {@link Skill}s, dropping anything malformed. Never
|
|
24
|
+
* throws — a bad payload yields an empty list.
|
|
25
|
+
*/
|
|
26
|
+
export function parseSkills(value: unknown): Skill[] {
|
|
27
|
+
if (!Array.isArray(value)) {
|
|
28
|
+
return [];
|
|
29
|
+
}
|
|
30
|
+
return value.filter(isSkill);
|
|
31
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A pre-defined prompt the user can launch from the chat — surfaced as a chip
|
|
3
|
+
* and/or in the `/`-command palette. One catalog feeds both surfaces; the host
|
|
4
|
+
* provides skills via the `skills` property / `data-skills` attribute / a
|
|
5
|
+
* fetched endpoint (see {@link AgUiChat}).
|
|
6
|
+
*/
|
|
7
|
+
export interface Skill {
|
|
8
|
+
/** Stable id; the `/token` (kebab-case) in the palette. */
|
|
9
|
+
readonly name: string;
|
|
10
|
+
/** Label shown in chips and the palette. */
|
|
11
|
+
readonly title: string;
|
|
12
|
+
/** Secondary line shown in the palette. */
|
|
13
|
+
readonly description?: string;
|
|
14
|
+
/**
|
|
15
|
+
* The prompt to send. May contain `{placeholder}`s filled from the host's
|
|
16
|
+
* skill context before send; an unfilled placeholder blocks send.
|
|
17
|
+
*
|
|
18
|
+
* Omit it to keep the prompt server-side: the skill then sends the bare
|
|
19
|
+
* `/name` token for the agent to resolve, and the wording never reaches the
|
|
20
|
+
* browser. Prefer that for anything internal — a fetched catalog is a plain
|
|
21
|
+
* GET and an embedded one sits in the page source.
|
|
22
|
+
*/
|
|
23
|
+
readonly prompt?: string;
|
|
24
|
+
/**
|
|
25
|
+
* Set `false` to pre-fill the composer instead of sending on pick. Defaults
|
|
26
|
+
* to sending, and is only meaningful for a skill carrying its own `prompt`;
|
|
27
|
+
* a server-resolved one always sends.
|
|
28
|
+
*/
|
|
29
|
+
readonly sendImmediately?: boolean;
|
|
30
|
+
/** Also surface this skill as a chip (default false; the palette shows all). */
|
|
31
|
+
readonly chip?: boolean;
|
|
32
|
+
}
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import type { SkillsMenu } from "../ui/composer/skills_menu.js";
|
|
2
|
+
import { fillUiString } from "../ui/fill_ui_string.js";
|
|
3
|
+
import type { UiStrings } from "../ui/ui_strings.js";
|
|
4
|
+
import { fillTemplate } from "./fill_template.js";
|
|
5
|
+
import { parseSkills } from "./parse_skills.js";
|
|
6
|
+
import type { Skill } from "./skill.js";
|
|
7
|
+
|
|
8
|
+
/** What the skill catalog needs from the element that owns it. */
|
|
9
|
+
export interface SkillCatalogHost {
|
|
10
|
+
/** The custom element, whose `data-skills-url` names the backend catalog. */
|
|
11
|
+
readonly element: HTMLElement;
|
|
12
|
+
/** The chips row and the slash palette the merged catalog is shown in. */
|
|
13
|
+
readonly menu: SkillsMenu;
|
|
14
|
+
/** The composer a picked skill's prompt is written into. */
|
|
15
|
+
readonly input: HTMLTextAreaElement;
|
|
16
|
+
/** The hint above the composer, saying what a skill still needs. */
|
|
17
|
+
readonly hint: HTMLElement;
|
|
18
|
+
/** The resolved string table. */
|
|
19
|
+
readonly strings: () => UiStrings;
|
|
20
|
+
/** The host's `skillContext`, read at the moment of the pick. */
|
|
21
|
+
readonly context: () => Record<string, unknown>;
|
|
22
|
+
/** Read an opt-in flag attribute. */
|
|
23
|
+
readonly flag: (name: string) => boolean;
|
|
24
|
+
/** Parse a JSON-valued attribute, warning when it will not parse. */
|
|
25
|
+
readonly readJsonAttribute: (name: string) => unknown;
|
|
26
|
+
/** The fetch options every request the element makes carries. */
|
|
27
|
+
readonly fetchInit: (url: string) => RequestInit | undefined;
|
|
28
|
+
/** The element's public `sendMessage`. */
|
|
29
|
+
readonly send: (content: string) => void;
|
|
30
|
+
/** Send whatever the composer holds, as the Send button does. */
|
|
31
|
+
readonly submit: () => void;
|
|
32
|
+
/** Resize the composer to what it now holds. */
|
|
33
|
+
readonly autoGrow: () => void;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* The element's skills: the three catalogs a skill can come from, merged into
|
|
38
|
+
* the chips and the slash palette, and what picking one does to the composer.
|
|
39
|
+
*
|
|
40
|
+
* Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
|
|
41
|
+
* instance.
|
|
42
|
+
*/
|
|
43
|
+
export class SkillCatalog {
|
|
44
|
+
readonly #host: SkillCatalogHost;
|
|
45
|
+
// Skill catalog by source; merged backend → embed → client (later wins).
|
|
46
|
+
#backendSkills: readonly Skill[] = [];
|
|
47
|
+
#embedSkills: readonly Skill[] = [];
|
|
48
|
+
#clientSkills: readonly Skill[] = [];
|
|
49
|
+
readonly #merged = new Map<string, Skill>();
|
|
50
|
+
|
|
51
|
+
constructor(host: SkillCatalogHost) {
|
|
52
|
+
this.#host = host;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** The replacement behind `AgUiChat.setSkills`, whose doc is the contract. */
|
|
56
|
+
setClientSkills(skills: readonly Skill[]): void {
|
|
57
|
+
this.#clientSkills = skills;
|
|
58
|
+
this.#recompute();
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Wire the skill surfaces: opt-in flags and the embedded catalog. The backend
|
|
63
|
+
* catalog is fetched from the element's startup, a microtask later, so it
|
|
64
|
+
* carries the host's transport configuration.
|
|
65
|
+
*/
|
|
66
|
+
init(): void {
|
|
67
|
+
this.#host.menu.enableChips(this.#host.flag("data-prompt-chips"));
|
|
68
|
+
this.#host.menu.enableSlash(this.#host.flag("data-slash-commands"));
|
|
69
|
+
this.#embedSkills = this.#readEmbedded();
|
|
70
|
+
this.#recompute();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/** Fetch the backend skills catalog from `data-skills-url`, if set. */
|
|
74
|
+
async fetch(): Promise<void> {
|
|
75
|
+
const url = this.#host.element.getAttribute("data-skills-url");
|
|
76
|
+
if (url === null) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
try {
|
|
80
|
+
const response = await fetch(url, this.#host.fetchInit(url));
|
|
81
|
+
this.#backendSkills = parseSkills(await response.json());
|
|
82
|
+
this.#recompute();
|
|
83
|
+
} catch {
|
|
84
|
+
// Network/parse failure: skills just stay as the embedded/client set.
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Act on a picked skill.
|
|
90
|
+
*
|
|
91
|
+
* A skill with no `prompt` is server-resolved: picking it sends the bare
|
|
92
|
+
* `/name` token for the agent to expand, so the wording never reaches the
|
|
93
|
+
* browser. Prefer that shape — a skill often states a project's internal
|
|
94
|
+
* workflow most plainly, and a catalog endpoint is a plain GET.
|
|
95
|
+
*
|
|
96
|
+
* A skill carrying a `prompt` has the client fill its `{placeholder}`s from
|
|
97
|
+
* the page instead, which is right for placeholders only the page can supply.
|
|
98
|
+
*
|
|
99
|
+
* Either way a pick sends; `sendImmediately: false` opts into pre-filling the
|
|
100
|
+
* composer instead.
|
|
101
|
+
*/
|
|
102
|
+
apply(skill: Skill): void {
|
|
103
|
+
const { input, hint } = this.#host;
|
|
104
|
+
if (skill.prompt === undefined) {
|
|
105
|
+
hint.hidden = true;
|
|
106
|
+
this.#host.send(`/${skill.name}`);
|
|
107
|
+
return;
|
|
108
|
+
}
|
|
109
|
+
const { text, missing } = fillTemplate(skill.prompt, this.#host.context());
|
|
110
|
+
if (missing.length > 0) {
|
|
111
|
+
// Hand the user something to work with rather than only a refusal. The
|
|
112
|
+
// partially-filled template goes into the composer with its unresolved
|
|
113
|
+
// `{placeholder}`s intact and the first one selected, so the next
|
|
114
|
+
// keystroke replaces it. A hint alone would leave what the user typed to
|
|
115
|
+
// open the palette (a lone "/") sitting there, saying nothing about what
|
|
116
|
+
// the skill wanted or how to give it.
|
|
117
|
+
hint.textContent = fillUiString(this.#host.strings().skillNeeds, {
|
|
118
|
+
title: skill.title,
|
|
119
|
+
fields: missing.join(", "),
|
|
120
|
+
});
|
|
121
|
+
hint.hidden = false;
|
|
122
|
+
input.value = text;
|
|
123
|
+
this.#host.autoGrow();
|
|
124
|
+
input.focus();
|
|
125
|
+
this.#selectFirstPlaceholder(text);
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
hint.hidden = true;
|
|
129
|
+
input.value = text;
|
|
130
|
+
this.#host.autoGrow();
|
|
131
|
+
if (skill.sendImmediately === false) {
|
|
132
|
+
input.focus();
|
|
133
|
+
return;
|
|
134
|
+
}
|
|
135
|
+
this.#host.submit();
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Parse the inline `data-skills` JSON catalog (empty when absent/malformed). */
|
|
139
|
+
#readEmbedded(): readonly Skill[] {
|
|
140
|
+
// `parseSkills` drops anything that is not a well-formed skill, `null`
|
|
141
|
+
// included, so the absent and unparseable cases need no branch here.
|
|
142
|
+
return parseSkills(this.#host.readJsonAttribute("data-skills"));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/** The title of the skill named `name` in the merged catalog, if it has one. */
|
|
146
|
+
title(name: string): string | undefined {
|
|
147
|
+
return this.#merged.get(name)?.title;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** Merge the three sources (backend → embed → client; later wins by name). */
|
|
151
|
+
#recompute(): void {
|
|
152
|
+
this.#merged.clear();
|
|
153
|
+
for (const skill of [...this.#backendSkills, ...this.#embedSkills, ...this.#clientSkills]) {
|
|
154
|
+
this.#merged.set(skill.name, skill);
|
|
155
|
+
}
|
|
156
|
+
this.#host.menu.setSkills([...this.#merged.values()]);
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
/**
|
|
160
|
+
* Put the caret on the first unresolved placeholder, selected.
|
|
161
|
+
*
|
|
162
|
+
* Typing then replaces it, which is the shortest path from "this skill needs
|
|
163
|
+
* a topic" to a sendable prompt.
|
|
164
|
+
*/
|
|
165
|
+
#selectFirstPlaceholder(text: string): void {
|
|
166
|
+
// The first surviving brace *is* the first unresolved placeholder — a
|
|
167
|
+
// resolved one was substituted away — so this needs no search through the
|
|
168
|
+
// missing keys and no not-found branch to defend.
|
|
169
|
+
const start = text.indexOf("{");
|
|
170
|
+
this.#host.input.setSelectionRange(start, text.indexOf("}", start) + 1);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { LOAD_CAPABILITY_TOOL } from "../constants.js";
|
|
2
|
+
import type { AgUiToolCall } from "../core/agui_client.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* The skill name a `load_capability` call activated, or `null` when the call is
|
|
6
|
+
* something else.
|
|
7
|
+
*
|
|
8
|
+
* Every deferred capability loads through this one tool, so the id is a skill
|
|
9
|
+
* name only when the project wired agent skills; another project's capability
|
|
10
|
+
* id surfaces here too. Acceptable for a muted notice, and better than a
|
|
11
|
+
* parallel signal — the id is exactly what the model selected.
|
|
12
|
+
*/
|
|
13
|
+
export function skillNameFrom(call: AgUiToolCall): string | null {
|
|
14
|
+
if (call.name !== LOAD_CAPABILITY_TOOL) {
|
|
15
|
+
return null;
|
|
16
|
+
}
|
|
17
|
+
const id = (call.args as { id?: unknown } | null | undefined)?.id;
|
|
18
|
+
return typeof id === "string" && id !== "" ? id : null;
|
|
19
|
+
}
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { X_SUMMARY_KEY } from "../constants.js";
|
|
2
|
+
import type { CollapseTarget } from "../ui/placement/surface_for.js";
|
|
3
|
+
import type { ClientTool } from "./client_tool_registry.js";
|
|
4
|
+
|
|
5
|
+
/** Every corner the panel can be sent to, in the order the schema states them. */
|
|
6
|
+
export const CHAT_CORNERS = ["top-left", "top-right", "bottom-left", "bottom-right"] as const;
|
|
7
|
+
|
|
8
|
+
/** A corner the panel can be sent to. */
|
|
9
|
+
export type ChatCorner = (typeof CHAT_CORNERS)[number];
|
|
10
|
+
|
|
11
|
+
/** What the agent is told about the surface it is speaking from. */
|
|
12
|
+
export interface ChatSurfaceReport {
|
|
13
|
+
/** The placement in force, or `null` when the host set none. */
|
|
14
|
+
readonly placement: string | null;
|
|
15
|
+
/**
|
|
16
|
+
* What the panel collapses to: `launcher`, `rail`, `header`, `bar` (the
|
|
17
|
+
* bottom bar it rises from), `none` (hidden, brought back by the host's own
|
|
18
|
+
* control), or `null` when it cannot collapse.
|
|
19
|
+
*/
|
|
20
|
+
readonly collapseTo: CollapseTarget;
|
|
21
|
+
/** Whether the panel is currently collapsed. */
|
|
22
|
+
readonly collapsed: boolean;
|
|
23
|
+
/** Whether this placement has a collapsed state at all. */
|
|
24
|
+
readonly collapsible: boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Whether the reader maximized the panel with its header control. Read-only:
|
|
27
|
+
* no tool changes it, and it is not kept across a reload.
|
|
28
|
+
*/
|
|
29
|
+
readonly maximized: boolean;
|
|
30
|
+
/** Whether the panel can be moved, or the placement owns its position. */
|
|
31
|
+
readonly movable: boolean;
|
|
32
|
+
/**
|
|
33
|
+
* Whether this page allows the panel to be moved at all: true for every
|
|
34
|
+
* placement unless the host set `data-launcher-drag="false"`. It is the
|
|
35
|
+
* page's setting alone and does not vary with the placement or `collapse-to`;
|
|
36
|
+
* whether this panel moves is {@link ChatSurfaceReport.movable}. Kept apart because
|
|
37
|
+
* the two refusals need different sentences.
|
|
38
|
+
*/
|
|
39
|
+
readonly draggable: boolean;
|
|
40
|
+
/** Whether the panel currently covers the whole viewport. */
|
|
41
|
+
readonly fullBleed: boolean;
|
|
42
|
+
/** The panel's box, in viewport coordinates. */
|
|
43
|
+
readonly box: {
|
|
44
|
+
readonly left: number;
|
|
45
|
+
readonly top: number;
|
|
46
|
+
readonly width: number;
|
|
47
|
+
readonly height: number;
|
|
48
|
+
};
|
|
49
|
+
/**
|
|
50
|
+
* The part of the viewport the panel may rest in, with an origin: a host can reserve
|
|
51
|
+
* edges for its own chrome, so it is not always the screen's.
|
|
52
|
+
*/
|
|
53
|
+
readonly viewport: {
|
|
54
|
+
readonly left: number;
|
|
55
|
+
readonly top: number;
|
|
56
|
+
readonly width: number;
|
|
57
|
+
readonly height: number;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Whether a string names one of the four corners. */
|
|
62
|
+
export function isChatCorner(value: string): value is ChatCorner {
|
|
63
|
+
return (CHAT_CORNERS as readonly string[]).includes(value);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/** The part of the widget these tools drive: a port, since the element imports this module. */
|
|
67
|
+
export interface ChatSurface {
|
|
68
|
+
describeSurface(): ChatSurfaceReport;
|
|
69
|
+
/** `announce` writes a transcript notice with an undo; the tools always pass it. */
|
|
70
|
+
moveTo(corner: ChatCorner, options?: { readonly announce?: boolean }): boolean;
|
|
71
|
+
setCollapsed(collapsed: boolean, options?: { readonly announce?: boolean }): void;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/**
|
|
75
|
+
* Tools that let the agent move or collapse the panel it is speaking from.
|
|
76
|
+
*
|
|
77
|
+
* They report what happened, not what was asked: `move_chat` answers `moved: false`
|
|
78
|
+
* with the reason when the panel cannot move, rather than succeeding on a panel that
|
|
79
|
+
* did not budge.
|
|
80
|
+
*/
|
|
81
|
+
export function createChatSurfaceTools(surface: ChatSurface): ClientTool[] {
|
|
82
|
+
return [
|
|
83
|
+
{
|
|
84
|
+
name: "read_chat_surface",
|
|
85
|
+
description:
|
|
86
|
+
"Describe the chat panel you are speaking from: its placement, whether it is " +
|
|
87
|
+
"collapsed, whether it can be moved, and the box it occupies. Read this before " +
|
|
88
|
+
"moving or minimising yourself, since a full-screen panel has nowhere to move to. " +
|
|
89
|
+
"Read-only.",
|
|
90
|
+
parameters: {
|
|
91
|
+
type: "object",
|
|
92
|
+
properties: {},
|
|
93
|
+
required: [],
|
|
94
|
+
[X_SUMMARY_KEY]: "Read the chat's own position",
|
|
95
|
+
},
|
|
96
|
+
handler: () => surface.describeSurface(),
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
name: "move_chat",
|
|
100
|
+
description:
|
|
101
|
+
"Move your own panel to a corner, to uncover something the user needs to see. " +
|
|
102
|
+
"`corner` is top-left, top-right, bottom-left or bottom-right. Answers " +
|
|
103
|
+
"`moved: false` with a reason when the placement owns its position or the panel " +
|
|
104
|
+
"fills the screen; check `read_chat_surface` first, and prefer minimise_chat when " +
|
|
105
|
+
"there is nowhere to move to.",
|
|
106
|
+
parameters: {
|
|
107
|
+
type: "object",
|
|
108
|
+
properties: {
|
|
109
|
+
corner: {
|
|
110
|
+
type: "string",
|
|
111
|
+
enum: [...CHAT_CORNERS],
|
|
112
|
+
},
|
|
113
|
+
},
|
|
114
|
+
required: ["corner"],
|
|
115
|
+
[X_SUMMARY_KEY]: "Move the chat out of the way",
|
|
116
|
+
},
|
|
117
|
+
handler: (args) => {
|
|
118
|
+
const asked = String(args["corner"] ?? "");
|
|
119
|
+
const report = surface.describeSurface();
|
|
120
|
+
// `required` is advisory: an unknown corner would send the panel bottom-right yet report success.
|
|
121
|
+
if (!isChatCorner(asked)) {
|
|
122
|
+
return {
|
|
123
|
+
moved: false,
|
|
124
|
+
reason: `"${asked}" is not a corner; use one of ${CHAT_CORNERS.join(", ")}`,
|
|
125
|
+
};
|
|
126
|
+
}
|
|
127
|
+
if (!report.movable) {
|
|
128
|
+
// A fact the agent can act on (minimise instead), not a malformed call.
|
|
129
|
+
return {
|
|
130
|
+
moved: false,
|
|
131
|
+
reason: report.fullBleed
|
|
132
|
+
? "the panel fills the screen, so there is nowhere to move it to"
|
|
133
|
+
: report.draggable === false
|
|
134
|
+
? "this page has turned off moving the panel"
|
|
135
|
+
: `the "${report.placement ?? ""}" placement owns the panel's position`,
|
|
136
|
+
suggestion: report.collapsible ? "minimise_chat" : null,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
return { moved: surface.moveTo(asked, { announce: true }), corner: asked };
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
name: "minimise_chat",
|
|
144
|
+
description:
|
|
145
|
+
"Collapse your own panel, so the user can see the whole page. The user reopens " +
|
|
146
|
+
"it from where it collapsed to (a launcher, a rail, a bottom bar or the page's " +
|
|
147
|
+
"own control). Answers `minimised: false` when the placement has no collapsed " +
|
|
148
|
+
"state, which is the case for a full-page chat.",
|
|
149
|
+
parameters: {
|
|
150
|
+
type: "object",
|
|
151
|
+
properties: {},
|
|
152
|
+
required: [],
|
|
153
|
+
[X_SUMMARY_KEY]: "Minimise the chat",
|
|
154
|
+
},
|
|
155
|
+
handler: () => {
|
|
156
|
+
const report = surface.describeSurface();
|
|
157
|
+
if (!report.collapsible) {
|
|
158
|
+
return {
|
|
159
|
+
minimised: false,
|
|
160
|
+
reason: "this placement has no collapsed state, so there is nothing to minimise to",
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
surface.setCollapsed(true, { announce: true });
|
|
164
|
+
return { minimised: true };
|
|
165
|
+
},
|
|
166
|
+
},
|
|
167
|
+
{
|
|
168
|
+
name: "restore_chat",
|
|
169
|
+
description: "Open your own panel again after minimising it.",
|
|
170
|
+
parameters: {
|
|
171
|
+
type: "object",
|
|
172
|
+
properties: {},
|
|
173
|
+
required: [],
|
|
174
|
+
[X_SUMMARY_KEY]: "Restore the chat",
|
|
175
|
+
},
|
|
176
|
+
handler: () => {
|
|
177
|
+
// No notice: the user sees the panel come back.
|
|
178
|
+
surface.setCollapsed(false);
|
|
179
|
+
return { restored: true };
|
|
180
|
+
},
|
|
181
|
+
},
|
|
182
|
+
];
|
|
183
|
+
}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type { Tool } from "@ag-ui/core";
|
|
2
|
+
|
|
3
|
+
/** Draws one call from its arguments alone; the replay path takes this, never a `handler`. */
|
|
4
|
+
export type ChartRenderer = (args: Record<string, unknown>) => Node | null;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* A tool the frontend declares and executes itself.
|
|
8
|
+
*
|
|
9
|
+
* `parameters` is a JSON Schema (and may carry the `x-destructive` extension).
|
|
10
|
+
* `handler` receives the parsed arguments and returns a result that is
|
|
11
|
+
* JSON-serialised into the AG-UI tool-result message sent back to the agent.
|
|
12
|
+
*/
|
|
13
|
+
export interface ClientTool {
|
|
14
|
+
name: string;
|
|
15
|
+
description: string;
|
|
16
|
+
parameters: Record<string, unknown>;
|
|
17
|
+
/**
|
|
18
|
+
* Run the tool. `callId` identifies the call being executed, for a handler
|
|
19
|
+
* that renders into the transcript and needs to place itself against its own
|
|
20
|
+
* card; handlers that only act on the page ignore it.
|
|
21
|
+
*/
|
|
22
|
+
handler: (args: Record<string, unknown>, callId?: string) => unknown | Promise<unknown>;
|
|
23
|
+
/**
|
|
24
|
+
* Draw this call, from its arguments alone.
|
|
25
|
+
*
|
|
26
|
+
* Optional, and the only half that is replayed: a restored transcript calls
|
|
27
|
+
* `render`, never {@link handler}, so a reload cannot re-run an effect.
|
|
28
|
+
*
|
|
29
|
+
* It runs again on every restore, so it must be:
|
|
30
|
+
*
|
|
31
|
+
* - a pure function of `args` — no host state, no network, no clock;
|
|
32
|
+
* - deterministic, so a reload reproduces what was there before;
|
|
33
|
+
* - free of effects outside the node it returns, which the component places.
|
|
34
|
+
*
|
|
35
|
+
* Return `null` for arguments that say nothing worth drawing.
|
|
36
|
+
*/
|
|
37
|
+
render?: ChartRenderer;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Holds the frontend tools a host has declared on an `<ag-ui-chat>` element.
|
|
42
|
+
*
|
|
43
|
+
* Produces AG-UI {@link Tool} definitions for `RunAgentInput.tools` and looks
|
|
44
|
+
* up handlers when the agent calls a tool. Pure (no DOM); the element owns one
|
|
45
|
+
* instance.
|
|
46
|
+
*/
|
|
47
|
+
export class ClientToolRegistry {
|
|
48
|
+
readonly #tools = new Map<string, ClientTool>();
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Register a tool, replacing any existing one with the same name.
|
|
52
|
+
*
|
|
53
|
+
* Replacing rather than throwing keeps a re-fired host ref or StrictMode double-invoke safe.
|
|
54
|
+
*/
|
|
55
|
+
register(tool: ClientTool): void {
|
|
56
|
+
this.#tools.set(tool.name, tool);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
has(name: string): boolean {
|
|
60
|
+
return this.#tools.has(name);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** Return a registered tool or throw. */
|
|
64
|
+
get(name: string): ClientTool {
|
|
65
|
+
const tool = this.#tools.get(name);
|
|
66
|
+
if (tool === undefined) {
|
|
67
|
+
throw new Error(`tool "${name}" is not registered`);
|
|
68
|
+
}
|
|
69
|
+
return tool;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** AG-UI tool definitions for `RunAgentInput.tools`. */
|
|
73
|
+
tools(): Tool[] {
|
|
74
|
+
return [...this.#tools.values()].map((tool) => ({
|
|
75
|
+
name: tool.name,
|
|
76
|
+
description: tool.description,
|
|
77
|
+
parameters: tool.parameters,
|
|
78
|
+
}));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { X_DESTRUCTIVE_KEY } from "../constants.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether a tool's JSON-Schema `parameters` marks it destructive.
|
|
5
|
+
*
|
|
6
|
+
* Reads the `x-destructive` extension off a schema the **host** declared —
|
|
7
|
+
* a tool passed to `registerTool`, or one of the built-ins. A server-side
|
|
8
|
+
* tool's schema never reaches the browser: tool definitions travel
|
|
9
|
+
* client-to-server on `RunAgentInput.tools`, and the only channel coming the
|
|
10
|
+
* other way is the tool catalog (`data-tools-url`), which carries labels, not
|
|
11
|
+
* schemas. So a server tool marked destructive there is not gated here, and
|
|
12
|
+
* must be gated server-side instead — the confirmation this flag drives is a
|
|
13
|
+
* property of tools the browser itself executes.
|
|
14
|
+
*/
|
|
15
|
+
export function isDestructive(parameters: Record<string, unknown>): boolean {
|
|
16
|
+
return parameters[X_DESTRUCTIVE_KEY] === true;
|
|
17
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { X_NAVIGATES_KEY } from "../constants.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Whether a tool's JSON-Schema `parameters` marks it as navigating.
|
|
5
|
+
*
|
|
6
|
+
* Reads the `x-navigates` extension. A navigating tool's handler reloads the
|
|
7
|
+
* page (MPA navigation), so the element checkpoints the call and resumes the
|
|
8
|
+
* run loop after the next page mounts, rather than awaiting a result inline.
|
|
9
|
+
*/
|
|
10
|
+
export function isNavigates(parameters: Record<string, unknown>): boolean {
|
|
11
|
+
return parameters[X_NAVIGATES_KEY] === true;
|
|
12
|
+
}
|