@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,70 @@
|
|
|
1
|
+
// The one shape every placement takes on a phone-sized viewport.
|
|
2
|
+
export const SMALL_VIEWPORT_STYLES: string = `
|
|
3
|
+
/* Small viewports: one shape, reached from whichever placement the host chose.
|
|
4
|
+
|
|
5
|
+
A phone is not an eighth placement, it is an override that collapses the
|
|
6
|
+
others onto one of them. The host picked a placement for the desktop it was
|
|
7
|
+
designing; a 380x560 panel with a 24px margin is not a smaller version of
|
|
8
|
+
that decision, it is most of the screen with a frame drawn round it.
|
|
9
|
+
|
|
10
|
+
The breakpoint is a literal because a custom property cannot be read in a
|
|
11
|
+
media query -- which is exactly why there is an opt-out. Everything the block
|
|
12
|
+
sets is a token a host can re-state, but the *trigger* is unreachable, so a
|
|
13
|
+
host whose layout wants a different threshold, or none, sets
|
|
14
|
+
data-small-viewport="off" and keeps its desktop shape at every width. 600px is above every common phone in portrait and below every
|
|
15
|
+
tablet in landscape, and it is a width rather than a pointer test on purpose:
|
|
16
|
+
a touch laptop is coarse-pointered and wide, a narrow desktop window is
|
|
17
|
+
fine-pointered and small, and conflating the two gets both wrong. What the
|
|
18
|
+
pointer decides is which controls make sense, further down.
|
|
19
|
+
|
|
20
|
+
The size the user dragged is deliberately not read here. The desktop
|
|
21
|
+
placements read it before the host token, and this block restates the sizes
|
|
22
|
+
without it, so a persisted or freshly dragged size cannot change the shape
|
|
23
|
+
of a phone, and a window narrowed after a drag goes full-bleed.
|
|
24
|
+
|
|
25
|
+
Two placements are left alone. "page" is already this shape. "embedded" sits
|
|
26
|
+
in a box the host sized and placed, and taking that over would break the app
|
|
27
|
+
shell it was embedded into -- the host is the only party that knows whether
|
|
28
|
+
its column should become the whole screen. */
|
|
29
|
+
@media (max-width: 600px) {
|
|
30
|
+
:host([placement="floating"]:not([data-small-viewport="off"])),
|
|
31
|
+
:host([placement="bottom-left"]:not([data-small-viewport="off"])),
|
|
32
|
+
:host([placement="sidebar"]:not([data-small-viewport="off"])),
|
|
33
|
+
:host([placement="side"]:not([data-small-viewport="off"])),
|
|
34
|
+
:host(:not([placement]):not([data-small-viewport="off"])),
|
|
35
|
+
:host([placement=""]:not([data-small-viewport="off"])) {
|
|
36
|
+
--_inset: var(
|
|
37
|
+
--ag-ui-inset,
|
|
38
|
+
calc(var(--_viewport-inset-top) + var(--_keyboard-inset-top)) var(--_viewport-inset-right)
|
|
39
|
+
calc(var(--_viewport-inset-bottom) + var(--_keyboard-inset))
|
|
40
|
+
var(--_viewport-inset-left)
|
|
41
|
+
);
|
|
42
|
+
--_width: var(--ag-ui-width, var(--_viewport-width));
|
|
43
|
+
--_height: var(--ag-ui-height, var(--_viewport-height));
|
|
44
|
+
--_max-width: var(--ag-ui-max-width, var(--_viewport-width));
|
|
45
|
+
--_max-height: var(--ag-ui-max-height, var(--_viewport-height));
|
|
46
|
+
--_panel-radius: var(--ag-ui-panel-radius, 0);
|
|
47
|
+
--_shadow: var(--ag-ui-shadow, none);
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/* Nothing to resize once the panel is the screen, and the grips would sit
|
|
51
|
+
under the thumbs holding the phone. */
|
|
52
|
+
:host([placement="floating"]:not([data-small-viewport="off"])) .resize-handle,
|
|
53
|
+
:host([placement="bottom-left"]:not([data-small-viewport="off"])) .resize-handle,
|
|
54
|
+
:host([placement="sidebar"]:not([data-small-viewport="off"])) .resize-handle,
|
|
55
|
+
:host([placement="side"]:not([data-small-viewport="off"])) .resize-handle,
|
|
56
|
+
:host(:not([placement]):not([data-small-viewport="off"])) .resize-handle,
|
|
57
|
+
:host([placement=""]:not([data-small-viewport="off"])) .resize-handle {
|
|
58
|
+
display: none;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/* The bottom bar shows only while collapsed. With the panel open the panel
|
|
62
|
+
is the screen, its header's minimise control is the way back, and a
|
|
63
|
+
second strip fixed to the bottom edge would sit under the keyboard while
|
|
64
|
+
the composer has focus. Hidden by display, so the bar measures 0 and the
|
|
65
|
+
host's padding goes with it. */
|
|
66
|
+
:host([data-collapsed-to="bar"]:not([collapsed]):not([data-small-viewport="off"])) .dock-bar {
|
|
67
|
+
display: none;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
`;
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import type { ResizeAxis } from "./resize_handle.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* What a collapsed panel shrinks to, stamped on the element as
|
|
5
|
+
* data-collapsed-to so the stylesheet draws it.
|
|
6
|
+
*
|
|
7
|
+
* - `launcher` -- the round button in a corner.
|
|
8
|
+
* - `rail` -- the slim full-height edge the sidebar docks against; the same
|
|
9
|
+
* launcher element, shaped by the stylesheet.
|
|
10
|
+
* - `header` -- the in-flow collapse: the body hides and the header bar stays
|
|
11
|
+
* in the host's layout, so there is no launcher at all.
|
|
12
|
+
* - `bar` -- `collapse-to="bar"` over a placement that would otherwise
|
|
13
|
+
* collapse to `launcher`: a strip along the bottom edge, the panel rising
|
|
14
|
+
* from its right end.
|
|
15
|
+
* - `none` -- `collapse-to="none"` over any collapsible placement: collapsed
|
|
16
|
+
* is hidden, and the host's own control brings the panel back.
|
|
17
|
+
* - `null` -- no collapsed state. `page` is a dedicated route rather than a
|
|
18
|
+
* panel on someone else's page, so there is no "away" for it to go to:
|
|
19
|
+
* collapsing it left a strip of application chrome fixed over a route with
|
|
20
|
+
* no owner, and it hides the launcher, so the usual way back did not exist.
|
|
21
|
+
* The header drops its collapse control here, but a control removed from
|
|
22
|
+
* the UI is not a state removed from the model: the property, the attribute
|
|
23
|
+
* and a value restored from storage all still reach it, so every one of
|
|
24
|
+
* those paths asks this record; the stylesheet covers the one path that
|
|
25
|
+
* never does, an attribute written straight onto the element.
|
|
26
|
+
*/
|
|
27
|
+
export type CollapseTarget = "launcher" | "rail" | "header" | "bar" | "none" | null;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Everything the script needs to know about one display surface, in one
|
|
31
|
+
* record, so a placement's behaviour is read in one place rather than
|
|
32
|
+
* assembled from a table per question.
|
|
33
|
+
*
|
|
34
|
+
* The stylesheet still carries each surface's look (one module per placement
|
|
35
|
+
* under this directory); this is the part of a surface that code decides.
|
|
36
|
+
*/
|
|
37
|
+
export interface Surface {
|
|
38
|
+
/** What collapsing shrinks the panel to; `null` when it cannot collapse. */
|
|
39
|
+
readonly collapseTo: CollapseTarget;
|
|
40
|
+
/**
|
|
41
|
+
* Whether a gesture may move the launcher. The rest have nowhere to put it:
|
|
42
|
+
* the rail is a docked edge, `header` and `null` have no launcher, a
|
|
43
|
+
* full-bleed panel covers the screen it would be opening into, and the bar
|
|
44
|
+
* and the host's own control are not a launcher at all.
|
|
45
|
+
*/
|
|
46
|
+
readonly launcherDraggable: boolean;
|
|
47
|
+
/**
|
|
48
|
+
* Whether the header drag and `moveTo` may move the open panel. The same
|
|
49
|
+
* answer as {@link launcherDraggable} for every placement on its own; the two
|
|
50
|
+
* part under `collapse-to="bar"` and `"none"`, where a corner panel still
|
|
51
|
+
* moves like one but has no launcher left to drag.
|
|
52
|
+
*/
|
|
53
|
+
readonly panelMovable: boolean;
|
|
54
|
+
/**
|
|
55
|
+
* Which axes the resize grips may change. A full-bleed layout is the whole
|
|
56
|
+
* viewport by definition and cannot be resized; a docked panel owns its
|
|
57
|
+
* height, leaving only its inner edge.
|
|
58
|
+
*/
|
|
59
|
+
readonly resizeAxis: ResizeAxis;
|
|
60
|
+
/**
|
|
61
|
+
* Whether a first mount with nothing stored starts collapsed. Only the
|
|
62
|
+
* corner placements do: a launcher is the resting state of every corner chat
|
|
63
|
+
* in the field, and mounting open put a 380x560 panel over the host page's
|
|
64
|
+
* corner on a visitor's first load, uninvited. The placements that place
|
|
65
|
+
* themselves start open -- a host that docks a sidebar has already decided
|
|
66
|
+
* the widget belongs on screen, and one that embeds it has given it a box.
|
|
67
|
+
*
|
|
68
|
+
* Separate from {@link launcherDraggable} although the two agree today:
|
|
69
|
+
* "has a launcher to rest on" and "the launcher can be moved" are different
|
|
70
|
+
* questions, and a surface with a fixed launcher would answer them apart.
|
|
71
|
+
*/
|
|
72
|
+
readonly startsCollapsed: boolean;
|
|
73
|
+
/**
|
|
74
|
+
* What the header's maximize control grows: both axes for a corner or docked
|
|
75
|
+
* panel, the width for a side column, and `null` where there is no control
|
|
76
|
+
* (a surface that already fills its box, or that the host sized).
|
|
77
|
+
*/
|
|
78
|
+
readonly maximizes: "both" | "width" | null;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const CORNER: Surface = {
|
|
82
|
+
collapseTo: "launcher",
|
|
83
|
+
launcherDraggable: true,
|
|
84
|
+
panelMovable: true,
|
|
85
|
+
resizeAxis: "both",
|
|
86
|
+
startsCollapsed: true,
|
|
87
|
+
maximizes: "both",
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
const DOCKED: Surface = {
|
|
91
|
+
collapseTo: "launcher",
|
|
92
|
+
launcherDraggable: false,
|
|
93
|
+
panelMovable: false,
|
|
94
|
+
resizeAxis: "width",
|
|
95
|
+
startsCollapsed: false,
|
|
96
|
+
maximizes: "width",
|
|
97
|
+
};
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* One record per `placement` value. Absent (`null`) and empty are the default
|
|
101
|
+
* floating corner, as the stylesheet treats them.
|
|
102
|
+
*/
|
|
103
|
+
const SURFACES: ReadonlyMap<string | null, Surface> = new Map<string | null, Surface>([
|
|
104
|
+
[null, CORNER],
|
|
105
|
+
["", CORNER],
|
|
106
|
+
["floating", CORNER],
|
|
107
|
+
["bottom-left", CORNER],
|
|
108
|
+
["side", DOCKED],
|
|
109
|
+
["sidebar", { ...DOCKED, collapseTo: "rail" }],
|
|
110
|
+
[
|
|
111
|
+
"full",
|
|
112
|
+
{
|
|
113
|
+
collapseTo: "launcher",
|
|
114
|
+
launcherDraggable: false,
|
|
115
|
+
panelMovable: false,
|
|
116
|
+
resizeAxis: "none",
|
|
117
|
+
startsCollapsed: false,
|
|
118
|
+
maximizes: null,
|
|
119
|
+
},
|
|
120
|
+
],
|
|
121
|
+
[
|
|
122
|
+
"page",
|
|
123
|
+
{
|
|
124
|
+
collapseTo: null,
|
|
125
|
+
launcherDraggable: false,
|
|
126
|
+
panelMovable: false,
|
|
127
|
+
resizeAxis: "none",
|
|
128
|
+
startsCollapsed: false,
|
|
129
|
+
maximizes: null,
|
|
130
|
+
},
|
|
131
|
+
],
|
|
132
|
+
[
|
|
133
|
+
"embedded",
|
|
134
|
+
{
|
|
135
|
+
collapseTo: "header",
|
|
136
|
+
launcherDraggable: false,
|
|
137
|
+
panelMovable: false,
|
|
138
|
+
resizeAxis: "both",
|
|
139
|
+
startsCollapsed: false,
|
|
140
|
+
maximizes: null,
|
|
141
|
+
},
|
|
142
|
+
],
|
|
143
|
+
]);
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* A value no record names. The stylesheet lays it out as the default corner,
|
|
147
|
+
* but the script has never treated an unknown value as one: its launcher stays
|
|
148
|
+
* put and it mounts open, so a typo in a host's markup does not start moving
|
|
149
|
+
* or hiding a panel the host meant to show.
|
|
150
|
+
*/
|
|
151
|
+
const UNKNOWN: Surface = {
|
|
152
|
+
collapseTo: "launcher",
|
|
153
|
+
launcherDraggable: false,
|
|
154
|
+
panelMovable: false,
|
|
155
|
+
resizeAxis: "both",
|
|
156
|
+
startsCollapsed: false,
|
|
157
|
+
maximizes: null,
|
|
158
|
+
};
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* The surface `placement` and `collapse-to` describe together. Read per
|
|
162
|
+
* interaction by every caller, because both are live attributes.
|
|
163
|
+
*
|
|
164
|
+
* `collapse-to` only ever replaces the round launcher or the whole collapsed
|
|
165
|
+
* state, never a placement's own shape: `bar` applies where the placement
|
|
166
|
+
* collapses to `launcher`, so the sidebar keeps its rail and an embedded chat
|
|
167
|
+
* its header bar, and `none` applies to every collapsible placement. Absent,
|
|
168
|
+
* `auto` and any other value leave the placement as it was. Both turn the
|
|
169
|
+
* launcher drag off, because there is no launcher left to drag, and keep the
|
|
170
|
+
* placement's own answer for moving the panel: a corner panel rises from the
|
|
171
|
+
* bar or the anchor until the user drags it somewhere else, and a placement
|
|
172
|
+
* that owns its position keeps owning it.
|
|
173
|
+
*/
|
|
174
|
+
export function surfaceFor(placement: string | null, collapseTo: string | null = null): Surface {
|
|
175
|
+
const surface = SURFACES.get(placement) ?? UNKNOWN;
|
|
176
|
+
if (collapseTo === "bar" && surface.collapseTo === "launcher") {
|
|
177
|
+
return { ...surface, collapseTo: "bar", launcherDraggable: false };
|
|
178
|
+
}
|
|
179
|
+
if (collapseTo === "none" && surface.collapseTo !== null) {
|
|
180
|
+
return { ...surface, collapseTo: "none", launcherDraggable: false };
|
|
181
|
+
}
|
|
182
|
+
return surface;
|
|
183
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prettify a raw tool name for display: separators become spaces and the
|
|
3
|
+
* first letter is capitalised — `list_projects` → "List projects",
|
|
4
|
+
* `invoices.retrieve` → "Invoices retrieve".
|
|
5
|
+
*
|
|
6
|
+
* Final fallback of the tool-card label chain (`x-summary` →
|
|
7
|
+
* `toolSummaries` → fetched catalog → this). Purely cosmetic: the original
|
|
8
|
+
* name still rides on the card's dataset for debugging.
|
|
9
|
+
*/
|
|
10
|
+
export function prettifyToolName(name: string): string {
|
|
11
|
+
const spaced = name.replace(/[._-]+/g, " ").trim();
|
|
12
|
+
if (spaced === "") {
|
|
13
|
+
return name;
|
|
14
|
+
}
|
|
15
|
+
return spaced.charAt(0).toUpperCase() + spaced.slice(1);
|
|
16
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { ANNOUNCE_CLEAR_MS } from "../../constants.js";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* The screen-reader-only status region, and the one short thing it says at a
|
|
5
|
+
* time about how a run is going.
|
|
6
|
+
*
|
|
7
|
+
* The transcript cannot do this job. It is rewritten on every animation frame
|
|
8
|
+
* while an answer streams, so as a live region it re-announced the whole
|
|
9
|
+
* answer tens of times per turn -- not merely unhelpful but actively hostile.
|
|
10
|
+
* The published fix for this exact bug (Microsoft's Bot Framework WebChat
|
|
11
|
+
* #3236) is architectural rather than a matter of tuning attributes: demote the
|
|
12
|
+
* visible transcript out of live-region duty and put one synthesised status per
|
|
13
|
+
* event into a separate invisible region. MDN and Scott O'Hara prescribe the
|
|
14
|
+
* same empty-region-then-inject shape.
|
|
15
|
+
*
|
|
16
|
+
* Roughly four calls land per turn -- responding, answered, a card is waiting,
|
|
17
|
+
* stopped or failed -- so the user is told what happened and reads the answer
|
|
18
|
+
* itself by navigating the log, at their own pace, rather than having it
|
|
19
|
+
* shouted at them a token at a time.
|
|
20
|
+
*
|
|
21
|
+
* Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
|
|
22
|
+
* instance. The element places {@link region} in its shadow root.
|
|
23
|
+
*/
|
|
24
|
+
export class RunAnnouncer {
|
|
25
|
+
/** The invisible `role="status"` region the statuses are written into. */
|
|
26
|
+
readonly region = document.createElement("div");
|
|
27
|
+
/** Pending clear of {@link region}; see {@link announce} for why it is cleared at all. */
|
|
28
|
+
#timer: ReturnType<typeof setTimeout> | null = null;
|
|
29
|
+
|
|
30
|
+
/** Stamp the region's live-region semantics, before the element places it. */
|
|
31
|
+
mount(): void {
|
|
32
|
+
this.region.className = "sr-only";
|
|
33
|
+
this.region.setAttribute("role", "status");
|
|
34
|
+
this.region.setAttribute("aria-live", "polite");
|
|
35
|
+
// Atomic: each announcement replaces the last and is read whole. Without
|
|
36
|
+
// it a reader may announce only the changed words between two statuses.
|
|
37
|
+
this.region.setAttribute("aria-atomic", "true");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Say one short thing to a screen reader, without touching the transcript.
|
|
42
|
+
*
|
|
43
|
+
* **The clear is load-bearing, twice.** A reader announces a live region when
|
|
44
|
+
* its content *changes*, so setting the same string twice running -- two turns
|
|
45
|
+
* in a row both starting -- is not a change and is silently not announced.
|
|
46
|
+
* Emptying first makes the next set a change again. It also stops a stale
|
|
47
|
+
* status being read out when a reader later lands on the region.
|
|
48
|
+
*/
|
|
49
|
+
announce(message: string): void {
|
|
50
|
+
if (this.#timer !== null) {
|
|
51
|
+
clearTimeout(this.#timer);
|
|
52
|
+
}
|
|
53
|
+
this.region.textContent = message;
|
|
54
|
+
this.#timer = setTimeout(() => {
|
|
55
|
+
this.#timer = null;
|
|
56
|
+
this.region.textContent = "";
|
|
57
|
+
}, ANNOUNCE_CLEAR_MS);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** Cancel a pending clear, so no timer outlives the element's connection. */
|
|
61
|
+
dispose(): void {
|
|
62
|
+
if (this.#timer !== null) {
|
|
63
|
+
clearTimeout(this.#timer);
|
|
64
|
+
this.#timer = null;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A muted one-line notice about something the run did (history condensed, a
|
|
3
|
+
* skill loaded), rendered inline between turns.
|
|
4
|
+
*
|
|
5
|
+
* Distinct from a tool card, which reports work the agent asked for and
|
|
6
|
+
* settles, and from an error, which is a failure. A notice never settles and
|
|
7
|
+
* takes no action of its own.
|
|
8
|
+
*
|
|
9
|
+
* It may carry exactly one control, and only ever an undo. That is a narrower
|
|
10
|
+
* rule than "no controls", which is what this said until the agent could move
|
|
11
|
+
* the panel it speaks from: something that rearranges the user's window without
|
|
12
|
+
* being asked has to be both visible and reversible, and a notice is already
|
|
13
|
+
* the surface that says what the run did. Anything the user has to *decide* is
|
|
14
|
+
* a confirmation card instead -- the difference is that this reports something
|
|
15
|
+
* already done.
|
|
16
|
+
*/
|
|
17
|
+
export function renderRunNotice(
|
|
18
|
+
icon: string,
|
|
19
|
+
text: string,
|
|
20
|
+
kind: string,
|
|
21
|
+
undo?: { readonly label: string; readonly onActivate: () => void },
|
|
22
|
+
): HTMLDivElement {
|
|
23
|
+
const notice = document.createElement("div");
|
|
24
|
+
notice.className = `run-notice run-notice--${kind}`;
|
|
25
|
+
notice.setAttribute("part", `run-notice run-notice-${kind}`);
|
|
26
|
+
// status, not alert: informational, so it must not interrupt a screen reader
|
|
27
|
+
// mid-sentence. Polite announcements land after the current utterance.
|
|
28
|
+
notice.setAttribute("role", "status");
|
|
29
|
+
|
|
30
|
+
const glyph = document.createElement("span");
|
|
31
|
+
glyph.className = "run-notice-icon";
|
|
32
|
+
glyph.setAttribute("part", "run-notice-icon");
|
|
33
|
+
glyph.textContent = icon;
|
|
34
|
+
// Decorative: the adjacent text already says what happened, so announcing the
|
|
35
|
+
// glyph's name would only add noise.
|
|
36
|
+
glyph.setAttribute("aria-hidden", "true");
|
|
37
|
+
|
|
38
|
+
const label = document.createElement("span");
|
|
39
|
+
label.className = "run-notice-text";
|
|
40
|
+
label.setAttribute("part", "run-notice-text");
|
|
41
|
+
label.textContent = text;
|
|
42
|
+
|
|
43
|
+
notice.append(glyph, label);
|
|
44
|
+
|
|
45
|
+
if (undo !== undefined) {
|
|
46
|
+
const button = document.createElement("button");
|
|
47
|
+
button.type = "button";
|
|
48
|
+
button.className = "run-notice-undo";
|
|
49
|
+
button.setAttribute("part", "run-notice-undo");
|
|
50
|
+
button.textContent = undo.label;
|
|
51
|
+
button.addEventListener("click", () => {
|
|
52
|
+
// One use. The state it restores is the state as it was when the notice
|
|
53
|
+
// was written, so offering it twice would put back something that has
|
|
54
|
+
// since moved again.
|
|
55
|
+
button.disabled = true;
|
|
56
|
+
undo.onActivate();
|
|
57
|
+
});
|
|
58
|
+
notice.append(button);
|
|
59
|
+
}
|
|
60
|
+
return notice;
|
|
61
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
// The one-line notice a run leaves in the transcript, with its undo.
|
|
2
|
+
export const RUN_NOTICE_STYLES: string = `
|
|
3
|
+
.run-notice {
|
|
4
|
+
display: inline-flex;
|
|
5
|
+
align-items: center;
|
|
6
|
+
gap: 6px;
|
|
7
|
+
align-self: flex-start;
|
|
8
|
+
max-width: 100%;
|
|
9
|
+
margin: 2px 0;
|
|
10
|
+
padding: 3px 10px;
|
|
11
|
+
border: 1px dashed var(--_border);
|
|
12
|
+
border-radius: 999px;
|
|
13
|
+
background: transparent;
|
|
14
|
+
color: var(--_muted);
|
|
15
|
+
font-size: 0.8em;
|
|
16
|
+
line-height: 1.4;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.run-notice-icon {
|
|
20
|
+
flex: none;
|
|
21
|
+
opacity: 0.75;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/* The one control a notice may carry. Quiet, because it reports something
|
|
25
|
+
already done rather than asking for a decision. */
|
|
26
|
+
.run-notice-undo {
|
|
27
|
+
flex: 0 0 auto;
|
|
28
|
+
margin-inline-start: auto;
|
|
29
|
+
padding: 2px 8px;
|
|
30
|
+
border: 1px solid var(--_border);
|
|
31
|
+
border-radius: var(--_radius);
|
|
32
|
+
background: var(--_bg);
|
|
33
|
+
color: var(--_accent);
|
|
34
|
+
font: inherit;
|
|
35
|
+
font-size: 0.9em;
|
|
36
|
+
cursor: pointer;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.run-notice-undo:hover:not(:disabled) {
|
|
40
|
+
background: var(--_hover);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
.run-notice-undo:disabled {
|
|
44
|
+
opacity: 0.5;
|
|
45
|
+
cursor: default;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.run-notice-text {
|
|
49
|
+
min-width: 0;
|
|
50
|
+
overflow-wrap: anywhere;
|
|
51
|
+
}
|
|
52
|
+
`;
|
|
@@ -0,0 +1,227 @@
|
|
|
1
|
+
import type { SUBAGENT_PHASE } from "../../constants.js";
|
|
2
|
+
import { DEFAULT_UI_STRINGS, type UiStrings } from "../ui_strings.js";
|
|
3
|
+
|
|
4
|
+
/** One phase of a delegation's life, as the server spells it. */
|
|
5
|
+
export type SubAgentPhase = (typeof SUBAGENT_PHASE)[keyof typeof SUBAGENT_PHASE];
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* One tool call the child made, as the two tool phases report it.
|
|
9
|
+
*
|
|
10
|
+
* `ok` is a tri-state and stays one here rather than collapsing to a boolean:
|
|
11
|
+
* `null` is the call in flight, `true` a result the child accepted, `false` a
|
|
12
|
+
* result that came back to it. Flattening `null` into `false` would draw a
|
|
13
|
+
* running call as a failed one for as long as it runs.
|
|
14
|
+
*/
|
|
15
|
+
export interface SubAgentTool {
|
|
16
|
+
readonly toolCallId: string;
|
|
17
|
+
readonly name: string;
|
|
18
|
+
readonly ok: boolean | null;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* One narrowed progress announcement about a delegation.
|
|
23
|
+
*
|
|
24
|
+
* Every field but `phase` and `delegationId` is nullable because the wire's
|
|
25
|
+
* `value` is `unknown` and a malformed announcement must not take the run down
|
|
26
|
+
* with it. `null` means "said nothing about this", never "said nothing was
|
|
27
|
+
* there" — the panel leaves what it already shows alone.
|
|
28
|
+
*/
|
|
29
|
+
export interface SubAgentUpdate {
|
|
30
|
+
/** The **parent's** `delegate_task` tool-call id, not the child's run id. */
|
|
31
|
+
readonly delegationId: string;
|
|
32
|
+
/** The child agent's name, for a host that wants to style or select by it. */
|
|
33
|
+
readonly agent: string | null;
|
|
34
|
+
readonly phase: SubAgentPhase;
|
|
35
|
+
/** The server's pre-rendered line. The collapsed row needs nothing else. */
|
|
36
|
+
readonly status: string | null;
|
|
37
|
+
/** Present on the two tool phases only. */
|
|
38
|
+
readonly tool: SubAgentTool | null;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* The nested surface for one delegation: a collapsed status row that expands
|
|
43
|
+
* onto the child agent's own tool calls.
|
|
44
|
+
*
|
|
45
|
+
* ## Where it goes and why
|
|
46
|
+
*
|
|
47
|
+
* Into {@link ToolCallCard.subagentSlot} — the card the parent's own
|
|
48
|
+
* `delegate_task` call already drew. The wire keys progress on the *parent's*
|
|
49
|
+
* tool-call id, so the thing being narrated is already on screen; a floating
|
|
50
|
+
* element would have duplicated its identity and then had to explain the
|
|
51
|
+
* relationship. Attaching instead means the delegation reuses how tool cards
|
|
52
|
+
* already behave, and there is no second visual language to learn.
|
|
53
|
+
*
|
|
54
|
+
* ## The shape
|
|
55
|
+
*
|
|
56
|
+
* One row per delegation, live, carrying nothing but the server's own `status`
|
|
57
|
+
* line — which is what makes a ten-step child cost one row until somebody opens
|
|
58
|
+
* it. Two alternatives were rejected on the way here and both are worth naming:
|
|
59
|
+
* a bare status line is cheaper and gives up the detail entirely, and inline
|
|
60
|
+
* child cards in the transcript interleave parent and child with nothing marking
|
|
61
|
+
* whose is whose, in an order the persisted transcript will not reproduce.
|
|
62
|
+
*
|
|
63
|
+
* A child's steps are keyed by the child's own `toolCallId`, so the `tool_call`
|
|
64
|
+
* that opens one and the `tool_result` that settles it are the same row updated
|
|
65
|
+
* in place rather than two rows stacked.
|
|
66
|
+
*
|
|
67
|
+
* ## What it never does
|
|
68
|
+
*
|
|
69
|
+
* It never renders failure text. A `failed` phase carries none, on purpose; the
|
|
70
|
+
* detail arrives on the ordinary `TOOL_CALL_RESULT` and lands in the same card's
|
|
71
|
+
* result region, a few pixels below. Anything invented here would be this
|
|
72
|
+
* component guessing at words the server declined to send.
|
|
73
|
+
*
|
|
74
|
+
* Nothing here is persisted: the events ride the imperative carrier, so a thread
|
|
75
|
+
* restore rebuilds the tool card and not the delegation under it.
|
|
76
|
+
*
|
|
77
|
+
* Pure DOM, like the other widgets: the host appends {@link element}, and all
|
|
78
|
+
* chrome text comes from {@link UiStrings}. The status line is server text and
|
|
79
|
+
* is set with `textContent`, never parsed as markup.
|
|
80
|
+
*/
|
|
81
|
+
export class SubAgentPanel {
|
|
82
|
+
/** The panel's root; append this into the delegating card's slot. */
|
|
83
|
+
readonly element: HTMLDivElement;
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* The child agent's name, as the last update that carried one gave it.
|
|
87
|
+
*
|
|
88
|
+
* Read back rather than only written to the DOM, because the two carriers
|
|
89
|
+
* split the name away from the close: `SUBAGENT_STARTED` names the agent and
|
|
90
|
+
* `SUBAGENT_FINISHED` carries only an id, so whoever words the closing line
|
|
91
|
+
* has to recover the name from what the delegation already told it.
|
|
92
|
+
*/
|
|
93
|
+
get agent(): string | null {
|
|
94
|
+
return this.#agent;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/**
|
|
98
|
+
* The collapsed row, which is the expander as well as the status.
|
|
99
|
+
*
|
|
100
|
+
* Disabled while the child has called nothing, so a delegation that failed
|
|
101
|
+
* before it started offers no control that expands onto an empty region —
|
|
102
|
+
* the same refusal the card's own Details toggle already makes.
|
|
103
|
+
*/
|
|
104
|
+
readonly #row: HTMLButtonElement;
|
|
105
|
+
readonly #status: HTMLSpanElement;
|
|
106
|
+
readonly #steps: HTMLDivElement;
|
|
107
|
+
/** The child's tool calls, keyed by the child's own call id. */
|
|
108
|
+
readonly #stepRows = new Map<string, HTMLDivElement>();
|
|
109
|
+
#agent: string | null = null;
|
|
110
|
+
|
|
111
|
+
constructor(strings: UiStrings = DEFAULT_UI_STRINGS) {
|
|
112
|
+
this.element = document.createElement("div");
|
|
113
|
+
this.element.className = "subagent";
|
|
114
|
+
this.element.setAttribute("part", "subagent");
|
|
115
|
+
|
|
116
|
+
this.#row = document.createElement("button");
|
|
117
|
+
this.#row.type = "button";
|
|
118
|
+
this.#row.className = "subagent-row";
|
|
119
|
+
this.#row.setAttribute("part", "subagent-row");
|
|
120
|
+
this.#row.setAttribute("aria-expanded", "false");
|
|
121
|
+
this.#row.disabled = true;
|
|
122
|
+
|
|
123
|
+
// Left empty in the DOM, like the tool card's: the shadow CSS draws a
|
|
124
|
+
// spinner or a settled mark from the panel's data-phase, so a host themes
|
|
125
|
+
// the glyph without either side reaching into the other's stylesheet.
|
|
126
|
+
const icon = document.createElement("span");
|
|
127
|
+
icon.className = "subagent-icon";
|
|
128
|
+
icon.setAttribute("part", "subagent-icon");
|
|
129
|
+
icon.setAttribute("aria-hidden", "true");
|
|
130
|
+
|
|
131
|
+
this.#status = document.createElement("span");
|
|
132
|
+
this.#status.className = "subagent-status";
|
|
133
|
+
this.#status.setAttribute("part", "subagent-status");
|
|
134
|
+
// Seeded rather than left blank: an announcement whose status field is
|
|
135
|
+
// unusable must still leave a readable row, since the row is the control.
|
|
136
|
+
this.#status.textContent = strings.subAgentWorking;
|
|
137
|
+
|
|
138
|
+
this.#row.append(icon, this.#status);
|
|
139
|
+
|
|
140
|
+
this.#steps = document.createElement("div");
|
|
141
|
+
this.#steps.className = "subagent-steps";
|
|
142
|
+
this.#steps.setAttribute("part", "subagent-steps");
|
|
143
|
+
this.#steps.setAttribute("role", "list");
|
|
144
|
+
this.#steps.setAttribute("aria-label", strings.subAgentSteps);
|
|
145
|
+
this.#steps.hidden = true;
|
|
146
|
+
|
|
147
|
+
// The attribute is the state, as it is on the tool card: one place holds
|
|
148
|
+
// whether the region is open, and it is the one a screen reader reads.
|
|
149
|
+
this.#row.addEventListener("click", () => {
|
|
150
|
+
this.#setExpanded(this.#row.getAttribute("aria-expanded") !== "true");
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
this.element.append(this.#row, this.#steps);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* Fold one announcement in.
|
|
158
|
+
*
|
|
159
|
+
* Every field is applied only when the update actually carried it, so a phase
|
|
160
|
+
* that says nothing about the agent or the status leaves both as they stand.
|
|
161
|
+
* That is what lets `finished` be two keys wide on the wire without blanking
|
|
162
|
+
* the row it closes.
|
|
163
|
+
*/
|
|
164
|
+
report(update: SubAgentUpdate): void {
|
|
165
|
+
this.element.setAttribute("data-phase", update.phase);
|
|
166
|
+
if (update.agent !== null) {
|
|
167
|
+
this.#agent = update.agent;
|
|
168
|
+
this.element.setAttribute("data-agent", update.agent);
|
|
169
|
+
}
|
|
170
|
+
if (update.status !== null) {
|
|
171
|
+
this.#status.textContent = update.status;
|
|
172
|
+
}
|
|
173
|
+
if (update.tool !== null) {
|
|
174
|
+
this.#recordStep(update.tool);
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Open or settle one of the child's calls, keyed by its own id.
|
|
180
|
+
*
|
|
181
|
+
* The absence of `data-ok` is what "still running" looks like, mirroring the
|
|
182
|
+
* wire's `null` rather than inventing a third value for it — so the attribute
|
|
183
|
+
* is removed on the way in and written on the way out.
|
|
184
|
+
*/
|
|
185
|
+
#recordStep(tool: SubAgentTool): void {
|
|
186
|
+
const row = this.#stepRows.get(tool.toolCallId) ?? this.#createStep(tool);
|
|
187
|
+
if (tool.ok === null) {
|
|
188
|
+
row.removeAttribute("data-ok");
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
row.setAttribute("data-ok", String(tool.ok));
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
#createStep(tool: SubAgentTool): HTMLDivElement {
|
|
195
|
+
const row = document.createElement("div");
|
|
196
|
+
row.className = "subagent-step";
|
|
197
|
+
row.setAttribute("part", "subagent-step");
|
|
198
|
+
row.setAttribute("role", "listitem");
|
|
199
|
+
row.setAttribute("data-tool-call-id", tool.toolCallId);
|
|
200
|
+
|
|
201
|
+
const icon = document.createElement("span");
|
|
202
|
+
icon.className = "subagent-step-icon";
|
|
203
|
+
icon.setAttribute("part", "subagent-step-icon");
|
|
204
|
+
icon.setAttribute("aria-hidden", "true");
|
|
205
|
+
|
|
206
|
+
const name = document.createElement("span");
|
|
207
|
+
name.className = "subagent-step-name";
|
|
208
|
+
name.setAttribute("part", "subagent-step-name");
|
|
209
|
+
// The child's raw tool name. Not prettified and not looked up in the tool
|
|
210
|
+
// catalog: a sub-agent's tools are its own and never reached the browser's
|
|
211
|
+
// schema, and the status line above quotes the same raw name, so relabelling
|
|
212
|
+
// here would make the two lines disagree about one call.
|
|
213
|
+
name.textContent = tool.name;
|
|
214
|
+
|
|
215
|
+
row.append(icon, name);
|
|
216
|
+
this.#steps.appendChild(row);
|
|
217
|
+
this.#stepRows.set(tool.toolCallId, row);
|
|
218
|
+
// There is something behind the row now, so it becomes a control.
|
|
219
|
+
this.#row.disabled = false;
|
|
220
|
+
return row;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
#setExpanded(expanded: boolean): void {
|
|
224
|
+
this.#steps.hidden = !expanded;
|
|
225
|
+
this.#row.setAttribute("aria-expanded", String(expanded));
|
|
226
|
+
}
|
|
227
|
+
}
|