@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
|
@@ -104,7 +104,7 @@ const migrations = runMigrations(
|
|
|
104
104
|
slug TEXT NOT NULL,
|
|
105
105
|
brand_color TEXT NOT NULL DEFAULT '#18181B',
|
|
106
106
|
brand_logo_url TEXT,
|
|
107
|
-
default_visibility TEXT NOT NULL DEFAULT '
|
|
107
|
+
default_visibility TEXT NOT NULL DEFAULT 'public',
|
|
108
108
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
109
109
|
updated_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
110
110
|
owner_email TEXT NOT NULL DEFAULT 'local@localhost',
|
|
@@ -348,7 +348,7 @@ const migrations = runMigrations(
|
|
|
348
348
|
organization_id TEXT PRIMARY KEY,
|
|
349
349
|
brand_color TEXT NOT NULL DEFAULT '#18181B',
|
|
350
350
|
brand_logo_url TEXT,
|
|
351
|
-
default_visibility TEXT NOT NULL DEFAULT '
|
|
351
|
+
default_visibility TEXT NOT NULL DEFAULT 'public',
|
|
352
352
|
created_at TEXT NOT NULL DEFAULT (datetime('now')),
|
|
353
353
|
updated_at TEXT NOT NULL DEFAULT (datetime('now'))
|
|
354
354
|
)`,
|
|
@@ -44,7 +44,7 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
44
44
|
return {
|
|
45
45
|
error: "missing_credentials",
|
|
46
46
|
message:
|
|
47
|
-
"Google Calendar OAuth is not configured. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in your environment, or paste them in the agent
|
|
47
|
+
"Google Calendar OAuth is not configured. Set GOOGLE_CLIENT_ID and GOOGLE_CLIENT_SECRET in your environment, or paste them in the agent workspace.",
|
|
48
48
|
};
|
|
49
49
|
}
|
|
50
50
|
|
|
@@ -19,6 +19,7 @@ import {
|
|
|
19
19
|
signShortLivedToken,
|
|
20
20
|
verifyScopedAgentAccessToken,
|
|
21
21
|
} from "@agent-native/core/server";
|
|
22
|
+
import { resolveAccess } from "@agent-native/core/sharing";
|
|
22
23
|
import { asc, eq } from "drizzle-orm";
|
|
23
24
|
import {
|
|
24
25
|
defineEventHandler,
|
|
@@ -45,7 +46,6 @@ import { resolvePlayerVideoUrl } from "../../lib/player-video-url.js";
|
|
|
45
46
|
import {
|
|
46
47
|
getOrganizationRoleForEmail,
|
|
47
48
|
parseSpaceIds,
|
|
48
|
-
sameOwnerEmail,
|
|
49
49
|
} from "../../lib/recordings.js";
|
|
50
50
|
import { verifySharePassword } from "../../lib/share-password.js";
|
|
51
51
|
|
|
@@ -211,9 +211,6 @@ export default defineEventHandler(async (event) => {
|
|
|
211
211
|
}
|
|
212
212
|
|
|
213
213
|
const session = await getSession(event).catch(() => null);
|
|
214
|
-
const viewerIsOwner = Boolean(
|
|
215
|
-
session?.email && sameOwnerEmail(session.email, rec.ownerEmail),
|
|
216
|
-
);
|
|
217
214
|
const tokenAllowsAgentAccess = suppliedAgentAccessToken
|
|
218
215
|
? verifyScopedAgentAccessToken(suppliedAgentAccessToken, {
|
|
219
216
|
resourceKind: CLIP_AGENT_ACCESS_TOKEN_PREFIX,
|
|
@@ -221,6 +218,18 @@ export default defineEventHandler(async (event) => {
|
|
|
221
218
|
}).ok
|
|
222
219
|
: false;
|
|
223
220
|
|
|
221
|
+
// Share links are public-shell routes, so this endpoint cannot rely on the
|
|
222
|
+
// authenticated player action to authorize private recordings. Resolve the
|
|
223
|
+
// same registered access policy here so explicit user/org grants work before
|
|
224
|
+
// the client redirects to the direct player route.
|
|
225
|
+
const viewerAccess = session?.email
|
|
226
|
+
? await resolveAccess("recording", rec.id, {
|
|
227
|
+
userEmail: session.email,
|
|
228
|
+
orgId: session.orgId,
|
|
229
|
+
})
|
|
230
|
+
: null;
|
|
231
|
+
const viewerIsOwner = viewerAccess?.role === "owner";
|
|
232
|
+
|
|
224
233
|
let viewerIsOrgMember = false;
|
|
225
234
|
if (session?.email && rec.visibility === "org" && rec.organizationId) {
|
|
226
235
|
try {
|
|
@@ -238,7 +247,7 @@ export default defineEventHandler(async (event) => {
|
|
|
238
247
|
|
|
239
248
|
if (
|
|
240
249
|
rec.visibility !== "public" &&
|
|
241
|
-
!
|
|
250
|
+
!viewerAccess &&
|
|
242
251
|
!viewerIsOrgMember &&
|
|
243
252
|
!tokenAllowsAgentAccess
|
|
244
253
|
) {
|
|
@@ -196,6 +196,9 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
196
196
|
status: schema.recordings.status,
|
|
197
197
|
failureReason: schema.recordings.failureReason,
|
|
198
198
|
ownerEmail: schema.recordings.ownerEmail,
|
|
199
|
+
videoUrl: schema.recordings.videoUrl,
|
|
200
|
+
videoSizeBytes: schema.recordings.videoSizeBytes,
|
|
201
|
+
durationMs: schema.recordings.durationMs,
|
|
199
202
|
})
|
|
200
203
|
.from(schema.recordings)
|
|
201
204
|
.where(
|
|
@@ -255,7 +258,18 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
255
258
|
// Already finalized — retried final chunk after session was deleted. Skip
|
|
256
259
|
// buffered path writes so recording-upload-* state stays correct.
|
|
257
260
|
if (existing.status === "ready") {
|
|
258
|
-
|
|
261
|
+
const readyState = await readAppState(
|
|
262
|
+
`recording-upload-${recordingId}`,
|
|
263
|
+
).catch(() => null);
|
|
264
|
+
return {
|
|
265
|
+
ok: true,
|
|
266
|
+
finalized: true,
|
|
267
|
+
status: "ready" as const,
|
|
268
|
+
videoUrl: existing.videoUrl,
|
|
269
|
+
videoSizeBytes: existing.videoSizeBytes,
|
|
270
|
+
durationMs: existing.durationMs,
|
|
271
|
+
sourceSizeBytes: stateNumber(readyState, "sourceSizeBytes"),
|
|
272
|
+
};
|
|
259
273
|
}
|
|
260
274
|
|
|
261
275
|
// Store chunks in application_state, assemble on finalize.
|
|
@@ -569,6 +583,7 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
569
583
|
id: schema.recordings.id,
|
|
570
584
|
status: schema.recordings.status,
|
|
571
585
|
videoUrl: schema.recordings.videoUrl,
|
|
586
|
+
videoSizeBytes: schema.recordings.videoSizeBytes,
|
|
572
587
|
durationMs: schema.recordings.durationMs,
|
|
573
588
|
width: schema.recordings.width,
|
|
574
589
|
height: schema.recordings.height,
|
|
@@ -590,12 +605,26 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
590
605
|
error: err instanceof Error ? err.message : String(err),
|
|
591
606
|
},
|
|
592
607
|
);
|
|
608
|
+
const priorReadyStateRaw = await readAppState(
|
|
609
|
+
`recording-upload-${recordingId}`,
|
|
610
|
+
).catch(() => null);
|
|
611
|
+
const priorReadyState =
|
|
612
|
+
priorReadyStateRaw && typeof priorReadyStateRaw === "object"
|
|
613
|
+
? (priorReadyStateRaw as Record<string, unknown>)
|
|
614
|
+
: {};
|
|
615
|
+
const sourceSizeBytes =
|
|
616
|
+
stateNumber(priorReadyState, "sourceSizeBytes") ??
|
|
617
|
+
stateNumber(priorReadyState, "bytesReceived");
|
|
593
618
|
try {
|
|
594
619
|
await writeAppState(`recording-upload-${recordingId}`, {
|
|
620
|
+
...priorReadyState,
|
|
595
621
|
recordingId,
|
|
596
622
|
status: "ready",
|
|
597
623
|
progress: 100,
|
|
598
624
|
videoUrl: committed.videoUrl,
|
|
625
|
+
videoSizeBytes: committed.videoSizeBytes,
|
|
626
|
+
sourceSizeBytes,
|
|
627
|
+
durationMs: committed.durationMs,
|
|
599
628
|
finishedAt: new Date().toISOString(),
|
|
600
629
|
});
|
|
601
630
|
} catch (stateErr) {
|
|
@@ -612,6 +641,8 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
612
641
|
id: committed.id,
|
|
613
642
|
status: "ready",
|
|
614
643
|
videoUrl: committed.videoUrl,
|
|
644
|
+
videoSizeBytes: committed.videoSizeBytes,
|
|
645
|
+
sourceSizeBytes,
|
|
615
646
|
durationMs: committed.durationMs,
|
|
616
647
|
width: committed.width,
|
|
617
648
|
height: committed.height,
|
|
@@ -709,6 +740,7 @@ async function handleResumableChunk(
|
|
|
709
740
|
|
|
710
741
|
const raw = await readRawBody(event, false);
|
|
711
742
|
const bytes: Uint8Array = raw ?? new Uint8Array(0);
|
|
743
|
+
let finalizedSourceSizeBytes = session.bytesUploaded;
|
|
712
744
|
|
|
713
745
|
if (!isFinal && bytes.byteLength === 0) {
|
|
714
746
|
throw createError({ statusCode: 400, message: "Empty chunk body" });
|
|
@@ -806,6 +838,7 @@ async function handleResumableChunk(
|
|
|
806
838
|
bytesUploaded: start + bytes.byteLength,
|
|
807
839
|
lastCommittedIndex: index,
|
|
808
840
|
});
|
|
841
|
+
finalizedSourceSizeBytes = start + bytes.byteLength;
|
|
809
842
|
|
|
810
843
|
if (!isFinal) {
|
|
811
844
|
return { ok: true, finalized: false, index, bytes: bytes.byteLength };
|
|
@@ -838,6 +871,7 @@ async function handleResumableChunk(
|
|
|
838
871
|
id: schema.recordings.id,
|
|
839
872
|
status: schema.recordings.status,
|
|
840
873
|
videoUrl: schema.recordings.videoUrl,
|
|
874
|
+
videoSizeBytes: schema.recordings.videoSizeBytes,
|
|
841
875
|
durationMs: schema.recordings.durationMs,
|
|
842
876
|
width: schema.recordings.width,
|
|
843
877
|
height: schema.recordings.height,
|
|
@@ -856,11 +890,25 @@ async function handleResumableChunk(
|
|
|
856
890
|
`[resumable-chunk-${recordingId}] finalize reported an error after committing a ready recording; returning committed success.`,
|
|
857
891
|
{ error: err instanceof Error ? err.message : String(err) },
|
|
858
892
|
);
|
|
893
|
+
const priorReadyStateRaw = await readAppState(
|
|
894
|
+
`recording-upload-${recordingId}`,
|
|
895
|
+
).catch(() => null);
|
|
896
|
+
const priorReadyState =
|
|
897
|
+
priorReadyStateRaw && typeof priorReadyStateRaw === "object"
|
|
898
|
+
? (priorReadyStateRaw as Record<string, unknown>)
|
|
899
|
+
: {};
|
|
900
|
+
const sourceSizeBytes =
|
|
901
|
+
stateNumber(priorReadyState, "sourceSizeBytes") ??
|
|
902
|
+
finalizedSourceSizeBytes;
|
|
859
903
|
await writeAppState(`recording-upload-${recordingId}`, {
|
|
904
|
+
...priorReadyState,
|
|
860
905
|
recordingId,
|
|
861
906
|
status: "ready",
|
|
862
907
|
progress: 100,
|
|
863
908
|
videoUrl: committed.videoUrl,
|
|
909
|
+
videoSizeBytes: committed.videoSizeBytes,
|
|
910
|
+
sourceSizeBytes,
|
|
911
|
+
durationMs: committed.durationMs,
|
|
864
912
|
finishedAt: new Date().toISOString(),
|
|
865
913
|
}).catch((stateErr) =>
|
|
866
914
|
console.warn(
|
|
@@ -875,6 +923,8 @@ async function handleResumableChunk(
|
|
|
875
923
|
id: committed.id,
|
|
876
924
|
status: "ready",
|
|
877
925
|
videoUrl: committed.videoUrl,
|
|
926
|
+
videoSizeBytes: committed.videoSizeBytes,
|
|
927
|
+
sourceSizeBytes,
|
|
878
928
|
durationMs: committed.durationMs,
|
|
879
929
|
width: committed.width,
|
|
880
930
|
height: committed.height,
|
|
@@ -64,7 +64,6 @@ import {
|
|
|
64
64
|
loomEmbedUrlForRecording,
|
|
65
65
|
} from "../../../../shared/loom.js";
|
|
66
66
|
import { getDb, schema } from "../../../db/index.js";
|
|
67
|
-
import { builderCompressedMediaUrl } from "../../../lib/builder-media-compression.js";
|
|
68
67
|
import { getOrganizationRoleForEmail } from "../../../lib/recordings.js";
|
|
69
68
|
import { verifySharePassword } from "../../../lib/share-password.js";
|
|
70
69
|
|
|
@@ -89,8 +88,6 @@ const PROXIED_HEADER_NAMES = [
|
|
|
89
88
|
const PROVIDER_MEDIA_FETCH_TIMEOUT_MS = 30_000;
|
|
90
89
|
const PROTECTED_MEDIA_ACCESS_TTL_SECONDS = 6 * 60 * 60;
|
|
91
90
|
const PROTECTED_MEDIA_COOKIE_PREFIX = "clips_media_";
|
|
92
|
-
const COMPRESSED_BUILDER_MEDIA_MISS_TTL_MS = 5_000;
|
|
93
|
-
const compressedBuilderMediaMisses = new Map<string, number>();
|
|
94
91
|
|
|
95
92
|
function appPath(path: string): string {
|
|
96
93
|
if (!path.startsWith("/")) return path;
|
|
@@ -150,42 +147,6 @@ function isRecursiveVideoRouteUrl(value: string, recordingId: string): boolean {
|
|
|
150
147
|
}
|
|
151
148
|
}
|
|
152
149
|
|
|
153
|
-
function shouldSkipCompressedBuilderMediaProbe(
|
|
154
|
-
compressedSourceUrl: string,
|
|
155
|
-
): boolean {
|
|
156
|
-
const expiresAt = compressedBuilderMediaMisses.get(compressedSourceUrl);
|
|
157
|
-
if (!expiresAt) return false;
|
|
158
|
-
if (expiresAt <= Date.now()) {
|
|
159
|
-
compressedBuilderMediaMisses.delete(compressedSourceUrl);
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
return true;
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
function rememberCompressedBuilderMediaMiss(compressedSourceUrl: string): void {
|
|
166
|
-
if (compressedBuilderMediaMisses.size > 1_000) {
|
|
167
|
-
for (const [url, expiresAt] of compressedBuilderMediaMisses) {
|
|
168
|
-
if (expiresAt <= Date.now()) compressedBuilderMediaMisses.delete(url);
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
compressedBuilderMediaMisses.set(
|
|
172
|
-
compressedSourceUrl,
|
|
173
|
-
Date.now() + COMPRESSED_BUILDER_MEDIA_MISS_TTL_MS,
|
|
174
|
-
);
|
|
175
|
-
}
|
|
176
|
-
|
|
177
|
-
function shouldFallbackToOriginalMedia(
|
|
178
|
-
upstream: Response | { error: string; status: number },
|
|
179
|
-
): boolean {
|
|
180
|
-
return upstream.status >= 500 || [403, 404, 416].includes(upstream.status);
|
|
181
|
-
}
|
|
182
|
-
|
|
183
|
-
function shouldRememberCompressedBuilderMediaMiss(
|
|
184
|
-
upstream: Response | { error: string; status: number },
|
|
185
|
-
): boolean {
|
|
186
|
-
return upstream.status >= 500 || [403, 404].includes(upstream.status);
|
|
187
|
-
}
|
|
188
|
-
|
|
189
150
|
async function fetchProviderMedia(
|
|
190
151
|
sourceUrl: string,
|
|
191
152
|
rangeHeader: string | undefined,
|
|
@@ -492,31 +453,7 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
492
453
|
|
|
493
454
|
let upstream: Response | { error: string; status: number };
|
|
494
455
|
try {
|
|
495
|
-
|
|
496
|
-
if (
|
|
497
|
-
compressedSourceUrl &&
|
|
498
|
-
!shouldSkipCompressedBuilderMediaProbe(compressedSourceUrl)
|
|
499
|
-
) {
|
|
500
|
-
try {
|
|
501
|
-
upstream = await fetchProviderMedia(
|
|
502
|
-
compressedSourceUrl,
|
|
503
|
-
rangeHeader,
|
|
504
|
-
);
|
|
505
|
-
} catch (err) {
|
|
506
|
-
upstream = {
|
|
507
|
-
status: statusCodeForProviderFetchError(err),
|
|
508
|
-
error: messageForProviderFetchError(err),
|
|
509
|
-
};
|
|
510
|
-
}
|
|
511
|
-
if (shouldRememberCompressedBuilderMediaMiss(upstream)) {
|
|
512
|
-
rememberCompressedBuilderMediaMiss(compressedSourceUrl);
|
|
513
|
-
}
|
|
514
|
-
if (shouldFallbackToOriginalMedia(upstream)) {
|
|
515
|
-
upstream = await fetchProviderMedia(sourceUrl, rangeHeader);
|
|
516
|
-
}
|
|
517
|
-
} else {
|
|
518
|
-
upstream = await fetchProviderMedia(sourceUrl, rangeHeader);
|
|
519
|
-
}
|
|
456
|
+
upstream = await fetchProviderMedia(sourceUrl, rangeHeader);
|
|
520
457
|
} catch (err) {
|
|
521
458
|
setResponseStatus(event, statusCodeForProviderFetchError(err));
|
|
522
459
|
return { error: messageForProviderFetchError(err) };
|
|
@@ -18,13 +18,21 @@ export interface MediaWorkerJob {
|
|
|
18
18
|
callback: { url: string };
|
|
19
19
|
}
|
|
20
20
|
|
|
21
|
-
export
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
21
|
+
export type MediaWorkerCallback =
|
|
22
|
+
| {
|
|
23
|
+
jobId: string;
|
|
24
|
+
status: "done";
|
|
25
|
+
outputUrl?: string;
|
|
26
|
+
error?: string;
|
|
27
|
+
durationMs: number;
|
|
28
|
+
}
|
|
29
|
+
| {
|
|
30
|
+
jobId: string;
|
|
31
|
+
status: "failed";
|
|
32
|
+
outputUrl?: string;
|
|
33
|
+
error?: string;
|
|
34
|
+
durationMs?: number;
|
|
35
|
+
};
|
|
28
36
|
|
|
29
37
|
export interface MediaWorkerSignatureHeaders {
|
|
30
38
|
[MEDIA_WORKER_TIMESTAMP_HEADER]: string;
|
|
@@ -125,22 +133,31 @@ export function parseMediaWorkerCallback(
|
|
|
125
133
|
return null;
|
|
126
134
|
}
|
|
127
135
|
if (body.error !== undefined && typeof body.error !== "string") return null;
|
|
136
|
+
const durationMs =
|
|
137
|
+
typeof body.durationMs === "number" && Number.isFinite(body.durationMs)
|
|
138
|
+
? Math.round(body.durationMs)
|
|
139
|
+
: undefined;
|
|
140
|
+
if (body.status === "done") {
|
|
141
|
+
if (durationMs === undefined || durationMs <= 0) return null;
|
|
142
|
+
return {
|
|
143
|
+
jobId: body.jobId,
|
|
144
|
+
status: "done",
|
|
145
|
+
outputUrl: body.outputUrl,
|
|
146
|
+
error: body.error,
|
|
147
|
+
durationMs,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
128
150
|
if (
|
|
129
151
|
body.durationMs !== undefined &&
|
|
130
|
-
(
|
|
131
|
-
!Number.isFinite(body.durationMs) ||
|
|
132
|
-
body.durationMs < 0)
|
|
152
|
+
(durationMs === undefined || durationMs < 0)
|
|
133
153
|
) {
|
|
134
154
|
return null;
|
|
135
155
|
}
|
|
136
156
|
return {
|
|
137
157
|
jobId: body.jobId,
|
|
138
|
-
status:
|
|
158
|
+
status: "failed",
|
|
139
159
|
outputUrl: body.outputUrl,
|
|
140
160
|
error: body.error,
|
|
141
|
-
durationMs
|
|
142
|
-
typeof body.durationMs === "number"
|
|
143
|
-
? Math.round(body.durationMs)
|
|
144
|
-
: undefined,
|
|
161
|
+
durationMs,
|
|
145
162
|
};
|
|
146
163
|
}
|
|
@@ -21,6 +21,12 @@ actions, and local folders that sync into the same database model.
|
|
|
21
21
|
|
|
22
22
|
## Choose The Path
|
|
23
23
|
|
|
24
|
+
- Before drafting or materially rewriting, read the `creative-context` skill.
|
|
25
|
+
Retrieve voice, terminology, audience guidance, and factual evidence as
|
|
26
|
+
separate roles; respect opt-out and pinned packs. Apply the exact reuse
|
|
27
|
+
ladder: approved native template/asset unchanged, compose approved pieces,
|
|
28
|
+
lightly adapt a real example, generate from narrow references, then net-new
|
|
29
|
+
only when the relevant corpus is empty.
|
|
24
30
|
- Use Content actions when the Content MCP/action tools are available:
|
|
25
31
|
`list-documents`, `search-documents`, `get-document`, `pull-document`,
|
|
26
32
|
`create-document`, `edit-document`, `update-document`, `delete-document`,
|
|
@@ -41,6 +47,16 @@ actions, and local folders that sync into the same database model.
|
|
|
41
47
|
`.md`/`.mdx` files directly, preserve frontmatter and MDX imports, and tell
|
|
42
48
|
the user the Content action surface was not available.
|
|
43
49
|
|
|
50
|
+
Retrieval is separate from drafting. Exact source item versions may support
|
|
51
|
+
claims; voice examples alone may not. Persist the immutable `contextPackId` and
|
|
52
|
+
reuse labels with document generation provenance so later edits can explain
|
|
53
|
+
what influenced the copy.
|
|
54
|
+
|
|
55
|
+
For `create-document`, pass the pre-drafting search result's `contextPackId`
|
|
56
|
+
and exact `reuseLabels`. Do not let the final write action search after the
|
|
57
|
+
document body has already been authored; post-hoc search is not provenance.
|
|
58
|
+
Omit both only when the Library is empty or creative context is explicitly Off.
|
|
59
|
+
|
|
44
60
|
## Action Examples
|
|
45
61
|
|
|
46
62
|
Prefer JSON input for action calls:
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: creative-context
|
|
3
|
+
description: >-
|
|
4
|
+
Reuse creative context across generation while respecting explicit context
|
|
5
|
+
choices, pinned packs, provenance, and opt-out state.
|
|
6
|
+
scope: app
|
|
7
|
+
metadata:
|
|
8
|
+
internal: true
|
|
9
|
+
---
|
|
10
|
+
|
|
11
|
+
# Creative Context
|
|
12
|
+
|
|
13
|
+
Use the shared creative-context library to reuse verified source material
|
|
14
|
+
without turning prior work into an invisible global prompt.
|
|
15
|
+
|
|
16
|
+
## Reuse ladder
|
|
17
|
+
|
|
18
|
+
Apply the first viable option in this exact order:
|
|
19
|
+
|
|
20
|
+
1. Reuse an approved native asset, component, or template unchanged.
|
|
21
|
+
2. Compose approved native pieces without flattening or recreating them.
|
|
22
|
+
3. Duplicate and lightly adapt a real approved example.
|
|
23
|
+
4. Generate new work conditioned on narrowly retrieved references.
|
|
24
|
+
5. Generate net-new work only when the relevant corpus is empty.
|
|
25
|
+
|
|
26
|
+
Do not skip directly to imitation or net-new generation when an approved native
|
|
27
|
+
primitive already fits.
|
|
28
|
+
|
|
29
|
+
## Retrieval procedure
|
|
30
|
+
|
|
31
|
+
Retrieve context in this order, stopping as soon as the current request is
|
|
32
|
+
sufficiently grounded. Keep factual evidence, visual/style references,
|
|
33
|
+
voice/terminology, and structural/layout examples in separate queries so one
|
|
34
|
+
role cannot silently stand in for another:
|
|
35
|
+
|
|
36
|
+
1. Follow the user's explicit instructions and the object currently selected in
|
|
37
|
+
the app.
|
|
38
|
+
2. Read the `creative-context` application-state record. If
|
|
39
|
+
`pinnedPackId` is set, prefer that immutable pack. Otherwise use
|
|
40
|
+
`currentPackId` when it records context already selected for this session.
|
|
41
|
+
3. Call `search-creative-context` with a narrow query for exact facts, visual
|
|
42
|
+
language, audience guidance, prior decisions, or reusable references.
|
|
43
|
+
4. Call `get-context-item` only for the specific search result versions
|
|
44
|
+
needed for the work. Preserve source and version provenance.
|
|
45
|
+
5. Fall back to app-local design systems, assets, documents, and current-user
|
|
46
|
+
instructions when the shared library has no relevant evidence.
|
|
47
|
+
|
|
48
|
+
Do not load the whole library or paste large source dumps into a prompt.
|
|
49
|
+
Context packs are generation snapshots; do not silently rewrite a historical
|
|
50
|
+
pack after it has been used.
|
|
51
|
+
|
|
52
|
+
For an inbound Creative Context machine-protocol A2A request, call
|
|
53
|
+
`creative-context-a2a` exactly once with its opaque `requestToken`, then return
|
|
54
|
+
the action's `responseToken` verbatim. Never decode or broaden the request.
|
|
55
|
+
|
|
56
|
+
## Context opt-out
|
|
57
|
+
|
|
58
|
+
The single state key is `creative-context`:
|
|
59
|
+
|
|
60
|
+
```json
|
|
61
|
+
{
|
|
62
|
+
"contextMode": "auto",
|
|
63
|
+
"currentPackId": null,
|
|
64
|
+
"pinnedPackId": null
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
When `contextMode` is `off`, do not search, select, or apply saved creative
|
|
69
|
+
context for subsequent generations. Do not restore a previous pack
|
|
70
|
+
automatically. Historical output may keep its original pack provenance. A
|
|
71
|
+
one-turn instruction such as "ignore the library for this version" wins for
|
|
72
|
+
that turn, but does not change the saved preference unless the user asks.
|
|
73
|
+
|
|
74
|
+
When the user corrects reused context, call `record-context-feedback` against
|
|
75
|
+
the exact item/version and signal whether it was unhelpful, incorrect, or
|
|
76
|
+
outdated. Never invent a source or silently overwrite source history.
|
|
77
|
+
|
|
78
|
+
## Content reuse
|
|
79
|
+
|
|
80
|
+
Search voice, terminology, audience, and factual evidence as separate intents.
|
|
81
|
+
Use voice/style examples to guide phrasing, but only exact evidence item
|
|
82
|
+
versions may support factual claims. Preserve the returned `contextPackId`
|
|
83
|
+
and short reuse labels with the document generation provenance. A published
|
|
84
|
+
brand profile can guide tone automatically; it never overrides the user's
|
|
85
|
+
current brief, and it must not turn an unsupported prior claim into a fact.
|
|
@@ -9,6 +9,14 @@ description: >-
|
|
|
9
9
|
|
|
10
10
|
The content app can sync documents bidirectionally with Notion. Documents can be linked to Notion pages, pulled from Notion, or pushed to Notion.
|
|
11
11
|
|
|
12
|
+
Notion sync is not creative-context retrieval. When drafting new copy from a
|
|
13
|
+
synced page, read the `creative-context` skill first and retrieve voice,
|
|
14
|
+
terminology, audience guidance, and factual evidence as separate roles. Apply
|
|
15
|
+
its exact reuse ladder, respect opt-out/pinned packs, and use app-local Notion
|
|
16
|
+
content as the fallback when the shared corpus has no relevant evidence. Keep
|
|
17
|
+
the resulting immutable `contextPackId` and reuse labels with document
|
|
18
|
+
generation provenance; never infer them from a later Notion sync snapshot.
|
|
19
|
+
|
|
12
20
|
## Scripts
|
|
13
21
|
|
|
14
22
|
### connect-notion-status
|
|
@@ -38,6 +38,12 @@ Detailed document editing, Notion, storage, and UI rules live in
|
|
|
38
38
|
|
|
39
39
|
## Application State
|
|
40
40
|
|
|
41
|
+
- Before generation, follow the creative-context reuse ladder in
|
|
42
|
+
`.agents/skills/creative-context/SKILL.md`: explicit request and current
|
|
43
|
+
document first, then a pinned/current pack, then narrow library search.
|
|
44
|
+
Respect `creative-context.contextMode: "off"` without silently restoring a
|
|
45
|
+
pack.
|
|
46
|
+
|
|
41
47
|
- `navigation` exposes document, selected block, comment, media, and Notion view
|
|
42
48
|
context.
|
|
43
49
|
- `navigate` moves the UI to documents, comments, media, and settings surfaces.
|
|
@@ -45,6 +51,9 @@ Detailed document editing, Notion, storage, and UI rules live in
|
|
|
45
51
|
|
|
46
52
|
## Skills
|
|
47
53
|
|
|
54
|
+
- `creative-context` for cross-app source reuse, pinned packs, provenance, and
|
|
55
|
+
context opt-out.
|
|
56
|
+
|
|
48
57
|
Read the relevant skill before deeper work:
|
|
49
58
|
|
|
50
59
|
- `document-editing` for structured document updates.
|
|
@@ -6,6 +6,10 @@ import {
|
|
|
6
6
|
getRequestOrgId,
|
|
7
7
|
} from "@agent-native/core/server/request-context";
|
|
8
8
|
import { assertAccess, type ShareRole } from "@agent-native/core/sharing";
|
|
9
|
+
import {
|
|
10
|
+
recordGenerationCreativeContext,
|
|
11
|
+
validateGenerationCreativeContext,
|
|
12
|
+
} from "@agent-native/creative-context/server";
|
|
9
13
|
import { and, eq, sql } from "drizzle-orm";
|
|
10
14
|
import { z } from "zod";
|
|
11
15
|
|
|
@@ -28,6 +32,34 @@ function nanoid(size = 12): string {
|
|
|
28
32
|
return id;
|
|
29
33
|
}
|
|
30
34
|
|
|
35
|
+
const reuseLabelSchema = z
|
|
36
|
+
.object({
|
|
37
|
+
itemId: z.string().min(1).optional(),
|
|
38
|
+
itemVersionId: z.string().min(1).optional(),
|
|
39
|
+
kind: z.string().min(1),
|
|
40
|
+
label: z.string().min(1),
|
|
41
|
+
dataRole: z.literal("untrusted-reference").default("untrusted-reference"),
|
|
42
|
+
elementId: z.string().min(1).optional(),
|
|
43
|
+
influence: z
|
|
44
|
+
.enum(["reused", "adapted", "reference-conditioned", "generated"])
|
|
45
|
+
.optional(),
|
|
46
|
+
})
|
|
47
|
+
.superRefine((label, context) => {
|
|
48
|
+
const influence = label.influence ?? "reference-conditioned";
|
|
49
|
+
if (Boolean(label.itemId) !== Boolean(label.itemVersionId)) {
|
|
50
|
+
context.addIssue({
|
|
51
|
+
code: "custom",
|
|
52
|
+
message: "itemId and itemVersionId must be provided together",
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
if (influence !== "generated" && !label.itemId) {
|
|
56
|
+
context.addIssue({
|
|
57
|
+
code: "custom",
|
|
58
|
+
message: "Only generated labels may omit context item ids",
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
});
|
|
62
|
+
|
|
31
63
|
export default defineAction({
|
|
32
64
|
description: "Create a new document.",
|
|
33
65
|
schema: z.object({
|
|
@@ -49,6 +81,21 @@ export default defineAction({
|
|
|
49
81
|
),
|
|
50
82
|
parentId: z.string().nullish().describe("Parent document ID for nesting"),
|
|
51
83
|
icon: z.string().optional().describe("Emoji icon"),
|
|
84
|
+
contextPackId: z
|
|
85
|
+
.string()
|
|
86
|
+
.optional()
|
|
87
|
+
.describe("Immutable pack returned by pre-generation context search"),
|
|
88
|
+
contextModeOverride: z
|
|
89
|
+
.literal("off")
|
|
90
|
+
.optional()
|
|
91
|
+
.describe(
|
|
92
|
+
"Disable Creative Context for this document generation only without changing the saved preference.",
|
|
93
|
+
),
|
|
94
|
+
reuseLabels: z
|
|
95
|
+
.array(reuseLabelSchema)
|
|
96
|
+
.optional()
|
|
97
|
+
.default([])
|
|
98
|
+
.describe("Exact context item versions used to draft this document"),
|
|
52
99
|
}),
|
|
53
100
|
mcpApp: {
|
|
54
101
|
compactCatalog: true,
|
|
@@ -62,6 +109,43 @@ export default defineAction({
|
|
|
62
109
|
}),
|
|
63
110
|
},
|
|
64
111
|
run: async (args) => {
|
|
112
|
+
const hasCreativeContextInput = Boolean(
|
|
113
|
+
args.contextPackId ||
|
|
114
|
+
args.contextModeOverride ||
|
|
115
|
+
args.reuseLabels.length > 0,
|
|
116
|
+
);
|
|
117
|
+
const validatedCreativeContext = hasCreativeContextInput
|
|
118
|
+
? await validateGenerationCreativeContext({
|
|
119
|
+
contextPackId: args.contextPackId,
|
|
120
|
+
contextModeOverride: args.contextModeOverride,
|
|
121
|
+
reuseLabels: args.reuseLabels,
|
|
122
|
+
})
|
|
123
|
+
: null;
|
|
124
|
+
const creativeContextProvenance = validatedCreativeContext
|
|
125
|
+
? {
|
|
126
|
+
contextMode: validatedCreativeContext.contextMode,
|
|
127
|
+
contextPackId: validatedCreativeContext.contextPackId,
|
|
128
|
+
reuseLabels: validatedCreativeContext.reuseLabels,
|
|
129
|
+
}
|
|
130
|
+
: null;
|
|
131
|
+
const elementProvenanceFor = (documentId: string) =>
|
|
132
|
+
creativeContextProvenance?.reuseLabels.length
|
|
133
|
+
? creativeContextProvenance.reuseLabels.map((label) => ({
|
|
134
|
+
elementId: label.elementId ?? documentId,
|
|
135
|
+
influence: label.influence ?? ("reference-conditioned" as const),
|
|
136
|
+
...(label.itemId ? { itemId: label.itemId } : {}),
|
|
137
|
+
...(label.itemVersionId
|
|
138
|
+
? { itemVersionId: label.itemVersionId }
|
|
139
|
+
: {}),
|
|
140
|
+
label: label.label,
|
|
141
|
+
}))
|
|
142
|
+
: [
|
|
143
|
+
{
|
|
144
|
+
elementId: documentId,
|
|
145
|
+
influence: "generated" as const,
|
|
146
|
+
label: "Net-new document",
|
|
147
|
+
},
|
|
148
|
+
];
|
|
65
149
|
const title = args.title;
|
|
66
150
|
|
|
67
151
|
let content = args.content || "";
|
|
@@ -208,6 +292,15 @@ export default defineAction({
|
|
|
208
292
|
);
|
|
209
293
|
|
|
210
294
|
await writeAppState("refresh-signal", { ts: Date.now() });
|
|
295
|
+
if (creativeContextProvenance) {
|
|
296
|
+
await recordGenerationCreativeContext({
|
|
297
|
+
appId: "content",
|
|
298
|
+
artifactType: "document",
|
|
299
|
+
artifactId: doc.id,
|
|
300
|
+
...creativeContextProvenance,
|
|
301
|
+
elementProvenance: elementProvenanceFor(doc.id),
|
|
302
|
+
});
|
|
303
|
+
}
|
|
211
304
|
|
|
212
305
|
return {
|
|
213
306
|
id: doc.id,
|
|
@@ -231,6 +324,7 @@ export default defineAction({
|
|
|
231
324
|
canManage: inheritedRole === "owner" || inheritedRole === "admin",
|
|
232
325
|
createdAt: doc.createdAt,
|
|
233
326
|
updatedAt: doc.updatedAt,
|
|
327
|
+
...(creativeContextProvenance ?? {}),
|
|
234
328
|
};
|
|
235
329
|
},
|
|
236
330
|
link: ({ result }) => {
|