@agent-native/core 0.98.0 → 0.98.2
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 +32 -0
- package/corpus/core/docs/content/locales/ar-SA/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/pr-visual-recap.mdx +25 -1
- package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +1 -1
- package/corpus/core/docs/content/pr-visual-recap.mdx +50 -1
- package/corpus/core/docs/content/template-plan.mdx +1 -1
- package/corpus/core/package.json +2 -2
- package/corpus/core/src/action-change-marker.ts +8 -1
- package/corpus/core/src/changelog/parse.ts +8 -3
- package/corpus/core/src/cli/plan-local.ts +43 -11
- package/corpus/core/src/cli/pr-visual-recap-workflow.ts +2 -9
- package/corpus/core/src/cli/recap.ts +356 -4
- package/corpus/core/src/cli/skills-content/local-files.ts +17 -12
- package/corpus/core/src/client/AgentPanel.tsx +2 -3
- package/corpus/core/src/client/AssistantChat.tsx +83 -39
- package/corpus/core/src/client/analytics.ts +125 -14
- package/corpus/core/src/client/blocks/library/wireframe-kit.tsx +16 -2
- package/corpus/core/src/client/chat-model-groups.ts +28 -0
- package/corpus/core/src/client/composer/RealtimeVoiceMode.tsx +442 -85
- package/corpus/core/src/client/composer/TiptapComposer.tsx +46 -29
- package/corpus/core/src/client/composer/VoiceButton.tsx +2 -1
- package/corpus/core/src/client/composer/index.ts +5 -0
- package/corpus/core/src/client/composer/useRealtimeVoiceMode.tsx +1206 -67
- package/corpus/core/src/client/index.ts +10 -0
- package/corpus/core/src/client/progress/RunsTray.tsx +13 -1
- package/corpus/core/src/client/session-replay.ts +10 -0
- package/corpus/core/src/client/settings/DemoModeSection.tsx +4 -28
- package/corpus/core/src/client/settings/SecretsSection.tsx +387 -266
- package/corpus/core/src/client/settings/SettingsPanel.tsx +117 -38
- package/corpus/core/src/client/url-scrub.ts +13 -0
- package/corpus/core/src/client/use-action.ts +12 -0
- package/corpus/core/src/client/use-agent-chat-home-handoff.ts +8 -1
- package/corpus/core/src/client/use-agent-engine-configured.ts +17 -3
- package/corpus/core/src/client/use-db-sync.ts +84 -34
- package/corpus/core/src/client/use-demo-mode-status.ts +44 -0
- package/corpus/core/src/client/use-pausing-interval.ts +14 -4
- package/corpus/core/src/integrations/scope-store.ts +1 -1
- package/corpus/core/src/integrations/usage-budget-store.ts +1 -1
- package/corpus/core/src/localization/default-messages.ts +44 -1
- package/corpus/core/src/mcp-client/workspace-servers.ts +4 -4
- package/corpus/core/src/secrets/crypto.ts +28 -8
- package/corpus/core/src/server/action-change.ts +5 -1
- package/corpus/core/src/server/action-routes.ts +8 -0
- package/corpus/core/src/server/poll.ts +1 -0
- package/corpus/core/src/server/realtime-voice.ts +299 -13
- package/corpus/core/src/styles/agent-native.css +2 -2
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +7 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +39 -9
- package/corpus/core/src/vite/client.ts +9 -1
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +10 -5
- package/corpus/templates/analytics/AGENTS.md +17 -13
- package/corpus/templates/analytics/actions/navigate.ts +59 -5
- package/corpus/templates/analytics/actions/view-screen.ts +3 -6
- package/corpus/templates/analytics/app/components/ProviderCorpusJobNotifier.tsx +20 -3
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +20 -5
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +21 -6
- package/corpus/templates/analytics/app/global.css +19 -20
- package/corpus/templates/analytics/app/lib/demo-chart-trend.ts +156 -0
- package/corpus/templates/analytics/app/lib/provider-corpus-job-sync.ts +26 -0
- package/corpus/templates/analytics/app/pages/Settings.tsx +35 -341
- package/corpus/templates/analytics/app/pages/monitoring/ErrorsPanel.tsx +38 -7
- package/corpus/templates/analytics/app/pages/monitoring/MonitoringPage.tsx +1 -1
- package/corpus/templates/analytics/app/pages/monitoring/errors/i18n.ts +3 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +333 -272
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +72 -17
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +297 -108
- package/corpus/templates/analytics/app/root.tsx +28 -8
- package/corpus/templates/analytics/changelog/2026-06-24-first-party-signup-and-pageview-panels-now-honor-dashboard-filters.md +2 -1
- package/corpus/templates/analytics/changelog/2026-06-25-referrer-dashboard-panels-show-external-domains.md +2 -1
- package/corpus/templates/analytics/changelog/2026-07-06-mobile-chat-header-is-more-compact-and-the-menu-button-opens-navigation.md +1 -0
- package/corpus/templates/analytics/changelog/2026-07-08-dashboard-history-and-chat-context.md +1 -0
- package/corpus/templates/analytics/changelog/2026-07-08-settings-are-cleaner-searchable-and-alerts-have-their-own-tab.md +1 -0
- package/corpus/templates/analytics/changelog/2026-07-08-sidebar-sections-stay-collapsed-until-opened.md +1 -0
- package/corpus/templates/analytics/changelog/2026-07-11-analytics-no-longer-repeatedly-restarts-background-requests-.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-analytics-only-asks-for-replay-storage-when-you-enable-sessi.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-charts-now-show-their-loading-skeleton-while-refreshing.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-realtime-voice-now-shows-a-clear-connection-indicator-comple.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-replay-event-counts-stay-hidden-until-recordings-finish-load.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-replay-storage-key-mismatches-show-actionable-setup-guidance.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-replay-timelines-group-continuous-scrolling-and-dev-tools-co.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-session-filters-now-stay-compact-in-a-settings-menu-at-mediu.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-session-replay-console-errors-now-link-to-matching-issues-or.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-session-replays-load-large-recordings-faster-and-surface-fai.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-session-replays-preserve-recorded-styles-and-viewport-layout.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-11-session-replays-stay-centered-instead-of-clipping-wide-recor.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-daily-dashboard-emails-reliably-include-the-complete-dashboa.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-12-demo-mode-charts-trend-upward.md +6 -0
- package/corpus/templates/analytics/package.json +1 -1
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +1 -303
- package/corpus/templates/analytics/server/handlers/session-replay.ts +57 -0
- package/corpus/templates/analytics/server/jobs/dashboard-report.ts +2 -0
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
- package/corpus/templates/analytics/server/lib/dashboard-report.ts +17 -33
- package/corpus/templates/analytics/server/lib/demo-dashboards.ts +16 -3
- package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +12 -0
- package/corpus/templates/analytics/server/lib/session-replay.ts +208 -2
- package/corpus/templates/analytics/server/plugins/onboarding.ts +7 -79
- package/corpus/templates/analytics/server/routes/api/session-replay/recordings/[recordingId]/chunks.get.ts +1 -0
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/assets/app/global.css +4 -4
- package/corpus/templates/assets/app/routes/brand-kits.$id.tsx +0 -1
- package/corpus/templates/assets/app/routes/library.tsx +0 -1
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/brain/app/global.css +5 -5
- package/corpus/templates/brain/app/root.tsx +0 -3
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/calendar/app/root.tsx +1 -0
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/clips/app/components/player/video-player.tsx +5 -1
- package/corpus/templates/clips/app/hooks/use-auto-title.ts +74 -8
- package/corpus/templates/clips/app/hooks/use-library.ts +12 -25
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +20 -22
- package/corpus/templates/clips/changelog/2026-07-11-clips-no-longer-stay-stuck-on-preparing-clip-when-they-are-r.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-11-generated-titles-no-longer-cause-continuous-background-refreshes.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-11-s3-storage-setup-stays-collapsed-until-you-choose-it-as-the-.md +6 -0
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/content/app/components/sidebar/DocumentSidebar.tsx +2 -2
- package/corpus/templates/content/app/hooks/use-comments.ts +0 -1
- package/corpus/templates/content/changelog/2026-07-11-comments-now-update-from-live-collaboration-events-without-c.md +6 -0
- package/corpus/templates/content/changelog/2026-07-12-the-left-sidebar-stays-fixed-horizontally-while-scrolling-on.md +6 -0
- package/corpus/templates/design/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/macros/app/components/layout/AppLayout.tsx +1 -2
- package/corpus/templates/macros/app/root.tsx +0 -3
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/mail/app/hooks/use-compose-state.ts +1 -0
- package/corpus/templates/mail/app/root.tsx +1 -12
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/corpus/templates/plan/.agents/skills/visual-plan/references/local-files.md +17 -12
- package/corpus/templates/plan/.agents/skills/visual-recap/references/local-files.md +17 -12
- package/corpus/templates/plan/actions/validate-local-plan-source.ts +4 -4
- package/corpus/templates/plan/app/components/layout/Sidebar.tsx +2 -1
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +5 -2
- package/corpus/templates/plan/app/hooks/use-plans.ts +6 -13
- package/corpus/templates/plan/app/lib/plan-local-bridge.ts +41 -0
- package/corpus/templates/plan/app/lib/plan-tracking.ts +3 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +14 -36
- package/corpus/templates/plan/app/root.tsx +13 -3
- package/corpus/templates/plan/changelog/2026-07-11-plan-refreshes-only-when-content-changes.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-12-local-plan-source-now-stays-on-device.md +6 -0
- package/corpus/templates/slides/app/components/comments/SlideCommentsPanel.tsx +4 -1
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +1 -1
- package/corpus/templates/slides/app/components/layout/Header.tsx +1 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +1 -0
- package/corpus/templates/slides/app/hooks/use-slide-comments.ts +7 -31
- package/corpus/templates/slides/changelog/2026-07-11-comments-now-update-from-live-collaboration-events-without-c.md +6 -0
- package/dist/action-change-marker.d.ts +1 -0
- package/dist/action-change-marker.d.ts.map +1 -1
- package/dist/action-change-marker.js +7 -1
- package/dist/action-change-marker.js.map +1 -1
- package/dist/changelog/parse.d.ts +4 -2
- package/dist/changelog/parse.d.ts.map +1 -1
- package/dist/changelog/parse.js +5 -3
- package/dist/changelog/parse.js.map +1 -1
- package/dist/cli/plan-local.d.ts +6 -6
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +36 -7
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.d.ts +2 -8
- package/dist/cli/pr-visual-recap-workflow.d.ts.map +1 -1
- package/dist/cli/pr-visual-recap-workflow.js +2 -8
- package/dist/cli/pr-visual-recap-workflow.js.map +1 -1
- package/dist/cli/recap.d.ts +22 -1
- package/dist/cli/recap.d.ts.map +1 -1
- package/dist/cli/recap.js +286 -2
- package/dist/cli/recap.js.map +1 -1
- package/dist/cli/skills-content/local-files.d.ts +1 -1
- package/dist/cli/skills-content/local-files.d.ts.map +1 -1
- package/dist/cli/skills-content/local-files.js +17 -12
- package/dist/cli/skills-content/local-files.js.map +1 -1
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +2 -3
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +7 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +62 -40
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/analytics.d.ts +8 -0
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +103 -13
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/blocks/library/wireframe-kit.d.ts +2 -0
- package/dist/client/blocks/library/wireframe-kit.d.ts.map +1 -1
- package/dist/client/blocks/library/wireframe-kit.js +9 -2
- package/dist/client/blocks/library/wireframe-kit.js.map +1 -1
- package/dist/client/chat-model-groups.d.ts.map +1 -1
- package/dist/client/chat-model-groups.js +24 -0
- package/dist/client/chat-model-groups.js.map +1 -1
- package/dist/client/composer/RealtimeVoiceMode.d.ts +40 -4
- package/dist/client/composer/RealtimeVoiceMode.d.ts.map +1 -1
- package/dist/client/composer/RealtimeVoiceMode.js +172 -42
- package/dist/client/composer/RealtimeVoiceMode.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts +4 -0
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +47 -29
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/composer/VoiceButton.d.ts.map +1 -1
- package/dist/client/composer/VoiceButton.js +2 -2
- package/dist/client/composer/VoiceButton.js.map +1 -1
- package/dist/client/composer/index.d.ts +2 -2
- package/dist/client/composer/index.d.ts.map +1 -1
- package/dist/client/composer/index.js +1 -1
- package/dist/client/composer/index.js.map +1 -1
- package/dist/client/composer/useRealtimeVoiceMode.d.ts +100 -3
- package/dist/client/composer/useRealtimeVoiceMode.d.ts.map +1 -1
- package/dist/client/composer/useRealtimeVoiceMode.js +952 -51
- package/dist/client/composer/useRealtimeVoiceMode.js.map +1 -1
- package/dist/client/index.d.ts +3 -2
- 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/progress/RunsTray.d.ts.map +1 -1
- package/dist/client/progress/RunsTray.js +10 -1
- package/dist/client/progress/RunsTray.js.map +1 -1
- package/dist/client/session-replay.d.ts +2 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +7 -0
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/DemoModeSection.d.ts.map +1 -1
- package/dist/client/settings/DemoModeSection.js +4 -23
- package/dist/client/settings/DemoModeSection.js.map +1 -1
- package/dist/client/settings/SecretsSection.d.ts +2 -3
- package/dist/client/settings/SecretsSection.d.ts.map +1 -1
- package/dist/client/settings/SecretsSection.js +46 -22
- package/dist/client/settings/SecretsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts +9 -0
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +46 -12
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/url-scrub.d.ts.map +1 -1
- package/dist/client/url-scrub.js +14 -0
- package/dist/client/url-scrub.js.map +1 -1
- package/dist/client/use-action.d.ts +2 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +10 -0
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-agent-chat-home-handoff.d.ts +2 -0
- package/dist/client/use-agent-chat-home-handoff.d.ts.map +1 -1
- package/dist/client/use-agent-chat-home-handoff.js +7 -1
- package/dist/client/use-agent-chat-home-handoff.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +17 -3
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +8 -2
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +57 -32
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/use-demo-mode-status.d.ts +12 -0
- package/dist/client/use-demo-mode-status.d.ts.map +1 -0
- package/dist/client/use-demo-mode-status.js +30 -0
- package/dist/client/use-demo-mode-status.js.map +1 -0
- package/dist/client/use-pausing-interval.d.ts.map +1 -1
- package/dist/client/use-pausing-interval.js +16 -4
- package/dist/client/use-pausing-interval.js.map +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/integrations/scope-store.js +1 -1
- package/dist/integrations/scope-store.js.map +1 -1
- package/dist/integrations/usage-budget-store.js +1 -1
- package/dist/integrations/usage-budget-store.js.map +1 -1
- package/dist/localization/default-messages.d.ts +41 -1
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +41 -1
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/workspace-servers.js +4 -4
- package/dist/mcp-client/workspace-servers.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/progress/routes.d.ts +1 -1
- package/dist/provider-api/corpus-jobs.d.ts +2 -2
- package/dist/resources/handlers.d.ts +3 -3
- package/dist/secrets/crypto.d.ts +7 -6
- package/dist/secrets/crypto.d.ts.map +1 -1
- package/dist/secrets/crypto.js +30 -11
- package/dist/secrets/crypto.js.map +1 -1
- package/dist/server/action-change.d.ts +1 -0
- package/dist/server/action-change.d.ts.map +1 -1
- package/dist/server/action-change.js +4 -1
- package/dist/server/action-change.js.map +1 -1
- package/dist/server/action-routes.d.ts.map +1 -1
- package/dist/server/action-routes.js +5 -0
- package/dist/server/action-routes.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +1 -0
- package/dist/server/poll.js.map +1 -1
- package/dist/server/realtime-voice.d.ts +7 -0
- package/dist/server/realtime-voice.d.ts.map +1 -1
- package/dist/server/realtime-voice.js +222 -12
- package/dist/server/realtime-voice.js.map +1 -1
- package/dist/styles/agent-native.css +2 -2
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/dist/templates/workspace-core/.agents/skills/secrets/SKILL.md +7 -3
- package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +39 -9
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +6 -1
- package/dist/vite/client.js.map +1 -1
- package/docs/content/locales/ar-SA/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/ar-SA/template-plan.mdx +1 -1
- package/docs/content/locales/de-DE/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/de-DE/template-plan.mdx +1 -1
- package/docs/content/locales/es-ES/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/es-ES/template-plan.mdx +1 -1
- package/docs/content/locales/fr-FR/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/fr-FR/template-plan.mdx +1 -1
- package/docs/content/locales/hi-IN/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/hi-IN/template-plan.mdx +1 -1
- package/docs/content/locales/ja-JP/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/ja-JP/template-plan.mdx +1 -1
- package/docs/content/locales/ko-KR/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/ko-KR/template-plan.mdx +1 -1
- package/docs/content/locales/pt-BR/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/pt-BR/template-plan.mdx +1 -1
- package/docs/content/locales/zh-CN/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/zh-CN/template-plan.mdx +1 -1
- package/docs/content/locales/zh-TW/pr-visual-recap.mdx +25 -1
- package/docs/content/locales/zh-TW/template-plan.mdx +1 -1
- package/docs/content/pr-visual-recap.mdx +50 -1
- package/docs/content/template-plan.mdx +1 -1
- package/package.json +2 -2
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +2 -2
- package/src/templates/workspace-core/.agents/skills/secrets/SKILL.md +7 -3
- package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +39 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"default-messages.js","sourceRoot":"","sources":["../../src/localization/default-messages.ts"],"names":[],"mappings":"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","sourcesContent":["// Canonical English catalog used by core UI for translation fallbacks.\n// Lives under src/ so tsc emits it to dist/*.js and Node's strict ESM resolver\n// can load it during SSR. Do not import core runtime code from src/templates:\n// templates ship as verbatim copy-only scaffolding (.ts), so their compiled\n// .js never exists in dist.\nconst messages = {\n home: {\n settingsTitle: \"Settings\",\n settingsDescription: \"Language and agent preferences\",\n title: \"Your app is running\",\n intro: \"Start building by editing\",\n actionCardTitle: \"Action-backed data\",\n loadingAction: \"Loading action result...\",\n docsTitle: \"Documentation\",\n docsDescription: \"Learn the framework\",\n themeTitle: \"Theme\",\n themeDescription: \"Toggle dark / light\",\n },\n settings: {\n title: \"Settings\",\n description: \"Language and workspace preferences for this app.\",\n languageTitle: \"Language\",\n languageDescription:\n \"Choose the interface language. This preference is saved for your account.\",\n languageLabel: \"Interface language\",\n agentTitle: \"Agent settings\",\n agentDescription:\n \"Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.\",\n openAgentSettings: \"Open agent settings\",\n workspaceTitle: \"Workspace\",\n workspaceDescription: \"Manage team access and shared workspace resources.\",\n openTeamSettings: \"Open team settings\",\n openResourceSettings: \"Open resource settings\",\n backHome: \"Back to home\",\n },\n dispatch: {\n nav: {\n chat: \"Chat\",\n overview: \"Overview\",\n apps: \"Apps\",\n metrics: \"Metrics\",\n vault: \"Vault\",\n integrations: \"Integrations\",\n agents: \"Agents\",\n resources: \"Resources\",\n messaging: \"Messaging\",\n destinations: \"Destinations\",\n identities: \"Identities\",\n approvals: \"Approvals\",\n automations: \"Automations\",\n delivery: \"Delivery\",\n audit: \"Audit\",\n dreams: \"Dreams\",\n threadDebug: \"Thread Debug\",\n settings: \"Settings\",\n team: \"Team\",\n operations: \"Operations\",\n navigation: \"Navigation\",\n navigationDescription: \"Workspace navigation links\",\n },\n sidebar: {\n workspaceControlPlane: \"Workspace control plane\",\n workspaceSubtitle_one: \"Workspace · {{count}} app\",\n workspaceSubtitle_other: \"Workspace · {{count}} apps\",\n chats: \"Chats\",\n newChat: \"New chat\",\n newDispatchChat: \"New Dispatch chat\",\n renameChat: \"Rename chat\",\n renameThread: \"Rename {{title}}\",\n chatOptions: \"Chat options for {{title}}\",\n aboutPage: \"About {{title}}\",\n emptyAgentText:\n \"Create apps, manage vault keys, and route work across the workspace.\",\n suggestionBuildApp: \"Build a workspace app for X\",\n suggestionRouteSlack: \"Route Slack mentions to my analytics app\",\n suggestionGrantKey: \"Grant my OpenAI key to this app\",\n },\n pages: {\n appsDescription:\n \"Open workspace apps and start new app creation from Dispatch.\",\n appsDescriptionWithWorkspace:\n 'Apps in the \"{{workspace}}\" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',\n appsInWorkspace: \"Apps in {{workspace}}\",\n workspaceApps: \"Workspace apps\",\n activeCount: \"{{count}} active\",\n hiddenCount: \"{{count}} hidden\",\n createApp: \"Create app\",\n templates: \"Templates\",\n checkingTemplates: \"Checking available templates\",\n templatesAvailable: \"{{count}} available to scaffold\",\n hide: \"Hide\",\n show: \"Show\",\n hiddenApps: \"Hidden apps\",\n hiddenAppCount: \"{{count}} hidden apps\",\n workspaceAppFallback: \"Workspace App\",\n workspaceAppDescription:\n \"Open a deployed app or check the status of an app being created.\",\n pageNotFound: \"Page not found\",\n pageNotFoundDescription:\n \"This route is not in the workspace app list yet.\",\n browseApps: \"Browse apps\",\n newApp: \"New App\",\n newAppDescription:\n \"Create a workspace app from a prompt and apply the workspace vault policy.\",\n destinationsDescription:\n \"Saved outbound Slack channels, Telegram chats, and thread targets.\",\n savedDestinations: \"Saved destinations\",\n addDestination: \"Add destination\",\n quickTestMessage: \"Quick test message\",\n send: \"Send\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n messageSent: \"Message sent\",\n unableToSendMessage: \"Unable to send message\",\n destinationSaved: \"Destination saved\",\n destinationRemoved: \"Destination removed\",\n deleteDestinationTitle: \"Delete destination?\",\n deleteDestinationDescription:\n '\"{{name}}\" will be removed. Any saved workflows or jobs that target this destination will start failing on the next send.',\n noDestinations:\n \"No destinations saved yet. Add your first Slack channel or Telegram chat on the right.\",\n dailyDigestChannel: \"Daily digest channel\",\n optionalThreadOrTopicId: \"Optional thread or topic id\",\n destinationNotes: \"What should use this destination?\",\n saveDestination: \"Save destination\",\n noWorkspaceApps: \"No workspace apps yet\",\n noWorkspaceAppsDescription:\n \"Create an app when a workflow needs its own focused place to live.\",\n appNotFound: \"App not found\",\n building: \"Building\",\n appBuildingPrefix: \"This app is being created. It will be available at\",\n appBuildingSuffix:\n \"after its branch is merged and the workspace deploy finishes.\",\n branch: \"Branch: {{branch}}\",\n openBuilderBranch: \"Open Builder branch\",\n openingApp: \"Opening {{name}}\",\n redirectingTo: \"Redirecting to\",\n openApp: \"Open app\",\n notDispatchOrWorkspaceApp:\n \" a Dispatch tab or a workspace app in this workspace.\",\n agentsDescription:\n \"Dispatch can delegate to the built-in app suite over A2A by default. Add extra agents here only if you want to route work to apps outside that built-in set.\",\n mcpAccessUpdated: \"MCP app access updated\",\n selectAppForMcp: \"Select at least one app, or expose all apps.\",\n mcpUrlCopied: \"MCP URL copied\",\n mcpUrlCopyFailed: \"Could not copy MCP URL\",\n unifiedMcpGateway: \"Unified MCP gateway\",\n unifiedMcpGatewayDescription:\n \"Connect external agents to Dispatch once, then route to granted workspace apps through\",\n allApps: \"All apps\",\n selectedApps: \"Selected apps\",\n loading: \"Loading\",\n grantedCount: \"{{count}} granted\",\n exposeAllAppsMcp: \"Expose all apps through Dispatch MCP\",\n copyUrl: \"Copy URL\",\n metricsUnavailable: \"Metrics unavailable\",\n unableToLoadUsage: \"Unable to load usage.\",\n metricsDescriptionBuilder:\n \"Workspace-wide Builder.io credit spend, chat volume, user activity, and app access.\",\n metricsDescriptionLlm:\n \"Workspace-wide LLM spend, chat volume, user activity, and app access.\",\n llmCalls: \"LLM calls\",\n activeUsers: \"Active users\",\n workspaceAppsStat: \"Workspace apps\",\n chatThreads: \"Chat threads\",\n also: \"Also\",\n workspaceShortcutsAria: \"Workspace shortcuts\",\n deliveryQueue: \"Delivery queue\",\n failedLastHour: \"{{count}} failed in the last hour\",\n processingCount: \"{{count}} processing\",\n queued: \"Queued\",\n active: \"Active\",\n done1h: \"Done 1h\",\n failed1h: \"Failed 1h\",\n oldestQueued: \"Oldest queued: {{age}}\",\n queueAgeNone: \"none\",\n queueFailureHint:\n \"Check credentials, destinations, and recent queue errors.\",\n unknownPlatform: \"unknown\",\n attemptsCount: \"{{count}} attempts\",\n noErrorMessage: \"(no error message)\",\n },\n },\n agentPanel: {\n useBuilder: \"Use Builder\",\n openDesktopToEditCode: \"Open Desktop to edit code\",\n codeUnavailableDescription:\n \"Source-code changes and CLI access are available in the Agent Native Desktop app.\",\n downloadDesktop: \"Download Desktop\",\n chatMode: \"Chat mode\",\n chat: \"Chat\",\n cliTerminalMode: \"CLI terminal mode\",\n cli: \"CLI\",\n workspaceMode: \"Workspace files, agents, skills, and tasks\",\n workspace: \"Workspace\",\n newChat: \"New chat\",\n newTerminal: \"New terminal\",\n panelOptions: \"Agent panel options\",\n collapseSidebar: \"Collapse sidebar\",\n hideChats: \"Hide chats\",\n allChats: \"All chats\",\n settings: \"Settings\",\n feedback: \"Feedback\",\n exitFullscreen: \"Exit fullscreen\",\n fullscreen: \"Fullscreen\",\n closeTab: \"Close tab\",\n closeOtherTabs: \"Close other tabs\",\n closeAllTabs: \"Close all tabs\",\n clearChat: \"Clear chat\",\n cliRequiresDevMode: \"CLI requires dev mode\",\n cliRequiresDevModeDescription:\n \"Run this app locally with pnpm dev or use Builder.io to access the CLI terminal.\",\n toggleAgent: \"Toggle agent\",\n voiceMode: {\n entryButtonLabel: \"Use microphone\",\n promptTitle: \"Talk to your app\",\n promptDescription:\n \"Voice mode keeps listening while the agent navigates and takes actions.\",\n setupTitle: \"Set up voice mode\",\n setupDescription:\n \"Connect Builder to use managed voice with free credits, or use your own OpenAI API key.\",\n connectBuilder: \"Connect Builder\",\n useOpenAiKey: \"Use OpenAI API key\",\n startWithOpenAiKey: \"Start with OpenAI key\",\n start: \"Start voice mode\",\n keepDictating: \"Keep dictating\",\n showChat: \"Show chat\",\n hideChat: \"Hide chat\",\n end: \"End voice mode\",\n microphoneSettings: \"Microphone settings\",\n status: {\n connecting: \"Connecting\",\n listening: \"Listening\",\n speaking: \"Speaking\",\n working: \"Working\",\n error: \"Voice mode needs attention\",\n ending: \"Ending voice mode\",\n },\n errors: {\n unsupported:\n \"This browser does not support realtime voice conversations.\",\n responseFailed: \"OpenAI could not complete the voice response.\",\n sessionFailed: \"The realtime voice session encountered an error.\",\n channelDisconnected: \"The realtime voice control channel disconnected.\",\n connectionFailed: \"The realtime voice connection failed.\",\n offerFailed: \"The browser did not create an audio offer.\",\n },\n },\n },\n share: {\n titleWithResource: 'Share \"{{title}}\"',\n titleWithType: \"Share {{type}}\",\n owner: \"Owner: {{name}}\",\n close: \"Close\",\n shareOptions: \"Share options\",\n link: \"Link\",\n invite: \"Invite\",\n embed: \"Embed\",\n done: \"Done\",\n generalAccess: \"General access\",\n shareLink: \"Share link\",\n addPeopleByEmail: \"Add people by email\",\n notifyPeople: \"Notify people\",\n peopleWithAccess: \"People with access\",\n ownerRole: \"Owner\",\n remove: \"Remove\",\n noAccess: \"No one has access yet.\",\n embedUrl: \"Embed URL\",\n embedCode: \"Embed code\",\n copy: \"Copy\",\n role: \"Role\",\n private: \"Private\",\n privateDescription: \"Only people with access can view\",\n organization: \"Organization\",\n organizationDescription: \"Anyone in your organization can view\",\n public: \"Public\",\n publicDescription: \"Anyone signed in with the link can view\",\n viewer: \"Viewer\",\n viewerDescription: \"Can view\",\n editor: \"Editor\",\n editorDescription: \"Can edit\",\n admin: \"Admin\",\n adminDescription: \"Can edit and manage access\",\n },\n runsTray: {\n runs: \"Runs\",\n agentRuns: \"Agent runs\",\n activeRun_one: \"{{count}} active run\",\n activeRun_other: \"{{count}} active runs\",\n failedRun_one: \"{{count}} failed run\",\n failedRun_other: \"{{count}} failed runs\",\n recentRuns: \"Recent runs\",\n noRecentRuns: \"No recent runs\",\n ariaAgentRuns: \"Agent runs, {{label}}\",\n summaryRunning: \"{{activeCount}} running\",\n summaryRunningRecent: \"{{activeCount}} running · {{terminalCount}} recent\",\n summaryRecent_one: \"{{count}} recent run\",\n summaryRecent_other: \"{{count}} recent runs\",\n noTrackedWorkYet: \"No tracked work yet\",\n emptyDescription:\n \"Background agent work will appear here while it runs and after it finishes.\",\n open: \"Open\",\n stopRun: \"Stop {{title}}\",\n hideRun: \"Hide {{title}}\",\n statusRunning: \"Running\",\n statusDone: \"Done\",\n statusFailed: \"Failed\",\n statusStopped: \"Stopped\",\n updatedJustNow: \"Updated just now\",\n finishedJustNow: \"Finished just now\",\n updatedMinutes: \"Updated {{count}}m ago\",\n finishedMinutes: \"Finished {{count}}m ago\",\n updatedHours: \"Updated {{count}}h ago\",\n finishedHours: \"Finished {{count}}h ago\",\n updatedDate: \"Updated {{date}}\",\n finishedDate: \"Finished {{date}}\",\n },\n codeRequired: {\n fallbackDetail:\n \"Edit locally or use Builder.io to edit this code in the cloud and continue customizing the app any way you like.\",\n defaultFeature: \"Make the requested code changes to this app\",\n branchError: \"Failed to create branch\",\n title: \"Code changes required\",\n subtitleWithFeature:\n '\"{{feature}}\" creates or modifies source code, which needs Desktop or Builder from this surface.',\n subtitle:\n \"This action creates or modifies source code, which needs Desktop or Builder from this surface.\",\n desktopTitle: \"Use Agent Native Desktop\",\n desktopDescription:\n \"Open the project in the desktop app to enable source edits and CLI access.\",\n builderAgentTitle: \"Use Builder.io Agent\",\n builderAgentDescription:\n \"Let our cloud agent make the changes for you. You'll get a link to preview and deploy.\",\n codeChangeTitle: \"This requires a code change\",\n codeChangeBadge: \"Code change\",\n connectBuilderTitle: \"Connect Builder.io\",\n connectBuilderDescription:\n \"Connect Builder to enable cloud-based code changes from this app.\",\n setupRequired: \"Setup required\",\n branchCreated: \"Branch created\",\n close: \"Close\",\n },\n extensions: {\n createPrompt: \"Create an extension: {{prompt}}\",\n createWidgetPrompt:\n 'Create a new widget that fits in slot \"{{slotId}}\". I\\'ll describe what it should do next.',\n whatShouldItDo: \"What should it do?\",\n createPlaceholder: \"A todo list, API dashboard, calculator...\",\n title: \"Extensions\",\n hiddenShown: \"Hiding shown\",\n showHidden: \"Show hidden\",\n newExtension: \"New Extension\",\n newExtensionTitle: \"New extension\",\n buildPlaceholder: \"Describe what you'd like to build...\",\n namePlaceholder: \"My Extension\",\n descriptionPlaceholder: \"What does this extension do?\",\n contentPlaceholder: \"<html>...</html>\",\n emptyTitle: \"Create your first extension\",\n emptyDescription: \"Describe a small app and the agent will build it.\",\n hiddenFromEveryone: \"Hidden from everyone\",\n localFile: \"Local file\",\n optionsFor: \"Options for {{name}}\",\n unhideEveryone: \"Unhide for everyone\",\n hideEveryone: \"Hide from everyone\",\n localFileDescription:\n \"This extension is backed by {{entryPath}}. Edit or remove it from the workspace.\",\n deleteQuestion: \"Delete {{name}}?\",\n removeQuestion: \"Remove {{name}}?\",\n hideForYouDescription:\n \"This hides it from your Extensions list without deleting it for anyone else.\",\n removeEverywhereDescription: \"This removes it everywhere it is shared.\",\n cancel: \"Cancel\",\n remove: \"Remove\",\n removing: \"Removing...\",\n delete: \"Delete\",\n deleting: \"Deleting...\",\n openFullView: \"Open full view\",\n removeFromWidgetArea: \"Remove from this widget area\",\n deleteExtensionEllipsis: \"Delete extension...\",\n removeFromMyListEllipsis: \"Remove from my list...\",\n removeFromWidgetAreaForMe: \"Remove from this widget area (for me)\",\n deleteEverywhereConfirmation:\n \"This removes the extension everywhere, for everyone it's shared with.\",\n addWidget: \"Add widget\",\n loading: \"Loading...\",\n noWidgetsAvailable: \"No widgets available for this slot yet.\",\n buildNewWidget: \"Build a new widget\",\n contactSidebarWidget: \"Contact sidebar widget\",\n contactSidebarDescription:\n \"Appears beside the current conversation with contact and thread context.\",\n eventDetailWidget: \"Event detail widget\",\n eventDetailDescription:\n \"Appears below the open calendar event with event and attendee context.\",\n addWidgetHere: \"Add widget here\",\n back: \"Back\",\n editExtension: \"Edit Extension\",\n saving: \"Saving...\",\n save: \"Save\",\n create: \"Create\",\n moreOptions: \"More options\",\n appearsIn: \"Appears in\",\n noWidgetAreas:\n \"Not installed in any widget areas. Ask the agent to add it somewhere.\",\n widgetAreaCount_one: \"This extension can render in {{count}} widget area.\",\n widgetAreaCount_other:\n \"This extension can render in {{count}} widget areas.\",\n nameLabel: \"Name\",\n descriptionLabel: \"Description\",\n contentLabel: \"Content\",\n previewTitle: \"Extension preview\",\n previewEmpty: \"Preview will appear here\",\n loadError: \"Couldn't load extensions.\",\n widgetsLoadError: \"Couldn't load widgets.\",\n widgetAreasLoadError: \"Couldn't load widget areas.\",\n historyLoadError: \"Couldn't load extension history.\",\n versionLoadError: \"Couldn't load this extension version.\",\n retry: \"Retry\",\n },\n org: {\n createTitle: \"Create your organization\",\n createDescription:\n \"This app organizes your content by team. Create an organization to continue - you can invite teammates afterward.\",\n loadErrorTitle: \"Couldn't load organization\",\n loadErrorFallback: \"Couldn't load organization.\",\n tryAgain: \"Try again\",\n sendFeedback: \"Send feedback\",\n feedbackPlaceholder:\n \"Describe what happened before this organization error appeared.\",\n openGitHubIssue: \"Open GitHub issue\",\n yourOrganization: \"Your organization\",\n joinYourTeam: \"Join your team\",\n openToDomainEmails: \"Open to @{{domain}} emails\",\n joinOrg: \"Join {{name}}\",\n pendingInvitations: \"Pending invitations\",\n invitedBy: \"from {{name}}\",\n accept: \"Accept\",\n createSeparate: \"or create a separate organization\",\n organizationName: \"Organization name\",\n organizationPlaceholder: \"Acme Inc.\",\n createOrganization: \"Create organization\",\n create: \"Create\",\n creating: \"Creating...\",\n team: \"Team\",\n createOrgCardTitle: \"Create an Organization\",\n createOrgCardDescription:\n \"Set up a team to collaborate with your colleagues.\",\n joinDomainOne:\n \"An organization matching your email domain already exists. Join it to collaborate with your teammates.\",\n joinDomainMany:\n \"Organizations matching your email domain already exist. Join one to collaborate with your teammates.\",\n join: \"Join\",\n invitedByLabel: \"Invited by {{name}}\",\n you: \"You\",\n owner: \"Owner\",\n admin: \"Admin\",\n member: \"Member\",\n members: \"Members\",\n inviteMembers: \"Invite members\",\n invited: \"Invited\",\n role: \"Role\",\n status: \"Status\",\n actions: \"Actions\",\n noMembers: \"No members yet.\",\n memberCount_one: \"{{count}} member\",\n memberCount_other: \"{{count}} members\",\n youAreRole: \"You are {{role}}\",\n changeRole: \"Change role\",\n removeMember: \"Remove member\",\n cancel: \"Cancel\",\n remove: \"Remove\",\n save: \"Save\",\n loading: \"Loading...\",\n },\n integrations: {\n webhookUrl: \"Webhook URL\",\n copyWebhookUrl: \"Copy webhook URL\",\n notConfigured:\n \"Not configured. Set the required secrets to enable this integration.\",\n enable: \"Enable\",\n disable: \"Disable\",\n toggling: \"...\",\n networkError: \"Network error reaching the server\",\n back: \"Back\",\n agentEngineRequired: \"Agent engine required\",\n agentEngineDescription:\n \"Connect Builder.io or an LLM key before {{platform}} can answer.\",\n openLlm: \"Open LLM\",\n setup: \"Setup\",\n shareDocumentsWith: \"Share documents with\",\n copyServiceAccountEmail: \"Copy service account email\",\n requiredSecrets: \"Required secrets\",\n envHelp: \"Set these in your .env file or environment to connect.\",\n copy: \"Copy\",\n documentation: \"Documentation\",\n clientAvailable:\n \"This agent's A2A endpoint is automatically available. No configuration needed.\",\n addChatIntegration: \"Add a chat integration\",\n chatIntegrations: \"Chat Integrations\",\n chatIntegrationsDescription: \"Talk to this agent from other platforms\",\n addIntegration: \"Add integration\",\n dispatchEntrypoint:\n \"For a central Slack or Telegram entrypoint that can route work across multiple apps, use the\",\n sharedMessaging:\n \"Need one shared messaging surface for your workspace? Connect Slack or Telegram to a dispatch app and let it delegate to other agents over A2A.\",\n },\n mcpIntegrations: {\n menuLabel: \"Integrations\",\n menuDescription: \"Connect MCP tools to the agent\",\n title: \"Connect integrations\",\n description: \"Choose a default MCP integration or add a custom server.\",\n searchPlaceholder: \"Search integrations\",\n addYourOwn: \"Add your own\",\n noMatches: \"No integrations match that search.\",\n connected: \"Connected\",\n configure: \"Configure\",\n connect: \"Connect\",\n backToIntegrations: \"Back to integrations\",\n customTitle: \"Add custom MCP server\",\n configureTitle: \"Configure {{name}}\",\n presetNoAuthDescription:\n \"Preset values are filled in. Test the endpoint or connect it now.\",\n presetAuthDescription:\n \"Preset values are filled in. Add any required authorization details before connecting.\",\n customDescription:\n \"Paste a Streamable HTTP or SSE MCP endpoint and optional headers.\",\n oauthNotice:\n \"This provider usually requires an OAuth setup. Follow the provider docs, or add an Authorization header if your endpoint supports token-based access.\",\n personal: \"Personal\",\n organization: \"Organization\",\n orgNoOrg: \"Join an organization to share MCP servers\",\n orgAdminOnly: \"Only owners and admins can add org-scope servers\",\n serverName: \"Server name\",\n url: \"URL\",\n fieldDescription: \"Description\",\n headers: \"Headers\",\n serverNamePlaceholder: \"Server name\",\n urlPlaceholder: \"https://mcp.example.com/mcp\",\n descriptionPlaceholder: \"Description (optional)\",\n headersPlaceholder: \"Authorization: Bearer <token>\",\n openSetupDocs: \"Open setup docs\",\n test: \"Test\",\n toolsAvailable_one: \"{{count}} tool available\",\n toolsAvailable_other: \"{{count}} tools available\",\n failed: \"Failed\",\n docsLabel: \"View {{name}} docs\",\n catalog: {\n context7: {\n description: \"Fetch current library docs in agent chats.\",\n useCase:\n \"Documentation, technical reference, API docs, framework guides\",\n },\n sentry: {\n description: \"Inspect issues, events, and debugging data.\",\n useCase: \"Error monitoring, debugging, performance, crash reports\",\n },\n notion: {\n description: \"Search pages and team knowledge.\",\n useCase: \"Documentation, knowledge management, notes, content creation\",\n },\n semgrep: {\n description: \"Scan code for security findings.\",\n useCase: \"Security scanning, vulnerability detection, code analysis\",\n },\n linear: {\n description: \"Read and write Linear issues.\",\n useCase: \"Project management, issue tracking, planning, bug reports\",\n },\n supabase: {\n description: \"Manage data, auth, and backend services.\",\n useCase: \"Database, authentication, storage, edge functions\",\n },\n neon: {\n description: \"Work with serverless Postgres projects.\",\n useCase: \"Database management, serverless Postgres, data storage\",\n },\n stripe: {\n description: \"Manage payments, subscriptions, and customers.\",\n useCase: \"Payments, subscriptions, invoicing, customer management\",\n },\n },\n auth: {\n none: \"No auth\",\n headers: \"Header\",\n oauth: \"OAuth\",\n },\n },\n observability: {\n noData: \"No data available\",\n noConversations: \"No conversations recorded yet\",\n noEvals: \"No eval results recorded yet\",\n noExperiments: \"No experiments created yet\",\n totalRuns: \"Total runs\",\n totalCost: \"Total cost\",\n avgLatency: \"Avg latency\",\n toolSuccess: \"Tool success\",\n thumbsUp: \"Thumbs up\",\n avgEvalScore: \"Avg eval score\",\n run: \"Run\",\n model: \"Model\",\n duration: \"Duration\",\n cost: \"Cost\",\n tools: \"Tools\",\n time: \"Time\",\n failedCount: \"({{count}} failed)\",\n backToList: \"Back to list\",\n spans: \"Spans\",\n type: \"Type\",\n name: \"Name\",\n tokens: \"Tokens\",\n status: \"Status\",\n totalEvals: \"Total evals\",\n avgScore: \"Avg score\",\n scoresByCriteria: \"Scores by criteria\",\n overview: \"Overview\",\n conversations: \"Conversations\",\n evals: \"Evals\",\n experiments: \"Experiments\",\n feedback: \"Feedback\",\n variants: \"Variants\",\n created: \"Created\",\n backToExperiments: \"Back to experiments\",\n metrics: \"Metrics\",\n level: \"Level\",\n results: \"Results\",\n variant: \"Variant\",\n metric: \"Metric\",\n value: \"Value\",\n totalFeedback: \"Total feedback\",\n thumbsDown: \"Thumbs down\",\n frustration: \"Frustration\",\n thumbsUpRate: \"Thumbs up rate\",\n categories: \"Categories\",\n },\n error: {\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails:\n \"This page doesn't exist. It may have been moved or deleted.\",\n statusTitle: \"{{status}} Error\",\n goHome: \"Go home\",\n },\n};\n\nexport default messages;\n"]}
|
|
1
|
+
{"version":3,"file":"default-messages.js","sourceRoot":"","sources":["../../src/localization/default-messages.ts"],"names":[],"mappings":"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","sourcesContent":["// Canonical English catalog used by core UI for translation fallbacks.\n// Lives under src/ so tsc emits it to dist/*.js and Node's strict ESM resolver\n// can load it during SSR. Do not import core runtime code from src/templates:\n// templates ship as verbatim copy-only scaffolding (.ts), so their compiled\n// .js never exists in dist.\nconst messages = {\n home: {\n settingsTitle: \"Settings\",\n settingsDescription: \"Language and agent preferences\",\n title: \"Your app is running\",\n intro: \"Start building by editing\",\n actionCardTitle: \"Action-backed data\",\n loadingAction: \"Loading action result...\",\n docsTitle: \"Documentation\",\n docsDescription: \"Learn the framework\",\n themeTitle: \"Theme\",\n themeDescription: \"Toggle dark / light\",\n },\n settings: {\n title: \"Settings\",\n description: \"Language and workspace preferences for this app.\",\n languageTitle: \"Language\",\n languageDescription:\n \"Choose the interface language. This preference is saved for your account.\",\n languageLabel: \"Interface language\",\n agentTitle: \"Agent settings\",\n agentDescription:\n \"Open the agent sidebar settings for model, API keys, automations, voice, and other agent controls.\",\n openAgentSettings: \"Open agent settings\",\n workspaceTitle: \"Workspace\",\n workspaceDescription: \"Manage team access and shared workspace resources.\",\n openTeamSettings: \"Open team settings\",\n openResourceSettings: \"Open resource settings\",\n backHome: \"Back to home\",\n },\n dispatch: {\n nav: {\n chat: \"Chat\",\n overview: \"Overview\",\n apps: \"Apps\",\n metrics: \"Metrics\",\n vault: \"Vault\",\n integrations: \"Integrations\",\n agents: \"Agents\",\n resources: \"Resources\",\n messaging: \"Messaging\",\n destinations: \"Destinations\",\n identities: \"Identities\",\n approvals: \"Approvals\",\n automations: \"Automations\",\n delivery: \"Delivery\",\n audit: \"Audit\",\n dreams: \"Dreams\",\n threadDebug: \"Thread Debug\",\n settings: \"Settings\",\n team: \"Team\",\n operations: \"Operations\",\n navigation: \"Navigation\",\n navigationDescription: \"Workspace navigation links\",\n },\n sidebar: {\n workspaceControlPlane: \"Workspace control plane\",\n workspaceSubtitle_one: \"Workspace · {{count}} app\",\n workspaceSubtitle_other: \"Workspace · {{count}} apps\",\n chats: \"Chats\",\n newChat: \"New chat\",\n newDispatchChat: \"New Dispatch chat\",\n renameChat: \"Rename chat\",\n renameThread: \"Rename {{title}}\",\n chatOptions: \"Chat options for {{title}}\",\n aboutPage: \"About {{title}}\",\n emptyAgentText:\n \"Create apps, manage vault keys, and route work across the workspace.\",\n suggestionBuildApp: \"Build a workspace app for X\",\n suggestionRouteSlack: \"Route Slack mentions to my analytics app\",\n suggestionGrantKey: \"Grant my OpenAI key to this app\",\n },\n pages: {\n appsDescription:\n \"Open workspace apps and start new app creation from Dispatch.\",\n appsDescriptionWithWorkspace:\n 'Apps in the \"{{workspace}}\" workspace. Each app gets its own route under this workspace and shares its database, auth, and agent chat.',\n appsInWorkspace: \"Apps in {{workspace}}\",\n workspaceApps: \"Workspace apps\",\n activeCount: \"{{count}} active\",\n hiddenCount: \"{{count}} hidden\",\n createApp: \"Create app\",\n templates: \"Templates\",\n checkingTemplates: \"Checking available templates\",\n templatesAvailable: \"{{count}} available to scaffold\",\n hide: \"Hide\",\n show: \"Show\",\n hiddenApps: \"Hidden apps\",\n hiddenAppCount: \"{{count}} hidden apps\",\n workspaceAppFallback: \"Workspace App\",\n workspaceAppDescription:\n \"Open a deployed app or check the status of an app being created.\",\n pageNotFound: \"Page not found\",\n pageNotFoundDescription:\n \"This route is not in the workspace app list yet.\",\n browseApps: \"Browse apps\",\n newApp: \"New App\",\n newAppDescription:\n \"Create a workspace app from a prompt and apply the workspace vault policy.\",\n destinationsDescription:\n \"Saved outbound Slack channels, Telegram chats, and thread targets.\",\n savedDestinations: \"Saved destinations\",\n addDestination: \"Add destination\",\n quickTestMessage: \"Quick test message\",\n send: \"Send\",\n delete: \"Delete\",\n cancel: \"Cancel\",\n messageSent: \"Message sent\",\n unableToSendMessage: \"Unable to send message\",\n destinationSaved: \"Destination saved\",\n destinationRemoved: \"Destination removed\",\n deleteDestinationTitle: \"Delete destination?\",\n deleteDestinationDescription:\n '\"{{name}}\" will be removed. Any saved workflows or jobs that target this destination will start failing on the next send.',\n noDestinations:\n \"No destinations saved yet. Add your first Slack channel or Telegram chat on the right.\",\n dailyDigestChannel: \"Daily digest channel\",\n optionalThreadOrTopicId: \"Optional thread or topic id\",\n destinationNotes: \"What should use this destination?\",\n saveDestination: \"Save destination\",\n noWorkspaceApps: \"No workspace apps yet\",\n noWorkspaceAppsDescription:\n \"Create an app when a workflow needs its own focused place to live.\",\n appNotFound: \"App not found\",\n building: \"Building\",\n appBuildingPrefix: \"This app is being created. It will be available at\",\n appBuildingSuffix:\n \"after its branch is merged and the workspace deploy finishes.\",\n branch: \"Branch: {{branch}}\",\n openBuilderBranch: \"Open Builder branch\",\n openingApp: \"Opening {{name}}\",\n redirectingTo: \"Redirecting to\",\n openApp: \"Open app\",\n notDispatchOrWorkspaceApp:\n \" a Dispatch tab or a workspace app in this workspace.\",\n agentsDescription:\n \"Dispatch can delegate to the built-in app suite over A2A by default. Add extra agents here only if you want to route work to apps outside that built-in set.\",\n mcpAccessUpdated: \"MCP app access updated\",\n selectAppForMcp: \"Select at least one app, or expose all apps.\",\n mcpUrlCopied: \"MCP URL copied\",\n mcpUrlCopyFailed: \"Could not copy MCP URL\",\n unifiedMcpGateway: \"Unified MCP gateway\",\n unifiedMcpGatewayDescription:\n \"Connect external agents to Dispatch once, then route to granted workspace apps through\",\n allApps: \"All apps\",\n selectedApps: \"Selected apps\",\n loading: \"Loading\",\n grantedCount: \"{{count}} granted\",\n exposeAllAppsMcp: \"Expose all apps through Dispatch MCP\",\n copyUrl: \"Copy URL\",\n metricsUnavailable: \"Metrics unavailable\",\n unableToLoadUsage: \"Unable to load usage.\",\n metricsDescriptionBuilder:\n \"Workspace-wide Builder.io credit spend, chat volume, user activity, and app access.\",\n metricsDescriptionLlm:\n \"Workspace-wide LLM spend, chat volume, user activity, and app access.\",\n llmCalls: \"LLM calls\",\n activeUsers: \"Active users\",\n workspaceAppsStat: \"Workspace apps\",\n chatThreads: \"Chat threads\",\n also: \"Also\",\n workspaceShortcutsAria: \"Workspace shortcuts\",\n deliveryQueue: \"Delivery queue\",\n failedLastHour: \"{{count}} failed in the last hour\",\n processingCount: \"{{count}} processing\",\n queued: \"Queued\",\n active: \"Active\",\n done1h: \"Done 1h\",\n failed1h: \"Failed 1h\",\n oldestQueued: \"Oldest queued: {{age}}\",\n queueAgeNone: \"none\",\n queueFailureHint:\n \"Check credentials, destinations, and recent queue errors.\",\n unknownPlatform: \"unknown\",\n attemptsCount: \"{{count}} attempts\",\n noErrorMessage: \"(no error message)\",\n },\n },\n agentPanel: {\n useBuilder: \"Use Builder\",\n openDesktopToEditCode: \"Open Desktop to edit code\",\n codeUnavailableDescription:\n \"Source-code changes and CLI access are available in the Agent Native Desktop app.\",\n downloadDesktop: \"Download Desktop\",\n chatMode: \"Chat mode\",\n chat: \"Chat\",\n cliTerminalMode: \"CLI terminal mode\",\n cli: \"CLI\",\n workspaceMode: \"Workspace files, agents, skills, and tasks\",\n workspace: \"Workspace\",\n newChat: \"New chat\",\n newTerminal: \"New terminal\",\n panelOptions: \"Agent panel options\",\n collapseSidebar: \"Collapse sidebar\",\n hideChats: \"Hide chats\",\n allChats: \"All chats\",\n settings: \"Settings\",\n feedback: \"Feedback\",\n exitFullscreen: \"Exit fullscreen\",\n fullscreen: \"Fullscreen\",\n closeTab: \"Close tab\",\n closeOtherTabs: \"Close other tabs\",\n closeAllTabs: \"Close all tabs\",\n clearChat: \"Clear chat\",\n cliRequiresDevMode: \"CLI requires dev mode\",\n cliRequiresDevModeDescription:\n \"Run this app locally with pnpm dev or use Builder.io to access the CLI terminal.\",\n toggleAgent: \"Toggle agent\",\n checkingAiConnection: \"Checking AI connection...\",\n voiceMode: {\n entryButtonLabel: \"Use microphone\",\n promptTitle: \"Talk to your app\",\n promptDescription:\n \"Voice mode keeps listening while the agent navigates and takes actions.\",\n setupTitle: \"Set up voice mode\",\n setupDescription:\n \"Connect Builder to use managed voice with free credits, or use your own OpenAI API key.\",\n connectBuilder: \"Connect Builder\",\n useOpenAiKey: \"Use OpenAI API key\",\n startWithOpenAiKey: \"Start with OpenAI key\",\n start: \"Start voice mode\",\n keepDictating: \"Keep dictating\",\n showChat: \"Show chat\",\n hideChat: \"Hide chat\",\n end: \"End voice mode\",\n voiceSettings: \"Voice settings\",\n settings: {\n microphone: \"Microphone\",\n defaultMicrophone: \"System default\",\n microphoneSwitchFailed:\n \"Could not switch microphones. Your current microphone is still active.\",\n language: \"Language\",\n autoLanguage: \"Auto\",\n languages: {\n en: \"English\",\n es: \"Spanish\",\n fr: \"French\",\n de: \"German\",\n it: \"Italian\",\n pt: \"Portuguese\",\n ja: \"Japanese\",\n ko: \"Korean\",\n zh: \"Chinese\",\n },\n intelligence: \"Intelligence\",\n intelligenceLevels: {\n instant: \"Instant\",\n balanced: \"Balanced\",\n deep: \"Deep\",\n },\n voiceStyle: \"Voice style\",\n voiceChangePending:\n \"Your new voice will apply next time you start voice mode.\",\n voiceDescriptions: {\n marin: \"Warm and natural\",\n cedar: \"Clear and grounded\",\n coral: \"Friendly and bright\",\n sage: \"Calm and thoughtful\",\n verse: \"Expressive and versatile\",\n alloy: \"Balanced and neutral\",\n ash: \"Smooth and confident\",\n ballad: \"Warm and expressive\",\n echo: \"Clear and direct\",\n shimmer: \"Light and upbeat\",\n },\n },\n status: {\n connecting: \"Connecting\",\n listening: \"Listening\",\n speaking: \"Speaking\",\n working: \"Working\",\n error: \"Voice mode needs attention\",\n ending: \"Ending voice mode\",\n },\n errors: {\n unsupported:\n \"This browser does not support realtime voice conversations.\",\n responseFailed: \"OpenAI could not complete the voice response.\",\n sessionFailed: \"The realtime voice session encountered an error.\",\n channelDisconnected: \"The realtime voice control channel disconnected.\",\n connectionTimedOut:\n \"The realtime voice connection timed out. Try again after the app finishes loading.\",\n connectionFailed: \"The realtime voice connection failed.\",\n offerFailed: \"The browser did not create an audio offer.\",\n },\n },\n },\n share: {\n titleWithResource: 'Share \"{{title}}\"',\n titleWithType: \"Share {{type}}\",\n owner: \"Owner: {{name}}\",\n close: \"Close\",\n shareOptions: \"Share options\",\n link: \"Link\",\n invite: \"Invite\",\n embed: \"Embed\",\n done: \"Done\",\n generalAccess: \"General access\",\n shareLink: \"Share link\",\n addPeopleByEmail: \"Add people by email\",\n notifyPeople: \"Notify people\",\n peopleWithAccess: \"People with access\",\n ownerRole: \"Owner\",\n remove: \"Remove\",\n noAccess: \"No one has access yet.\",\n embedUrl: \"Embed URL\",\n embedCode: \"Embed code\",\n copy: \"Copy\",\n role: \"Role\",\n private: \"Private\",\n privateDescription: \"Only people with access can view\",\n organization: \"Organization\",\n organizationDescription: \"Anyone in your organization can view\",\n public: \"Public\",\n publicDescription: \"Anyone signed in with the link can view\",\n viewer: \"Viewer\",\n viewerDescription: \"Can view\",\n editor: \"Editor\",\n editorDescription: \"Can edit\",\n admin: \"Admin\",\n adminDescription: \"Can edit and manage access\",\n },\n runsTray: {\n runs: \"Runs\",\n agentRuns: \"Agent runs\",\n activeRun_one: \"{{count}} active run\",\n activeRun_other: \"{{count}} active runs\",\n failedRun_one: \"{{count}} failed run\",\n failedRun_other: \"{{count}} failed runs\",\n recentRuns: \"Recent runs\",\n noRecentRuns: \"No recent runs\",\n ariaAgentRuns: \"Agent runs, {{label}}\",\n summaryRunning: \"{{activeCount}} running\",\n summaryRunningRecent: \"{{activeCount}} running · {{terminalCount}} recent\",\n summaryRecent_one: \"{{count}} recent run\",\n summaryRecent_other: \"{{count}} recent runs\",\n noTrackedWorkYet: \"No tracked work yet\",\n emptyDescription:\n \"Background agent work will appear here while it runs and after it finishes.\",\n open: \"Open\",\n stopRun: \"Stop {{title}}\",\n hideRun: \"Hide {{title}}\",\n statusRunning: \"Running\",\n statusDone: \"Done\",\n statusFailed: \"Failed\",\n statusStopped: \"Stopped\",\n updatedJustNow: \"Updated just now\",\n finishedJustNow: \"Finished just now\",\n updatedMinutes: \"Updated {{count}}m ago\",\n finishedMinutes: \"Finished {{count}}m ago\",\n updatedHours: \"Updated {{count}}h ago\",\n finishedHours: \"Finished {{count}}h ago\",\n updatedDate: \"Updated {{date}}\",\n finishedDate: \"Finished {{date}}\",\n },\n codeRequired: {\n fallbackDetail:\n \"Edit locally or use Builder.io to edit this code in the cloud and continue customizing the app any way you like.\",\n defaultFeature: \"Make the requested code changes to this app\",\n branchError: \"Failed to create branch\",\n title: \"Code changes required\",\n subtitleWithFeature:\n '\"{{feature}}\" creates or modifies source code, which needs Desktop or Builder from this surface.',\n subtitle:\n \"This action creates or modifies source code, which needs Desktop or Builder from this surface.\",\n desktopTitle: \"Use Agent Native Desktop\",\n desktopDescription:\n \"Open the project in the desktop app to enable source edits and CLI access.\",\n builderAgentTitle: \"Use Builder.io Agent\",\n builderAgentDescription:\n \"Let our cloud agent make the changes for you. You'll get a link to preview and deploy.\",\n codeChangeTitle: \"This requires a code change\",\n codeChangeBadge: \"Code change\",\n connectBuilderTitle: \"Connect Builder.io\",\n connectBuilderDescription:\n \"Connect Builder to enable cloud-based code changes from this app.\",\n setupRequired: \"Setup required\",\n branchCreated: \"Branch created\",\n close: \"Close\",\n },\n extensions: {\n createPrompt: \"Create an extension: {{prompt}}\",\n createWidgetPrompt:\n 'Create a new widget that fits in slot \"{{slotId}}\". I\\'ll describe what it should do next.',\n whatShouldItDo: \"What should it do?\",\n createPlaceholder: \"A todo list, API dashboard, calculator...\",\n title: \"Extensions\",\n hiddenShown: \"Hiding shown\",\n showHidden: \"Show hidden\",\n newExtension: \"New Extension\",\n newExtensionTitle: \"New extension\",\n buildPlaceholder: \"Describe what you'd like to build...\",\n namePlaceholder: \"My Extension\",\n descriptionPlaceholder: \"What does this extension do?\",\n contentPlaceholder: \"<html>...</html>\",\n emptyTitle: \"Create your first extension\",\n emptyDescription: \"Describe a small app and the agent will build it.\",\n hiddenFromEveryone: \"Hidden from everyone\",\n localFile: \"Local file\",\n optionsFor: \"Options for {{name}}\",\n unhideEveryone: \"Unhide for everyone\",\n hideEveryone: \"Hide from everyone\",\n localFileDescription:\n \"This extension is backed by {{entryPath}}. Edit or remove it from the workspace.\",\n deleteQuestion: \"Delete {{name}}?\",\n removeQuestion: \"Remove {{name}}?\",\n hideForYouDescription:\n \"This hides it from your Extensions list without deleting it for anyone else.\",\n removeEverywhereDescription: \"This removes it everywhere it is shared.\",\n cancel: \"Cancel\",\n remove: \"Remove\",\n removing: \"Removing...\",\n delete: \"Delete\",\n deleting: \"Deleting...\",\n openFullView: \"Open full view\",\n removeFromWidgetArea: \"Remove from this widget area\",\n deleteExtensionEllipsis: \"Delete extension...\",\n removeFromMyListEllipsis: \"Remove from my list...\",\n removeFromWidgetAreaForMe: \"Remove from this widget area (for me)\",\n deleteEverywhereConfirmation:\n \"This removes the extension everywhere, for everyone it's shared with.\",\n addWidget: \"Add widget\",\n loading: \"Loading...\",\n noWidgetsAvailable: \"No widgets available for this slot yet.\",\n buildNewWidget: \"Build a new widget\",\n contactSidebarWidget: \"Contact sidebar widget\",\n contactSidebarDescription:\n \"Appears beside the current conversation with contact and thread context.\",\n eventDetailWidget: \"Event detail widget\",\n eventDetailDescription:\n \"Appears below the open calendar event with event and attendee context.\",\n addWidgetHere: \"Add widget here\",\n back: \"Back\",\n editExtension: \"Edit Extension\",\n saving: \"Saving...\",\n save: \"Save\",\n create: \"Create\",\n moreOptions: \"More options\",\n appearsIn: \"Appears in\",\n noWidgetAreas:\n \"Not installed in any widget areas. Ask the agent to add it somewhere.\",\n widgetAreaCount_one: \"This extension can render in {{count}} widget area.\",\n widgetAreaCount_other:\n \"This extension can render in {{count}} widget areas.\",\n nameLabel: \"Name\",\n descriptionLabel: \"Description\",\n contentLabel: \"Content\",\n previewTitle: \"Extension preview\",\n previewEmpty: \"Preview will appear here\",\n loadError: \"Couldn't load extensions.\",\n widgetsLoadError: \"Couldn't load widgets.\",\n widgetAreasLoadError: \"Couldn't load widget areas.\",\n historyLoadError: \"Couldn't load extension history.\",\n versionLoadError: \"Couldn't load this extension version.\",\n retry: \"Retry\",\n },\n org: {\n createTitle: \"Create your organization\",\n createDescription:\n \"This app organizes your content by team. Create an organization to continue - you can invite teammates afterward.\",\n loadErrorTitle: \"Couldn't load organization\",\n loadErrorFallback: \"Couldn't load organization.\",\n tryAgain: \"Try again\",\n sendFeedback: \"Send feedback\",\n feedbackPlaceholder:\n \"Describe what happened before this organization error appeared.\",\n openGitHubIssue: \"Open GitHub issue\",\n yourOrganization: \"Your organization\",\n joinYourTeam: \"Join your team\",\n openToDomainEmails: \"Open to @{{domain}} emails\",\n joinOrg: \"Join {{name}}\",\n pendingInvitations: \"Pending invitations\",\n invitedBy: \"from {{name}}\",\n accept: \"Accept\",\n createSeparate: \"or create a separate organization\",\n organizationName: \"Organization name\",\n organizationPlaceholder: \"Acme Inc.\",\n createOrganization: \"Create organization\",\n create: \"Create\",\n creating: \"Creating...\",\n team: \"Team\",\n createOrgCardTitle: \"Create an Organization\",\n createOrgCardDescription:\n \"Set up a team to collaborate with your colleagues.\",\n joinDomainOne:\n \"An organization matching your email domain already exists. Join it to collaborate with your teammates.\",\n joinDomainMany:\n \"Organizations matching your email domain already exist. Join one to collaborate with your teammates.\",\n join: \"Join\",\n invitedByLabel: \"Invited by {{name}}\",\n you: \"You\",\n owner: \"Owner\",\n admin: \"Admin\",\n member: \"Member\",\n members: \"Members\",\n inviteMembers: \"Invite members\",\n invited: \"Invited\",\n role: \"Role\",\n status: \"Status\",\n actions: \"Actions\",\n noMembers: \"No members yet.\",\n memberCount_one: \"{{count}} member\",\n memberCount_other: \"{{count}} members\",\n youAreRole: \"You are {{role}}\",\n changeRole: \"Change role\",\n removeMember: \"Remove member\",\n cancel: \"Cancel\",\n remove: \"Remove\",\n save: \"Save\",\n loading: \"Loading...\",\n },\n integrations: {\n webhookUrl: \"Webhook URL\",\n copyWebhookUrl: \"Copy webhook URL\",\n notConfigured:\n \"Not configured. Set the required secrets to enable this integration.\",\n enable: \"Enable\",\n disable: \"Disable\",\n toggling: \"...\",\n networkError: \"Network error reaching the server\",\n back: \"Back\",\n agentEngineRequired: \"Agent engine required\",\n agentEngineDescription:\n \"Connect Builder.io or an LLM key before {{platform}} can answer.\",\n openLlm: \"Open LLM\",\n setup: \"Setup\",\n shareDocumentsWith: \"Share documents with\",\n copyServiceAccountEmail: \"Copy service account email\",\n requiredSecrets: \"Required secrets\",\n envHelp: \"Set these in your .env file or environment to connect.\",\n copy: \"Copy\",\n documentation: \"Documentation\",\n clientAvailable:\n \"This agent's A2A endpoint is automatically available. No configuration needed.\",\n addChatIntegration: \"Add a chat integration\",\n chatIntegrations: \"Chat Integrations\",\n chatIntegrationsDescription: \"Talk to this agent from other platforms\",\n addIntegration: \"Add integration\",\n dispatchEntrypoint:\n \"For a central Slack or Telegram entrypoint that can route work across multiple apps, use the\",\n sharedMessaging:\n \"Need one shared messaging surface for your workspace? Connect Slack or Telegram to a dispatch app and let it delegate to other agents over A2A.\",\n },\n mcpIntegrations: {\n menuLabel: \"Integrations\",\n menuDescription: \"Connect MCP tools to the agent\",\n title: \"Connect integrations\",\n description: \"Choose a default MCP integration or add a custom server.\",\n searchPlaceholder: \"Search integrations\",\n addYourOwn: \"Add your own\",\n noMatches: \"No integrations match that search.\",\n connected: \"Connected\",\n configure: \"Configure\",\n connect: \"Connect\",\n backToIntegrations: \"Back to integrations\",\n customTitle: \"Add custom MCP server\",\n configureTitle: \"Configure {{name}}\",\n presetNoAuthDescription:\n \"Preset values are filled in. Test the endpoint or connect it now.\",\n presetAuthDescription:\n \"Preset values are filled in. Add any required authorization details before connecting.\",\n customDescription:\n \"Paste a Streamable HTTP or SSE MCP endpoint and optional headers.\",\n oauthNotice:\n \"This provider usually requires an OAuth setup. Follow the provider docs, or add an Authorization header if your endpoint supports token-based access.\",\n personal: \"Personal\",\n organization: \"Organization\",\n orgNoOrg: \"Join an organization to share MCP servers\",\n orgAdminOnly: \"Only owners and admins can add org-scope servers\",\n serverName: \"Server name\",\n url: \"URL\",\n fieldDescription: \"Description\",\n headers: \"Headers\",\n serverNamePlaceholder: \"Server name\",\n urlPlaceholder: \"https://mcp.example.com/mcp\",\n descriptionPlaceholder: \"Description (optional)\",\n headersPlaceholder: \"Authorization: Bearer <token>\",\n openSetupDocs: \"Open setup docs\",\n test: \"Test\",\n toolsAvailable_one: \"{{count}} tool available\",\n toolsAvailable_other: \"{{count}} tools available\",\n failed: \"Failed\",\n docsLabel: \"View {{name}} docs\",\n catalog: {\n context7: {\n description: \"Fetch current library docs in agent chats.\",\n useCase:\n \"Documentation, technical reference, API docs, framework guides\",\n },\n sentry: {\n description: \"Inspect issues, events, and debugging data.\",\n useCase: \"Error monitoring, debugging, performance, crash reports\",\n },\n notion: {\n description: \"Search pages and team knowledge.\",\n useCase: \"Documentation, knowledge management, notes, content creation\",\n },\n semgrep: {\n description: \"Scan code for security findings.\",\n useCase: \"Security scanning, vulnerability detection, code analysis\",\n },\n linear: {\n description: \"Read and write Linear issues.\",\n useCase: \"Project management, issue tracking, planning, bug reports\",\n },\n supabase: {\n description: \"Manage data, auth, and backend services.\",\n useCase: \"Database, authentication, storage, edge functions\",\n },\n neon: {\n description: \"Work with serverless Postgres projects.\",\n useCase: \"Database management, serverless Postgres, data storage\",\n },\n stripe: {\n description: \"Manage payments, subscriptions, and customers.\",\n useCase: \"Payments, subscriptions, invoicing, customer management\",\n },\n },\n auth: {\n none: \"No auth\",\n headers: \"Header\",\n oauth: \"OAuth\",\n },\n },\n observability: {\n noData: \"No data available\",\n noConversations: \"No conversations recorded yet\",\n noEvals: \"No eval results recorded yet\",\n noExperiments: \"No experiments created yet\",\n totalRuns: \"Total runs\",\n totalCost: \"Total cost\",\n avgLatency: \"Avg latency\",\n toolSuccess: \"Tool success\",\n thumbsUp: \"Thumbs up\",\n avgEvalScore: \"Avg eval score\",\n run: \"Run\",\n model: \"Model\",\n duration: \"Duration\",\n cost: \"Cost\",\n tools: \"Tools\",\n time: \"Time\",\n failedCount: \"({{count}} failed)\",\n backToList: \"Back to list\",\n spans: \"Spans\",\n type: \"Type\",\n name: \"Name\",\n tokens: \"Tokens\",\n status: \"Status\",\n totalEvals: \"Total evals\",\n avgScore: \"Avg score\",\n scoresByCriteria: \"Scores by criteria\",\n overview: \"Overview\",\n conversations: \"Conversations\",\n evals: \"Evals\",\n experiments: \"Experiments\",\n feedback: \"Feedback\",\n variants: \"Variants\",\n created: \"Created\",\n backToExperiments: \"Back to experiments\",\n metrics: \"Metrics\",\n level: \"Level\",\n results: \"Results\",\n variant: \"Variant\",\n metric: \"Metric\",\n value: \"Value\",\n totalFeedback: \"Total feedback\",\n thumbsDown: \"Thumbs down\",\n frustration: \"Frustration\",\n thumbsUpRate: \"Thumbs up rate\",\n categories: \"Categories\",\n },\n error: {\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails:\n \"This page doesn't exist. It may have been moved or deleted.\",\n statusTitle: \"{{status}} Error\",\n goHome: \"Go home\",\n },\n};\n\nexport default messages;\n"]}
|
|
@@ -196,8 +196,8 @@ async function selectWorkspaceMcpResourceRows(options) {
|
|
|
196
196
|
AND wr.scope = ?
|
|
197
197
|
AND wr.path LIKE ?
|
|
198
198
|
AND (
|
|
199
|
-
(? IS NOT NULL AND wr.org_id = ?)
|
|
200
|
-
OR (? IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))
|
|
199
|
+
(CAST(? AS TEXT) IS NOT NULL AND wr.org_id = ?)
|
|
200
|
+
OR (CAST(? AS TEXT) IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))
|
|
201
201
|
)
|
|
202
202
|
`,
|
|
203
203
|
args: [
|
|
@@ -234,8 +234,8 @@ async function selectWorkspaceMcpResourceRows(options) {
|
|
|
234
234
|
AND wg.status = ?
|
|
235
235
|
AND wg.app_id = ?
|
|
236
236
|
AND (
|
|
237
|
-
(? IS NOT NULL AND wr.org_id = ?)
|
|
238
|
-
OR (? IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))
|
|
237
|
+
(CAST(? AS TEXT) IS NOT NULL AND wr.org_id = ?)
|
|
238
|
+
OR (CAST(? AS TEXT) IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))
|
|
239
239
|
)
|
|
240
240
|
AND (
|
|
241
241
|
(wr.org_id IS NOT NULL AND wg.org_id = wr.org_id)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workspace-servers.js","sourceRoot":"","sources":["../../src/mcp-client/workspace-servers.ts"],"names":[],"mappings":"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","sourcesContent":["import crypto from \"node:crypto\";\n\nimport { getDbExec } from \"../db/client.js\";\nimport type { SecretScope } from \"../secrets/register.js\";\nimport { readAppSecret } from \"../secrets/storage.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport type { McpHttpServerConfig, McpServerConfig } from \"./config.js\";\nimport {\n hashEmail,\n normalizeServerName,\n validateRemoteUrl,\n} from \"./remote-store.js\";\n\nconst WORKSPACE_MCP_KIND = \"mcp-server\";\nconst WORKSPACE_MCP_PATH_PREFIX = \"mcp-servers/\";\nconst KEY_REFERENCE_REGEX = /\\$\\{keys\\.([A-Za-z0-9_-]+)\\}/g;\n\ninterface WorkspaceMcpResourceRow {\n id: string;\n owner_email: string;\n org_id: string | null;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: string;\n updated_at: number;\n grant_id?: string | null;\n app_id?: string | null;\n}\n\ninterface ParsedWorkspaceMcpServer {\n name: string;\n config: Record<string, unknown>;\n}\n\nfunction normalizeWorkspaceAppId(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const candidate = trimmed.replace(/^\\/+/, \"\").split(\"/\")[0] ?? \"\";\n if (!/^[a-z0-9][a-z0-9-]{0,127}$/.test(candidate)) return null;\n return candidate;\n}\n\nfunction currentWorkspaceAppId(explicit?: string | null): string | null {\n if (explicit !== undefined) return normalizeWorkspaceAppId(explicit);\n return (\n normalizeWorkspaceAppId(process.env.AGENT_NATIVE_WORKSPACE_APP_ID) ??\n normalizeWorkspaceAppId(process.env.APP_NAME) ??\n normalizeWorkspaceAppId(process.env.AGENT_APP) ??\n normalizeWorkspaceAppId(process.env.APP_BASE_PATH) ??\n normalizeWorkspaceAppId(process.env.VITE_APP_BASE_PATH)\n );\n}\n\nfunction sanitizeOrgId(orgId: string): string {\n return orgId.toLowerCase().replace(/[^a-z0-9-]/g, \"-\");\n}\n\nfunction resourceServerKey(row: WorkspaceMcpResourceRow, serverName: string) {\n const scopePrefix = row.org_id\n ? `org_${sanitizeOrgId(row.org_id)}`\n : `user_${hashEmail(row.owner_email)}`;\n const name = normalizeServerName(serverName) || \"server\";\n const discriminator = crypto\n .createHash(\"sha256\")\n .update(`${row.id}:${serverName}`)\n .digest(\"hex\")\n .slice(0, 8);\n return `${scopePrefix}_workspace-${name}-${discriminator}`;\n}\n\nfunction secretCandidates(row: WorkspaceMcpResourceRow): Array<{\n scope: SecretScope;\n scopeId: string;\n}> {\n if (row.org_id) {\n return [\n { scope: \"org\", scopeId: row.org_id },\n { scope: \"workspace\", scopeId: row.org_id },\n ];\n }\n return [\n { scope: \"user\", scopeId: row.owner_email },\n { scope: \"workspace\", scopeId: `solo:${row.owner_email}` },\n ];\n}\n\nasync function resolveKeyReferencesForRow(\n text: string,\n row: WorkspaceMcpResourceRow,\n): Promise<string> {\n const matches = Array.from(text.matchAll(KEY_REFERENCE_REGEX));\n if (matches.length === 0) return text;\n\n const values = new Map<string, string>();\n for (const match of matches) {\n const key = match[1];\n if (values.has(key)) continue;\n let value: string | null = null;\n for (const ref of secretCandidates(row)) {\n const secret = await readAppSecret({ key, ...ref });\n if (secret) {\n value = secret.value;\n break;\n }\n }\n if (value === null) {\n throw new Error(\n `Referenced key \"${key}\" is not defined for this workspace MCP server scope.`,\n );\n }\n values.set(key, value);\n }\n\n return text.replace(KEY_REFERENCE_REGEX, (_match, key: string) => {\n const value = values.get(key);\n if (value === undefined) {\n throw new Error(`Referenced key \"${key}\" was not resolved.`);\n }\n return value;\n });\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction defaultNameFromPath(path: string): string {\n const file = path.split(\"/\").pop() || \"server\";\n return file.replace(/\\.json$/i, \"\") || \"server\";\n}\n\nfunction parseWorkspaceMcpServers(\n row: WorkspaceMcpResourceRow,\n): ParsedWorkspaceMcpServer[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(row.content);\n } catch {\n throw new Error(\"Workspace MCP server resource must contain valid JSON.\");\n }\n const record = objectRecord(parsed);\n if (!record) {\n throw new Error(\"Workspace MCP server resource must be a JSON object.\");\n }\n\n const servers = objectRecord(record.servers);\n if (servers) {\n return Object.entries(servers)\n .map(([name, config]) => {\n const serverConfig = objectRecord(config);\n return serverConfig ? { name, config: serverConfig } : null;\n })\n .filter((entry): entry is ParsedWorkspaceMcpServer => !!entry);\n }\n\n const nestedServer = objectRecord(record.server);\n if (nestedServer) {\n return [\n {\n name:\n typeof record.name === \"string\"\n ? record.name\n : defaultNameFromPath(row.path),\n config: nestedServer,\n },\n ];\n }\n\n return [\n {\n name:\n typeof record.name === \"string\"\n ? record.name\n : defaultNameFromPath(row.path),\n config: record,\n },\n ];\n}\n\nasync function normalizeWorkspaceMcpConfig(\n row: WorkspaceMcpResourceRow,\n parsed: ParsedWorkspaceMcpServer,\n): Promise<McpHttpServerConfig | null> {\n const type = parsed.config.type;\n if (type && type !== \"http\") {\n throw new Error(\"Workspace MCP server resources only support HTTP MCP.\");\n }\n const rawUrl = parsed.config.url;\n if (typeof rawUrl !== \"string\" || !rawUrl.trim()) {\n throw new Error(\"Workspace MCP server resource is missing a URL.\");\n }\n const url = await resolveKeyReferencesForRow(rawUrl, row);\n const urlCheck = validateRemoteUrl(url);\n if (!urlCheck.ok) {\n throw new Error(\n urlCheck.error ?? \"Workspace MCP server URL is not allowed.\",\n );\n }\n\n const headersInput = objectRecord(parsed.config.headers);\n const headers: Record<string, string> = {};\n if (headersInput) {\n for (const [name, value] of Object.entries(headersInput)) {\n if (typeof value !== \"string\") continue;\n headers[name] = await resolveKeyReferencesForRow(value, row);\n }\n }\n\n const description =\n typeof parsed.config.description === \"string\"\n ? parsed.config.description\n : (row.description ?? undefined);\n\n return {\n type: \"http\",\n url: urlCheck.url!.toString(),\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n description,\n };\n}\n\nfunction isMissingWorkspaceResourceTable(error: unknown): boolean {\n const message = String((error as { message?: unknown })?.message ?? error);\n return /workspace_resources|workspace_resource_grants|no such table|does not exist/i.test(\n message,\n );\n}\n\nasync function selectWorkspaceMcpResourceRows(options?: {\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<WorkspaceMcpResourceRow[]> {\n const appId = currentWorkspaceAppId(options?.workspaceAppId);\n const userEmail =\n options?.userEmail === undefined\n ? (getRequestUserEmail() ?? null)\n : options.userEmail;\n const orgId =\n options?.orgId === undefined ? (getRequestOrgId() ?? null) : options.orgId;\n const client = getDbExec();\n const allRows = await client.execute({\n sql: `\n SELECT\n wr.id,\n wr.owner_email,\n wr.org_id,\n wr.name,\n wr.description,\n wr.path,\n wr.content,\n wr.scope,\n wr.updated_at,\n NULL AS grant_id,\n NULL AS app_id\n FROM workspace_resources wr\n WHERE wr.kind = ?\n AND wr.scope = ?\n AND wr.path LIKE ?\n AND (\n (? IS NOT NULL AND wr.org_id = ?)\n OR (? IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))\n )\n `,\n args: [\n WORKSPACE_MCP_KIND,\n \"all\",\n `${WORKSPACE_MCP_PATH_PREFIX}%`,\n orgId,\n orgId,\n userEmail,\n userEmail,\n ],\n });\n\n if (!appId) return allRows.rows as WorkspaceMcpResourceRow[];\n\n const selectedRows = await client.execute({\n sql: `\n SELECT\n wr.id,\n wr.owner_email,\n wr.org_id,\n wr.name,\n wr.description,\n wr.path,\n wr.content,\n wr.scope,\n wr.updated_at,\n wg.id AS grant_id,\n wg.app_id AS app_id\n FROM workspace_resources wr\n INNER JOIN workspace_resource_grants wg ON wg.resource_id = wr.id\n WHERE wr.kind = ?\n AND wr.scope = ?\n AND wr.path LIKE ?\n AND wg.status = ?\n AND wg.app_id = ?\n AND (\n (? IS NOT NULL AND wr.org_id = ?)\n OR (? IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))\n )\n AND (\n (wr.org_id IS NOT NULL AND wg.org_id = wr.org_id)\n OR (wr.org_id IS NULL AND wg.org_id IS NULL AND wg.owner_email = wr.owner_email)\n )\n `,\n args: [\n WORKSPACE_MCP_KIND,\n \"selected\",\n `${WORKSPACE_MCP_PATH_PREFIX}%`,\n \"active\",\n appId,\n orgId,\n orgId,\n userEmail,\n userEmail,\n ],\n });\n\n return [\n ...(allRows.rows as WorkspaceMcpResourceRow[]),\n ...(selectedRows.rows as WorkspaceMcpResourceRow[]),\n ];\n}\n\n/**\n * Load Dispatch-managed workspace MCP server resources for this app.\n *\n * Resources live in Dispatch's `workspace_resources` table with\n * `kind = \"mcp-server\"` and paths under `mcp-servers/*.json`. All-app rows\n * are loaded everywhere; selected rows are loaded only when granted to the\n * current `AGENT_NATIVE_WORKSPACE_APP_ID`.\n */\nexport async function loadWorkspaceMcpServers(options?: {\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<Record<string, McpServerConfig>> {\n let rows: WorkspaceMcpResourceRow[] = [];\n try {\n rows = await selectWorkspaceMcpResourceRows(options);\n } catch (error) {\n if (!isMissingWorkspaceResourceTable(error)) {\n console.warn(\n `[mcp-client] Failed to load workspace MCP server resources: ${\n (error as { message?: string })?.message ?? error\n }`,\n );\n }\n return {};\n }\n\n const servers: Record<string, McpServerConfig> = {};\n for (const row of rows) {\n try {\n for (const parsed of parseWorkspaceMcpServers(row)) {\n const config = await normalizeWorkspaceMcpConfig(row, parsed);\n if (!config) continue;\n servers[resourceServerKey(row, parsed.name)] = config;\n }\n } catch (error) {\n console.warn(\n `[mcp-client] Skipping workspace MCP server resource ${row.path}: ${\n (error as { message?: string })?.message ?? error\n }`,\n );\n }\n }\n\n return servers;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"workspace-servers.js","sourceRoot":"","sources":["../../src/mcp-client/workspace-servers.ts"],"names":[],"mappings":"AAAA,OAAO,MAAM,MAAM,aAAa,CAAC;AAEjC,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAE5C,OAAO,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACtD,OAAO,EACL,eAAe,EACf,mBAAmB,GACpB,MAAM,8BAA8B,CAAC;AAEtC,OAAO,EACL,SAAS,EACT,mBAAmB,EACnB,iBAAiB,GAClB,MAAM,mBAAmB,CAAC;AAE3B,MAAM,kBAAkB,GAAG,YAAY,CAAC;AACxC,MAAM,yBAAyB,GAAG,cAAc,CAAC;AACjD,MAAM,mBAAmB,GAAG,+BAA+B,CAAC;AAqB5D,SAAS,uBAAuB,CAAC,KAAc;IAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClE,IAAI,CAAC,4BAA4B,CAAC,IAAI,CAAC,SAAS,CAAC;QAAE,OAAO,IAAI,CAAC;IAC/D,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,SAAS,qBAAqB,CAAC,QAAwB;IACrD,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO,uBAAuB,CAAC,QAAQ,CAAC,CAAC;IACrE,OAAO,CACL,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC;QAClE,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC;QAC7C,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC;QAC9C,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAClD,uBAAuB,CAAC,OAAO,CAAC,GAAG,CAAC,kBAAkB,CAAC,CACxD,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa;IAClC,OAAO,KAAK,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,iBAAiB,CAAC,GAA4B,EAAE,UAAkB;IACzE,MAAM,WAAW,GAAG,GAAG,CAAC,MAAM;QAC5B,CAAC,CAAC,OAAO,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE;QACpC,CAAC,CAAC,QAAQ,SAAS,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,CAAC;IACzC,MAAM,IAAI,GAAG,mBAAmB,CAAC,UAAU,CAAC,IAAI,QAAQ,CAAC;IACzD,MAAM,aAAa,GAAG,MAAM;SACzB,UAAU,CAAC,QAAQ,CAAC;SACpB,MAAM,CAAC,GAAG,GAAG,CAAC,EAAE,IAAI,UAAU,EAAE,CAAC;SACjC,MAAM,CAAC,KAAK,CAAC;SACb,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IACf,OAAO,GAAG,WAAW,cAAc,IAAI,IAAI,aAAa,EAAE,CAAC;AAC7D,CAAC;AAED,SAAS,gBAAgB,CAAC,GAA4B;IAIpD,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,OAAO;YACL,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;YACrC,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,EAAE;SAC5C,CAAC;IACJ,CAAC;IACD,OAAO;QACL,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,WAAW,EAAE;QAC3C,EAAE,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,QAAQ,GAAG,CAAC,WAAW,EAAE,EAAE;KAC3D,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,0BAA0B,CACvC,IAAY,EACZ,GAA4B;IAE5B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC,CAAC;IAC/D,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAEtC,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACrB,IAAI,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC9B,IAAI,KAAK,GAAkB,IAAI,CAAC;QAChC,KAAK,MAAM,GAAG,IAAI,gBAAgB,CAAC,GAAG,CAAC,EAAE,CAAC;YACxC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;YACpD,IAAI,MAAM,EAAE,CAAC;gBACX,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;gBACrB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,MAAM,IAAI,KAAK,CACb,mBAAmB,GAAG,uDAAuD,CAC9E,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,IAAI,CAAC,OAAO,CAAC,mBAAmB,EAAE,CAAC,MAAM,EAAE,GAAW,EAAE,EAAE;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC9B,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,mBAAmB,GAAG,qBAAqB,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC7E,OAAO,KAAgC,CAAC;AAC1C,CAAC;AAED,SAAS,mBAAmB,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,QAAQ,CAAC;IAC/C,OAAO,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC;AAClD,CAAC;AAED,SAAS,wBAAwB,CAC/B,GAA4B;IAE5B,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,MAAM,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;IACpC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC7C,IAAI,OAAO,EAAE,CAAC;QACZ,OAAO,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC;aAC3B,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE;YACtB,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YAC1C,OAAO,YAAY,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QAC9D,CAAC,CAAC;aACD,MAAM,CAAC,CAAC,KAAK,EAAqC,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACnE,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;IACjD,IAAI,YAAY,EAAE,CAAC;QACjB,OAAO;YACL;gBACE,IAAI,EACF,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;oBAC7B,CAAC,CAAC,MAAM,CAAC,IAAI;oBACb,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;gBACnC,MAAM,EAAE,YAAY;aACrB;SACF,CAAC;IACJ,CAAC;IAED,OAAO;QACL;YACE,IAAI,EACF,OAAO,MAAM,CAAC,IAAI,KAAK,QAAQ;gBAC7B,CAAC,CAAC,MAAM,CAAC,IAAI;gBACb,CAAC,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC;YACnC,MAAM,EAAE,MAAM;SACf;KACF,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,GAA4B,EAC5B,MAAgC;IAEhC,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IAChC,IAAI,IAAI,IAAI,IAAI,KAAK,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;IAC3E,CAAC;IACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;IACjC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,0BAA0B,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CACb,QAAQ,CAAC,KAAK,IAAI,0CAA0C,CAC7D,CAAC;IACJ,CAAC;IAED,MAAM,YAAY,GAAG,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACzD,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,YAAY,EAAE,CAAC;QACjB,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YACzD,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,SAAS;YACxC,OAAO,CAAC,IAAI,CAAC,GAAG,MAAM,0BAA0B,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC/D,CAAC;IACH,CAAC;IAED,MAAM,WAAW,GACf,OAAO,MAAM,CAAC,MAAM,CAAC,WAAW,KAAK,QAAQ;QAC3C,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,WAAW;QAC3B,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,IAAI,SAAS,CAAC,CAAC;IAErC,OAAO;QACL,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,QAAQ,CAAC,GAAI,CAAC,QAAQ,EAAE;QAC7B,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS;QAC9D,WAAW;KACZ,CAAC;AACJ,CAAC;AAED,SAAS,+BAA+B,CAAC,KAAc;IACrD,MAAM,OAAO,GAAG,MAAM,CAAE,KAA+B,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;IAC3E,OAAO,6EAA6E,CAAC,IAAI,CACvF,OAAO,CACR,CAAC;AACJ,CAAC;AAED,KAAK,UAAU,8BAA8B,CAAC,OAI7C;IACC,MAAM,KAAK,GAAG,qBAAqB,CAAC,OAAO,EAAE,cAAc,CAAC,CAAC;IAC7D,MAAM,SAAS,GACb,OAAO,EAAE,SAAS,KAAK,SAAS;QAC9B,CAAC,CAAC,CAAC,mBAAmB,EAAE,IAAI,IAAI,CAAC;QACjC,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACxB,MAAM,KAAK,GACT,OAAO,EAAE,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,eAAe,EAAE,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IAC7E,MAAM,MAAM,GAAG,SAAS,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACnC,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;KAqBJ;QACD,IAAI,EAAE;YACJ,kBAAkB;YAClB,KAAK;YACL,GAAG,yBAAyB,GAAG;YAC/B,KAAK;YACL,KAAK;YACL,SAAS;YACT,SAAS;SACV;KACF,CAAC,CAAC;IAEH,IAAI,CAAC,KAAK;QAAE,OAAO,OAAO,CAAC,IAAiC,CAAC;IAE7D,MAAM,YAAY,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC;QACxC,GAAG,EAAE;;;;;;;;;;;;;;;;;;;;;;;;;;;;KA4BJ;QACD,IAAI,EAAE;YACJ,kBAAkB;YAClB,UAAU;YACV,GAAG,yBAAyB,GAAG;YAC/B,QAAQ;YACR,KAAK;YACL,KAAK;YACL,KAAK;YACL,SAAS;YACT,SAAS;SACV;KACF,CAAC,CAAC;IAEH,OAAO;QACL,GAAI,OAAO,CAAC,IAAkC;QAC9C,GAAI,YAAY,CAAC,IAAkC;KACpD,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAAC,OAI7C;IACC,IAAI,IAAI,GAA8B,EAAE,CAAC;IACzC,IAAI,CAAC;QACH,IAAI,GAAG,MAAM,8BAA8B,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,CAAC,+BAA+B,CAAC,KAAK,CAAC,EAAE,CAAC;YAC5C,OAAO,CAAC,IAAI,CACV,+DACG,KAA8B,EAAE,OAAO,IAAI,KAC9C,EAAE,CACH,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,MAAM,OAAO,GAAoC,EAAE,CAAC;IACpD,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,CAAC;YACH,KAAK,MAAM,MAAM,IAAI,wBAAwB,CAAC,GAAG,CAAC,EAAE,CAAC;gBACnD,MAAM,MAAM,GAAG,MAAM,2BAA2B,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBAC9D,IAAI,CAAC,MAAM;oBAAE,SAAS;gBACtB,OAAO,CAAC,iBAAiB,CAAC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,MAAM,CAAC;YACxD,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CACV,uDAAuD,GAAG,CAAC,IAAI,KAC5D,KAA8B,EAAE,OAAO,IAAI,KAC9C,EAAE,CACH,CAAC;QACJ,CAAC;IACH,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC","sourcesContent":["import crypto from \"node:crypto\";\n\nimport { getDbExec } from \"../db/client.js\";\nimport type { SecretScope } from \"../secrets/register.js\";\nimport { readAppSecret } from \"../secrets/storage.js\";\nimport {\n getRequestOrgId,\n getRequestUserEmail,\n} from \"../server/request-context.js\";\nimport type { McpHttpServerConfig, McpServerConfig } from \"./config.js\";\nimport {\n hashEmail,\n normalizeServerName,\n validateRemoteUrl,\n} from \"./remote-store.js\";\n\nconst WORKSPACE_MCP_KIND = \"mcp-server\";\nconst WORKSPACE_MCP_PATH_PREFIX = \"mcp-servers/\";\nconst KEY_REFERENCE_REGEX = /\\$\\{keys\\.([A-Za-z0-9_-]+)\\}/g;\n\ninterface WorkspaceMcpResourceRow {\n id: string;\n owner_email: string;\n org_id: string | null;\n name: string;\n description: string | null;\n path: string;\n content: string;\n scope: string;\n updated_at: number;\n grant_id?: string | null;\n app_id?: string | null;\n}\n\ninterface ParsedWorkspaceMcpServer {\n name: string;\n config: Record<string, unknown>;\n}\n\nfunction normalizeWorkspaceAppId(value: unknown): string | null {\n if (typeof value !== \"string\") return null;\n const trimmed = value.trim();\n if (!trimmed) return null;\n const candidate = trimmed.replace(/^\\/+/, \"\").split(\"/\")[0] ?? \"\";\n if (!/^[a-z0-9][a-z0-9-]{0,127}$/.test(candidate)) return null;\n return candidate;\n}\n\nfunction currentWorkspaceAppId(explicit?: string | null): string | null {\n if (explicit !== undefined) return normalizeWorkspaceAppId(explicit);\n return (\n normalizeWorkspaceAppId(process.env.AGENT_NATIVE_WORKSPACE_APP_ID) ??\n normalizeWorkspaceAppId(process.env.APP_NAME) ??\n normalizeWorkspaceAppId(process.env.AGENT_APP) ??\n normalizeWorkspaceAppId(process.env.APP_BASE_PATH) ??\n normalizeWorkspaceAppId(process.env.VITE_APP_BASE_PATH)\n );\n}\n\nfunction sanitizeOrgId(orgId: string): string {\n return orgId.toLowerCase().replace(/[^a-z0-9-]/g, \"-\");\n}\n\nfunction resourceServerKey(row: WorkspaceMcpResourceRow, serverName: string) {\n const scopePrefix = row.org_id\n ? `org_${sanitizeOrgId(row.org_id)}`\n : `user_${hashEmail(row.owner_email)}`;\n const name = normalizeServerName(serverName) || \"server\";\n const discriminator = crypto\n .createHash(\"sha256\")\n .update(`${row.id}:${serverName}`)\n .digest(\"hex\")\n .slice(0, 8);\n return `${scopePrefix}_workspace-${name}-${discriminator}`;\n}\n\nfunction secretCandidates(row: WorkspaceMcpResourceRow): Array<{\n scope: SecretScope;\n scopeId: string;\n}> {\n if (row.org_id) {\n return [\n { scope: \"org\", scopeId: row.org_id },\n { scope: \"workspace\", scopeId: row.org_id },\n ];\n }\n return [\n { scope: \"user\", scopeId: row.owner_email },\n { scope: \"workspace\", scopeId: `solo:${row.owner_email}` },\n ];\n}\n\nasync function resolveKeyReferencesForRow(\n text: string,\n row: WorkspaceMcpResourceRow,\n): Promise<string> {\n const matches = Array.from(text.matchAll(KEY_REFERENCE_REGEX));\n if (matches.length === 0) return text;\n\n const values = new Map<string, string>();\n for (const match of matches) {\n const key = match[1];\n if (values.has(key)) continue;\n let value: string | null = null;\n for (const ref of secretCandidates(row)) {\n const secret = await readAppSecret({ key, ...ref });\n if (secret) {\n value = secret.value;\n break;\n }\n }\n if (value === null) {\n throw new Error(\n `Referenced key \"${key}\" is not defined for this workspace MCP server scope.`,\n );\n }\n values.set(key, value);\n }\n\n return text.replace(KEY_REFERENCE_REGEX, (_match, key: string) => {\n const value = values.get(key);\n if (value === undefined) {\n throw new Error(`Referenced key \"${key}\" was not resolved.`);\n }\n return value;\n });\n}\n\nfunction objectRecord(value: unknown): Record<string, unknown> | null {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) return null;\n return value as Record<string, unknown>;\n}\n\nfunction defaultNameFromPath(path: string): string {\n const file = path.split(\"/\").pop() || \"server\";\n return file.replace(/\\.json$/i, \"\") || \"server\";\n}\n\nfunction parseWorkspaceMcpServers(\n row: WorkspaceMcpResourceRow,\n): ParsedWorkspaceMcpServer[] {\n let parsed: unknown;\n try {\n parsed = JSON.parse(row.content);\n } catch {\n throw new Error(\"Workspace MCP server resource must contain valid JSON.\");\n }\n const record = objectRecord(parsed);\n if (!record) {\n throw new Error(\"Workspace MCP server resource must be a JSON object.\");\n }\n\n const servers = objectRecord(record.servers);\n if (servers) {\n return Object.entries(servers)\n .map(([name, config]) => {\n const serverConfig = objectRecord(config);\n return serverConfig ? { name, config: serverConfig } : null;\n })\n .filter((entry): entry is ParsedWorkspaceMcpServer => !!entry);\n }\n\n const nestedServer = objectRecord(record.server);\n if (nestedServer) {\n return [\n {\n name:\n typeof record.name === \"string\"\n ? record.name\n : defaultNameFromPath(row.path),\n config: nestedServer,\n },\n ];\n }\n\n return [\n {\n name:\n typeof record.name === \"string\"\n ? record.name\n : defaultNameFromPath(row.path),\n config: record,\n },\n ];\n}\n\nasync function normalizeWorkspaceMcpConfig(\n row: WorkspaceMcpResourceRow,\n parsed: ParsedWorkspaceMcpServer,\n): Promise<McpHttpServerConfig | null> {\n const type = parsed.config.type;\n if (type && type !== \"http\") {\n throw new Error(\"Workspace MCP server resources only support HTTP MCP.\");\n }\n const rawUrl = parsed.config.url;\n if (typeof rawUrl !== \"string\" || !rawUrl.trim()) {\n throw new Error(\"Workspace MCP server resource is missing a URL.\");\n }\n const url = await resolveKeyReferencesForRow(rawUrl, row);\n const urlCheck = validateRemoteUrl(url);\n if (!urlCheck.ok) {\n throw new Error(\n urlCheck.error ?? \"Workspace MCP server URL is not allowed.\",\n );\n }\n\n const headersInput = objectRecord(parsed.config.headers);\n const headers: Record<string, string> = {};\n if (headersInput) {\n for (const [name, value] of Object.entries(headersInput)) {\n if (typeof value !== \"string\") continue;\n headers[name] = await resolveKeyReferencesForRow(value, row);\n }\n }\n\n const description =\n typeof parsed.config.description === \"string\"\n ? parsed.config.description\n : (row.description ?? undefined);\n\n return {\n type: \"http\",\n url: urlCheck.url!.toString(),\n headers: Object.keys(headers).length > 0 ? headers : undefined,\n description,\n };\n}\n\nfunction isMissingWorkspaceResourceTable(error: unknown): boolean {\n const message = String((error as { message?: unknown })?.message ?? error);\n return /workspace_resources|workspace_resource_grants|no such table|does not exist/i.test(\n message,\n );\n}\n\nasync function selectWorkspaceMcpResourceRows(options?: {\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<WorkspaceMcpResourceRow[]> {\n const appId = currentWorkspaceAppId(options?.workspaceAppId);\n const userEmail =\n options?.userEmail === undefined\n ? (getRequestUserEmail() ?? null)\n : options.userEmail;\n const orgId =\n options?.orgId === undefined ? (getRequestOrgId() ?? null) : options.orgId;\n const client = getDbExec();\n const allRows = await client.execute({\n sql: `\n SELECT\n wr.id,\n wr.owner_email,\n wr.org_id,\n wr.name,\n wr.description,\n wr.path,\n wr.content,\n wr.scope,\n wr.updated_at,\n NULL AS grant_id,\n NULL AS app_id\n FROM workspace_resources wr\n WHERE wr.kind = ?\n AND wr.scope = ?\n AND wr.path LIKE ?\n AND (\n (CAST(? AS TEXT) IS NOT NULL AND wr.org_id = ?)\n OR (CAST(? AS TEXT) IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))\n )\n `,\n args: [\n WORKSPACE_MCP_KIND,\n \"all\",\n `${WORKSPACE_MCP_PATH_PREFIX}%`,\n orgId,\n orgId,\n userEmail,\n userEmail,\n ],\n });\n\n if (!appId) return allRows.rows as WorkspaceMcpResourceRow[];\n\n const selectedRows = await client.execute({\n sql: `\n SELECT\n wr.id,\n wr.owner_email,\n wr.org_id,\n wr.name,\n wr.description,\n wr.path,\n wr.content,\n wr.scope,\n wr.updated_at,\n wg.id AS grant_id,\n wg.app_id AS app_id\n FROM workspace_resources wr\n INNER JOIN workspace_resource_grants wg ON wg.resource_id = wr.id\n WHERE wr.kind = ?\n AND wr.scope = ?\n AND wr.path LIKE ?\n AND wg.status = ?\n AND wg.app_id = ?\n AND (\n (CAST(? AS TEXT) IS NOT NULL AND wr.org_id = ?)\n OR (CAST(? AS TEXT) IS NOT NULL AND wr.org_id IS NULL AND lower(wr.owner_email) = lower(?))\n )\n AND (\n (wr.org_id IS NOT NULL AND wg.org_id = wr.org_id)\n OR (wr.org_id IS NULL AND wg.org_id IS NULL AND wg.owner_email = wr.owner_email)\n )\n `,\n args: [\n WORKSPACE_MCP_KIND,\n \"selected\",\n `${WORKSPACE_MCP_PATH_PREFIX}%`,\n \"active\",\n appId,\n orgId,\n orgId,\n userEmail,\n userEmail,\n ],\n });\n\n return [\n ...(allRows.rows as WorkspaceMcpResourceRow[]),\n ...(selectedRows.rows as WorkspaceMcpResourceRow[]),\n ];\n}\n\n/**\n * Load Dispatch-managed workspace MCP server resources for this app.\n *\n * Resources live in Dispatch's `workspace_resources` table with\n * `kind = \"mcp-server\"` and paths under `mcp-servers/*.json`. All-app rows\n * are loaded everywhere; selected rows are loaded only when granted to the\n * current `AGENT_NATIVE_WORKSPACE_APP_ID`.\n */\nexport async function loadWorkspaceMcpServers(options?: {\n workspaceAppId?: string | null;\n userEmail?: string | null;\n orgId?: string | null;\n}): Promise<Record<string, McpServerConfig>> {\n let rows: WorkspaceMcpResourceRow[] = [];\n try {\n rows = await selectWorkspaceMcpResourceRows(options);\n } catch (error) {\n if (!isMissingWorkspaceResourceTable(error)) {\n console.warn(\n `[mcp-client] Failed to load workspace MCP server resources: ${\n (error as { message?: string })?.message ?? error\n }`,\n );\n }\n return {};\n }\n\n const servers: Record<string, McpServerConfig> = {};\n for (const row of rows) {\n try {\n for (const parsed of parseWorkspaceMcpServers(row)) {\n const config = await normalizeWorkspaceMcpConfig(row, parsed);\n if (!config) continue;\n servers[resourceServerKey(row, parsed.name)] = config;\n }\n } catch (error) {\n console.warn(\n `[mcp-client] Skipping workspace MCP server resource ${row.path}: ${\n (error as { message?: string })?.message ?? error\n }`,\n );\n }\n }\n\n return servers;\n}\n"]}
|
|
@@ -13,13 +13,13 @@
|
|
|
13
13
|
export declare function createNotificationsHandler(): import("h3").EventHandlerWithFetch<import("h3").EventHandlerRequest, Promise<"" | import("./types.js").Notification[] | {
|
|
14
14
|
count: number;
|
|
15
15
|
updated?: undefined;
|
|
16
|
-
ok?: undefined;
|
|
17
16
|
error?: undefined;
|
|
17
|
+
ok?: undefined;
|
|
18
18
|
} | {
|
|
19
19
|
count?: undefined;
|
|
20
20
|
updated: number;
|
|
21
|
-
ok?: undefined;
|
|
22
21
|
error?: undefined;
|
|
22
|
+
ok?: undefined;
|
|
23
23
|
} | {
|
|
24
24
|
count?: undefined;
|
|
25
25
|
updated?: undefined;
|
|
@@ -28,7 +28,7 @@ export declare function createNotificationsHandler(): import("h3").EventHandlerW
|
|
|
28
28
|
} | {
|
|
29
29
|
count?: undefined;
|
|
30
30
|
updated?: undefined;
|
|
31
|
-
ok: boolean;
|
|
32
31
|
error?: undefined;
|
|
32
|
+
ok: boolean;
|
|
33
33
|
}>>;
|
|
34
34
|
//# sourceMappingURL=routes.d.ts.map
|
|
@@ -73,7 +73,6 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
|
|
|
73
73
|
offset?: unknown;
|
|
74
74
|
limit?: unknown;
|
|
75
75
|
}, {
|
|
76
|
-
deleted?: undefined;
|
|
77
76
|
jobs: {
|
|
78
77
|
id: string;
|
|
79
78
|
name: string;
|
|
@@ -84,6 +83,7 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
|
|
|
84
83
|
updatedAt: string;
|
|
85
84
|
}[];
|
|
86
85
|
total: number;
|
|
86
|
+
deleted?: undefined;
|
|
87
87
|
jobId?: undefined;
|
|
88
88
|
} | {
|
|
89
89
|
jobs?: undefined;
|
|
@@ -91,9 +91,9 @@ export declare function createProviderCorpusJobAction(options: CreateProviderCor
|
|
|
91
91
|
deleted: boolean;
|
|
92
92
|
jobId: string;
|
|
93
93
|
} | {
|
|
94
|
-
deleted?: undefined;
|
|
95
94
|
jobs?: undefined;
|
|
96
95
|
total?: undefined;
|
|
96
|
+
deleted?: undefined;
|
|
97
97
|
jobId?: undefined;
|
|
98
98
|
hits: Record<string, unknown>[];
|
|
99
99
|
offset: number;
|
|
@@ -49,11 +49,11 @@ export declare function handleUpdateResource(event: any): Promise<import("./stor
|
|
|
49
49
|
}>;
|
|
50
50
|
/** DELETE /_agent-native/resources/:id — delete a resource */
|
|
51
51
|
export declare function handleDeleteResource(event: any): Promise<{
|
|
52
|
-
ok?: undefined;
|
|
53
52
|
error: string;
|
|
53
|
+
ok?: undefined;
|
|
54
54
|
} | {
|
|
55
|
-
error?: undefined;
|
|
56
55
|
ok: boolean;
|
|
56
|
+
error?: undefined;
|
|
57
57
|
}>;
|
|
58
58
|
/** POST /_agent-native/resources/upload — upload a file as a resource */
|
|
59
59
|
export declare function handleUploadResource(event: any): Promise<import("./store.js").Resource | {
|
|
@@ -74,10 +74,10 @@ export declare function handleUploadResource(event: any): Promise<import("./stor
|
|
|
74
74
|
runId: string | null;
|
|
75
75
|
expiresAt: number | null;
|
|
76
76
|
metadata: string | null;
|
|
77
|
-
error?: undefined;
|
|
78
77
|
url: string;
|
|
79
78
|
provider: string;
|
|
80
79
|
storageSetupRequired?: undefined;
|
|
80
|
+
error?: undefined;
|
|
81
81
|
} | {
|
|
82
82
|
error: string;
|
|
83
83
|
storageSetupRequired: boolean;
|
package/dist/secrets/crypto.d.ts
CHANGED
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
* credentials (`resolveCredential` / `saveCredential`, stored in `settings`) so
|
|
6
6
|
* there is a single crypto implementation and a single key story.
|
|
7
7
|
*
|
|
8
|
-
* The encryption key is derived from `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* The encryption key is derived from `<APP_NAME>_SECRETS_ENCRYPTION_KEY` when
|
|
9
|
+
* set, then `SECRETS_ENCRYPTION_KEY`, then `BETTER_AUTH_SECRET`. The app-scoped
|
|
10
|
+
* key lets a local multi-app workspace read one app's encrypted production data
|
|
11
|
+
* without replacing the shared local auth secret. In production we refuse to
|
|
12
|
+
* start without configured key material — a CWD-derived fallback would be
|
|
13
|
+
* effectively static (e.g. `/var/task` on Lambda), so anyone with read access
|
|
14
|
+
* to the DB could decrypt every secret.
|
|
14
15
|
*
|
|
15
16
|
* Encrypted values are tagged `v1:<iv-hex>:<ct-hex>:<tag-hex>`. The `v1:` prefix
|
|
16
17
|
* lets readers distinguish ciphertext from legacy plaintext during migration.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/secrets/crypto.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"crypto.d.ts","sourceRoot":"","sources":["../../src/secrets/crypto.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAoDH;;;GAGG;AACH,wBAAgB,sBAAsB,IAAI,MAAM,CAwC/C;AAED,4EAA4E;AAC5E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAQ5D;AAED,6EAA6E;AAC7E,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAqB5D;AAUD,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,MAAM,CAEtE"}
|
package/dist/secrets/crypto.js
CHANGED
|
@@ -5,12 +5,13 @@
|
|
|
5
5
|
* credentials (`resolveCredential` / `saveCredential`, stored in `settings`) so
|
|
6
6
|
* there is a single crypto implementation and a single key story.
|
|
7
7
|
*
|
|
8
|
-
* The encryption key is derived from `
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
8
|
+
* The encryption key is derived from `<APP_NAME>_SECRETS_ENCRYPTION_KEY` when
|
|
9
|
+
* set, then `SECRETS_ENCRYPTION_KEY`, then `BETTER_AUTH_SECRET`. The app-scoped
|
|
10
|
+
* key lets a local multi-app workspace read one app's encrypted production data
|
|
11
|
+
* without replacing the shared local auth secret. In production we refuse to
|
|
12
|
+
* start without configured key material — a CWD-derived fallback would be
|
|
13
|
+
* effectively static (e.g. `/var/task` on Lambda), so anyone with read access
|
|
14
|
+
* to the DB could decrypt every secret.
|
|
14
15
|
*
|
|
15
16
|
* Encrypted values are tagged `v1:<iv-hex>:<ct-hex>:<tag-hex>`. The `v1:` prefix
|
|
16
17
|
* lets readers distinguish ciphertext from legacy plaintext during migration.
|
|
@@ -42,22 +43,40 @@ function processCwd() {
|
|
|
42
43
|
return ".";
|
|
43
44
|
return process.cwd();
|
|
44
45
|
}
|
|
46
|
+
function appScopedEncryptionKey() {
|
|
47
|
+
if (typeof process === "undefined")
|
|
48
|
+
return undefined;
|
|
49
|
+
const appName = process.env.APP_NAME?.trim() // guard:allow-env-credential — deploy-level app configuration selects the scoped encryption key.
|
|
50
|
+
.toUpperCase()
|
|
51
|
+
.replace(/[^A-Z0-9]+/g, "_")
|
|
52
|
+
.replace(/^_+|_+$/g, "");
|
|
53
|
+
return appName
|
|
54
|
+
? process.env[`${appName}_SECRETS_ENCRYPTION_KEY`] // guard:allow-env-credential — deploy-level app encryption material, never a user credential.
|
|
55
|
+
: undefined;
|
|
56
|
+
}
|
|
45
57
|
/**
|
|
46
58
|
* Derive a 32-byte AES key from the configured secret material via SHA-256.
|
|
47
59
|
* Re-derived per call (cheap, stateless, and makes rotation easy).
|
|
48
60
|
*/
|
|
49
61
|
export function getSecretEncryptionKey() {
|
|
50
62
|
const { createHash } = requireNodeCrypto();
|
|
51
|
-
const explicit = (
|
|
52
|
-
|
|
53
|
-
|
|
63
|
+
const explicit = appScopedEncryptionKey() ||
|
|
64
|
+
(typeof process === "undefined"
|
|
65
|
+
? undefined
|
|
66
|
+
: process.env.SECRETS_ENCRYPTION_KEY) ||
|
|
54
67
|
(typeof process === "undefined"
|
|
55
68
|
? undefined
|
|
56
69
|
: process.env.BETTER_AUTH_SECRET);
|
|
57
70
|
if (!explicit) {
|
|
58
71
|
if (processNodeEnv() === "production") {
|
|
72
|
+
const appName = typeof process === "undefined"
|
|
73
|
+
? undefined
|
|
74
|
+
: process.env.APP_NAME?.trim() // guard:allow-env-credential — deploy-level app configuration selects the scoped encryption key.
|
|
75
|
+
.toUpperCase()
|
|
76
|
+
.replace(/[^A-Z0-9]+/g, "_")
|
|
77
|
+
.replace(/^_+|_+$/g, "");
|
|
59
78
|
throw new Error("[agent-native/secrets] Refusing to start in production without an encryption key. " +
|
|
60
|
-
|
|
79
|
+
`Set ${appName ? `${appName}_SECRETS_ENCRYPTION_KEY, ` : ""}SECRETS_ENCRYPTION_KEY, or BETTER_AUTH_SECRET in the deploy environment. ` +
|
|
61
80
|
"The previous CWD-derived fallback was effectively static (e.g. `/var/task` on Lambda), " +
|
|
62
81
|
"which means anyone with read access to the secrets table could decrypt every user's secrets.");
|
|
63
82
|
}
|
|
@@ -65,7 +84,7 @@ export function getSecretEncryptionKey() {
|
|
|
65
84
|
_warnedFallback = true;
|
|
66
85
|
// eslint-disable-next-line no-console
|
|
67
86
|
console.warn("[agent-native/secrets] SECRETS_ENCRYPTION_KEY not set — using a machine-local fallback. " +
|
|
68
|
-
"Set SECRETS_ENCRYPTION_KEY
|
|
87
|
+
"Set an app-scoped *_SECRETS_ENCRYPTION_KEY, SECRETS_ENCRYPTION_KEY, or BETTER_AUTH_SECRET for production. " +
|
|
69
88
|
"Production deploys without one of these env vars now hard-fail.");
|
|
70
89
|
}
|
|
71
90
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/secrets/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared AES-256-GCM encryption for secret values at rest.\n *\n * Used by both the framework secrets vault (`app_secrets`) and per-user/per-org\n * credentials (`resolveCredential` / `saveCredential`, stored in `settings`) so\n * there is a single crypto implementation and a single key story.\n *\n * The encryption key is derived from `SECRETS_ENCRYPTION_KEY` (preferred) or the\n * existing `BETTER_AUTH_SECRET` env var (fallback so templates don't need a\n * second secret during development). In production we refuse to start without\n * one of them — a CWD-derived fallback would be effectively static (e.g.\n * `/var/task` on Lambda), so anyone with read access to the DB could decrypt\n * every secret.\n *\n * Encrypted values are tagged `v1:<iv-hex>:<ct-hex>:<tag-hex>`. The `v1:` prefix\n * lets readers distinguish ciphertext from legacy plaintext during migration.\n */\n\ntype NodeCryptoModule = typeof import(\"node:crypto\");\n\nfunction getNodeCrypto(): NodeCryptoModule | undefined {\n if (\n typeof window !== \"undefined\" ||\n typeof process === \"undefined\" ||\n !process.versions?.node ||\n typeof process.getBuiltinModule !== \"function\"\n ) {\n return undefined;\n }\n return process.getBuiltinModule(\"node:crypto\") as\n | NodeCryptoModule\n | undefined;\n}\n\nconst nodeCrypto = getNodeCrypto();\n\nlet _warnedFallback = false;\n\nfunction requireNodeCrypto(): NonNullable<typeof nodeCrypto> {\n if (!nodeCrypto) {\n throw new Error(\n \"[agent-native/secrets] Secret encryption is only available in server/runtime code.\",\n );\n }\n return nodeCrypto;\n}\n\nfunction processNodeEnv(): string | undefined {\n if (typeof process === \"undefined\") return undefined;\n return process.env.NODE_ENV;\n}\n\nfunction processCwd(): string {\n if (typeof process === \"undefined\") return \".\";\n return process.cwd();\n}\n\n/**\n * Derive a 32-byte AES key from the configured secret material via SHA-256.\n * Re-derived per call (cheap, stateless, and makes rotation easy).\n */\nexport function getSecretEncryptionKey(): Buffer {\n const { createHash } = requireNodeCrypto();\n const explicit =\n (typeof process === \"undefined\"\n ? undefined\n : process.env.SECRETS_ENCRYPTION_KEY) ||\n (typeof process === \"undefined\"\n ? undefined\n : process.env.BETTER_AUTH_SECRET);\n\n if (!explicit) {\n if (processNodeEnv() === \"production\") {\n throw new Error(\n \"[agent-native/secrets] Refusing to start in production without an encryption key. \" +\n \"Set SECRETS_ENCRYPTION_KEY (preferred) or BETTER_AUTH_SECRET in the deploy environment. \" +\n \"The previous CWD-derived fallback was effectively static (e.g. `/var/task` on Lambda), \" +\n \"which means anyone with read access to the secrets table could decrypt every user's secrets.\",\n );\n }\n if (!_warnedFallback) {\n _warnedFallback = true;\n // eslint-disable-next-line no-console\n console.warn(\n \"[agent-native/secrets] SECRETS_ENCRYPTION_KEY not set — using a machine-local fallback. \" +\n \"Set SECRETS_ENCRYPTION_KEY (or BETTER_AUTH_SECRET) for production. \" +\n \"Production deploys without one of these env vars now hard-fail.\",\n );\n }\n }\n\n const material = explicit || `agent-native-secrets:${processCwd()}`;\n return createHash(\"sha256\").update(material).digest();\n}\n\n/** Encrypt a plain-text value. Returns `v1:<iv-hex>:<ct-hex>:<tag-hex>`. */\nexport function encryptSecretValue(plaintext: string): string {\n const { createCipheriv, randomBytes } = requireNodeCrypto();\n const key = getSecretEncryptionKey();\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n const ct = Buffer.concat([cipher.update(plaintext, \"utf8\"), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `v1:${iv.toString(\"hex\")}:${ct.toString(\"hex\")}:${tag.toString(\"hex\")}`;\n}\n\n/** Decrypt a value produced by `encryptSecretValue`. Throws on tampering. */\nexport function decryptSecretValue(encrypted: string): string {\n const { createDecipheriv } = requireNodeCrypto();\n if (!encrypted.startsWith(\"v1:\")) {\n throw new Error(\"Unrecognised secret encoding\");\n }\n const [, ivHex, ctHex, tagHex] = encrypted.split(\":\");\n if (!ivHex || !ctHex || !tagHex) {\n throw new Error(\"Corrupt secret payload\");\n }\n const key = getSecretEncryptionKey();\n const decipher = createDecipheriv(\n \"aes-256-gcm\",\n key,\n Buffer.from(ivHex, \"hex\"),\n );\n decipher.setAuthTag(Buffer.from(tagHex, \"hex\"));\n const pt = Buffer.concat([\n decipher.update(Buffer.from(ctHex, \"hex\")),\n decipher.final(),\n ]);\n return pt.toString(\"utf8\");\n}\n\n/**\n * Strict check for a value produced by `encryptSecretValue`: `v1:` followed by\n * three hex segments. Intentionally strict so a legacy plaintext credential\n * that merely happens to start with `v1:` is treated as plaintext (and read via\n * the legacy fallback) rather than mis-decrypted.\n */\nconst ENCRYPTED_VALUE_RE = /^v1:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+$/;\n\nexport function isEncryptedSecretValue(value: unknown): value is string {\n return typeof value === \"string\" && ENCRYPTED_VALUE_RE.test(value);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"crypto.js","sourceRoot":"","sources":["../../src/secrets/crypto.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared AES-256-GCM encryption for secret values at rest.\n *\n * Used by both the framework secrets vault (`app_secrets`) and per-user/per-org\n * credentials (`resolveCredential` / `saveCredential`, stored in `settings`) so\n * there is a single crypto implementation and a single key story.\n *\n * The encryption key is derived from `<APP_NAME>_SECRETS_ENCRYPTION_KEY` when\n * set, then `SECRETS_ENCRYPTION_KEY`, then `BETTER_AUTH_SECRET`. The app-scoped\n * key lets a local multi-app workspace read one app's encrypted production data\n * without replacing the shared local auth secret. In production we refuse to\n * start without configured key material — a CWD-derived fallback would be\n * effectively static (e.g. `/var/task` on Lambda), so anyone with read access\n * to the DB could decrypt every secret.\n *\n * Encrypted values are tagged `v1:<iv-hex>:<ct-hex>:<tag-hex>`. The `v1:` prefix\n * lets readers distinguish ciphertext from legacy plaintext during migration.\n */\n\ntype NodeCryptoModule = typeof import(\"node:crypto\");\n\nfunction getNodeCrypto(): NodeCryptoModule | undefined {\n if (\n typeof window !== \"undefined\" ||\n typeof process === \"undefined\" ||\n !process.versions?.node ||\n typeof process.getBuiltinModule !== \"function\"\n ) {\n return undefined;\n }\n return process.getBuiltinModule(\"node:crypto\") as\n | NodeCryptoModule\n | undefined;\n}\n\nconst nodeCrypto = getNodeCrypto();\n\nlet _warnedFallback = false;\n\nfunction requireNodeCrypto(): NonNullable<typeof nodeCrypto> {\n if (!nodeCrypto) {\n throw new Error(\n \"[agent-native/secrets] Secret encryption is only available in server/runtime code.\",\n );\n }\n return nodeCrypto;\n}\n\nfunction processNodeEnv(): string | undefined {\n if (typeof process === \"undefined\") return undefined;\n return process.env.NODE_ENV;\n}\n\nfunction processCwd(): string {\n if (typeof process === \"undefined\") return \".\";\n return process.cwd();\n}\n\nfunction appScopedEncryptionKey(): string | undefined {\n if (typeof process === \"undefined\") return undefined;\n const appName = process.env.APP_NAME?.trim() // guard:allow-env-credential — deploy-level app configuration selects the scoped encryption key.\n .toUpperCase()\n .replace(/[^A-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n return appName\n ? process.env[`${appName}_SECRETS_ENCRYPTION_KEY`] // guard:allow-env-credential — deploy-level app encryption material, never a user credential.\n : undefined;\n}\n\n/**\n * Derive a 32-byte AES key from the configured secret material via SHA-256.\n * Re-derived per call (cheap, stateless, and makes rotation easy).\n */\nexport function getSecretEncryptionKey(): Buffer {\n const { createHash } = requireNodeCrypto();\n const explicit =\n appScopedEncryptionKey() ||\n (typeof process === \"undefined\"\n ? undefined\n : process.env.SECRETS_ENCRYPTION_KEY) ||\n (typeof process === \"undefined\"\n ? undefined\n : process.env.BETTER_AUTH_SECRET);\n\n if (!explicit) {\n if (processNodeEnv() === \"production\") {\n const appName =\n typeof process === \"undefined\"\n ? undefined\n : process.env.APP_NAME?.trim() // guard:allow-env-credential — deploy-level app configuration selects the scoped encryption key.\n .toUpperCase()\n .replace(/[^A-Z0-9]+/g, \"_\")\n .replace(/^_+|_+$/g, \"\");\n throw new Error(\n \"[agent-native/secrets] Refusing to start in production without an encryption key. \" +\n `Set ${appName ? `${appName}_SECRETS_ENCRYPTION_KEY, ` : \"\"}SECRETS_ENCRYPTION_KEY, or BETTER_AUTH_SECRET in the deploy environment. ` +\n \"The previous CWD-derived fallback was effectively static (e.g. `/var/task` on Lambda), \" +\n \"which means anyone with read access to the secrets table could decrypt every user's secrets.\",\n );\n }\n if (!_warnedFallback) {\n _warnedFallback = true;\n // eslint-disable-next-line no-console\n console.warn(\n \"[agent-native/secrets] SECRETS_ENCRYPTION_KEY not set — using a machine-local fallback. \" +\n \"Set an app-scoped *_SECRETS_ENCRYPTION_KEY, SECRETS_ENCRYPTION_KEY, or BETTER_AUTH_SECRET for production. \" +\n \"Production deploys without one of these env vars now hard-fail.\",\n );\n }\n }\n\n const material = explicit || `agent-native-secrets:${processCwd()}`;\n return createHash(\"sha256\").update(material).digest();\n}\n\n/** Encrypt a plain-text value. Returns `v1:<iv-hex>:<ct-hex>:<tag-hex>`. */\nexport function encryptSecretValue(plaintext: string): string {\n const { createCipheriv, randomBytes } = requireNodeCrypto();\n const key = getSecretEncryptionKey();\n const iv = randomBytes(12);\n const cipher = createCipheriv(\"aes-256-gcm\", key, iv);\n const ct = Buffer.concat([cipher.update(plaintext, \"utf8\"), cipher.final()]);\n const tag = cipher.getAuthTag();\n return `v1:${iv.toString(\"hex\")}:${ct.toString(\"hex\")}:${tag.toString(\"hex\")}`;\n}\n\n/** Decrypt a value produced by `encryptSecretValue`. Throws on tampering. */\nexport function decryptSecretValue(encrypted: string): string {\n const { createDecipheriv } = requireNodeCrypto();\n if (!encrypted.startsWith(\"v1:\")) {\n throw new Error(\"Unrecognised secret encoding\");\n }\n const [, ivHex, ctHex, tagHex] = encrypted.split(\":\");\n if (!ivHex || !ctHex || !tagHex) {\n throw new Error(\"Corrupt secret payload\");\n }\n const key = getSecretEncryptionKey();\n const decipher = createDecipheriv(\n \"aes-256-gcm\",\n key,\n Buffer.from(ivHex, \"hex\"),\n );\n decipher.setAuthTag(Buffer.from(tagHex, \"hex\"));\n const pt = Buffer.concat([\n decipher.update(Buffer.from(ctHex, \"hex\")),\n decipher.final(),\n ]);\n return pt.toString(\"utf8\");\n}\n\n/**\n * Strict check for a value produced by `encryptSecretValue`: `v1:` followed by\n * three hex segments. Intentionally strict so a legacy plaintext credential\n * that merely happens to start with `v1:` is treated as plaintext (and read via\n * the legacy fallback) rather than mis-decrypted.\n */\nconst ENCRYPTED_VALUE_RE = /^v1:[0-9a-f]+:[0-9a-f]+:[0-9a-f]+$/;\n\nexport function isEncryptedSecretValue(value: unknown): value is string {\n return typeof value === \"string\" && ENCRYPTED_VALUE_RE.test(value);\n}\n"]}
|
|
@@ -2,6 +2,7 @@ export interface NotifyActionChangeOptions {
|
|
|
2
2
|
actionName: string;
|
|
3
3
|
owner?: string;
|
|
4
4
|
orgId?: string;
|
|
5
|
+
requestSource?: string;
|
|
5
6
|
}
|
|
6
7
|
export declare function writeActionChangeMarker(options: NotifyActionChangeOptions): Promise<void>;
|
|
7
8
|
export declare function notifyActionChange(options: NotifyActionChangeOptions): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"action-change.d.ts","sourceRoot":"","sources":["../../src/server/action-change.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"action-change.d.ts","sourceRoot":"","sources":["../../src/server/action-change.ts"],"names":[],"mappings":"AAUA,MAAM,WAAW,yBAAyB;IACxC,UAAU,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB;AAcD,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAaf;AAED,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,yBAAyB,GACjC,OAAO,CAAC,IAAI,CAAC,CAiBf"}
|