@agent-native/core 0.79.17 → 0.79.19
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 +14 -0
- package/corpus/core/docs/content/file-uploads.md +11 -4
- package/corpus/core/docs/content/locales/ar-SA/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/de-DE/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/es-ES/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/fr-FR/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/hi-IN/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/ja-JP/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/ko-KR/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/pt-BR/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/zh-CN/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/locales/zh-TW/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/multi-app-workspace.md +3 -3
- package/corpus/core/docs/content/template-clips.md +14 -5
- package/corpus/core/package.json +1 -1
- package/corpus/core/src/agent/engine/builder-engine.ts +8 -3
- package/corpus/core/src/cli/mcp.ts +11 -6
- package/corpus/core/src/client/AssistantChat.tsx +6 -2
- package/corpus/core/src/client/chat/markdown-renderer.tsx +1 -0
- package/corpus/core/src/client/i18n.tsx +77 -65
- package/corpus/core/src/client/index.ts +7 -1
- package/corpus/core/src/client/org/OrgSwitcher.tsx +5 -5
- package/corpus/core/src/client/org/TeamPage.tsx +11 -3
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +216 -0
- package/corpus/core/src/client/settings/index.ts +5 -0
- package/corpus/core/src/file-upload/index.ts +1 -0
- package/corpus/core/src/file-upload/registry.ts +22 -6
- package/corpus/core/src/file-upload/types.ts +6 -1
- package/corpus/core/src/integrations/adapters/email.ts +26 -18
- package/corpus/core/src/integrations/adapters/slack.ts +8 -7
- package/corpus/core/src/integrations/adapters/telegram.ts +9 -11
- package/corpus/core/src/integrations/adapters/whatsapp.ts +12 -9
- package/corpus/core/src/integrations/plugin.ts +79 -13
- package/corpus/core/src/onboarding/default-steps.ts +6 -3
- package/corpus/core/src/onboarding/types.ts +1 -1
- package/corpus/core/src/org/handlers.ts +1 -1
- package/corpus/core/src/server/agent-chat-plugin.ts +4 -7
- package/corpus/core/src/server/better-auth-instance.ts +19 -62
- package/corpus/core/src/server/core-routes-plugin.ts +93 -180
- package/corpus/core/src/server/create-server.ts +55 -116
- package/corpus/core/src/server/email-actions.ts +3 -6
- package/corpus/core/src/server/email.ts +52 -17
- package/corpus/core/src/server/index.ts +2 -1
- package/corpus/core/src/server/scoped-key-storage.ts +223 -0
- package/corpus/core/src/shared/agent-env.ts +3 -3
- package/corpus/core/src/sharing/actions/share-resource.ts +1 -1
- package/corpus/core/src/styles/agent-native.css +47 -3
- package/corpus/core/src/templates/workspace-root/AGENTS.md +3 -2
- package/corpus/core/src/templates/workspace-root/README.md +1 -1
- package/corpus/core/src/templates/workspace-root/scripts/repair-workspace-org.ts +29 -90
- package/corpus/core/src/terminal/pty-server.ts +3 -38
- package/corpus/core/src/triggers/dispatcher.ts +1 -2
- package/corpus/templates/.retired/issues/package.json +7 -0
- package/corpus/templates/.retired/meeting-notes/package.json +7 -0
- package/corpus/templates/.retired/recruiting/package.json +7 -0
- package/corpus/templates/.retired/scheduling/package.json +7 -0
- package/corpus/templates/.retired/voice/package.json +7 -0
- package/corpus/templates/analytics/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +1 -18
- package/corpus/templates/analytics/app/global.css +15 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +7 -1
- package/corpus/templates/analytics/app/i18n-data.ts +71 -2
- package/corpus/templates/analytics/app/pages/Ask.tsx +1 -1
- package/corpus/templates/analytics/app/pages/Settings.tsx +120 -73
- package/corpus/templates/analytics/app/pages/sessions/SessionsPage.tsx +0 -11
- package/corpus/templates/analytics/app/routes/catalog.tsx +33 -176
- package/corpus/templates/analytics/app/routes/team.tsx +3 -2
- package/corpus/templates/analytics/changelog/2026-06-26-dashboard-templates-are-tucked-into-settings-and-show-simple.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-the-ask-tab-uses-a-softer-dark-gray-canvas-while-sidebar-cha.md +6 -0
- package/corpus/templates/analytics/changelog/2026-06-26-the-sessions-page-shows-a-single-page-title-instead-of-repea.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +37 -28
- package/corpus/templates/assets/app/routes/settings.tsx +65 -43
- package/corpus/templates/assets/app/routes/team.tsx +2 -10
- package/corpus/templates/brain/app/routes/settings.tsx +390 -358
- package/corpus/templates/brain/app/routes/team.tsx +2 -8
- package/corpus/templates/calendar/actions/db-connect.ts +5 -29
- package/corpus/templates/calendar/app/components/CloudUpgrade.tsx +8 -51
- package/corpus/templates/calendar/app/components/calendar/GoogleConnectBanner.tsx +2 -1
- package/corpus/templates/calendar/app/components/calendar/GoogleSetupWizard.tsx +4 -2
- package/corpus/templates/calendar/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/calendar/app/pages/Settings.tsx +304 -271
- package/corpus/templates/calendar/app/routes/_app.team.tsx +2 -17
- package/corpus/templates/calendar/server/handlers/google-auth.ts +22 -9
- package/corpus/templates/calendar/server/lib/booking-emails.ts +1 -1
- package/corpus/templates/calendar/server/lib/event-guest-notifications.ts +1 -1
- package/corpus/templates/calendar/server/lib/google-calendar.ts +48 -28
- package/corpus/templates/chat/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/chat/app/hooks/use-navigation-state.ts +4 -2
- package/corpus/templates/chat/app/routes/settings.tsx +54 -54
- package/corpus/templates/chat/app/routes/team.tsx +2 -10
- package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +7 -2
- package/corpus/templates/clips/.agents/skills/recording/SKILL.md +1 -1
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +7 -0
- package/corpus/templates/clips/AGENTS.md +8 -0
- package/corpus/templates/clips/actions/invite-member.ts +1 -1
- package/corpus/templates/clips/actions/request-transcript.ts +1 -1
- package/corpus/templates/clips/app/components/library/library-layout.tsx +325 -333
- package/corpus/templates/clips/app/components/player/delete-recording-menu.tsx +80 -40
- package/corpus/templates/clips/app/components/player/transcript-panel.tsx +2 -0
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +629 -643
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +263 -158
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +10 -2
- package/corpus/templates/clips/changelog/2026-06-26-long-desktop-recordings-are-checkpointed-so-macos-finalizati.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-non-mac-desktop-recordings-wait-for-upload-transcription.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-recording-details-button-stays-at-the-far-right-on-small-screen.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-s3-compatible-storage-keys-now-save-securely-from-clips-sett.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-shared-clip-links-guide-agents-through-processing-transcripts.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-the-agent-sidebar-now-slides-in-smoothly-without-duplicate-e.md +6 -0
- package/corpus/templates/clips/changelog/2026-06-26-the-clip-details-sidebar-now-collapses-into-a-slide-out-pane.md +6 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +55 -3
- package/corpus/templates/clips/desktop/src/lib/transcription-capture.ts +217 -5
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +176 -5
- package/corpus/templates/clips/server/lib/public-agent-context.ts +31 -0
- package/corpus/templates/clips/server/lib/s3-upload-provider.ts +60 -14
- package/corpus/templates/clips/server/lib/video-storage.ts +37 -9
- package/corpus/templates/clips/server/routes/api/agent-transcript.json.get.ts +5 -0
- package/corpus/templates/content/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/content/app/components/sidebar/NotionButton.tsx +1 -0
- package/corpus/templates/content/app/routes/_app.settings.tsx +54 -55
- package/corpus/templates/content/app/routes/_app.team.tsx +2 -28
- package/corpus/templates/content/server/lib/notion.ts +43 -11
- package/corpus/templates/content/server/routes/api/notion/auth-url.get.ts +2 -2
- package/corpus/templates/content/server/routes/api/notion/status.get.ts +3 -3
- package/corpus/templates/design/app/routes/settings.tsx +60 -38
- package/corpus/templates/design/app/routes/team.tsx +2 -10
- package/corpus/templates/dispatch/app/hooks/use-navigation-state.ts +2 -2
- package/corpus/templates/dispatch/app/routes/settings.tsx +70 -55
- package/corpus/templates/dispatch/app/routes/team.tsx +5 -1
- package/corpus/templates/forms/actions/db-connect.ts +7 -36
- package/corpus/templates/forms/actions/navigate.ts +2 -2
- package/corpus/templates/forms/app/components/CloudUpgrade.tsx +8 -47
- package/corpus/templates/forms/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/forms/app/components/layout/Layout.tsx +42 -25
- package/corpus/templates/forms/app/components/layout/Sidebar.tsx +35 -76
- package/corpus/templates/forms/app/global.css +9 -25
- package/corpus/templates/forms/app/hooks/use-navigation-state.ts +4 -4
- package/corpus/templates/forms/app/i18n/ar-SA.ts +1 -0
- package/corpus/templates/forms/app/i18n/de-DE.ts +1 -0
- package/corpus/templates/forms/app/i18n/en-US.ts +1 -0
- package/corpus/templates/forms/app/i18n/es-ES.ts +1 -0
- package/corpus/templates/forms/app/i18n/fr-FR.ts +1 -0
- package/corpus/templates/forms/app/i18n/hi-IN.ts +1 -0
- package/corpus/templates/forms/app/i18n/ja-JP.ts +1 -0
- package/corpus/templates/forms/app/i18n/ko-KR.ts +1 -0
- package/corpus/templates/forms/app/i18n/pt-BR.ts +1 -0
- package/corpus/templates/forms/app/i18n/zh-CN.ts +1 -0
- package/corpus/templates/forms/app/i18n/zh-TW.ts +1 -0
- package/corpus/templates/forms/app/lib/route-prewarm.ts +9 -8
- package/corpus/templates/forms/app/pages/AskPage.tsx +70 -0
- package/corpus/templates/forms/app/pages/FormsListPage.tsx +74 -81
- package/corpus/templates/forms/app/root.tsx +1 -1
- package/corpus/templates/forms/app/routes/_app.ask.tsx +14 -0
- package/corpus/templates/forms/app/routes/_app.settings.tsx +54 -54
- package/corpus/templates/forms/app/routes/_app.team.tsx +2 -9
- package/corpus/templates/forms/app/routes/_index.tsx +21 -130
- package/corpus/templates/forms/changelog/2026-06-26-ask-forms-opens-as-a-standard-app-tab-with-a-simpler-sidebar.md +6 -0
- package/corpus/templates/forms/changelog/2026-06-26-forms-are-shown-in-a-tighter-row-list-with-a-denser-sidebar.md +6 -0
- package/corpus/templates/forms/shared/navigation.ts +4 -2
- package/corpus/templates/macros/app/routes/settings.tsx +54 -54
- package/corpus/templates/macros/app/routes/team.tsx +2 -10
- package/corpus/templates/mail/actions/helpers.ts +2 -2
- package/corpus/templates/mail/app/components/GoogleConnectBanner.tsx +2 -1
- package/corpus/templates/mail/app/pages/SettingsPage.tsx +5 -5
- package/corpus/templates/mail/app/routes/team.tsx +3 -2
- package/corpus/templates/mail/server/handlers/emails.ts +3 -2
- package/corpus/templates/mail/server/handlers/google-auth.ts +19 -12
- package/corpus/templates/mail/server/lib/automation-engine.ts +3 -2
- package/corpus/templates/mail/server/lib/email-state.ts +2 -3
- package/corpus/templates/mail/server/lib/google-auth.ts +28 -11
- package/corpus/templates/mail/server/lib/jobs.ts +3 -2
- package/corpus/templates/mail/server/onboarding.ts +9 -6
- package/corpus/templates/mail/server/routes/api/attachments.get.ts +3 -3
- package/corpus/templates/plan/actions/request-plan-access.ts +1 -1
- package/corpus/templates/plan/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/plan/app/components/plan/CanvasArea.tsx +56 -4
- package/corpus/templates/plan/app/global.css +8 -3
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +4 -2
- package/corpus/templates/plan/app/lib/route-prewarm.ts +0 -4
- package/corpus/templates/plan/app/pages/PlansPage.tsx +1 -1
- package/corpus/templates/plan/app/routes/settings.tsx +75 -73
- package/corpus/templates/plan/app/routes/team.tsx +2 -8
- package/corpus/templates/plan/changelog/2026-06-26-canvas-grid-panning-now-stays-smooth-and-fills-the-workspace.md +6 -0
- package/corpus/templates/plan/server/lib/comment-notifications.ts +1 -1
- package/corpus/templates/slides/actions/check-image-gen.ts +2 -1
- package/corpus/templates/slides/actions/db-connect.ts +7 -45
- package/corpus/templates/slides/actions/edit-image.ts +6 -3
- package/corpus/templates/slides/actions/generate-image-api.ts +1 -1
- package/corpus/templates/slides/actions/generate-image.ts +2 -2
- package/corpus/templates/slides/actions/generate-slides-ai.ts +5 -3
- package/corpus/templates/slides/actions/image-gen-status.ts +4 -3
- package/corpus/templates/slides/actions/image-search.ts +6 -3
- package/corpus/templates/slides/actions/search-images.ts +6 -3
- package/corpus/templates/slides/app/components/CloudUpgrade.tsx +8 -51
- package/corpus/templates/slides/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/slides/app/components/layout/Sidebar.tsx +0 -2
- package/corpus/templates/slides/app/routes/settings.tsx +54 -54
- package/corpus/templates/slides/app/routes/team.tsx +2 -12
- package/corpus/templates/slides/server/handlers/google-docs-auth.ts +9 -9
- package/corpus/templates/slides/server/handlers/image-gen.ts +5 -1
- package/corpus/templates/slides/server/handlers/image-providers/gemini.ts +9 -1
- package/corpus/templates/slides/server/handlers/image-providers/index.ts +18 -8
- package/corpus/templates/slides/server/handlers/image-providers/openai.ts +10 -4
- package/corpus/templates/slides/server/handlers/image-providers/types.ts +1 -0
- package/corpus/templates/slides/server/lib/google-docs-oauth.ts +59 -34
- package/corpus/templates/slides/server/register-secrets.ts +60 -0
- package/corpus/templates/videos/actions/db-connect.ts +7 -45
- package/corpus/templates/videos/app/components/CloudUpgrade.tsx +8 -51
- package/corpus/templates/videos/app/components/Sidebar.tsx +1 -9
- package/corpus/templates/videos/app/components/layout/Header.tsx +0 -1
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -3
- package/corpus/templates/videos/app/routes/settings.tsx +54 -54
- package/corpus/templates/videos/app/routes/team.tsx +2 -8
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +8 -3
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/cli/mcp.d.ts.map +1 -1
- package/dist/cli/mcp.js +3 -4
- package/dist/cli/mcp.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +6 -2
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/chat/markdown-renderer.d.ts.map +1 -1
- package/dist/client/chat/markdown-renderer.js +1 -0
- package/dist/client/chat/markdown-renderer.js.map +1 -1
- package/dist/client/i18n.d.ts.map +1 -1
- package/dist/client/i18n.js +20 -9
- package/dist/client/i18n.js.map +1 -1
- package/dist/client/index.d.ts +1 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +3 -3
- package/dist/client/org/OrgSwitcher.js +2 -2
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts +6 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +2 -2
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts +27 -0
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -0
- package/dist/client/settings/SettingsTabsPage.js +108 -0
- package/dist/client/settings/SettingsTabsPage.js.map +1 -0
- package/dist/client/settings/index.d.ts +1 -0
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -0
- package/dist/client/settings/index.js.map +1 -1
- package/dist/file-upload/index.d.ts +1 -1
- package/dist/file-upload/index.d.ts.map +1 -1
- package/dist/file-upload/index.js +1 -1
- package/dist/file-upload/index.js.map +1 -1
- package/dist/file-upload/registry.d.ts +1 -0
- package/dist/file-upload/registry.d.ts.map +1 -1
- package/dist/file-upload/registry.js +24 -6
- package/dist/file-upload/registry.js.map +1 -1
- package/dist/file-upload/types.d.ts +6 -1
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/integrations/adapters/email.d.ts.map +1 -1
- package/dist/integrations/adapters/email.js +18 -18
- package/dist/integrations/adapters/email.js.map +1 -1
- package/dist/integrations/adapters/slack.d.ts.map +1 -1
- package/dist/integrations/adapters/slack.js +8 -7
- package/dist/integrations/adapters/slack.js.map +1 -1
- package/dist/integrations/adapters/telegram.d.ts.map +1 -1
- package/dist/integrations/adapters/telegram.js +9 -9
- package/dist/integrations/adapters/telegram.js.map +1 -1
- package/dist/integrations/adapters/whatsapp.d.ts.map +1 -1
- package/dist/integrations/adapters/whatsapp.js +10 -9
- package/dist/integrations/adapters/whatsapp.js.map +1 -1
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +47 -13
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +6 -6
- package/dist/onboarding/default-steps.d.ts.map +1 -1
- package/dist/onboarding/default-steps.js +6 -5
- package/dist/onboarding/default-steps.js.map +1 -1
- package/dist/onboarding/types.d.ts +1 -1
- package/dist/onboarding/types.d.ts.map +1 -1
- package/dist/onboarding/types.js.map +1 -1
- package/dist/org/handlers.js +1 -1
- package/dist/org/handlers.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +4 -6
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +2 -2
- package/dist/server/better-auth-instance.d.ts.map +1 -1
- package/dist/server/better-auth-instance.js +17 -56
- package/dist/server/better-auth-instance.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +67 -153
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/create-server.d.ts +3 -9
- package/dist/server/create-server.d.ts.map +1 -1
- package/dist/server/create-server.js +37 -91
- package/dist/server/create-server.js.map +1 -1
- package/dist/server/email-actions.d.ts +2 -3
- package/dist/server/email-actions.d.ts.map +1 -1
- package/dist/server/email-actions.js +3 -6
- package/dist/server/email-actions.js.map +1 -1
- package/dist/server/email.d.ts +3 -3
- package/dist/server/email.d.ts.map +1 -1
- package/dist/server/email.js +40 -19
- package/dist/server/email.js.map +1 -1
- package/dist/server/index.d.ts +3 -3
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +3 -3
- package/dist/server/index.js.map +1 -1
- package/dist/server/scoped-key-storage.d.ts +22 -0
- package/dist/server/scoped-key-storage.d.ts.map +1 -0
- package/dist/server/scoped-key-storage.js +152 -0
- package/dist/server/scoped-key-storage.js.map +1 -0
- package/dist/shared/agent-env.d.ts +3 -3
- package/dist/shared/agent-env.d.ts.map +1 -1
- package/dist/shared/agent-env.js +3 -3
- package/dist/shared/agent-env.js.map +1 -1
- package/dist/sharing/actions/share-resource.js +1 -1
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/styles/agent-native.css +47 -3
- package/dist/templates/workspace-root/AGENTS.md +3 -2
- package/dist/templates/workspace-root/README.md +1 -1
- package/dist/templates/workspace-root/scripts/repair-workspace-org.ts +29 -90
- package/dist/terminal/pty-server.d.ts.map +1 -1
- package/dist/terminal/pty-server.js +3 -36
- package/dist/terminal/pty-server.js.map +1 -1
- package/dist/triggers/dispatcher.js +1 -1
- package/dist/triggers/dispatcher.js.map +1 -1
- package/docs/content/file-uploads.md +11 -4
- package/docs/content/locales/ar-SA/multi-app-workspace.md +3 -3
- package/docs/content/locales/de-DE/multi-app-workspace.md +3 -3
- package/docs/content/locales/es-ES/multi-app-workspace.md +3 -3
- package/docs/content/locales/fr-FR/multi-app-workspace.md +3 -3
- package/docs/content/locales/hi-IN/multi-app-workspace.md +3 -3
- package/docs/content/locales/ja-JP/multi-app-workspace.md +3 -3
- package/docs/content/locales/ko-KR/multi-app-workspace.md +3 -3
- package/docs/content/locales/pt-BR/multi-app-workspace.md +3 -3
- package/docs/content/locales/zh-CN/multi-app-workspace.md +3 -3
- package/docs/content/locales/zh-TW/multi-app-workspace.md +3 -3
- package/docs/content/multi-app-workspace.md +3 -3
- package/docs/content/template-clips.md +14 -5
- package/package.json +1 -1
- package/src/templates/workspace-root/AGENTS.md +3 -2
- package/src/templates/workspace-root/README.md +1 -1
- package/src/templates/workspace-root/scripts/repair-workspace-org.ts +29 -90
- package/corpus/core/src/server/env-var-writes.ts +0 -16
- package/corpus/templates/analytics/app/pages/Team.tsx +0 -9
- package/corpus/templates/calendar/app/pages/Team.tsx +0 -12
- package/corpus/templates/mail/app/pages/Team.tsx +0 -17
- package/dist/server/env-var-writes.d.ts +0 -10
- package/dist/server/env-var-writes.d.ts.map +0 -1
- package/dist/server/env-var-writes.js +0 -18
- package/dist/server/env-var-writes.js.map +0 -1
|
@@ -55,6 +55,8 @@
|
|
|
55
55
|
--agent-native-lower-surface: hsl(
|
|
56
56
|
var(--sidebar-background, var(--background))
|
|
57
57
|
);
|
|
58
|
+
--agent-native-raised-surface: hsl(var(--background));
|
|
59
|
+
--agent-native-card-surface: hsl(var(--card));
|
|
58
60
|
--agent-native-raised-border: hsl(var(--border));
|
|
59
61
|
--agent-native-raised-radius: 8px;
|
|
60
62
|
--agent-native-raised-shadow-left: -1px 0 3px rgb(0 0 0 / 0.018);
|
|
@@ -86,6 +88,16 @@
|
|
|
86
88
|
hsl(var(--sidebar-background, var(--background))) 94%,
|
|
87
89
|
black
|
|
88
90
|
);
|
|
91
|
+
--agent-native-raised-surface: color-mix(
|
|
92
|
+
in srgb,
|
|
93
|
+
hsl(var(--background)) 78%,
|
|
94
|
+
hsl(var(--muted)) 22%
|
|
95
|
+
);
|
|
96
|
+
--agent-native-card-surface: color-mix(
|
|
97
|
+
in srgb,
|
|
98
|
+
var(--agent-native-raised-surface) 88%,
|
|
99
|
+
hsl(var(--muted)) 12%
|
|
100
|
+
);
|
|
89
101
|
}
|
|
90
102
|
}
|
|
91
103
|
|
|
@@ -126,7 +138,7 @@
|
|
|
126
138
|
.agent-sidebar-main-surface {
|
|
127
139
|
position: relative;
|
|
128
140
|
z-index: 1;
|
|
129
|
-
background:
|
|
141
|
+
background: var(--agent-native-raised-surface);
|
|
130
142
|
transition:
|
|
131
143
|
border-radius 260ms cubic-bezier(0.32, 0.72, 0, 1),
|
|
132
144
|
border-color 260ms cubic-bezier(0.32, 0.72, 0, 1),
|
|
@@ -136,17 +148,49 @@
|
|
|
136
148
|
.agent-layout-shell
|
|
137
149
|
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
138
150
|
> :first-child
|
|
139
|
-
> :where(header, div).border-b
|
|
151
|
+
> :where(header, div).border-b,
|
|
140
152
|
.agent-layout-shell
|
|
141
153
|
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
142
|
-
> :where(header, div).border-b
|
|
154
|
+
> :where(header, div).border-b,
|
|
143
155
|
.agent-layout-shell
|
|
144
156
|
.agent-layout-left-drawer
|
|
145
157
|
> :where(header, div).border-b:first-child,
|
|
158
|
+
.agent-layout-shell
|
|
159
|
+
.agent-layout-left-drawer
|
|
160
|
+
> :first-child
|
|
161
|
+
> :where(header, div).border-b,
|
|
146
162
|
.agent-layout-shell .agent-native-shell-topbar {
|
|
147
163
|
border-bottom-color: transparent !important;
|
|
148
164
|
}
|
|
149
165
|
|
|
166
|
+
.agent-layout-shell
|
|
167
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
168
|
+
> :first-child
|
|
169
|
+
> :where(header, div).border-b,
|
|
170
|
+
.agent-layout-shell
|
|
171
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
172
|
+
> :where(header, div).border-b {
|
|
173
|
+
background-color: var(--agent-native-raised-surface) !important;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
.agent-layout-shell
|
|
177
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
178
|
+
> :first-child
|
|
179
|
+
> :where(header, div).border-b.h-12,
|
|
180
|
+
.agent-layout-shell
|
|
181
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
182
|
+
> :where(header, div).border-b.h-12 {
|
|
183
|
+
min-height: 4rem;
|
|
184
|
+
height: 4rem;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
.dark
|
|
188
|
+
.agent-layout-shell
|
|
189
|
+
:where(.agent-layout-main-surface, .agent-sidebar-main-surface)
|
|
190
|
+
:where(.bg-card) {
|
|
191
|
+
background-color: var(--agent-native-card-surface) !important;
|
|
192
|
+
}
|
|
193
|
+
|
|
150
194
|
@media (min-width: 768px) {
|
|
151
195
|
.agent-layout-main-surface,
|
|
152
196
|
.agent-layout-shell > .agent-sidebar-shell > .agent-sidebar-main-surface {
|
|
@@ -170,7 +170,8 @@ Use the workspace root `.env` for shared identity and cross-app trust settings:
|
|
|
170
170
|
- `WORKSPACE_OWNER_EMAIL` — initial owner/admin email for repairs and
|
|
171
171
|
integration defaults.
|
|
172
172
|
- `A2A_SECRET` — shared secret for cross-app A2A signing. Generate with
|
|
173
|
-
`openssl rand -hex 32`
|
|
173
|
+
`openssl rand -hex 32` and configure through your deployment/scoped secret
|
|
174
|
+
manager.
|
|
174
175
|
|
|
175
176
|
`DISPATCH_DEFAULT_OWNER_EMAIL` is optional. Set it only for trusted,
|
|
176
177
|
single-workspace deployments where unlinked integration requests should run as
|
|
@@ -183,7 +184,7 @@ When asked to repair workspace org or A2A configuration:
|
|
|
183
184
|
1. Read `.env` first. Do not infer the organization, domain, owner email, or
|
|
184
185
|
secret from old examples.
|
|
185
186
|
2. Run `pnpm repair:workspace-org -- --name "<org>" --domain example.com --owner-email owner@example.com`
|
|
186
|
-
to
|
|
187
|
+
to validate generic workspace identity values without writing `.env`.
|
|
187
188
|
3. Prefer the app's organization settings UI or authenticated org routes for
|
|
188
189
|
changing `allowed_domain` and `a2a_secret`.
|
|
189
190
|
4. If direct SQL is unavoidable, inspect the live schema first and use only
|
|
@@ -97,7 +97,7 @@ cross-app trust:
|
|
|
97
97
|
- `A2A_SECRET` — shared signing secret for cross-app A2A calls.
|
|
98
98
|
|
|
99
99
|
Run `pnpm repair:workspace-org -- --name "<org>" --domain example.com --owner-email owner@example.com`
|
|
100
|
-
to
|
|
100
|
+
to validate those values without writing env files. Existing
|
|
101
101
|
organization rows should still be repaired through the app's org settings UI or
|
|
102
102
|
authenticated org routes whenever possible.
|
|
103
103
|
|
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env tsx
|
|
2
2
|
|
|
3
|
-
import crypto from "node:crypto";
|
|
4
3
|
import fs from "node:fs";
|
|
5
4
|
import path from "node:path";
|
|
6
5
|
|
|
@@ -10,8 +9,6 @@ interface Options {
|
|
|
10
9
|
ownerEmail?: string;
|
|
11
10
|
a2aSecret?: string;
|
|
12
11
|
envPath: string;
|
|
13
|
-
force: boolean;
|
|
14
|
-
dryRun: boolean;
|
|
15
12
|
setDispatchDefaultOwner: boolean;
|
|
16
13
|
}
|
|
17
14
|
|
|
@@ -22,10 +19,10 @@ Options:
|
|
|
22
19
|
--name <value> Sets WORKSPACE_ORG_NAME
|
|
23
20
|
--domain <value> Sets WORKSPACE_ORG_DOMAIN
|
|
24
21
|
--owner-email <value> Sets WORKSPACE_OWNER_EMAIL
|
|
25
|
-
--a2a-secret <value>
|
|
26
|
-
--env <path> Env file to
|
|
27
|
-
--force
|
|
28
|
-
--dry-run
|
|
22
|
+
--a2a-secret <value> Reads A2A_SECRET for validation
|
|
23
|
+
--env <path> Env file to read for fallback values (default: .env)
|
|
24
|
+
--force Accepted for compatibility; no file is written
|
|
25
|
+
--dry-run Accepted for compatibility; no file is written
|
|
29
26
|
--set-dispatch-default-owner Also set DISPATCH_DEFAULT_OWNER_EMAIL
|
|
30
27
|
`;
|
|
31
28
|
|
|
@@ -41,8 +38,6 @@ type RequiredKey = (typeof REQUIRED_KEYS)[number];
|
|
|
41
38
|
function parseArgs(argv: string[]): Options {
|
|
42
39
|
const opts: Options = {
|
|
43
40
|
envPath: ".env",
|
|
44
|
-
force: false,
|
|
45
|
-
dryRun: false,
|
|
46
41
|
setDispatchDefaultOwner: false,
|
|
47
42
|
};
|
|
48
43
|
|
|
@@ -78,10 +73,8 @@ function parseArgs(argv: string[]): Options {
|
|
|
78
73
|
opts.envPath = value();
|
|
79
74
|
break;
|
|
80
75
|
case "--force":
|
|
81
|
-
opts.force = true;
|
|
82
76
|
break;
|
|
83
77
|
case "--dry-run":
|
|
84
|
-
opts.dryRun = true;
|
|
85
78
|
break;
|
|
86
79
|
case "--set-dispatch-default-owner":
|
|
87
80
|
opts.setDispatchDefaultOwner = true;
|
|
@@ -147,47 +140,6 @@ function validateEmail(email: string): void {
|
|
|
147
140
|
}
|
|
148
141
|
}
|
|
149
142
|
|
|
150
|
-
function formatEnvValue(value: string): string {
|
|
151
|
-
if (/^[A-Za-z0-9_@./:+-]+$/.test(value)) return value;
|
|
152
|
-
return JSON.stringify(value);
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
function upsertEnvValue(
|
|
156
|
-
content: string,
|
|
157
|
-
key: string,
|
|
158
|
-
value: string,
|
|
159
|
-
force: boolean,
|
|
160
|
-
): { content: string; changed: boolean; skipped: boolean } {
|
|
161
|
-
const lines = content.length > 0 ? content.split(/\r?\n/) : [];
|
|
162
|
-
let found = false;
|
|
163
|
-
let changed = false;
|
|
164
|
-
let skipped = false;
|
|
165
|
-
|
|
166
|
-
const next = lines.map((line) => {
|
|
167
|
-
const match = line.match(/^(\s*)([A-Z0-9_]+)(\s*=\s*)(.*)$/);
|
|
168
|
-
if (!match || match[2] !== key) return line;
|
|
169
|
-
|
|
170
|
-
found = true;
|
|
171
|
-
const existing = unquote(match[4]);
|
|
172
|
-
if (existing && !force) {
|
|
173
|
-
skipped = true;
|
|
174
|
-
return line;
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
const replacement = `${match[1]}${key}${match[3]}${formatEnvValue(value)}`;
|
|
178
|
-
if (replacement !== line) changed = true;
|
|
179
|
-
return replacement;
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
if (!found) {
|
|
183
|
-
if (next.length > 0 && next[next.length - 1] !== "") next.push("");
|
|
184
|
-
next.push(`${key}=${formatEnvValue(value)}`);
|
|
185
|
-
changed = true;
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
return { content: next.join("\n"), changed, skipped };
|
|
189
|
-
}
|
|
190
|
-
|
|
191
143
|
function firstValue(...values: Array<string | undefined>): string | undefined {
|
|
192
144
|
return values.map((v) => v?.trim()).find(Boolean);
|
|
193
145
|
}
|
|
@@ -213,13 +165,21 @@ function main(): void {
|
|
|
213
165
|
process.env.WORKSPACE_OWNER_EMAIL,
|
|
214
166
|
current.WORKSPACE_OWNER_EMAIL,
|
|
215
167
|
)?.toLowerCase();
|
|
216
|
-
const a2aSecret =
|
|
217
|
-
|
|
218
|
-
|
|
168
|
+
const a2aSecret = firstValue(
|
|
169
|
+
opts.a2aSecret,
|
|
170
|
+
process.env.A2A_SECRET,
|
|
171
|
+
current.A2A_SECRET,
|
|
172
|
+
);
|
|
219
173
|
|
|
220
174
|
if (!name) fail("--name or WORKSPACE_ORG_NAME is required.");
|
|
221
175
|
if (!rawDomain) fail("--domain or WORKSPACE_ORG_DOMAIN is required.");
|
|
222
176
|
if (!ownerEmail) fail("--owner-email or WORKSPACE_OWNER_EMAIL is required.");
|
|
177
|
+
if (!a2aSecret) {
|
|
178
|
+
fail(
|
|
179
|
+
"--a2a-secret or A2A_SECRET is required. This script reads existing " +
|
|
180
|
+
"configuration but does not write env files.",
|
|
181
|
+
);
|
|
182
|
+
}
|
|
223
183
|
|
|
224
184
|
const domain = normalizeDomain(rawDomain);
|
|
225
185
|
validateDomain(domain);
|
|
@@ -232,52 +192,31 @@ function main(): void {
|
|
|
232
192
|
A2A_SECRET: a2aSecret,
|
|
233
193
|
};
|
|
234
194
|
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
for (const key of REQUIRED_KEYS) {
|
|
240
|
-
const result = upsertEnvValue(next, key, desired[key], opts.force);
|
|
241
|
-
next = result.content;
|
|
242
|
-
if (result.changed) changed.push(key);
|
|
243
|
-
if (result.skipped) skipped.push(key);
|
|
244
|
-
}
|
|
245
|
-
|
|
195
|
+
const displayEntries: Array<[string, string]> = REQUIRED_KEYS.map((key) => [
|
|
196
|
+
key,
|
|
197
|
+
key === "A2A_SECRET" ? "[configured]" : desired[key],
|
|
198
|
+
]);
|
|
246
199
|
if (opts.setDispatchDefaultOwner) {
|
|
247
|
-
|
|
248
|
-
next,
|
|
249
|
-
"DISPATCH_DEFAULT_OWNER_EMAIL",
|
|
250
|
-
ownerEmail,
|
|
251
|
-
opts.force,
|
|
252
|
-
);
|
|
253
|
-
next = result.content;
|
|
254
|
-
if (result.changed) changed.push("DISPATCH_DEFAULT_OWNER_EMAIL");
|
|
255
|
-
if (result.skipped) skipped.push("DISPATCH_DEFAULT_OWNER_EMAIL");
|
|
256
|
-
}
|
|
257
|
-
|
|
258
|
-
next = next.trimEnd() + "\n";
|
|
259
|
-
|
|
260
|
-
if (opts.dryRun) {
|
|
261
|
-
console.log(next);
|
|
262
|
-
} else {
|
|
263
|
-
fs.writeFileSync(envPath, next);
|
|
200
|
+
displayEntries.push(["DISPATCH_DEFAULT_OWNER_EMAIL", ownerEmail]);
|
|
264
201
|
}
|
|
265
202
|
|
|
266
203
|
console.log(
|
|
267
|
-
|
|
204
|
+
`Validated workspace org settings from ${path.relative(process.cwd(), envPath) || envPath}.`,
|
|
268
205
|
);
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
);
|
|
206
|
+
console.log("No env files were written.");
|
|
207
|
+
console.log("");
|
|
208
|
+
console.log("Resolved configuration:");
|
|
209
|
+
for (const [key, value] of displayEntries) {
|
|
210
|
+
console.log(`- ${key}: ${value}`);
|
|
274
211
|
}
|
|
275
212
|
console.log("");
|
|
276
213
|
console.log("Next steps:");
|
|
277
214
|
console.log("1. Sign in as WORKSPACE_OWNER_EMAIL.");
|
|
278
215
|
console.log("2. Create or select the org named by WORKSPACE_ORG_NAME.");
|
|
279
216
|
console.log("3. Set the org allowed domain to WORKSPACE_ORG_DOMAIN.");
|
|
280
|
-
console.log(
|
|
217
|
+
console.log(
|
|
218
|
+
"4. Configure A2A_SECRET through the scoped secret/deployment secret manager for apps that need cross-app A2A.",
|
|
219
|
+
);
|
|
281
220
|
}
|
|
282
221
|
|
|
283
222
|
main();
|
|
@@ -30,14 +30,6 @@ async function getChildProcess(): Promise<typeof import("child_process")> {
|
|
|
30
30
|
return _cp;
|
|
31
31
|
}
|
|
32
32
|
|
|
33
|
-
let _fs: typeof import("fs") | undefined;
|
|
34
|
-
async function getFs(): Promise<typeof import("fs")> {
|
|
35
|
-
if (!_fs) {
|
|
36
|
-
_fs = await import("node:fs");
|
|
37
|
-
}
|
|
38
|
-
return _fs;
|
|
39
|
-
}
|
|
40
|
-
|
|
41
33
|
/**
|
|
42
34
|
* Kill a process and all its descendants.
|
|
43
35
|
* node-pty's kill() only sends a signal to the shell, but child processes
|
|
@@ -314,10 +306,10 @@ export async function createPtyWebSocketServer(
|
|
|
314
306
|
msg.type === "agentNative.setEnvVars" &&
|
|
315
307
|
Array.isArray(msg.data?.vars)
|
|
316
308
|
) {
|
|
317
|
-
const envPath = path.join(resolvedAppDir, ".env");
|
|
318
309
|
const vars: Array<{ key: string; value: string }> = msg.data.vars;
|
|
319
310
|
|
|
320
|
-
//
|
|
311
|
+
// Legacy bridge message. Keep validating the keys, but do not persist
|
|
312
|
+
// them to .env or process.env; key storage is DB-scoped.
|
|
321
313
|
const validKeyPattern = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
322
314
|
const sanitizedVars = vars.filter(({ key }) => {
|
|
323
315
|
if (!validKeyPattern.test(key)) {
|
|
@@ -327,39 +319,12 @@ export async function createPtyWebSocketServer(
|
|
|
327
319
|
return true;
|
|
328
320
|
});
|
|
329
321
|
|
|
330
|
-
const fs = await getFs();
|
|
331
|
-
let lines: string[] = [];
|
|
332
|
-
try {
|
|
333
|
-
lines = fs.readFileSync(envPath, "utf-8").split("\n");
|
|
334
|
-
} catch {}
|
|
335
|
-
|
|
336
|
-
for (const { key, value } of sanitizedVars) {
|
|
337
|
-
// Strip newlines/null bytes to prevent line injection
|
|
338
|
-
const safeValue = value.replace(/[\r\n\0]/g, "");
|
|
339
|
-
// Quote values containing #, spaces, or quotes so dotenv parses correctly
|
|
340
|
-
const needsQuoting = /[# "']/.test(safeValue);
|
|
341
|
-
const quotedValue = needsQuoting
|
|
342
|
-
? `"${safeValue.replace(/"/g, '\\"')}"`
|
|
343
|
-
: safeValue;
|
|
344
|
-
const idx = lines.findIndex((l) => l.startsWith(`${key}=`));
|
|
345
|
-
const entry = `${key}=${quotedValue}`;
|
|
346
|
-
if (idx !== -1) {
|
|
347
|
-
lines[idx] = entry;
|
|
348
|
-
} else {
|
|
349
|
-
lines.push(entry);
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
|
|
353
|
-
while (lines.length > 0 && lines[lines.length - 1] === "") {
|
|
354
|
-
lines.pop();
|
|
355
|
-
}
|
|
356
|
-
fs.writeFileSync(envPath, lines.join("\n") + "\n", "utf-8");
|
|
357
|
-
|
|
358
322
|
if (ws.readyState === WebSocket.OPEN) {
|
|
359
323
|
ws.send(
|
|
360
324
|
JSON.stringify({
|
|
361
325
|
type: "env-vars-saved",
|
|
362
326
|
keys: sanitizedVars.map((v) => v.key),
|
|
327
|
+
storage: "scoped-secrets",
|
|
363
328
|
}),
|
|
364
329
|
);
|
|
365
330
|
}
|
|
@@ -257,8 +257,7 @@ async function handleEvent(
|
|
|
257
257
|
// Resolve API key for condition evaluation
|
|
258
258
|
const owner = meta.createdBy || resource.owner;
|
|
259
259
|
const userApiKey = await getOwnerActiveApiKey(owner);
|
|
260
|
-
const apiKey =
|
|
261
|
-
userApiKey || _deps.apiKey || process.env.ANTHROPIC_API_KEY;
|
|
260
|
+
const apiKey = userApiKey || _deps.apiKey;
|
|
262
261
|
if (!apiKey) {
|
|
263
262
|
console.warn(
|
|
264
263
|
`[triggers] No API key for trigger "${resource.path}" — skipping`,
|
|
@@ -10,11 +10,9 @@ import {
|
|
|
10
10
|
IconGripVertical,
|
|
11
11
|
IconBook2,
|
|
12
12
|
IconDatabase,
|
|
13
|
-
IconUsers,
|
|
14
13
|
IconReportAnalytics,
|
|
15
14
|
IconSearch,
|
|
16
15
|
IconArchive,
|
|
17
|
-
IconTemplate,
|
|
18
16
|
IconBuilding,
|
|
19
17
|
IconLock,
|
|
20
18
|
IconLink,
|
|
@@ -144,7 +142,6 @@ import {
|
|
|
144
142
|
import { CSS } from "@dnd-kit/utilities";
|
|
145
143
|
|
|
146
144
|
const bottomItems = [
|
|
147
|
-
{ icon: IconUsers, labelKey: "navigation.team", href: "/team" },
|
|
148
145
|
{ icon: IconSettings, labelKey: "navigation.settings", href: "/settings" },
|
|
149
146
|
];
|
|
150
147
|
|
|
@@ -1962,20 +1959,6 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
|
|
|
1962
1959
|
{t("navigation.dataDictionary")}
|
|
1963
1960
|
</Link>
|
|
1964
1961
|
|
|
1965
|
-
{/* Catalog link */}
|
|
1966
|
-
<Link
|
|
1967
|
-
to="/catalog"
|
|
1968
|
-
className={cn(
|
|
1969
|
-
"flex items-center gap-3 rounded-lg px-3 py-2 transition-all hover:text-primary",
|
|
1970
|
-
location.pathname === "/catalog"
|
|
1971
|
-
? "bg-sidebar-accent text-sidebar-accent-foreground"
|
|
1972
|
-
: "text-muted-foreground hover:bg-sidebar-accent/50",
|
|
1973
|
-
)}
|
|
1974
|
-
>
|
|
1975
|
-
<IconTemplate className="h-4 w-4" />
|
|
1976
|
-
{t("navigation.templateCatalog")}
|
|
1977
|
-
</Link>
|
|
1978
|
-
|
|
1979
1962
|
{/* Dashboards section */}
|
|
1980
1963
|
<div className="group/section min-w-0 space-y-1">
|
|
1981
1964
|
<div
|
|
@@ -2280,7 +2263,7 @@ export function Sidebar({ mobile }: { mobile?: boolean } = {}) {
|
|
|
2280
2263
|
<LanguagePicker
|
|
2281
2264
|
variant="icon"
|
|
2282
2265
|
label={t("settings.languageLabel")}
|
|
2283
|
-
className="[&_[
|
|
2266
|
+
className="[&_[data-language-picker-trigger]]:rounded-lg [&_[data-language-picker-trigger]]:border-0 [&_[data-language-picker-trigger]]:bg-transparent [&_[data-language-picker-trigger]]:text-muted-foreground [&_[data-language-picker-trigger]]:hover:bg-sidebar-accent/50 [&_[data-language-picker-trigger]]:hover:text-primary"
|
|
2284
2267
|
/>
|
|
2285
2268
|
</div>
|
|
2286
2269
|
</div>
|
|
@@ -146,6 +146,19 @@
|
|
|
146
146
|
display: none;
|
|
147
147
|
}
|
|
148
148
|
|
|
149
|
+
.dark .analytics-ask-page {
|
|
150
|
+
background: hsl(var(--secondary) / 0.38);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
.dark .analytics-ask-page .analytics-chat-panel {
|
|
154
|
+
background: transparent;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.dark .agent-sidebar-panel[data-agent-sidebar-layout="desktop"],
|
|
158
|
+
.dark .agent-sidebar-panel[data-agent-sidebar-layout="mobile"] {
|
|
159
|
+
background: #000 !important;
|
|
160
|
+
}
|
|
161
|
+
|
|
149
162
|
.analytics-chat-panel
|
|
150
163
|
[data-agent-empty-state="centered"]
|
|
151
164
|
.analytics-chat-intro {
|
|
@@ -236,9 +249,11 @@
|
|
|
236
249
|
}
|
|
237
250
|
|
|
238
251
|
.dark
|
|
252
|
+
.analytics-ask-page
|
|
239
253
|
.analytics-chat-panel
|
|
240
254
|
[data-agent-empty-state="centered"]
|
|
241
255
|
.agent-composer-root {
|
|
256
|
+
background: hsl(var(--secondary) / 0.72);
|
|
242
257
|
box-shadow: none;
|
|
243
258
|
}
|
|
244
259
|
|
|
@@ -1,4 +1,7 @@
|
|
|
1
1
|
const messages = {
|
|
2
|
+
root: {
|
|
3
|
+
whatsNew: "最新消息",
|
|
4
|
+
},
|
|
2
5
|
navigation: {
|
|
3
6
|
brand: "Analytics",
|
|
4
7
|
ask: "提問",
|
|
@@ -102,6 +105,9 @@ const messages = {
|
|
|
102
105
|
credentials: "資料來源憑證",
|
|
103
106
|
credentialsDescription: "API 金鑰和憑證在資料來源頁面管理。",
|
|
104
107
|
manageDataSources: "管理資料來源",
|
|
108
|
+
dashboardTemplates: "儀表板範本",
|
|
109
|
+
dashboardTemplatesDescription: "需要起點時,可安裝來源程式碼控制的儀表板。",
|
|
110
|
+
openDashboardTemplates: "開啟目錄",
|
|
105
111
|
languageTitle: "語言",
|
|
106
112
|
languageLabel: "介面語言",
|
|
107
113
|
about: "關於",
|
|
@@ -795,7 +801,7 @@ const messages = {
|
|
|
795
801
|
time: "時間",
|
|
796
802
|
},
|
|
797
803
|
catalog: {
|
|
798
|
-
description: "
|
|
804
|
+
description: "需要起點時,可安裝儀表板範本。",
|
|
799
805
|
noTemplatesFound: "沒有找到範本",
|
|
800
806
|
tryDifferentCategory: "嘗試不同的目錄類別。",
|
|
801
807
|
templatesCount: "{{count}} 個範本",
|