@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,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The host selectors theme rules hang off, as one record so every theme
|
|
3
|
+
* module spells them the same way.
|
|
4
|
+
*
|
|
5
|
+
* Classic and code keep today's structure, so the structural rules the newer
|
|
6
|
+
* themes share apply to every element that wears neither. Quiet is the
|
|
7
|
+
* default, so its own structure applies to every element that wears no other
|
|
8
|
+
* built-in theme -- including one whose theme is a word the library does not
|
|
9
|
+
* know, which is how a host's own named theme starts from Quiet.
|
|
10
|
+
*/
|
|
11
|
+
export const THEME_HOST = {
|
|
12
|
+
modern: ':host(:not([theme~="classic"], [theme~="code"]))',
|
|
13
|
+
quiet: ':host(:not([theme~="classic"], [theme~="code"], [theme~="soft"], [theme~="ledger"]))',
|
|
14
|
+
} as const;
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
import { FEEDBACK_EVENT, ICON_RETRY, MESSAGE_ACTIONS } from "../../constants.js";
|
|
2
|
+
import type { AgUiMessageIds } from "../../core/agui_client.js";
|
|
3
|
+
import type { FeedbackDetail } from "../../core/events/feedback_detail.js";
|
|
4
|
+
import { commaTokens } from "../../core/utils.js";
|
|
5
|
+
import { copyPayload } from "../excerpts/copy_payload.js";
|
|
6
|
+
import type { UiStrings } from "../ui_strings.js";
|
|
7
|
+
import { attachMessageActions, messageActionBar, messageActionButton } from "./message_actions.js";
|
|
8
|
+
|
|
9
|
+
/** What the answer actions need from the element that owns them. */
|
|
10
|
+
export interface AnswerActionsHost {
|
|
11
|
+
/** The custom element: its `data-message-actions`, and where feedback is dispatched. */
|
|
12
|
+
readonly element: HTMLElement;
|
|
13
|
+
/** The resolved string table. */
|
|
14
|
+
readonly strings: () => UiStrings;
|
|
15
|
+
/** Retry the last turn, as the element's public `retryLastTurn` does. */
|
|
16
|
+
readonly retry: () => void;
|
|
17
|
+
/** The element's current conversation thread. */
|
|
18
|
+
readonly threadId: () => string;
|
|
19
|
+
/** Follow the transcript's foot, as every site that adds to it does. */
|
|
20
|
+
readonly follow: () => void;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** A finished bubble that is not an answer, and so carries no rating. */
|
|
24
|
+
interface Unrateable {
|
|
25
|
+
readonly rateable: false;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* The action row under a finished answer -- copy, retry, feedback -- and the
|
|
30
|
+
* one row currently holding Retry.
|
|
31
|
+
*
|
|
32
|
+
* Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
|
|
33
|
+
* instance.
|
|
34
|
+
*/
|
|
35
|
+
export class AnswerActions {
|
|
36
|
+
readonly #host: AnswerActionsHost;
|
|
37
|
+
/**
|
|
38
|
+
* The one action row currently carrying Retry, if any.
|
|
39
|
+
*
|
|
40
|
+
* Retry belongs to the **last** turn only: re-running an older one is
|
|
41
|
+
* branching, and a page-driving agent's past turns clicked buttons that a
|
|
42
|
+
* re-run does not undo. One owner keeps exactly one offer on screen.
|
|
43
|
+
*/
|
|
44
|
+
#retryOwner: HTMLElement | null = null;
|
|
45
|
+
|
|
46
|
+
constructor(host: AnswerActionsHost) {
|
|
47
|
+
this.#host = host;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Forget the row holding Retry, with the transcript it was in. */
|
|
51
|
+
forget(): void {
|
|
52
|
+
this.#retryOwner = null;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Give a finished assistant bubble its action row, and hand it Retry.
|
|
57
|
+
*
|
|
58
|
+
* Every finished bubble gets copy and feedback -- both are safe on a message
|
|
59
|
+
* of any age. Retry moves to the newest, because it is the only one where
|
|
60
|
+
* re-running answers the same question rather than rewriting history.
|
|
61
|
+
*
|
|
62
|
+
* `data-message-actions` subtracts from that. The row is built only when
|
|
63
|
+
* something survives to go in it: an empty row still takes its margin, still
|
|
64
|
+
* answers to the `message-actions` part, and still reads to a screen reader
|
|
65
|
+
* as a group of actions with none in it.
|
|
66
|
+
*
|
|
67
|
+
* `message` names the answer, which is what a rating is filed under; a bubble
|
|
68
|
+
* that is not an answer says so instead, and has no id to give.
|
|
69
|
+
*/
|
|
70
|
+
attach(bubble: HTMLDivElement, message: AgUiMessageIds | Unrateable): void {
|
|
71
|
+
const enabled = this.#enabled();
|
|
72
|
+
const copyable = enabled.has(MESSAGE_ACTIONS.COPY);
|
|
73
|
+
// A failed run is copyable -- error text is what people paste into a bug
|
|
74
|
+
// report -- but not rateable: a rating is a statement about an *answer*,
|
|
75
|
+
// and mixing "the connection dropped" into that signal makes the host's
|
|
76
|
+
// feedback data say less than it did before.
|
|
77
|
+
const answer = "messageId" in message ? message : null;
|
|
78
|
+
const rateable = answer !== null && enabled.has(MESSAGE_ACTIONS.FEEDBACK);
|
|
79
|
+
// Read now, not at click time: the thread the message was drawn in is the
|
|
80
|
+
// one it is stored under, even if a later path kept bubbles across threads.
|
|
81
|
+
const threadId = this.#host.threadId();
|
|
82
|
+
if (copyable || rateable) {
|
|
83
|
+
attachMessageActions(bubble, {
|
|
84
|
+
strings: this.#host.strings(),
|
|
85
|
+
// Read at click time, not captured: a bubble rendered from markdown
|
|
86
|
+
// holds its text in the DOM, and that is what the user sees and means
|
|
87
|
+
// to copy. Serialised rather than read off `textContent`, which welds
|
|
88
|
+
// a table into one run of digits and picks up the code blocks' own
|
|
89
|
+
// copy buttons on the way past.
|
|
90
|
+
...(copyable
|
|
91
|
+
? {
|
|
92
|
+
text: () => copyPayload(bubble).text,
|
|
93
|
+
html: () => copyPayload(bubble).html,
|
|
94
|
+
}
|
|
95
|
+
: {}),
|
|
96
|
+
...(rateable
|
|
97
|
+
? {
|
|
98
|
+
onFeedback: (rating: "up" | "down") => {
|
|
99
|
+
this.#host.element.dispatchEvent(
|
|
100
|
+
new CustomEvent<FeedbackDetail>(FEEDBACK_EVENT, {
|
|
101
|
+
detail: {
|
|
102
|
+
content: copyPayload(bubble).text,
|
|
103
|
+
rating,
|
|
104
|
+
messageId: answer.messageId,
|
|
105
|
+
threadId,
|
|
106
|
+
// Omitted rather than undefined: a restored message has
|
|
107
|
+
// no run, and a key holding nothing reads as one that
|
|
108
|
+
// was looked up and came back empty.
|
|
109
|
+
...(answer.runId === undefined ? {} : { runId: answer.runId }),
|
|
110
|
+
},
|
|
111
|
+
bubbles: true,
|
|
112
|
+
composed: true,
|
|
113
|
+
}),
|
|
114
|
+
);
|
|
115
|
+
},
|
|
116
|
+
}
|
|
117
|
+
: {}),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
if (enabled.has(MESSAGE_ACTIONS.RETRY)) {
|
|
121
|
+
this.#moveRetryTo(messageActionBar(bubble, this.#host.strings()));
|
|
122
|
+
}
|
|
123
|
+
// The row is insertion too: without this a pinned transcript rests one row short of its foot.
|
|
124
|
+
this.#host.follow();
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/** Move the Retry button onto `bar`, taking it off whoever held it. */
|
|
128
|
+
#moveRetryTo(bar: HTMLElement): void {
|
|
129
|
+
this.#retryOwner?.querySelector(".message-action--retry")?.remove();
|
|
130
|
+
const retry = messageActionButton("retry", this.#host.strings().retryMessage, ICON_RETRY);
|
|
131
|
+
retry.addEventListener("click", () => {
|
|
132
|
+
this.#host.retry();
|
|
133
|
+
});
|
|
134
|
+
// First in the row: it is the action a reader reaches for when the answer
|
|
135
|
+
// was wrong, which is when they are least inclined to hunt for a control.
|
|
136
|
+
bar.prepend(retry);
|
|
137
|
+
this.#retryOwner = bar;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
/**
|
|
141
|
+
* Which message actions a finished bubble offers, from
|
|
142
|
+
* `data-message-actions`.
|
|
143
|
+
*
|
|
144
|
+
* **Absent means copy and retry, not all three.** Those two work with nothing
|
|
145
|
+
* wired: copy reads the DOM, retry drives this element. The rating pair does
|
|
146
|
+
* not -- it fires `ag-ui-feedback` and stores nothing by design, because a
|
|
147
|
+
* rating belongs to whatever the host already uses for product signal. With no
|
|
148
|
+
* listener the buttons still latch `aria-pressed`, so a reader is told their
|
|
149
|
+
* rating was taken and a screen reader announces it, while nothing recorded
|
|
150
|
+
* anything. This README has always said two buttons that lead nowhere are
|
|
151
|
+
* worse than none; shipping them by default was that sentence being false.
|
|
152
|
+
*
|
|
153
|
+
* A host with a listener asks for them: `data-message-actions="copy,retry,feedback"`.
|
|
154
|
+
* A value names the survivors, which makes `data-message-actions="false"` --
|
|
155
|
+
* the spelling its sibling `data-quote-selection` uses -- an empty set by
|
|
156
|
+
* falling out of the same rule rather than by a case of its own.
|
|
157
|
+
*/
|
|
158
|
+
#enabled(): ReadonlySet<string> {
|
|
159
|
+
const attr = this.#host.element.getAttribute("data-message-actions");
|
|
160
|
+
if (attr === null) {
|
|
161
|
+
return new Set([MESSAGE_ACTIONS.COPY, MESSAGE_ACTIONS.RETRY]);
|
|
162
|
+
}
|
|
163
|
+
return new Set(commaTokens(attr));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
import { renderMarkdown } from "./render_markdown.js";
|
|
2
|
+
|
|
3
|
+
/** What the streamed answer needs from the element that owns it. */
|
|
4
|
+
export interface AnswerStreamHost {
|
|
5
|
+
/** Append an empty assistant bubble to the transcript, and return it. */
|
|
6
|
+
readonly openBubble: () => HTMLDivElement;
|
|
7
|
+
/** The element's `allowImages`, read per render. */
|
|
8
|
+
readonly allowImages: () => boolean;
|
|
9
|
+
/** Keep the transcript at its foot, if the reader is there. */
|
|
10
|
+
readonly follow: () => void;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* The assistant answer currently streaming: the bubble it streams into, the
|
|
15
|
+
* text the next frame will draw, and how many deltas it arrived in.
|
|
16
|
+
*
|
|
17
|
+
* Owned one-to-one by an `<ag-ui-chat>`, and holding no state outside the
|
|
18
|
+
* instance.
|
|
19
|
+
*/
|
|
20
|
+
export class AnswerStream {
|
|
21
|
+
readonly #host: AnswerStreamHost;
|
|
22
|
+
#streamingBubble: HTMLDivElement | null = null;
|
|
23
|
+
// Text deltas applied to the current streaming bubble. >1 ⇒ the message
|
|
24
|
+
// revealed progressively as it streamed, so the word reveal must not re-animate
|
|
25
|
+
// it; ≤1 ⇒ it arrived at once and the word reveal is appropriate.
|
|
26
|
+
#streamDeltas = 0;
|
|
27
|
+
// The accumulated answer the next render will draw. Deltas overwrite it
|
|
28
|
+
// (each one carries the whole answer), so a frame always draws the latest.
|
|
29
|
+
#streamBuffer = "";
|
|
30
|
+
// The frame that render is queued on, or `null` when nothing is queued —
|
|
31
|
+
// also the flag saying a delta is still undrawn.
|
|
32
|
+
#streamFrame: number | null = null;
|
|
33
|
+
|
|
34
|
+
constructor(host: AnswerStreamHost) {
|
|
35
|
+
this.#host = host;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Text deltas the current answer has arrived in so far. */
|
|
39
|
+
get deltas(): number {
|
|
40
|
+
return this.#streamDeltas;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Count one delta received. Counted per delta received, not per render: the
|
|
45
|
+
* word reveal asks whether the answer *arrived* progressively, which
|
|
46
|
+
* coalescing renders must not change the answer to.
|
|
47
|
+
*/
|
|
48
|
+
countDelta(): void {
|
|
49
|
+
this.#streamDeltas += 1;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Queue a render of the answer so far, at most one per frame.
|
|
54
|
+
*
|
|
55
|
+
* Each `TEXT_MESSAGE_CONTENT` event carries the *whole* accumulated answer,
|
|
56
|
+
* and drawing it means marked + DOMPurify over the entire document and a
|
|
57
|
+
* wholesale replacement of the bubble's subtree. Once per token that is
|
|
58
|
+
* quadratic in the answer's length — a long answer is agent-controlled, so
|
|
59
|
+
* an ordinary run becomes a progressively stalling tab — and every rebuild
|
|
60
|
+
* takes any selection or focus inside the bubble with it.
|
|
61
|
+
*
|
|
62
|
+
* A frame is the right grain: it is the fastest anything on screen can
|
|
63
|
+
* change anyway, so a burst of tokens costs one parse and the text still
|
|
64
|
+
* appears to flow rather than in visible chunks.
|
|
65
|
+
*/
|
|
66
|
+
queue(buffer: string): void {
|
|
67
|
+
this.#streamBuffer = buffer;
|
|
68
|
+
this.#open();
|
|
69
|
+
if (this.#streamFrame !== null) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
this.#streamFrame = requestAnimationFrame(() => {
|
|
73
|
+
this.#streamFrame = null;
|
|
74
|
+
this.into(this.#streamBuffer);
|
|
75
|
+
});
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/** Render `buffer` into the streaming bubble now, dropping any queued frame. */
|
|
79
|
+
into(buffer: string): HTMLDivElement {
|
|
80
|
+
// A frame still queued would otherwise fire after this and repaint the
|
|
81
|
+
// bubble with whatever the last delta held — behind the buffer just drawn.
|
|
82
|
+
if (this.#streamFrame !== null) {
|
|
83
|
+
cancelAnimationFrame(this.#streamFrame);
|
|
84
|
+
this.#streamFrame = null;
|
|
85
|
+
}
|
|
86
|
+
this.#streamBuffer = buffer;
|
|
87
|
+
const bubble = this.#open();
|
|
88
|
+
bubble.innerHTML = renderMarkdown(buffer, { allowImages: this.#host.allowImages() });
|
|
89
|
+
this.#host.follow();
|
|
90
|
+
return bubble;
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Close the current answer's streaming bubble.
|
|
95
|
+
*
|
|
96
|
+
* Draws a queued render first. A run that ends without a text end — a
|
|
97
|
+
* cancel, an error, a round boundary — leaves the last delta sitting in the
|
|
98
|
+
* queue, and simply dropping the bubble here would strand it: the partial
|
|
99
|
+
* answer the user stopped mid-sentence would lose its final tokens, or be an
|
|
100
|
+
* empty bubble above the stopped note.
|
|
101
|
+
*/
|
|
102
|
+
end(): void {
|
|
103
|
+
if (this.#streamFrame !== null) {
|
|
104
|
+
this.into(this.#streamBuffer);
|
|
105
|
+
}
|
|
106
|
+
this.#streamingBubble = null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* The bubble the current answer streams into, opening it on first sight.
|
|
111
|
+
*
|
|
112
|
+
* Opened the moment a token arrives rather than on the frame that draws it,
|
|
113
|
+
* so the answer's container replaces the pending dots straight away and the
|
|
114
|
+
* turn never shows a gap while the first render waits for a frame.
|
|
115
|
+
*/
|
|
116
|
+
#open(): HTMLDivElement {
|
|
117
|
+
if (this.#streamingBubble === null) {
|
|
118
|
+
this.#streamingBubble = this.#host.openBubble();
|
|
119
|
+
this.#streamDeltas = 0;
|
|
120
|
+
}
|
|
121
|
+
return this.#streamingBubble;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
// An attachment chip, in the tray and in a sent message alike, the drop
|
|
2
|
+
// outline, and the note a cancelled run leaves, which sits here only
|
|
3
|
+
// because no rule moved in the split.
|
|
4
|
+
export const ATTACHMENT_CHIP_STYLES: string = `
|
|
5
|
+
/* A chip carries its own text colour because it carries its own background.
|
|
6
|
+
The same chip renders in two places with opposite inherited colours: the
|
|
7
|
+
composer tray gives it the panel's, a sent user bubble gives it the user
|
|
8
|
+
foreground, which is white on the stock light theme and near-invisible
|
|
9
|
+
against the chip. Pairing the colour with the background it belongs to makes
|
|
10
|
+
both placements read alike. Overridden below for an errored chip, which
|
|
11
|
+
keeps its red. */
|
|
12
|
+
.attachment-chip {
|
|
13
|
+
display: inline-flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
gap: 6px;
|
|
16
|
+
/* Without this the 100% below caps the content box, so the chip still
|
|
17
|
+
overflows its container by its own padding and border. Invisible while a
|
|
18
|
+
character cap kept names short; routine once the container is what bounds
|
|
19
|
+
the name. */
|
|
20
|
+
box-sizing: border-box;
|
|
21
|
+
max-width: 100%;
|
|
22
|
+
padding: 4px 8px;
|
|
23
|
+
border: 1px solid var(--_border);
|
|
24
|
+
border-radius: 999px;
|
|
25
|
+
background: var(--_assistant-bg);
|
|
26
|
+
color: var(--_text);
|
|
27
|
+
font-size: 0.85em;
|
|
28
|
+
position: relative;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.attachment-chip--error {
|
|
32
|
+
border-color: var(--_danger);
|
|
33
|
+
color: var(--_danger);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/* The type mark. Painted from currentColor, so it carries the chip's state
|
|
37
|
+
with it and turns red along with an errored one; muted by opacity rather
|
|
38
|
+
than a colour, which is what keeps that true. Sized from the chip's own text
|
|
39
|
+
rather than --ag-ui-glyph-size, the way an icon holder's glyph takes the
|
|
40
|
+
holder's size: the composer's 18px buttons would make a chip button-height. */
|
|
41
|
+
.attachment-chip-icon {
|
|
42
|
+
display: inline-flex;
|
|
43
|
+
flex: none;
|
|
44
|
+
opacity: 0.75;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.attachment-chip-icon .glyph {
|
|
48
|
+
width: 1.25em;
|
|
49
|
+
height: 1.25em;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* No character cap: the chip is already max-width 100%, so its container is
|
|
53
|
+
what bounds the name, and a fixed cap only truncated names the chip had room
|
|
54
|
+
for. min-width: 0 is what lets the flex item shrink past its content, so the
|
|
55
|
+
ellipsis appears at the container edge instead of the chip overflowing. */
|
|
56
|
+
.attachment-chip-name {
|
|
57
|
+
overflow: hidden;
|
|
58
|
+
text-overflow: ellipsis;
|
|
59
|
+
white-space: nowrap;
|
|
60
|
+
min-width: 0;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.attachment-chip-size {
|
|
64
|
+
color: var(--_muted);
|
|
65
|
+
white-space: nowrap;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
.attachment-chip--error .attachment-chip-size {
|
|
69
|
+
color: var(--_danger);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/* The progress bar fills as the file uploads. */
|
|
73
|
+
.attachment-chip-bar {
|
|
74
|
+
flex-basis: 100%;
|
|
75
|
+
height: 3px;
|
|
76
|
+
border-radius: 2px;
|
|
77
|
+
background: var(--_border);
|
|
78
|
+
overflow: hidden;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
.attachment-chip-bar-fill {
|
|
82
|
+
height: 100%;
|
|
83
|
+
background: var(--_accent);
|
|
84
|
+
transition: width 0.15s ease;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
.attachment-chip-remove,
|
|
88
|
+
.attachment-chip-retry {
|
|
89
|
+
border: none;
|
|
90
|
+
background: none;
|
|
91
|
+
color: inherit;
|
|
92
|
+
cursor: pointer;
|
|
93
|
+
padding: 0;
|
|
94
|
+
line-height: 1;
|
|
95
|
+
opacity: 0.7;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.attachment-chip-remove:hover,
|
|
99
|
+
.attachment-chip-retry:hover {
|
|
100
|
+
opacity: 1;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/* A subtle outline while a file is dragged over the shell. */
|
|
104
|
+
.chat--dragover {
|
|
105
|
+
outline: 2px dashed var(--_accent);
|
|
106
|
+
outline-offset: -4px;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* Muted "⏹ Stopped" line after a cancelled run — a note, not an error bubble. */
|
|
110
|
+
.stopped-note {
|
|
111
|
+
align-self: flex-start;
|
|
112
|
+
color: var(--_muted);
|
|
113
|
+
font-size: 12px;
|
|
114
|
+
padding: 2px 4px;
|
|
115
|
+
}
|
|
116
|
+
`;
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { ICON_FILE, ICON_FILE_IMAGE, ICON_FILE_PDF, ICON_FILE_TEXT } from "../../constants.js";
|
|
2
|
+
import type { AttachmentRef } from "../../core/attachment.js";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Render the read-only attachment chips on a sent user message bubble and on
|
|
6
|
+
* restored history — one chip per ref with a type icon, filename, and human
|
|
7
|
+
* size. Static: no progress and no remove, both of which live in the composer
|
|
8
|
+
* tray.
|
|
9
|
+
*/
|
|
10
|
+
export function renderAttachmentChips(refs: readonly AttachmentRef[]): HTMLDivElement {
|
|
11
|
+
const list = document.createElement("div");
|
|
12
|
+
list.className = "attachment-chips";
|
|
13
|
+
list.setAttribute("part", "attachment-chips");
|
|
14
|
+
for (const ref of refs) {
|
|
15
|
+
list.appendChild(renderChip(ref));
|
|
16
|
+
}
|
|
17
|
+
return list;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function renderChip(ref: AttachmentRef): HTMLDivElement {
|
|
21
|
+
const chip = document.createElement("div");
|
|
22
|
+
chip.className = "attachment-chip attachment-chip--ready";
|
|
23
|
+
chip.setAttribute("part", "attachment-chip");
|
|
24
|
+
|
|
25
|
+
const icon = document.createElement("span");
|
|
26
|
+
icon.className = "attachment-chip-icon";
|
|
27
|
+
icon.setAttribute("part", "attachment-chip-icon");
|
|
28
|
+
icon.innerHTML = iconFor(ref.mime);
|
|
29
|
+
icon.setAttribute("aria-hidden", "true");
|
|
30
|
+
|
|
31
|
+
const name = document.createElement("span");
|
|
32
|
+
name.className = "attachment-chip-name";
|
|
33
|
+
name.setAttribute("part", "attachment-chip-name");
|
|
34
|
+
name.textContent = ref.name;
|
|
35
|
+
name.title = ref.name;
|
|
36
|
+
|
|
37
|
+
const size = document.createElement("span");
|
|
38
|
+
size.className = "attachment-chip-size";
|
|
39
|
+
size.setAttribute("part", "attachment-chip-size");
|
|
40
|
+
size.textContent = formatBytes(ref.size);
|
|
41
|
+
|
|
42
|
+
chip.append(icon, name, size);
|
|
43
|
+
return chip;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* A coarse type mark for a chip — image, PDF, text document, or generic file —
|
|
48
|
+
* as inline SVG markup rather than a character, so it matches the composer's
|
|
49
|
+
* SVG buttons in weight and takes the glyph size and `currentColor`, which
|
|
50
|
+
* emoji do not.
|
|
51
|
+
*
|
|
52
|
+
* The MIME string only selects among author-written constants and is never
|
|
53
|
+
* interpolated into one, so the result is safe to assign as markup.
|
|
54
|
+
*/
|
|
55
|
+
export function iconFor(mime: string): string {
|
|
56
|
+
if (mime.startsWith("image/")) {
|
|
57
|
+
return ICON_FILE_IMAGE;
|
|
58
|
+
}
|
|
59
|
+
if (mime === "application/pdf") {
|
|
60
|
+
return ICON_FILE_PDF;
|
|
61
|
+
}
|
|
62
|
+
if (mime.startsWith("text/")) {
|
|
63
|
+
return ICON_FILE_TEXT;
|
|
64
|
+
}
|
|
65
|
+
return ICON_FILE;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** A compact human-readable byte size (e.g. `1.2 MB`). */
|
|
69
|
+
export function formatBytes(bytes: number): string {
|
|
70
|
+
if (bytes < 1024) {
|
|
71
|
+
return `${bytes} B`;
|
|
72
|
+
}
|
|
73
|
+
const units = ["KB", "MB", "GB"];
|
|
74
|
+
let value = bytes / 1024;
|
|
75
|
+
let unit = 0;
|
|
76
|
+
while (value >= 1024 && unit < units.length - 1) {
|
|
77
|
+
value /= 1024;
|
|
78
|
+
unit += 1;
|
|
79
|
+
}
|
|
80
|
+
const rounded = value < 10 ? Math.round(value * 10) / 10 : Math.round(value);
|
|
81
|
+
return `${rounded} ${units[unit]}`;
|
|
82
|
+
}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import type { UiStrings } from "../ui_strings.js";
|
|
2
|
+
|
|
3
|
+
/** The transcript's parts, owned by the element, and what fills them. */
|
|
4
|
+
export interface TranscriptOptions {
|
|
5
|
+
readonly messages: HTMLElement;
|
|
6
|
+
readonly jumpButton: HTMLButtonElement;
|
|
7
|
+
readonly emptyWrap: HTMLElement;
|
|
8
|
+
/** The greeting's text node, kept by the element so a new user name updates it. */
|
|
9
|
+
readonly greetingText: HTMLElement;
|
|
10
|
+
/** The starter chips, or `null` when the host configured none. */
|
|
11
|
+
readonly starters: HTMLElement | null;
|
|
12
|
+
readonly strings: UiStrings;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Ready the message list, its jump-to-latest control and the empty state.
|
|
17
|
+
*
|
|
18
|
+
* The empty state is built but not put into the list: the element mounts the
|
|
19
|
+
* scroller, the quote offer and the announcer first and appends it after, so
|
|
20
|
+
* the scroller's observers see the list fill exactly as they always have.
|
|
21
|
+
*/
|
|
22
|
+
export function buildTranscript(options: TranscriptOptions): void {
|
|
23
|
+
const { messages, jumpButton, emptyWrap, strings } = options;
|
|
24
|
+
messages.className = "messages";
|
|
25
|
+
messages.setAttribute("part", "messages");
|
|
26
|
+
messages.setAttribute("role", "log");
|
|
27
|
+
// NOT a live region. The streaming bubble's innerHTML is replaced inside
|
|
28
|
+
// this element on every animation frame, and `role="log"` already implies
|
|
29
|
+
// polite announcement whose default `aria-relevant` includes text
|
|
30
|
+
// additions -- so a screen reader was asked to re-announce the whole answer
|
|
31
|
+
// tens of times as it streamed. `aria-live="off"` is an explicit override
|
|
32
|
+
// of the role's implicit value, which is why the role can stay: the log
|
|
33
|
+
// semantics are what let the transcript be navigated as one, and only the
|
|
34
|
+
// announcing is the defect. Status goes to the announcer instead.
|
|
35
|
+
messages.setAttribute("aria-live", "off");
|
|
36
|
+
messages.setAttribute("aria-label", strings.conversation);
|
|
37
|
+
|
|
38
|
+
jumpButton.className = "jump-latest";
|
|
39
|
+
jumpButton.type = "button";
|
|
40
|
+
jumpButton.setAttribute("part", "jump-latest");
|
|
41
|
+
jumpButton.textContent = strings.jumpToLatest;
|
|
42
|
+
|
|
43
|
+
// Empty-state region: a host slot at the top of the list, hidden as soon as
|
|
44
|
+
// anything renders.
|
|
45
|
+
emptyWrap.className = "empty";
|
|
46
|
+
emptyWrap.setAttribute("part", "empty");
|
|
47
|
+
// The greeting heads the empty state, in a slot of its own: a host that
|
|
48
|
+
// replaces the starters keeps the greeting, and a host that replaces the
|
|
49
|
+
// greeting keeps the starters. A div rather than a heading, because this
|
|
50
|
+
// sits inside somebody else's page, which owns the document outline.
|
|
51
|
+
const greeting = document.createElement("div");
|
|
52
|
+
greeting.className = "greeting";
|
|
53
|
+
greeting.setAttribute("part", "greeting");
|
|
54
|
+
const greetingSlot = document.createElement("slot");
|
|
55
|
+
greetingSlot.name = "greeting";
|
|
56
|
+
greetingSlot.append(options.greetingText);
|
|
57
|
+
greeting.append(greetingSlot);
|
|
58
|
+
const emptySlot = document.createElement("slot");
|
|
59
|
+
emptySlot.name = "empty";
|
|
60
|
+
// Fallback content, so a host that slots its own gets exactly that and
|
|
61
|
+
// nothing of ours: the starters live *inside* the slot rather than beside
|
|
62
|
+
// it, which is the difference between an offer and an imposition.
|
|
63
|
+
if (options.starters !== null) {
|
|
64
|
+
emptySlot.append(options.starters);
|
|
65
|
+
}
|
|
66
|
+
emptyWrap.replaceChildren(greeting, emptySlot);
|
|
67
|
+
}
|