@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
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
2
|
+
IconBook2,
|
|
3
|
+
IconChecklist,
|
|
3
4
|
IconClock,
|
|
4
5
|
IconExternalLink,
|
|
5
6
|
IconFolder,
|
|
7
|
+
IconHistory,
|
|
8
|
+
IconHierarchy2,
|
|
9
|
+
IconNotes,
|
|
6
10
|
IconPlugConnected,
|
|
11
|
+
IconTopologyRing2,
|
|
7
12
|
IconSearch,
|
|
8
13
|
IconShieldLock,
|
|
9
14
|
IconX,
|
|
@@ -17,6 +22,7 @@ import {
|
|
|
17
22
|
useRef,
|
|
18
23
|
useState,
|
|
19
24
|
type ComponentType,
|
|
25
|
+
type ReactNode,
|
|
20
26
|
} from "react";
|
|
21
27
|
|
|
22
28
|
import {
|
|
@@ -27,11 +33,6 @@ import {
|
|
|
27
33
|
type McpConnectTemplateValues,
|
|
28
34
|
} from "../../shared/mcp-connect-content.js";
|
|
29
35
|
import { appPath } from "../api-path.js";
|
|
30
|
-
import {
|
|
31
|
-
Tooltip,
|
|
32
|
-
TooltipContent,
|
|
33
|
-
TooltipTrigger,
|
|
34
|
-
} from "../components/ui/tooltip.js";
|
|
35
36
|
import { useT } from "../i18n.js";
|
|
36
37
|
import { useOrg } from "../org/hooks.js";
|
|
37
38
|
import {
|
|
@@ -40,6 +41,7 @@ import {
|
|
|
40
41
|
// host for the existing MCP management flow.
|
|
41
42
|
} from "../resources/McpIntegrationDialog.js";
|
|
42
43
|
import { McpServerDetail } from "../resources/McpServerDetail.js";
|
|
44
|
+
import type { ResourceView } from "../resources/ResourcesPanel.js";
|
|
43
45
|
import {
|
|
44
46
|
useCreateMcpServer,
|
|
45
47
|
useDeleteMcpServer,
|
|
@@ -47,12 +49,13 @@ import {
|
|
|
47
49
|
type McpServer,
|
|
48
50
|
type McpServerScope,
|
|
49
51
|
} from "../resources/use-mcp-servers.js";
|
|
50
|
-
import { AgentsSection } from "../settings/AgentsSection.js";
|
|
51
52
|
import type {
|
|
52
53
|
SettingsSearchEntry,
|
|
53
54
|
SettingsTabItem,
|
|
54
55
|
} from "../settings/SettingsTabsPage.js";
|
|
55
56
|
import { cn } from "../utils.js";
|
|
57
|
+
import { AgentEmptyState } from "./AgentEmptyState.js";
|
|
58
|
+
import { AgentTabFrame } from "./AgentTabFrame.js";
|
|
56
59
|
import type { AgentPageScope, AgentPageTabProps } from "./types.js";
|
|
57
60
|
|
|
58
61
|
const AgentContextTab = lazy(() =>
|
|
@@ -89,6 +92,9 @@ function resolveTabId(
|
|
|
89
92
|
): string | null {
|
|
90
93
|
const normalized = normalizeTabId(value);
|
|
91
94
|
if (!normalized) return null;
|
|
95
|
+
if (normalized === "context" && tabs.some((tab) => tab.id === "snapshots")) {
|
|
96
|
+
return "snapshots";
|
|
97
|
+
}
|
|
92
98
|
if (tabs.some((tab) => tab.id === normalized)) return normalized;
|
|
93
99
|
const section = normalized.split(":", 1)[0];
|
|
94
100
|
const owner = tabs.find((tab) =>
|
|
@@ -101,7 +107,7 @@ function resolveTabId(
|
|
|
101
107
|
|
|
102
108
|
function updateTabHash(tabId: string) {
|
|
103
109
|
if (typeof window === "undefined") return;
|
|
104
|
-
const hash = tabId === "
|
|
110
|
+
const hash = tabId === "files" ? "" : `#${encodeURIComponent(tabId)}`;
|
|
105
111
|
window.history.pushState(
|
|
106
112
|
null,
|
|
107
113
|
"",
|
|
@@ -109,29 +115,6 @@ function updateTabHash(tabId: string) {
|
|
|
109
115
|
);
|
|
110
116
|
}
|
|
111
117
|
|
|
112
|
-
function initialScope(): AgentPageScope {
|
|
113
|
-
if (typeof window === "undefined") return "user";
|
|
114
|
-
try {
|
|
115
|
-
const queryScope = new URLSearchParams(window.location.search).get("scope");
|
|
116
|
-
if (queryScope === "org" || queryScope === "user") return queryScope;
|
|
117
|
-
return localStorage.getItem("agent-page-scope") === "org" ? "org" : "user";
|
|
118
|
-
} catch {
|
|
119
|
-
return "user";
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
function updateScopeUrl(scope: AgentPageScope) {
|
|
124
|
-
if (typeof window === "undefined") return;
|
|
125
|
-
const search = new URLSearchParams(window.location.search);
|
|
126
|
-
search.set("scope", scope);
|
|
127
|
-
const query = search.toString();
|
|
128
|
-
window.history.replaceState(
|
|
129
|
-
null,
|
|
130
|
-
"",
|
|
131
|
-
`${window.location.pathname}${query ? `?${query}` : ""}${window.location.hash}`,
|
|
132
|
-
);
|
|
133
|
-
}
|
|
134
|
-
|
|
135
118
|
function TabLoading() {
|
|
136
119
|
return (
|
|
137
120
|
<div className="space-y-3" aria-busy="true">
|
|
@@ -150,23 +133,60 @@ function EmptySlot({ label }: { label: string }) {
|
|
|
150
133
|
);
|
|
151
134
|
}
|
|
152
135
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
136
|
+
const RESOURCE_TAB_COPY: Record<
|
|
137
|
+
ResourceView,
|
|
138
|
+
{ title: string; description: string }
|
|
139
|
+
> = {
|
|
140
|
+
files: {
|
|
141
|
+
title: "Files",
|
|
142
|
+
description: "Plain workspace files the agent can read and write.",
|
|
143
|
+
},
|
|
144
|
+
instructions: {
|
|
145
|
+
title: "Instructions",
|
|
146
|
+
description:
|
|
147
|
+
"The rules, preferences, and project guidance that steer the agent.",
|
|
148
|
+
},
|
|
149
|
+
agents: {
|
|
150
|
+
title: "Agents",
|
|
151
|
+
description: "Reusable profiles for focused sub-agents and delegated work.",
|
|
152
|
+
},
|
|
153
|
+
memory: {
|
|
154
|
+
title: "Memory",
|
|
155
|
+
description: "Durable notes the agent can retrieve across conversations.",
|
|
156
|
+
},
|
|
157
|
+
skills: {
|
|
158
|
+
title: "Skills",
|
|
159
|
+
description:
|
|
160
|
+
"Specialized instructions that give the agent repeatable abilities.",
|
|
161
|
+
},
|
|
162
|
+
learnings: {
|
|
163
|
+
title: "Learnings",
|
|
164
|
+
description:
|
|
165
|
+
"Corrections and patterns worth carrying forward for future work.",
|
|
166
|
+
},
|
|
167
|
+
"remote-agents": {
|
|
168
|
+
title: "Remote agents",
|
|
169
|
+
description: "Other agents this workspace can call through A2A.",
|
|
170
|
+
},
|
|
171
|
+
};
|
|
164
172
|
|
|
165
|
-
function
|
|
173
|
+
function AgentResourceTab({
|
|
174
|
+
scope,
|
|
175
|
+
view,
|
|
176
|
+
}: AgentPageTabProps & { view: ResourceView }) {
|
|
177
|
+
const copy = RESOURCE_TAB_COPY[view];
|
|
166
178
|
return (
|
|
167
|
-
<
|
|
168
|
-
|
|
169
|
-
|
|
179
|
+
<AgentTabFrame title={copy.title} description={copy.description}>
|
|
180
|
+
<div className="min-h-[480px]">
|
|
181
|
+
<ResourcesPanel
|
|
182
|
+
key={`${scope}-${view}`}
|
|
183
|
+
showMcpServers={false}
|
|
184
|
+
resourceFilter={view}
|
|
185
|
+
resourceTreeVariant={view === "files" ? "tree" : "collection"}
|
|
186
|
+
scope="personal"
|
|
187
|
+
/>
|
|
188
|
+
</div>
|
|
189
|
+
</AgentTabFrame>
|
|
170
190
|
);
|
|
171
191
|
}
|
|
172
192
|
|
|
@@ -190,7 +210,7 @@ function ServerStatus({ server }: { server: McpServer }) {
|
|
|
190
210
|
);
|
|
191
211
|
}
|
|
192
212
|
|
|
193
|
-
function ConnectionsTab({
|
|
213
|
+
function ConnectionsTab({ canManageOrg = false }: AgentPageTabProps) {
|
|
194
214
|
const t = useT();
|
|
195
215
|
const serversQuery = useMcpServers();
|
|
196
216
|
const createServer = useCreateMcpServer();
|
|
@@ -202,7 +222,6 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
|
|
|
202
222
|
const data = serversQuery.data;
|
|
203
223
|
const hasOrg = Boolean(data?.orgId);
|
|
204
224
|
const canCreateOrgMcp = hasOrg && canManageOrg;
|
|
205
|
-
const activeScope: McpServerScope = scope === "org" ? "org" : "user";
|
|
206
225
|
|
|
207
226
|
const onCreateMcpServer = useCallback(
|
|
208
227
|
async (args: {
|
|
@@ -252,8 +271,8 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
|
|
|
252
271
|
<div
|
|
253
272
|
key={key}
|
|
254
273
|
className={cn(
|
|
255
|
-
"
|
|
256
|
-
selected && "
|
|
274
|
+
"group/connection-row py-4 transition-colors first:pt-5 last:pb-5",
|
|
275
|
+
selected && "bg-accent/20",
|
|
257
276
|
)}
|
|
258
277
|
>
|
|
259
278
|
<div className="flex items-start gap-3">
|
|
@@ -266,12 +285,6 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
|
|
|
266
285
|
<span className="truncate text-sm font-medium text-foreground">
|
|
267
286
|
{server.name}
|
|
268
287
|
</span>
|
|
269
|
-
<ScopeBadge scope={server.scope} />
|
|
270
|
-
{server.scope === activeScope && (
|
|
271
|
-
<span className="text-[10px] text-muted-foreground">
|
|
272
|
-
Selected scope
|
|
273
|
-
</span>
|
|
274
|
-
)}
|
|
275
288
|
</div>
|
|
276
289
|
<code className="mt-1 block truncate text-[11px] text-muted-foreground">
|
|
277
290
|
{server.url}
|
|
@@ -309,29 +322,23 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
|
|
|
309
322
|
};
|
|
310
323
|
|
|
311
324
|
return (
|
|
312
|
-
<
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
}}
|
|
330
|
-
className="cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90"
|
|
331
|
-
>
|
|
332
|
-
{t("mcpIntegrations.connect")}
|
|
333
|
-
</button>
|
|
334
|
-
</div>
|
|
325
|
+
<AgentTabFrame
|
|
326
|
+
title="Connections"
|
|
327
|
+
description="Tools and services this agent can reach, grouped by where they are configured."
|
|
328
|
+
actions={
|
|
329
|
+
<button
|
|
330
|
+
type="button"
|
|
331
|
+
onClick={() => {
|
|
332
|
+
setError(null);
|
|
333
|
+
setDialogOpen(true);
|
|
334
|
+
}}
|
|
335
|
+
className="cursor-pointer rounded-md bg-primary px-3 py-1.5 text-xs font-medium text-primary-foreground hover:bg-primary/90"
|
|
336
|
+
>
|
|
337
|
+
{t("mcpIntegrations.connect")}
|
|
338
|
+
</button>
|
|
339
|
+
}
|
|
340
|
+
>
|
|
341
|
+
<section className="space-y-4">
|
|
335
342
|
{error && (
|
|
336
343
|
<p className="rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive">
|
|
337
344
|
{error}
|
|
@@ -343,40 +350,45 @@ function ConnectionsTab({ scope, canManageOrg = false }: AgentPageTabProps) {
|
|
|
343
350
|
<p className="rounded-md border border-destructive/20 bg-destructive/5 px-3 py-2 text-xs text-destructive">
|
|
344
351
|
Could not load MCP servers.
|
|
345
352
|
</p>
|
|
346
|
-
) : data && data.user.length + data.org.length > 0 ? (
|
|
347
|
-
<div className="space-y-2">
|
|
348
|
-
{data.user.map(renderServer)}
|
|
349
|
-
{data.org.map(renderServer)}
|
|
350
|
-
</div>
|
|
351
353
|
) : (
|
|
352
|
-
<div className="
|
|
353
|
-
|
|
354
|
+
<div className="space-y-6">
|
|
355
|
+
{[
|
|
356
|
+
{ label: "Personal", servers: data?.user ?? [] },
|
|
357
|
+
{ label: "Organization", servers: data?.org ?? [] },
|
|
358
|
+
].map((section) => (
|
|
359
|
+
<section key={section.label} className="space-y-2">
|
|
360
|
+
<h2 className="text-xs font-semibold uppercase tracking-[0.14em] text-muted-foreground/70">
|
|
361
|
+
{section.label}
|
|
362
|
+
</h2>
|
|
363
|
+
{section.servers.length > 0 ? (
|
|
364
|
+
<div className="divide-y divide-border/60 border-y border-border/60">
|
|
365
|
+
{section.servers.map(renderServer)}
|
|
366
|
+
</div>
|
|
367
|
+
) : (
|
|
368
|
+
<AgentEmptyState
|
|
369
|
+
icon={IconPlugConnected}
|
|
370
|
+
title={`No ${section.label.toLowerCase()} connections yet`}
|
|
371
|
+
description={
|
|
372
|
+
section.label === "Personal"
|
|
373
|
+
? "Connect a service to give the agent access to it."
|
|
374
|
+
: "Organization connections shared with this workspace will appear here."
|
|
375
|
+
}
|
|
376
|
+
/>
|
|
377
|
+
)}
|
|
378
|
+
</section>
|
|
379
|
+
))}
|
|
354
380
|
</div>
|
|
355
381
|
)}
|
|
356
382
|
<McpIntegrationDialog
|
|
357
383
|
open={dialogOpen}
|
|
358
384
|
onOpenChange={setDialogOpen}
|
|
359
|
-
defaultScope=
|
|
385
|
+
defaultScope="user"
|
|
360
386
|
canCreateOrgMcp={canCreateOrgMcp}
|
|
361
387
|
hasOrg={hasOrg}
|
|
362
388
|
onCreateMcpServer={onCreateMcpServer}
|
|
363
389
|
/>
|
|
364
390
|
</section>
|
|
365
|
-
|
|
366
|
-
<section className="space-y-3 border-t border-border/70 pt-6">
|
|
367
|
-
<div>
|
|
368
|
-
<h2 className="text-base font-semibold text-foreground">
|
|
369
|
-
Remote agents
|
|
370
|
-
</h2>
|
|
371
|
-
<p className="mt-1 max-w-2xl text-sm leading-relaxed text-muted-foreground">
|
|
372
|
-
Other agents this app can call through A2A.
|
|
373
|
-
</p>
|
|
374
|
-
</div>
|
|
375
|
-
<div className="rounded-lg border border-border bg-card p-4">
|
|
376
|
-
<AgentsSection />
|
|
377
|
-
</div>
|
|
378
|
-
</section>
|
|
379
|
-
</div>
|
|
391
|
+
</AgentTabFrame>
|
|
380
392
|
);
|
|
381
393
|
}
|
|
382
394
|
|
|
@@ -490,130 +502,142 @@ function AccessTab({
|
|
|
490
502
|
MCP_CONNECT_GUIDES[0];
|
|
491
503
|
|
|
492
504
|
return (
|
|
493
|
-
<
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
item.id === guide?.id
|
|
532
|
-
? "bg-accent text-foreground"
|
|
533
|
-
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground",
|
|
534
|
-
)}
|
|
535
|
-
>
|
|
536
|
-
{item.label}
|
|
537
|
-
</button>
|
|
538
|
-
))}
|
|
539
|
-
</div>
|
|
540
|
-
{guide && templateValues && (
|
|
541
|
-
<div className="space-y-3 pt-1" role="tabpanel">
|
|
542
|
-
{guide.steps?.length ? (
|
|
543
|
-
<ol className="list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground">
|
|
544
|
-
{guide.steps.map((step) => (
|
|
545
|
-
<li key={step}>
|
|
546
|
-
{interpolateMcpConnectTemplate(step, templateValues)}
|
|
547
|
-
</li>
|
|
548
|
-
))}
|
|
549
|
-
</ol>
|
|
550
|
-
) : null}
|
|
551
|
-
{guide.intro && (
|
|
552
|
-
<p className="text-xs text-muted-foreground">
|
|
553
|
-
{interpolateMcpConnectTemplate(guide.intro, templateValues)}
|
|
554
|
-
</p>
|
|
555
|
-
)}
|
|
556
|
-
{guide.commandTemplate && (
|
|
557
|
-
<CopyField
|
|
558
|
-
label="Command"
|
|
559
|
-
value={interpolateMcpConnectTemplate(
|
|
560
|
-
guide.commandTemplate,
|
|
561
|
-
templateValues,
|
|
562
|
-
)}
|
|
563
|
-
/>
|
|
564
|
-
)}
|
|
565
|
-
{guide.configTemplate && (
|
|
566
|
-
<CopyField
|
|
567
|
-
label="MCP config"
|
|
568
|
-
value={interpolateMcpConnectTemplate(
|
|
569
|
-
guide.configTemplate,
|
|
570
|
-
templateValues,
|
|
505
|
+
<AgentTabFrame
|
|
506
|
+
title="Access"
|
|
507
|
+
description="Choose which external clients can talk to this app's agent."
|
|
508
|
+
>
|
|
509
|
+
<div className="space-y-6">
|
|
510
|
+
{urls ? (
|
|
511
|
+
<>
|
|
512
|
+
<CopyField label="MCP URL" value={urls.mcpUrl} />
|
|
513
|
+
{agentCardAvailable && (
|
|
514
|
+
<CopyField label="A2A agent card" value={urls.agentCardUrl} />
|
|
515
|
+
)}
|
|
516
|
+
<section className="space-y-3 border-t border-border/70 pt-6">
|
|
517
|
+
<div>
|
|
518
|
+
<h3 className="text-sm font-semibold text-foreground">
|
|
519
|
+
Client setup
|
|
520
|
+
</h3>
|
|
521
|
+
<p className="mt-1 text-xs text-muted-foreground">
|
|
522
|
+
These instructions are also available on the full connect
|
|
523
|
+
page.
|
|
524
|
+
</p>
|
|
525
|
+
</div>
|
|
526
|
+
<div
|
|
527
|
+
className="flex gap-1 overflow-x-auto border-b border-border pb-2"
|
|
528
|
+
role="tablist"
|
|
529
|
+
aria-label="Choose your AI assistant"
|
|
530
|
+
>
|
|
531
|
+
{MCP_CONNECT_GUIDES.map((item) => (
|
|
532
|
+
<button
|
|
533
|
+
key={item.id}
|
|
534
|
+
type="button"
|
|
535
|
+
role="tab"
|
|
536
|
+
aria-selected={item.id === guide?.id}
|
|
537
|
+
onClick={() => setActiveGuide(item.id)}
|
|
538
|
+
className={cn(
|
|
539
|
+
"shrink-0 cursor-pointer rounded-md px-2.5 py-1.5 text-xs font-medium",
|
|
540
|
+
item.id === guide?.id
|
|
541
|
+
? "bg-accent text-foreground"
|
|
542
|
+
: "text-muted-foreground hover:bg-accent/50 hover:text-foreground",
|
|
571
543
|
)}
|
|
572
|
-
/>
|
|
573
|
-
)}
|
|
574
|
-
{guide.action?.kind === "link" && guide.action.href && (
|
|
575
|
-
<a
|
|
576
|
-
href={guide.action.href}
|
|
577
|
-
target="_blank"
|
|
578
|
-
rel="noopener noreferrer"
|
|
579
|
-
className="inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent"
|
|
580
544
|
>
|
|
581
|
-
{
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
)}
|
|
585
|
-
{guide.note && (
|
|
586
|
-
<p className="text-xs leading-relaxed text-muted-foreground">
|
|
587
|
-
{interpolateMcpConnectTemplate(guide.note, templateValues)}
|
|
588
|
-
</p>
|
|
589
|
-
)}
|
|
545
|
+
{item.label}
|
|
546
|
+
</button>
|
|
547
|
+
))}
|
|
590
548
|
</div>
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
549
|
+
{guide && templateValues && (
|
|
550
|
+
<div className="space-y-3 pt-1" role="tabpanel">
|
|
551
|
+
{guide.steps?.length ? (
|
|
552
|
+
<ol className="list-decimal space-y-2 ps-5 text-xs leading-relaxed text-muted-foreground">
|
|
553
|
+
{guide.steps.map((step) => (
|
|
554
|
+
<li key={step}>
|
|
555
|
+
{interpolateMcpConnectTemplate(step, templateValues)}
|
|
556
|
+
</li>
|
|
557
|
+
))}
|
|
558
|
+
</ol>
|
|
559
|
+
) : null}
|
|
560
|
+
{guide.intro && (
|
|
561
|
+
<p className="text-xs text-muted-foreground">
|
|
562
|
+
{interpolateMcpConnectTemplate(
|
|
563
|
+
guide.intro,
|
|
564
|
+
templateValues,
|
|
565
|
+
)}
|
|
566
|
+
</p>
|
|
567
|
+
)}
|
|
568
|
+
{guide.commandTemplate && (
|
|
569
|
+
<CopyField
|
|
570
|
+
label="Command"
|
|
571
|
+
value={interpolateMcpConnectTemplate(
|
|
572
|
+
guide.commandTemplate,
|
|
573
|
+
templateValues,
|
|
574
|
+
)}
|
|
575
|
+
/>
|
|
576
|
+
)}
|
|
577
|
+
{guide.configTemplate && (
|
|
578
|
+
<CopyField
|
|
579
|
+
label="MCP config"
|
|
580
|
+
value={interpolateMcpConnectTemplate(
|
|
581
|
+
guide.configTemplate,
|
|
582
|
+
templateValues,
|
|
583
|
+
)}
|
|
584
|
+
/>
|
|
585
|
+
)}
|
|
586
|
+
{guide.action?.kind === "link" && guide.action.href && (
|
|
587
|
+
<a
|
|
588
|
+
href={guide.action.href}
|
|
589
|
+
target="_blank"
|
|
590
|
+
rel="noopener noreferrer"
|
|
591
|
+
className="inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent"
|
|
592
|
+
>
|
|
593
|
+
{guide.action.label}
|
|
594
|
+
<IconExternalLink className="size-3.5" />
|
|
595
|
+
</a>
|
|
596
|
+
)}
|
|
597
|
+
{guide.note && (
|
|
598
|
+
<p className="text-xs leading-relaxed text-muted-foreground">
|
|
599
|
+
{interpolateMcpConnectTemplate(
|
|
600
|
+
guide.note,
|
|
601
|
+
templateValues,
|
|
602
|
+
)}
|
|
603
|
+
</p>
|
|
604
|
+
)}
|
|
605
|
+
</div>
|
|
606
|
+
)}
|
|
607
|
+
</section>
|
|
608
|
+
<section className="border-t border-border/70 pt-6">
|
|
609
|
+
<h3 className="text-sm font-semibold text-foreground">
|
|
610
|
+
{MCP_STATIC_TOKEN_FALLBACK.title}
|
|
611
|
+
</h3>
|
|
612
|
+
<p className="mt-1 text-xs leading-relaxed text-muted-foreground">
|
|
613
|
+
{MCP_STATIC_TOKEN_FALLBACK.state}. Open the connect page to
|
|
614
|
+
create a token for clients that cannot complete OAuth.
|
|
615
|
+
</p>
|
|
616
|
+
<a
|
|
617
|
+
href={urls.connectUrl}
|
|
618
|
+
className="mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-3 py-1.5 text-xs font-medium text-foreground hover:bg-accent"
|
|
619
|
+
>
|
|
620
|
+
Open full connect page
|
|
621
|
+
<IconExternalLink className="size-3.5" />
|
|
622
|
+
</a>
|
|
623
|
+
</section>
|
|
624
|
+
</>
|
|
625
|
+
) : (
|
|
626
|
+
<TabLoading />
|
|
627
|
+
)}
|
|
628
|
+
</div>
|
|
629
|
+
</AgentTabFrame>
|
|
614
630
|
);
|
|
615
631
|
}
|
|
616
632
|
|
|
633
|
+
export interface AgentPageExtraTabContext extends AgentPageTabProps {
|
|
634
|
+
scopeControl: ReactNode;
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
export type AgentPageExtraTabFactory = (
|
|
638
|
+
context: AgentPageExtraTabContext,
|
|
639
|
+
) => SettingsTabItem;
|
|
640
|
+
|
|
617
641
|
export interface AgentTabsPageProps {
|
|
618
642
|
/**
|
|
619
643
|
* Human-readable app name used in the Access tab's connect instructions
|
|
@@ -622,6 +646,8 @@ export interface AgentTabsPageProps {
|
|
|
622
646
|
*/
|
|
623
647
|
appName?: string;
|
|
624
648
|
extraTabs?: SettingsTabItem[];
|
|
649
|
+
/** Scoped app-specific tabs that receive the current Agent workspace scope. */
|
|
650
|
+
extraTabFactories?: AgentPageExtraTabFactory[];
|
|
625
651
|
defaultTab?: string;
|
|
626
652
|
className?: string;
|
|
627
653
|
/** Whether to render the Agent page search box. Defaults to true. */
|
|
@@ -635,20 +661,19 @@ export interface AgentTabsPageProps {
|
|
|
635
661
|
export function AgentTabsPage({
|
|
636
662
|
appName,
|
|
637
663
|
extraTabs = [],
|
|
638
|
-
|
|
664
|
+
extraTabFactories = [],
|
|
665
|
+
defaultTab = "files",
|
|
639
666
|
className,
|
|
640
667
|
enableSearch = true,
|
|
641
|
-
searchPlaceholder = "Search agent
|
|
668
|
+
searchPlaceholder = "Search agent workspace",
|
|
642
669
|
hiddenTabs = [],
|
|
643
670
|
value,
|
|
644
671
|
onValueChange,
|
|
645
672
|
}: AgentTabsPageProps) {
|
|
646
|
-
const { data: org
|
|
647
|
-
const hasOrg = Boolean(org?.orgId);
|
|
673
|
+
const { data: org } = useOrg();
|
|
648
674
|
const canManageOrg =
|
|
649
675
|
!org?.orgId || org.role === "owner" || org.role === "admin";
|
|
650
|
-
const
|
|
651
|
-
const scopeInitialized = useRef(false);
|
|
676
|
+
const scope: AgentPageScope = "user";
|
|
652
677
|
const rootRef = useRef<HTMLDivElement | null>(null);
|
|
653
678
|
const searchRef = useRef<HTMLInputElement | null>(null);
|
|
654
679
|
const [query, setQuery] = useState("");
|
|
@@ -656,57 +681,121 @@ export function AgentTabsPage({
|
|
|
656
681
|
() => new Set(hiddenTabs.map((tab) => normalizeTabId(tab)).filter(Boolean)),
|
|
657
682
|
[hiddenTabs],
|
|
658
683
|
);
|
|
684
|
+
const scopeControl: ReactNode = null;
|
|
685
|
+
const scopedExtraTabs = useMemo(
|
|
686
|
+
() =>
|
|
687
|
+
extraTabFactories.map((factory) =>
|
|
688
|
+
factory({ scope, canManageOrg, scopeControl }),
|
|
689
|
+
),
|
|
690
|
+
[canManageOrg, extraTabFactories, scope, scopeControl],
|
|
691
|
+
);
|
|
659
692
|
|
|
660
693
|
const tabs = useMemo<SettingsTabItem[]>(
|
|
661
694
|
() => [
|
|
662
695
|
{
|
|
663
|
-
id: "
|
|
664
|
-
label: "
|
|
665
|
-
icon:
|
|
666
|
-
|
|
696
|
+
id: "files",
|
|
697
|
+
label: "Files",
|
|
698
|
+
icon: IconFolder,
|
|
699
|
+
group: "resources",
|
|
700
|
+
keywords: "workspace plain files documents uploads",
|
|
667
701
|
content: (
|
|
668
|
-
<
|
|
669
|
-
<
|
|
670
|
-
|
|
671
|
-
<p className="mt-1 text-sm leading-relaxed text-muted-foreground">
|
|
672
|
-
See what can influence this agent and why.
|
|
673
|
-
</p>
|
|
674
|
-
</div>
|
|
675
|
-
<div className="min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4">
|
|
676
|
-
<Suspense fallback={<TabLoading />}>
|
|
677
|
-
<AgentContextTab scope={scope} canManageOrg={canManageOrg} />
|
|
678
|
-
</Suspense>
|
|
679
|
-
</div>
|
|
680
|
-
</div>
|
|
702
|
+
<Suspense fallback={<TabLoading />}>
|
|
703
|
+
<AgentResourceTab scope={scope} view="files" />
|
|
704
|
+
</Suspense>
|
|
681
705
|
),
|
|
682
706
|
},
|
|
683
707
|
{
|
|
684
|
-
id: "
|
|
685
|
-
label: "
|
|
686
|
-
icon:
|
|
687
|
-
|
|
708
|
+
id: "instructions",
|
|
709
|
+
label: "Instructions",
|
|
710
|
+
icon: IconChecklist,
|
|
711
|
+
group: "resources",
|
|
712
|
+
keywords: "agents md rules preferences guidance",
|
|
688
713
|
content: (
|
|
689
|
-
<
|
|
690
|
-
<
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
714
|
+
<Suspense fallback={<TabLoading />}>
|
|
715
|
+
<AgentResourceTab scope={scope} view="instructions" />
|
|
716
|
+
</Suspense>
|
|
717
|
+
),
|
|
718
|
+
},
|
|
719
|
+
{
|
|
720
|
+
id: "agents",
|
|
721
|
+
label: "Agents",
|
|
722
|
+
icon: IconHierarchy2,
|
|
723
|
+
group: "resources",
|
|
724
|
+
keywords: "custom sub agents delegate profiles",
|
|
725
|
+
content: (
|
|
726
|
+
<Suspense fallback={<TabLoading />}>
|
|
727
|
+
<AgentResourceTab scope={scope} view="agents" />
|
|
728
|
+
</Suspense>
|
|
729
|
+
),
|
|
730
|
+
},
|
|
731
|
+
{
|
|
732
|
+
id: "memory",
|
|
733
|
+
label: "Memory",
|
|
734
|
+
icon: IconNotes,
|
|
735
|
+
group: "resources",
|
|
736
|
+
keywords: "long term notes memory index recall",
|
|
737
|
+
content: (
|
|
738
|
+
<Suspense fallback={<TabLoading />}>
|
|
739
|
+
<AgentResourceTab scope={scope} view="memory" />
|
|
740
|
+
</Suspense>
|
|
741
|
+
),
|
|
742
|
+
},
|
|
743
|
+
{
|
|
744
|
+
id: "skills",
|
|
745
|
+
label: "Skills",
|
|
746
|
+
icon: IconBook2,
|
|
747
|
+
group: "resources",
|
|
748
|
+
keywords: "abilities reusable instructions workflows",
|
|
749
|
+
content: (
|
|
750
|
+
<Suspense fallback={<TabLoading />}>
|
|
751
|
+
<AgentResourceTab scope={scope} view="skills" />
|
|
752
|
+
</Suspense>
|
|
753
|
+
),
|
|
754
|
+
},
|
|
755
|
+
{
|
|
756
|
+
id: "learnings",
|
|
757
|
+
label: "Learnings",
|
|
758
|
+
icon: IconHistory,
|
|
759
|
+
group: "resources",
|
|
760
|
+
keywords: "corrections patterns knowledge feedback",
|
|
761
|
+
content: (
|
|
762
|
+
<Suspense fallback={<TabLoading />}>
|
|
763
|
+
<AgentResourceTab scope={scope} view="learnings" />
|
|
764
|
+
</Suspense>
|
|
765
|
+
),
|
|
766
|
+
},
|
|
767
|
+
{
|
|
768
|
+
id: "remote-agents",
|
|
769
|
+
label: "Remote agents",
|
|
770
|
+
icon: IconTopologyRing2,
|
|
771
|
+
group: "resources",
|
|
772
|
+
keywords: "a2a connected remote agents delegation",
|
|
773
|
+
content: (
|
|
774
|
+
<Suspense fallback={<TabLoading />}>
|
|
775
|
+
<AgentResourceTab scope={scope} view="remote-agents" />
|
|
776
|
+
</Suspense>
|
|
777
|
+
),
|
|
778
|
+
},
|
|
779
|
+
{
|
|
780
|
+
id: "snapshots",
|
|
781
|
+
label: "Snapshots",
|
|
782
|
+
icon: IconHistory,
|
|
783
|
+
group: "agent",
|
|
784
|
+
keywords: "context recent loads provenance tokens",
|
|
785
|
+
content: (
|
|
786
|
+
<Suspense fallback={<TabLoading />}>
|
|
787
|
+
<AgentContextTab scope={scope} canManageOrg={canManageOrg} />
|
|
788
|
+
</Suspense>
|
|
700
789
|
),
|
|
701
790
|
},
|
|
702
791
|
{
|
|
703
792
|
id: "connections",
|
|
704
793
|
label: "Connections",
|
|
705
794
|
icon: IconPlugConnected,
|
|
706
|
-
|
|
795
|
+
group: "agent",
|
|
796
|
+
keywords: "mcp servers tools integrations",
|
|
707
797
|
searchEntries: [
|
|
708
798
|
{ id: "mcp-servers", label: "MCP servers", keywords: "tools" },
|
|
709
|
-
{ id: "remote-agents", label: "Remote agents", keywords: "a2a" },
|
|
710
799
|
],
|
|
711
800
|
content: <ConnectionsTab scope={scope} canManageOrg={canManageOrg} />,
|
|
712
801
|
},
|
|
@@ -714,27 +803,19 @@ export function AgentTabsPage({
|
|
|
714
803
|
id: "jobs",
|
|
715
804
|
label: "Jobs",
|
|
716
805
|
icon: IconClock,
|
|
806
|
+
group: "agent",
|
|
717
807
|
keywords: "scheduled automations recurring",
|
|
718
808
|
content: (
|
|
719
|
-
<
|
|
720
|
-
<
|
|
721
|
-
|
|
722
|
-
<p className="mt-1 text-sm leading-relaxed text-muted-foreground">
|
|
723
|
-
Scheduled work that can run with this agent.
|
|
724
|
-
</p>
|
|
725
|
-
</div>
|
|
726
|
-
<div className="min-h-[220px] rounded-lg border border-dashed border-border/70 bg-muted/10 p-4">
|
|
727
|
-
<Suspense fallback={<TabLoading />}>
|
|
728
|
-
<AgentJobsTab scope={scope} canManageOrg={canManageOrg} />
|
|
729
|
-
</Suspense>
|
|
730
|
-
</div>
|
|
731
|
-
</div>
|
|
809
|
+
<Suspense fallback={<TabLoading />}>
|
|
810
|
+
<AgentJobsTab scope={scope} canManageOrg={canManageOrg} />
|
|
811
|
+
</Suspense>
|
|
732
812
|
),
|
|
733
813
|
},
|
|
734
814
|
{
|
|
735
815
|
id: "access",
|
|
736
816
|
label: "Access",
|
|
737
817
|
icon: IconShieldLock,
|
|
818
|
+
group: "agent",
|
|
738
819
|
keywords: "external clients oauth a2a exposure",
|
|
739
820
|
searchEntries: [
|
|
740
821
|
{
|
|
@@ -757,8 +838,9 @@ export function AgentTabsPage({
|
|
|
757
838
|
),
|
|
758
839
|
},
|
|
759
840
|
...extraTabs,
|
|
841
|
+
...scopedExtraTabs,
|
|
760
842
|
],
|
|
761
|
-
[canManageOrg, extraTabs, scope],
|
|
843
|
+
[appName, canManageOrg, extraTabs, scope, scopedExtraTabs],
|
|
762
844
|
);
|
|
763
845
|
const visibleTabs = useMemo(
|
|
764
846
|
() => tabs.filter((tab) => !normalizedHiddenTabs.has(tab.id)),
|
|
@@ -786,22 +868,6 @@ export function AgentTabsPage({
|
|
|
786
868
|
return groups;
|
|
787
869
|
}, [visibleTabs]);
|
|
788
870
|
|
|
789
|
-
useEffect(() => {
|
|
790
|
-
if (scopeInitialized.current || orgLoading) return;
|
|
791
|
-
scopeInitialized.current = true;
|
|
792
|
-
if (!hasOrg && scope === "org") setScope("user");
|
|
793
|
-
}, [hasOrg, orgLoading, scope]);
|
|
794
|
-
|
|
795
|
-
useEffect(() => {
|
|
796
|
-
if (orgLoading) return;
|
|
797
|
-
const resolvedScope = hasOrg ? scope : "user";
|
|
798
|
-
if (resolvedScope !== scope) {
|
|
799
|
-
setScope(resolvedScope);
|
|
800
|
-
return;
|
|
801
|
-
}
|
|
802
|
-
updateScopeUrl(resolvedScope);
|
|
803
|
-
}, [hasOrg, orgLoading, scope]);
|
|
804
|
-
|
|
805
871
|
useEffect(() => {
|
|
806
872
|
if (!isControlled && !visibleTabs.some((tab) => tab.id === internalTab)) {
|
|
807
873
|
setInternalTab(fallbackTab);
|
|
@@ -826,15 +892,6 @@ export function AgentTabsPage({
|
|
|
826
892
|
[isControlled, onValueChange],
|
|
827
893
|
);
|
|
828
894
|
|
|
829
|
-
const changeScope = (next: AgentPageScope) => {
|
|
830
|
-
if (next === "org" && !hasOrg) return;
|
|
831
|
-
setScope(next);
|
|
832
|
-
try {
|
|
833
|
-
localStorage.setItem("agent-page-scope", next);
|
|
834
|
-
} catch {}
|
|
835
|
-
updateScopeUrl(next);
|
|
836
|
-
};
|
|
837
|
-
|
|
838
895
|
const searchIndex = useMemo(() => {
|
|
839
896
|
const entries: Array<
|
|
840
897
|
SettingsSearchEntry & { tabId: string; haystack: string }
|
|
@@ -893,62 +950,6 @@ export function AgentTabsPage({
|
|
|
893
950
|
className,
|
|
894
951
|
)}
|
|
895
952
|
>
|
|
896
|
-
<header className="flex shrink-0 flex-wrap items-center justify-between gap-3 border-b border-border px-4 py-3 sm:px-6">
|
|
897
|
-
<div>
|
|
898
|
-
<h1 className="text-base font-semibold text-foreground">Agent</h1>
|
|
899
|
-
<p className="mt-0.5 text-xs text-muted-foreground">
|
|
900
|
-
What can influence this agent, and why.
|
|
901
|
-
</p>
|
|
902
|
-
</div>
|
|
903
|
-
<div className="flex items-center gap-2">
|
|
904
|
-
<span className="text-xs text-muted-foreground">Scope</span>
|
|
905
|
-
<div
|
|
906
|
-
className="flex rounded-md border border-border bg-muted/30 p-0.5"
|
|
907
|
-
role="radiogroup"
|
|
908
|
-
aria-label="Agent scope"
|
|
909
|
-
>
|
|
910
|
-
<button
|
|
911
|
-
type="button"
|
|
912
|
-
role="radio"
|
|
913
|
-
aria-checked={scope !== "org" || !hasOrg}
|
|
914
|
-
onClick={() => changeScope("user")}
|
|
915
|
-
className={cn(
|
|
916
|
-
"cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium",
|
|
917
|
-
scope !== "org" || !hasOrg
|
|
918
|
-
? "bg-background text-foreground shadow-sm"
|
|
919
|
-
: "text-muted-foreground hover:text-foreground",
|
|
920
|
-
)}
|
|
921
|
-
>
|
|
922
|
-
Personal
|
|
923
|
-
</button>
|
|
924
|
-
{hasOrg && (
|
|
925
|
-
<Tooltip>
|
|
926
|
-
<TooltipTrigger asChild>
|
|
927
|
-
<button
|
|
928
|
-
type="button"
|
|
929
|
-
role="radio"
|
|
930
|
-
aria-checked={scope === "org"}
|
|
931
|
-
onClick={() => changeScope("org")}
|
|
932
|
-
className={cn(
|
|
933
|
-
"cursor-pointer rounded px-2.5 py-1.5 text-xs font-medium",
|
|
934
|
-
scope === "org"
|
|
935
|
-
? "bg-background text-foreground shadow-sm"
|
|
936
|
-
: "text-muted-foreground hover:text-foreground",
|
|
937
|
-
)}
|
|
938
|
-
>
|
|
939
|
-
Organization
|
|
940
|
-
</button>
|
|
941
|
-
</TooltipTrigger>
|
|
942
|
-
{!canManageOrg && (
|
|
943
|
-
<TooltipContent>
|
|
944
|
-
Organization settings are read-only for members.
|
|
945
|
-
</TooltipContent>
|
|
946
|
-
)}
|
|
947
|
-
</Tooltip>
|
|
948
|
-
)}
|
|
949
|
-
</div>
|
|
950
|
-
</div>
|
|
951
|
-
</header>
|
|
952
953
|
<div className="flex min-h-0 flex-1 flex-col sm:flex-row">
|
|
953
954
|
<div className="flex shrink-0 flex-col gap-2 bg-background p-2 sm:min-h-0 sm:w-56 sm:overflow-y-auto sm:p-3">
|
|
954
955
|
{enableSearch ? (
|
|
@@ -990,7 +991,7 @@ export function AgentTabsPage({
|
|
|
990
991
|
>
|
|
991
992
|
{results.length === 0 ? (
|
|
992
993
|
<p className="px-2 py-6 text-center text-xs text-muted-foreground">
|
|
993
|
-
No matching agent
|
|
994
|
+
No matching agent workspace items
|
|
994
995
|
</p>
|
|
995
996
|
) : (
|
|
996
997
|
results.map((entry) => (
|
|
@@ -1028,6 +1029,16 @@ export function AgentTabsPage({
|
|
|
1028
1029
|
"sm:mt-2 sm:border-t sm:border-border/60 sm:pt-2",
|
|
1029
1030
|
)}
|
|
1030
1031
|
>
|
|
1032
|
+
{group.id === "resources" && (
|
|
1033
|
+
<div className="hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block">
|
|
1034
|
+
Agent resources
|
|
1035
|
+
</div>
|
|
1036
|
+
)}
|
|
1037
|
+
{group.id === "agent" && (
|
|
1038
|
+
<div className="hidden px-2.5 pb-1 pt-1 text-[10px] font-semibold uppercase tracking-[0.16em] text-muted-foreground/50 sm:block">
|
|
1039
|
+
Agent operations
|
|
1040
|
+
</div>
|
|
1041
|
+
)}
|
|
1031
1042
|
<div className="contents sm:flex sm:flex-col sm:gap-1">
|
|
1032
1043
|
{group.tabs.map((tab) => {
|
|
1033
1044
|
const Icon = tab.icon as SettingsTabIcon | undefined;
|
|
@@ -1036,6 +1047,7 @@ export function AgentTabsPage({
|
|
|
1036
1047
|
<button
|
|
1037
1048
|
key={tab.id}
|
|
1038
1049
|
type="button"
|
|
1050
|
+
id={`agent-tab-${tab.id}`}
|
|
1039
1051
|
role="tab"
|
|
1040
1052
|
aria-selected={selected}
|
|
1041
1053
|
aria-controls={`agent-tabpanel-${tab.id}`}
|