@agent-native/core 0.103.1 → 0.105.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 +2 -2
- package/corpus/core/CHANGELOG.md +61 -0
- package/corpus/core/package.json +9 -2
- package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
- package/corpus/core/src/agent/production-agent.ts +30 -0
- package/corpus/core/src/agent/run-store.ts +12 -2
- package/corpus/core/src/cli/create.ts +1 -0
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
- package/corpus/core/src/cli/templates-meta.ts +4 -3
- package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
- package/corpus/core/src/client/AgentChatHome.tsx +4 -0
- package/corpus/core/src/client/AgentPanel.tsx +321 -223
- package/corpus/core/src/client/AssistantChat.tsx +6 -10
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
- package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
- package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
- package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
- package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
- package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
- package/corpus/core/src/client/agent-page/types.ts +1 -1
- package/corpus/core/src/client/analytics.ts +51 -5
- package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
- package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
- package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
- package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
- package/corpus/core/src/client/index.ts +16 -1
- package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
- package/corpus/core/src/client/session-replay.ts +158 -5
- package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
- package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
- package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
- package/corpus/core/src/client/use-chat-threads.ts +2 -0
- package/corpus/core/src/connections/catalog.ts +49 -7
- package/corpus/core/src/db/index.ts +6 -1
- package/corpus/core/src/deploy/build.ts +23 -0
- package/corpus/core/src/extensions/actions.ts +106 -16
- package/corpus/core/src/extensions/content-patch.ts +22 -0
- package/corpus/core/src/extensions/routes.ts +18 -0
- package/corpus/core/src/extensions/store.ts +8 -0
- package/corpus/core/src/index.ts +3 -0
- package/corpus/core/src/ingestion/docx.ts +158 -0
- package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
- package/corpus/core/src/ingestion/figma.ts +548 -0
- package/corpus/core/src/ingestion/index.ts +107 -0
- package/corpus/core/src/ingestion/media.ts +264 -0
- package/corpus/core/src/ingestion/notion.ts +121 -0
- package/corpus/core/src/ingestion/office.ts +214 -0
- package/corpus/core/src/ingestion/orchestration.ts +160 -0
- package/corpus/core/src/ingestion/pptx.ts +333 -0
- package/corpus/core/src/ingestion/selection.ts +81 -0
- package/corpus/core/src/ingestion/website.ts +151 -0
- package/corpus/core/src/integrations/plugin.ts +45 -37
- package/corpus/core/src/localization/default-messages.ts +35 -12
- package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
- package/corpus/core/src/observability/traces.ts +5 -3
- package/corpus/core/src/provider-api/index.ts +452 -8
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
- package/corpus/core/src/search-utils/index.ts +112 -0
- package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
- package/corpus/core/src/server/action-discovery.ts +33 -8
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
- package/corpus/core/src/server/core-routes-plugin.ts +12 -0
- package/corpus/core/src/server/index.ts +30 -0
- package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
- package/corpus/core/src/styles/agent-native.css +9 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/corpus/core/src/templates/workspace-root/.env.example +12 -0
- package/corpus/core/src/workspace-connections/index.ts +6 -0
- package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
- package/corpus/core/src/workspace-connections/store.ts +16 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
- package/corpus/templates/analytics/AGENTS.md +9 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
- package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
- package/corpus/templates/analytics/app/i18n-data.ts +3 -3
- package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
- package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
- package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
- package/corpus/templates/assets/AGENTS.md +10 -0
- package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
- package/corpus/templates/assets/actions/edit-image.ts +2 -0
- package/corpus/templates/assets/actions/generate-asset.ts +52 -0
- package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
- package/corpus/templates/assets/actions/generate-image.ts +219 -1
- package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
- package/corpus/templates/assets/actions/refine-image.ts +3 -0
- package/corpus/templates/assets/actions/restyle-image.ts +2 -0
- package/corpus/templates/assets/agent-native.app-skill.json +4 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/assets/app/i18n-data.ts +29 -13
- package/corpus/templates/assets/app/routes/agent.tsx +7 -1
- package/corpus/templates/assets/app/routes/library.tsx +9 -0
- package/corpus/templates/assets/app/routes/settings.tsx +3 -0
- package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/assets/package.json +1 -0
- package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
- package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
- package/corpus/templates/brain/app/i18n-data.ts +3 -3
- package/corpus/templates/brain/app/lib/brain.ts +1 -1
- package/corpus/templates/brain/server/lib/search.ts +17 -67
- package/corpus/templates/calendar/app/i18n-data.ts +3 -3
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
- package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
- package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
- package/corpus/templates/clips/actions/create-meeting.ts +6 -2
- package/corpus/templates/clips/actions/create-organization.ts +3 -2
- package/corpus/templates/clips/actions/create-recording.ts +4 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
- package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
- package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
- package/corpus/templates/clips/actions/list-meetings.ts +23 -5
- package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
- package/corpus/templates/clips/actions/remove-silences.ts +10 -1
- package/corpus/templates/clips/actions/request-transcript.ts +53 -11
- package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
- package/corpus/templates/clips/actions/search-recordings.ts +5 -8
- package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
- package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
- package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
- package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
- package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
- package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
- package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
- package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
- package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
- package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
- package/corpus/templates/clips/app/routes/record.tsx +23 -2
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
- package/corpus/templates/clips/app/routes.ts +3 -1
- package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
- package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
- package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
- package/corpus/templates/clips/desktop/src/app.tsx +66 -28
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
- package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
- package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
- package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
- package/corpus/templates/clips/desktop/src/styles.css +13 -11
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
- package/corpus/templates/clips/server/db/schema.ts +2 -2
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
- package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
- package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
- package/corpus/templates/clips/server/lib/recordings.ts +40 -1
- package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/clips/server/plugins/db.ts +2 -2
- package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
- package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
- package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
- package/corpus/templates/content/AGENTS.md +9 -0
- package/corpus/templates/content/actions/create-document.ts +94 -0
- package/corpus/templates/content/actions/edit-document.ts +144 -4
- package/corpus/templates/content/actions/update-document.ts +138 -0
- package/corpus/templates/content/agent-native.app-skill.json +4 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/content/app/i18n-data.ts +13 -4
- package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
- package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
- package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/content/package.json +1 -0
- package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
- package/corpus/templates/design/AGENTS.md +6 -0
- package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
- package/corpus/templates/design/actions/edit-design.ts +128 -0
- package/corpus/templates/design/actions/generate-design.ts +278 -14
- package/corpus/templates/design/actions/generate-screens.ts +42 -1
- package/corpus/templates/design/agent-native.app-skill.json +4 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +10 -4
- package/corpus/templates/design/app/routes/agent.tsx +2 -1
- package/corpus/templates/design/app/routes/settings.tsx +3 -0
- package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/design/package.json +1 -0
- package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
- package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
- package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
- package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/shared/generation-session.ts +7 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
- package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
- package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
- package/corpus/templates/plan/AGENTS.md +21 -1
- package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
- package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
- package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
- package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
- package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
- package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
- package/corpus/templates/plan/server/plan-mdx.ts +75 -2
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
- package/corpus/templates/slides/AGENTS.md +6 -0
- package/corpus/templates/slides/actions/add-slide.ts +230 -14
- package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
- package/corpus/templates/slides/actions/create-deck.ts +130 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
- package/corpus/templates/slides/actions/import-file.ts +5 -4
- package/corpus/templates/slides/actions/patch-deck.ts +200 -10
- package/corpus/templates/slides/actions/update-slide.ts +208 -15
- package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
- package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
- package/corpus/templates/slides/app/routes/agent.tsx +7 -1
- package/corpus/templates/slides/app/routes/settings.tsx +3 -0
- package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
- package/corpus/templates/slides/package.json +1 -0
- package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
- package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
- package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
- package/dist/agent/engine/credential-errors.d.ts +1 -1
- package/dist/agent/engine/credential-errors.d.ts.map +1 -1
- package/dist/agent/engine/credential-errors.js +2 -2
- package/dist/agent/engine/credential-errors.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +25 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +12 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +1 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +30 -11
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +4 -3
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentAskPopover.d.ts +11 -0
- package/dist/client/AgentAskPopover.d.ts.map +1 -0
- package/dist/client/AgentAskPopover.js +30 -0
- package/dist/client/AgentAskPopover.js.map +1 -0
- package/dist/client/AgentChatHome.d.ts +1 -1
- package/dist/client/AgentChatHome.d.ts.map +1 -1
- package/dist/client/AgentChatHome.js +2 -2
- package/dist/client/AgentChatHome.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +9 -19
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +119 -80
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +4 -4
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +3 -9
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +49 -189
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +12 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentContextTab.js +26 -28
- package/dist/client/agent-page/AgentContextTab.js.map +1 -1
- package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
- package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
- package/dist/client/agent-page/AgentEmptyState.js +6 -0
- package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
- package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
- package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.js +90 -58
- package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
- package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
- package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
- package/dist/client/agent-page/AgentTabFrame.js +7 -0
- package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
- package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
- package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +135 -99
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/agent-page/types.d.ts +1 -1
- package/dist/client/agent-page/types.d.ts.map +1 -1
- package/dist/client/agent-page/types.js.map +1 -1
- package/dist/client/analytics.d.ts +10 -3
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +37 -2
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +10 -3
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +2 -2
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +15 -3
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/dynamic-suggestions.js +3 -3
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/index.d.ts +4 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts +5 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +74 -5
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts +11 -2
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +105 -31
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/session-replay.d.ts +28 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +122 -8
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts +3 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +16 -6
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +3 -3
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/agent-settings-search.js +2 -2
- package/dist/client/settings/agent-settings-search.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +2 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/connections/catalog.d.ts +41 -7
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +40 -7
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -2
- package/dist/db/index.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +17 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +85 -15
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/content-patch.d.ts +4 -0
- package/dist/extensions/content-patch.d.ts.map +1 -1
- package/dist/extensions/content-patch.js +18 -0
- package/dist/extensions/content-patch.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +14 -0
- package/dist/extensions/routes.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 +4 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ingestion/docx.d.ts +16 -0
- package/dist/ingestion/docx.d.ts.map +1 -0
- package/dist/ingestion/docx.js +129 -0
- package/dist/ingestion/docx.js.map +1 -0
- package/dist/ingestion/figma-node-to-html.d.ts +304 -0
- package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
- package/dist/ingestion/figma-node-to-html.js +1292 -0
- package/dist/ingestion/figma-node-to-html.js.map +1 -0
- package/dist/ingestion/figma.d.ts +115 -0
- package/dist/ingestion/figma.d.ts.map +1 -0
- package/dist/ingestion/figma.js +399 -0
- package/dist/ingestion/figma.js.map +1 -0
- package/dist/ingestion/index.d.ts +11 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +11 -0
- package/dist/ingestion/index.js.map +1 -0
- package/dist/ingestion/media.d.ts +36 -0
- package/dist/ingestion/media.d.ts.map +1 -0
- package/dist/ingestion/media.js +178 -0
- package/dist/ingestion/media.js.map +1 -0
- package/dist/ingestion/notion.d.ts +12 -0
- package/dist/ingestion/notion.d.ts.map +1 -0
- package/dist/ingestion/notion.js +104 -0
- package/dist/ingestion/notion.js.map +1 -0
- package/dist/ingestion/office.d.ts +45 -0
- package/dist/ingestion/office.d.ts.map +1 -0
- package/dist/ingestion/office.js +141 -0
- package/dist/ingestion/office.js.map +1 -0
- package/dist/ingestion/orchestration.d.ts +52 -0
- package/dist/ingestion/orchestration.d.ts.map +1 -0
- package/dist/ingestion/orchestration.js +89 -0
- package/dist/ingestion/orchestration.js.map +1 -0
- package/dist/ingestion/pptx.d.ts +28 -0
- package/dist/ingestion/pptx.d.ts.map +1 -0
- package/dist/ingestion/pptx.js +255 -0
- package/dist/ingestion/pptx.js.map +1 -0
- package/dist/ingestion/selection.d.ts +20 -0
- package/dist/ingestion/selection.d.ts.map +1 -0
- package/dist/ingestion/selection.js +52 -0
- package/dist/ingestion/selection.js.map +1 -0
- package/dist/ingestion/website.d.ts +27 -0
- package/dist/ingestion/website.d.ts.map +1 -0
- package/dist/ingestion/website.js +100 -0
- package/dist/ingestion/website.js.map +1 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +32 -27
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/localization/default-messages.d.ts +22 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +31 -9
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/hosted-model-experiment.d.ts +39 -0
- package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
- package/dist/observability/hosted-model-experiment.js +90 -0
- package/dist/observability/hosted-model-experiment.js.map +1 -0
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +5 -3
- package/dist/observability/traces.js.map +1 -1
- package/dist/provider-api/index.d.ts +35 -4
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +339 -8
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/search-utils/index.d.ts +12 -0
- package/dist/search-utils/index.d.ts.map +1 -0
- package/dist/search-utils/index.js +95 -0
- package/dist/search-utils/index.js.map +1 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +57 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-discovery.d.ts +8 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +26 -9
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
- package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +95 -0
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +7 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +5 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +5 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +48 -0
- package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
- package/dist/server/workspace-provider-oauth.js +415 -0
- package/dist/server/workspace-provider-oauth.js.map +1 -0
- package/dist/styles/agent-native.css +9 -0
- package/dist/templates/chat/app/i18n/en-US.ts +3 -3
- package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
- package/dist/templates/default/app/i18n/en-US.ts +3 -3
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/dist/templates/workspace-root/.env.example +12 -0
- package/dist/workspace-connections/index.d.ts +1 -0
- package/dist/workspace-connections/index.d.ts.map +1 -1
- package/dist/workspace-connections/index.js +1 -0
- package/dist/workspace-connections/index.js.map +1 -1
- package/dist/workspace-connections/lifecycle.d.ts +16 -0
- package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
- package/dist/workspace-connections/lifecycle.js +14 -0
- package/dist/workspace-connections/lifecycle.js.map +1 -0
- package/dist/workspace-connections/store.d.ts.map +1 -1
- package/dist/workspace-connections/store.js +16 -0
- package/dist/workspace-connections/store.js.map +1 -1
- package/package.json +10 -3
- package/src/templates/chat/app/i18n/en-US.ts +3 -3
- package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
- package/src/templates/chat/app/lib/agent-page.tsx +10 -1
- package/src/templates/default/app/i18n/en-US.ts +3 -3
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/src/templates/workspace-root/.env.example +12 -0
|
@@ -5145,13 +5145,11 @@ const AssistantChatInner = forwardRef<
|
|
|
5145
5145
|
"agent-empty-state",
|
|
5146
5146
|
emptyStateDisplay === "hidden"
|
|
5147
5147
|
? "sr-only"
|
|
5148
|
-
: "flex h-full flex-col items-center justify-center gap-
|
|
5148
|
+
: "flex h-full flex-col items-center justify-center gap-3 px-4 py-16",
|
|
5149
5149
|
)}
|
|
5150
5150
|
aria-busy="true"
|
|
5151
5151
|
>
|
|
5152
|
-
<
|
|
5153
|
-
<IconMessage className="h-5 w-5 text-muted-foreground" />
|
|
5154
|
-
</div>
|
|
5152
|
+
<IconMessage className="h-5 w-5 text-muted-foreground/60" />
|
|
5155
5153
|
<p className="sr-only">
|
|
5156
5154
|
{emptyStateText ?? "Loading chat..."}
|
|
5157
5155
|
</p>
|
|
@@ -5173,19 +5171,17 @@ const AssistantChatInner = forwardRef<
|
|
|
5173
5171
|
"agent-empty-state",
|
|
5174
5172
|
emptyStateDisplay === "hidden"
|
|
5175
5173
|
? "sr-only"
|
|
5176
|
-
: "flex h-full flex-col items-center justify-center gap-
|
|
5174
|
+
: "flex h-full flex-col items-center justify-center gap-3 px-4 py-16",
|
|
5177
5175
|
)}
|
|
5178
5176
|
>
|
|
5179
|
-
<
|
|
5180
|
-
<IconMessage className="h-5 w-5 text-muted-foreground" />
|
|
5181
|
-
</div>
|
|
5177
|
+
<IconMessage className="h-5 w-5 text-muted-foreground/60" />
|
|
5182
5178
|
<p className="sr-only">
|
|
5183
5179
|
{emptyStateText ?? "How can I help you?"}
|
|
5184
5180
|
</p>
|
|
5185
5181
|
{emptyStateAddon}
|
|
5186
5182
|
{resolvedSuggestions &&
|
|
5187
5183
|
resolvedSuggestions.length > 0 ? (
|
|
5188
|
-
<div className="flex
|
|
5184
|
+
<div className="flex w-full max-w-[280px] flex-col gap-1">
|
|
5189
5185
|
{resolvedSuggestions.map((suggestion) => (
|
|
5190
5186
|
<button
|
|
5191
5187
|
key={suggestion}
|
|
@@ -5196,7 +5192,7 @@ const AssistantChatInner = forwardRef<
|
|
|
5196
5192
|
}
|
|
5197
5193
|
void addToQueue(suggestion);
|
|
5198
5194
|
}}
|
|
5199
|
-
className="w-full
|
|
5195
|
+
className="w-full px-2 py-1 text-center text-[13px] text-muted-foreground transition-colors hover:text-foreground focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2"
|
|
5200
5196
|
>
|
|
5201
5197
|
{suggestion}
|
|
5202
5198
|
</button>
|
|
@@ -1,18 +1,5 @@
|
|
|
1
|
-
import {
|
|
2
|
-
|
|
3
|
-
IconPlus,
|
|
4
|
-
IconHistory,
|
|
5
|
-
IconLink,
|
|
6
|
-
IconLinkOff,
|
|
7
|
-
IconCheck,
|
|
8
|
-
} from "@tabler/icons-react";
|
|
9
|
-
import React, {
|
|
10
|
-
useState,
|
|
11
|
-
useRef,
|
|
12
|
-
useEffect,
|
|
13
|
-
useCallback,
|
|
14
|
-
useMemo,
|
|
15
|
-
} from "react";
|
|
1
|
+
import { IconPlus, IconHistory, IconX } from "@tabler/icons-react";
|
|
2
|
+
import React, { useState, useRef, useEffect, useCallback } from "react";
|
|
16
3
|
|
|
17
4
|
import { DEFAULT_MODEL } from "../agent/default-model.js";
|
|
18
5
|
import {
|
|
@@ -30,10 +17,13 @@ import {
|
|
|
30
17
|
claimAgentChatSubmit,
|
|
31
18
|
drainBufferedAgentChatOpenRequests,
|
|
32
19
|
drainBufferedAgentChatSubmits,
|
|
20
|
+
getAgentChatContextState,
|
|
33
21
|
isAgentChatSubmitCancelled,
|
|
34
22
|
normalizeAgentChatContextItem,
|
|
35
23
|
parseSubmitChatMessage,
|
|
24
|
+
removeAgentChatContextItem,
|
|
36
25
|
reportAgentChatSubmitResult,
|
|
26
|
+
setAgentChatContextItem,
|
|
37
27
|
type AgentChatContextItem,
|
|
38
28
|
} from "./agent-chat.js";
|
|
39
29
|
import { agentNativePath, appPath } from "./api-path.js";
|
|
@@ -55,7 +45,6 @@ import {
|
|
|
55
45
|
Popover,
|
|
56
46
|
PopoverAnchor,
|
|
57
47
|
PopoverContent,
|
|
58
|
-
PopoverTrigger,
|
|
59
48
|
} from "./components/ui/popover.js";
|
|
60
49
|
import {
|
|
61
50
|
Tooltip,
|
|
@@ -228,153 +217,12 @@ function ChatSkeleton({
|
|
|
228
217
|
);
|
|
229
218
|
}
|
|
230
219
|
|
|
231
|
-
// ───
|
|
220
|
+
// ─── Resource context ────────────────────────────────────────────────────────
|
|
232
221
|
|
|
233
222
|
function formatScopeType(type: string) {
|
|
234
223
|
return type.replace(/[-_]+/g, " ");
|
|
235
224
|
}
|
|
236
225
|
|
|
237
|
-
function indefiniteArticleFor(value: string) {
|
|
238
|
-
return /^[aeiou]/i.test(value.trim()) ? "an" : "a";
|
|
239
|
-
}
|
|
240
|
-
|
|
241
|
-
function getScopeCopy(scope: ChatThreadScope, isCurrentScope: boolean) {
|
|
242
|
-
const type = formatScopeType(scope.type);
|
|
243
|
-
const fallbackObject = isCurrentScope
|
|
244
|
-
? `this ${type}`
|
|
245
|
-
: `${indefiniteArticleFor(type)} ${type}`;
|
|
246
|
-
const objectLabel = scope.label || fallbackObject;
|
|
247
|
-
return {
|
|
248
|
-
objectLabel,
|
|
249
|
-
chipLabel:
|
|
250
|
-
scope.label || (isCurrentScope ? `this ${type}` : `${type} context`),
|
|
251
|
-
};
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
/**
|
|
255
|
-
* Compact context tab above the composer. Click → popover with related chats
|
|
256
|
-
* and the remove-context action. It stays attached to the chat field so scoped
|
|
257
|
-
* context is visible right where the next message will be composed.
|
|
258
|
-
*/
|
|
259
|
-
function ScopeBadge({
|
|
260
|
-
scope,
|
|
261
|
-
currentScope,
|
|
262
|
-
onDetach,
|
|
263
|
-
otherScopedThreads,
|
|
264
|
-
activeThreadId,
|
|
265
|
-
openTabIds,
|
|
266
|
-
onSelectThread,
|
|
267
|
-
}: {
|
|
268
|
-
scope: ChatThreadScope;
|
|
269
|
-
currentScope?: ChatThreadScope | null;
|
|
270
|
-
onDetach: () => void;
|
|
271
|
-
/** Other threads scoped to the same resource (excluding the active one),
|
|
272
|
-
* pre-sorted most-recent-first. The chip popover lists these so the user
|
|
273
|
-
* can hop between this resource's chats without opening the full history. */
|
|
274
|
-
otherScopedThreads: ChatThreadSummary[];
|
|
275
|
-
activeThreadId: string;
|
|
276
|
-
openTabIds: Set<string>;
|
|
277
|
-
onSelectThread: (id: string) => void;
|
|
278
|
-
}) {
|
|
279
|
-
const [open, setOpen] = useState(false);
|
|
280
|
-
const isCurrentScope = Boolean(
|
|
281
|
-
currentScope &&
|
|
282
|
-
currentScope.type === scope.type &&
|
|
283
|
-
currentScope.id === scope.id,
|
|
284
|
-
);
|
|
285
|
-
const hasDifferentCurrentScope = Boolean(currentScope && !isCurrentScope);
|
|
286
|
-
const { objectLabel, chipLabel } = getScopeCopy(scope, isCurrentScope);
|
|
287
|
-
const heading = `Using ${chipLabel}`;
|
|
288
|
-
const detailSuffix = hasDifferentCurrentScope
|
|
289
|
-
? "Start a new chat to use the current page."
|
|
290
|
-
: isCurrentScope
|
|
291
|
-
? "New chats here keep this context."
|
|
292
|
-
: "Start a new chat for a general conversation.";
|
|
293
|
-
const otherCount = otherScopedThreads.length;
|
|
294
|
-
return (
|
|
295
|
-
<div className="agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground">
|
|
296
|
-
<Popover open={open} onOpenChange={setOpen}>
|
|
297
|
-
<PopoverTrigger asChild>
|
|
298
|
-
<button
|
|
299
|
-
type="button"
|
|
300
|
-
className="inline-flex h-7 min-w-0 max-w-full cursor-pointer items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-muted-foreground transition-colors hover:bg-accent hover:text-foreground sm:max-w-72"
|
|
301
|
-
aria-label={heading}
|
|
302
|
-
>
|
|
303
|
-
<IconLink size={11} className="shrink-0 opacity-70" />
|
|
304
|
-
<span className="min-w-0 truncate">{heading}</span>
|
|
305
|
-
{otherCount > 0 && (
|
|
306
|
-
<span
|
|
307
|
-
className="ms-0.5 shrink-0 rounded-full bg-muted px-1.5 py-px text-[10px] leading-none text-muted-foreground"
|
|
308
|
-
aria-label={`${otherCount} other chats for ${objectLabel}`}
|
|
309
|
-
>
|
|
310
|
-
+{otherCount}
|
|
311
|
-
</span>
|
|
312
|
-
)}
|
|
313
|
-
</button>
|
|
314
|
-
</PopoverTrigger>
|
|
315
|
-
<PopoverContent align="center" side="top" className="w-72 p-0">
|
|
316
|
-
<p className="px-3 pt-2 pb-1.5 text-[11px] text-muted-foreground">
|
|
317
|
-
This chat can see{" "}
|
|
318
|
-
<span className="text-foreground">{objectLabel}</span>.{" "}
|
|
319
|
-
{detailSuffix}
|
|
320
|
-
</p>
|
|
321
|
-
{otherCount > 0 && (
|
|
322
|
-
<div className="border-t border-border">
|
|
323
|
-
<div className="px-3 pt-1.5 pb-1 text-[10px] uppercase tracking-wider text-muted-foreground/70">
|
|
324
|
-
Chats for {objectLabel}
|
|
325
|
-
</div>
|
|
326
|
-
<div className="max-h-56 overflow-y-auto pb-1">
|
|
327
|
-
{otherScopedThreads.map((thread) =>
|
|
328
|
-
renderThreadRow(
|
|
329
|
-
thread,
|
|
330
|
-
activeThreadId,
|
|
331
|
-
openTabIds,
|
|
332
|
-
formatThreadTime,
|
|
333
|
-
onSelectThread,
|
|
334
|
-
() => setOpen(false),
|
|
335
|
-
),
|
|
336
|
-
)}
|
|
337
|
-
</div>
|
|
338
|
-
</div>
|
|
339
|
-
)}
|
|
340
|
-
<div className="border-t border-border p-1">
|
|
341
|
-
<button
|
|
342
|
-
type="button"
|
|
343
|
-
onClick={() => {
|
|
344
|
-
setOpen(false);
|
|
345
|
-
onDetach();
|
|
346
|
-
}}
|
|
347
|
-
className="flex w-full items-center gap-2 rounded px-2 py-1.5 text-xs text-foreground hover:bg-accent cursor-pointer"
|
|
348
|
-
>
|
|
349
|
-
<IconLinkOff size={13} />
|
|
350
|
-
<span>Remove context</span>
|
|
351
|
-
</button>
|
|
352
|
-
</div>
|
|
353
|
-
</PopoverContent>
|
|
354
|
-
</Popover>
|
|
355
|
-
</div>
|
|
356
|
-
);
|
|
357
|
-
}
|
|
358
|
-
|
|
359
|
-
/**
|
|
360
|
-
* Thin confirmation banner shown briefly after detach. The chip itself
|
|
361
|
-
* unmounts the moment scope clears on the active thread, so this banner
|
|
362
|
-
* holds the visual feedback long enough for the user to register what
|
|
363
|
-
* just happened and learn where the chat went (History popover).
|
|
364
|
-
*/
|
|
365
|
-
function DetachConfirmationBanner() {
|
|
366
|
-
return (
|
|
367
|
-
<div className="agent-scope-badge-wrapper relative z-[1] -mb-2 flex shrink-0 items-end justify-center px-3 pt-1 text-[11px] text-muted-foreground">
|
|
368
|
-
<span className="inline-flex h-7 min-w-0 max-w-full items-center gap-1.5 rounded-t-lg border border-b-0 border-input bg-background px-3 text-foreground shadow-[0_-8px_24px_hsl(var(--background)/0.72)] sm:max-w-80">
|
|
369
|
-
<IconCheck size={11} className="shrink-0 opacity-80" />
|
|
370
|
-
<span className="min-w-0 truncate">
|
|
371
|
-
Context removed. Find this chat in History.
|
|
372
|
-
</span>
|
|
373
|
-
</span>
|
|
374
|
-
</div>
|
|
375
|
-
);
|
|
376
|
-
}
|
|
377
|
-
|
|
378
226
|
// ─── History Popover ─────────────────────────────────────────────────────────
|
|
379
227
|
|
|
380
228
|
function formatThreadTime(ts: number): string {
|
|
@@ -389,58 +237,10 @@ function formatThreadTime(ts: number): string {
|
|
|
389
237
|
return d.toLocaleDateString([], { month: "short", day: "numeric" });
|
|
390
238
|
}
|
|
391
239
|
|
|
392
|
-
function renderThreadRow(
|
|
393
|
-
thread: ChatThreadSummary,
|
|
394
|
-
activeThreadId: string | null,
|
|
395
|
-
openTabIds: Set<string>,
|
|
396
|
-
formatTime: (ts: number) => string,
|
|
397
|
-
onSelect: (id: string) => void,
|
|
398
|
-
onClose: () => void,
|
|
399
|
-
) {
|
|
400
|
-
const isActive = thread.id === activeThreadId;
|
|
401
|
-
return (
|
|
402
|
-
<button
|
|
403
|
-
key={thread.id}
|
|
404
|
-
onClick={() => {
|
|
405
|
-
onSelect(thread.id);
|
|
406
|
-
onClose();
|
|
407
|
-
}}
|
|
408
|
-
className={cn(
|
|
409
|
-
"w-full px-3 py-2 text-start hover:bg-accent/50 cursor-pointer",
|
|
410
|
-
isActive && "bg-accent/30",
|
|
411
|
-
)}
|
|
412
|
-
>
|
|
413
|
-
<div className="flex items-baseline justify-between gap-2">
|
|
414
|
-
<span className="text-xs font-medium text-foreground truncate">
|
|
415
|
-
{thread.title || thread.preview || "Chat"}
|
|
416
|
-
</span>
|
|
417
|
-
<span className="text-[10px] text-muted-foreground shrink-0">
|
|
418
|
-
{isActive
|
|
419
|
-
? "Active"
|
|
420
|
-
: openTabIds.has(thread.id)
|
|
421
|
-
? "Open"
|
|
422
|
-
: formatTime(thread.updatedAt)}
|
|
423
|
-
</span>
|
|
424
|
-
</div>
|
|
425
|
-
{thread.preview && thread.title !== thread.preview && (
|
|
426
|
-
<div className="text-[11px] text-muted-foreground truncate mt-0.5">
|
|
427
|
-
{thread.preview}
|
|
428
|
-
</div>
|
|
429
|
-
)}
|
|
430
|
-
{thread.scope?.label && (
|
|
431
|
-
<div className="mt-0.5 text-[10px] text-muted-foreground/70 truncate">
|
|
432
|
-
{thread.scope.label}
|
|
433
|
-
</div>
|
|
434
|
-
)}
|
|
435
|
-
</button>
|
|
436
|
-
);
|
|
437
|
-
}
|
|
438
|
-
|
|
439
240
|
function HistoryPopover({
|
|
440
241
|
threads,
|
|
441
242
|
openTabIds,
|
|
442
243
|
activeThreadId,
|
|
443
|
-
currentScope,
|
|
444
244
|
hasMoreThreads = false,
|
|
445
245
|
isLoadingMoreThreads = false,
|
|
446
246
|
loadError,
|
|
@@ -454,7 +254,6 @@ function HistoryPopover({
|
|
|
454
254
|
threads: ChatThreadSummary[];
|
|
455
255
|
openTabIds: Set<string>;
|
|
456
256
|
activeThreadId: string | null;
|
|
457
|
-
currentScope?: ChatThreadScope | null;
|
|
458
257
|
hasMoreThreads?: boolean;
|
|
459
258
|
isLoadingMoreThreads?: boolean;
|
|
460
259
|
loadError?: string | null;
|
|
@@ -531,26 +330,6 @@ function HistoryPopover({
|
|
|
531
330
|
const pinnedThreads = filtered.filter((t) => t.pinnedAt != null);
|
|
532
331
|
const unpinnedThreads = filtered.filter((t) => t.pinnedAt == null);
|
|
533
332
|
|
|
534
|
-
// When scope is set we split (unpinned) history into two sections so the
|
|
535
|
-
// user can see "this deck's chats" first without losing access to general /
|
|
536
|
-
// other-deck chats. Section labels intentionally use the current
|
|
537
|
-
// resource type (deck/design/dashboard) instead of a generic phrase.
|
|
538
|
-
const sectionedThreads = currentScope
|
|
539
|
-
? {
|
|
540
|
-
scoped: unpinnedThreads.filter(
|
|
541
|
-
(t) =>
|
|
542
|
-
t.scope?.type === currentScope.type &&
|
|
543
|
-
t.scope?.id === currentScope.id,
|
|
544
|
-
),
|
|
545
|
-
other: unpinnedThreads.filter(
|
|
546
|
-
(t) =>
|
|
547
|
-
!t.scope ||
|
|
548
|
-
t.scope.type !== currentScope.type ||
|
|
549
|
-
t.scope.id !== currentScope.id,
|
|
550
|
-
),
|
|
551
|
-
}
|
|
552
|
-
: null;
|
|
553
|
-
|
|
554
333
|
const toHistoryItem = (thread: ChatThreadSummary): ChatHistoryItem => {
|
|
555
334
|
const isActive = thread.id === activeThreadId;
|
|
556
335
|
const title = thread.title || thread.preview || "Chat";
|
|
@@ -562,7 +341,6 @@ function HistoryPopover({
|
|
|
562
341
|
thread.preview && thread.title !== thread.preview
|
|
563
342
|
? thread.preview
|
|
564
343
|
: undefined,
|
|
565
|
-
detail: thread.scope?.label || undefined,
|
|
566
344
|
timestamp: isActive
|
|
567
345
|
? "Active"
|
|
568
346
|
: openTabIds.has(thread.id)
|
|
@@ -582,20 +360,7 @@ function HistoryPopover({
|
|
|
582
360
|
},
|
|
583
361
|
]
|
|
584
362
|
: []),
|
|
585
|
-
|
|
586
|
-
? [
|
|
587
|
-
{
|
|
588
|
-
id: "scoped",
|
|
589
|
-
label: `This ${currentScope!.type}`,
|
|
590
|
-
items: sectionedThreads.scoped.map(toHistoryItem),
|
|
591
|
-
},
|
|
592
|
-
{
|
|
593
|
-
id: "other",
|
|
594
|
-
label: "All chats",
|
|
595
|
-
items: sectionedThreads.other.map(toHistoryItem),
|
|
596
|
-
},
|
|
597
|
-
]
|
|
598
|
-
: [{ id: "all", items: unpinnedThreads.map(toHistoryItem) }]),
|
|
363
|
+
{ id: "all", items: unpinnedThreads.map(toHistoryItem) },
|
|
599
364
|
];
|
|
600
365
|
|
|
601
366
|
return (
|
|
@@ -954,15 +719,9 @@ export type MultiTabAssistantChatProps = Omit<
|
|
|
954
719
|
* route params such as `/chat/:threadId`.
|
|
955
720
|
*/
|
|
956
721
|
threadUrlSync?: boolean | ChatThreadUrlSyncOptions;
|
|
957
|
-
/**
|
|
958
|
-
* Bind new chats to a resource (deck, design, dashboard, etc.). When set,
|
|
959
|
-
* new chats automatically inherit this scope and scoped chats tuck away when
|
|
960
|
-
* the user leaves the resource. General chats remain visible across resource
|
|
961
|
-
* navigation, and the user can detach a scoped chat via the scope chip above
|
|
962
|
-
* the composer.
|
|
963
|
-
*/
|
|
722
|
+
/** Ambient resource context to show as a composer chip. */
|
|
964
723
|
scope?: ChatThreadScope | null;
|
|
965
|
-
/**
|
|
724
|
+
/** @deprecated Scope context is now rendered in the composer. */
|
|
966
725
|
showScopeBadge?: boolean;
|
|
967
726
|
};
|
|
968
727
|
|
|
@@ -977,7 +736,6 @@ export function MultiTabAssistantChat({
|
|
|
977
736
|
browserTabId,
|
|
978
737
|
threadUrlSync = false,
|
|
979
738
|
scope = null,
|
|
980
|
-
showScopeBadge = true,
|
|
981
739
|
...props
|
|
982
740
|
}: MultiTabAssistantChatProps) {
|
|
983
741
|
const {
|
|
@@ -1084,7 +842,6 @@ export function MultiTabAssistantChat({
|
|
|
1084
842
|
isLoading,
|
|
1085
843
|
createThread,
|
|
1086
844
|
switchThread: switchThreadState,
|
|
1087
|
-
detachThread,
|
|
1088
845
|
forkThread,
|
|
1089
846
|
saveThreadData,
|
|
1090
847
|
generateTitle,
|
|
@@ -1097,7 +854,7 @@ export function MultiTabAssistantChat({
|
|
|
1097
854
|
isNewThread,
|
|
1098
855
|
pinThread,
|
|
1099
856
|
renameThread,
|
|
1100
|
-
} = useChatThreads(apiUrl, storageKey,
|
|
857
|
+
} = useChatThreads(apiUrl, storageKey, null, {
|
|
1101
858
|
restoreActiveThread,
|
|
1102
859
|
routeThreadId: threadUrlSyncEnabled ? urlThreadId : undefined,
|
|
1103
860
|
});
|
|
@@ -1370,11 +1127,7 @@ export function MultiTabAssistantChat({
|
|
|
1370
1127
|
}, [subAgentNames, SUB_AGENT_NAMES_KEY]);
|
|
1371
1128
|
|
|
1372
1129
|
// Open tabs — persisted to localStorage so they survive refresh.
|
|
1373
|
-
|
|
1374
|
-
// B), the tab bar reflects whichever tabs they had open for *that*
|
|
1375
|
-
// resource. We do not bleed deck A's tabs into deck B's view.
|
|
1376
|
-
const scopeKeyPart = scope ? `:scope:${scope.type}:${scope.id}` : "";
|
|
1377
|
-
const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}${scopeKeyPart}`;
|
|
1130
|
+
const OPEN_TABS_KEY = `agent-chat-open-tabs${keyPrefix}`;
|
|
1378
1131
|
const [openTabIds, setOpenTabIds] = useState<string[]>(() => {
|
|
1379
1132
|
if (!restoreActiveThread && activeThreadId) {
|
|
1380
1133
|
for (const id of [activeThreadId]) mountedTabsRef.current.add(id);
|
|
@@ -1397,87 +1150,50 @@ export function MultiTabAssistantChat({
|
|
|
1397
1150
|
openTabIdsRef.current = openTabIds;
|
|
1398
1151
|
const initializedRef = useRef(false);
|
|
1399
1152
|
|
|
1400
|
-
// Rehydrate open tabs when the scope flips. Mirrors `persistedKeyRef` in
|
|
1401
|
-
// `useChatThreads`: on a scope change we need to read the new key BEFORE
|
|
1402
|
-
// the persistence effect writes the current (now-wrong) tab list under
|
|
1403
|
-
// that new key.
|
|
1404
1153
|
const openTabsKeyRef = useRef(OPEN_TABS_KEY);
|
|
1154
|
+
|
|
1405
1155
|
useEffect(() => {
|
|
1406
|
-
|
|
1407
|
-
|
|
1408
|
-
|
|
1409
|
-
|
|
1410
|
-
|
|
1411
|
-
|
|
1412
|
-
|
|
1413
|
-
|
|
1414
|
-
|
|
1415
|
-
|
|
1416
|
-
|
|
1417
|
-
|
|
1418
|
-
|
|
1419
|
-
|
|
1420
|
-
|
|
1421
|
-
|
|
1422
|
-
|
|
1423
|
-
|
|
1424
|
-
|
|
1425
|
-
|
|
1426
|
-
|
|
1427
|
-
|
|
1428
|
-
|
|
1429
|
-
|
|
1430
|
-
|
|
1431
|
-
|
|
1432
|
-
|
|
1433
|
-
|
|
1434
|
-
|
|
1435
|
-
|
|
1436
|
-
|
|
1437
|
-
const stored = t?.scope ?? null;
|
|
1438
|
-
if (!stored) return null;
|
|
1439
|
-
if (scope && stored.type === scope.type && stored.id === scope.id) {
|
|
1440
|
-
return { ...stored, label: scope.label || stored.label };
|
|
1156
|
+
const nextScope = scope;
|
|
1157
|
+
if (!nextScope) return;
|
|
1158
|
+
const type = formatScopeType(nextScope.type);
|
|
1159
|
+
const title =
|
|
1160
|
+
nextScope.label?.trim() ||
|
|
1161
|
+
type.replace(/^./, (character) => character.toUpperCase());
|
|
1162
|
+
const key = nextScope.contextKey || "agent-current-resource-context";
|
|
1163
|
+
const marker = `Resource context: ${nextScope.type}:${nextScope.id}`;
|
|
1164
|
+
const existing = getAgentChatContextState().items.find(
|
|
1165
|
+
(item) => item.key === key,
|
|
1166
|
+
);
|
|
1167
|
+
let ownsContextItem = false;
|
|
1168
|
+
if (!existing || existing.context.startsWith(marker)) {
|
|
1169
|
+
setAgentChatContextItem({
|
|
1170
|
+
key,
|
|
1171
|
+
title,
|
|
1172
|
+
context: [
|
|
1173
|
+
marker,
|
|
1174
|
+
`The user is currently viewing this ${type}.`,
|
|
1175
|
+
nextScope.label ? `Resource name: ${nextScope.label}` : "",
|
|
1176
|
+
`Resource id: ${nextScope.id}`,
|
|
1177
|
+
typeof window !== "undefined"
|
|
1178
|
+
? `Current URL: ${window.location.pathname}${window.location.search}`
|
|
1179
|
+
: "",
|
|
1180
|
+
]
|
|
1181
|
+
.filter(Boolean)
|
|
1182
|
+
.join("\n"),
|
|
1183
|
+
openSidebar: false,
|
|
1184
|
+
focus: false,
|
|
1185
|
+
});
|
|
1186
|
+
ownsContextItem = true;
|
|
1441
1187
|
}
|
|
1442
|
-
return stored;
|
|
1443
|
-
}, [threads, activeThreadId, scope?.type, scope?.id, scope?.label]);
|
|
1444
|
-
|
|
1445
|
-
// Brief confirmation banner shown after detach. The chip itself disappears
|
|
1446
|
-
// the instant scope clears, which the user described as "nothing different
|
|
1447
|
-
// happened." We hold the confirmation in the same slot for ~2s so the
|
|
1448
|
-
// detach is visually acknowledged and the user is pointed at History.
|
|
1449
|
-
const [detachConfirmType, setDetachConfirmType] = useState<string | null>(
|
|
1450
|
-
null,
|
|
1451
|
-
);
|
|
1452
|
-
const detachTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);
|
|
1453
|
-
useEffect(() => {
|
|
1454
1188
|
return () => {
|
|
1455
|
-
|
|
1189
|
+
const current = getAgentChatContextState().items.find(
|
|
1190
|
+
(item) => item.key === key,
|
|
1191
|
+
);
|
|
1192
|
+
if (ownsContextItem && current?.context.startsWith(marker)) {
|
|
1193
|
+
removeAgentChatContextItem(key);
|
|
1194
|
+
}
|
|
1456
1195
|
};
|
|
1457
|
-
}, []);
|
|
1458
|
-
const handleDetachActiveThread = useCallback(() => {
|
|
1459
|
-
if (!activeThreadId || !activeThreadScope) return;
|
|
1460
|
-
const type = activeThreadScope.type;
|
|
1461
|
-
setDetachConfirmType(type);
|
|
1462
|
-
if (detachTimerRef.current) clearTimeout(detachTimerRef.current);
|
|
1463
|
-
detachTimerRef.current = setTimeout(() => setDetachConfirmType(null), 2200);
|
|
1464
|
-
detachThread(activeThreadId);
|
|
1465
|
-
}, [activeThreadId, activeThreadScope, detachThread]);
|
|
1466
|
-
|
|
1467
|
-
// Other chats scoped to the active thread's resource (excluding the active
|
|
1468
|
-
// thread itself). Sorted most-recent-first to match user expectation in the
|
|
1469
|
-
// chip popover and empty-state addon.
|
|
1470
|
-
const otherScopedThreads = useMemo<ChatThreadSummary[]>(() => {
|
|
1471
|
-
if (!activeThreadScope) return [];
|
|
1472
|
-
return threads
|
|
1473
|
-
.filter(
|
|
1474
|
-
(t) =>
|
|
1475
|
-
t.id !== activeThreadId &&
|
|
1476
|
-
t.scope?.type === activeThreadScope.type &&
|
|
1477
|
-
t.scope?.id === activeThreadScope.id,
|
|
1478
|
-
)
|
|
1479
|
-
.sort((a, b) => b.updatedAt - a.updatedAt);
|
|
1480
|
-
}, [threads, activeThreadId, activeThreadScope]);
|
|
1196
|
+
}, [scope?.contextKey, scope?.id, scope?.label, scope?.type]);
|
|
1481
1197
|
|
|
1482
1198
|
// Persist open tab IDs to localStorage (exclude sub-agent tabs — they're session-only)
|
|
1483
1199
|
useEffect(() => {
|
|
@@ -1555,9 +1271,8 @@ export function MultiTabAssistantChat({
|
|
|
1555
1271
|
// Use functional update to check inside the setter — avoids race with the
|
|
1556
1272
|
// initialization effect that may have already added the ID in the same batch.
|
|
1557
1273
|
//
|
|
1558
|
-
//
|
|
1559
|
-
//
|
|
1560
|
-
// sidebar cannot end up with a live active thread but no mounted chat.
|
|
1274
|
+
// Re-check after tab-list resets so the sidebar cannot end up with a live
|
|
1275
|
+
// active thread but no mounted chat.
|
|
1561
1276
|
useEffect(() => {
|
|
1562
1277
|
if (!activeThreadId || openTabIds.includes(activeThreadId)) return;
|
|
1563
1278
|
if (parentMap[activeThreadId]) return;
|
|
@@ -2711,7 +2426,6 @@ export function MultiTabAssistantChat({
|
|
|
2711
2426
|
threads={threads}
|
|
2712
2427
|
openTabIds={new Set(openTabIds)}
|
|
2713
2428
|
activeThreadId={activeThreadId}
|
|
2714
|
-
currentScope={scope}
|
|
2715
2429
|
hasMoreThreads={hasMoreThreads}
|
|
2716
2430
|
isLoadingMoreThreads={isLoadingMoreThreads}
|
|
2717
2431
|
loadError={threadsLoadError}
|
|
@@ -2737,37 +2451,10 @@ export function MultiTabAssistantChat({
|
|
|
2737
2451
|
)
|
|
2738
2452
|
.map((tabId) => {
|
|
2739
2453
|
const modelSelection = resolveThreadModelSelection(tabId);
|
|
2740
|
-
const tabThread = threads.find((thread) => thread.id === tabId);
|
|
2741
|
-
const tabScope =
|
|
2742
|
-
tabThread?.scope ??
|
|
2743
|
-
(tabId === activeThreadId ? activeThreadScope : null);
|
|
2744
2454
|
const tabDynamicSuggestions =
|
|
2745
2455
|
tabId === activeThreadId && !contentHidden
|
|
2746
2456
|
? props.dynamicSuggestions
|
|
2747
2457
|
: false;
|
|
2748
|
-
const scopeComposerSlot =
|
|
2749
|
-
showScopeBadge && tabId === activeThreadId && !contentHidden ? (
|
|
2750
|
-
tabScope && activeThreadId ? (
|
|
2751
|
-
<ScopeBadge
|
|
2752
|
-
scope={tabScope}
|
|
2753
|
-
currentScope={scope}
|
|
2754
|
-
onDetach={handleDetachActiveThread}
|
|
2755
|
-
otherScopedThreads={otherScopedThreads}
|
|
2756
|
-
activeThreadId={activeThreadId}
|
|
2757
|
-
openTabIds={new Set(openTabIds)}
|
|
2758
|
-
onSelectThread={openFromHistory}
|
|
2759
|
-
/>
|
|
2760
|
-
) : detachConfirmType ? (
|
|
2761
|
-
<DetachConfirmationBanner />
|
|
2762
|
-
) : null
|
|
2763
|
-
) : null;
|
|
2764
|
-
const composerSlot =
|
|
2765
|
-
scopeComposerSlot || props.composerSlot ? (
|
|
2766
|
-
<>
|
|
2767
|
-
{props.composerSlot}
|
|
2768
|
-
{scopeComposerSlot}
|
|
2769
|
-
</>
|
|
2770
|
-
) : undefined;
|
|
2771
2458
|
return (
|
|
2772
2459
|
<div
|
|
2773
2460
|
key={tabId}
|
|
@@ -2802,11 +2489,6 @@ export function MultiTabAssistantChat({
|
|
|
2802
2489
|
<AssistantChat
|
|
2803
2490
|
{...props}
|
|
2804
2491
|
dynamicSuggestions={tabDynamicSuggestions}
|
|
2805
|
-
emptyStateText={
|
|
2806
|
-
tabScope?.label && tabId === activeThreadId
|
|
2807
|
-
? `Ask about ${tabScope.label}`
|
|
2808
|
-
: props.emptyStateText
|
|
2809
|
-
}
|
|
2810
2492
|
ref={(handle) => {
|
|
2811
2493
|
if (handle) {
|
|
2812
2494
|
chatRefs.current.set(tabId, handle);
|
|
@@ -2817,7 +2499,6 @@ export function MultiTabAssistantChat({
|
|
|
2817
2499
|
threadId={tabId}
|
|
2818
2500
|
tabId={tabId}
|
|
2819
2501
|
browserTabId={browserTabId}
|
|
2820
|
-
contextScope={tabScope}
|
|
2821
2502
|
isActiveComposer={tabId === activeThreadId}
|
|
2822
2503
|
apiUrl={apiUrl}
|
|
2823
2504
|
isNewThread={
|
|
@@ -2838,7 +2519,7 @@ export function MultiTabAssistantChat({
|
|
|
2838
2519
|
selectedEffort={
|
|
2839
2520
|
modelSelection?.effort ?? DEFAULT_REASONING_EFFORT
|
|
2840
2521
|
}
|
|
2841
|
-
composerSlot={composerSlot}
|
|
2522
|
+
composerSlot={props.composerSlot}
|
|
2842
2523
|
defaultModel={defaultModel}
|
|
2843
2524
|
availableModels={availableModels}
|
|
2844
2525
|
onModelChange={handleModelChange}
|
|
@@ -529,6 +529,7 @@ function messageTextForHistory(message: {
|
|
|
529
529
|
}
|
|
530
530
|
|
|
531
531
|
type AdapterMessage = {
|
|
532
|
+
id?: string;
|
|
532
533
|
role: string;
|
|
533
534
|
content: readonly { type: string; text?: string }[];
|
|
534
535
|
attachments?: readonly AssistantUiAttachment[];
|
|
@@ -1486,6 +1487,9 @@ export function createAgentChatAdapter(
|
|
|
1486
1487
|
const browserTabId = options?.browserTabId;
|
|
1487
1488
|
const scopeRef = options?.scopeRef;
|
|
1488
1489
|
const surface = options?.surface ?? "app";
|
|
1490
|
+
// A queued recovery can survive until a server-owned continuation finishes,
|
|
1491
|
+
// and assistant-ui may ask the same memoized adapter to run that item again.
|
|
1492
|
+
const claimedRecoveryMessageIds = new Set<string>();
|
|
1489
1493
|
let runtimeDebugDetails = "";
|
|
1490
1494
|
const runtimeDebugUrl = runtimeDebugUrlForApiUrl(apiUrl);
|
|
1491
1495
|
if (runtimeDebugUrl && typeof fetch === "function") {
|
|
@@ -1512,6 +1516,14 @@ export function createAgentChatAdapter(
|
|
|
1512
1516
|
const latestUserIsRecovery = latestUserMsg
|
|
1513
1517
|
? isRecoveryUserMessage(latestUserMsg)
|
|
1514
1518
|
: false;
|
|
1519
|
+
const recoveryMessageId =
|
|
1520
|
+
latestUserIsRecovery && latestUserMsg?.id?.trim()
|
|
1521
|
+
? latestUserMsg.id.trim()
|
|
1522
|
+
: null;
|
|
1523
|
+
if (recoveryMessageId) {
|
|
1524
|
+
if (claimedRecoveryMessageIds.has(recoveryMessageId)) return;
|
|
1525
|
+
claimedRecoveryMessageIds.add(recoveryMessageId);
|
|
1526
|
+
}
|
|
1515
1527
|
const lastUserMsg =
|
|
1516
1528
|
latestUserIsRecovery && latestUserIndex >= 0
|
|
1517
1529
|
? (latestUserMessage(adapterMessages, {
|
|
@@ -1638,7 +1650,7 @@ export function createAgentChatAdapter(
|
|
|
1638
1650
|
structuredHistory;
|
|
1639
1651
|
let includeAttachments = attachments.length > 0;
|
|
1640
1652
|
let includeReferences = Boolean(runConfig?.custom?.references);
|
|
1641
|
-
let internalContinuationRequest =
|
|
1653
|
+
let internalContinuationRequest = latestUserIsRecovery;
|
|
1642
1654
|
let startupRecoveryAttempts = 0;
|
|
1643
1655
|
let queuedConflictRetries = 0;
|
|
1644
1656
|
let staleRunContinuationAttempts = 0;
|