@agent-native/core 0.90.2 → 0.90.4
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/bin/agent-native.js +25 -3
- package/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +21 -0
- package/corpus/core/bin/agent-native.js +25 -3
- package/corpus/core/docs/content/agent-native-toolkit.mdx +87 -80
- package/corpus/core/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/corpus/core/docs/content/toolkit-agent-ux.mdx +43 -0
- package/corpus/core/docs/content/toolkit-app-adapters.mdx +9 -0
- package/corpus/core/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/corpus/core/docs/content/toolkit-collaboration.mdx +74 -0
- package/corpus/core/docs/content/toolkit-command-navigation.mdx +106 -0
- package/corpus/core/docs/content/toolkit-comments-review.mdx +98 -0
- package/corpus/core/docs/content/toolkit-history.mdx +95 -0
- package/corpus/core/docs/content/toolkit-observability.mdx +41 -0
- package/corpus/core/docs/content/toolkit-org-team.mdx +80 -0
- package/corpus/core/docs/content/toolkit-resources.mdx +57 -0
- package/corpus/core/docs/content/toolkit-settings.mdx +65 -0
- package/corpus/core/docs/content/toolkit-setup-connections.mdx +109 -0
- package/corpus/core/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/corpus/core/docs/content/toolkit-sharing.mdx +81 -0
- package/corpus/core/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/corpus/core/docs/content/toolkit-ui.mdx +9 -0
- package/corpus/core/package.json +35 -1
- package/corpus/core/src/agent/engine/ai-sdk-engine.ts +19 -1
- package/corpus/core/src/agent/engine/anthropic-engine.ts +25 -1
- package/corpus/core/src/agent/engine/index.ts +1 -0
- package/corpus/core/src/agent/engine/registry.ts +86 -18
- package/corpus/core/src/agent/production-agent.ts +37 -6
- package/corpus/core/src/cli/create.ts +35 -0
- package/corpus/core/src/cli/design-connect.ts +248 -0
- package/corpus/core/src/cli/index.ts +84 -7
- package/corpus/core/src/cli/workspacify.ts +34 -0
- package/corpus/core/src/client/command-navigation/index.ts +15 -0
- package/corpus/core/src/client/comments-review/index.ts +1 -0
- package/corpus/core/src/client/history/VersionHistoryPanel.tsx +175 -0
- package/corpus/core/src/client/history/index.ts +21 -0
- package/corpus/core/src/client/history/use-history.ts +114 -0
- package/corpus/core/src/client/index.ts +84 -9
- package/corpus/core/src/client/org/OrgSwitcher.tsx +6 -6
- package/corpus/core/src/client/org/RequireActiveOrg.tsx +2 -2
- package/corpus/core/src/client/org/TeamPage.tsx +3 -3
- package/corpus/core/src/client/org/hooks.ts +32 -0
- package/corpus/core/src/client/org/index.ts +30 -1
- package/corpus/core/src/client/org-team/index.ts +1 -0
- package/corpus/core/src/client/review/ReviewStatusBadge.tsx +39 -0
- package/corpus/core/src/client/review/ReviewThreadPanel.tsx +278 -0
- package/corpus/core/src/client/review/index.ts +30 -0
- package/corpus/core/src/client/review/use-review.ts +152 -0
- package/corpus/core/src/client/settings/index.ts +11 -1
- package/corpus/core/src/client/setup-connections/BuilderConnectCard.tsx +94 -0
- package/corpus/core/src/client/setup-connections/ProviderReadinessBadge.tsx +73 -0
- package/corpus/core/src/client/setup-connections/SetupConnectionsPage.tsx +94 -0
- package/corpus/core/src/client/setup-connections/index.ts +46 -0
- package/corpus/core/src/client/sharing/ShareButton.tsx +20 -14
- package/corpus/core/src/client/sharing/ShareDialog.tsx +3 -3
- package/corpus/core/src/command-navigation/actions.ts +100 -0
- package/corpus/core/src/command-navigation/index.ts +12 -0
- package/corpus/core/src/comments-review/index.ts +1 -0
- package/corpus/core/src/file-upload/builder.ts +24 -3
- package/corpus/core/src/file-upload/types.ts +3 -1
- package/corpus/core/src/history/actions/create-resource-version.ts +92 -0
- package/corpus/core/src/history/actions/get-resource-version.ts +60 -0
- package/corpus/core/src/history/actions/list-resource-history.ts +53 -0
- package/corpus/core/src/history/actions/list-resource-versions.ts +43 -0
- package/corpus/core/src/history/actions/restore-resource-version.ts +96 -0
- package/corpus/core/src/history/index.ts +26 -0
- package/corpus/core/src/history/registry.ts +111 -0
- package/corpus/core/src/history/store.ts +379 -0
- package/corpus/core/src/history/types.ts +69 -0
- package/corpus/core/src/index.ts +10 -0
- package/corpus/core/src/navigation/index.ts +170 -0
- package/corpus/core/src/org/index.ts +8 -0
- package/corpus/core/src/org/permissions.ts +30 -0
- package/corpus/core/src/org-team/index.ts +1 -0
- package/corpus/core/src/private-blob/registry.ts +1 -0
- package/corpus/core/src/review/actions/consume-review-feedback.ts +48 -0
- package/corpus/core/src/review/actions/create-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/delete-review-comment.ts +67 -0
- package/corpus/core/src/review/actions/get-review-feedback.ts +54 -0
- package/corpus/core/src/review/actions/list-review-comments.ts +53 -0
- package/corpus/core/src/review/actions/reply-review-comment.ts +107 -0
- package/corpus/core/src/review/actions/resolve-review-thread.ts +67 -0
- package/corpus/core/src/review/actions/set-review-status.ts +58 -0
- package/corpus/core/src/review/index.ts +31 -0
- package/corpus/core/src/review/mentions.ts +44 -0
- package/corpus/core/src/review/registry.ts +111 -0
- package/corpus/core/src/review/store.ts +690 -0
- package/corpus/core/src/review/types.ts +97 -0
- package/corpus/core/src/server/action-discovery.ts +54 -0
- package/corpus/core/src/server/agent-chat-plugin.ts +6 -0
- package/corpus/core/src/server/agent-engine-api-key-route.ts +5 -0
- package/corpus/core/src/server/credential-provider.ts +118 -0
- package/corpus/core/src/setup-connections/index.ts +89 -0
- package/corpus/core/src/setup-connections/onboarding.ts +47 -0
- package/corpus/core/src/transcription/builder-transcription.ts +9 -2
- package/corpus/core/src/vite/action-types-plugin.ts +52 -0
- package/corpus/templates/analytics/app/components/layout/Layout.tsx +2 -1
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +2 -2
- package/corpus/templates/analytics/app/global.css +22 -10
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +6 -1
- package/corpus/templates/analytics/app/i18n-data.ts +81 -13
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +2 -2
- package/corpus/templates/analytics/app/pages/analyses/AnalysisDetail.tsx +2 -2
- package/corpus/templates/analytics/app/pages/sessions/SessionDetailPage.tsx +528 -108
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +466 -183
- package/corpus/templates/analytics/changelog/2026-07-07-session-replays-load-sooner-show-clearer-activity-timelines-.md +6 -0
- package/corpus/templates/assets/actions/_preset-skeleton-validation.ts +11 -11
- package/corpus/templates/assets/actions/generate-image.ts +64 -28
- package/corpus/templates/assets/app/components/generation/GenerationResults.tsx +1 -1
- package/corpus/templates/assets/app/routes/brand-kits.$id_.presets.$presetId.tsx +91 -74
- package/corpus/templates/assets/server/lib/generation.ts +29 -4
- package/corpus/templates/assets/server/lib/image-processing.ts +131 -0
- package/corpus/templates/brain/app/routes/settings.tsx +2 -2
- package/corpus/templates/calendar/.agents/skills/event-management/SKILL.md +24 -2
- package/corpus/templates/calendar/AGENTS.md +3 -0
- package/corpus/templates/calendar/actions/create-event.ts +8 -34
- package/corpus/templates/calendar/actions/event-action-helpers.ts +52 -0
- package/corpus/templates/calendar/actions/manage-event-draft.ts +7 -34
- package/corpus/templates/calendar/actions/update-event.ts +10 -23
- package/corpus/templates/calendar/app/components/calendar/AttendeeAutocomplete.tsx +79 -6
- package/corpus/templates/calendar/app/components/calendar/CreateEventDialog.tsx +23 -0
- package/corpus/templates/calendar/app/components/calendar/EventAttendeesSection.tsx +59 -2
- package/corpus/templates/calendar/app/components/calendar/EventDetailPanel.tsx +40 -1
- package/corpus/templates/calendar/app/components/calendar/EventDetailPopover.tsx +154 -41
- package/corpus/templates/calendar/app/hooks/use-events.ts +6 -0
- package/corpus/templates/calendar/app/hooks/use-people.ts +55 -0
- package/corpus/templates/calendar/app/i18n/zh-TW.ts +4 -0
- package/corpus/templates/calendar/app/i18n-data.ts +40 -0
- package/corpus/templates/calendar/changelog/2026-07-07-guest-suggestions-now-find-coworkers-from-your-google-worksp.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-07-you-can-mark-event-guests-as-optional-while-inviting-them-or.md +6 -0
- package/corpus/templates/calendar/changelog/2026-07-07-zoom-stays-selected-after-connecting-it-from-a-draft-event.md +6 -0
- package/corpus/templates/calendar/server/handlers/events.ts +1 -0
- package/corpus/templates/calendar/server/lib/google-calendar.ts +4 -0
- package/corpus/templates/calendar/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/calendar/shared/api.ts +2 -0
- package/corpus/templates/clips/.agents/skills/ai-video-tools/SKILL.md +29 -3
- package/corpus/templates/clips/actions/create-recording.ts +5 -1
- package/corpus/templates/clips/actions/finalize-recording.ts +140 -1
- package/corpus/templates/clips/actions/generate-workflow.ts +19 -8
- package/corpus/templates/clips/actions/get-clips-ai-prefs.ts +36 -0
- package/corpus/templates/clips/actions/import-loom-recording.ts +1 -0
- package/corpus/templates/clips/actions/lib/clips-ai-prefs.ts +28 -0
- package/corpus/templates/clips/actions/lib/ensure-seekable-video.ts +1 -0
- package/corpus/templates/clips/actions/regenerate-chapters.ts +21 -7
- package/corpus/templates/clips/actions/regenerate-summary.ts +26 -8
- package/corpus/templates/clips/actions/regenerate-title.ts +44 -7
- package/corpus/templates/clips/actions/request-transcript.ts +31 -0
- package/corpus/templates/clips/actions/set-thumbnail.ts +2 -0
- package/corpus/templates/clips/actions/update-clips-ai-prefs.ts +50 -0
- package/corpus/templates/clips/app/components/library/organization-switcher.tsx +2 -2
- package/corpus/templates/clips/app/components/meetings/meeting-card.tsx +7 -2
- package/corpus/templates/clips/app/components/player/scrubber-position.ts +9 -0
- package/corpus/templates/clips/app/components/player/scrubber.tsx +5 -2
- package/corpus/templates/clips/app/components/player/share-dialog.tsx +69 -41
- package/corpus/templates/clips/app/components/player/video-player.tsx +38 -1
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +3 -3
- package/corpus/templates/clips/app/components/sharing/slack-share-hint.tsx +9 -19
- package/corpus/templates/clips/app/hooks/use-auto-title.ts +25 -10
- package/corpus/templates/clips/app/i18n/ar-SA.ts +28 -6
- package/corpus/templates/clips/app/i18n/de-DE.ts +28 -6
- package/corpus/templates/clips/app/i18n/en-US.ts +29 -6
- package/corpus/templates/clips/app/i18n/es-ES.ts +29 -6
- package/corpus/templates/clips/app/i18n/fr-FR.ts +30 -6
- package/corpus/templates/clips/app/i18n/hi-IN.ts +26 -6
- package/corpus/templates/clips/app/i18n/ja-JP.ts +27 -6
- package/corpus/templates/clips/app/i18n/ko-KR.ts +28 -6
- package/corpus/templates/clips/app/i18n/pt-BR.ts +28 -6
- package/corpus/templates/clips/app/i18n/zh-CN.ts +26 -6
- package/corpus/templates/clips/app/i18n/zh-TW.ts +25 -6
- package/corpus/templates/clips/app/routes/_app.meetings._index.tsx +73 -0
- package/corpus/templates/clips/app/routes/_app.settings._index.tsx +1 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +79 -5
- package/corpus/templates/clips/app/routes/record.tsx +21 -12
- package/corpus/templates/clips/changelog/2026-07-02-recordings-now-wait-for-storage-media-to-serve-before-finishing.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-a-pending-app-update-no-longer-blocks-screen-recording-updat.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-ai-tools-can-include-the-full-video-not-just-the-transcript-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-chrome-extension-recordings-keep-audio-after-refreshing-tab.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-clip-playback-progress-now-starts-and-finishes-at-the-right-times.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-clips-desktop-now-surfaces-meetings-and-dictate-directly-in-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-meeting-notes-now-explain-exactly-how-to-start-granola-style.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-meeting-start-alerts-now-include-separate-start-notes-and-jo.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-recordings-start-more-predictably-and-newly-saved-clips-refr.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-07-sharing-public-clips-now-stays-focused-on-the-normal-link-wi.md +6 -0
- package/corpus/templates/clips/chrome-extension/public/manifest.json +1 -1
- package/corpus/templates/clips/chrome-extension/src/background.ts +18 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +23 -8
- package/corpus/templates/clips/desktop/src/app.tsx +475 -108
- package/corpus/templates/clips/desktop/src/hooks/useMediaDevices.ts +19 -7
- package/corpus/templates/clips/desktop/src/lib/permissions.ts +2 -0
- package/corpus/templates/clips/desktop/src/lib/recorder.ts +27 -21
- package/corpus/templates/clips/desktop/src/lib/updater.ts +25 -2
- package/corpus/templates/clips/desktop/src/overlays/meeting-notification.tsx +23 -22
- package/corpus/templates/clips/desktop/src/styles.css +167 -2
- package/corpus/templates/clips/desktop/src-tauri/src/native_screen.rs +8 -1
- package/corpus/templates/clips/desktop/src-tauri/src/notifications.rs +3 -7
- package/corpus/templates/clips/desktop/src-tauri/src/tray_meetings.rs +5 -4
- package/corpus/templates/clips/server/routes/_agent-native/clips/user-prefs.put.ts +16 -8
- package/corpus/templates/clips/server/routes/api/recordings/[recordingId]/thumbnail.post.ts +1 -0
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/abort.post.ts +22 -5
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +8 -0
- package/corpus/templates/clips/server/routes/api/video/[recordingId].get.ts +13 -6
- package/corpus/templates/clips/shared/clips-ai-prefs.ts +81 -0
- package/corpus/templates/clips/shared/finalize-recovery.ts +12 -0
- package/corpus/templates/content/actions/delete-document.ts +337 -52
- package/corpus/templates/content/changelog/2026-07-07-permanently-deleting-trashed-databases-now-finishes-reliably.md +6 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +16 -1
- package/corpus/templates/design/actions/add-localhost-screens.ts +1 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +345 -11
- package/corpus/templates/design/app/components/design/bridge/editor-chrome.bridge.ts +89 -14
- package/corpus/templates/design/app/components/design/bridge-security.ts +7 -1
- package/corpus/templates/design/app/components/design/multi-screen/types.ts +1 -1
- package/corpus/templates/design/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/design/app/i18n-data.ts +41 -0
- package/corpus/templates/design/changelog/2026-07-07-local-visual-edit-uses-live-app-iframes-for-click-to-edit-pr.md +6 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +2 -2
- package/dist/agent/engine/ai-sdk-engine.d.ts.map +1 -1
- package/dist/agent/engine/ai-sdk-engine.js +15 -1
- package/dist/agent/engine/ai-sdk-engine.js.map +1 -1
- package/dist/agent/engine/anthropic-engine.d.ts.map +1 -1
- package/dist/agent/engine/anthropic-engine.js +20 -1
- package/dist/agent/engine/anthropic-engine.js.map +1 -1
- package/dist/agent/engine/index.d.ts +1 -1
- package/dist/agent/engine/index.d.ts.map +1 -1
- package/dist/agent/engine/index.js +1 -1
- package/dist/agent/engine/index.js.map +1 -1
- package/dist/agent/engine/registry.d.ts +14 -0
- package/dist/agent/engine/registry.d.ts.map +1 -1
- package/dist/agent/engine/registry.js +78 -16
- package/dist/agent/engine/registry.js.map +1 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +27 -7
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +31 -0
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +186 -0
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/index.js +76 -9
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/workspacify.d.ts.map +1 -1
- package/dist/cli/workspacify.js +30 -0
- package/dist/cli/workspacify.js.map +1 -1
- package/dist/client/command-navigation/index.d.ts +4 -0
- package/dist/client/command-navigation/index.d.ts.map +1 -0
- package/dist/client/command-navigation/index.js +4 -0
- package/dist/client/command-navigation/index.js.map +1 -0
- package/dist/client/comments-review/index.d.ts +2 -0
- package/dist/client/comments-review/index.d.ts.map +1 -0
- package/dist/client/comments-review/index.js +2 -0
- package/dist/client/comments-review/index.js.map +1 -0
- package/dist/client/history/VersionHistoryPanel.d.ts +18 -0
- package/dist/client/history/VersionHistoryPanel.d.ts.map +1 -0
- package/dist/client/history/VersionHistoryPanel.js +31 -0
- package/dist/client/history/VersionHistoryPanel.js.map +1 -0
- package/dist/client/history/index.d.ts +3 -0
- package/dist/client/history/index.d.ts.map +1 -0
- package/dist/client/history/index.js +3 -0
- package/dist/client/history/index.js.map +1 -0
- package/dist/client/history/use-history.d.ts +58 -0
- package/dist/client/history/use-history.d.ts.map +1 -0
- package/dist/client/history/use-history.js +24 -0
- package/dist/client/history/use-history.js.map +1 -0
- package/dist/client/index.d.ts +6 -4
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +6 -4
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.js +5 -5
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +2 -2
- package/dist/client/org/RequireActiveOrg.js.map +1 -1
- package/dist/client/org/TeamPage.js +3 -3
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/org/hooks.d.ts +12 -1
- package/dist/client/org/hooks.d.ts.map +1 -1
- package/dist/client/org/hooks.js +15 -0
- package/dist/client/org/hooks.js.map +1 -1
- package/dist/client/org/index.d.ts +4 -2
- package/dist/client/org/index.d.ts.map +1 -1
- package/dist/client/org/index.js +3 -1
- package/dist/client/org/index.js.map +1 -1
- package/dist/client/org-team/index.d.ts +2 -0
- package/dist/client/org-team/index.d.ts.map +1 -0
- package/dist/client/org-team/index.js +2 -0
- package/dist/client/org-team/index.js.map +1 -0
- package/dist/client/review/ReviewStatusBadge.d.ts +7 -0
- package/dist/client/review/ReviewStatusBadge.d.ts.map +1 -0
- package/dist/client/review/ReviewStatusBadge.js +19 -0
- package/dist/client/review/ReviewStatusBadge.js.map +1 -0
- package/dist/client/review/ReviewThreadPanel.d.ts +20 -0
- package/dist/client/review/ReviewThreadPanel.d.ts.map +1 -0
- package/dist/client/review/ReviewThreadPanel.js +84 -0
- package/dist/client/review/ReviewThreadPanel.js.map +1 -0
- package/dist/client/review/index.d.ts +4 -0
- package/dist/client/review/index.d.ts.map +1 -0
- package/dist/client/review/index.js +4 -0
- package/dist/client/review/index.js.map +1 -0
- package/dist/client/review/use-review.d.ts +91 -0
- package/dist/client/review/use-review.d.ts.map +1 -0
- package/dist/client/review/use-review.js +30 -0
- package/dist/client/review/use-review.js.map +1 -0
- package/dist/client/settings/index.d.ts +1 -1
- package/dist/client/settings/index.d.ts.map +1 -1
- package/dist/client/settings/index.js +1 -1
- package/dist/client/settings/index.js.map +1 -1
- package/dist/client/setup-connections/BuilderConnectCard.d.ts +9 -0
- package/dist/client/setup-connections/BuilderConnectCard.d.ts.map +1 -0
- package/dist/client/setup-connections/BuilderConnectCard.js +25 -0
- package/dist/client/setup-connections/BuilderConnectCard.js.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts +8 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.d.ts.map +1 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js +32 -0
- package/dist/client/setup-connections/ProviderReadinessBadge.js.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts +17 -0
- package/dist/client/setup-connections/SetupConnectionsPage.d.ts.map +1 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js +10 -0
- package/dist/client/setup-connections/SetupConnectionsPage.js.map +1 -0
- package/dist/client/setup-connections/index.d.ts +7 -0
- package/dist/client/setup-connections/index.d.ts.map +1 -0
- package/dist/client/setup-connections/index.js +7 -0
- package/dist/client/setup-connections/index.js.map +1 -0
- package/dist/client/sharing/ShareButton.d.ts +4 -4
- package/dist/client/sharing/ShareButton.d.ts.map +1 -1
- package/dist/client/sharing/ShareButton.js +13 -7
- package/dist/client/sharing/ShareButton.js.map +1 -1
- package/dist/client/sharing/ShareDialog.js +3 -3
- package/dist/client/sharing/ShareDialog.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/command-navigation/actions.d.ts +25 -0
- package/dist/command-navigation/actions.d.ts.map +1 -0
- package/dist/command-navigation/actions.js +64 -0
- package/dist/command-navigation/actions.js.map +1 -0
- package/dist/command-navigation/index.d.ts +4 -0
- package/dist/command-navigation/index.d.ts.map +1 -0
- package/dist/command-navigation/index.js +4 -0
- package/dist/command-navigation/index.js.map +1 -0
- package/dist/comments-review/index.d.ts +2 -0
- package/dist/comments-review/index.d.ts.map +1 -0
- package/dist/comments-review/index.js +2 -0
- package/dist/comments-review/index.js.map +1 -0
- package/dist/file-upload/builder.d.ts.map +1 -1
- package/dist/file-upload/builder.js +18 -2
- package/dist/file-upload/builder.js.map +1 -1
- package/dist/file-upload/types.d.ts +3 -0
- package/dist/file-upload/types.d.ts.map +1 -1
- package/dist/file-upload/types.js.map +1 -1
- package/dist/history/actions/create-resource-version.d.ts +10 -0
- package/dist/history/actions/create-resource-version.d.ts.map +1 -0
- package/dist/history/actions/create-resource-version.js +68 -0
- package/dist/history/actions/create-resource-version.js.map +1 -0
- package/dist/history/actions/get-resource-version.d.ts +10 -0
- package/dist/history/actions/get-resource-version.d.ts.map +1 -0
- package/dist/history/actions/get-resource-version.js +38 -0
- package/dist/history/actions/get-resource-version.js.map +1 -0
- package/dist/history/actions/list-resource-history.d.ts +10 -0
- package/dist/history/actions/list-resource-history.d.ts.map +1 -0
- package/dist/history/actions/list-resource-history.js +45 -0
- package/dist/history/actions/list-resource-history.js.map +1 -0
- package/dist/history/actions/list-resource-versions.d.ts +10 -0
- package/dist/history/actions/list-resource-versions.d.ts.map +1 -0
- package/dist/history/actions/list-resource-versions.js +35 -0
- package/dist/history/actions/list-resource-versions.js.map +1 -0
- package/dist/history/actions/restore-resource-version.d.ts +11 -0
- package/dist/history/actions/restore-resource-version.d.ts.map +1 -0
- package/dist/history/actions/restore-resource-version.js +59 -0
- package/dist/history/actions/restore-resource-version.js.map +1 -0
- package/dist/history/index.d.ts +4 -0
- package/dist/history/index.d.ts.map +1 -0
- package/dist/history/index.js +3 -0
- package/dist/history/index.js.map +1 -0
- package/dist/history/registry.d.ts +10 -0
- package/dist/history/registry.d.ts.map +1 -0
- package/dist/history/registry.js +63 -0
- package/dist/history/registry.js.map +1 -0
- package/dist/history/store.d.ts +34 -0
- package/dist/history/store.d.ts.map +1 -0
- package/dist/history/store.js +290 -0
- package/dist/history/store.js.map +1 -0
- package/dist/history/types.d.ts +55 -0
- package/dist/history/types.d.ts.map +1 -0
- package/dist/history/types.js +2 -0
- package/dist/history/types.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/navigation/index.d.ts +53 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +105 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/observability/routes.d.ts +3 -3
- package/dist/org/index.d.ts +1 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +1 -0
- package/dist/org/index.js.map +1 -1
- package/dist/org/permissions.d.ts +7 -0
- package/dist/org/permissions.d.ts.map +1 -0
- package/dist/org/permissions.js +21 -0
- package/dist/org/permissions.js.map +1 -0
- package/dist/org-team/index.d.ts +2 -0
- package/dist/org-team/index.d.ts.map +1 -0
- package/dist/org-team/index.js +2 -0
- package/dist/org-team/index.js.map +1 -0
- package/dist/private-blob/registry.d.ts.map +1 -1
- package/dist/private-blob/registry.js +1 -0
- package/dist/private-blob/registry.js.map +1 -1
- package/dist/progress/routes.d.ts +1 -1
- package/dist/resources/handlers.d.ts +2 -2
- package/dist/review/actions/consume-review-feedback.d.ts +10 -0
- package/dist/review/actions/consume-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/consume-review-feedback.js +35 -0
- package/dist/review/actions/consume-review-feedback.js.map +1 -0
- package/dist/review/actions/create-review-comment.d.ts +18 -0
- package/dist/review/actions/create-review-comment.d.ts.map +1 -0
- package/dist/review/actions/create-review-comment.js +81 -0
- package/dist/review/actions/create-review-comment.js.map +1 -0
- package/dist/review/actions/delete-review-comment.d.ts +11 -0
- package/dist/review/actions/delete-review-comment.d.ts.map +1 -0
- package/dist/review/actions/delete-review-comment.js +53 -0
- package/dist/review/actions/delete-review-comment.js.map +1 -0
- package/dist/review/actions/get-review-feedback.d.ts +10 -0
- package/dist/review/actions/get-review-feedback.d.ts.map +1 -0
- package/dist/review/actions/get-review-feedback.js +45 -0
- package/dist/review/actions/get-review-feedback.js.map +1 -0
- package/dist/review/actions/list-review-comments.d.ts +13 -0
- package/dist/review/actions/list-review-comments.d.ts.map +1 -0
- package/dist/review/actions/list-review-comments.js +44 -0
- package/dist/review/actions/list-review-comments.js.map +1 -0
- package/dist/review/actions/reply-review-comment.d.ts +16 -0
- package/dist/review/actions/reply-review-comment.d.ts.map +1 -0
- package/dist/review/actions/reply-review-comment.js +84 -0
- package/dist/review/actions/reply-review-comment.js.map +1 -0
- package/dist/review/actions/resolve-review-thread.d.ts +12 -0
- package/dist/review/actions/resolve-review-thread.d.ts.map +1 -0
- package/dist/review/actions/resolve-review-thread.js +49 -0
- package/dist/review/actions/resolve-review-thread.js.map +1 -0
- package/dist/review/actions/set-review-status.d.ts +9 -0
- package/dist/review/actions/set-review-status.d.ts.map +1 -0
- package/dist/review/actions/set-review-status.js +43 -0
- package/dist/review/actions/set-review-status.js.map +1 -0
- package/dist/review/index.d.ts +5 -0
- package/dist/review/index.d.ts.map +1 -0
- package/dist/review/index.js +4 -0
- package/dist/review/index.js.map +1 -0
- package/dist/review/mentions.d.ts +4 -0
- package/dist/review/mentions.d.ts.map +1 -0
- package/dist/review/mentions.js +39 -0
- package/dist/review/mentions.js.map +1 -0
- package/dist/review/registry.d.ts +10 -0
- package/dist/review/registry.d.ts.map +1 -0
- package/dist/review/registry.js +63 -0
- package/dist/review/registry.js.map +1 -0
- package/dist/review/store.d.ts +63 -0
- package/dist/review/store.d.ts.map +1 -0
- package/dist/review/store.js +561 -0
- package/dist/review/store.js.map +1 -0
- package/dist/review/types.d.ts +77 -0
- package/dist/review/types.d.ts.map +1 -0
- package/dist/review/types.js +2 -0
- package/dist/review/types.js.map +1 -0
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/action-discovery.d.ts.map +1 -1
- package/dist/server/action-discovery.js +54 -0
- package/dist/server/action-discovery.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +5 -0
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/agent-engine-api-key-route.d.ts.map +1 -1
- package/dist/server/agent-engine-api-key-route.js +5 -0
- package/dist/server/agent-engine-api-key-route.js.map +1 -1
- package/dist/server/credential-provider.d.ts +28 -0
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +92 -0
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/setup-connections/index.d.ts +6 -0
- package/dist/setup-connections/index.d.ts.map +1 -0
- package/dist/setup-connections/index.js +6 -0
- package/dist/setup-connections/index.js.map +1 -0
- package/dist/setup-connections/onboarding.d.ts +14 -0
- package/dist/setup-connections/onboarding.d.ts.map +1 -0
- package/dist/setup-connections/onboarding.js +23 -0
- package/dist/setup-connections/onboarding.js.map +1 -0
- package/dist/transcription/builder-transcription.d.ts +1 -0
- package/dist/transcription/builder-transcription.d.ts.map +1 -1
- package/dist/transcription/builder-transcription.js +5 -2
- package/dist/transcription/builder-transcription.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +52 -0
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +87 -80
- package/docs/content/locales/ar-SA/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/de-DE/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/es-ES/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/fr-FR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/hi-IN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ja-JP/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/ko-KR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/pt-BR/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-CN/agent-native-toolkit.mdx +89 -80
- package/docs/content/locales/zh-TW/agent-native-toolkit.mdx +89 -80
- package/docs/content/toolkit-agent-ux.mdx +43 -0
- package/docs/content/toolkit-app-adapters.mdx +9 -0
- package/docs/content/toolkit-collaboration-ui.mdx +12 -0
- package/docs/content/toolkit-collaboration.mdx +74 -0
- package/docs/content/toolkit-command-navigation.mdx +106 -0
- package/docs/content/toolkit-comments-review.mdx +98 -0
- package/docs/content/toolkit-history.mdx +95 -0
- package/docs/content/toolkit-observability.mdx +41 -0
- package/docs/content/toolkit-org-team.mdx +80 -0
- package/docs/content/toolkit-resources.mdx +57 -0
- package/docs/content/toolkit-settings.mdx +65 -0
- package/docs/content/toolkit-setup-connections.mdx +109 -0
- package/docs/content/toolkit-sharing-ui.mdx +18 -6
- package/docs/content/toolkit-sharing.mdx +81 -0
- package/docs/content/toolkit-shell-hooks.mdx +9 -0
- package/docs/content/toolkit-ui.mdx +9 -0
- package/package.json +36 -2
|
@@ -596,7 +596,15 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
596
596
|
updatedAt: new Date().toISOString(),
|
|
597
597
|
})
|
|
598
598
|
.where(eq(schema.recordings.id, recordingId));
|
|
599
|
+
const failedUploadStateRaw = await readAppState(
|
|
600
|
+
`recording-upload-${recordingId}`,
|
|
601
|
+
).catch(() => null);
|
|
602
|
+
const failedUploadState =
|
|
603
|
+
failedUploadStateRaw && typeof failedUploadStateRaw === "object"
|
|
604
|
+
? (failedUploadStateRaw as Record<string, unknown>)
|
|
605
|
+
: {};
|
|
599
606
|
await writeAppState(`recording-upload-${recordingId}`, {
|
|
607
|
+
...failedUploadState,
|
|
600
608
|
recordingId,
|
|
601
609
|
status: "failed",
|
|
602
610
|
failureReason: err instanceof Error ? err.message : "Finalize failed",
|
|
@@ -177,13 +177,13 @@ function rememberCompressedBuilderMediaMiss(compressedSourceUrl: string): void {
|
|
|
177
177
|
function shouldFallbackToOriginalMedia(
|
|
178
178
|
upstream: Response | { error: string; status: number },
|
|
179
179
|
): boolean {
|
|
180
|
-
return [403, 404, 416].includes(upstream.status);
|
|
180
|
+
return upstream.status >= 500 || [403, 404, 416].includes(upstream.status);
|
|
181
181
|
}
|
|
182
182
|
|
|
183
183
|
function shouldRememberCompressedBuilderMediaMiss(
|
|
184
184
|
upstream: Response | { error: string; status: number },
|
|
185
185
|
): boolean {
|
|
186
|
-
return [403, 404].includes(upstream.status);
|
|
186
|
+
return upstream.status >= 500 || [403, 404].includes(upstream.status);
|
|
187
187
|
}
|
|
188
188
|
|
|
189
189
|
async function fetchProviderMedia(
|
|
@@ -497,10 +497,17 @@ export default defineEventHandler(async (event: H3Event) => {
|
|
|
497
497
|
compressedSourceUrl &&
|
|
498
498
|
!shouldSkipCompressedBuilderMediaProbe(compressedSourceUrl)
|
|
499
499
|
) {
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
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
|
+
}
|
|
504
511
|
if (shouldRememberCompressedBuilderMediaMiss(upstream)) {
|
|
505
512
|
rememberCompressedBuilderMediaMiss(compressedSourceUrl);
|
|
506
513
|
}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Clips user preferences that affect AI video tools.
|
|
3
|
+
*
|
|
4
|
+
* Stored under the shared `clips-user-prefs` user-setting key so Settings and
|
|
5
|
+
* the AI tools popover both read/write the same object.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export const CLIPS_USER_PREFS_KEY = "clips-user-prefs";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Preferred chat model when Include full video is on. Full-recording video
|
|
12
|
+
* input only works with Gemini (Builder Gemini or Google/Gemini BYOK) —
|
|
13
|
+
* Claude and OpenAI cannot ingest the MP4/WebM.
|
|
14
|
+
*/
|
|
15
|
+
export const CLIPS_FULL_VIDEO_AI_ENGINE = "builder";
|
|
16
|
+
export const CLIPS_FULL_VIDEO_AI_MODEL = "gemini-3-5-flash";
|
|
17
|
+
|
|
18
|
+
export type ClipsAiPrefs = {
|
|
19
|
+
/**
|
|
20
|
+
* When true, Clips AI tools (default title/description, regenerate title/
|
|
21
|
+
* description/chapters, workflows) must watch the full recording — not just
|
|
22
|
+
* the transcript — before writing results. Off by default for cost/latency.
|
|
23
|
+
* Sending the full video requires a Gemini model.
|
|
24
|
+
*/
|
|
25
|
+
includeFullVideoInAi?: boolean;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export type ClipsUserPrefs = ClipsAiPrefs & {
|
|
29
|
+
defaultPlaybackSpeed?: string;
|
|
30
|
+
emailNotifications?: boolean;
|
|
31
|
+
displayName?: string;
|
|
32
|
+
transcriptCleanupEnabled?: boolean;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
export function isIncludeFullVideoInAiEnabled(
|
|
36
|
+
prefs: ClipsAiPrefs | Record<string, unknown> | null | undefined,
|
|
37
|
+
): boolean {
|
|
38
|
+
return prefs?.includeFullVideoInAi === true;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Extra agent instructions when the user wants AI tools to watch the clip,
|
|
43
|
+
* not just read the audio transcript. Full-video understanding requires Gemini.
|
|
44
|
+
*/
|
|
45
|
+
export function buildFullVideoAiInstructions(recordingId: string): string {
|
|
46
|
+
return (
|
|
47
|
+
`The user enabled "Include full video" for Clips AI. Do NOT rely on the ` +
|
|
48
|
+
`transcript alone — audio is often incomplete for accurate titles, ` +
|
|
49
|
+
`descriptions, chapters, and workflow docs. ` +
|
|
50
|
+
`IMPORTANT: sending / understanding the full recording only works with ` +
|
|
51
|
+
`Gemini (Builder Gemini or a Google Gemini key). Use a Gemini model for ` +
|
|
52
|
+
`this turn — Claude and OpenAI cannot ingest the full video file. ` +
|
|
53
|
+
`Prefer attaching or uploading the recording video itself to Gemini when ` +
|
|
54
|
+
`available. Otherwise use \`get-recording-player-data --recordingId=${recordingId}\` ` +
|
|
55
|
+
`(preferred in-app) or \`create-recording-agent-link --recordingId=${recordingId}\` ` +
|
|
56
|
+
`and fetch that context URL, then sample the timeline via recommendedFrames / ` +
|
|
57
|
+
`the frame API. Combine on-screen UI text, product names, and visual context ` +
|
|
58
|
+
`with any transcript. If the transcript is thin or missing, lean harder on ` +
|
|
59
|
+
`the video.`
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function withFullVideoAiInstructions(
|
|
64
|
+
message: string,
|
|
65
|
+
recordingId: string,
|
|
66
|
+
includeFullVideo: boolean,
|
|
67
|
+
): string {
|
|
68
|
+
if (!includeFullVideo) return message;
|
|
69
|
+
return `${message} ${buildFullVideoAiInstructions(recordingId)}`;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** Model selection for sendToAgentChat when Include full video is enabled. */
|
|
73
|
+
export function fullVideoAiModelSelection(): {
|
|
74
|
+
engine: string;
|
|
75
|
+
model: string;
|
|
76
|
+
} {
|
|
77
|
+
return {
|
|
78
|
+
engine: CLIPS_FULL_VIDEO_AI_ENGINE,
|
|
79
|
+
model: CLIPS_FULL_VIDEO_AI_MODEL,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
@@ -48,6 +48,18 @@ function sleep(ms: number, signal?: AbortSignal): Promise<void> {
|
|
|
48
48
|
});
|
|
49
49
|
}
|
|
50
50
|
|
|
51
|
+
export function isStoredButUnservableFinalizeError(value: unknown): boolean {
|
|
52
|
+
const message =
|
|
53
|
+
typeof value === "string"
|
|
54
|
+
? value
|
|
55
|
+
: value instanceof Error
|
|
56
|
+
? value.message
|
|
57
|
+
: value && typeof value === "object" && "message" in value
|
|
58
|
+
? String((value as { message?: unknown }).message ?? "")
|
|
59
|
+
: "";
|
|
60
|
+
return /\bstored-but-unservable\b/i.test(message);
|
|
61
|
+
}
|
|
62
|
+
|
|
51
63
|
function absoluteUploadUrl(uploadUrl: string): URL {
|
|
52
64
|
if (/^[a-z][a-z0-9+.-]*:/i.test(uploadUrl)) return new URL(uploadUrl);
|
|
53
65
|
const origin =
|
|
@@ -1,78 +1,363 @@
|
|
|
1
1
|
import { defineAction } from "@agent-native/core";
|
|
2
2
|
import { writeAppState } from "@agent-native/core/application-state";
|
|
3
3
|
import { assertAccess } from "@agent-native/core/sharing";
|
|
4
|
-
import { and, eq } from "drizzle-orm";
|
|
4
|
+
import { and, eq, inArray } from "drizzle-orm";
|
|
5
5
|
import { z } from "zod";
|
|
6
6
|
|
|
7
7
|
import { getDb, schema } from "../server/db/index.js";
|
|
8
|
-
import { deleteDatabaseDataForDocument } from "./_database-utils.js";
|
|
9
8
|
import {
|
|
10
9
|
deleteLocalFileDocument,
|
|
11
10
|
isLocalDocumentId,
|
|
12
11
|
isContentLocalFileMode,
|
|
13
12
|
} from "./_local-file-documents.js";
|
|
14
13
|
|
|
15
|
-
|
|
14
|
+
const DELETE_BATCH_SIZE = 90;
|
|
15
|
+
|
|
16
|
+
function chunks<T>(items: T[], size = DELETE_BATCH_SIZE): T[][] {
|
|
17
|
+
const out: T[][] = [];
|
|
18
|
+
for (let index = 0; index < items.length; index += size) {
|
|
19
|
+
out.push(items.slice(index, index + size));
|
|
20
|
+
}
|
|
21
|
+
return out;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
async function selectDocumentChildren(
|
|
16
25
|
db: ReturnType<typeof getDb>,
|
|
17
|
-
|
|
26
|
+
parentIds: string[],
|
|
18
27
|
ownerEmail: string,
|
|
19
|
-
)
|
|
20
|
-
const
|
|
21
|
-
|
|
22
|
-
.
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
+
) {
|
|
29
|
+
const rows: Array<{ id: string }> = [];
|
|
30
|
+
for (const batch of chunks(parentIds)) {
|
|
31
|
+
rows.push(
|
|
32
|
+
...(await db
|
|
33
|
+
.select({ id: schema.documents.id })
|
|
34
|
+
.from(schema.documents)
|
|
35
|
+
.where(
|
|
36
|
+
and(
|
|
37
|
+
inArray(schema.documents.parentId, batch),
|
|
38
|
+
eq(schema.documents.ownerEmail, ownerEmail),
|
|
39
|
+
),
|
|
40
|
+
)),
|
|
28
41
|
);
|
|
42
|
+
}
|
|
43
|
+
return rows;
|
|
44
|
+
}
|
|
29
45
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
46
|
+
async function selectOwnedDatabaseIds(
|
|
47
|
+
db: ReturnType<typeof getDb>,
|
|
48
|
+
documentIds: string[],
|
|
49
|
+
ownerEmail: string,
|
|
50
|
+
) {
|
|
51
|
+
const rows: Array<{ id: string }> = [];
|
|
52
|
+
for (const batch of chunks(documentIds)) {
|
|
53
|
+
rows.push(
|
|
54
|
+
...(await db
|
|
55
|
+
.select({ id: schema.contentDatabases.id })
|
|
56
|
+
.from(schema.contentDatabases)
|
|
57
|
+
.where(
|
|
58
|
+
and(
|
|
59
|
+
inArray(schema.contentDatabases.documentId, batch),
|
|
60
|
+
eq(schema.contentDatabases.ownerEmail, ownerEmail),
|
|
61
|
+
),
|
|
62
|
+
)),
|
|
63
|
+
);
|
|
33
64
|
}
|
|
65
|
+
return rows;
|
|
66
|
+
}
|
|
34
67
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
68
|
+
async function selectDatabaseItemDocuments(
|
|
69
|
+
db: ReturnType<typeof getDb>,
|
|
70
|
+
databaseIds: string[],
|
|
71
|
+
ownerEmail: string,
|
|
72
|
+
) {
|
|
73
|
+
const rows: Array<{ documentId: string }> = [];
|
|
74
|
+
for (const batch of chunks(databaseIds)) {
|
|
75
|
+
rows.push(
|
|
76
|
+
...(await db
|
|
77
|
+
.select({ documentId: schema.contentDatabaseItems.documentId })
|
|
78
|
+
.from(schema.contentDatabaseItems)
|
|
79
|
+
.where(
|
|
80
|
+
and(
|
|
81
|
+
inArray(schema.contentDatabaseItems.databaseId, batch),
|
|
82
|
+
eq(schema.contentDatabaseItems.ownerEmail, ownerEmail),
|
|
83
|
+
),
|
|
84
|
+
)),
|
|
44
85
|
);
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
86
|
+
}
|
|
87
|
+
if (rows.length === 0) return rows;
|
|
88
|
+
|
|
89
|
+
const ownedRows: Array<{ id: string }> = [];
|
|
90
|
+
for (const batch of chunks(rows.map((row) => row.documentId))) {
|
|
91
|
+
ownedRows.push(
|
|
92
|
+
...(await db
|
|
93
|
+
.select({ id: schema.documents.id })
|
|
94
|
+
.from(schema.documents)
|
|
95
|
+
.where(
|
|
96
|
+
and(
|
|
97
|
+
inArray(schema.documents.id, batch),
|
|
98
|
+
eq(schema.documents.ownerEmail, ownerEmail),
|
|
99
|
+
),
|
|
100
|
+
)),
|
|
52
101
|
);
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return ownedRows.map((row) => ({ documentId: row.id }));
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function collectDocumentSubtreeForDelete(
|
|
108
|
+
db: ReturnType<typeof getDb>,
|
|
109
|
+
rootId: string,
|
|
110
|
+
ownerEmail: string,
|
|
111
|
+
) {
|
|
112
|
+
const documentIds = new Set([rootId]);
|
|
113
|
+
const ownedDatabaseIds = new Set<string>();
|
|
114
|
+
let frontier = [rootId];
|
|
115
|
+
|
|
116
|
+
while (frontier.length > 0) {
|
|
117
|
+
const next = new Set<string>();
|
|
118
|
+
|
|
119
|
+
for (const child of await selectDocumentChildren(
|
|
120
|
+
db,
|
|
121
|
+
frontier,
|
|
122
|
+
ownerEmail,
|
|
123
|
+
)) {
|
|
124
|
+
if (!documentIds.has(child.id)) {
|
|
125
|
+
documentIds.add(child.id);
|
|
126
|
+
next.add(child.id);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
const ownedDatabases = await selectOwnedDatabaseIds(
|
|
131
|
+
db,
|
|
132
|
+
frontier,
|
|
133
|
+
ownerEmail,
|
|
134
|
+
);
|
|
135
|
+
const newDatabaseIds = ownedDatabases
|
|
136
|
+
.map((database) => database.id)
|
|
137
|
+
.filter((databaseId) => {
|
|
138
|
+
if (ownedDatabaseIds.has(databaseId)) return false;
|
|
139
|
+
ownedDatabaseIds.add(databaseId);
|
|
140
|
+
return true;
|
|
141
|
+
});
|
|
142
|
+
|
|
143
|
+
if (newDatabaseIds.length > 0) {
|
|
144
|
+
const itemDocuments = await selectDatabaseItemDocuments(
|
|
145
|
+
db,
|
|
146
|
+
newDatabaseIds,
|
|
147
|
+
ownerEmail,
|
|
148
|
+
);
|
|
149
|
+
for (const item of itemDocuments) {
|
|
150
|
+
if (!documentIds.has(item.documentId)) {
|
|
151
|
+
documentIds.add(item.documentId);
|
|
152
|
+
next.add(item.documentId);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
frontier = [...next];
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
return {
|
|
161
|
+
documentIds: [...documentIds],
|
|
162
|
+
ownedDatabaseIds: [...ownedDatabaseIds],
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
async function deleteWhereIn<T>(
|
|
167
|
+
items: T[],
|
|
168
|
+
run: (batch: T[]) => Promise<unknown>,
|
|
169
|
+
) {
|
|
170
|
+
for (const batch of chunks(items)) {
|
|
171
|
+
if (batch.length > 0) await run(batch);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
export async function deleteDocumentRecursive(
|
|
176
|
+
db: ReturnType<typeof getDb>,
|
|
177
|
+
id: string,
|
|
178
|
+
ownerEmail: string,
|
|
179
|
+
): Promise<string[]> {
|
|
180
|
+
const { documentIds, ownedDatabaseIds } =
|
|
181
|
+
await collectDocumentSubtreeForDelete(db, id, ownerEmail);
|
|
182
|
+
|
|
183
|
+
const propertyDefinitionIds: string[] = [];
|
|
184
|
+
await deleteWhereIn(ownedDatabaseIds, async (databaseIdBatch) => {
|
|
185
|
+
propertyDefinitionIds.push(
|
|
186
|
+
...(
|
|
187
|
+
await db
|
|
188
|
+
.select({ id: schema.documentPropertyDefinitions.id })
|
|
189
|
+
.from(schema.documentPropertyDefinitions)
|
|
190
|
+
.where(
|
|
191
|
+
inArray(
|
|
192
|
+
schema.documentPropertyDefinitions.databaseId,
|
|
193
|
+
databaseIdBatch,
|
|
194
|
+
),
|
|
195
|
+
)
|
|
196
|
+
).map((definition) => definition.id),
|
|
60
197
|
);
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
const sourceIds: string[] = [];
|
|
201
|
+
await deleteWhereIn(ownedDatabaseIds, async (databaseIdBatch) => {
|
|
202
|
+
sourceIds.push(
|
|
203
|
+
...(
|
|
204
|
+
await db
|
|
205
|
+
.select({ id: schema.contentDatabaseSources.id })
|
|
206
|
+
.from(schema.contentDatabaseSources)
|
|
207
|
+
.where(
|
|
208
|
+
inArray(schema.contentDatabaseSources.databaseId, databaseIdBatch),
|
|
209
|
+
)
|
|
210
|
+
).map((source) => source.id),
|
|
68
211
|
);
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
await
|
|
73
|
-
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Delete database membership/schema, sync links, versions, shares, then documents.
|
|
215
|
+
await deleteWhereIn(sourceIds, async (sourceIdBatch) => {
|
|
216
|
+
await db
|
|
217
|
+
.delete(schema.contentDatabaseBodyHydrationQueue)
|
|
218
|
+
.where(
|
|
219
|
+
inArray(
|
|
220
|
+
schema.contentDatabaseBodyHydrationQueue.sourceId,
|
|
221
|
+
sourceIdBatch,
|
|
222
|
+
),
|
|
223
|
+
);
|
|
224
|
+
await db
|
|
225
|
+
.delete(schema.contentDatabaseSourceExecutions)
|
|
226
|
+
.where(
|
|
227
|
+
inArray(schema.contentDatabaseSourceExecutions.sourceId, sourceIdBatch),
|
|
228
|
+
);
|
|
229
|
+
await db
|
|
230
|
+
.delete(schema.contentDatabaseSourceChangeReviews)
|
|
231
|
+
.where(
|
|
232
|
+
inArray(
|
|
233
|
+
schema.contentDatabaseSourceChangeReviews.sourceId,
|
|
234
|
+
sourceIdBatch,
|
|
235
|
+
),
|
|
236
|
+
);
|
|
237
|
+
await db
|
|
238
|
+
.delete(schema.contentDatabaseSourceChangeSets)
|
|
239
|
+
.where(
|
|
240
|
+
inArray(schema.contentDatabaseSourceChangeSets.sourceId, sourceIdBatch),
|
|
241
|
+
);
|
|
242
|
+
await db
|
|
243
|
+
.delete(schema.contentDatabaseSourceRows)
|
|
244
|
+
.where(inArray(schema.contentDatabaseSourceRows.sourceId, sourceIdBatch));
|
|
245
|
+
await db
|
|
246
|
+
.delete(schema.contentDatabaseSourceFields)
|
|
247
|
+
.where(
|
|
248
|
+
inArray(schema.contentDatabaseSourceFields.sourceId, sourceIdBatch),
|
|
249
|
+
);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
await deleteWhereIn(propertyDefinitionIds, async (propertyIdBatch) => {
|
|
253
|
+
await db
|
|
254
|
+
.delete(schema.documentPropertyValues)
|
|
255
|
+
.where(
|
|
256
|
+
inArray(schema.documentPropertyValues.propertyId, propertyIdBatch),
|
|
257
|
+
);
|
|
258
|
+
await db
|
|
259
|
+
.delete(schema.documentBlockFieldContents)
|
|
260
|
+
.where(
|
|
261
|
+
inArray(schema.documentBlockFieldContents.propertyId, propertyIdBatch),
|
|
262
|
+
);
|
|
263
|
+
});
|
|
264
|
+
|
|
265
|
+
await deleteWhereIn(documentIds, async (documentIdBatch) => {
|
|
266
|
+
await db
|
|
267
|
+
.delete(schema.contentDatabaseBodyHydrationQueue)
|
|
268
|
+
.where(
|
|
269
|
+
inArray(
|
|
270
|
+
schema.contentDatabaseBodyHydrationQueue.documentId,
|
|
271
|
+
documentIdBatch,
|
|
272
|
+
),
|
|
273
|
+
);
|
|
274
|
+
await db
|
|
275
|
+
.delete(schema.documentPropertyValues)
|
|
276
|
+
.where(
|
|
277
|
+
and(
|
|
278
|
+
inArray(schema.documentPropertyValues.documentId, documentIdBatch),
|
|
279
|
+
eq(schema.documentPropertyValues.ownerEmail, ownerEmail),
|
|
280
|
+
),
|
|
281
|
+
);
|
|
282
|
+
await db
|
|
283
|
+
.delete(schema.documentBlockFieldContents)
|
|
284
|
+
.where(
|
|
285
|
+
inArray(schema.documentBlockFieldContents.documentId, documentIdBatch),
|
|
286
|
+
);
|
|
287
|
+
await db
|
|
288
|
+
.delete(schema.contentDatabaseItems)
|
|
289
|
+
.where(inArray(schema.contentDatabaseItems.documentId, documentIdBatch));
|
|
290
|
+
});
|
|
291
|
+
|
|
292
|
+
await deleteWhereIn(ownedDatabaseIds, async (databaseIdBatch) => {
|
|
293
|
+
await db
|
|
294
|
+
.delete(schema.contentDatabaseItems)
|
|
295
|
+
.where(inArray(schema.contentDatabaseItems.databaseId, databaseIdBatch));
|
|
296
|
+
await db
|
|
297
|
+
.delete(schema.contentDatabaseSources)
|
|
298
|
+
.where(
|
|
299
|
+
inArray(schema.contentDatabaseSources.databaseId, databaseIdBatch),
|
|
300
|
+
);
|
|
301
|
+
await db
|
|
302
|
+
.delete(schema.documentPropertyDefinitions)
|
|
303
|
+
.where(
|
|
304
|
+
inArray(schema.documentPropertyDefinitions.databaseId, databaseIdBatch),
|
|
305
|
+
);
|
|
306
|
+
await db
|
|
307
|
+
.delete(schema.contentDatabases)
|
|
308
|
+
.where(inArray(schema.contentDatabases.id, databaseIdBatch));
|
|
309
|
+
});
|
|
310
|
+
|
|
311
|
+
await deleteWhereIn(documentIds, async (documentIdBatch) => {
|
|
312
|
+
await db
|
|
313
|
+
.delete(schema.documentSyncLinks)
|
|
314
|
+
.where(
|
|
315
|
+
and(
|
|
316
|
+
inArray(schema.documentSyncLinks.documentId, documentIdBatch),
|
|
317
|
+
eq(schema.documentSyncLinks.ownerEmail, ownerEmail),
|
|
318
|
+
),
|
|
319
|
+
);
|
|
320
|
+
await db
|
|
321
|
+
.delete(schema.documentVersions)
|
|
322
|
+
.where(
|
|
323
|
+
and(
|
|
324
|
+
inArray(schema.documentVersions.documentId, documentIdBatch),
|
|
325
|
+
eq(schema.documentVersions.ownerEmail, ownerEmail),
|
|
326
|
+
),
|
|
327
|
+
);
|
|
328
|
+
await db
|
|
329
|
+
.delete(schema.builderDocSidecars)
|
|
330
|
+
.where(
|
|
331
|
+
and(
|
|
332
|
+
inArray(schema.builderDocSidecars.documentId, documentIdBatch),
|
|
333
|
+
eq(schema.builderDocSidecars.ownerEmail, ownerEmail),
|
|
334
|
+
),
|
|
335
|
+
);
|
|
336
|
+
await db
|
|
337
|
+
.delete(schema.documentComments)
|
|
338
|
+
.where(
|
|
339
|
+
and(
|
|
340
|
+
inArray(schema.documentComments.documentId, documentIdBatch),
|
|
341
|
+
eq(schema.documentComments.ownerEmail, ownerEmail),
|
|
342
|
+
),
|
|
343
|
+
);
|
|
344
|
+
await db
|
|
345
|
+
.delete(schema.documentShares)
|
|
346
|
+
.where(inArray(schema.documentShares.resourceId, documentIdBatch));
|
|
347
|
+
});
|
|
348
|
+
|
|
349
|
+
await deleteWhereIn(documentIds, async (documentIdBatch) => {
|
|
350
|
+
await db
|
|
351
|
+
.delete(schema.documents)
|
|
352
|
+
.where(
|
|
353
|
+
and(
|
|
354
|
+
inArray(schema.documents.id, documentIdBatch),
|
|
355
|
+
eq(schema.documents.ownerEmail, ownerEmail),
|
|
356
|
+
),
|
|
357
|
+
);
|
|
358
|
+
});
|
|
74
359
|
|
|
75
|
-
return
|
|
360
|
+
return documentIds;
|
|
76
361
|
}
|
|
77
362
|
|
|
78
363
|
export default defineAction({
|
|
@@ -21,6 +21,19 @@ iframe-backed screens on the infinite canvas.
|
|
|
21
21
|
- Each screen is a URL-backed iframe, not copied HTML.
|
|
22
22
|
- Each screen keeps its own URL metadata: `connectionId`, `routeId`, `path`,
|
|
23
23
|
`url`, `bridgeUrl`, title, and viewport size.
|
|
24
|
+
- Localhost Edit mode renders the running app through the local bridge as a live
|
|
25
|
+
iframe with the same editor bridge used by HTML designs. It is not a frozen
|
|
26
|
+
static DOM snapshot.
|
|
27
|
+
- The live editor is same-origin through the local bridge proxy. This boots
|
|
28
|
+
CSR apps and root-relative assets, but it is still a localhost editing proxy:
|
|
29
|
+
app-origin cookies, WebSockets/HMR, SSE, and non-GET app API calls may need a
|
|
30
|
+
future dev-server/plugin integration for perfect parity with the app's own
|
|
31
|
+
origin.
|
|
32
|
+
- Interact mode renders the app's normal URL so app navigation, scrolling,
|
|
33
|
+
links, and form controls behave as they would in the browser.
|
|
34
|
+
- While a localhost screen has pending live visual edits, do not switch back to
|
|
35
|
+
Interact until the user either applies the edits to source or explicitly
|
|
36
|
+
aborts/discards the preview.
|
|
24
37
|
- Start in Design's screen overview mode. The user can edit/select/drop on any
|
|
25
38
|
visible screen from the overview canvas.
|
|
26
39
|
- In overview, screens are static like Figma frames: no iframe scrolling or app
|
|
@@ -168,7 +181,9 @@ explicitly asks to freeze a snapshot.
|
|
|
168
181
|
Once a connection is registered, the design editor's Code panel (left rail →
|
|
169
182
|
Code, or `navigate --view editor --designId <id> --leftPanel code`) shows a
|
|
170
183
|
local-files workspace root for that connection next to the design's own files.
|
|
171
|
-
|
|
184
|
+
Treat that root like VS Code opened at the connected project directory: file
|
|
185
|
+
tree, search, open/edit, and save are backed by the real local files. It lists
|
|
186
|
+
the connected app's text/code files through the bridge
|
|
172
187
|
(`list-local-files` / `read-local-file`); build output, `node_modules`,
|
|
173
188
|
`.git`, and secret-looking paths (`.env*`, key files) are always excluded.
|
|
174
189
|
|
|
@@ -468,6 +468,7 @@ export default defineAction({
|
|
|
468
468
|
sourceFile: screen.sourceFile,
|
|
469
469
|
path: screen.path,
|
|
470
470
|
bridgeUrl: connection.bridgeUrl ?? undefined,
|
|
471
|
+
bridgeToken: connection.bridgeToken ?? undefined,
|
|
471
472
|
};
|
|
472
473
|
previousMetadata[screen.id] = metadata;
|
|
473
474
|
previousLocalhostScreens[screen.id] = metadata;
|