@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
|
@@ -220,7 +220,7 @@ type AgentPanelStyle = React.CSSProperties & {
|
|
|
220
220
|
"--agent-sidebar-width"?: string;
|
|
221
221
|
};
|
|
222
222
|
const AGENT_PANEL_HEADER_CLASS =
|
|
223
|
-
"agent-native-shell-topbar relative z-[240] flex h-12 shrink-0 items-center justify-between gap-2
|
|
223
|
+
"agent-native-shell-topbar relative z-[240] flex h-12 shrink-0 items-center justify-between gap-2";
|
|
224
224
|
const AGENT_PANEL_HEADER_STYLE = {
|
|
225
225
|
paddingLeft: 8,
|
|
226
226
|
paddingRight: 8,
|
|
@@ -422,6 +422,12 @@ export function shouldShowAgentPanelChatTabBar(
|
|
|
422
422
|
return mainTabs.length > 1 || hasSubTabs;
|
|
423
423
|
}
|
|
424
424
|
|
|
425
|
+
export function shouldShowAgentPanelSidebarChatTabs(
|
|
426
|
+
tabs: MultiTabAssistantChatHeaderProps["tabs"],
|
|
427
|
+
) {
|
|
428
|
+
return tabs.filter((tab) => !tab.parentThreadId).length > 1;
|
|
429
|
+
}
|
|
430
|
+
|
|
425
431
|
export function shouldShowAgentPanelPageNewChatButton(
|
|
426
432
|
tabs: MultiTabAssistantChatHeaderProps["tabs"],
|
|
427
433
|
activeTabId: string,
|
|
@@ -588,16 +594,9 @@ export interface AgentPanelProps extends Omit<
|
|
|
588
594
|
storageKey?: string;
|
|
589
595
|
/** Restore the previously active chat thread on mount. Default: true. */
|
|
590
596
|
restoreActiveThread?: boolean;
|
|
591
|
-
/**
|
|
592
|
-
* Bind the chat to a specific resource (deck, design, dashboard, ...).
|
|
593
|
-
* When set, chats started inside the panel inherit this scope and tuck
|
|
594
|
-
* away when the user leaves that resource. General chats stay visible
|
|
595
|
-
* across resource navigation. Scoped chats get a context badge with a
|
|
596
|
-
* Detach escape hatch. Templates compute this from the current route —
|
|
597
|
-
* see the `Layout` files for each template.
|
|
598
|
-
*/
|
|
597
|
+
/** Ambient resource context rendered as a composer chip. */
|
|
599
598
|
scope?: import("./use-chat-threads.js").ChatThreadScope | null;
|
|
600
|
-
/**
|
|
599
|
+
/** @deprecated Scope context now appears inside the composer. */
|
|
601
600
|
showScopeBadge?: MultiTabAssistantChatProps["showScopeBadge"];
|
|
602
601
|
/** Stable browser tab id used for tab-scoped app-state context. */
|
|
603
602
|
browserTabId?: string;
|
|
@@ -1230,7 +1229,7 @@ function AgentPanelInner({
|
|
|
1230
1229
|
/>
|
|
1231
1230
|
}
|
|
1232
1231
|
/>
|
|
1233
|
-
{
|
|
1232
|
+
{mode === "chat" && (
|
|
1234
1233
|
<IconTooltip content={t("agentPanel.newChat")}>
|
|
1235
1234
|
<button
|
|
1236
1235
|
onClick={addTab}
|
|
@@ -1567,147 +1566,289 @@ function AgentPanelInner({
|
|
|
1567
1566
|
closeAllTabs,
|
|
1568
1567
|
showHistory,
|
|
1569
1568
|
toggleHistory,
|
|
1570
|
-
}: MultiTabAssistantChatHeaderProps) =>
|
|
1571
|
-
|
|
1572
|
-
|
|
1573
|
-
|
|
1574
|
-
|
|
1575
|
-
|
|
1576
|
-
|
|
1577
|
-
|
|
1578
|
-
|
|
1569
|
+
}: MultiTabAssistantChatHeaderProps) => {
|
|
1570
|
+
const { activeTab, childTabs, focusParentId, hasSubTabs, mainTabs } =
|
|
1571
|
+
getAgentPanelChatTabGroups(tabs, activeTabId);
|
|
1572
|
+
const showSidebarChatTabs =
|
|
1573
|
+
Boolean(onCollapse) &&
|
|
1574
|
+
mode === "chat" &&
|
|
1575
|
+
shouldShowAgentPanelSidebarChatTabs(tabs);
|
|
1576
|
+
|
|
1577
|
+
return (
|
|
1579
1578
|
<div
|
|
1580
|
-
className=
|
|
1581
|
-
|
|
1579
|
+
className="agent-sidebar-chat-header flex flex-col shrink-0"
|
|
1580
|
+
data-agent-sidebar-chat-header={onCollapse ? "" : undefined}
|
|
1581
|
+
data-agent-sidebar-chat-header-active={
|
|
1582
|
+
headerMenuOpen || feedbackOpen ? "" : undefined
|
|
1583
|
+
}
|
|
1582
1584
|
>
|
|
1583
|
-
|
|
1584
|
-
|
|
1585
|
-
|
|
1586
|
-
|
|
1587
|
-
|
|
1588
|
-
|
|
1589
|
-
{
|
|
1590
|
-
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
1599
|
-
|
|
1600
|
-
|
|
1601
|
-
|
|
1585
|
+
{/* Top bar: chat tabs/mode buttons + actions */}
|
|
1586
|
+
<div
|
|
1587
|
+
className={cn(
|
|
1588
|
+
AGENT_PANEL_HEADER_CLASS,
|
|
1589
|
+
!onCollapse && "border-b border-border",
|
|
1590
|
+
)}
|
|
1591
|
+
style={AGENT_PANEL_HEADER_STYLE}
|
|
1592
|
+
>
|
|
1593
|
+
<div className="flex min-w-0 flex-1 items-center gap-1 overflow-hidden">
|
|
1594
|
+
{showSidebarChatTabs ? (
|
|
1595
|
+
<div className="agent-tabs-scroll flex min-w-0 flex-1 items-center gap-0.5 overflow-x-auto">
|
|
1596
|
+
{mainTabs.map((tab) => {
|
|
1597
|
+
const isActive =
|
|
1598
|
+
tab.id === activeTabId ||
|
|
1599
|
+
(tab.id === focusParentId &&
|
|
1600
|
+
activeTab?.parentThreadId === tab.id);
|
|
1601
|
+
return (
|
|
1602
|
+
<div
|
|
1603
|
+
key={tab.id}
|
|
1604
|
+
role="button"
|
|
1605
|
+
tabIndex={0}
|
|
1606
|
+
ref={isActive ? activeTabRefCb : undefined}
|
|
1607
|
+
onClick={() => setActiveTabId(tab.id)}
|
|
1608
|
+
onKeyDown={activateOnKeyDown(() =>
|
|
1609
|
+
setActiveTabId(tab.id),
|
|
1610
|
+
)}
|
|
1611
|
+
className={cn(
|
|
1612
|
+
"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]",
|
|
1613
|
+
isActive
|
|
1614
|
+
? "bg-accent text-foreground"
|
|
1615
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
1616
|
+
)}
|
|
1617
|
+
>
|
|
1618
|
+
<span className="truncate pe-1">{tab.label}</span>
|
|
1619
|
+
{tab.status === "running" && (
|
|
1620
|
+
<span className="h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
|
|
1621
|
+
)}
|
|
1622
|
+
<button
|
|
1623
|
+
type="button"
|
|
1624
|
+
aria-label="Close tab"
|
|
1625
|
+
onClick={(e) => {
|
|
1626
|
+
e.stopPropagation();
|
|
1627
|
+
closeTab(tab.id);
|
|
1628
|
+
}}
|
|
1629
|
+
className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
|
|
1630
|
+
style={{
|
|
1631
|
+
position: "absolute",
|
|
1632
|
+
right: 0,
|
|
1633
|
+
top: 0,
|
|
1634
|
+
bottom: 0,
|
|
1635
|
+
width: 28,
|
|
1636
|
+
paddingRight: 6,
|
|
1637
|
+
borderRadius: "0 6px 6px 0",
|
|
1638
|
+
background:
|
|
1639
|
+
"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
1640
|
+
}}
|
|
1641
|
+
>
|
|
1642
|
+
<IconX size={10} />
|
|
1643
|
+
</button>
|
|
1644
|
+
</div>
|
|
1645
|
+
);
|
|
1646
|
+
})}
|
|
1647
|
+
</div>
|
|
1648
|
+
) : shouldShowAgentPanelModeButtons(Boolean(onCollapse)) ? (
|
|
1649
|
+
renderModeButtons(mode)
|
|
1650
|
+
) : null}
|
|
1651
|
+
</div>
|
|
1652
|
+
<div className="flex items-center gap-0.5">
|
|
1653
|
+
{renderHeaderActions({
|
|
1654
|
+
activeChatSessionId: activeTabId,
|
|
1655
|
+
activeTabId,
|
|
1656
|
+
activeTabMessageCount,
|
|
1657
|
+
addTab,
|
|
1658
|
+
clearActiveTab,
|
|
1659
|
+
closeAllTabs,
|
|
1660
|
+
closeOtherTabs,
|
|
1661
|
+
closeTab,
|
|
1662
|
+
showHistory,
|
|
1663
|
+
tabs,
|
|
1664
|
+
toggleHistory,
|
|
1665
|
+
})}
|
|
1666
|
+
</div>
|
|
1602
1667
|
</div>
|
|
1603
|
-
|
|
1604
|
-
|
|
1605
|
-
|
|
1606
|
-
|
|
1607
|
-
|
|
1608
|
-
|
|
1609
|
-
|
|
1610
|
-
|
|
1611
|
-
|
|
1612
|
-
|
|
1613
|
-
|
|
1614
|
-
|
|
1615
|
-
|
|
1616
|
-
|
|
1617
|
-
|
|
1618
|
-
|
|
1619
|
-
|
|
1620
|
-
|
|
1621
|
-
|
|
1622
|
-
|
|
1623
|
-
|
|
1624
|
-
|
|
1625
|
-
|
|
1626
|
-
|
|
1627
|
-
|
|
1628
|
-
|
|
1629
|
-
|
|
1630
|
-
|
|
1631
|
-
|
|
1632
|
-
|
|
1633
|
-
|
|
1634
|
-
|
|
1635
|
-
|
|
1636
|
-
|
|
1637
|
-
|
|
1638
|
-
|
|
1639
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
1649
|
-
|
|
1650
|
-
|
|
1651
|
-
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
1663
|
-
|
|
1664
|
-
|
|
1665
|
-
|
|
1666
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
1670
|
-
|
|
1671
|
-
|
|
1672
|
-
|
|
1673
|
-
|
|
1674
|
-
|
|
1675
|
-
|
|
1676
|
-
|
|
1677
|
-
|
|
1678
|
-
|
|
1668
|
+
{mode === "chat" && chatNotice ? (
|
|
1669
|
+
<div className="border-b border-border">{chatNotice}</div>
|
|
1670
|
+
) : null}
|
|
1671
|
+
{/* Tab bar: only visible when there is actually more than one tab to switch between. */}
|
|
1672
|
+
{showTabBar &&
|
|
1673
|
+
(mode === "chat" || (mode === "cli" && canUseCodeTools)) &&
|
|
1674
|
+
(() => {
|
|
1675
|
+
const showChatTabBar =
|
|
1676
|
+
mode === "chat" &&
|
|
1677
|
+
shouldShowAgentPanelChatTabBar(tabs, activeTabId);
|
|
1678
|
+
const showCliTabBar =
|
|
1679
|
+
mode === "cli" &&
|
|
1680
|
+
canUseCodeTools &&
|
|
1681
|
+
shouldShowAgentPanelCliTabBar(cliTabs);
|
|
1682
|
+
|
|
1683
|
+
if (!showChatTabBar && !showCliTabBar) return null;
|
|
1684
|
+
|
|
1685
|
+
return (
|
|
1686
|
+
<>
|
|
1687
|
+
{!showSidebarChatTabs && (
|
|
1688
|
+
<div className="flex items-center px-2 py-1 border-b border-border gap-0.5">
|
|
1689
|
+
<div className="agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1">
|
|
1690
|
+
{mode === "chat"
|
|
1691
|
+
? mainTabs.map((tab) => {
|
|
1692
|
+
// Highlight the parent tab if a child is active
|
|
1693
|
+
const isActive =
|
|
1694
|
+
tab.id === activeTabId ||
|
|
1695
|
+
(tab.id === focusParentId &&
|
|
1696
|
+
activeTab?.parentThreadId === tab.id);
|
|
1697
|
+
return (
|
|
1698
|
+
<div
|
|
1699
|
+
key={tab.id}
|
|
1700
|
+
role="button"
|
|
1701
|
+
tabIndex={0}
|
|
1702
|
+
ref={isActive ? activeTabRefCb : undefined}
|
|
1703
|
+
onClick={() => setActiveTabId(tab.id)}
|
|
1704
|
+
onKeyDown={activateOnKeyDown(() =>
|
|
1705
|
+
setActiveTabId(tab.id),
|
|
1706
|
+
)}
|
|
1707
|
+
className={cn(
|
|
1708
|
+
"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer max-w-[150px]",
|
|
1709
|
+
isActive
|
|
1710
|
+
? "bg-accent text-foreground"
|
|
1711
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
1712
|
+
)}
|
|
1713
|
+
>
|
|
1714
|
+
<span className="truncate pe-1">
|
|
1715
|
+
{tab.label}
|
|
1716
|
+
</span>
|
|
1717
|
+
{tab.status === "running" && (
|
|
1718
|
+
<span className="h-1.5 w-1.5 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
|
|
1719
|
+
)}
|
|
1720
|
+
<button
|
|
1721
|
+
type="button"
|
|
1722
|
+
aria-label="Close tab"
|
|
1723
|
+
onClick={(e) => {
|
|
1724
|
+
e.stopPropagation();
|
|
1725
|
+
closeTab(tab.id);
|
|
1726
|
+
}}
|
|
1727
|
+
className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
|
|
1728
|
+
style={{
|
|
1729
|
+
position: "absolute",
|
|
1730
|
+
right: 0,
|
|
1731
|
+
top: 0,
|
|
1732
|
+
bottom: 0,
|
|
1733
|
+
width: 28,
|
|
1734
|
+
paddingRight: 6,
|
|
1735
|
+
borderRadius: "0 6px 6px 0",
|
|
1736
|
+
background:
|
|
1737
|
+
"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
1738
|
+
}}
|
|
1739
|
+
>
|
|
1740
|
+
<IconX size={10} />
|
|
1741
|
+
</button>
|
|
1742
|
+
</div>
|
|
1743
|
+
);
|
|
1744
|
+
})
|
|
1745
|
+
: cliTabs.map((id, i) => (
|
|
1746
|
+
<div
|
|
1747
|
+
key={id}
|
|
1748
|
+
role="button"
|
|
1749
|
+
tabIndex={0}
|
|
1750
|
+
ref={
|
|
1751
|
+
id === activeCliTab
|
|
1752
|
+
? activeTabRefCb
|
|
1753
|
+
: undefined
|
|
1754
|
+
}
|
|
1755
|
+
onClick={() => setActiveCliTab(id)}
|
|
1756
|
+
onKeyDown={activateOnKeyDown(() =>
|
|
1757
|
+
setActiveCliTab(id),
|
|
1758
|
+
)}
|
|
1759
|
+
className={cn(
|
|
1760
|
+
"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2.5 py-1.5 text-[11px] font-medium cursor-pointer",
|
|
1761
|
+
id === activeCliTab
|
|
1762
|
+
? "bg-accent text-foreground"
|
|
1763
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
1764
|
+
)}
|
|
1679
1765
|
>
|
|
1680
|
-
<
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
|
|
1685
|
-
|
|
1766
|
+
<span>Terminal {i + 1}</span>
|
|
1767
|
+
<button
|
|
1768
|
+
type="button"
|
|
1769
|
+
aria-label="Close tab"
|
|
1770
|
+
onClick={(e) => {
|
|
1771
|
+
e.stopPropagation();
|
|
1772
|
+
closeCliTab(id);
|
|
1773
|
+
}}
|
|
1774
|
+
className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
|
|
1775
|
+
style={{
|
|
1776
|
+
position: "absolute",
|
|
1777
|
+
right: 0,
|
|
1778
|
+
top: 0,
|
|
1779
|
+
bottom: 0,
|
|
1780
|
+
width: 28,
|
|
1781
|
+
paddingRight: 6,
|
|
1782
|
+
borderRadius: "0 6px 6px 0",
|
|
1783
|
+
background:
|
|
1784
|
+
"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
1785
|
+
}}
|
|
1786
|
+
>
|
|
1787
|
+
<IconX size={10} />
|
|
1788
|
+
</button>
|
|
1789
|
+
</div>
|
|
1790
|
+
))}
|
|
1791
|
+
</div>
|
|
1792
|
+
</div>
|
|
1793
|
+
)}
|
|
1794
|
+
{/* Sub-agent tab row — shown when the active context has children */}
|
|
1795
|
+
{mode === "chat" && hasSubTabs && (
|
|
1796
|
+
<div
|
|
1797
|
+
className={cn(
|
|
1798
|
+
"flex items-center px-2 py-0.5 gap-0.5 bg-muted/30",
|
|
1799
|
+
!showSidebarChatTabs && "border-b border-border",
|
|
1800
|
+
)}
|
|
1801
|
+
>
|
|
1802
|
+
<div className="agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1">
|
|
1803
|
+
<div
|
|
1804
|
+
role="button"
|
|
1805
|
+
tabIndex={0}
|
|
1806
|
+
onClick={() => setActiveTabId(focusParentId)}
|
|
1807
|
+
onKeyDown={activateOnKeyDown(() =>
|
|
1808
|
+
setActiveTabId(focusParentId),
|
|
1809
|
+
)}
|
|
1810
|
+
className={cn(
|
|
1811
|
+
"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer",
|
|
1812
|
+
activeTabId === focusParentId
|
|
1813
|
+
? "bg-accent text-foreground"
|
|
1814
|
+
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
1815
|
+
)}
|
|
1816
|
+
>
|
|
1817
|
+
Main
|
|
1818
|
+
</div>
|
|
1819
|
+
{childTabs.map((tab) => (
|
|
1686
1820
|
<div
|
|
1687
|
-
key={id}
|
|
1821
|
+
key={tab.id}
|
|
1688
1822
|
role="button"
|
|
1689
1823
|
tabIndex={0}
|
|
1690
1824
|
ref={
|
|
1691
|
-
id ===
|
|
1825
|
+
tab.id === activeTabId
|
|
1826
|
+
? activeTabRefCb
|
|
1827
|
+
: undefined
|
|
1692
1828
|
}
|
|
1693
|
-
onClick={() =>
|
|
1829
|
+
onClick={() => setActiveTabId(tab.id)}
|
|
1694
1830
|
onKeyDown={activateOnKeyDown(() =>
|
|
1695
|
-
|
|
1831
|
+
setActiveTabId(tab.id),
|
|
1696
1832
|
)}
|
|
1697
1833
|
className={cn(
|
|
1698
|
-
"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2
|
|
1699
|
-
id ===
|
|
1834
|
+
"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer max-w-[140px]",
|
|
1835
|
+
tab.id === activeTabId
|
|
1700
1836
|
? "bg-accent text-foreground"
|
|
1701
1837
|
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
1702
1838
|
)}
|
|
1703
1839
|
>
|
|
1704
|
-
<span
|
|
1840
|
+
<span className="truncate pe-1">
|
|
1841
|
+
{tab.subAgentName || tab.label}
|
|
1842
|
+
</span>
|
|
1843
|
+
{tab.status === "running" && (
|
|
1844
|
+
<span className="h-1 w-1 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
|
|
1845
|
+
)}
|
|
1705
1846
|
<button
|
|
1706
1847
|
type="button"
|
|
1707
1848
|
aria-label="Close tab"
|
|
1708
1849
|
onClick={(e) => {
|
|
1709
1850
|
e.stopPropagation();
|
|
1710
|
-
|
|
1851
|
+
closeTab(tab.id);
|
|
1711
1852
|
}}
|
|
1712
1853
|
className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
|
|
1713
1854
|
style={{
|
|
@@ -1715,96 +1856,26 @@ function AgentPanelInner({
|
|
|
1715
1856
|
right: 0,
|
|
1716
1857
|
top: 0,
|
|
1717
1858
|
bottom: 0,
|
|
1718
|
-
width:
|
|
1719
|
-
paddingRight:
|
|
1859
|
+
width: 24,
|
|
1860
|
+
paddingRight: 4,
|
|
1720
1861
|
borderRadius: "0 6px 6px 0",
|
|
1721
1862
|
background:
|
|
1722
1863
|
"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
1723
1864
|
}}
|
|
1724
1865
|
>
|
|
1725
|
-
<IconX size={
|
|
1866
|
+
<IconX size={8} />
|
|
1726
1867
|
</button>
|
|
1727
1868
|
</div>
|
|
1728
1869
|
))}
|
|
1729
|
-
</div>
|
|
1730
|
-
</div>
|
|
1731
|
-
{/* Sub-agent tab row — shown when the active context has children */}
|
|
1732
|
-
{mode === "chat" && hasSubTabs && (
|
|
1733
|
-
<div className="flex items-center px-2 py-0.5 border-b border-border gap-0.5 bg-muted/30">
|
|
1734
|
-
<div className="agent-tabs-scroll flex items-center gap-0.5 min-w-0 overflow-x-auto flex-1">
|
|
1735
|
-
<div
|
|
1736
|
-
role="button"
|
|
1737
|
-
tabIndex={0}
|
|
1738
|
-
onClick={() => setActiveTabId(focusParentId)}
|
|
1739
|
-
onKeyDown={activateOnKeyDown(() =>
|
|
1740
|
-
setActiveTabId(focusParentId),
|
|
1741
|
-
)}
|
|
1742
|
-
className={cn(
|
|
1743
|
-
"flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer",
|
|
1744
|
-
activeTabId === focusParentId
|
|
1745
|
-
? "bg-accent text-foreground"
|
|
1746
|
-
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
1747
|
-
)}
|
|
1748
|
-
>
|
|
1749
|
-
Main
|
|
1750
1870
|
</div>
|
|
1751
|
-
{childTabs.map((tab) => (
|
|
1752
|
-
<div
|
|
1753
|
-
key={tab.id}
|
|
1754
|
-
role="button"
|
|
1755
|
-
tabIndex={0}
|
|
1756
|
-
ref={
|
|
1757
|
-
tab.id === activeTabId ? activeTabRefCb : undefined
|
|
1758
|
-
}
|
|
1759
|
-
onClick={() => setActiveTabId(tab.id)}
|
|
1760
|
-
onKeyDown={activateOnKeyDown(() =>
|
|
1761
|
-
setActiveTabId(tab.id),
|
|
1762
|
-
)}
|
|
1763
|
-
className={cn(
|
|
1764
|
-
"agent-tab relative flex shrink-0 items-center gap-1 rounded-md px-2 py-1 text-[10px] font-medium cursor-pointer max-w-[140px]",
|
|
1765
|
-
tab.id === activeTabId
|
|
1766
|
-
? "bg-accent text-foreground"
|
|
1767
|
-
: "text-muted-foreground hover:bg-accent hover:text-foreground",
|
|
1768
|
-
)}
|
|
1769
|
-
>
|
|
1770
|
-
<span className="truncate pe-1">
|
|
1771
|
-
{tab.subAgentName || tab.label}
|
|
1772
|
-
</span>
|
|
1773
|
-
{tab.status === "running" && (
|
|
1774
|
-
<span className="h-1 w-1 shrink-0 rounded-full bg-muted-foreground/50 animate-pulse" />
|
|
1775
|
-
)}
|
|
1776
|
-
<button
|
|
1777
|
-
type="button"
|
|
1778
|
-
aria-label="Close tab"
|
|
1779
|
-
onClick={(e) => {
|
|
1780
|
-
e.stopPropagation();
|
|
1781
|
-
closeTab(tab.id);
|
|
1782
|
-
}}
|
|
1783
|
-
className="agent-tab-close flex items-center justify-end text-muted-foreground hover:text-foreground"
|
|
1784
|
-
style={{
|
|
1785
|
-
position: "absolute",
|
|
1786
|
-
right: 0,
|
|
1787
|
-
top: 0,
|
|
1788
|
-
bottom: 0,
|
|
1789
|
-
width: 24,
|
|
1790
|
-
paddingRight: 4,
|
|
1791
|
-
borderRadius: "0 6px 6px 0",
|
|
1792
|
-
background:
|
|
1793
|
-
"linear-gradient(to right, transparent, hsl(var(--accent)) 40%)",
|
|
1794
|
-
}}
|
|
1795
|
-
>
|
|
1796
|
-
<IconX size={8} />
|
|
1797
|
-
</button>
|
|
1798
|
-
</div>
|
|
1799
|
-
))}
|
|
1800
1871
|
</div>
|
|
1801
|
-
|
|
1802
|
-
|
|
1803
|
-
|
|
1804
|
-
)
|
|
1805
|
-
|
|
1806
|
-
|
|
1807
|
-
|
|
1872
|
+
)}
|
|
1873
|
+
</>
|
|
1874
|
+
);
|
|
1875
|
+
})()}
|
|
1876
|
+
</div>
|
|
1877
|
+
);
|
|
1878
|
+
},
|
|
1808
1879
|
[
|
|
1809
1880
|
mode,
|
|
1810
1881
|
renderHeaderActions,
|
|
@@ -2034,15 +2105,23 @@ const FULLSCREEN_CHAT_COLUMN_MAX_PX = 684;
|
|
|
2034
2105
|
function ResizeHandle({
|
|
2035
2106
|
position,
|
|
2036
2107
|
onDrag,
|
|
2108
|
+
onResizeStart,
|
|
2109
|
+
onResizeEnd,
|
|
2037
2110
|
}: {
|
|
2038
2111
|
position: "left" | "right";
|
|
2039
2112
|
onDrag: (delta: number) => void;
|
|
2113
|
+
onResizeStart: () => void;
|
|
2114
|
+
onResizeEnd: () => void;
|
|
2040
2115
|
}) {
|
|
2041
2116
|
const ref = useRef<HTMLDivElement>(null);
|
|
2042
2117
|
const dragging = useRef(false);
|
|
2043
2118
|
const lastX = useRef(0);
|
|
2044
2119
|
const onDragRef = useRef(onDrag);
|
|
2120
|
+
const onResizeStartRef = useRef(onResizeStart);
|
|
2121
|
+
const onResizeEndRef = useRef(onResizeEnd);
|
|
2045
2122
|
onDragRef.current = onDrag;
|
|
2123
|
+
onResizeStartRef.current = onResizeStart;
|
|
2124
|
+
onResizeEndRef.current = onResizeEnd;
|
|
2046
2125
|
const GRAB_ZONE = 5; // px on each side of the border
|
|
2047
2126
|
|
|
2048
2127
|
// All drag logic runs via document-level listeners so the 1px-wide
|
|
@@ -2059,6 +2138,7 @@ function ResizeHandle({
|
|
|
2059
2138
|
e.preventDefault();
|
|
2060
2139
|
dragging.current = true;
|
|
2061
2140
|
lastX.current = e.clientX;
|
|
2141
|
+
onResizeStartRef.current();
|
|
2062
2142
|
document.body.style.cursor = "col-resize";
|
|
2063
2143
|
document.body.style.userSelect = "none";
|
|
2064
2144
|
}
|
|
@@ -2088,6 +2168,7 @@ function ResizeHandle({
|
|
|
2088
2168
|
dragging.current = false;
|
|
2089
2169
|
document.body.style.cursor = "";
|
|
2090
2170
|
document.body.style.userSelect = "";
|
|
2171
|
+
onResizeEndRef.current();
|
|
2091
2172
|
}
|
|
2092
2173
|
|
|
2093
2174
|
// mouseup covers the normal release-inside-the-page case; window blur
|
|
@@ -2113,6 +2194,7 @@ function ResizeHandle({
|
|
|
2113
2194
|
// selection app-wide until reload.
|
|
2114
2195
|
document.body.style.userSelect = "";
|
|
2115
2196
|
dragging.current = false;
|
|
2197
|
+
onResizeEndRef.current();
|
|
2116
2198
|
};
|
|
2117
2199
|
}, [position]);
|
|
2118
2200
|
|
|
@@ -2512,7 +2594,8 @@ export interface AgentChatSurfaceProps extends AgentPanelProps {
|
|
|
2512
2594
|
/**
|
|
2513
2595
|
* Layout treatment for the reusable chat surface. Use "page" when rendering
|
|
2514
2596
|
* chat as the primary route content instead of inside the sidebar shell.
|
|
2515
|
-
* Default: "panel".
|
|
2597
|
+
* Default: "panel". Inline header and chat-tab chrome are hidden by default;
|
|
2598
|
+
* pass `showHeader` or `showTabBar` to opt into those controls.
|
|
2516
2599
|
*/
|
|
2517
2600
|
mode?: AgentChatSurfaceMode;
|
|
2518
2601
|
/**
|
|
@@ -2541,13 +2624,15 @@ export function shouldAllowAgentChatSurfaceSettingsMode(
|
|
|
2541
2624
|
* Reusable chat surface backed by AgentPanel internals.
|
|
2542
2625
|
*
|
|
2543
2626
|
* This gives page-level routes the same tabbed conversations, composer,
|
|
2544
|
-
* model controls,
|
|
2627
|
+
* model controls, context chips, and recovery boundary used by the
|
|
2545
2628
|
* sidebar without introducing a second chat implementation.
|
|
2546
2629
|
*/
|
|
2547
2630
|
export function AgentChatSurface({
|
|
2548
2631
|
mode = "panel",
|
|
2549
2632
|
className,
|
|
2550
2633
|
defaultMode = "chat",
|
|
2634
|
+
showHeader = false,
|
|
2635
|
+
showTabBar = false,
|
|
2551
2636
|
isFullscreen,
|
|
2552
2637
|
style,
|
|
2553
2638
|
chatViewTransition = false,
|
|
@@ -2556,12 +2641,14 @@ export function AgentChatSurface({
|
|
|
2556
2641
|
}: AgentChatSurfaceProps) {
|
|
2557
2642
|
const pageMode = mode === "page";
|
|
2558
2643
|
const defaultShowPageNewChatButton =
|
|
2559
|
-
shouldDefaultAgentChatSurfacePageNewChatButton(mode,
|
|
2644
|
+
shouldDefaultAgentChatSurfacePageNewChatButton(mode, showTabBar);
|
|
2560
2645
|
|
|
2561
2646
|
return (
|
|
2562
2647
|
<AgentPanel
|
|
2563
2648
|
{...props}
|
|
2564
2649
|
defaultMode={defaultMode}
|
|
2650
|
+
showHeader={showHeader}
|
|
2651
|
+
showTabBar={showTabBar}
|
|
2565
2652
|
isFullscreen={isFullscreen ?? pageMode}
|
|
2566
2653
|
allowSettingsMode={shouldAllowAgentChatSurfaceSettingsMode(
|
|
2567
2654
|
mode,
|
|
@@ -2626,14 +2713,9 @@ export interface AgentSidebarProps {
|
|
|
2626
2713
|
openOnChatRunning?: boolean;
|
|
2627
2714
|
/** Override the fullscreen menu action, for templates with a chat-first page. */
|
|
2628
2715
|
onFullscreenRequest?: () => void;
|
|
2629
|
-
/**
|
|
2630
|
-
* Bind chats to a resource. When set, every chat started here is
|
|
2631
|
-
* scoped to `{type, id}`, the tab bar/history partition by that scope,
|
|
2632
|
-
* and a "Working on {label}" badge appears with a Detach option.
|
|
2633
|
-
* Templates compute this from the active route (see template layouts).
|
|
2634
|
-
*/
|
|
2716
|
+
/** Ambient resource context rendered as a composer chip. */
|
|
2635
2717
|
scope?: import("./use-chat-threads.js").ChatThreadScope | null;
|
|
2636
|
-
/**
|
|
2718
|
+
/** @deprecated Scope context now appears inside the composer. */
|
|
2637
2719
|
showScopeBadge?: MultiTabAssistantChatProps["showScopeBadge"];
|
|
2638
2720
|
/** Stable browser tab id used for tab-scoped app-state context. */
|
|
2639
2721
|
browserTabId?: string;
|
|
@@ -2680,6 +2762,7 @@ export function AgentSidebar({
|
|
|
2680
2762
|
);
|
|
2681
2763
|
const [presentationMode, setPresentationMode] = useState(false);
|
|
2682
2764
|
const [width, setWidth] = useState(initialWidth);
|
|
2765
|
+
const [isResizing, setIsResizing] = useState(false);
|
|
2683
2766
|
const [fullscreen, setFullscreen] = useState(() => {
|
|
2684
2767
|
// Force-disable on mobile: a Claude-style centered column makes no sense
|
|
2685
2768
|
// when the sidebar already covers most of the viewport.
|
|
@@ -3046,6 +3129,8 @@ export function AgentSidebar({
|
|
|
3046
3129
|
return next;
|
|
3047
3130
|
});
|
|
3048
3131
|
}, []);
|
|
3132
|
+
const handleResizeStart = useCallback(() => setIsResizing(true), []);
|
|
3133
|
+
const handleResizeEnd = useCallback(() => setIsResizing(false), []);
|
|
3049
3134
|
|
|
3050
3135
|
const isLeft = position === "left";
|
|
3051
3136
|
// Fullscreen only applies on desktop — on mobile the existing overlay is
|
|
@@ -3161,7 +3246,12 @@ export function AgentSidebar({
|
|
|
3161
3246
|
const sidebar = shouldRenderPanel ? (
|
|
3162
3247
|
<>
|
|
3163
3248
|
{showResizeHandle && !isLeft && (
|
|
3164
|
-
<ResizeHandle
|
|
3249
|
+
<ResizeHandle
|
|
3250
|
+
position={position}
|
|
3251
|
+
onDrag={handleDrag}
|
|
3252
|
+
onResizeStart={handleResizeStart}
|
|
3253
|
+
onResizeEnd={handleResizeEnd}
|
|
3254
|
+
/>
|
|
3165
3255
|
)}
|
|
3166
3256
|
<div
|
|
3167
3257
|
className={cn(
|
|
@@ -3179,6 +3269,7 @@ export function AgentSidebar({
|
|
|
3179
3269
|
data-agent-sidebar-layout={panelLayout}
|
|
3180
3270
|
data-agent-sidebar-position={position}
|
|
3181
3271
|
data-agent-sidebar-state={panelOpen ? "open" : "closed"}
|
|
3272
|
+
data-agent-sidebar-resizing={isResizing ? "true" : undefined}
|
|
3182
3273
|
style={
|
|
3183
3274
|
chatViewTransition
|
|
3184
3275
|
? getAgentChatViewTransitionStyle(panelStyle)
|
|
@@ -3214,7 +3305,12 @@ export function AgentSidebar({
|
|
|
3214
3305
|
</div>
|
|
3215
3306
|
</div>
|
|
3216
3307
|
{showResizeHandle && isLeft && (
|
|
3217
|
-
<ResizeHandle
|
|
3308
|
+
<ResizeHandle
|
|
3309
|
+
position={position}
|
|
3310
|
+
onDrag={handleDrag}
|
|
3311
|
+
onResizeStart={handleResizeStart}
|
|
3312
|
+
onResizeEnd={handleResizeEnd}
|
|
3313
|
+
/>
|
|
3218
3314
|
)}
|
|
3219
3315
|
</>
|
|
3220
3316
|
) : null;
|
|
@@ -3224,6 +3320,7 @@ export function AgentSidebar({
|
|
|
3224
3320
|
<div
|
|
3225
3321
|
className="agent-sidebar-shell flex min-w-0 flex-1 h-screen overflow-hidden"
|
|
3226
3322
|
data-agent-sidebar-position={position}
|
|
3323
|
+
data-agent-sidebar-resizing={isResizing ? "true" : undefined}
|
|
3227
3324
|
>
|
|
3228
3325
|
<AgentNativeRouteWarmup />
|
|
3229
3326
|
{/* Mobile backdrop — tapping it closes the sidebar */}
|
|
@@ -3256,6 +3353,7 @@ export function AgentSidebar({
|
|
|
3256
3353
|
? "open"
|
|
3257
3354
|
: "closed"
|
|
3258
3355
|
}
|
|
3356
|
+
data-agent-sidebar-resizing={isResizing ? "true" : undefined}
|
|
3259
3357
|
>
|
|
3260
3358
|
{/* Screen-refresh key: the agent's `refresh-screen` tool bumps this
|
|
3261
3359
|
counter, remounting only the main content subtree so it re-fetches
|