@agent-native/core 0.103.1 → 0.105.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +61 -0
- package/corpus/core/package.json +9 -2
- package/corpus/core/src/agent/engine/credential-errors.ts +2 -2
- package/corpus/core/src/agent/production-agent.ts +30 -0
- package/corpus/core/src/agent/run-store.ts +12 -2
- package/corpus/core/src/cli/create.ts +1 -0
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +30 -11
- package/corpus/core/src/cli/templates-meta.ts +4 -3
- package/corpus/core/src/client/AgentAskPopover.tsx +89 -0
- package/corpus/core/src/client/AgentChatHome.tsx +4 -0
- package/corpus/core/src/client/AgentPanel.tsx +321 -223
- package/corpus/core/src/client/AssistantChat.tsx +6 -10
- package/corpus/core/src/client/MultiTabAssistantChat.tsx +53 -372
- package/corpus/core/src/client/agent-chat-adapter.ts +13 -1
- package/corpus/core/src/client/agent-page/AgentContextTab.tsx +133 -149
- package/corpus/core/src/client/agent-page/AgentEmptyState.tsx +44 -0
- package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +153 -82
- package/corpus/core/src/client/agent-page/AgentTabFrame.tsx +39 -0
- package/corpus/core/src/client/agent-page/AgentTabsPage.tsx +368 -356
- package/corpus/core/src/client/agent-page/types.ts +1 -1
- package/corpus/core/src/client/analytics.ts +51 -5
- package/corpus/core/src/client/chat/run-recovery.tsx +12 -4
- package/corpus/core/src/client/composer/PromptComposer.tsx +5 -15
- package/corpus/core/src/client/composer/TiptapComposer.tsx +32 -3
- package/corpus/core/src/client/dynamic-suggestions.ts +3 -3
- package/corpus/core/src/client/index.ts +16 -1
- package/corpus/core/src/client/resources/ResourceTree.tsx +249 -38
- package/corpus/core/src/client/resources/ResourcesPanel.tsx +307 -140
- package/corpus/core/src/client/session-replay.ts +158 -5
- package/corpus/core/src/client/settings/AutomationsSection.tsx +30 -10
- package/corpus/core/src/client/settings/SettingsPanel.tsx +3 -2
- package/corpus/core/src/client/settings/SettingsTabsPage.tsx +2 -0
- package/corpus/core/src/client/settings/agent-settings-search.ts +2 -2
- package/corpus/core/src/client/use-chat-threads.ts +2 -0
- package/corpus/core/src/connections/catalog.ts +49 -7
- package/corpus/core/src/db/index.ts +6 -1
- package/corpus/core/src/deploy/build.ts +23 -0
- package/corpus/core/src/extensions/actions.ts +106 -16
- package/corpus/core/src/extensions/content-patch.ts +22 -0
- package/corpus/core/src/extensions/routes.ts +18 -0
- package/corpus/core/src/extensions/store.ts +8 -0
- package/corpus/core/src/index.ts +3 -0
- package/corpus/core/src/ingestion/docx.ts +158 -0
- package/corpus/core/src/ingestion/figma-node-to-html.ts +1860 -0
- package/corpus/core/src/ingestion/figma.ts +548 -0
- package/corpus/core/src/ingestion/index.ts +107 -0
- package/corpus/core/src/ingestion/media.ts +264 -0
- package/corpus/core/src/ingestion/notion.ts +121 -0
- package/corpus/core/src/ingestion/office.ts +214 -0
- package/corpus/core/src/ingestion/orchestration.ts +160 -0
- package/corpus/core/src/ingestion/pptx.ts +333 -0
- package/corpus/core/src/ingestion/selection.ts +81 -0
- package/corpus/core/src/ingestion/website.ts +151 -0
- package/corpus/core/src/integrations/plugin.ts +45 -37
- package/corpus/core/src/localization/default-messages.ts +35 -12
- package/corpus/core/src/observability/hosted-model-experiment.ts +118 -0
- package/corpus/core/src/observability/traces.ts +5 -3
- package/corpus/core/src/provider-api/index.ts +452 -8
- package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +18 -1
- package/corpus/core/src/search-utils/index.ts +112 -0
- package/corpus/core/src/secrets/register-framework-secrets.ts +61 -0
- package/corpus/core/src/server/action-discovery.ts +33 -8
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
- package/corpus/core/src/server/agent-chat/prompt-resources.ts +144 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
- package/corpus/core/src/server/core-routes-plugin.ts +12 -0
- package/corpus/core/src/server/index.ts +30 -0
- package/corpus/core/src/server/workspace-provider-oauth.ts +583 -0
- package/corpus/core/src/styles/agent-native.css +9 -0
- package/corpus/core/src/templates/default/app/i18n/en-US.ts +3 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/corpus/core/src/templates/workspace-root/.env.example +12 -0
- package/corpus/core/src/workspace-connections/index.ts +6 -0
- package/corpus/core/src/workspace-connections/lifecycle.ts +43 -0
- package/corpus/core/src/workspace-connections/store.ts +16 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +46 -3
- package/corpus/templates/analytics/AGENTS.md +9 -0
- package/corpus/templates/analytics/actions/dashboard-mutation-api.ts +120 -6
- package/corpus/templates/analytics/actions/mutate-dashboard.ts +92 -30
- package/corpus/templates/analytics/actions/update-dashboard.ts +5 -5
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +313 -220
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +2 -2
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +9 -6
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +90 -64
- package/corpus/templates/analytics/app/i18n-data.ts +3 -3
- package/corpus/templates/analytics/app/lib/dashboard-list-loading.ts +25 -0
- package/corpus/templates/analytics/app/lib/item-popularity.ts +13 -4
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/pivot.ts +8 -3
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/types.ts +1 -0
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +15 -3
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-filter-defaults-can-now-be-changed-reliably-withou.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-dashboard-lists-load-in-one-stable-order-without-popping-bet.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-fixed-dashboard-filter-dropdown-text-alignment.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-recurring-signed-in-users-can-now-be-viewed-as-weekly-bars-b.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-16-the-analytics-agent-can-now-duplicate-a-chart-and-place-the-.md +6 -0
- package/corpus/templates/analytics/seeds/dashboards/agent-native-templates-first-party.json +41 -1
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +1 -1
- package/corpus/templates/analytics/server/lib/first-party-metric-catalog.ts +47 -1
- package/corpus/templates/analytics/server/lib/session-replay.ts +68 -0
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/analytics/server/routes/sessions/lookup.get.ts +47 -0
- package/corpus/templates/assets/.agents/skills/asset-generation/SKILL.md +16 -9
- package/corpus/templates/assets/.agents/skills/creative-context/SKILL.md +86 -0
- package/corpus/templates/assets/AGENTS.md +10 -0
- package/corpus/templates/assets/actions/create-generation-session.ts +59 -1
- package/corpus/templates/assets/actions/edit-image.ts +2 -0
- package/corpus/templates/assets/actions/generate-asset.ts +52 -0
- package/corpus/templates/assets/actions/generate-image-batch.ts +55 -0
- package/corpus/templates/assets/actions/generate-image.ts +219 -1
- package/corpus/templates/assets/actions/open-asset-picker.ts +14 -0
- package/corpus/templates/assets/actions/refine-image.ts +3 -0
- package/corpus/templates/assets/actions/restyle-image.ts +2 -0
- package/corpus/templates/assets/agent-native.app-skill.json +4 -0
- package/corpus/templates/assets/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/assets/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/assets/app/i18n-data.ts +29 -13
- package/corpus/templates/assets/app/routes/agent.tsx +7 -1
- package/corpus/templates/assets/app/routes/library.tsx +9 -0
- package/corpus/templates/assets/app/routes/settings.tsx +3 -0
- package/corpus/templates/assets/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/assets/package.json +1 -0
- package/corpus/templates/assets/server/lib/image-processing.ts +1 -22
- package/corpus/templates/assets/server/plugins/creative-context.ts +205 -0
- package/corpus/templates/brain/app/i18n-data.ts +3 -3
- package/corpus/templates/brain/app/lib/brain.ts +1 -1
- package/corpus/templates/brain/server/lib/search.ts +17 -67
- package/corpus/templates/calendar/app/i18n-data.ts +3 -3
- package/corpus/templates/calendar/app/pages/BookingLinksPage.tsx +19 -18
- package/corpus/templates/chat/app/i18n/en-US.ts +3 -3
- package/corpus/templates/chat/app/lib/agent-page.tsx +10 -1
- package/corpus/templates/clips/.agents/skills/meetings/SKILL.md +1 -1
- package/corpus/templates/clips/AGENTS.md +4 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +35 -4
- package/corpus/templates/clips/actions/create-meeting.ts +6 -2
- package/corpus/templates/clips/actions/create-organization.ts +3 -2
- package/corpus/templates/clips/actions/create-recording.ts +4 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +44 -7
- package/corpus/templates/clips/actions/import-loom-recording.ts +4 -1
- package/corpus/templates/clips/actions/lib/create-recording-schema.ts +2 -2
- package/corpus/templates/clips/actions/list-meetings.ts +23 -5
- package/corpus/templates/clips/actions/list-organization-state.ts +1 -1
- package/corpus/templates/clips/actions/remove-silences.ts +10 -1
- package/corpus/templates/clips/actions/request-transcript.ts +53 -11
- package/corpus/templates/clips/actions/search-recordings-utils.ts +7 -0
- package/corpus/templates/clips/actions/search-recordings.ts +5 -8
- package/corpus/templates/clips/actions/set-organization-branding.ts +2 -2
- package/corpus/templates/clips/actions/stitch-recordings.ts +10 -5
- package/corpus/templates/clips/actions/update-ai-request-status.ts +38 -0
- package/corpus/templates/clips/app/components/editor/editor-layout.tsx +3 -4
- package/corpus/templates/clips/app/components/editor/editor-selection.ts +19 -0
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +10 -10
- package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +1 -2
- package/corpus/templates/clips/app/components/library/library-grid.tsx +101 -93
- package/corpus/templates/clips/app/components/player/video-player.tsx +11 -0
- package/corpus/templates/clips/app/components/workspace/branding-editor.tsx +53 -1
- package/corpus/templates/clips/app/i18n/ar-SA.ts +7 -1
- package/corpus/templates/clips/app/i18n/de-DE.ts +7 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +10 -4
- package/corpus/templates/clips/app/i18n/es-ES.ts +7 -1
- package/corpus/templates/clips/app/i18n/fr-FR.ts +7 -1
- package/corpus/templates/clips/app/i18n/hi-IN.ts +7 -1
- package/corpus/templates/clips/app/i18n/ja-JP.ts +7 -1
- package/corpus/templates/clips/app/i18n/ko-KR.ts +7 -1
- package/corpus/templates/clips/app/i18n/pt-BR.ts +7 -1
- package/corpus/templates/clips/app/i18n/zh-CN.ts +6 -1
- package/corpus/templates/clips/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +5 -9
- package/corpus/templates/clips/app/routes/_app.settings.organization.tsx +6 -2
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +129 -27
- package/corpus/templates/clips/app/routes/record.tsx +23 -2
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +6 -2
- package/corpus/templates/clips/app/routes.ts +3 -1
- package/corpus/templates/clips/changelog/2026-07-16-authorized-viewers-can-open-shared-private-clips-without-a-m.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-camera-bubble-hover-controls-appear-above-the-face.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-chrome-extension-recovers-stale-recorder-state.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-clips-search-now-matches-recording-content-without-requiring.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-declined-meetings-no-longer-show-desktop-reminders.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-failed-desktop-saves-now-show-their-local-recovery-copy.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-desktop-clips-now-preserve-complete-playback-synced-aud.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-long-recording-lists-keep-stitch-and-library-actions-visible.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-organization-admins-can-choose-new-recording-visibility.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-remove-silences-now-shows-queued-active-completed-and-failed.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-settings-no-longer-repeats-the-builder-connection-status-in-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-16-transcripts-now-appear-from-native-browser-speech-sooner-wit.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +73 -1
- package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +32 -0
- package/corpus/templates/clips/chrome-extension/src/native-transcription.ts +248 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +106 -0
- package/corpus/templates/clips/desktop/src/app.tsx +66 -28
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +335 -285
- package/corpus/templates/clips/desktop/src/lib/single-flight.ts +7 -0
- package/corpus/templates/clips/desktop/src/lib/upload-verification.ts +51 -0
- package/corpus/templates/clips/desktop/src/overlays/bubble.tsx +2 -2
- package/corpus/templates/clips/desktop/src/overlays/finalizing.tsx +10 -2
- package/corpus/templates/clips/desktop/src/styles.css +13 -11
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +8 -9
- package/corpus/templates/clips/desktop/src-tauri/src/meetings_watcher.rs +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/custom_capture.rs +88 -13
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen/live_upload.rs +13 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +241 -6
- package/corpus/templates/clips/server/db/schema.ts +2 -2
- package/corpus/templates/clips/server/lib/builder-media-compression.ts +64 -67
- package/corpus/templates/clips/server/lib/calendar-event-classification.ts +19 -0
- package/corpus/templates/clips/server/lib/google-calendar-client.ts +1 -0
- package/corpus/templates/clips/server/lib/recordings.ts +40 -1
- package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/clips/server/plugins/db.ts +2 -2
- package/corpus/templates/clips/server/routes/api/auth/google-calendar.get.ts +1 -1
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +14 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +51 -1
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +1 -64
- package/corpus/templates/clips/shared/media-worker-contract.ts +32 -15
- package/corpus/templates/content/.agents/skills/content/SKILL.md +16 -0
- package/corpus/templates/content/.agents/skills/creative-context/SKILL.md +85 -0
- package/corpus/templates/content/.agents/skills/notion-integration/SKILL.md +8 -0
- package/corpus/templates/content/AGENTS.md +9 -0
- package/corpus/templates/content/actions/create-document.ts +94 -0
- package/corpus/templates/content/actions/edit-document.ts +144 -4
- package/corpus/templates/content/actions/update-document.ts +138 -0
- package/corpus/templates/content/agent-native.app-skill.json +4 -0
- package/corpus/templates/content/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/content/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/content/app/i18n-data.ts +13 -4
- package/corpus/templates/content/app/routes/_app.agent.tsx +2 -1
- package/corpus/templates/content/app/routes/_app.settings.tsx +3 -0
- package/corpus/templates/content/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/content/package.json +1 -0
- package/corpus/templates/content/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +116 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +16 -0
- package/corpus/templates/design/.agents/skills/design-systems/SKILL.md +8 -0
- package/corpus/templates/design/AGENTS.md +6 -0
- package/corpus/templates/design/actions/clone-creative-context-design.ts +176 -0
- package/corpus/templates/design/actions/edit-design.ts +128 -0
- package/corpus/templates/design/actions/generate-design.ts +278 -14
- package/corpus/templates/design/actions/generate-screens.ts +42 -1
- package/corpus/templates/design/agent-native.app-skill.json +4 -0
- package/corpus/templates/design/app/components/layout/Layout.tsx +7 -3
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +10 -4
- package/corpus/templates/design/app/routes/agent.tsx +2 -1
- package/corpus/templates/design/app/routes/settings.tsx +3 -0
- package/corpus/templates/design/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/design/changelog/2026-07-16-design-agent-chat-no-longer-shows-a-separate-workspace-header.md +6 -0
- package/corpus/templates/design/package.json +1 -0
- package/corpus/templates/design/server/lib/figma-design-context.ts +5 -335
- package/corpus/templates/design/server/lib/figma-node-to-html.ts +1 -1859
- package/corpus/templates/design/server/lib/import-design-files.ts +6 -8
- package/corpus/templates/design/server/plugins/creative-context.ts +31 -0
- package/corpus/templates/design/shared/generation-session.ts +7 -0
- package/corpus/templates/dispatch/app/i18n-data.ts +3 -3
- package/corpus/templates/forms/app/i18n/en-US.ts +3 -3
- package/corpus/templates/macros/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/app/components/email/EmailThread.tsx +35 -5
- package/corpus/templates/mail/app/i18n/en-US.ts +3 -3
- package/corpus/templates/mail/changelog/2026-07-16-mail-previews-now-expand-to-show-the-full-message-without-an.md +6 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +30 -11
- package/corpus/templates/plan/AGENTS.md +21 -1
- package/corpus/templates/plan/actions/get-visual-plan.ts +1 -1
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +161 -0
- package/corpus/templates/plan/actions/read-visual-plan-source.ts +1 -1
- package/corpus/templates/plan/actions/update-visual-plan.ts +126 -10
- package/corpus/templates/plan/app/hooks/use-plans.ts +2 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +3 -3
- package/corpus/templates/plan/app/pages/PlansPage.tsx +65 -62
- package/corpus/templates/plan/changelog/2026-07-16-local-plan-previews-now-load-annotations-containing-html-lik.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-16-plan-agents-now-prevent-stale-edits-from-overwriting-newer-p.md +6 -0
- package/corpus/templates/plan/server/plan-mdx.ts +75 -2
- package/corpus/templates/slides/.agents/skills/create-deck/SKILL.md +21 -4
- package/corpus/templates/slides/.agents/skills/creative-context/SKILL.md +122 -0
- package/corpus/templates/slides/.agents/skills/design-systems/SKILL.md +11 -0
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +12 -3
- package/corpus/templates/slides/AGENTS.md +6 -0
- package/corpus/templates/slides/actions/add-slide.ts +230 -14
- package/corpus/templates/slides/actions/clone-context-slide.ts +302 -0
- package/corpus/templates/slides/actions/create-deck.ts +130 -0
- package/corpus/templates/slides/actions/extract-pdf.ts +6 -2
- package/corpus/templates/slides/actions/import-file.ts +5 -4
- package/corpus/templates/slides/actions/patch-deck.ts +200 -10
- package/corpus/templates/slides/actions/update-slide.ts +208 -15
- package/corpus/templates/slides/app/components/layout/Layout.tsx +2 -0
- package/corpus/templates/slides/app/components/visual-editor/CanvasCommentPins.tsx +16 -1
- package/corpus/templates/slides/app/i18n/ar-SA.ts +3 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +3 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +6 -3
- package/corpus/templates/slides/app/i18n/es-ES.ts +3 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +3 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +3 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +3 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/slides/app/lib/validate-native-slide-html.ts +176 -0
- package/corpus/templates/slides/app/routes/agent.tsx +7 -1
- package/corpus/templates/slides/app/routes/settings.tsx +3 -0
- package/corpus/templates/slides/changelog/2026-07-16-creative-context-library.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-16-google-slides-native-cloning.md +6 -0
- package/corpus/templates/slides/package.json +1 -0
- package/corpus/templates/slides/server/handlers/import/docx-parser.ts +4 -85
- package/corpus/templates/slides/server/handlers/import/pptx-parser.ts +7 -421
- package/corpus/templates/slides/server/plugins/creative-context.ts +166 -0
- package/dist/agent/engine/credential-errors.d.ts +1 -1
- package/dist/agent/engine/credential-errors.d.ts.map +1 -1
- package/dist/agent/engine/credential-errors.js +2 -2
- package/dist/agent/engine/credential-errors.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +25 -0
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +12 -2
- package/dist/agent/run-store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +1 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +30 -11
- package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +4 -3
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AgentAskPopover.d.ts +11 -0
- package/dist/client/AgentAskPopover.d.ts.map +1 -0
- package/dist/client/AgentAskPopover.js +30 -0
- package/dist/client/AgentAskPopover.js.map +1 -0
- package/dist/client/AgentChatHome.d.ts +1 -1
- package/dist/client/AgentChatHome.d.ts.map +1 -1
- package/dist/client/AgentChatHome.js +2 -2
- package/dist/client/AgentChatHome.js.map +1 -1
- package/dist/client/AgentPanel.d.ts +9 -19
- package/dist/client/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +119 -80
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +4 -4
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/MultiTabAssistantChat.d.ts +3 -9
- package/dist/client/MultiTabAssistantChat.d.ts.map +1 -1
- package/dist/client/MultiTabAssistantChat.js +49 -189
- package/dist/client/MultiTabAssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +12 -1
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/agent-page/AgentContextTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentContextTab.js +26 -28
- package/dist/client/agent-page/AgentContextTab.js.map +1 -1
- package/dist/client/agent-page/AgentEmptyState.d.ts +13 -0
- package/dist/client/agent-page/AgentEmptyState.d.ts.map +1 -0
- package/dist/client/agent-page/AgentEmptyState.js +6 -0
- package/dist/client/agent-page/AgentEmptyState.js.map +1 -0
- package/dist/client/agent-page/AgentJobsTab.d.ts +1 -1
- package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.js +90 -58
- package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
- package/dist/client/agent-page/AgentTabFrame.d.ts +12 -0
- package/dist/client/agent-page/AgentTabFrame.d.ts.map +1 -0
- package/dist/client/agent-page/AgentTabFrame.js +7 -0
- package/dist/client/agent-page/AgentTabFrame.js.map +1 -0
- package/dist/client/agent-page/AgentTabsPage.d.ts +9 -1
- package/dist/client/agent-page/AgentTabsPage.d.ts.map +1 -1
- package/dist/client/agent-page/AgentTabsPage.js +135 -99
- package/dist/client/agent-page/AgentTabsPage.js.map +1 -1
- package/dist/client/agent-page/types.d.ts +1 -1
- package/dist/client/agent-page/types.d.ts.map +1 -1
- package/dist/client/agent-page/types.js.map +1 -1
- package/dist/client/analytics.d.ts +10 -3
- package/dist/client/analytics.d.ts.map +1 -1
- package/dist/client/analytics.js +37 -2
- package/dist/client/analytics.js.map +1 -1
- package/dist/client/chat/run-recovery.d.ts.map +1 -1
- package/dist/client/chat/run-recovery.js +10 -3
- package/dist/client/chat/run-recovery.js.map +1 -1
- package/dist/client/composer/PromptComposer.d.ts.map +1 -1
- package/dist/client/composer/PromptComposer.js +2 -2
- package/dist/client/composer/PromptComposer.js.map +1 -1
- package/dist/client/composer/TiptapComposer.d.ts.map +1 -1
- package/dist/client/composer/TiptapComposer.js +15 -3
- package/dist/client/composer/TiptapComposer.js.map +1 -1
- package/dist/client/dynamic-suggestions.js +3 -3
- package/dist/client/dynamic-suggestions.js.map +1 -1
- package/dist/client/index.d.ts +4 -3
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +3 -2
- package/dist/client/index.js.map +1 -1
- package/dist/client/resources/ResourceTree.d.ts +5 -1
- package/dist/client/resources/ResourceTree.d.ts.map +1 -1
- package/dist/client/resources/ResourceTree.js +74 -5
- package/dist/client/resources/ResourceTree.js.map +1 -1
- package/dist/client/resources/ResourcesPanel.d.ts +11 -2
- package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
- package/dist/client/resources/ResourcesPanel.js +105 -31
- package/dist/client/resources/ResourcesPanel.js.map +1 -1
- package/dist/client/session-replay.d.ts +28 -0
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +122 -8
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/settings/AutomationsSection.d.ts +3 -1
- package/dist/client/settings/AutomationsSection.d.ts.map +1 -1
- package/dist/client/settings/AutomationsSection.js +16 -6
- package/dist/client/settings/AutomationsSection.js.map +1 -1
- package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
- package/dist/client/settings/SettingsPanel.js +3 -3
- package/dist/client/settings/SettingsPanel.js.map +1 -1
- package/dist/client/settings/SettingsTabsPage.d.ts +2 -0
- package/dist/client/settings/SettingsTabsPage.d.ts.map +1 -1
- package/dist/client/settings/SettingsTabsPage.js.map +1 -1
- package/dist/client/settings/agent-settings-search.js +2 -2
- package/dist/client/settings/agent-settings-search.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts +2 -0
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/connections/catalog.d.ts +41 -7
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +40 -7
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/index.d.ts +2 -2
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +2 -2
- package/dist/db/index.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +17 -0
- package/dist/deploy/build.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +85 -15
- package/dist/extensions/actions.js.map +1 -1
- package/dist/extensions/content-patch.d.ts +4 -0
- package/dist/extensions/content-patch.d.ts.map +1 -1
- package/dist/extensions/content-patch.js +18 -0
- package/dist/extensions/content-patch.js.map +1 -1
- package/dist/extensions/routes.d.ts.map +1 -1
- package/dist/extensions/routes.js +14 -0
- package/dist/extensions/routes.js.map +1 -1
- package/dist/extensions/store.d.ts +1 -0
- package/dist/extensions/store.d.ts.map +1 -1
- package/dist/extensions/store.js +4 -1
- package/dist/extensions/store.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/ingestion/docx.d.ts +16 -0
- package/dist/ingestion/docx.d.ts.map +1 -0
- package/dist/ingestion/docx.js +129 -0
- package/dist/ingestion/docx.js.map +1 -0
- package/dist/ingestion/figma-node-to-html.d.ts +304 -0
- package/dist/ingestion/figma-node-to-html.d.ts.map +1 -0
- package/dist/ingestion/figma-node-to-html.js +1292 -0
- package/dist/ingestion/figma-node-to-html.js.map +1 -0
- package/dist/ingestion/figma.d.ts +115 -0
- package/dist/ingestion/figma.d.ts.map +1 -0
- package/dist/ingestion/figma.js +399 -0
- package/dist/ingestion/figma.js.map +1 -0
- package/dist/ingestion/index.d.ts +11 -0
- package/dist/ingestion/index.d.ts.map +1 -0
- package/dist/ingestion/index.js +11 -0
- package/dist/ingestion/index.js.map +1 -0
- package/dist/ingestion/media.d.ts +36 -0
- package/dist/ingestion/media.d.ts.map +1 -0
- package/dist/ingestion/media.js +178 -0
- package/dist/ingestion/media.js.map +1 -0
- package/dist/ingestion/notion.d.ts +12 -0
- package/dist/ingestion/notion.d.ts.map +1 -0
- package/dist/ingestion/notion.js +104 -0
- package/dist/ingestion/notion.js.map +1 -0
- package/dist/ingestion/office.d.ts +45 -0
- package/dist/ingestion/office.d.ts.map +1 -0
- package/dist/ingestion/office.js +141 -0
- package/dist/ingestion/office.js.map +1 -0
- package/dist/ingestion/orchestration.d.ts +52 -0
- package/dist/ingestion/orchestration.d.ts.map +1 -0
- package/dist/ingestion/orchestration.js +89 -0
- package/dist/ingestion/orchestration.js.map +1 -0
- package/dist/ingestion/pptx.d.ts +28 -0
- package/dist/ingestion/pptx.d.ts.map +1 -0
- package/dist/ingestion/pptx.js +255 -0
- package/dist/ingestion/pptx.js.map +1 -0
- package/dist/ingestion/selection.d.ts +20 -0
- package/dist/ingestion/selection.d.ts.map +1 -0
- package/dist/ingestion/selection.js +52 -0
- package/dist/ingestion/selection.js.map +1 -0
- package/dist/ingestion/website.d.ts +27 -0
- package/dist/ingestion/website.d.ts.map +1 -0
- package/dist/ingestion/website.js +100 -0
- package/dist/ingestion/website.js.map +1 -0
- package/dist/integrations/plugin.d.ts.map +1 -1
- package/dist/integrations/plugin.js +32 -27
- package/dist/integrations/plugin.js.map +1 -1
- package/dist/localization/default-messages.d.ts +22 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +31 -9
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- package/dist/observability/hosted-model-experiment.d.ts +39 -0
- package/dist/observability/hosted-model-experiment.d.ts.map +1 -0
- package/dist/observability/hosted-model-experiment.js +90 -0
- package/dist/observability/hosted-model-experiment.js.map +1 -0
- package/dist/observability/routes.d.ts +5 -5
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +5 -3
- package/dist/observability/traces.js.map +1 -1
- package/dist/provider-api/index.d.ts +35 -4
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +339 -8
- package/dist/provider-api/index.js.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
- package/dist/scripts/agent-engines/list-agent-engines.js +18 -1
- package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
- package/dist/search-utils/index.d.ts +12 -0
- package/dist/search-utils/index.d.ts.map +1 -0
- package/dist/search-utils/index.js +95 -0
- package/dist/search-utils/index.js.map +1 -0
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +57 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-discovery.d.ts +8 -0
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +26 -9
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +2 -2
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat/prompt-resources.d.ts +19 -0
- package/dist/server/agent-chat/prompt-resources.d.ts.map +1 -1
- package/dist/server/agent-chat/prompt-resources.js +95 -0
- package/dist/server/agent-chat/prompt-resources.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +7 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +5 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/index.d.ts +5 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +5 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +48 -0
- package/dist/server/workspace-provider-oauth.d.ts.map +1 -0
- package/dist/server/workspace-provider-oauth.js +415 -0
- package/dist/server/workspace-provider-oauth.js.map +1 -0
- package/dist/styles/agent-native.css +9 -0
- package/dist/templates/chat/app/i18n/en-US.ts +3 -3
- package/dist/templates/chat/app/lib/agent-page.tsx +10 -1
- package/dist/templates/default/app/i18n/en-US.ts +3 -3
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/dist/templates/workspace-root/.env.example +12 -0
- package/dist/workspace-connections/index.d.ts +1 -0
- package/dist/workspace-connections/index.d.ts.map +1 -1
- package/dist/workspace-connections/index.js +1 -0
- package/dist/workspace-connections/index.js.map +1 -1
- package/dist/workspace-connections/lifecycle.d.ts +16 -0
- package/dist/workspace-connections/lifecycle.d.ts.map +1 -0
- package/dist/workspace-connections/lifecycle.js +14 -0
- package/dist/workspace-connections/lifecycle.js.map +1 -0
- package/dist/workspace-connections/store.d.ts.map +1 -1
- package/dist/workspace-connections/store.js +16 -0
- package/dist/workspace-connections/store.js.map +1 -1
- package/package.json +10 -3
- package/src/templates/chat/app/i18n/en-US.ts +3 -3
- package/src/templates/chat/app/lib/agent-page.spec.tsx +10 -1
- package/src/templates/chat/app/lib/agent-page.tsx +10 -1
- package/src/templates/default/app/i18n/en-US.ts +3 -3
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +14 -5
- package/src/templates/workspace-root/.env.example +12 -0
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
|
|
3
|
+
import { registerOnboardingStep } from "@agent-native/core/onboarding";
|
|
4
|
+
import {
|
|
5
|
+
getRequestOrgId,
|
|
6
|
+
getRequestUserEmail,
|
|
7
|
+
} from "@agent-native/core/server/request-context";
|
|
8
|
+
import {
|
|
9
|
+
readCreativeContextMedia,
|
|
10
|
+
setupCreativeContext,
|
|
11
|
+
type CreativeContextProjectionAdapters,
|
|
12
|
+
} from "@agent-native/creative-context/server";
|
|
13
|
+
import { getCreativeContextItem } from "@agent-native/creative-context/store";
|
|
14
|
+
import { listContextSources } from "@agent-native/creative-context/store";
|
|
15
|
+
import type { ContextMedia } from "@agent-native/creative-context/types";
|
|
16
|
+
import { and, eq } from "drizzle-orm";
|
|
17
|
+
import { nanoid } from "nanoid";
|
|
18
|
+
|
|
19
|
+
import { getDb, schema } from "../db/index.js";
|
|
20
|
+
import { createAssetFromBuffer } from "../lib/assets.js";
|
|
21
|
+
import { seedDefaultGenerationPresets } from "../lib/generation-presets.js";
|
|
22
|
+
import { nowIso, parseJson, stringifyJson } from "../lib/json.js";
|
|
23
|
+
|
|
24
|
+
const IMPORT_LIBRARY_TITLE = "Creative context imports";
|
|
25
|
+
|
|
26
|
+
async function ensureImportLibrary() {
|
|
27
|
+
const ownerEmail = getRequestUserEmail();
|
|
28
|
+
if (!ownerEmail) throw new Error("no authenticated user");
|
|
29
|
+
const db = getDb();
|
|
30
|
+
const [existing] = await db
|
|
31
|
+
.select()
|
|
32
|
+
.from(schema.assetLibraries)
|
|
33
|
+
.where(
|
|
34
|
+
and(
|
|
35
|
+
eq(schema.assetLibraries.ownerEmail, ownerEmail),
|
|
36
|
+
eq(schema.assetLibraries.title, IMPORT_LIBRARY_TITLE),
|
|
37
|
+
),
|
|
38
|
+
)
|
|
39
|
+
.limit(1);
|
|
40
|
+
if (existing) return existing;
|
|
41
|
+
const now = nowIso();
|
|
42
|
+
const row = {
|
|
43
|
+
id: nanoid(),
|
|
44
|
+
title: IMPORT_LIBRARY_TITLE,
|
|
45
|
+
description:
|
|
46
|
+
"Reference media projected from governed Creative Context sources.",
|
|
47
|
+
customInstructions: "",
|
|
48
|
+
styleBrief: "{}",
|
|
49
|
+
settings: stringifyJson({ sourceType: "brand-import" }),
|
|
50
|
+
ownerEmail,
|
|
51
|
+
orgId: getRequestOrgId(),
|
|
52
|
+
createdAt: now,
|
|
53
|
+
updatedAt: now,
|
|
54
|
+
};
|
|
55
|
+
await db.insert(schema.assetLibraries).values(row);
|
|
56
|
+
await seedDefaultGenerationPresets({ db, libraryId: row.id, now });
|
|
57
|
+
return row;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
function projectedAssetId(ownerEmail: string, dedupeKey: string) {
|
|
61
|
+
return `cc-${createHash("sha256")
|
|
62
|
+
.update(`${ownerEmail}:${dedupeKey}`)
|
|
63
|
+
.digest("hex")
|
|
64
|
+
.slice(0, 24)}`;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
async function projectMedia(input: {
|
|
68
|
+
sourceId: string;
|
|
69
|
+
itemId: string;
|
|
70
|
+
itemVersionId: string;
|
|
71
|
+
media: ContextMedia;
|
|
72
|
+
sourceType: "brand-import";
|
|
73
|
+
dedupeKey: string;
|
|
74
|
+
}) {
|
|
75
|
+
if (input.media.kind !== "image" && input.media.kind !== "video") return null;
|
|
76
|
+
const ownerEmail = getRequestUserEmail();
|
|
77
|
+
if (!ownerEmail) throw new Error("no authenticated user");
|
|
78
|
+
const id = projectedAssetId(ownerEmail, input.dedupeKey);
|
|
79
|
+
const db = getDb();
|
|
80
|
+
const [existing] = await db
|
|
81
|
+
.select()
|
|
82
|
+
.from(schema.assets)
|
|
83
|
+
.where(eq(schema.assets.id, id))
|
|
84
|
+
.limit(1);
|
|
85
|
+
if (existing) return existing;
|
|
86
|
+
const [library, detail, loaded] = await Promise.all([
|
|
87
|
+
ensureImportLibrary(),
|
|
88
|
+
getCreativeContextItem(input.itemId, input.itemVersionId),
|
|
89
|
+
readCreativeContextMedia({
|
|
90
|
+
mediaId: input.media.id,
|
|
91
|
+
itemId: input.itemId,
|
|
92
|
+
itemVersionId: input.itemVersionId,
|
|
93
|
+
}),
|
|
94
|
+
]);
|
|
95
|
+
if (!detail) throw new Error("Creative context item is not accessible");
|
|
96
|
+
return createAssetFromBuffer({
|
|
97
|
+
id,
|
|
98
|
+
libraryId: library.id,
|
|
99
|
+
buffer: Buffer.from(loaded.data),
|
|
100
|
+
mimeType: loaded.mimeType,
|
|
101
|
+
role: input.media.kind === "video" ? "video_reference" : "style_reference",
|
|
102
|
+
status: "reference",
|
|
103
|
+
title: detail.item.title,
|
|
104
|
+
description: input.media.caption ?? input.media.altText,
|
|
105
|
+
altText: input.media.altText,
|
|
106
|
+
metadata: {
|
|
107
|
+
sourceType: input.sourceType,
|
|
108
|
+
contentHash: input.media.contentHash,
|
|
109
|
+
creativeContext: {
|
|
110
|
+
sourceId: input.sourceId,
|
|
111
|
+
itemId: input.itemId,
|
|
112
|
+
itemVersionId: input.itemVersionId,
|
|
113
|
+
mediaId: input.media.id,
|
|
114
|
+
dedupeKey: input.dedupeKey,
|
|
115
|
+
},
|
|
116
|
+
},
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
const projections: CreativeContextProjectionAdapters = {
|
|
121
|
+
media: {
|
|
122
|
+
project: async (input) => {
|
|
123
|
+
await projectMedia(input);
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
canonicalLogo: {
|
|
127
|
+
apply: async ({ itemId, itemVersionId, payload }) => {
|
|
128
|
+
const mediaId =
|
|
129
|
+
typeof payload.mediaId === "string" ? payload.mediaId : undefined;
|
|
130
|
+
if (!mediaId) {
|
|
131
|
+
throw new Error("Canonical-logo confirmation requires payload.mediaId");
|
|
132
|
+
}
|
|
133
|
+
const detail = await getCreativeContextItem(itemId, itemVersionId);
|
|
134
|
+
const media = detail?.media.find((candidate) => candidate.id === mediaId);
|
|
135
|
+
if (!detail || !media || media.kind !== "image") {
|
|
136
|
+
throw new Error("Canonical-logo media is not accessible");
|
|
137
|
+
}
|
|
138
|
+
const ownerEmail = getRequestUserEmail();
|
|
139
|
+
if (!ownerEmail) throw new Error("no authenticated user");
|
|
140
|
+
const dedupeKey = `${media.id}:${itemVersionId}`;
|
|
141
|
+
const asset = await projectMedia({
|
|
142
|
+
sourceId: detail.item.sourceId,
|
|
143
|
+
itemId,
|
|
144
|
+
itemVersionId,
|
|
145
|
+
media,
|
|
146
|
+
sourceType: "brand-import",
|
|
147
|
+
dedupeKey,
|
|
148
|
+
});
|
|
149
|
+
if (!asset)
|
|
150
|
+
throw new Error("Canonical-logo media could not be projected");
|
|
151
|
+
await getDb()
|
|
152
|
+
.update(schema.assets)
|
|
153
|
+
.set({
|
|
154
|
+
role: "logo_reference",
|
|
155
|
+
metadata: stringifyJson({
|
|
156
|
+
...parseJson<Record<string, unknown>>(asset.metadata, {}),
|
|
157
|
+
sourceType: "brand-import",
|
|
158
|
+
contentHash: media.contentHash,
|
|
159
|
+
canonicalLogo: true,
|
|
160
|
+
creativeContext: {
|
|
161
|
+
sourceId: detail.item.sourceId,
|
|
162
|
+
itemId,
|
|
163
|
+
itemVersionId,
|
|
164
|
+
mediaId,
|
|
165
|
+
dedupeKey,
|
|
166
|
+
},
|
|
167
|
+
}),
|
|
168
|
+
updatedAt: nowIso(),
|
|
169
|
+
})
|
|
170
|
+
.where(eq(schema.assets.id, asset.id));
|
|
171
|
+
await getDb()
|
|
172
|
+
.update(schema.assetLibraries)
|
|
173
|
+
.set({ canonicalLogoAssetId: asset.id, updatedAt: nowIso() })
|
|
174
|
+
.where(eq(schema.assetLibraries.id, asset.libraryId));
|
|
175
|
+
},
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
registerOnboardingStep({
|
|
180
|
+
id: "creative-context-library",
|
|
181
|
+
order: 18,
|
|
182
|
+
required: false,
|
|
183
|
+
title: "Connect your creative library",
|
|
184
|
+
description:
|
|
185
|
+
"Connect prior work and reference sources so agents can reuse approved creative context.",
|
|
186
|
+
methods: [
|
|
187
|
+
{
|
|
188
|
+
id: "library",
|
|
189
|
+
kind: "link",
|
|
190
|
+
primary: true,
|
|
191
|
+
label: "Open Library",
|
|
192
|
+
payload: { url: "/agent#library", external: false },
|
|
193
|
+
},
|
|
194
|
+
],
|
|
195
|
+
isComplete: async () => {
|
|
196
|
+
try {
|
|
197
|
+
const result = await listContextSources({ limit: 1 });
|
|
198
|
+
return result.sources.length > 0;
|
|
199
|
+
} catch {
|
|
200
|
+
return false;
|
|
201
|
+
}
|
|
202
|
+
},
|
|
203
|
+
});
|
|
204
|
+
|
|
205
|
+
export default setupCreativeContext({ appId: "assets", projections });
|
|
@@ -57,10 +57,10 @@ const enUS = {
|
|
|
57
57
|
brainNavigationDescription: "Navigate between Brain work surfaces.",
|
|
58
58
|
},
|
|
59
59
|
settings: {
|
|
60
|
-
agentTitle: "Agent
|
|
60
|
+
agentTitle: "Agent workspace",
|
|
61
61
|
agentDescription:
|
|
62
|
-
"Open the agent
|
|
63
|
-
openAgentSettings: "Open agent
|
|
62
|
+
"Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
|
|
63
|
+
openAgentSettings: "Open agent workspace",
|
|
64
64
|
eyebrow: "Customize",
|
|
65
65
|
title: "Customize Brain",
|
|
66
66
|
description:
|
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildSearchSnippet,
|
|
3
|
+
escapeLikeTerm,
|
|
4
|
+
normalizeSearchTerms,
|
|
5
|
+
scoreSearchText as scoreSharedSearchText,
|
|
6
|
+
} from "@agent-native/core/search-utils";
|
|
1
7
|
import { discoverAgents } from "@agent-native/core/server/agent-discovery";
|
|
2
8
|
import { accessFilter } from "@agent-native/core/sharing";
|
|
3
9
|
import { listWorkspaceConnectionProviderCatalogForApp } from "@agent-native/core/workspace-connections";
|
|
@@ -80,25 +86,6 @@ export interface FederatedSearchCoverage {
|
|
|
80
86
|
};
|
|
81
87
|
}
|
|
82
88
|
|
|
83
|
-
const STOPWORDS = new Set([
|
|
84
|
-
"about",
|
|
85
|
-
"does",
|
|
86
|
-
"from",
|
|
87
|
-
"have",
|
|
88
|
-
"what",
|
|
89
|
-
"when",
|
|
90
|
-
"where",
|
|
91
|
-
"which",
|
|
92
|
-
"while",
|
|
93
|
-
"with",
|
|
94
|
-
"why",
|
|
95
|
-
"the",
|
|
96
|
-
"and",
|
|
97
|
-
"for",
|
|
98
|
-
"our",
|
|
99
|
-
"did",
|
|
100
|
-
]);
|
|
101
|
-
|
|
102
89
|
const APP_ID = "brain";
|
|
103
90
|
const BRAIN_SOURCE_PROVIDERS = [
|
|
104
91
|
"manual",
|
|
@@ -197,24 +184,7 @@ const FEDERATED_DELEGATION_TARGETS: Array<{
|
|
|
197
184
|
},
|
|
198
185
|
];
|
|
199
186
|
|
|
200
|
-
export
|
|
201
|
-
return value.replace(/[\\%_]/g, (match) => `\\${match}`);
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
export function normalizeSearchTerms(query: string): string[] {
|
|
205
|
-
const phrase = query
|
|
206
|
-
.toLowerCase()
|
|
207
|
-
.split(/[^a-z0-9-]+/)
|
|
208
|
-
.map((token) => token.trim())
|
|
209
|
-
.filter(Boolean)
|
|
210
|
-
.join(" ");
|
|
211
|
-
if (!phrase) return [];
|
|
212
|
-
const tokens = phrase
|
|
213
|
-
.split(/[^a-z0-9-]+/)
|
|
214
|
-
.map((token) => token.trim())
|
|
215
|
-
.filter((token) => token.length > 2 && !STOPWORDS.has(token));
|
|
216
|
-
return Array.from(new Set([phrase, ...tokens])).slice(0, 8);
|
|
217
|
-
}
|
|
187
|
+
export { escapeLikeTerm, normalizeSearchTerms };
|
|
218
188
|
|
|
219
189
|
function likeEscaped(column: unknown, term: string): SQL {
|
|
220
190
|
return sql`lower(${column}) like ${`%${escapeLikeTerm(term)}%`} escape '\\'`;
|
|
@@ -319,21 +289,7 @@ export function buildSnippet(
|
|
|
319
289
|
terms: string[],
|
|
320
290
|
maxLength = 260,
|
|
321
291
|
): string {
|
|
322
|
-
|
|
323
|
-
if (text.length <= maxLength) return text;
|
|
324
|
-
const lower = text.toLowerCase();
|
|
325
|
-
const firstIndex = terms.reduce((best, term) => {
|
|
326
|
-
const index = lower.indexOf(term);
|
|
327
|
-
return index >= 0 && (best < 0 || index < best) ? index : best;
|
|
328
|
-
}, -1);
|
|
329
|
-
const start = Math.max(
|
|
330
|
-
0,
|
|
331
|
-
(firstIndex < 0 ? 0 : firstIndex) - Math.floor(maxLength / 3),
|
|
332
|
-
);
|
|
333
|
-
const end = Math.min(text.length, start + maxLength);
|
|
334
|
-
const prefix = start > 0 ? "..." : "";
|
|
335
|
-
const suffix = end < text.length ? "..." : "";
|
|
336
|
-
return `${prefix}${text.slice(start, end).trim()}${suffix}`;
|
|
292
|
+
return buildSearchSnippet(value, terms, maxLength);
|
|
337
293
|
}
|
|
338
294
|
|
|
339
295
|
export function scoreSearchText(
|
|
@@ -346,21 +302,15 @@ export function scoreSearchText(
|
|
|
346
302
|
},
|
|
347
303
|
terms: string[],
|
|
348
304
|
): number {
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
if (title.includes(term)) score += 40 * phraseBoost;
|
|
359
|
-
if (summary.includes(term)) score += 20 * phraseBoost;
|
|
360
|
-
if (body.includes(term)) score += 8 * phraseBoost;
|
|
361
|
-
if (metadata.includes(term)) score += 6 * phraseBoost;
|
|
362
|
-
});
|
|
363
|
-
return score;
|
|
305
|
+
return scoreSharedSearchText(
|
|
306
|
+
{
|
|
307
|
+
title: fields.title,
|
|
308
|
+
summary: fields.summary,
|
|
309
|
+
body: fields.body,
|
|
310
|
+
metadata: `${fields.provider ?? ""} ${fields.status ?? ""}`,
|
|
311
|
+
},
|
|
312
|
+
terms,
|
|
313
|
+
);
|
|
364
314
|
}
|
|
365
315
|
|
|
366
316
|
export function sourceUrlFromMetadata(
|
|
@@ -225,10 +225,10 @@ const enUS = {
|
|
|
225
225
|
languageTitle: "Language",
|
|
226
226
|
languageDescription: "Choose the interface language for Calendar.",
|
|
227
227
|
languageLabel: "Interface language",
|
|
228
|
-
agentTitle: "Agent
|
|
228
|
+
agentTitle: "Agent workspace",
|
|
229
229
|
agentDescription:
|
|
230
|
-
"Open the agent
|
|
231
|
-
openAgentSettings: "Open agent
|
|
230
|
+
"Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
|
|
231
|
+
openAgentSettings: "Open agent workspace",
|
|
232
232
|
googleCalendar: "Google Calendar",
|
|
233
233
|
googleDescription: "Connect your Google Calendar to sync events.",
|
|
234
234
|
googleFailed: "Google sign-in failed",
|
|
@@ -132,8 +132,6 @@ const PREVIEW_COLLAPSED_STORAGE_KEY = "calendar.bookingLinks.previewCollapsed";
|
|
|
132
132
|
const BRAND_LINK_CLASS = "font-semibold text-[#00B5FF] hover:text-[#33C4FF]";
|
|
133
133
|
const BRAND_ICON_LINK_CLASS =
|
|
134
134
|
"text-[#00B5FF] hover:bg-[#00B5FF]/10 hover:text-[#33C4FF]";
|
|
135
|
-
const BRAND_PILL_LINK_CLASS =
|
|
136
|
-
"border-[#00B5FF]/35 bg-[#00B5FF]/10 font-semibold text-[#00B5FF] hover:border-[#00B5FF]/55 hover:bg-[#00B5FF]/15 hover:text-[#33C4FF]";
|
|
137
135
|
const EMAIL_RE = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
|
|
138
136
|
const BOOKING_SLOT_STEP_MINUTES = 30;
|
|
139
137
|
|
|
@@ -1634,31 +1632,34 @@ export default function BookingLinksPage({
|
|
|
1634
1632
|
<div className="flex shrink-0 items-center gap-2">
|
|
1635
1633
|
{link.isActive && (
|
|
1636
1634
|
<>
|
|
1637
|
-
<
|
|
1635
|
+
<Button
|
|
1638
1636
|
type="button"
|
|
1637
|
+
variant="outline"
|
|
1638
|
+
size="sm"
|
|
1639
1639
|
onClick={(e) => {
|
|
1640
1640
|
e.stopPropagation();
|
|
1641
1641
|
void copyPreviewUrl(link.slug);
|
|
1642
1642
|
}}
|
|
1643
|
-
className=
|
|
1644
|
-
"flex items-center gap-1.5 rounded-full border px-3 py-1.5 text-xs sm:px-4 sm:text-sm",
|
|
1645
|
-
BRAND_PILL_LINK_CLASS,
|
|
1646
|
-
)}
|
|
1643
|
+
className="rounded-full"
|
|
1647
1644
|
>
|
|
1648
1645
|
<IconLink className="h-3.5 w-3.5" />
|
|
1649
1646
|
{t("bookingLinks.copyLink")}
|
|
1650
|
-
</
|
|
1651
|
-
<
|
|
1652
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
className=
|
|
1656
|
-
|
|
1657
|
-
BRAND_PILL_LINK_CLASS,
|
|
1658
|
-
)}
|
|
1647
|
+
</Button>
|
|
1648
|
+
<Button
|
|
1649
|
+
asChild
|
|
1650
|
+
variant="outline"
|
|
1651
|
+
size="icon"
|
|
1652
|
+
className="h-9 w-9 rounded-full"
|
|
1653
|
+
aria-label={t("bookingLinks.openBookingLink")}
|
|
1659
1654
|
>
|
|
1660
|
-
<
|
|
1661
|
-
|
|
1655
|
+
<a
|
|
1656
|
+
href={bookingPreviewPath(link.slug)}
|
|
1657
|
+
target="_blank"
|
|
1658
|
+
rel="noopener noreferrer"
|
|
1659
|
+
>
|
|
1660
|
+
<IconExternalLink className="h-4 w-4" />
|
|
1661
|
+
</a>
|
|
1662
|
+
</Button>
|
|
1662
1663
|
</>
|
|
1663
1664
|
)}
|
|
1664
1665
|
|
|
@@ -11,10 +11,10 @@ const messages = {
|
|
|
11
11
|
"Manage team members, organization access, and shared workspace preferences.",
|
|
12
12
|
openTeamSettings: "Open team settings",
|
|
13
13
|
openResourceSettings: "Open resource settings",
|
|
14
|
-
agentTitle: "Agent
|
|
14
|
+
agentTitle: "Agent workspace",
|
|
15
15
|
agentDescription:
|
|
16
|
-
"Open the agent
|
|
17
|
-
openAgentSettings: "Open agent
|
|
16
|
+
"Open the agent workspace for model, API keys, automations, voice, and other agent controls.",
|
|
17
|
+
openAgentSettings: "Open agent workspace",
|
|
18
18
|
},
|
|
19
19
|
chat: {
|
|
20
20
|
archiveChat: "Archive Chat",
|
|
@@ -8,6 +8,8 @@ type AgentClientModule = {
|
|
|
8
8
|
AgentChatSurface: ComponentType<{
|
|
9
9
|
mode?: "panel" | "page";
|
|
10
10
|
className?: string;
|
|
11
|
+
showHeader?: boolean;
|
|
12
|
+
showTabBar?: boolean;
|
|
11
13
|
}>;
|
|
12
14
|
AgentTabsPage?: ComponentType<AgentPageProps>;
|
|
13
15
|
};
|
|
@@ -33,7 +35,14 @@ export function resolveAgentPageComponent(
|
|
|
33
35
|
if (existing) return existing;
|
|
34
36
|
|
|
35
37
|
const legacyAgentPage = function LegacyAgentPage() {
|
|
36
|
-
return
|
|
38
|
+
return (
|
|
39
|
+
<client.AgentChatSurface
|
|
40
|
+
mode="page"
|
|
41
|
+
className="h-full"
|
|
42
|
+
showHeader={false}
|
|
43
|
+
showTabBar={false}
|
|
44
|
+
/>
|
|
45
|
+
);
|
|
37
46
|
};
|
|
38
47
|
legacyAgentPages.set(client, legacyAgentPage);
|
|
39
48
|
return legacyAgentPage;
|
|
@@ -58,7 +58,7 @@ Both fields are set by `start-meeting-recording`. Agents that operate on a recor
|
|
|
58
58
|
|
|
59
59
|
## Calendar reminders
|
|
60
60
|
|
|
61
|
-
Calendar events fire a desktop notification **1 minute before** the meeting start and keep it visible until **5 minutes after** start unless dismissed (consumer: the desktop tray in `src-tauri/`). The tray polls `list-meetings`, which reads Google Calendar live, so upcoming reminders do not depend on a manual sync or pre-created `meetings` rows. Desktop Zoom joins use Zoom's native `zoommtg://` link so the Zoom app opens directly without an intermediate browser tab; unsupported Zoom link shapes and other providers retain their HTTPS join URL. Agents do not need to schedule reminders manually.
|
|
61
|
+
Calendar events fire a desktop notification **1 minute before** the meeting start and keep it visible until **5 minutes after** start unless dismissed (consumer: the desktop tray in `src-tauri/`). The tray polls `list-meetings`, which reads Google Calendar live and excludes events the current user has declined, so upcoming reminders do not depend on a manual sync or pre-created `meetings` rows. The normal Meetings list remains calendar-backed and is not filtered by the reminder-only exclusion. Desktop Zoom joins use Zoom's native `zoommtg://` link so the Zoom app opens directly without an intermediate browser tab; unsupported Zoom link shapes and other providers retain their HTTPS join URL. Agents do not need to schedule reminders manually.
|
|
62
62
|
|
|
63
63
|
## Adhoc Zoom / Teams detection (desktop)
|
|
64
64
|
|
|
@@ -16,6 +16,10 @@ Detailed media, meeting, dictation, editing, and sharing rules live in
|
|
|
16
16
|
- Never hardcode API keys, tokens, webhook URLs, signing secrets, private Builder/internal data, customer data, or credential-looking literals. Use secrets/OAuth/runtime configuration and obvious placeholders in examples.
|
|
17
17
|
- Use actions for recording metadata, transcripts, cleanup, summaries, chapters,
|
|
18
18
|
comments, spaces/folders, meetings, and sharing. Do not bypass access helpers.
|
|
19
|
+
- Organization admins can use `set-organization-branding` with
|
|
20
|
+
`defaultVisibility=public|org|private` to choose the visibility applied when
|
|
21
|
+
new recordings omit an explicit visibility. The default remains `public`, and
|
|
22
|
+
explicit visibility wins (for example, bug-report recordings use `org`).
|
|
19
23
|
- Use `move-recording` for both single and bulk folder moves. Pass `id` for one
|
|
20
24
|
clip or `ids` for selected clips, and `folderId: null` to move them to the
|
|
21
25
|
library or space root.
|
|
@@ -53,6 +53,19 @@ const GEMINI_BYOK_MODEL = "gemini-2.0-flash-lite";
|
|
|
53
53
|
const GEMINI_BYOK_URL = `https://generativelanguage.googleapis.com/v1beta/models/${GEMINI_BYOK_MODEL}:generateContent`;
|
|
54
54
|
|
|
55
55
|
const MAX_INPUT_CHARS = 200_000;
|
|
56
|
+
const MAX_CLEANUP_OUTPUT_TOKENS = 32_000;
|
|
57
|
+
|
|
58
|
+
export function cleanupMaxOutputTokens(
|
|
59
|
+
task: "cleanup" | "title" | "summary",
|
|
60
|
+
transcriptLength: number,
|
|
61
|
+
): number {
|
|
62
|
+
if (task === "title") return 1_024;
|
|
63
|
+
if (task === "summary") return 4_096;
|
|
64
|
+
return Math.min(
|
|
65
|
+
MAX_CLEANUP_OUTPUT_TOKENS,
|
|
66
|
+
Math.max(1_024, Math.ceil(transcriptLength / 3) + 512),
|
|
67
|
+
);
|
|
68
|
+
}
|
|
56
69
|
|
|
57
70
|
const CLIPS_TRANSCRIPT_AGENT_INSTRUCTIONS = [
|
|
58
71
|
"Relevant Clips AGENTS.md rules:",
|
|
@@ -117,6 +130,10 @@ export default defineAction({
|
|
|
117
130
|
language: args.language,
|
|
118
131
|
});
|
|
119
132
|
const wantJson = args.task === "summary";
|
|
133
|
+
const maxOutputTokens = cleanupMaxOutputTokens(
|
|
134
|
+
args.task,
|
|
135
|
+
transcript.length,
|
|
136
|
+
);
|
|
120
137
|
|
|
121
138
|
// 1) Builder gateway (preferred — uses Builder.io Connect credentials).
|
|
122
139
|
const builderCreds = await resolveBuilderCredentials();
|
|
@@ -133,7 +150,7 @@ export default defineAction({
|
|
|
133
150
|
try {
|
|
134
151
|
const text = await callBuilderGateway({
|
|
135
152
|
prompt,
|
|
136
|
-
|
|
153
|
+
maxOutputTokens,
|
|
137
154
|
});
|
|
138
155
|
if (text.trim()) {
|
|
139
156
|
await clearBuilderCreditsExhausted();
|
|
@@ -170,6 +187,7 @@ export default defineAction({
|
|
|
170
187
|
apiKey: geminiKey,
|
|
171
188
|
prompt,
|
|
172
189
|
wantJson,
|
|
190
|
+
maxOutputTokens,
|
|
173
191
|
});
|
|
174
192
|
return shapeResult(args.task, text, "gemini-byok", contextPack);
|
|
175
193
|
}
|
|
@@ -189,10 +207,10 @@ async function resolveUserGeminiKey(): Promise<string | null> {
|
|
|
189
207
|
|
|
190
208
|
async function callBuilderGateway({
|
|
191
209
|
prompt,
|
|
192
|
-
|
|
210
|
+
maxOutputTokens,
|
|
193
211
|
}: {
|
|
194
212
|
prompt: { system: string; user: string };
|
|
195
|
-
|
|
213
|
+
maxOutputTokens: number;
|
|
196
214
|
}): Promise<string> {
|
|
197
215
|
const engine = createBuilderEngine();
|
|
198
216
|
const controller = new AbortController();
|
|
@@ -213,7 +231,7 @@ async function callBuilderGateway({
|
|
|
213
231
|
],
|
|
214
232
|
tools: [],
|
|
215
233
|
abortSignal: controller.signal,
|
|
216
|
-
maxOutputTokens
|
|
234
|
+
maxOutputTokens,
|
|
217
235
|
temperature: 0,
|
|
218
236
|
});
|
|
219
237
|
for await (const event of events) {
|
|
@@ -232,6 +250,10 @@ async function callBuilderGateway({
|
|
|
232
250
|
? `Builder gateway returned ${event.errorCode}`
|
|
233
251
|
: "Builder gateway returned an error");
|
|
234
252
|
}
|
|
253
|
+
if (event.type === "stop" && event.reason === "max_tokens") {
|
|
254
|
+
terminalError =
|
|
255
|
+
"Builder gateway truncated transcript cleanup at the output-token limit";
|
|
256
|
+
}
|
|
235
257
|
}
|
|
236
258
|
} finally {
|
|
237
259
|
clearTimeout(timeout);
|
|
@@ -280,10 +302,12 @@ async function callGeminiByok({
|
|
|
280
302
|
apiKey,
|
|
281
303
|
prompt,
|
|
282
304
|
wantJson,
|
|
305
|
+
maxOutputTokens,
|
|
283
306
|
}: {
|
|
284
307
|
apiKey: string;
|
|
285
308
|
prompt: { system: string; user: string };
|
|
286
309
|
wantJson: boolean;
|
|
310
|
+
maxOutputTokens: number;
|
|
287
311
|
}): Promise<string> {
|
|
288
312
|
const controller = new AbortController();
|
|
289
313
|
const timeout = setTimeout(() => controller.abort(), 30_000);
|
|
@@ -302,6 +326,7 @@ async function callGeminiByok({
|
|
|
302
326
|
],
|
|
303
327
|
generationConfig: {
|
|
304
328
|
temperature: 0,
|
|
329
|
+
maxOutputTokens,
|
|
305
330
|
...(wantJson ? { responseMimeType: "application/json" } : {}),
|
|
306
331
|
},
|
|
307
332
|
}),
|
|
@@ -314,8 +339,14 @@ async function callGeminiByok({
|
|
|
314
339
|
const data = (await res.json()) as {
|
|
315
340
|
candidates?: Array<{
|
|
316
341
|
content?: { parts?: Array<{ text?: string }> };
|
|
342
|
+
finishReason?: string;
|
|
317
343
|
}>;
|
|
318
344
|
};
|
|
345
|
+
if (data.candidates?.[0]?.finishReason === "MAX_TOKENS") {
|
|
346
|
+
throw new Error(
|
|
347
|
+
"Gemini truncated transcript cleanup at the output-token limit",
|
|
348
|
+
);
|
|
349
|
+
}
|
|
319
350
|
return (
|
|
320
351
|
data.candidates?.[0]?.content?.parts
|
|
321
352
|
?.map((p) => p.text ?? "")
|
|
@@ -17,6 +17,7 @@ import { getDb, schema } from "../server/db/index.js";
|
|
|
17
17
|
import {
|
|
18
18
|
getCurrentOwnerEmail,
|
|
19
19
|
getActiveOrganizationId,
|
|
20
|
+
getOrganizationDefaultVisibility,
|
|
20
21
|
nanoid,
|
|
21
22
|
} from "../server/lib/recordings.js";
|
|
22
23
|
|
|
@@ -64,7 +65,9 @@ export default defineAction({
|
|
|
64
65
|
visibility: z
|
|
65
66
|
.enum(["private", "org", "public"])
|
|
66
67
|
.optional()
|
|
67
|
-
.describe(
|
|
68
|
+
.describe(
|
|
69
|
+
"Initial visibility. When omitted, uses the organization default and falls back to public.",
|
|
70
|
+
),
|
|
68
71
|
source: z
|
|
69
72
|
.enum(["calendar", "adhoc", "manual"])
|
|
70
73
|
.optional()
|
|
@@ -187,7 +190,8 @@ export default defineAction({
|
|
|
187
190
|
}
|
|
188
191
|
}
|
|
189
192
|
|
|
190
|
-
const visibility =
|
|
193
|
+
const visibility =
|
|
194
|
+
args.visibility ?? (await getOrganizationDefaultVisibility(orgId));
|
|
191
195
|
|
|
192
196
|
try {
|
|
193
197
|
await db.insert(schema.meetings).values({
|
|
@@ -20,7 +20,7 @@ import { getCurrentOwnerEmail } from "../server/lib/recordings.js";
|
|
|
20
20
|
|
|
21
21
|
export default defineAction({
|
|
22
22
|
description:
|
|
23
|
-
"Create a new organization and add the caller as an admin member. Seeds a Clips-specific organization_settings row with default brand color #18181B and
|
|
23
|
+
"Create a new organization and add the caller as an admin member. Seeds a Clips-specific organization_settings row with default brand color #18181B and public visibility, then activates the new org for the caller. Returns the new organization id.",
|
|
24
24
|
schema: z.object({
|
|
25
25
|
name: z.string().min(1).describe("Organization name"),
|
|
26
26
|
}),
|
|
@@ -40,7 +40,7 @@ export default defineAction({
|
|
|
40
40
|
.values({
|
|
41
41
|
organizationId: id,
|
|
42
42
|
brandColor: "#18181B",
|
|
43
|
-
defaultVisibility: "
|
|
43
|
+
defaultVisibility: "public",
|
|
44
44
|
createdAt: nowIso,
|
|
45
45
|
updatedAt: nowIso,
|
|
46
46
|
})
|
|
@@ -55,6 +55,7 @@ export default defineAction({
|
|
|
55
55
|
name,
|
|
56
56
|
brandColor: "#18181B",
|
|
57
57
|
brandLogoUrl: null,
|
|
58
|
+
defaultVisibility: "public",
|
|
58
59
|
createdAt: nowIso,
|
|
59
60
|
};
|
|
60
61
|
},
|
|
@@ -18,6 +18,7 @@ import { MAX_UPLOAD_BYTES } from "@shared/upload-limits.js";
|
|
|
18
18
|
import { getDb, schema } from "../server/db/index.js";
|
|
19
19
|
import {
|
|
20
20
|
getCurrentOwnerEmail,
|
|
21
|
+
getOrganizationDefaultVisibility,
|
|
21
22
|
nanoid,
|
|
22
23
|
requireOrganizationAccess,
|
|
23
24
|
stringifySpaceIds,
|
|
@@ -45,6 +46,8 @@ export default defineAction({
|
|
|
45
46
|
const { organizationId } = await requireOrganizationAccess(
|
|
46
47
|
args.organizationId,
|
|
47
48
|
);
|
|
49
|
+
const defaultVisibility =
|
|
50
|
+
await getOrganizationDefaultVisibility(organizationId);
|
|
48
51
|
|
|
49
52
|
const spaceIds = (args.spaceIds ?? []).filter(
|
|
50
53
|
(value, index, arr) => value && arr.indexOf(value) === index,
|
|
@@ -64,7 +67,7 @@ export default defineAction({
|
|
|
64
67
|
uploadProgress: 0,
|
|
65
68
|
hasAudio: args.hasAudio ?? true,
|
|
66
69
|
hasCamera: args.hasCamera ?? false,
|
|
67
|
-
visibility: args.visibility ??
|
|
70
|
+
visibility: args.visibility ?? defaultVisibility,
|
|
68
71
|
width: args.width ?? 0,
|
|
69
72
|
height: args.height ?? 0,
|
|
70
73
|
ownerEmail,
|