@agent-native/core 0.117.1 → 0.118.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +3 -3
- package/corpus/core/CHANGELOG.md +40 -0
- package/corpus/core/docs/content/custom-design-system.mdx +445 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +16 -0
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/a2a/types.ts +1 -0
- package/corpus/core/src/agent/types.ts +1 -1
- package/corpus/core/src/cli/context-xray-local.ts +1 -1
- package/corpus/core/src/client/AgentPanel.tsx +90 -107
- package/corpus/core/src/client/AssistantChat.tsx +30 -13
- package/corpus/core/src/client/CommandMenu.tsx +68 -178
- package/corpus/core/src/client/agent-chat-adapter.ts +3 -1
- package/corpus/core/src/client/app-providers.tsx +1 -1
- package/corpus/core/src/client/chat/message-components.tsx +116 -10
- package/corpus/core/src/client/chat/tool-call-display.tsx +26 -5
- package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
- package/corpus/core/src/client/components/ui/message-scroller.tsx +15 -1
- package/corpus/core/src/client/extensions/ExtensionViewer.tsx +4 -4
- package/corpus/core/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
- package/corpus/core/src/client/extensions/agent-native-extension-runtime.ts +1 -1
- package/corpus/core/src/client/extensions/delete-extension.ts +2 -2
- package/corpus/core/src/client/i18n.tsx +22 -0
- package/corpus/core/src/client/index.ts +17 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +25 -1
- package/corpus/core/src/client/org/TeamPage.tsx +257 -153
- package/corpus/core/src/client/progress/RunsTray.tsx +89 -88
- package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +5 -2
- package/corpus/core/src/client/resources/McpIntegrationDialog.tsx +34 -13
- package/corpus/core/src/client/resources/mcp-integration-catalog.ts +13 -0
- package/corpus/core/src/client/settings/DemoModeSection.tsx +6 -18
- package/corpus/core/src/client/settings/SecretsSection.tsx +97 -52
- package/corpus/core/src/client/settings/SettingsPanel.tsx +302 -254
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +23 -2
- package/corpus/core/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
- package/corpus/core/src/client/settings/index.ts +7 -0
- package/corpus/core/src/client/settings/useSettingsPanelController.ts +155 -0
- package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
- package/corpus/core/src/client/setup-connections/index.ts +10 -0
- package/corpus/core/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +71 -592
- package/corpus/core/src/client/sharing/ShareDialog.tsx +299 -633
- package/corpus/core/src/client/sharing/index.ts +42 -0
- package/corpus/core/src/client/sharing/share-controller-helpers.ts +318 -0
- package/corpus/core/src/client/sharing/useShareButtonController.ts +600 -0
- package/corpus/core/src/client/sharing/useShareDialogController.ts +559 -0
- package/corpus/core/src/client/sse-event-processor.ts +23 -0
- package/corpus/core/src/client/tool-display.ts +71 -0
- package/corpus/core/src/client/use-agent-engine-configured.ts +12 -19
- package/corpus/core/src/client/use-chat-threads.ts +33 -12
- package/corpus/core/src/db/client.ts +13 -10
- package/corpus/core/src/extensions/actions.ts +13 -5
- package/corpus/core/src/extensions/local.ts +1 -0
- package/corpus/core/src/extensions/routes.ts +10 -5
- package/corpus/core/src/extensions/schema.ts +5 -0
- package/corpus/core/src/extensions/slots/store.ts +14 -4
- package/corpus/core/src/extensions/store.ts +55 -19
- package/corpus/core/src/extensions/theme.ts +1 -1
- package/corpus/core/src/file-upload/registry.ts +9 -0
- package/corpus/core/src/index.browser.ts +5 -0
- package/corpus/core/src/index.ts +1 -0
- package/corpus/core/src/localization/default-messages.ts +28 -6
- package/corpus/core/src/mcp-client/oauth-routes.ts +16 -2
- package/corpus/core/src/scripts/call-agent.ts +5 -1
- package/corpus/core/src/server/action-discovery.ts +8 -0
- package/corpus/core/src/server/better-auth-instance.ts +7 -2
- package/corpus/core/src/server/email-template.ts +18 -0
- package/corpus/core/src/server/email-templates.ts +3 -0
- package/corpus/core/src/server/email.ts +40 -4
- package/corpus/core/src/server/realtime-voice.ts +1 -1
- package/corpus/core/src/sharing/actions/share-resource.ts +1 -0
- package/corpus/core/src/styles/agent-native.css +0 -24
- package/corpus/core/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/core/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/core/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/core/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/core/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
- package/corpus/core/src/templates/default/app/design-system.ts +3 -0
- package/corpus/core/src/templates/default/app/global.css +1 -1
- package/corpus/core/src/templates/default/app/i18n/ar-SA.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/de-DE.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/es-ES.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/fr-FR.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/hi-IN.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/ja-JP.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/ko-KR.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/pt-BR.ts +6 -6
- package/corpus/core/src/templates/default/app/i18n/zh-CN.ts +7 -7
- package/corpus/core/src/templates/default/app/i18n/zh-TW.ts +7 -7
- package/corpus/core/src/templates/default/app/root.tsx +5 -2
- package/corpus/core/src/templates/default/package.json +1 -0
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/core/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/core/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/core/src/user-profile/actions/get-user-profile.ts +16 -0
- package/corpus/core/src/user-profile/actions/update-user-profile.ts +24 -0
- package/corpus/core/src/user-profile/index.ts +5 -0
- package/corpus/core/src/user-profile/shared.ts +14 -0
- package/corpus/core/src/user-profile/store.ts +50 -0
- package/corpus/core/src/vite/client.ts +39 -0
- package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/analytics/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/analytics/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/analytics/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/analytics/app/design-system.ts +3 -0
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/assets/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/assets/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/assets/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/assets/app/components/ui/alert.tsx +1 -0
- package/corpus/templates/assets/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/assets/app/design-system.ts +3 -0
- package/corpus/templates/assets/app/global.css +1 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +26 -30
- package/corpus/templates/assets/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/brain/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/brain/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/brain/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/brain/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/brain/app/design-system.ts +3 -0
- package/corpus/templates/brain/app/global.css +2 -2
- package/corpus/templates/brain/app/lib/brain.ts +2 -2
- package/corpus/templates/brain/app/root.tsx +2 -2
- package/corpus/templates/brain/app/routes/sources.tsx +8 -8
- package/corpus/templates/brain/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/calendar/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/calendar/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +6 -2
- package/corpus/templates/calendar/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/calendar/app/design-system.ts +3 -0
- package/corpus/templates/calendar/app/global.css +1 -1
- package/corpus/templates/calendar/app/root.tsx +2 -2
- package/corpus/templates/calendar/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/chat/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/chat/app/design-system.ts +3 -0
- package/corpus/templates/chat/app/global.css +1 -1
- package/corpus/templates/chat/app/root.tsx +2 -2
- package/corpus/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/clips/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/clips/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/clips/actions/export-to-brain.ts +1 -1
- package/corpus/templates/clips/actions/invite-member.ts +1 -0
- package/corpus/templates/clips/app/components/library/library-layout.tsx +2 -2
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +20 -11
- package/corpus/templates/clips/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/clips/app/design-system.ts +3 -0
- package/corpus/templates/clips/app/global.css +1 -1
- package/corpus/templates/clips/app/root.tsx +7 -2
- package/corpus/templates/clips/app/routes/_app.library._index.tsx +1 -1
- package/corpus/templates/clips/app/routes/record.tsx +2 -88
- package/corpus/templates/clips/changelog/2026-07-22-builder-connected-recordings-start-resumable-upload-sessions.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-clip-thumbnails-now-come-from-the-recording-instead-of-the-p.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-clips-emails-now-render-the-agent-native-logo-in-gmail-and-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-dismissed-zoom-and-teams-meeting-note-prompts-now-stay-dismi.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-fixed-windows-recordings-aborting-during-the-countdown.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-permissions-and-rewind-controls-are-now-grouped-with-clearer.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-quieter-permissions-and-rewind-controls.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-22-the-desktop-popover-opens-centered-under-the-menu-bar-icon-o.md +6 -0
- package/corpus/templates/clips/desktop/src/app.tsx +100 -62
- package/corpus/templates/clips/desktop/src/lib/meeting-notification-dismissal.ts +31 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +4 -167
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +10 -1
- package/corpus/templates/clips/desktop/src/styles.css +111 -36
- package/corpus/templates/clips/desktop/src-tauri/src/adhoc_meetings_watcher.rs +67 -4
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +11 -2
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +51 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +5 -1
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +0 -189
- package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +62 -0
- package/corpus/templates/clips/desktop/src-tauri/src/shortcuts.rs +37 -2
- package/corpus/templates/clips/desktop/src-tauri/src/tray.rs +18 -0
- package/corpus/templates/clips/server/plugins/db.ts +6 -2
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/content/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/content/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/content/app/components/editor/DocumentToolbar.tsx +41 -59
- package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +41 -41
- package/corpus/templates/content/app/components/editor/database/GalleryView.tsx +2 -1
- package/corpus/templates/content/app/components/editor/database/ListView.tsx +2 -1
- package/corpus/templates/content/app/components/editor/database/TimelineView.tsx +9 -9
- package/corpus/templates/content/app/components/editor/database/sidebar.tsx +7 -7
- package/corpus/templates/content/app/components/editor/database-sources/BuilderSourceReviewDialog.tsx +11 -11
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +3 -3
- package/corpus/templates/content/app/components/ui/checkbox.tsx +1 -0
- package/corpus/templates/content/app/components/ui/collapsible.tsx +1 -0
- package/corpus/templates/content/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/content/app/design-system.ts +3 -0
- package/corpus/templates/content/app/global.css +30 -4
- package/corpus/templates/content/app/root.tsx +2 -2
- package/corpus/templates/content/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/content/changelog/2026-07-22-page-actions-are-grouped-into-the-three-dots-menu-for-a-clea.md +6 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +10 -10
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +1 -6
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +3 -2
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +13 -12
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +17 -17
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +8 -8
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +3 -8
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +2 -1
- package/corpus/templates/crm/app/components/crm/Surface.tsx +3 -2
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +2 -2
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +7 -7
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +1 -1
- package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
- package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/crm/app/design-system.ts +3 -0
- package/corpus/templates/crm/app/global.css +1 -1
- package/corpus/templates/crm/app/root.tsx +9 -6
- package/corpus/templates/crm/app/routes/dashboard.tsx +1 -1
- package/corpus/templates/crm/app/routes/proposals.tsx +13 -13
- package/corpus/templates/crm/app/routes/setup.tsx +9 -9
- package/corpus/templates/crm/app/routes/tasks.tsx +14 -14
- package/corpus/templates/crm/app/routes/views.tsx +16 -16
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/design/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/design/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +19 -1
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +12 -1
- package/corpus/templates/design/app/components/design/EditPanel.tsx +177 -52
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +179 -59
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +74 -27
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +2 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -8
- package/corpus/templates/design/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/design/app/components/ui/command.tsx +1 -0
- package/corpus/templates/design/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/design/app/design-system.ts +3 -0
- package/corpus/templates/design/app/global.css +1 -1
- package/corpus/templates/design/app/hooks/use-navigation-state.ts +6 -5
- package/corpus/templates/design/app/root.tsx +2 -2
- package/corpus/templates/design/changelog/2026-07-22-design-owners-can-keep-editing-their-designs-after-switching.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-inspector-tabs-keep-their-text-labels-at-narrow-widths.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-narrow-breakpoint-previews-keep-their-device-labels-readable.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-removed-the-draft-status-chip-from-the-design-editor.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-responsive-breakpoint-controls-stay-within-narrow-sidebars.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-responsive-peers-now-use-a-softer-selection-highlight-withou.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-rotate-from-context-menu.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-the-selection-outline-now-stays-attached-while-moving-screen.md +6 -0
- package/corpus/templates/design/changelog/2026-07-22-view-only-designs-now-support-figma-style-layer-inspection-w.md +6 -0
- package/corpus/templates/design/server/db/index.ts +4 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/dispatch/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/dispatch/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/dispatch/app/components/ui/button.tsx +1 -0
- package/corpus/templates/dispatch/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/dispatch/app/design-system.ts +3 -0
- package/corpus/templates/dispatch/app/dispatch-extensions.tsx +2 -2
- package/corpus/templates/dispatch/app/global.css +1 -1
- package/corpus/templates/dispatch/app/root.tsx +12 -9
- package/corpus/templates/dispatch/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/dispatch/package.json +1 -0
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/forms/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/forms/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/forms/app/components/layout/Layout.tsx +1 -1
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +3 -3
- package/corpus/templates/forms/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/forms/app/design-system.ts +3 -0
- package/corpus/templates/forms/app/global.css +1 -1
- package/corpus/templates/forms/app/hooks/use-forms.ts +55 -2
- package/corpus/templates/forms/app/i18n/en-US.ts +2 -0
- package/corpus/templates/forms/app/pages/FormBuilderPage.tsx +3 -3
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +23 -6
- package/corpus/templates/forms/app/root.tsx +2 -2
- package/corpus/templates/forms/changelog/2026-07-22-forms-now-archive-with-optimistic-feedback.md +6 -0
- package/corpus/templates/forms/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/forms/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/macros/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/macros/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +2 -2
- package/corpus/templates/macros/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/macros/app/design-system.ts +3 -0
- package/corpus/templates/macros/app/root.tsx +2 -2
- package/corpus/templates/macros/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/mail/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/mail/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +134 -93
- package/corpus/templates/mail/app/components/email/email-iframe-document.ts +8 -2
- package/corpus/templates/mail/app/components/layout/AppLayout.tsx +3 -3
- package/corpus/templates/mail/app/components/layout/CommandPalette.tsx +2 -2
- package/corpus/templates/mail/app/components/ui/textarea.tsx +1 -21
- package/corpus/templates/mail/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/mail/app/design-system.ts +3 -0
- package/corpus/templates/mail/app/global.css +1 -1
- package/corpus/templates/mail/changelog/2026-07-22-email-messages-no-longer-flash-with-an-unstyled-page-while-l.md +6 -0
- package/corpus/templates/mail/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/plan/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/plan/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +1 -1
- package/corpus/templates/plan/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/plan/app/design-system.ts +3 -0
- package/corpus/templates/plan/app/global.css +1 -1
- package/corpus/templates/plan/app/root.tsx +2 -2
- package/corpus/templates/plan/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/slides/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/slides/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/slides/app/components/ui/toolkit-provider.tsx +6 -1
- package/corpus/templates/slides/app/design-system.ts +3 -0
- package/corpus/templates/slides/app/root.tsx +2 -2
- package/corpus/templates/slides/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-22-slides-no-longer-fail-intermittently-on-fresh-server-instances.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-22-uploaded-screenshots-can-now-be-analyzed-and-recreated-as-ed.md +6 -0
- package/corpus/templates/slides/server/lib/chat-attachments.ts +7 -3
- package/corpus/templates/slides/server/plugins/db.ts +44 -17
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/corpus/templates/tasks/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +22 -2
- package/corpus/templates/tasks/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/corpus/templates/tasks/app/components/ui/toolkit-provider.tsx +17 -0
- package/corpus/templates/tasks/app/design-system.ts +3 -0
- package/corpus/templates/tasks/app/global.css +1 -1
- package/corpus/templates/tasks/app/root.tsx +5 -2
- package/corpus/toolkit/CHANGELOG.md +14 -0
- package/corpus/toolkit/agent-native.eject.json +71 -0
- package/corpus/toolkit/package.json +31 -1
- package/corpus/toolkit/src/chat-history/ChatHistoryRail.tsx +100 -39
- package/corpus/toolkit/src/chat-history/index.ts +9 -0
- package/corpus/toolkit/src/chat-history/useChatHistoryRailController.ts +76 -0
- package/corpus/toolkit/src/chat-history.css +2 -0
- package/corpus/toolkit/src/composer/ComposerPlusMenu.tsx +11 -8
- package/corpus/toolkit/src/composer/PromptComposer.tsx +27 -6
- package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +107 -22
- package/corpus/toolkit/src/conformance/__fixtures__/css-in-js-adapter.tsx +401 -0
- package/corpus/toolkit/src/conformance/index.ts +3 -0
- package/corpus/toolkit/src/conformance/runner.tsx +710 -0
- package/corpus/toolkit/src/conformance/types.ts +45 -0
- package/corpus/toolkit/src/conformance/version.ts +22 -0
- package/corpus/toolkit/src/design-system/components.tsx +146 -0
- package/corpus/toolkit/src/design-system/context.tsx +31 -0
- package/corpus/toolkit/src/design-system/default-adapter.tsx +915 -0
- package/corpus/toolkit/src/design-system/definition.ts +14 -0
- package/corpus/toolkit/src/design-system/error-boundary.tsx +37 -0
- package/corpus/toolkit/src/design-system/index.ts +7 -0
- package/corpus/toolkit/src/design-system/theme.ts +145 -0
- package/corpus/toolkit/src/design-system/types.ts +363 -0
- package/corpus/toolkit/src/provider.tsx +98 -5
- package/corpus/toolkit/src/ui/button.tsx +95 -6
- package/corpus/toolkit/src/ui/dialog.tsx +48 -23
- package/corpus/toolkit/src/ui/popover.tsx +16 -2
- package/corpus/toolkit/src/ui/select.tsx +7 -3
- package/corpus/toolkit/src/ui/sidebar.tsx +47 -48
- package/corpus/toolkit/src/ui/tooltip.tsx +7 -3
- package/dist/a2a/types.d.ts +1 -1
- package/dist/a2a/types.d.ts.map +1 -1
- package/dist/a2a/types.js.map +1 -1
- package/dist/agent/types.d.ts +1 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/cli/context-xray-local.js +1 -1
- package/dist/cli/context-xray-local.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +14 -14
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +26 -15
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/CommandMenu.d.ts.map +1 -1
- package/dist/client/CommandMenu.js +18 -106
- package/dist/client/CommandMenu.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +2 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/app-providers.d.ts.map +1 -1
- package/dist/client/app-providers.js +1 -1
- package/dist/client/app-providers.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +9 -1
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +62 -7
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +20 -5
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
- package/dist/client/chat/widgets/InlineExtensionWidget.js +9 -12
- package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
- package/dist/client/components/ui/message-scroller.d.ts +1 -1
- package/dist/client/components/ui/message-scroller.d.ts.map +1 -1
- package/dist/client/components/ui/message-scroller.js +4 -3
- package/dist/client/components/ui/message-scroller.js.map +1 -1
- package/dist/client/extensions/ExtensionViewer.js +2 -2
- package/dist/client/extensions/ExtensionViewer.js.map +1 -1
- package/dist/client/extensions/ExtensionsSidebarSection.js +11 -11
- package/dist/client/extensions/ExtensionsSidebarSection.js.map +1 -1
- package/dist/client/extensions/agent-native-extension-runtime.js +1 -1
- package/dist/client/extensions/agent-native-extension-runtime.js.map +1 -1
- package/dist/client/extensions/delete-extension.d.ts +1 -1
- package/dist/client/extensions/delete-extension.d.ts.map +1 -1
- package/dist/client/extensions/delete-extension.js +1 -1
- package/dist/client/extensions/delete-extension.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +9 -0
- package/dist/client/i18n.js.map +1 -1
- package/dist/client/index.d.ts +2 -2
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +2 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +3 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +12 -4
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +41 -33
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +9 -10
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
- package/dist/client/resources/McpConnectionSuggestion.js +5 -4
- package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.d.ts.map +1 -1
- package/dist/client/resources/McpIntegrationDialog.js +10 -8
- package/dist/client/resources/McpIntegrationDialog.js.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
- package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
- package/dist/client/resources/mcp-integration-catalog.js +13 -0
- package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
- package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
- package/dist/client/settings/DemoModeSection.js +2 -5
- package/dist/client/settings/DemoModeSection.js.map +1 -1
- package/dist/client/settings/SecretsSection.d.ts.map +1 -1
- package/dist/client/settings/SecretsSection.js +18 -6
- package/dist/client/settings/SecretsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +87 -119
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js +16 -1
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.d.ts.map +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +2 -5
- package/dist/client/settings/VoiceTranscriptionSection.js.map +1 -1
- package/dist/client/settings/index.d.ts +1 -0
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -0
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/settings/useSettingsPanelController.d.ts +22 -0
- package/dist/client/settings/useSettingsPanelController.d.ts.map +1 -0
- package/dist/client/settings/useSettingsPanelController.js +103 -0
- package/dist/client/settings/useSettingsPanelController.js.map +1 -0
- package/dist/client/setup-connections/BuilderConnectCard.d.ts +14 -6
- package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -1
- package/dist/client/setup-connections/BuilderConnectCard.js +24 -16
- package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -1
- package/dist/client/setup-connections/index.d.ts +2 -1
- package/dist/client/setup-connections/index.d.ts.map +1 -1
- package/dist/client/setup-connections/index.js +2 -1
- package/dist/client/setup-connections/index.js.map +1 -1
- package/dist/client/setup-connections/useBuilderConnectCardController.d.ts +34 -0
- package/dist/client/setup-connections/useBuilderConnectCardController.d.ts.map +1 -0
- package/dist/client/setup-connections/useBuilderConnectCardController.js +39 -0
- package/dist/client/setup-connections/useBuilderConnectCardController.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +5 -5
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +19 -464
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.d.ts +6 -6
- package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
- package/dist/client/sharing/ShareDialog.js +69 -283
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/client/sharing/index.d.ts +3 -0
- package/dist/client/sharing/index.d.ts.map +1 -1
- package/dist/client/sharing/index.js +3 -0
- package/dist/client/sharing/index.js.map +1 -1
- package/dist/client/sharing/share-controller-helpers.d.ts +70 -0
- package/dist/client/sharing/share-controller-helpers.d.ts.map +1 -0
- package/dist/client/sharing/share-controller-helpers.js +224 -0
- package/dist/client/sharing/share-controller-helpers.js.map +1 -0
- package/dist/client/sharing/useShareButtonController.d.ts +91 -0
- package/dist/client/sharing/useShareButtonController.d.ts.map +1 -0
- package/dist/client/sharing/useShareButtonController.js +397 -0
- package/dist/client/sharing/useShareButtonController.js.map +1 -0
- package/dist/client/sharing/useShareDialogController.d.ts +109 -0
- package/dist/client/sharing/useShareDialogController.d.ts.map +1 -0
- package/dist/client/sharing/useShareDialogController.js +348 -0
- package/dist/client/sharing/useShareDialogController.js.map +1 -0
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +21 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/tool-display.d.ts +16 -0
- package/dist/client/tool-display.d.ts.map +1 -1
- package/dist/client/tool-display.js +52 -0
- package/dist/client/tool-display.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts +3 -2
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +7 -19
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +21 -8
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/db/client.d.ts +7 -7
- package/dist/db/client.d.ts.map +1 -1
- package/dist/db/client.js +13 -10
- package/dist/db/client.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +8 -5
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/local.d.ts.map +1 -1
- package/dist/extensions/local.js +1 -0
- package/dist/extensions/local.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +9 -4
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/schema.d.ts +23 -2
- package/dist/extensions/schema.d.ts.map +1 -1
- package/dist/extensions/schema.js +5 -0
- package/dist/extensions/schema.js.map +1 -1
- package/dist/extensions/slots/store.d.ts +1 -1
- package/dist/extensions/slots/store.d.ts.map +1 -1
- package/dist/extensions/slots/store.js +4 -4
- package/dist/extensions/slots/store.js.map +1 -1
- package/dist/extensions/store.d.ts +1 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +38 -21
- package/dist/extensions/store.js.map +1 -1
- package/dist/extensions/theme.js +1 -1
- package/dist/extensions/theme.js.map +1 -1
- package/dist/file-upload/registry.d.ts.map +1 -1
- package/dist/file-upload/registry.js +9 -0
- package/dist/file-upload/registry.js.map +1 -1
- package/dist/index.browser.d.ts +1 -0
- package/dist/index.browser.d.ts.map +1 -1
- package/dist/index.browser.js +1 -0
- package/dist/index.browser.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/localization/default-messages.d.ts +20 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +26 -6
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/oauth-routes.d.ts +2 -0
- package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
- package/dist/mcp-client/oauth-routes.js +12 -2
- package/dist/mcp-client/oauth-routes.js.map +1 -1
- package/dist/observability/routes.d.ts +3 -3
- package/dist/provider-api/actions/custom-provider-registration.d.ts +3 -3
- package/dist/provider-api/actions/provider-api.d.ts +11 -11
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/scripts/call-agent.d.ts.map +1 -1
- package/dist/scripts/call-agent.js +5 -1
- package/dist/scripts/call-agent.js.map +1 -1
- package/dist/secrets/routes.d.ts +6 -6
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +8 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/better-auth-instance.d.ts +7 -2
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/email-template.d.ts +3 -0
- package/dist/server/email-template.d.ts.map +1 -1
- package/dist/server/email-template.js +13 -0
- package/dist/server/email-template.js.map +1 -1
- package/dist/server/email-templates.d.ts.map +1 -1
- package/dist/server/email-templates.js +3 -0
- package/dist/server/email-templates.js.map +1 -1
- package/dist/server/email.d.ts.map +1 -1
- package/dist/server/email.js +27 -4
- package/dist/server/email.js.map +1 -1
- package/dist/server/realtime-voice.js +1 -1
- package/dist/server/realtime-voice.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/sharing/actions/share-resource.js +1 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/styles/agent-native.css +0 -24
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/dist/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
- package/dist/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/dist/templates/chat/app/components/layout/Sidebar.tsx +2 -2
- package/dist/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
- package/dist/templates/chat/app/design-system.ts +3 -0
- package/dist/templates/chat/app/global.css +1 -1
- package/dist/templates/chat/app/root.tsx +2 -2
- package/dist/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/dist/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
- package/dist/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/dist/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
- package/dist/templates/default/app/design-system.ts +3 -0
- package/dist/templates/default/app/global.css +1 -1
- package/dist/templates/default/app/i18n/ar-SA.ts +6 -6
- package/dist/templates/default/app/i18n/de-DE.ts +6 -6
- package/dist/templates/default/app/i18n/en-US.ts +6 -6
- package/dist/templates/default/app/i18n/es-ES.ts +6 -6
- package/dist/templates/default/app/i18n/fr-FR.ts +6 -6
- package/dist/templates/default/app/i18n/hi-IN.ts +6 -6
- package/dist/templates/default/app/i18n/ja-JP.ts +6 -6
- package/dist/templates/default/app/i18n/ko-KR.ts +6 -6
- package/dist/templates/default/app/i18n/pt-BR.ts +6 -6
- package/dist/templates/default/app/i18n/zh-CN.ts +7 -7
- package/dist/templates/default/app/i18n/zh-TW.ts +7 -7
- package/dist/templates/default/app/root.tsx +5 -2
- package/dist/templates/default/package.json +1 -0
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/dist/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/dist/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
- package/dist/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/dist/user-profile/actions/get-user-profile.d.ts +4 -0
- package/dist/user-profile/actions/get-user-profile.d.ts.map +1 -0
- package/dist/user-profile/actions/get-user-profile.js +14 -0
- package/dist/user-profile/actions/get-user-profile.js.map +1 -0
- package/dist/user-profile/actions/update-user-profile.d.ts +6 -0
- package/dist/user-profile/actions/update-user-profile.d.ts.map +1 -0
- package/dist/user-profile/actions/update-user-profile.js +20 -0
- package/dist/user-profile/actions/update-user-profile.js.map +1 -0
- package/dist/user-profile/index.d.ts +2 -0
- package/dist/user-profile/index.d.ts.map +1 -0
- package/dist/user-profile/index.js +2 -0
- package/dist/user-profile/index.js.map +1 -0
- package/dist/user-profile/shared.d.ts +7 -0
- package/dist/user-profile/shared.d.ts.map +1 -0
- package/dist/user-profile/shared.js +6 -0
- package/dist/user-profile/shared.js.map +1 -0
- package/dist/user-profile/store.d.ts +4 -0
- package/dist/user-profile/store.d.ts.map +1 -0
- package/dist/user-profile/store.js +38 -0
- package/dist/user-profile/store.js.map +1 -0
- package/dist/vite/client.d.ts +3 -0
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +31 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/custom-design-system.mdx +445 -0
- package/docs/content/toolkit-ui.mdx +16 -0
- package/package.json +3 -2
- package/src/a2a/types.ts +1 -0
- package/src/agent/types.ts +1 -1
- package/src/cli/context-xray-local.ts +1 -1
- package/src/client/AgentPanel.tsx +90 -107
- package/src/client/AssistantChat.tsx +30 -13
- package/src/client/CommandMenu.tsx +68 -178
- package/src/client/agent-chat-adapter.ts +3 -1
- package/src/client/app-providers.tsx +1 -1
- package/src/client/chat/message-components.tsx +116 -10
- package/src/client/chat/tool-call-display.tsx +26 -5
- package/src/client/chat/widgets/InlineExtensionWidget.tsx +14 -40
- package/src/client/components/ui/message-scroller.tsx +15 -1
- package/src/client/extensions/ExtensionViewer.tsx +4 -4
- package/src/client/extensions/ExtensionsSidebarSection.tsx +11 -11
- package/src/client/extensions/agent-native-extension-runtime.ts +1 -1
- package/src/client/extensions/delete-extension.ts +2 -2
- package/src/client/i18n.tsx +22 -0
- package/src/client/index.ts +17 -0
- package/src/client/org/OrgSwitcher.tsx +25 -1
- package/src/client/org/TeamPage.tsx +257 -153
- package/src/client/progress/RunsTray.tsx +89 -88
- package/src/client/resources/McpConnectionSuggestion.tsx +5 -2
- package/src/client/resources/McpIntegrationDialog.tsx +34 -13
- package/src/client/resources/mcp-integration-catalog.ts +13 -0
- package/src/client/settings/DemoModeSection.tsx +6 -18
- package/src/client/settings/SecretsSection.tsx +97 -52
- package/src/client/settings/SettingsPanel.tsx +302 -254
- package/src/client/settings/SettingsTabsPage.tsx +23 -2
- package/src/client/settings/VoiceTranscriptionSection.tsx +7 -18
- package/src/client/settings/index.ts +7 -0
- package/src/client/settings/useSettingsPanelController.ts +155 -0
- package/src/client/setup-connections/BuilderConnectCard.tsx +116 -51
- package/src/client/setup-connections/index.ts +10 -0
- package/src/client/setup-connections/useBuilderConnectCardController.ts +82 -0
- package/src/client/sharing/ShareButton.tsx +71 -592
- package/src/client/sharing/ShareDialog.tsx +299 -633
- package/src/client/sharing/index.ts +42 -0
- package/src/client/sharing/share-controller-helpers.ts +318 -0
- package/src/client/sharing/useShareButtonController.ts +600 -0
- package/src/client/sharing/useShareDialogController.ts +559 -0
- package/src/client/sse-event-processor.ts +23 -0
- package/src/client/tool-display.ts +71 -0
- package/src/client/use-agent-engine-configured.ts +12 -19
- package/src/client/use-chat-threads.ts +33 -12
- package/src/db/client.ts +13 -10
- package/src/extensions/actions.ts +13 -5
- package/src/extensions/local.ts +1 -0
- package/src/extensions/routes.ts +10 -5
- package/src/extensions/schema.ts +5 -0
- package/src/extensions/slots/store.ts +14 -4
- package/src/extensions/store.ts +55 -19
- package/src/extensions/theme.ts +1 -1
- package/src/file-upload/registry.ts +9 -0
- package/src/index.browser.ts +5 -0
- package/src/index.ts +1 -0
- package/src/localization/default-messages.ts +28 -6
- package/src/mcp-client/oauth-routes.ts +16 -2
- package/src/scripts/call-agent.ts +5 -1
- package/src/server/action-discovery.ts +8 -0
- package/src/server/better-auth-instance.ts +7 -2
- package/src/server/email-template.ts +18 -0
- package/src/server/email-templates.ts +3 -0
- package/src/server/email.ts +40 -4
- package/src/server/realtime-voice.ts +1 -1
- package/src/sharing/actions/share-resource.ts +1 -0
- package/src/styles/agent-native.css +0 -24
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/src/templates/chat/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +22 -2
- package/src/templates/chat/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/src/templates/chat/app/components/layout/Sidebar.tsx +2 -2
- package/src/templates/chat/app/components/ui/toolkit-provider.tsx +6 -1
- package/src/templates/chat/app/design-system.ts +3 -0
- package/src/templates/chat/app/global.css +1 -1
- package/src/templates/chat/app/root.tsx +2 -2
- package/src/templates/chat/changelog/2026-07-22-manage-agent-navigation-now-uses-the-connected-nodes-icon.md +6 -0
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/src/templates/default/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +22 -2
- package/src/templates/default/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/src/templates/default/app/components/ui/toolkit-provider.tsx +10 -0
- package/src/templates/default/app/design-system.ts +3 -0
- package/src/templates/default/app/global.css +1 -1
- package/src/templates/default/app/i18n/ar-SA.ts +6 -6
- package/src/templates/default/app/i18n/de-DE.ts +6 -6
- package/src/templates/default/app/i18n/en-US.ts +6 -6
- package/src/templates/default/app/i18n/es-ES.ts +6 -6
- package/src/templates/default/app/i18n/fr-FR.ts +6 -6
- package/src/templates/default/app/i18n/hi-IN.ts +6 -6
- package/src/templates/default/app/i18n/ja-JP.ts +6 -6
- package/src/templates/default/app/i18n/ko-KR.ts +6 -6
- package/src/templates/default/app/i18n/pt-BR.ts +6 -6
- package/src/templates/default/app/i18n/zh-CN.ts +7 -7
- package/src/templates/default/app/i18n/zh-TW.ts +7 -7
- package/src/templates/default/app/root.tsx +5 -2
- package/src/templates/default/package.json +1 -0
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/src/templates/headless/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +43 -2
- package/src/templates/workspace-core/.agents/skills/customizing-agent-native/SKILL.md +86 -11
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +22 -2
- package/src/templates/workspace-core/.agents/skills/shadcn-ui/SKILL.md +28 -4
- package/src/user-profile/actions/get-user-profile.ts +16 -0
- package/src/user-profile/actions/update-user-profile.ts +24 -0
- package/src/user-profile/index.ts +5 -0
- package/src/user-profile/shared.ts +14 -0
- package/src/user-profile/store.ts +50 -0
- package/src/vite/client.ts +39 -0
- package/corpus/templates/analytics/app/components/ui/calendar.tsx +0 -70
- package/corpus/templates/analytics/app/components/ui/chart.tsx +0 -386
- package/corpus/templates/calendar/app/components/ui/sonner.tsx +0 -58
- package/corpus/templates/forms/app/components/ui/calendar.tsx +0 -214
- package/corpus/templates/forms/app/components/ui/chart.tsx +0 -379
- package/corpus/templates/forms/app/components/ui/command.tsx +0 -153
- package/corpus/templates/forms/app/components/ui/context-menu.tsx +0 -198
- package/corpus/templates/forms/app/components/ui/menubar.tsx +0 -254
- package/corpus/templates/macros/app/components/ui/menubar.tsx +0 -238
- package/corpus/templates/macros/app/components/ui/progress.tsx +0 -26
- package/corpus/templates/mail/app/components/ui/calendar.tsx +0 -211
- package/corpus/templates/mail/app/components/ui/chart.tsx +0 -379
- package/corpus/templates/mail/app/components/ui/command.tsx +0 -153
- package/corpus/templates/mail/app/components/ui/context-menu.tsx +0 -198
- package/corpus/templates/mail/app/components/ui/menubar.tsx +0 -254
- package/corpus/templates/tasks/app/components/ui/accordion.tsx +0 -56
- package/corpus/templates/tasks/app/components/ui/aspect-ratio.tsx +0 -5
- package/corpus/templates/tasks/app/components/ui/breadcrumb.tsx +0 -115
- package/corpus/templates/tasks/app/components/ui/calendar.tsx +0 -70
- package/corpus/templates/tasks/app/components/ui/carousel.tsx +0 -260
- package/corpus/templates/tasks/app/components/ui/chart.tsx +0 -379
- package/corpus/templates/tasks/app/components/ui/form.tsx +0 -177
- package/corpus/templates/tasks/app/components/ui/hover-card.tsx +0 -27
- package/corpus/templates/tasks/app/components/ui/input-otp.tsx +0 -69
- package/corpus/templates/tasks/app/components/ui/menubar.tsx +0 -254
- package/corpus/templates/tasks/app/components/ui/navigation-menu.tsx +0 -128
- package/corpus/templates/tasks/app/components/ui/pagination.tsx +0 -121
- package/corpus/templates/tasks/app/components/ui/resizable.tsx +0 -43
- package/corpus/templates/tasks/app/components/ui/sidebar.tsx +0 -782
- package/corpus/templates/tasks/app/components/ui/toggle.tsx +0 -43
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"message-components.js","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: message-timestamp helpers, SelectionAttachedPill, UserMessage,\n// AssistantMessage, MessageBranchPicker, CheckpointContext, MessageActionsContext,\n// RunningActivityStatus, ThinkingIndicator, and displayableUserMessageText.\n\nimport { isPastedTextAttachmentName } from \"@agent-native/toolkit/composer/pasted-text\";\nimport { PastedTextChip } from \"@agent-native/toolkit/composer/PastedTextChip\";\nimport {\n useThread,\n useMessageRuntime,\n useComposer,\n MessagePrimitive,\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n useMessagePartReasoning,\n useMessagePartRuntime,\n useAuiState,\n} from \"@assistant-ui/react\";\nimport type { Attachment } from \"@assistant-ui/react\";\nimport {\n IconX,\n IconCheck,\n IconCopy,\n IconChevronDown,\n IconChevronLeft,\n IconChevronRight,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconRefresh,\n IconArrowBackUp,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconPencil,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\n\nimport { getActiveRun } from \"../active-run-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { ThumbsFeedback } from \"../observability/ThumbsFeedback.js\";\nimport { McpConnectionSuggestion } from \"../resources/McpConnectionSuggestion.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport { cn } from \"../utils.js\";\nimport {\n MarkdownText,\n renderMarkdownToClipboardHtml,\n} from \"./markdown-renderer.js\";\nimport {\n ToolCallFallback,\n ToolActivityPresentation,\n FilesChangedSummary,\n ASSISTANT_VISIBLE_TOOL_CALL_LIMIT,\n ChatRunningContext,\n ChatRunDurationContext,\n RanToolsSummary,\n ReasoningCell,\n WorkedForSummary,\n} from \"./tool-call-display.js\";\n\n// ─── Pending selection context key ───────────────────────────────────────────\n// Mirrored from AssistantChat to avoid a cross-import on a private constant.\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\n\n// ─── displayableUserMessageText ───────────────────────────────────────────────\n\nexport function displayableUserMessageText(text: string): string {\n return text\n .replace(/<context\\b[^>]*>[\\s\\S]*?<\\/context>\\n?/gi, \"\")\n .replace(/<context\\b[^>]*>[\\s\\S]*$/gi, \"\")\n .replace(/<\\/context>/gi, \"\")\n .trim();\n}\n\nexport function isHiddenUserMessage(message: unknown): boolean {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: {\n agentNativeHiddenUserMessage?: unknown;\n agentNativeRecoveryAction?: unknown;\n };\n }\n | undefined;\n return (\n meta?.custom?.agentNativeHiddenUserMessage === true ||\n meta?.custom?.agentNativeRecoveryAction === \"continue\" ||\n meta?.custom?.agentNativeRecoveryAction === \"retry\"\n );\n}\n\n// ─── Message timestamp helpers ────────────────────────────────────────────────\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nexport function MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\n// ─── SelectionAttachedPill ────────────────────────────────────────────────────\n\nexport function SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"agent-selection-attached-pill shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n // Dispatch clear event; AssistantChat owns the DELETE call.\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-clear-requested\"),\n );\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\n// ─── CheckpointContext / MessageActionsContext ────────────────────────────────\n\nexport const CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nexport const MessageActionsContext = React.createContext<{\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n} | null>(null);\n\n// ─── MessageBranchPicker ──────────────────────────────────────────────────────\n\nexport function MessageBranchPicker() {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <button\n type=\"button\"\n aria-label=\"Previous branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Previous>\n <span className=\"tabular-nums select-none\">\n <BranchPickerPrimitive.Number />\n {\"/\"}\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <button\n type=\"button\"\n aria-label=\"Next branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n}\n\n// ─── Mention rendering ────────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\n// ─── UserMessageAttachments ───────────────────────────────────────────────────\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n // Prefer the hosted upload URL when available (set by the server after\n // preUploadAttachments). This avoids re-shipping base64 in each poll\n // and lets the browser cache the image via a stable URL.\n const uploadUrl = (\n att as unknown as { metadata?: { uploadUrl?: string } }\n ).metadata?.uploadUrl;\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" &&\n \"image\" in p &&\n !!(p as { image?: string }).image,\n );\n const imageSrc = uploadUrl || imagePart?.image || null;\n if (imageSrc) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imageSrc}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── UserMessageEditComposer ──────────────────────────────────────────────────\n\nfunction UserMessageEditComposer() {\n return (\n <ComposerPrimitive.Root className=\"flex flex-col gap-2 rounded-lg border border-border bg-background px-3 py-2 shadow-sm\">\n <ComposerPrimitive.Input\n className=\"w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus:outline-none\"\n rows={1}\n submitMode=\"enter\"\n />\n <div className=\"flex justify-end gap-2\">\n <ComposerPrimitive.Cancel asChild>\n <button\n type=\"button\"\n className=\"cursor-pointer rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n Cancel\n </button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <button\n type=\"submit\"\n className=\"cursor-pointer rounded-md bg-foreground px-2 py-1 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Save\n </button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n );\n}\n\n// ─── MessageActionsMenu ────────────────────────────────────────────────────────\n\nexport function MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n // Rich flavor keeps formatting in targets that read text/html (e.g. Slack);\n // null when the markdown renderer isn't ready yet, so we copy plain markdown.\n const html = renderMarkdownToClipboardHtml(text);\n void writeClipboardText(text, html ? { html } : undefined).then((ok) => {\n if (!ok) return;\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n void writeClipboardText(runId).then((ok) => {\n if (!ok) return;\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// ─── UserMessage ──────────────────────────────────────────────────────────────\n\nexport function UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const isEditing = useComposer((state) => state.isEditing);\n const chatRunning = React.useContext(ChatRunningContext);\n const hidden = isHiddenUserMessage(message);\n const hasDisplayableText =\n !hidden &&\n (message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false);\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n if (hidden) return null;\n\n // When in edit mode, show the inline edit composer instead of the message bubble.\n if (isEditing) {\n return (\n <div className=\"flex justify-end\">\n <div className=\"w-full max-w-[85%]\">\n <UserMessageEditComposer />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n {/* Edit hover affordance — appears on hover when not running */}\n {!chatRunning && hasDisplayableText && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Edit asChild>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n className=\"absolute -left-8 top-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/0 transition-colors duration-150 group-hover:text-muted-foreground/70 group-hover:hover:bg-accent group-hover:hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Edit>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"text-xs\">\n Edit message\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n <div className=\"mt-1 flex items-center justify-end gap-1\">\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── AssistantMessage ─────────────────────────────────────────────────────────\n\nfunction assistantMessageHasRenderableContent(message: {\n content?: unknown;\n}): boolean {\n const content = message.content;\n if (typeof content === \"string\") return content.trim().length > 0;\n if (!Array.isArray(content)) return false;\n return content.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const type = (part as { type?: unknown }).type;\n if (type === \"text\" || type === \"reasoning\") {\n const text = (part as { text?: unknown }).text;\n return typeof text === \"string\" && text.trim().length > 0;\n }\n return true;\n });\n}\n\nfunction assistantMessageStatusIsTerminal(message: {\n status?: { type?: unknown };\n}): boolean {\n const statusType = message.status?.type;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nexport function messageTextFromContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .flatMap((part) => {\n if (!part || typeof part !== \"object\") return [];\n const record = part as {\n type?: unknown;\n text?: unknown;\n };\n return record.type === \"text\" && typeof record.text === \"string\"\n ? [record.text]\n : [];\n })\n .join(\"\\n\");\n}\n\nfunction latestUserMessageText(messages: readonly unknown[]): string {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (!message || typeof message !== \"object\") continue;\n const record = message as { role?: unknown; content?: unknown };\n if (record.role === \"user\") return messageTextFromContent(record.content);\n }\n return \"\";\n}\n\nexport function assistantMessageHasUnresolvedTool(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n return content.some((part): boolean => {\n if (!part || typeof part !== \"object\") return false;\n const record = part as { type?: unknown; result?: unknown };\n return record.type === \"tool-call\" && record.result === undefined;\n });\n}\n\n// Only the last assistant message may shimmer as \"the currently running\n// tool\" — an older message's dangling unresolved tool-call must never\n// shimmer once a later run is active.\nexport function computeActiveTailToolCallId(\n content: ContentPart[] | undefined,\n { chatRunning, isLast }: { chatRunning: boolean; isLast: boolean },\n): string | null {\n if (!isLast) return null;\n return (\n content?.reduce(\n (latestToolCallId, part) =>\n part.type === \"tool-call\" && (chatRunning || part.activity === true)\n ? part.toolCallId\n : latestToolCallId,\n null as string | null,\n ) ?? null\n );\n}\n\nexport function shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n chatRunning: boolean;\n hasRenderableContent: boolean;\n statusIsTerminal: boolean;\n hasUnresolvedTool?: boolean;\n}): boolean {\n if (!hasRenderableContent) return false;\n if (!isLast) return true;\n if (chatRunning) return false;\n if (hasUnresolvedTool) return false;\n return statusIsTerminal;\n}\n\nexport function shouldShowMissingFinalResponse({\n statusIsTerminal,\n hasAssistantText,\n hasUnresolvedTool,\n}: {\n statusIsTerminal: boolean;\n hasAssistantText: boolean;\n hasUnresolvedTool: boolean;\n}): boolean {\n return statusIsTerminal && !hasAssistantText && !hasUnresolvedTool;\n}\n\nexport function shouldShowAssistantWorkSummary({\n isLast,\n isComplete,\n hasCollapsibleWork,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n isComplete: boolean;\n hasCollapsibleWork: boolean;\n hasUnresolvedTool: boolean;\n}): boolean {\n if (!hasCollapsibleWork || hasUnresolvedTool) return false;\n\n // Keep completed historical work wrapped while a later turn is running.\n // Removing the wrapper exposes/remounts ReasoningCell and resets its\n // disclosure state to the default-open value on every new submission.\n return isComplete || !isLast;\n}\n\nfunction ReasoningMessagePart() {\n const part = useMessagePartReasoning();\n const partRuntime = useMessagePartRuntime();\n const messageParts = useAuiState((state) => state.message.parts);\n const isStreaming = part.status?.type === \"running\";\n const partIndex =\n partRuntime.path.messagePartSelector.type === \"index\"\n ? partRuntime.path.messagePartSelector.index\n : -1;\n const latestReasoningPartIndex = messageParts.reduce(\n (latestIndex, messagePart, index) =>\n messagePart.type === \"reasoning\" ? index : latestIndex,\n -1,\n );\n // Time thinking client-side: record the moment streaming first starts and\n // the moment it stops so the cell can show \"Thought for Xs\". Historical\n // messages that were never observed streaming in this session never get a\n // start time, so they correctly fall back to a plain \"Thought\" label.\n const startedAtRef = useRef<number | null>(null);\n const [durationMs, setDurationMs] = useState<number | null>(null);\n useEffect(() => {\n if (isStreaming) {\n startedAtRef.current ??= Date.now();\n return;\n }\n if (startedAtRef.current != null) {\n setDurationMs(Date.now() - startedAtRef.current);\n startedAtRef.current = null;\n }\n }, [isStreaming]);\n return (\n <ReasoningCell\n text={part.text}\n isStreaming={isStreaming}\n resetKey={`message-reasoning-${partIndex}`}\n durationMs={durationMs}\n defaultOpen={partIndex === latestReasoningPartIndex}\n collapseWhenReplaced={partIndex < latestReasoningPartIndex}\n />\n );\n}\n\nconst ALWAYS_VISIBLE_ASSISTANT_TOOLS = new Set([\"connect-builder\"]);\n\nexport function isCollapsibleAssistantWorkPart(part: {\n type?: string;\n toolName?: string;\n}): boolean {\n if (part.type === \"reasoning\") return true;\n return (\n part.type === \"tool-call\" &&\n !ALWAYS_VISIBLE_ASSISTANT_TOOLS.has(part.toolName ?? \"\")\n );\n}\n\nexport function getAssistantToolSummaryInfo(\n parts: readonly { type?: string; toolName?: string }[],\n): { startIndex: number; hiddenToolCount: number } {\n const toolCallIndices = parts.reduce<number[]>((indices, part, index) => {\n if (part.type === \"tool-call\" && isCollapsibleAssistantWorkPart(part)) {\n indices.push(index);\n }\n return indices;\n }, []);\n\n if (toolCallIndices.length <= ASSISTANT_VISIBLE_TOOL_CALL_LIMIT) {\n return { startIndex: -1, hiddenToolCount: 0 };\n }\n\n const startIndex =\n toolCallIndices[\n toolCallIndices.length - ASSISTANT_VISIBLE_TOOL_CALL_LIMIT\n ]!;\n return {\n startIndex,\n hiddenToolCount: toolCallIndices.length - ASSISTANT_VISIBLE_TOOL_CALL_LIMIT,\n };\n}\n\nfunction groupAssistantWorkParts(\n part: {\n type?: string;\n toolName?: string;\n },\n index: number,\n parts: readonly { type?: string; toolName?: string }[],\n): [\"group-work\"] | [\"group-work\", \"group-ran-tools\"] | null {\n if (isCollapsibleAssistantWorkPart(part)) {\n const { startIndex } = getAssistantToolSummaryInfo(parts);\n if (isAssistantToolSummaryPart(parts, index, startIndex)) {\n return [\"group-work\", \"group-ran-tools\"];\n }\n return [\"group-work\"];\n }\n return null;\n}\n\nfunction isAssistantToolSummaryPart(\n parts: readonly { type?: string; toolName?: string }[],\n index: number,\n startIndex: number,\n): boolean {\n if (startIndex < 0 || index >= startIndex) return false;\n if (!isCollapsibleAssistantWorkPart(parts[index]!)) return false;\n\n let segmentStart = index;\n while (\n segmentStart > 0 &&\n isCollapsibleAssistantWorkPart(parts[segmentStart - 1]!)\n ) {\n segmentStart--;\n }\n\n let segmentEnd = index + 1;\n while (\n segmentEnd < startIndex &&\n isCollapsibleAssistantWorkPart(parts[segmentEnd]!)\n ) {\n segmentEnd++;\n }\n\n return parts\n .slice(segmentStart, segmentEnd)\n .some((candidate) => candidate.type === \"tool-call\");\n}\n\nexport function AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const lastRunDurationMs = React.useContext(ChatRunDurationContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const hasRenderableContent = assistantMessageHasRenderableContent(msg);\n const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);\n const responseConnectionText = messageTextFromContent(msg.content);\n const statusIsTerminal = assistantMessageStatusIsTerminal(msg);\n const showMissingFinalResponse = shouldShowMissingFinalResponse({\n statusIsTerminal,\n hasAssistantText: responseConnectionText.trim().length > 0,\n hasUnresolvedTool,\n });\n const responseConnectionContext = latestUserMessageText(thread.messages);\n const isComplete = shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n });\n const cpCtx = React.useContext(CheckpointContext);\n\n // Capture live run duration when this message finishes streaming.\n const runStartedAtRef = useRef<number | null>(null);\n const [capturedDurationMs, setCapturedDurationMs] = useState<number | null>(\n null,\n );\n useEffect(() => {\n if (chatRunning && isLast) {\n if (runStartedAtRef.current == null) {\n runStartedAtRef.current = Date.now();\n }\n return;\n }\n if (!chatRunning && isLast && capturedDurationMs == null) {\n const durationMs =\n lastRunDurationMs ??\n (runStartedAtRef.current == null\n ? null\n : Date.now() - runStartedAtRef.current);\n if (durationMs == null) return;\n setCapturedDurationMs(durationMs);\n runStartedAtRef.current = null;\n }\n }, [chatRunning, isLast, capturedDurationMs, lastRunDurationMs]);\n\n // Animate collapse only when this message just finished running in-session.\n const wasRunningRef = useRef(false);\n const [animateCollapse, setAnimateCollapse] = useState(false);\n useEffect(() => {\n if (wasRunningRef.current && !chatRunning && isComplete && isLast) {\n setAnimateCollapse(true);\n }\n wasRunningRef.current = chatRunning && isLast;\n }, [chatRunning, isComplete, isLast]);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: unknown[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find(\n (cp) => (cp as { runId?: string }).runId === runId,\n );\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n checkpointId: (checkpoint as { id?: string }).id,\n }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n // Collect parts for the files-changed summary (code-agent turns only).\n const msgContent = msg.content as ContentPart[] | undefined;\n const hasCodeAgentTools =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"tool-call\" &&\n p.structuredMeta &&\n (p.structuredMeta.toolKind === \"edit\" ||\n p.structuredMeta.toolKind === \"write\"),\n );\n const hasCollapsibleWork =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n (p.type !== \"tool-call\" || p.activity !== true) &&\n isCollapsibleAssistantWorkPart(p),\n );\n const activeTailToolCallId = computeActiveTailToolCallId(msgContent, {\n chatRunning,\n isLast,\n });\n\n if (!hasRenderableContent) return null;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.GroupedParts groupBy={groupAssistantWorkParts}>\n {({ part, children }) => {\n switch (part.type) {\n case \"group-work\": {\n const showSummary = shouldShowAssistantWorkSummary({\n isLast,\n isComplete,\n hasCollapsibleWork,\n hasUnresolvedTool,\n });\n if (!showSummary) return <>{children}</>;\n return (\n <WorkedForSummary\n durationMs={capturedDurationMs}\n autoCollapse={animateCollapse}\n >\n {children}\n </WorkedForSummary>\n );\n }\n case \"group-ran-tools\": {\n const toolCount = part.indices.filter(\n (index) => msgContent?.[index]?.type === \"tool-call\",\n ).length;\n return (\n <RanToolsSummary toolCount={toolCount}>\n {children}\n </RanToolsSummary>\n );\n }\n case \"text\":\n return <MarkdownText />;\n case \"reasoning\":\n return <ReasoningMessagePart />;\n case \"tool-call\":\n return part.toolUI ? (\n <ToolActivityPresentation\n toolName={part.toolName}\n isRunning={part.status?.type === \"running\"}\n isActiveTail={part.toolCallId === activeTailToolCallId}\n >\n {part.toolUI}\n </ToolActivityPresentation>\n ) : (\n <ToolCallFallback\n {...part}\n isActiveTail={part.toolCallId === activeTailToolCallId}\n />\n );\n default:\n return null;\n }\n }}\n </MessagePrimitive.GroupedParts>\n {showMissingFinalResponse && (\n <p role=\"status\" className=\"text-muted-foreground\">\n The agent stopped without sending a final message. Ask it to\n continue or retry.\n </p>\n )}\n {isComplete && hasCodeAgentTools && msgContent && (\n <FilesChangedSummary parts={msgContent} />\n )}\n {isComplete && isLast && (\n <McpConnectionSuggestion\n text={responseConnectionText}\n contextText={responseConnectionContext}\n variant=\"response\"\n />\n )}\n {isLast && hasUnresolvedTool && !chatRunning && (\n <RunningActivityStatus label=\"Thinking\" />\n )}\n </div>\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {/* Regenerate button — only on the last assistant message, auto-disabled while running */}\n {isLast && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Reload asChild>\n <button\n type=\"button\"\n aria-label=\"Regenerate response\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconRefresh className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Reload>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n Regenerate response\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── RunningActivityStatus / ThinkingIndicator ────────────────────────────────\n\nexport function RunningActivityStatus({ label }: { label: string }) {\n return (\n <div className=\"agent-running-activity\">\n <ThinkingIndicator label={label} />\n </div>\n );\n}\n\nexport function ThinkingIndicator({\n label = \"Thinking\",\n}: { label?: string } = {}) {\n return (\n <div\n className=\"agent-thinking-indicator\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n >\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"message-components.js","sourceRoot":"","sources":["../../../src/client/chat/message-components.tsx"],"names":[],"mappings":"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","sourcesContent":["// Owns: message-timestamp helpers, SelectionAttachedPill, UserMessage,\n// AssistantMessage, MessageBranchPicker, CheckpointContext, MessageActionsContext,\n// RunningActivityStatus, ThinkingIndicator, and displayableUserMessageText.\n\nimport { isPastedTextAttachmentName } from \"@agent-native/toolkit/composer/pasted-text\";\nimport { PastedTextChip } from \"@agent-native/toolkit/composer/PastedTextChip\";\nimport {\n useThread,\n useMessageRuntime,\n useComposer,\n MessagePrimitive,\n ActionBarPrimitive,\n BranchPickerPrimitive,\n ComposerPrimitive,\n useMessagePartReasoning,\n useMessagePartRuntime,\n useAuiState,\n} from \"@assistant-ui/react\";\nimport type { Attachment } from \"@assistant-ui/react\";\nimport {\n IconX,\n IconCheck,\n IconCopy,\n IconChevronDown,\n IconChevronLeft,\n IconChevronRight,\n IconDots,\n IconGitFork,\n IconId,\n IconQuote,\n IconRefresh,\n IconArrowBackUp,\n IconFile,\n IconFolder,\n IconFileText,\n IconCheckbox,\n IconMail,\n IconUser,\n IconPresentation,\n IconStack2,\n IconMessageChatbot,\n IconPencil,\n IconLoader2,\n} from \"@tabler/icons-react\";\nimport React, { useState, useEffect, useCallback, useRef } from \"react\";\n\nimport { getActiveRun } from \"../active-run-state.js\";\nimport { agentNativePath } from \"../api-path.js\";\nimport { writeClipboardText } from \"../clipboard.js\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../components/ui/dropdown-menu.js\";\nimport {\n Tooltip,\n TooltipContent,\n TooltipProvider,\n TooltipTrigger,\n} from \"../components/ui/tooltip.js\";\nimport { ThumbsFeedback } from \"../observability/ThumbsFeedback.js\";\nimport { McpConnectionSuggestion } from \"../resources/McpConnectionSuggestion.js\";\nimport type { ContentPart } from \"../sse-event-processor.js\";\nimport {\n isCallAgentToolCallShadowed,\n shadowedCallAgentToolCallIds,\n} from \"../tool-display.js\";\nimport { cn } from \"../utils.js\";\nimport {\n MarkdownText,\n renderMarkdownToClipboardHtml,\n} from \"./markdown-renderer.js\";\nimport {\n ToolCallFallback,\n ToolActivityPresentation,\n FilesChangedSummary,\n ASSISTANT_VISIBLE_TOOL_CALL_LIMIT,\n ChatRunningContext,\n ChatRunDurationContext,\n RanToolsSummary,\n ReasoningCell,\n WorkedForSummary,\n} from \"./tool-call-display.js\";\n\n// ─── Pending selection context key ───────────────────────────────────────────\n// Mirrored from AssistantChat to avoid a cross-import on a private constant.\nconst PENDING_SELECTION_KEY = \"pending-selection-context\";\n\n// ─── displayableUserMessageText ───────────────────────────────────────────────\n\nexport function displayableUserMessageText(text: string): string {\n return text\n .replace(/<context\\b[^>]*>[\\s\\S]*?<\\/context>\\n?/gi, \"\")\n .replace(/<context\\b[^>]*>[\\s\\S]*$/gi, \"\")\n .replace(/<\\/context>/gi, \"\")\n .trim();\n}\n\nexport function isHiddenUserMessage(message: unknown): boolean {\n const meta = (message as { metadata?: unknown })?.metadata as\n | {\n custom?: {\n agentNativeHiddenUserMessage?: unknown;\n agentNativeRecoveryAction?: unknown;\n };\n }\n | undefined;\n return (\n meta?.custom?.agentNativeHiddenUserMessage === true ||\n meta?.custom?.agentNativeRecoveryAction === \"continue\" ||\n meta?.custom?.agentNativeRecoveryAction === \"retry\"\n );\n}\n\n// ─── Message timestamp helpers ────────────────────────────────────────────────\n\ninterface FormattedMessageTimestamp {\n short: string;\n full: string;\n}\n\nfunction coerceMessageDate(value: unknown): Date | null {\n if (value instanceof Date) {\n return Number.isNaN(value.getTime()) ? null : value;\n }\n if (typeof value === \"string\" || typeof value === \"number\") {\n const date = new Date(value);\n return Number.isNaN(date.getTime()) ? null : date;\n }\n return null;\n}\n\nfunction isSameCalendarDay(a: Date, b: Date): boolean {\n return (\n a.getFullYear() === b.getFullYear() &&\n a.getMonth() === b.getMonth() &&\n a.getDate() === b.getDate()\n );\n}\n\nexport function formatMessageTimestamp(\n value: unknown,\n): FormattedMessageTimestamp | null {\n const date = coerceMessageDate(value);\n if (!date) return null;\n\n const now = new Date();\n const yesterday = new Date(now);\n yesterday.setDate(now.getDate() - 1);\n const time = new Intl.DateTimeFormat(undefined, {\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date);\n\n let short: string;\n if (isSameCalendarDay(date, now)) {\n short = time;\n } else if (isSameCalendarDay(date, yesterday)) {\n short = `Yesterday ${time}`;\n } else if (date.getFullYear() === now.getFullYear()) {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n }).format(date)}, ${time}`;\n } else {\n short = `${new Intl.DateTimeFormat(undefined, {\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n }).format(date)}, ${time}`;\n }\n\n return {\n short,\n full: new Intl.DateTimeFormat(undefined, {\n weekday: \"short\",\n month: \"short\",\n day: \"numeric\",\n year: \"numeric\",\n hour: \"numeric\",\n minute: \"2-digit\",\n }).format(date),\n };\n}\n\nexport function MessageTimestamp({\n timestamp,\n className,\n}: {\n timestamp: FormattedMessageTimestamp;\n className?: string;\n}) {\n return (\n <span\n className={cn(\n \"text-[11px] leading-none text-muted-foreground\",\n className,\n )}\n title={timestamp.full}\n >\n {timestamp.short}\n </span>\n );\n}\n\n// ─── SelectionAttachedPill ────────────────────────────────────────────────────\n\nexport function SelectionAttachedPill() {\n const [length, setLength] = useState<number | null>(null);\n\n useEffect(() => {\n let cancelled = false;\n fetch(\n agentNativePath(\n `/_agent-native/application-state/${PENDING_SELECTION_KEY}`,\n ),\n )\n .then((r) => (r.ok && r.status !== 204 ? r.json() : null))\n .then((data) => {\n if (cancelled) return;\n const text =\n (data?.value?.text as string | undefined) ??\n (data?.text as string | undefined);\n if (text) setLength(text.length);\n })\n .catch(() => {});\n return () => {\n cancelled = true;\n };\n }, []);\n\n useEffect(() => {\n function onAttached(e: Event) {\n const detail = (e as CustomEvent).detail;\n if (typeof detail?.length === \"number\") setLength(detail.length);\n }\n function onCleared() {\n setLength(null);\n }\n window.addEventListener(\"agent-panel:selection-attached\", onAttached);\n window.addEventListener(\"agent-panel:selection-cleared\", onCleared);\n return () => {\n window.removeEventListener(\"agent-panel:selection-attached\", onAttached);\n window.removeEventListener(\"agent-panel:selection-cleared\", onCleared);\n };\n }, []);\n\n if (length === null || length === 0) return null;\n\n return (\n <div className=\"agent-selection-attached-pill shrink-0 px-3 pt-1.5 -mb-1\">\n <div className=\"inline-flex items-center gap-1.5 rounded-full border border-border bg-muted/50 px-2 py-0.5 text-[11px] text-muted-foreground\">\n <IconQuote size={11} />\n <span>{length.toLocaleString()} chars of selection attached</span>\n <button\n type=\"button\"\n aria-label=\"Clear selection context\"\n onClick={() => {\n setLength(null);\n // Dispatch clear event; AssistantChat owns the DELETE call.\n window.dispatchEvent(\n new CustomEvent(\"agent-panel:selection-clear-requested\"),\n );\n }}\n className=\"flex h-4 w-4 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/60\"\n >\n <IconX size={11} />\n </button>\n </div>\n </div>\n );\n}\n\n// ─── CheckpointContext / MessageActionsContext ────────────────────────────────\n\nexport const CheckpointContext = React.createContext<{\n apiUrl: string;\n devMode: boolean;\n threadId?: string;\n} | null>(null);\n\nexport const MessageActionsContext = React.createContext<{\n onForkChat?: () => void | boolean | Promise<void | boolean>;\n} | null>(null);\n\n// ─── MessageBranchPicker ──────────────────────────────────────────────────────\n\nexport function MessageBranchPicker() {\n return (\n <BranchPickerPrimitive.Root\n hideWhenSingleBranch\n className=\"flex items-center gap-0.5 text-[11px] text-muted-foreground\"\n >\n <BranchPickerPrimitive.Previous asChild>\n <button\n type=\"button\"\n aria-label=\"Previous branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronLeft className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Previous>\n <span className=\"tabular-nums select-none\">\n <BranchPickerPrimitive.Number />\n {\"/\"}\n <BranchPickerPrimitive.Count />\n </span>\n <BranchPickerPrimitive.Next asChild>\n <button\n type=\"button\"\n aria-label=\"Next branch\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconChevronRight className=\"h-3.5 w-3.5\" />\n </button>\n </BranchPickerPrimitive.Next>\n </BranchPickerPrimitive.Root>\n );\n}\n\n// ─── Mention rendering ────────────────────────────────────────────────────────\n\nconst mentionIconProps = {\n size: 14,\n className: \"shrink-0 text-muted-foreground\",\n};\n\nfunction MentionChipIcon({ icon }: { icon?: string }) {\n switch (icon) {\n case \"folder\":\n return <IconFolder {...mentionIconProps} />;\n case \"document\":\n return <IconFileText {...mentionIconProps} />;\n case \"form\":\n return <IconCheckbox {...mentionIconProps} />;\n case \"email\":\n return <IconMail {...mentionIconProps} />;\n case \"user\":\n return <IconUser {...mentionIconProps} />;\n case \"deck\":\n return <IconPresentation {...mentionIconProps} />;\n case \"agent\":\n return <IconMessageChatbot {...mentionIconProps} />;\n case \"file\":\n return <IconFile {...mentionIconProps} />;\n default:\n return <IconStack2 {...mentionIconProps} />;\n }\n}\n\n// Matches rich mention format: @[label|icon] or plain @word\nconst richMentionPattern = /@\\[([^\\]|]+)\\|([^\\]]+)\\]/g;\nconst plainMentionPattern = /((?:^|(?<=\\s))@(\\w+))/g;\n\nfunction UserMessageText({ text }: { text: string }) {\n // Strip injected <context>...</context> blocks before display\n const displayText = displayableUserMessageText(text);\n\n const parts: React.ReactNode[] = [];\n let lastIndex = 0;\n let match: RegExpExecArray | null;\n let hasRichMentions = false;\n\n // First try rich mentions (@[label|icon])\n richMentionPattern.lastIndex = 0;\n while ((match = richMentionPattern.exec(displayText)) !== null) {\n hasRichMentions = true;\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const label = match[1];\n const icon = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 max-w-[200px] select-all\"\n data-mention-label={label}\n >\n <MentionChipIcon icon={icon} />\n <span className=\"truncate\">{label}</span>\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (hasRichMentions) {\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n return <>{parts}</>;\n }\n\n // Fallback: plain @word mentions (for older messages)\n plainMentionPattern.lastIndex = 0;\n while ((match = plainMentionPattern.exec(displayText)) !== null) {\n const matchStart = match.index;\n if (matchStart > lastIndex) {\n parts.push(displayText.slice(lastIndex, matchStart));\n }\n const mentionName = match[2];\n parts.push(\n <span\n key={matchStart}\n className=\"inline-flex items-center gap-1 rounded-md border border-input bg-muted/50 px-1.5 py-0.5 text-xs font-medium text-foreground align-middle mx-0.5 select-all\"\n data-mention-label={mentionName}\n >\n @{mentionName}\n </span>,\n );\n lastIndex = matchStart + match[0].length;\n }\n\n if (lastIndex < displayText.length) {\n parts.push(displayText.slice(lastIndex));\n }\n\n return <>{parts.length > 0 ? parts : displayText}</>;\n}\n\n// ─── UserMessageAttachments ───────────────────────────────────────────────────\n\nfunction UserMessageAttachments() {\n const messageRuntime = useMessageRuntime();\n const msg = messageRuntime.getState();\n // assistant-ui stores user attachments on msg.attachments (separate from content).\n // Each attachment has: { id, type, name, contentType?, content: MessagePart[] }.\n // Image adapters put a {type:\"image\", image:\"data:...\"} part in content; text\n // adapters put a {type:\"text\", text:\"<attachment>...\"} part. Fall back to a\n // file chip when there's no inline image.\n const attachments = (msg as { attachments?: readonly Attachment[] })\n .attachments;\n if (!attachments || attachments.length === 0) return null;\n\n return (\n <div className=\"flex flex-wrap justify-end gap-1.5 mb-1.5\">\n {attachments.map((att) => {\n if (isPastedTextAttachmentName(att.name)) {\n return <PastedTextChip key={att.id} attachment={att} compact />;\n }\n\n // Prefer the hosted upload URL when available (set by the server after\n // preUploadAttachments). This avoids re-shipping base64 in each poll\n // and lets the browser cache the image via a stable URL.\n const uploadUrl = (\n att as unknown as { metadata?: { uploadUrl?: string } }\n ).metadata?.uploadUrl;\n const imagePart = att.content?.find(\n (p): p is { type: \"image\"; image: string } =>\n p.type === \"image\" &&\n \"image\" in p &&\n !!(p as { image?: string }).image,\n );\n const imageSrc = uploadUrl || imagePart?.image || null;\n if (imageSrc) {\n return (\n <div\n key={att.id}\n className=\"h-16 w-16 overflow-hidden rounded-lg border border-border/70 bg-muted/50\"\n title={att.name}\n >\n <img\n src={imageSrc}\n alt={att.name}\n className=\"h-full w-full object-cover\"\n />\n </div>\n );\n }\n return (\n <div\n key={att.id}\n className=\"flex items-center gap-1.5 rounded-lg border border-border/70 bg-muted/50 px-2 py-1.5 text-xs text-muted-foreground\"\n title={att.name}\n >\n <IconFile className=\"h-3.5 w-3.5 shrink-0\" />\n <span className=\"truncate max-w-[120px]\">{att.name || \"file\"}</span>\n </div>\n );\n })}\n </div>\n );\n}\n\n// ─── UserMessageEditComposer ──────────────────────────────────────────────────\n\nfunction UserMessageEditComposer() {\n return (\n <ComposerPrimitive.Root className=\"flex flex-col gap-2 rounded-lg border border-border bg-background px-3 py-2 shadow-sm\">\n <ComposerPrimitive.Input\n className=\"w-full resize-none bg-transparent text-sm leading-relaxed text-foreground placeholder:text-muted-foreground focus:outline-none\"\n rows={1}\n submitMode=\"enter\"\n />\n <div className=\"flex justify-end gap-2\">\n <ComposerPrimitive.Cancel asChild>\n <button\n type=\"button\"\n className=\"cursor-pointer rounded-md px-2 py-1 text-xs font-medium text-muted-foreground hover:bg-accent hover:text-foreground\"\n >\n Cancel\n </button>\n </ComposerPrimitive.Cancel>\n <ComposerPrimitive.Send asChild>\n <button\n type=\"submit\"\n className=\"cursor-pointer rounded-md bg-foreground px-2 py-1 text-xs font-medium text-background hover:opacity-90 disabled:opacity-50\"\n >\n Save\n </button>\n </ComposerPrimitive.Send>\n </div>\n </ComposerPrimitive.Root>\n );\n}\n\n// ─── MessageActionsMenu ────────────────────────────────────────────────────────\n\nexport function MessageActionsMenu({\n showRevert,\n onRevert,\n}: {\n showRevert?: boolean;\n onRevert?: () => void;\n} = {}) {\n const [open, setOpen] = useState(false);\n const [copied, setCopied] = useState<string | null>(null);\n const messageRuntime = useMessageRuntime();\n const actionsCtx = React.useContext(MessageActionsContext);\n const timestamp = formatMessageTimestamp(messageRuntime.getState().createdAt);\n\n const handleCopyMessage = useCallback(() => {\n const m = messageRuntime.getState();\n const text = m.content\n .filter((p) => p.type === \"text\")\n .map((p) => (p as { text: string }).text)\n .join(\"\\n\");\n // Rich flavor keeps formatting in targets that read text/html (e.g. Slack);\n // null when the markdown renderer isn't ready yet, so we copy plain markdown.\n const html = renderMarkdownToClipboardHtml(text);\n void writeClipboardText(text, html ? { html } : undefined).then((ok) => {\n if (!ok) return;\n setCopied(\"message\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleCopyRequestId = useCallback(() => {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | {\n custom?: { runId?: unknown };\n runId?: unknown;\n }\n | undefined;\n // Live yields put the trace ID at metadata.custom.runId; server-persisted\n // messages put it at metadata.runId. If neither is present (e.g. the run\n // is still in flight and this is the first message), fall back to the\n // active-run state so a hung / mid-stream chat still surfaces a usable\n // trace ID. Last resort is the assistant-ui local message id.\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n (typeof window !== \"undefined\" ? getActiveRun()?.runId : null) ||\n m.id ||\n \"\";\n void writeClipboardText(runId).then((ok) => {\n if (!ok) return;\n setCopied(\"id\");\n setTimeout(() => {\n setCopied(null);\n setOpen(false);\n }, 1000);\n });\n }, [messageRuntime]);\n\n const handleForkChat = useCallback(() => {\n setOpen(false);\n actionsCtx?.onForkChat?.();\n }, [actionsCtx]);\n\n const handleRevert = useCallback(() => {\n setOpen(false);\n onRevert?.();\n }, [onRevert]);\n\n return (\n <DropdownMenu open={open} onOpenChange={setOpen}>\n <DropdownMenuTrigger asChild>\n <button\n aria-label=\"Message actions\"\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground\",\n open && \"bg-accent text-foreground\",\n )}\n >\n <IconDots className=\"h-3.5 w-3.5\" />\n </button>\n </DropdownMenuTrigger>\n <DropdownMenuContent\n align=\"start\"\n sideOffset={6}\n className=\"w-48 rounded-lg border-border p-1.5 shadow-xl\"\n >\n {actionsCtx?.onForkChat && (\n <DropdownMenuItem onSelect={handleForkChat}>\n <IconGitFork className=\"h-3.5 w-3.5\" />\n Fork Chat\n </DropdownMenuItem>\n )}\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyMessage();\n }}\n >\n {copied === \"message\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconCopy className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"message\" ? \"Copied!\" : \"Copy Message\"}\n </DropdownMenuItem>\n <DropdownMenuItem\n onSelect={(e) => {\n e.preventDefault();\n handleCopyRequestId();\n }}\n >\n {copied === \"id\" ? (\n <IconCheck className=\"h-3.5 w-3.5\" />\n ) : (\n <IconId className=\"h-3.5 w-3.5\" />\n )}\n {copied === \"id\" ? \"Copied!\" : \"Copy Request ID\"}\n </DropdownMenuItem>\n {showRevert && (\n <DropdownMenuItem onSelect={handleRevert}>\n <IconArrowBackUp className=\"h-3.5 w-3.5\" />\n Revert to here\n </DropdownMenuItem>\n )}\n {timestamp && (\n <>\n <DropdownMenuSeparator />\n <DropdownMenuLabel className=\"px-2 py-1 text-[11px] font-normal text-muted-foreground\">\n Sent {timestamp.short}\n </DropdownMenuLabel>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n\n// ─── UserMessage ──────────────────────────────────────────────────────────────\n\nexport function UserMessage() {\n const [expanded, setExpanded] = useState(false);\n const [isExpandable, setIsExpandable] = useState(false);\n const contentRef = useRef<HTMLDivElement>(null);\n const messageRuntime = useMessageRuntime();\n const message = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(message.createdAt);\n const isEditing = useComposer((state) => state.isEditing);\n const chatRunning = React.useContext(ChatRunningContext);\n const hidden = isHiddenUserMessage(message);\n const hasDisplayableText =\n !hidden &&\n (message.content\n ?.filter((part): part is { type: \"text\"; text: string } => {\n return part.type === \"text\" && typeof part.text === \"string\";\n })\n .some((part) => displayableUserMessageText(part.text).length > 0) ??\n false);\n\n useEffect(() => {\n const el = contentRef.current;\n if (!el || !hasDisplayableText) return;\n\n const measure = () => {\n setIsExpandable(el.scrollHeight > 200);\n };\n\n measure();\n const observer = new ResizeObserver(measure);\n observer.observe(el);\n return () => observer.disconnect();\n }, [hasDisplayableText]);\n\n if (hidden) return null;\n\n // When in edit mode, show the inline edit composer instead of the message bubble.\n if (isEditing) {\n return (\n <div className=\"flex justify-end\">\n <div className=\"w-full max-w-[85%]\">\n <UserMessageEditComposer />\n </div>\n </div>\n );\n }\n\n return (\n <div\n className=\"group flex justify-end\"\n style={{ contentVisibility: \"auto\" }}\n >\n <div className=\"max-w-[85%]\">\n <UserMessageAttachments />\n {hasDisplayableText && (\n <div\n className=\"relative rounded-lg bg-accent px-3 py-2 text-sm leading-relaxed text-foreground\"\n onCopy={(e) => {\n const selection = window.getSelection();\n if (!selection || selection.rangeCount === 0) return;\n const fragment = selection.getRangeAt(0).cloneContents();\n const mentions = fragment.querySelectorAll(\n \"[data-mention-label]\",\n );\n if (mentions.length === 0) return;\n e.preventDefault();\n mentions.forEach((el) => {\n el.textContent = `@${el.getAttribute(\"data-mention-label\")}`;\n });\n const div = document.createElement(\"div\");\n div.appendChild(fragment);\n e.clipboardData.setData(\"text/plain\", div.textContent || \"\");\n }}\n >\n <div\n ref={contentRef}\n className={cn(\n \"whitespace-pre-wrap break-words\",\n !expanded && isExpandable && \"max-h-[200px] overflow-hidden\",\n )}\n >\n <MessagePrimitive.Parts\n components={{\n Text: UserMessageText,\n }}\n />\n </div>\n {!expanded && isExpandable && (\n <div className=\"pointer-events-none absolute inset-x-0 bottom-0 h-14 rounded-b-lg bg-gradient-to-t from-accent via-accent/90 to-transparent\" />\n )}\n {/* Edit hover affordance — appears on hover when not running */}\n {!chatRunning && hasDisplayableText && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Edit asChild>\n <button\n type=\"button\"\n aria-label=\"Edit message\"\n className=\"absolute -left-8 top-1 flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/0 transition-colors duration-150 group-hover:text-muted-foreground/70 group-hover:hover:bg-accent group-hover:hover:text-foreground\"\n >\n <IconPencil className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Edit>\n </TooltipTrigger>\n <TooltipContent side=\"left\" className=\"text-xs\">\n Edit message\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n </div>\n )}\n {hasDisplayableText && isExpandable && (\n <button\n type=\"button\"\n onClick={() => setExpanded((prev) => !prev)}\n className=\"mt-1 inline-flex items-center gap-1 rounded-md px-1.5 py-1 text-[11px] font-medium text-muted-foreground hover:text-foreground\"\n >\n <IconChevronDown\n className={cn(\n \"h-3.5 w-3.5 transition-transform\",\n expanded && \"rotate-180\",\n )}\n />\n {expanded ? \"Collapse\" : \"Expand\"}\n </button>\n )}\n <div className=\"mt-1 flex items-center justify-end gap-1\">\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n </div>\n </div>\n );\n}\n\n// ─── AssistantMessage ─────────────────────────────────────────────────────────\n\nfunction assistantMessageHasRenderableContent(message: {\n content?: unknown;\n}): boolean {\n const content = message.content;\n if (typeof content === \"string\") return content.trim().length > 0;\n if (!Array.isArray(content)) return false;\n return content.some((part) => {\n if (!part || typeof part !== \"object\") return false;\n const type = (part as { type?: unknown }).type;\n if (type === \"text\" || type === \"reasoning\") {\n const text = (part as { text?: unknown }).text;\n return typeof text === \"string\" && text.trim().length > 0;\n }\n return true;\n });\n}\n\nfunction assistantMessageStatusIsTerminal(message: {\n status?: { type?: unknown };\n}): boolean {\n const statusType = message.status?.type;\n return statusType === \"complete\" || statusType === \"incomplete\";\n}\n\nexport function messageTextFromContent(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (!Array.isArray(content)) return \"\";\n return content\n .flatMap((part) => {\n if (!part || typeof part !== \"object\") return [];\n const record = part as {\n type?: unknown;\n text?: unknown;\n };\n return record.type === \"text\" && typeof record.text === \"string\"\n ? [record.text]\n : [];\n })\n .join(\"\\n\");\n}\n\nfunction latestUserMessageText(messages: readonly unknown[]): string {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index];\n if (!message || typeof message !== \"object\") continue;\n const record = message as { role?: unknown; content?: unknown };\n if (record.role === \"user\") return messageTextFromContent(record.content);\n }\n return \"\";\n}\n\nexport function assistantMessageHasUnresolvedTool(content: unknown): boolean {\n if (!Array.isArray(content)) return false;\n return content.some((part): boolean => {\n if (!part || typeof part !== \"object\") return false;\n const record = part as { type?: unknown; result?: unknown };\n return record.type === \"tool-call\" && record.result === undefined;\n });\n}\n\nexport function assistantMessageHasCompletedCustomUi(\n content: unknown,\n): boolean {\n if (!Array.isArray(content)) return false;\n let lastTextIndex = -1;\n for (let index = 0; index < content.length; index++) {\n const part = content[index];\n if (\n part &&\n typeof part === \"object\" &&\n (part as { type?: unknown }).type === \"text\"\n ) {\n lastTextIndex = index;\n }\n }\n let hasCompletedTool = false;\n let lastCompletedToolIsCustomUi = false;\n for (let index = lastTextIndex + 1; index < content.length; index++) {\n const part = content[index];\n if (!part || typeof part !== \"object\") continue;\n const record = part as {\n type?: unknown;\n result?: unknown;\n isError?: unknown;\n activity?: unknown;\n chatUI?: unknown;\n mcpApp?: unknown;\n };\n if (\n record.type !== \"tool-call\" ||\n record.activity === true ||\n record.result === undefined ||\n record.isError === true\n ) {\n continue;\n }\n hasCompletedTool = true;\n lastCompletedToolIsCustomUi =\n record.chatUI !== undefined || record.mcpApp !== undefined;\n }\n return hasCompletedTool && lastCompletedToolIsCustomUi;\n}\n\n// Only the last assistant message may shimmer as \"the currently running\n// tool\" — an older message's dangling unresolved tool-call must never\n// shimmer once a later run is active.\nexport function computeActiveTailToolCallId(\n content: ContentPart[] | undefined,\n { chatRunning, isLast }: { chatRunning: boolean; isLast: boolean },\n): string | null {\n if (!isLast) return null;\n return (\n content?.reduce(\n (latestToolCallId, part, index) =>\n part.type === \"tool-call\" &&\n !isCallAgentToolCallShadowed(content, index) &&\n (chatRunning || part.activity === true)\n ? part.toolCallId\n : latestToolCallId,\n null as string | null,\n ) ?? null\n );\n}\n\nexport function shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n chatRunning: boolean;\n hasRenderableContent: boolean;\n statusIsTerminal: boolean;\n hasUnresolvedTool?: boolean;\n}): boolean {\n if (!hasRenderableContent) return false;\n if (!isLast) return true;\n if (chatRunning) return false;\n if (hasUnresolvedTool) return false;\n return statusIsTerminal;\n}\n\nexport function shouldShowMissingFinalResponse({\n statusIsTerminal,\n hasAssistantText,\n hasUnresolvedTool,\n hasCompletedCustomUi,\n}: {\n statusIsTerminal: boolean;\n hasAssistantText: boolean;\n hasUnresolvedTool: boolean;\n hasCompletedCustomUi?: boolean;\n}): boolean {\n return (\n statusIsTerminal &&\n !hasAssistantText &&\n !hasUnresolvedTool &&\n !hasCompletedCustomUi\n );\n}\n\nexport function shouldShowAssistantWorkSummary({\n isLast,\n isComplete,\n hasCollapsibleWork,\n hasUnresolvedTool,\n}: {\n isLast: boolean;\n isComplete: boolean;\n hasCollapsibleWork: boolean;\n hasUnresolvedTool: boolean;\n}): boolean {\n if (!hasCollapsibleWork || hasUnresolvedTool) return false;\n\n // Keep completed historical work wrapped while a later turn is running.\n // Removing the wrapper exposes/remounts ReasoningCell and resets its\n // disclosure state to the default-open value on every new submission.\n return isComplete || !isLast;\n}\n\nfunction ReasoningMessagePart() {\n const part = useMessagePartReasoning();\n const partRuntime = useMessagePartRuntime();\n const messageParts = useAuiState((state) => state.message.parts);\n const isStreaming = part.status?.type === \"running\";\n const partIndex =\n partRuntime.path.messagePartSelector.type === \"index\"\n ? partRuntime.path.messagePartSelector.index\n : -1;\n const latestReasoningPartIndex = messageParts.reduce(\n (latestIndex, messagePart, index) =>\n messagePart.type === \"reasoning\" ? index : latestIndex,\n -1,\n );\n // Time thinking client-side: record the moment streaming first starts and\n // the moment it stops so the cell can show \"Thought for Xs\". Historical\n // messages that were never observed streaming in this session never get a\n // start time, so they correctly fall back to a plain \"Thought\" label.\n const startedAtRef = useRef<number | null>(null);\n const [durationMs, setDurationMs] = useState<number | null>(null);\n useEffect(() => {\n if (isStreaming) {\n startedAtRef.current ??= Date.now();\n return;\n }\n if (startedAtRef.current != null) {\n setDurationMs(Date.now() - startedAtRef.current);\n startedAtRef.current = null;\n }\n }, [isStreaming]);\n return (\n <ReasoningCell\n text={part.text}\n isStreaming={isStreaming}\n resetKey={`message-reasoning-${partIndex}`}\n durationMs={durationMs}\n defaultOpen={partIndex === latestReasoningPartIndex}\n collapseWhenReplaced={partIndex < latestReasoningPartIndex}\n />\n );\n}\n\nconst ALWAYS_VISIBLE_ASSISTANT_TOOLS = new Set([\"connect-builder\"]);\n\nexport function isCollapsibleAssistantWorkPart(part: {\n type?: string;\n toolName?: string;\n chatUI?: unknown;\n mcpApp?: unknown;\n}): boolean {\n if (part.type === \"reasoning\") return true;\n return (\n part.type === \"tool-call\" &&\n !ALWAYS_VISIBLE_ASSISTANT_TOOLS.has(part.toolName ?? \"\") &&\n part.chatUI === undefined &&\n part.mcpApp === undefined\n );\n}\n\nexport function getAssistantToolSummaryInfo(\n parts: readonly {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n chatUI?: unknown;\n mcpApp?: unknown;\n }[],\n): { startIndex: number; hiddenToolCount: number } {\n const toolCallIndices = parts.reduce<number[]>((indices, part, index) => {\n if (\n part.type === \"tool-call\" &&\n !isCallAgentToolCallShadowed(parts, index) &&\n isCollapsibleAssistantWorkPart(part)\n ) {\n indices.push(index);\n }\n return indices;\n }, []);\n\n if (toolCallIndices.length <= ASSISTANT_VISIBLE_TOOL_CALL_LIMIT) {\n return { startIndex: -1, hiddenToolCount: 0 };\n }\n\n const startIndex =\n toolCallIndices[\n toolCallIndices.length - ASSISTANT_VISIBLE_TOOL_CALL_LIMIT\n ]!;\n return {\n startIndex,\n hiddenToolCount: toolCallIndices.length - ASSISTANT_VISIBLE_TOOL_CALL_LIMIT,\n };\n}\n\nfunction groupAssistantWorkParts(\n part: {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n chatUI?: unknown;\n mcpApp?: unknown;\n },\n index: number,\n parts: readonly {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n chatUI?: unknown;\n mcpApp?: unknown;\n }[],\n): [\"group-work\"] | [\"group-work\", \"group-ran-tools\"] | null {\n if (isCallAgentToolCallShadowed(parts, index)) return null;\n if (isCollapsibleAssistantWorkPart(part)) {\n const { startIndex } = getAssistantToolSummaryInfo(parts);\n if (isAssistantToolSummaryPart(parts, index, startIndex)) {\n return [\"group-work\", \"group-ran-tools\"];\n }\n return [\"group-work\"];\n }\n return null;\n}\n\nfunction isAssistantToolSummaryPart(\n parts: readonly {\n type?: string;\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n chatUI?: unknown;\n mcpApp?: unknown;\n }[],\n index: number,\n startIndex: number,\n): boolean {\n if (startIndex < 0 || index >= startIndex) return false;\n if (\n isCallAgentToolCallShadowed(parts, index) ||\n !isCollapsibleAssistantWorkPart(parts[index]!)\n ) {\n return false;\n }\n\n let segmentStart = index;\n while (\n segmentStart > 0 &&\n !isCallAgentToolCallShadowed(parts, segmentStart - 1) &&\n isCollapsibleAssistantWorkPart(parts[segmentStart - 1]!)\n ) {\n segmentStart--;\n }\n\n let segmentEnd = index + 1;\n while (\n segmentEnd < startIndex &&\n !isCallAgentToolCallShadowed(parts, segmentEnd) &&\n isCollapsibleAssistantWorkPart(parts[segmentEnd]!)\n ) {\n segmentEnd++;\n }\n\n return parts\n .slice(segmentStart, segmentEnd)\n .some((candidate) => candidate.type === \"tool-call\");\n}\n\nexport function AssistantMessage() {\n const [restoreState, setRestoreState] = useState<\n \"idle\" | \"confirming\" | \"restoring\"\n >(\"idle\");\n const messageRuntime = useMessageRuntime();\n const thread = useThread();\n const chatRunning = React.useContext(ChatRunningContext);\n const lastRunDurationMs = React.useContext(ChatRunDurationContext);\n const msg = messageRuntime.getState();\n const timestamp = formatMessageTimestamp(msg.createdAt);\n const isLast =\n thread.messages.length > 0 &&\n thread.messages[thread.messages.length - 1].id === msg.id;\n const hasRenderableContent = assistantMessageHasRenderableContent(msg);\n const hasUnresolvedTool = assistantMessageHasUnresolvedTool(msg.content);\n const responseConnectionText = messageTextFromContent(msg.content);\n const statusIsTerminal = assistantMessageStatusIsTerminal(msg);\n const hasCompletedCustomUi = assistantMessageHasCompletedCustomUi(\n msg.content,\n );\n const showMissingFinalResponse = shouldShowMissingFinalResponse({\n statusIsTerminal,\n hasAssistantText: responseConnectionText.trim().length > 0,\n hasUnresolvedTool,\n hasCompletedCustomUi,\n });\n const responseConnectionContext = latestUserMessageText(thread.messages);\n const isComplete = shouldShowAssistantMessageFooter({\n isLast,\n chatRunning,\n hasRenderableContent,\n statusIsTerminal,\n hasUnresolvedTool,\n });\n const cpCtx = React.useContext(CheckpointContext);\n\n // Capture live run duration when this message finishes streaming.\n const runStartedAtRef = useRef<number | null>(null);\n const [capturedDurationMs, setCapturedDurationMs] = useState<number | null>(\n null,\n );\n useEffect(() => {\n if (chatRunning && isLast) {\n if (runStartedAtRef.current == null) {\n runStartedAtRef.current = Date.now();\n }\n return;\n }\n if (!chatRunning && isLast && capturedDurationMs == null) {\n const durationMs =\n lastRunDurationMs ??\n (runStartedAtRef.current == null\n ? null\n : Date.now() - runStartedAtRef.current);\n if (durationMs == null) return;\n setCapturedDurationMs(durationMs);\n runStartedAtRef.current = null;\n }\n }, [chatRunning, isLast, capturedDurationMs, lastRunDurationMs]);\n\n // Animate collapse only when this message just finished running in-session.\n const wasRunningRef = useRef(false);\n const [animateCollapse, setAnimateCollapse] = useState(false);\n useEffect(() => {\n if (wasRunningRef.current && !chatRunning && isComplete && isLast) {\n setAnimateCollapse(true);\n }\n wasRunningRef.current = chatRunning && isLast;\n }, [chatRunning, isComplete, isLast]);\n\n const handleRestore = useCallback(async () => {\n if (restoreState === \"idle\") {\n setRestoreState(\"confirming\");\n return;\n }\n if (restoreState !== \"confirming\" || !cpCtx) return;\n setRestoreState(\"restoring\");\n try {\n const m = messageRuntime.getState();\n const meta = m.metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n const runId =\n (typeof meta?.custom?.runId === \"string\" && meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n null;\n if (!runId) {\n setRestoreState(\"idle\");\n return;\n }\n const tid = cpCtx.threadId || \"\";\n const res = await fetch(\n `${cpCtx.apiUrl}/checkpoints?threadId=${encodeURIComponent(tid)}`,\n );\n const checkpoints: unknown[] = res.ok ? await res.json() : [];\n const checkpoint = checkpoints.find(\n (cp) => (cp as { runId?: string }).runId === runId,\n );\n if (!checkpoint) {\n setRestoreState(\"idle\");\n return;\n }\n const restoreRes = await fetch(`${cpCtx.apiUrl}/checkpoints/restore`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n checkpointId: (checkpoint as { id?: string }).id,\n }),\n });\n if (restoreRes.ok) {\n window.location.reload();\n } else {\n setRestoreState(\"idle\");\n }\n } catch {\n setRestoreState(\"idle\");\n }\n }, [restoreState, cpCtx, messageRuntime]);\n\n const cancelRestore = useCallback(() => {\n setRestoreState(\"idle\");\n }, []);\n\n const showRestore = cpCtx?.devMode && isComplete && !isLast;\n\n // Collect parts for the files-changed summary (code-agent turns only).\n const msgContent = msg.content as ContentPart[] | undefined;\n const hasCodeAgentTools =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p) =>\n p.type === \"tool-call\" &&\n p.structuredMeta &&\n (p.structuredMeta.toolKind === \"edit\" ||\n p.structuredMeta.toolKind === \"write\"),\n );\n const hasCollapsibleWork =\n Array.isArray(msgContent) &&\n msgContent.some(\n (p, index) =>\n !isCallAgentToolCallShadowed(msgContent, index) &&\n (p.type !== \"tool-call\" || p.activity !== true) &&\n isCollapsibleAssistantWorkPart(p),\n );\n const shadowedToolCallIds = Array.isArray(msgContent)\n ? shadowedCallAgentToolCallIds(msgContent)\n : new Set<string>();\n const activeTailToolCallId = computeActiveTailToolCallId(msgContent, {\n chatRunning,\n isLast,\n });\n\n if (!hasRenderableContent) return null;\n\n return (\n <div\n className=\"group relative\"\n style={{ contentVisibility: isComplete ? \"auto\" : \"visible\" }}\n >\n <div className=\"w-full max-w-[95%] text-sm leading-relaxed text-foreground\">\n <MessagePrimitive.GroupedParts groupBy={groupAssistantWorkParts}>\n {({ part, children }) => {\n switch (part.type) {\n case \"group-work\": {\n const showSummary = shouldShowAssistantWorkSummary({\n isLast,\n isComplete,\n hasCollapsibleWork,\n hasUnresolvedTool,\n });\n if (!showSummary) return <>{children}</>;\n return (\n <WorkedForSummary\n durationMs={capturedDurationMs}\n autoCollapse={animateCollapse}\n >\n {children}\n </WorkedForSummary>\n );\n }\n case \"group-ran-tools\": {\n const toolCount = part.indices.filter(\n (index) => msgContent?.[index]?.type === \"tool-call\",\n ).length;\n return (\n <RanToolsSummary toolCount={toolCount}>\n {children}\n </RanToolsSummary>\n );\n }\n case \"text\":\n return <MarkdownText />;\n case \"reasoning\":\n return <ReasoningMessagePart />;\n case \"tool-call\":\n if (shadowedToolCallIds.has(part.toolCallId)) return null;\n return part.toolUI ? (\n <ToolActivityPresentation\n toolName={part.toolName}\n isRunning={part.status?.type === \"running\"}\n isActiveTail={part.toolCallId === activeTailToolCallId}\n >\n {part.toolUI}\n </ToolActivityPresentation>\n ) : (\n <ToolCallFallback\n {...part}\n isActiveTail={part.toolCallId === activeTailToolCallId}\n />\n );\n default:\n return null;\n }\n }}\n </MessagePrimitive.GroupedParts>\n {showMissingFinalResponse && (\n <p role=\"status\" className=\"text-muted-foreground\">\n The agent stopped without sending a final message. Ask it to\n continue or retry.\n </p>\n )}\n {isComplete && hasCodeAgentTools && msgContent && (\n <FilesChangedSummary parts={msgContent} />\n )}\n {isComplete && isLast && (\n <McpConnectionSuggestion\n text={responseConnectionText}\n contextText={responseConnectionContext}\n variant=\"response\"\n />\n )}\n {isLast && hasUnresolvedTool && !chatRunning && (\n <RunningActivityStatus label=\"Thinking\" />\n )}\n </div>\n {isComplete && (\n <div className=\"mt-1 flex items-center justify-between\">\n <div className=\"flex min-w-0 items-center gap-1\">\n <MessageActionsMenu\n showRevert={showRestore && restoreState === \"idle\"}\n onRevert={handleRestore}\n />\n {/* Regenerate button — only on the last assistant message, auto-disabled while running */}\n {isLast && (\n <TooltipProvider delayDuration={400}>\n <Tooltip>\n <TooltipTrigger asChild>\n <ActionBarPrimitive.Reload asChild>\n <button\n type=\"button\"\n aria-label=\"Regenerate response\"\n className=\"flex h-6 w-6 cursor-pointer items-center justify-center rounded-md text-muted-foreground/70 transition-colors duration-150 hover:bg-accent hover:text-foreground opacity-0 group-hover:opacity-100 group-focus-within:opacity-100 disabled:cursor-not-allowed disabled:opacity-40\"\n >\n <IconRefresh className=\"h-3.5 w-3.5\" />\n </button>\n </ActionBarPrimitive.Reload>\n </TooltipTrigger>\n <TooltipContent side=\"top\" className=\"text-xs\">\n Regenerate response\n </TooltipContent>\n </Tooltip>\n </TooltipProvider>\n )}\n <MessageBranchPicker />\n {timestamp && (\n <MessageTimestamp\n timestamp={timestamp}\n className=\"opacity-0 transition-opacity duration-150 group-hover:opacity-100 group-focus-within:opacity-100\"\n />\n )}\n </div>\n {showRestore && restoreState === \"confirming\" ? (\n <div className=\"flex items-center gap-1 text-xs\">\n <button\n onClick={handleRestore}\n className=\"rounded-md bg-destructive px-1.5 py-0.5 text-destructive-foreground hover:bg-destructive/90\"\n >\n Restore to here?\n </button>\n <button\n onClick={cancelRestore}\n className=\"rounded-md px-1.5 py-0.5 text-muted-foreground hover:bg-accent\"\n >\n Cancel\n </button>\n </div>\n ) : showRestore && restoreState === \"restoring\" ? (\n <span className=\"flex items-center gap-1 text-xs text-muted-foreground\">\n <IconLoader2 className=\"h-3 w-3 animate-spin\" />\n Restoring...\n </span>\n ) : (\n <ThumbsFeedback\n threadId={cpCtx?.threadId ?? \"\"}\n runId={(() => {\n const meta = messageRuntime.getState().metadata as\n | { custom?: { runId?: unknown }; runId?: unknown }\n | undefined;\n return (\n (typeof meta?.custom?.runId === \"string\" &&\n meta.custom.runId) ||\n (typeof meta?.runId === \"string\" && meta.runId) ||\n \"\"\n );\n })()}\n messageSeq={thread.messages.findIndex((m) => m.id === msg.id)}\n />\n )}\n </div>\n )}\n </div>\n );\n}\n\n// ─── RunningActivityStatus / ThinkingIndicator ────────────────────────────────\n\nexport function RunningActivityStatus({ label }: { label: string }) {\n return (\n <div className=\"agent-running-activity\">\n <ThinkingIndicator label={label} />\n </div>\n );\n}\n\nexport function ThinkingIndicator({\n label = \"Thinking\",\n}: { label?: string } = {}) {\n return (\n <div\n className=\"agent-thinking-indicator\"\n role=\"status\"\n aria-live=\"polite\"\n aria-label={label}\n >\n <span className=\"agent-thinking-indicator__text\">{label}</span>\n </div>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call-display.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,qBAAqB,CAAC;AAgBpE,OAAO,KAMN,MAAM,OAAO,CAAC;AAEf,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAUzE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AAC7D,OAAO,EAIL,mBAAmB,EACpB,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"tool-call-display.d.ts","sourceRoot":"","sources":["../../../src/client/chat/tool-call-display.tsx"],"names":[],"mappings":"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"}
|
|
@@ -7,7 +7,7 @@ import { Popover, PopoverContent, PopoverTrigger, } from "../components/ui/popov
|
|
|
7
7
|
import { ConnectBuilderCard } from "../ConnectBuilderCard.js";
|
|
8
8
|
import { McpAppRenderer } from "../mcp-apps/McpAppRenderer.js";
|
|
9
9
|
import { BashCell, EditCell, WriteCell, FilesChangedSummary, } from "../tool-cells/index.js";
|
|
10
|
-
import { humanizeToolName } from "../tool-display.js";
|
|
10
|
+
import { humanizeToolName, isCallAgentToolCallShadowed, } from "../tool-display.js";
|
|
11
11
|
import { cn } from "../utils.js";
|
|
12
12
|
import { SmoothMarkdownText, HighlightedCodeBlock, markdownComponents, markdownModule, remarkGfmFn, markdownUrlTransform, useSmoothStreamingText, } from "./markdown-renderer.js";
|
|
13
13
|
import { resolveToolRenderer } from "./tool-render-registry.js";
|
|
@@ -366,10 +366,14 @@ export function ReconnectStreamMessage({ content, }) {
|
|
|
366
366
|
const latestReasoningPartIndex = content.reduce((latestIndex, part, index) => part.type === "reasoning" ? index : latestIndex, -1);
|
|
367
367
|
const streamingTextPartIndex = content.at(-1)?.type === "text" ? content.length - 1 : -1;
|
|
368
368
|
const streamingReasoningPartIndex = content.at(-1)?.type === "reasoning" ? content.length - 1 : -1;
|
|
369
|
-
const latestActiveToolIndex = content.reduce((latestIndex, part, index) => part.type === "tool-call" &&
|
|
369
|
+
const latestActiveToolIndex = content.reduce((latestIndex, part, index) => part.type === "tool-call" &&
|
|
370
|
+
!isCallAgentToolCallShadowed(content, index) &&
|
|
371
|
+
(chatRunning || part.activity === true)
|
|
370
372
|
? index
|
|
371
373
|
: latestIndex, -1);
|
|
372
374
|
const renderPart = (part, i) => {
|
|
375
|
+
if (isCallAgentToolCallShadowed(content, i))
|
|
376
|
+
return null;
|
|
373
377
|
if (part.type === "text") {
|
|
374
378
|
const partStreaming = chatRunning && i === streamingTextPartIndex;
|
|
375
379
|
return (_jsx(SmoothMarkdownText, { text: part.text, streaming: partStreaming, resetKey: `reconnect-text-${i}`, statusType: partStreaming ? "running" : "complete" }, `reconnect-text-${i}`));
|
|
@@ -393,6 +397,8 @@ export function ReconnectStreamMessage({ content, }) {
|
|
|
393
397
|
};
|
|
394
398
|
for (let i = 0; i < content.length; i++) {
|
|
395
399
|
const part = content[i];
|
|
400
|
+
if (isCallAgentToolCallShadowed(content, i))
|
|
401
|
+
continue;
|
|
396
402
|
const isOlderToolWork = toolSummary.startIndex >= 0 &&
|
|
397
403
|
i < toolSummary.startIndex &&
|
|
398
404
|
isReconnectToolSummaryPart(content, i, toolSummary.startIndex);
|
|
@@ -410,7 +416,9 @@ export function ReconnectStreamMessage({ content, }) {
|
|
|
410
416
|
}
|
|
411
417
|
function getReconnectToolSummaryInfo(content) {
|
|
412
418
|
const toolCallIndices = content.reduce((indices, part, index) => {
|
|
413
|
-
if (part.type === "tool-call" &&
|
|
419
|
+
if (part.type === "tool-call" &&
|
|
420
|
+
!isCallAgentToolCallShadowed(content, index) &&
|
|
421
|
+
isReconnectSummarizablePart(part)) {
|
|
414
422
|
indices.push(index);
|
|
415
423
|
}
|
|
416
424
|
return indices;
|
|
@@ -424,20 +432,27 @@ function getReconnectToolSummaryInfo(content) {
|
|
|
424
432
|
}
|
|
425
433
|
function isReconnectSummarizablePart(part) {
|
|
426
434
|
return (part.type === "reasoning" ||
|
|
427
|
-
(part.type === "tool-call" &&
|
|
435
|
+
(part.type === "tool-call" &&
|
|
436
|
+
part.toolName !== "connect-builder" &&
|
|
437
|
+
part.chatUI === undefined &&
|
|
438
|
+
part.mcpApp === undefined));
|
|
428
439
|
}
|
|
429
440
|
function isReconnectToolSummaryPart(content, index, startIndex) {
|
|
430
441
|
if (startIndex < 0 || index >= startIndex)
|
|
431
442
|
return false;
|
|
432
|
-
if (
|
|
443
|
+
if (isCallAgentToolCallShadowed(content, index) ||
|
|
444
|
+
!isReconnectSummarizablePart(content[index])) {
|
|
433
445
|
return false;
|
|
446
|
+
}
|
|
434
447
|
let segmentStart = index;
|
|
435
448
|
while (segmentStart > 0 &&
|
|
449
|
+
!isCallAgentToolCallShadowed(content, segmentStart - 1) &&
|
|
436
450
|
isReconnectSummarizablePart(content[segmentStart - 1])) {
|
|
437
451
|
segmentStart--;
|
|
438
452
|
}
|
|
439
453
|
let segmentEnd = index + 1;
|
|
440
454
|
while (segmentEnd < startIndex &&
|
|
455
|
+
!isCallAgentToolCallShadowed(content, segmentEnd) &&
|
|
441
456
|
isReconnectSummarizablePart(content[segmentEnd])) {
|
|
442
457
|
segmentEnd++;
|
|
443
458
|
}
|