@agent-native/core 0.85.7 → 0.86.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 +124 -1
- package/corpus/core/README.md +0 -11
- package/corpus/core/docs/content/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ar-SA/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ar-SA/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ar-SA/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
- package/corpus/core/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/de-DE/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/de-DE/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/de-DE/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/de-DE/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/es-ES/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/es-ES/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/es-ES/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/es-ES/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/fr-FR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/fr-FR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/fr-FR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/hi-IN/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/hi-IN/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/hi-IN/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ja-JP/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ja-JP/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ja-JP/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/ko-KR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/ko-KR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/ko-KR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/pt-BR/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/pt-BR/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/pt-BR/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/zh-CN/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/zh-CN/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/zh-CN/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
- package/corpus/core/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
- package/corpus/core/docs/content/locales/zh-TW/sharing.mdx +1 -2
- package/corpus/core/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
- package/corpus/core/docs/content/locales/zh-TW/template-plan.mdx +23 -7
- package/corpus/core/docs/content/locales/zh-TW/tracking.mdx +1 -1
- package/corpus/core/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
- package/corpus/core/docs/content/plan-plugin.mdx +12 -11
- package/corpus/core/docs/content/sharing.mdx +1 -2
- package/corpus/core/docs/content/skills-guide.mdx +4 -3
- package/corpus/core/docs/content/template-plan.mdx +37 -6
- package/corpus/core/docs/content/tracking.mdx +1 -1
- package/corpus/core/docs/content/workspace-connections.mdx +1 -1
- package/corpus/core/package.json +6 -6
- package/corpus/core/src/agent/run-store.ts +1 -1
- package/corpus/core/src/chat-threads/store.ts +73 -11
- package/corpus/core/src/checkpoints/store.ts +13 -2
- package/corpus/core/src/cli/create.ts +3 -4
- package/corpus/core/src/cli/design-connect.ts +469 -9
- package/corpus/core/src/cli/index.ts +13 -0
- package/corpus/core/src/cli/plan-local.ts +281 -24
- package/corpus/core/src/cli/skills.ts +177 -21
- package/corpus/core/src/cli/templates-meta.ts +0 -13
- package/corpus/core/src/cli/visualize-repo.ts +715 -0
- package/corpus/core/src/client/AssistantChat.tsx +126 -17
- package/corpus/core/src/client/agent-chat-adapter.ts +6 -5
- package/corpus/core/src/client/app-providers.tsx +2 -2
- package/corpus/core/src/client/collab/index.ts +31 -0
- package/corpus/core/src/client/components/LiveCursorOverlay.tsx +16 -1
- package/corpus/core/src/client/components/PresenceBar.tsx +14 -1
- package/corpus/core/src/client/components/RecentEditHighlights.tsx +219 -0
- package/corpus/core/src/client/components/RemoteSelectionRings.tsx +40 -6
- package/corpus/core/src/client/index.ts +48 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +0 -4
- package/corpus/core/src/client/rich-markdown-editor/SharedRichEditor.tsx +49 -32
- package/corpus/core/src/client/rich-markdown-editor/index.ts +6 -0
- package/corpus/core/src/client/rich-markdown-editor/surgical-apply.ts +192 -0
- package/corpus/core/src/client/rich-markdown-editor/useCollabReconcile.ts +59 -8
- package/corpus/core/src/client/session-replay.ts +181 -15
- package/corpus/core/src/client/sse-event-processor.ts +90 -1
- package/corpus/core/src/client/use-action.ts +123 -25
- package/corpus/core/src/client/use-agent-engine-configured.ts +7 -1
- package/corpus/core/src/client/use-chat-threads.ts +18 -7
- package/corpus/core/src/client/use-db-sync.ts +104 -19
- package/corpus/core/src/client/visual-style-controls.tsx +475 -0
- package/corpus/core/src/collab/agent-presence.ts +191 -62
- package/corpus/core/src/collab/awareness.ts +83 -6
- package/corpus/core/src/collab/client.ts +89 -146
- package/corpus/core/src/collab/index.ts +34 -0
- package/corpus/core/src/collab/recent-edits.ts +171 -0
- package/corpus/core/src/collab/undo.ts +432 -0
- package/corpus/core/src/collab/ydoc-manager.ts +68 -0
- package/corpus/core/src/connections/catalog.ts +2 -3
- package/corpus/core/src/db/create-get-db.ts +86 -1
- package/corpus/core/src/db/ensure-additive-columns.ts +430 -0
- package/corpus/core/src/db/index.ts +6 -0
- package/corpus/core/src/db/migrations.ts +236 -35
- package/corpus/core/src/jobs/scheduler.ts +17 -14
- package/corpus/core/src/observability/traces.ts +182 -1
- package/corpus/core/src/org/context.ts +79 -2
- package/corpus/core/src/server/agent-chat-plugin.ts +10 -6
- package/corpus/core/src/server/auth-marketing.ts +0 -11
- package/corpus/core/src/server/auth.ts +11 -4
- package/corpus/core/src/server/collab-plugin.ts +56 -13
- package/corpus/core/src/server/design-token-utils.ts +1 -1
- package/corpus/core/src/server/fusion-app.ts +447 -0
- package/corpus/core/src/server/index.ts +13 -0
- package/corpus/core/src/server/onboarding-html.ts +3 -4
- package/corpus/core/src/server/poll-events.ts +14 -2
- package/corpus/core/src/server/poll.ts +219 -12
- package/corpus/core/src/server/schema-prompt.ts +28 -9
- package/corpus/core/src/settings/store.ts +33 -2
- package/corpus/core/src/sharing/actions/set-resource-visibility.ts +2 -0
- package/corpus/core/src/sharing/actions/share-resource.ts +3 -0
- package/corpus/core/src/sharing/actions/unshare-resource.ts +2 -0
- package/corpus/core/src/styles/agent-native.css +0 -5
- package/corpus/core/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/core/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/core/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/core/src/templates/default/package.json +3 -3
- package/corpus/core/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/core/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/corpus/core/src/tracking/providers.ts +22 -1
- package/corpus/templates/analytics/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/analytics/.agents/skills/session-replay/SKILL.md +20 -5
- package/corpus/templates/analytics/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/analytics/AGENTS.md +33 -6
- package/corpus/templates/analytics/actions/navigate.ts +14 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/actions/view-screen.ts +57 -0
- package/corpus/templates/analytics/app/components/layout/CommandPalette.tsx +23 -1
- package/corpus/templates/analytics/app/components/layout/Header.tsx +1 -0
- package/corpus/templates/analytics/app/components/layout/Sidebar.tsx +21 -0
- package/corpus/templates/analytics/app/hooks/use-navigation-state.ts +7 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +15 -1
- package/corpus/templates/analytics/app/i18n-data.ts +151 -10
- package/corpus/templates/analytics/app/pages/Agents.tsx +118 -0
- package/corpus/templates/analytics/app/pages/DataSources.tsx +11 -1
- package/corpus/templates/analytics/app/pages/sessions/SessionDevToolsPanel.tsx +76 -40
- package/corpus/templates/analytics/app/pages/sessions/session-replay-devtools.ts +5 -0
- package/corpus/templates/analytics/app/routes/agents.tsx +10 -0
- package/corpus/templates/analytics/changelog/2026-07-03-agent-admin-tools-page.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-03-agent-llm-observability-dashboard.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-03-session-recordings-now-include-response-bodies-for-5xx-error.md +6 -0
- package/corpus/templates/analytics/docs/schemas/first-party-analytics.md +34 -0
- package/corpus/templates/analytics/docs/schemas/tracked-events.md +6 -0
- package/corpus/templates/analytics/package.json +3 -3
- package/corpus/templates/analytics/seeds/dashboards/agent-observability-llm.json +173 -0
- package/corpus/templates/analytics/server/jobs/analytics-alerts.ts +23 -5
- package/corpus/templates/analytics/server/lib/analytics-alerts.ts +58 -13
- package/corpus/templates/analytics/server/lib/dashboard-catalog.ts +23 -0
- package/corpus/templates/analytics/server/lib/dashboard-seeds.ts +5 -0
- package/corpus/templates/analytics/server/lib/session-replay-agent-context.ts +120 -8
- package/corpus/templates/analytics/server/lib/session-replay.ts +3 -2
- package/corpus/templates/analytics/server/plugins/db.ts +93 -2
- package/corpus/templates/analytics/server/routes/api/session-replay/agent-diagnostics.json.get.ts +45 -1
- package/corpus/templates/analytics/shared/session-replay-diagnostics.ts +10 -0
- package/corpus/templates/assets/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/corpus/templates/assets/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/assets/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/assets/package.json +3 -3
- package/corpus/templates/assets/server/plugins/db.ts +63 -2
- package/corpus/templates/brain/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/brain/package.json +3 -3
- package/corpus/templates/brain/server/plugins/db.ts +75 -2
- package/corpus/templates/calendar/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/calendar/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/calendar/package.json +3 -3
- package/corpus/templates/calendar/server/plugins/db.ts +64 -2
- package/corpus/templates/chat/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/chat/package.json +3 -3
- package/corpus/templates/clips/actions/finalize-recording.ts +50 -40
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +8 -6
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +3 -3
- package/corpus/templates/clips/changelog/2026-07-03-mobile-recording-pages-keep-videos-in-a-16-9-player-with-act.md +6 -0
- package/corpus/templates/clips/package.json +3 -3
- package/corpus/templates/clips/server/lib/recording-upload-state.ts +56 -0
- package/corpus/templates/clips/server/plugins/db.ts +68 -1
- package/corpus/templates/clips/server/routes/api/uploads/[recordingId]/chunk.post.ts +27 -3
- package/corpus/templates/content/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/content/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/content/actions/edit-document.ts +48 -1
- package/corpus/templates/content/actions/list-documents.ts +101 -94
- package/corpus/templates/content/actions/search-documents.ts +19 -3
- package/corpus/templates/content/actions/update-document.ts +54 -1
- package/corpus/templates/content/app/components/editor/DocumentEditor.tsx +127 -7
- package/corpus/templates/content/app/components/editor/VisualEditor.tsx +97 -2
- package/corpus/templates/content/changelog/2026-07-03-agent-document-edits-now-appear-as-a-live-collaborator-prese.md +6 -0
- package/corpus/templates/content/changelog/2026-07-03-document-search-and-list-views-load-faster-on-large-workspac.md +6 -0
- package/corpus/templates/content/package.json +3 -3
- package/corpus/templates/content/server/plugins/db.ts +57 -1
- package/corpus/templates/design/.agents/skills/full-app-build/SKILL.md +140 -0
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +20 -0
- package/corpus/templates/design/AGENTS.md +50 -12
- package/corpus/templates/design/actions/add-fusion-screens.ts +91 -0
- package/corpus/templates/design/actions/apply-a11y-fix.ts +5 -1
- package/corpus/templates/design/actions/apply-component-prop-edit.ts +10 -2
- package/corpus/templates/design/actions/apply-fusion-edits.ts +161 -0
- package/corpus/templates/design/actions/apply-visual-edit.ts +34 -1
- package/corpus/templates/design/actions/create-component.ts +5 -1
- package/corpus/templates/design/actions/create-fusion-app.ts +202 -0
- package/corpus/templates/design/actions/deploy-fusion-app.ts +123 -0
- package/corpus/templates/design/actions/edit-design.ts +13 -16
- package/corpus/templates/design/actions/get-fusion-deploy-status.ts +86 -0
- package/corpus/templates/design/actions/list-fusion-edits.ts +96 -0
- package/corpus/templates/design/actions/list-local-files.ts +133 -0
- package/corpus/templates/design/actions/push-fusion-app.ts +62 -0
- package/corpus/templates/design/actions/queue-fusion-edit.ts +112 -0
- package/corpus/templates/design/actions/read-local-file.ts +139 -0
- package/corpus/templates/design/actions/send-fusion-message.ts +69 -0
- package/corpus/templates/design/actions/sync-fusion-app.ts +196 -0
- package/corpus/templates/design/actions/write-local-file.ts +115 -14
- package/corpus/templates/design/app/components/design/CanvasContextMenu.tsx +12 -0
- package/corpus/templates/design/app/components/design/DesignCanvas.tsx +379 -0
- package/corpus/templates/design/app/components/design/EditPanel.tsx +149 -73
- package/corpus/templates/design/app/components/design/FusionAppBanner.tsx +328 -0
- package/corpus/templates/design/app/components/design/LayersPanel.tsx +148 -30
- package/corpus/templates/design/app/components/design/LocalhostWriteConsentDialog.tsx +1 -1
- package/corpus/templates/design/app/components/design/MultiScreenCanvas.tsx +567 -6
- package/corpus/templates/design/app/components/design/TweaksPanel.tsx +7 -98
- package/corpus/templates/design/app/components/design/code-workbench/ActivityBar.tsx +85 -0
- package/corpus/templates/design/app/components/design/code-workbench/CodeWorkbench.tsx +466 -0
- package/corpus/templates/design/app/components/design/code-workbench/SideBar.tsx +53 -0
- package/corpus/templates/design/app/components/design/code-workbench/commands.ts +339 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/Breadcrumbs.tsx +42 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/BufferSync.tsx +128 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/EditorTabs.tsx +363 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/MonacoHost.tsx +268 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/StatusBar.tsx +208 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-setup.ts +61 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme-palette.ts +191 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/monaco-theme.ts +29 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/status-bar-lang.ts +21 -0
- package/corpus/templates/design/app/components/design/code-workbench/editor/tab-drag.ts +27 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/ExplorerView.tsx +155 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +551 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/file-icons.tsx +115 -0
- package/corpus/templates/design/app/components/design/code-workbench/format/format-on-open.ts +65 -0
- package/corpus/templates/design/app/components/design/code-workbench/format/prettier-format.ts +182 -0
- package/corpus/templates/design/app/components/design/code-workbench/model-registry.ts +133 -0
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/QuickInput.tsx +563 -0
- package/corpus/templates/design/app/components/design/code-workbench/quickinput/fuzzy.ts +170 -0
- package/corpus/templates/design/app/components/design/code-workbench/search/SearchView.tsx +508 -0
- package/corpus/templates/design/app/components/design/code-workbench/search/search-engine.ts +280 -0
- package/corpus/templates/design/app/components/design/code-workbench/store.tsx +734 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/create-providers.ts +39 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/inline-provider.ts +196 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/localhost-provider.ts +177 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/tree.ts +110 -0
- package/corpus/templates/design/app/components/design/code-workbench/workspace/types.ts +103 -0
- package/corpus/templates/design/app/components/design/code-workbench-theme.ts +68 -0
- package/corpus/templates/design/app/components/design/inspector/DesignColorPicker.tsx +127 -10
- package/corpus/templates/design/app/components/design/inspector/ScrubInput.tsx +52 -29
- package/corpus/templates/design/app/components/design/inspector/index.ts +9 -0
- package/corpus/templates/design/app/components/design/inspector/scrub-input-utils.ts +56 -0
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +80 -1
- package/corpus/templates/design/app/components/visual-editor/SaveStatusIndicator.tsx +6 -16
- package/corpus/templates/design/app/i18n/zh-TW.ts +2 -1
- package/corpus/templates/design/app/i18n-data.ts +31 -18
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1474 -175
- package/corpus/templates/design/app/pages/Index.tsx +90 -17
- package/corpus/templates/design/changelog/2026-07-03-the-ai-now-edits-like-a-collaborator-on-canvas-its-cursor-gl.md +6 -0
- package/corpus/templates/design/changelog/2026-07-03-the-code-panel-is-now-a-full-vs-code-style-editor-with-a-fil.md +6 -0
- package/corpus/templates/design/package.json +4 -3
- package/corpus/templates/design/server/db/schema.ts +31 -0
- package/corpus/templates/design/server/lib/fusion-screens.ts +246 -0
- package/corpus/templates/design/server/plugins/db.ts +89 -2
- package/corpus/templates/design/shared/collab-selection.ts +52 -0
- package/corpus/templates/design/shared/full-app.ts +126 -0
- package/corpus/templates/design/shared/pen-path.ts +296 -0
- package/corpus/templates/dispatch/package.json +3 -3
- package/corpus/templates/forms/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/forms/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/forms/package.json +3 -3
- package/corpus/templates/forms/server/plugins/db.ts +62 -2
- package/corpus/templates/macros/package.json +3 -3
- package/corpus/templates/macros/server/plugins/db.ts +63 -2
- package/corpus/templates/mail/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/mail/.agents/skills/storing-data/SKILL.md +8 -0
- package/corpus/templates/mail/package.json +3 -3
- package/corpus/templates/mail/server/lib/contact-frequency.ts +42 -15
- package/corpus/templates/mail/server/plugins/db.ts +63 -2
- package/corpus/templates/plan/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +9 -3
- package/corpus/templates/plan/.agents/skills/visualize-repo/SKILL.md +92 -0
- package/corpus/templates/plan/actions/export-visual-plan.ts +5 -0
- package/corpus/templates/plan/actions/get-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/get-plan-version.ts +6 -16
- package/corpus/templates/plan/actions/list-plan-versions.ts +48 -20
- package/corpus/templates/plan/actions/patch-visual-plan-source.ts +41 -1
- package/corpus/templates/plan/actions/promote-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/update-local-plan-comments.ts +4 -2
- package/corpus/templates/plan/actions/update-local-plan-folder.ts +4 -22
- package/corpus/templates/plan/actions/update-visual-plan.ts +60 -1
- package/corpus/templates/plan/agent-native.app-skill.json +10 -0
- package/corpus/templates/plan/app/components/editor/PlanDocumentEditor.tsx +138 -39
- package/corpus/templates/plan/app/components/editor/usePlanUndoStack.ts +165 -23
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +80 -4
- package/corpus/templates/plan/app/global.css +11 -9
- package/corpus/templates/plan/app/hooks/use-navigation-state.ts +10 -1
- package/corpus/templates/plan/app/hooks/use-plan-presence.ts +66 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +215 -63
- package/corpus/templates/plan/changelog/2026-07-03-local-visual-plans-and-recaps-can-save-comments-without-sign.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plan-tabs-render-nested-text-instead-of-raw-json.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plans-are-now-fully-real-time-collaborative-multiple-people-.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-plans-open-and-refresh-faster-especially-long-lived-plans-wi.md +6 -0
- package/corpus/templates/plan/changelog/2026-07-03-undo-now-survives-agent-edits-cmd-z-keeps-working-on-your-ow.md +6 -0
- package/corpus/templates/plan/package.json +5 -3
- package/corpus/templates/plan/server/db/schema.ts +12 -0
- package/corpus/templates/plan/server/lib/local-plan-kind.ts +25 -0
- package/corpus/templates/plan/server/lib/plan-versions.ts +83 -1
- package/corpus/templates/plan/server/lib/public-action-paths.ts +0 -2
- package/corpus/templates/plan/server/plans.ts +26 -3
- package/corpus/templates/plan/server/plugins/db.ts +105 -2
- package/corpus/templates/slides/.agents/skills/slide-editing/SKILL.md +8 -4
- package/corpus/templates/slides/AGENTS.md +4 -0
- package/corpus/templates/slides/actions/_agent-presence.ts +48 -0
- package/corpus/templates/slides/actions/add-slide.ts +16 -18
- package/corpus/templates/slides/actions/patch-deck.ts +4 -2
- package/corpus/templates/slides/actions/update-slide.ts +114 -77
- package/corpus/templates/slides/actions/view-screen.ts +39 -0
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +47 -3
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +32 -35
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +625 -199
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +342 -0
- package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +46 -96
- package/corpus/templates/slides/app/components/visual-editor/SaveStatusIndicator.tsx +8 -1
- package/corpus/templates/slides/app/context/DeckContext.tsx +589 -176
- package/corpus/templates/slides/app/hooks/use-deck-presence.ts +84 -42
- package/corpus/templates/slides/app/i18n/ar-SA.ts +46 -0
- package/corpus/templates/slides/app/i18n/de-DE.ts +46 -0
- package/corpus/templates/slides/app/i18n/en-US.ts +46 -0
- package/corpus/templates/slides/app/i18n/es-ES.ts +46 -0
- package/corpus/templates/slides/app/i18n/fr-FR.ts +46 -0
- package/corpus/templates/slides/app/i18n/hi-IN.ts +46 -0
- package/corpus/templates/slides/app/i18n/ja-JP.ts +46 -0
- package/corpus/templates/slides/app/i18n/ko-KR.ts +46 -0
- package/corpus/templates/slides/app/i18n/pt-BR.ts +46 -0
- package/corpus/templates/slides/app/i18n/zh-CN.ts +46 -0
- package/corpus/templates/slides/app/i18n/zh-TW.ts +46 -0
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +25 -13
- package/corpus/templates/slides/changelog/2026-07-03-figma-style-slide-editing.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-03-see-the-ai-working-with-you-when-the-agent-edits-a-slide-it-.md +6 -0
- package/corpus/templates/slides/changelog/2026-07-03-undo-redo-is-now-precise-and-safe-with-collaborators-it-only.md +6 -0
- package/corpus/templates/slides/package.json +3 -3
- package/corpus/templates/slides/server/handlers/decks.ts +31 -3
- package/corpus/templates/slides/server/plugins/db.ts +65 -2
- package/corpus/templates/videos/netlify.toml +1 -12
- package/dist/agent/run-store.js +1 -1
- package/dist/agent/run-store.js.map +1 -1
- package/dist/chat-threads/store.d.ts +9 -1
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +63 -11
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/checkpoints/store.d.ts.map +1 -1
- package/dist/checkpoints/store.js +10 -2
- package/dist/checkpoints/store.js.map +1 -1
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +3 -5
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/design-connect.d.ts +49 -1
- package/dist/cli/design-connect.d.ts.map +1 -1
- package/dist/cli/design-connect.js +414 -9
- package/dist/cli/design-connect.js.map +1 -1
- package/dist/cli/index.js +12 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/plan-local.d.ts +24 -0
- package/dist/cli/plan-local.d.ts.map +1 -1
- package/dist/cli/plan-local.js +188 -20
- package/dist/cli/plan-local.js.map +1 -1
- package/dist/cli/skills.d.ts +3 -1
- package/dist/cli/skills.d.ts.map +1 -1
- package/dist/cli/skills.js +173 -21
- package/dist/cli/skills.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +0 -14
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/cli/visualize-repo.d.ts +49 -0
- package/dist/cli/visualize-repo.d.ts.map +1 -0
- package/dist/cli/visualize-repo.js +561 -0
- package/dist/cli/visualize-repo.js.map +1 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +120 -15
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-chat-adapter.d.ts.map +1 -1
- package/dist/client/agent-chat-adapter.js +6 -5
- package/dist/client/agent-chat-adapter.js.map +1 -1
- package/dist/client/app-providers.d.ts +2 -2
- package/dist/client/app-providers.js.map +1 -1
- package/dist/client/collab/index.d.ts +4 -1
- package/dist/client/collab/index.d.ts.map +1 -1
- package/dist/client/collab/index.js +3 -0
- package/dist/client/collab/index.js.map +1 -1
- package/dist/client/components/LiveCursorOverlay.d.ts.map +1 -1
- package/dist/client/components/LiveCursorOverlay.js +11 -3
- package/dist/client/components/LiveCursorOverlay.js.map +1 -1
- package/dist/client/components/PresenceBar.d.ts.map +1 -1
- package/dist/client/components/PresenceBar.js +6 -1
- package/dist/client/components/PresenceBar.js.map +1 -1
- package/dist/client/components/RecentEditHighlights.d.ts +43 -0
- package/dist/client/components/RecentEditHighlights.d.ts.map +1 -0
- package/dist/client/components/RecentEditHighlights.js +146 -0
- package/dist/client/components/RecentEditHighlights.js.map +1 -0
- package/dist/client/components/RemoteSelectionRings.d.ts +9 -0
- package/dist/client/components/RemoteSelectionRings.d.ts.map +1 -1
- package/dist/client/components/RemoteSelectionRings.js +22 -8
- package/dist/client/components/RemoteSelectionRings.js.map +1 -1
- package/dist/client/index.d.ts +6 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +1 -3
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts +8 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/SharedRichEditor.js +8 -2
- package/dist/client/rich-markdown-editor/SharedRichEditor.js.map +1 -1
- package/dist/client/rich-markdown-editor/index.d.ts +1 -0
- package/dist/client/rich-markdown-editor/index.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/index.js +1 -0
- package/dist/client/rich-markdown-editor/index.js.map +1 -1
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts +66 -0
- package/dist/client/rich-markdown-editor/surgical-apply.d.ts.map +1 -0
- package/dist/client/rich-markdown-editor/surgical-apply.js +147 -0
- package/dist/client/rich-markdown-editor/surgical-apply.js.map +1 -0
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts +18 -2
- package/dist/client/rich-markdown-editor/useCollabReconcile.d.ts.map +1 -1
- package/dist/client/rich-markdown-editor/useCollabReconcile.js +39 -8
- package/dist/client/rich-markdown-editor/useCollabReconcile.js.map +1 -1
- package/dist/client/session-replay.d.ts +10 -1
- package/dist/client/session-replay.d.ts.map +1 -1
- package/dist/client/session-replay.js +134 -7
- package/dist/client/session-replay.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +81 -1
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/client/use-action.d.ts +24 -0
- package/dist/client/use-action.d.ts.map +1 -1
- package/dist/client/use-action.js +109 -27
- package/dist/client/use-action.js.map +1 -1
- package/dist/client/use-agent-engine-configured.d.ts.map +1 -1
- package/dist/client/use-agent-engine-configured.js +7 -1
- package/dist/client/use-agent-engine-configured.js.map +1 -1
- package/dist/client/use-chat-threads.d.ts.map +1 -1
- package/dist/client/use-chat-threads.js +11 -3
- package/dist/client/use-chat-threads.js.map +1 -1
- package/dist/client/use-db-sync.d.ts +36 -0
- package/dist/client/use-db-sync.d.ts.map +1 -1
- package/dist/client/use-db-sync.js +68 -12
- package/dist/client/use-db-sync.js.map +1 -1
- package/dist/client/visual-style-controls.d.ts +79 -0
- package/dist/client/visual-style-controls.d.ts.map +1 -0
- package/dist/client/visual-style-controls.js +150 -0
- package/dist/client/visual-style-controls.js.map +1 -0
- package/dist/collab/agent-presence.d.ts +51 -5
- package/dist/collab/agent-presence.d.ts.map +1 -1
- package/dist/collab/agent-presence.js +144 -58
- package/dist/collab/agent-presence.js.map +1 -1
- package/dist/collab/awareness-store.d.ts +32 -0
- package/dist/collab/awareness-store.d.ts.map +1 -0
- package/dist/collab/awareness-store.js +0 -0
- package/dist/collab/awareness-store.js.map +1 -0
- package/dist/collab/awareness.d.ts +12 -1
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/awareness.js +53 -5
- package/dist/collab/awareness.js.map +1 -1
- package/dist/collab/client.d.ts +2 -0
- package/dist/collab/client.d.ts.map +1 -1
- package/dist/collab/client.js +79 -119
- package/dist/collab/client.js.map +1 -1
- package/dist/collab/index.d.ts +3 -1
- package/dist/collab/index.d.ts.map +1 -1
- package/dist/collab/index.js +5 -1
- package/dist/collab/index.js.map +1 -1
- package/dist/collab/recent-edits.d.ts +87 -0
- package/dist/collab/recent-edits.d.ts.map +1 -0
- package/dist/collab/recent-edits.js +116 -0
- package/dist/collab/recent-edits.js.map +1 -0
- package/dist/collab/routes.d.ts +2 -2
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/collab/undo.d.ts +121 -0
- package/dist/collab/undo.d.ts.map +1 -0
- package/dist/collab/undo.js +244 -0
- package/dist/collab/undo.js.map +1 -0
- package/dist/collab/ydoc-manager.d.ts +10 -0
- package/dist/collab/ydoc-manager.d.ts.map +1 -1
- package/dist/collab/ydoc-manager.js +57 -0
- package/dist/collab/ydoc-manager.js.map +1 -1
- package/dist/connections/catalog.d.ts +2 -2
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +1 -1
- package/dist/connections/catalog.js.map +1 -1
- package/dist/db/create-get-db.d.ts +22 -0
- package/dist/db/create-get-db.d.ts.map +1 -1
- package/dist/db/create-get-db.js +73 -1
- package/dist/db/create-get-db.js.map +1 -1
- package/dist/db/ensure-additive-columns.d.ts +93 -0
- package/dist/db/ensure-additive-columns.d.ts.map +1 -0
- package/dist/db/ensure-additive-columns.js +355 -0
- package/dist/db/ensure-additive-columns.js.map +1 -0
- package/dist/db/index.d.ts +1 -0
- package/dist/db/index.d.ts.map +1 -1
- package/dist/db/index.js +1 -0
- package/dist/db/index.js.map +1 -1
- package/dist/db/migrations.d.ts +70 -0
- package/dist/db/migrations.d.ts.map +1 -1
- package/dist/db/migrations.js +196 -33
- package/dist/db/migrations.js.map +1 -1
- package/dist/jobs/scheduler.js +17 -10
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +2 -2
- package/dist/observability/traces.d.ts.map +1 -1
- package/dist/observability/traces.js +155 -1
- package/dist/observability/traces.js.map +1 -1
- package/dist/org/context.d.ts +7 -0
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +54 -2
- package/dist/org/context.js.map +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +10 -6
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/auth-marketing.d.ts.map +1 -1
- package/dist/server/auth-marketing.js +0 -10
- package/dist/server/auth-marketing.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +6 -4
- package/dist/server/auth.js.map +1 -1
- package/dist/server/collab-plugin.d.ts.map +1 -1
- package/dist/server/collab-plugin.js +45 -13
- package/dist/server/collab-plugin.js.map +1 -1
- package/dist/server/design-token-utils.d.ts +1 -1
- package/dist/server/design-token-utils.js +1 -1
- package/dist/server/design-token-utils.js.map +1 -1
- package/dist/server/fusion-app.d.ts +107 -0
- package/dist/server/fusion-app.d.ts.map +1 -0
- package/dist/server/fusion-app.js +371 -0
- package/dist/server/fusion-app.js.map +1 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/onboarding-html.d.ts.map +1 -1
- package/dist/server/onboarding-html.js +3 -4
- package/dist/server/onboarding-html.js.map +1 -1
- package/dist/server/poll-events.d.ts +2 -0
- package/dist/server/poll-events.d.ts.map +1 -1
- package/dist/server/poll-events.js +7 -2
- package/dist/server/poll-events.js.map +1 -1
- package/dist/server/poll.d.ts +47 -3
- package/dist/server/poll.d.ts.map +1 -1
- package/dist/server/poll.js +176 -10
- package/dist/server/poll.js.map +1 -1
- package/dist/server/schema-prompt.d.ts.map +1 -1
- package/dist/server/schema-prompt.js +24 -7
- package/dist/server/schema-prompt.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/settings/store.d.ts.map +1 -1
- package/dist/settings/store.js +32 -3
- package/dist/settings/store.js.map +1 -1
- package/dist/sharing/actions/set-resource-visibility.js +2 -0
- package/dist/sharing/actions/set-resource-visibility.js.map +1 -1
- package/dist/sharing/actions/share-resource.d.ts.map +1 -1
- package/dist/sharing/actions/share-resource.js +3 -0
- package/dist/sharing/actions/share-resource.js.map +1 -1
- package/dist/sharing/actions/unshare-resource.js +2 -0
- package/dist/sharing/actions/unshare-resource.js.map +1 -1
- package/dist/styles/agent-native.css +0 -5
- package/dist/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/dist/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/dist/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/dist/templates/default/package.json +3 -3
- package/dist/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/dist/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/dist/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/dist/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/dist/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/dist/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/dist/tracking/providers.d.ts.map +1 -1
- package/dist/tracking/providers.js +17 -1
- package/dist/tracking/providers.js.map +1 -1
- package/docs/content/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ar-SA/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ar-SA/plan-plugin.mdx +10 -9
- package/docs/content/locales/ar-SA/sharing.mdx +1 -2
- package/docs/content/locales/ar-SA/skills-guide.mdx +2 -3
- package/docs/content/locales/ar-SA/template-plan.mdx +23 -7
- package/docs/content/locales/ar-SA/tracking.mdx +1 -1
- package/docs/content/locales/ar-SA/workspace-connections.mdx +11 -11
- package/docs/content/locales/de-DE/cloneable-saas.mdx +0 -1
- package/docs/content/locales/de-DE/plan-plugin.mdx +10 -9
- package/docs/content/locales/de-DE/sharing.mdx +1 -2
- package/docs/content/locales/de-DE/skills-guide.mdx +2 -3
- package/docs/content/locales/de-DE/template-plan.mdx +23 -7
- package/docs/content/locales/de-DE/tracking.mdx +1 -1
- package/docs/content/locales/de-DE/workspace-connections.mdx +1 -1
- package/docs/content/locales/es-ES/cloneable-saas.mdx +0 -1
- package/docs/content/locales/es-ES/plan-plugin.mdx +10 -9
- package/docs/content/locales/es-ES/sharing.mdx +1 -2
- package/docs/content/locales/es-ES/skills-guide.mdx +2 -3
- package/docs/content/locales/es-ES/template-plan.mdx +23 -7
- package/docs/content/locales/es-ES/tracking.mdx +1 -1
- package/docs/content/locales/es-ES/workspace-connections.mdx +1 -1
- package/docs/content/locales/fr-FR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/fr-FR/plan-plugin.mdx +10 -9
- package/docs/content/locales/fr-FR/sharing.mdx +1 -2
- package/docs/content/locales/fr-FR/skills-guide.mdx +2 -3
- package/docs/content/locales/fr-FR/template-plan.mdx +23 -7
- package/docs/content/locales/fr-FR/tracking.mdx +1 -1
- package/docs/content/locales/fr-FR/workspace-connections.mdx +1 -1
- package/docs/content/locales/hi-IN/cloneable-saas.mdx +0 -1
- package/docs/content/locales/hi-IN/plan-plugin.mdx +10 -9
- package/docs/content/locales/hi-IN/sharing.mdx +1 -2
- package/docs/content/locales/hi-IN/skills-guide.mdx +2 -3
- package/docs/content/locales/hi-IN/template-plan.mdx +23 -7
- package/docs/content/locales/hi-IN/tracking.mdx +1 -1
- package/docs/content/locales/hi-IN/workspace-connections.mdx +1 -1
- package/docs/content/locales/ja-JP/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ja-JP/plan-plugin.mdx +10 -9
- package/docs/content/locales/ja-JP/sharing.mdx +1 -2
- package/docs/content/locales/ja-JP/skills-guide.mdx +2 -3
- package/docs/content/locales/ja-JP/template-plan.mdx +23 -7
- package/docs/content/locales/ja-JP/tracking.mdx +1 -1
- package/docs/content/locales/ja-JP/workspace-connections.mdx +1 -1
- package/docs/content/locales/ko-KR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/ko-KR/plan-plugin.mdx +10 -9
- package/docs/content/locales/ko-KR/sharing.mdx +1 -2
- package/docs/content/locales/ko-KR/skills-guide.mdx +2 -3
- package/docs/content/locales/ko-KR/template-plan.mdx +23 -7
- package/docs/content/locales/ko-KR/tracking.mdx +1 -1
- package/docs/content/locales/ko-KR/workspace-connections.mdx +1 -1
- package/docs/content/locales/pt-BR/cloneable-saas.mdx +0 -1
- package/docs/content/locales/pt-BR/plan-plugin.mdx +10 -9
- package/docs/content/locales/pt-BR/sharing.mdx +1 -2
- package/docs/content/locales/pt-BR/skills-guide.mdx +2 -3
- package/docs/content/locales/pt-BR/template-plan.mdx +23 -7
- package/docs/content/locales/pt-BR/tracking.mdx +1 -1
- package/docs/content/locales/pt-BR/workspace-connections.mdx +1 -1
- package/docs/content/locales/zh-CN/cloneable-saas.mdx +0 -1
- package/docs/content/locales/zh-CN/plan-plugin.mdx +10 -9
- package/docs/content/locales/zh-CN/sharing.mdx +1 -2
- package/docs/content/locales/zh-CN/skills-guide.mdx +2 -3
- package/docs/content/locales/zh-CN/template-plan.mdx +23 -7
- package/docs/content/locales/zh-CN/tracking.mdx +1 -1
- package/docs/content/locales/zh-CN/workspace-connections.mdx +1 -1
- package/docs/content/locales/zh-TW/cloneable-saas.mdx +0 -1
- package/docs/content/locales/zh-TW/plan-plugin.mdx +10 -9
- package/docs/content/locales/zh-TW/sharing.mdx +1 -2
- package/docs/content/locales/zh-TW/skills-guide.mdx +2 -3
- package/docs/content/locales/zh-TW/template-plan.mdx +23 -7
- package/docs/content/locales/zh-TW/tracking.mdx +1 -1
- package/docs/content/locales/zh-TW/workspace-connections.mdx +1 -1
- package/docs/content/plan-plugin.mdx +12 -11
- package/docs/content/sharing.mdx +1 -2
- package/docs/content/skills-guide.mdx +4 -3
- package/docs/content/template-plan.mdx +37 -6
- package/docs/content/tracking.mdx +1 -1
- package/docs/content/workspace-connections.mdx +1 -1
- package/package.json +6 -6
- package/src/templates/default/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/src/templates/default/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/src/templates/default/.agents/skills/storing-data/SKILL.md +8 -0
- package/src/templates/default/package.json +3 -3
- package/src/templates/workspace-core/.agents/skills/client-methods/SKILL.md +8 -0
- package/src/templates/workspace-core/.agents/skills/observability/SKILL.md +22 -0
- package/src/templates/workspace-core/.agents/skills/real-time-collab/SKILL.md +82 -19
- package/src/templates/workspace-core/.agents/skills/real-time-sync/SKILL.md +15 -0
- package/src/templates/workspace-core/.agents/skills/storing-data/SKILL.md +8 -0
- package/src/templates/workspace-core/.agents/skills/tracking/SKILL.md +1 -0
- package/corpus/core/docs/content/locales/ar-SA/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/de-DE/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/es-ES/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/fr-FR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/hi-IN/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/ja-JP/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/ko-KR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/pt-BR/template-videos.mdx +0 -336
- package/corpus/core/docs/content/locales/zh-CN/template-videos.mdx +0 -334
- package/corpus/core/docs/content/locales/zh-TW/template-videos.mdx +0 -334
- package/corpus/core/docs/content/template-videos.mdx +0 -332
- package/corpus/templates/design/app/components/design/CodeWorkbenchHost.tsx +0 -697
- package/corpus/templates/slides/app/components/editor/CodeEditor.tsx +0 -49
- package/corpus/templates/videos/.agents/skills/actions/SKILL.md +0 -432
- package/corpus/templates/videos/.agents/skills/animation-tracks/SKILL.md +0 -99
- package/corpus/templates/videos/.agents/skills/capture-learnings/SKILL.md +0 -76
- package/corpus/templates/videos/.agents/skills/composition-management/SKILL.md +0 -106
- package/corpus/templates/videos/.agents/skills/create-skill/SKILL.md +0 -221
- package/corpus/templates/videos/.agents/skills/delegate-to-agent/SKILL.md +0 -263
- package/corpus/templates/videos/.agents/skills/frontend-design/SKILL.md +0 -112
- package/corpus/templates/videos/.agents/skills/security/SKILL.md +0 -263
- package/corpus/templates/videos/.agents/skills/self-modifying-code/SKILL.md +0 -88
- package/corpus/templates/videos/.agents/skills/shadcn-ui/SKILL.md +0 -95
- package/corpus/templates/videos/.builder/ANIMATED_PROPERTIES.md +0 -335
- package/corpus/templates/videos/.builder/KEYFRAME_SYNC.md +0 -166
- package/corpus/templates/videos/.builder/SEAMLESS_SYNC.md +0 -211
- package/corpus/templates/videos/.builder/rules/deploy-app.mdc +0 -22
- package/corpus/templates/videos/.builder/rules/organize-ui.mdc +0 -9
- package/corpus/templates/videos/.builder/skills/remotion/SKILL.md +0 -29
- package/corpus/templates/videos/.builder/skills/remotion/rules/animations.md +0 -27
- package/corpus/templates/videos/.builder/skills/remotion/rules/assets.md +0 -43
- package/corpus/templates/videos/.builder/skills/remotion/rules/audio.md +0 -58
- package/corpus/templates/videos/.builder/skills/remotion/rules/compositions.md +0 -129
- package/corpus/templates/videos/.builder/skills/remotion/rules/fonts.md +0 -47
- package/corpus/templates/videos/.builder/skills/remotion/rules/images.md +0 -41
- package/corpus/templates/videos/.builder/skills/remotion/rules/parameters.md +0 -59
- package/corpus/templates/videos/.builder/skills/remotion/rules/sequencing.md +0 -54
- package/corpus/templates/videos/.builder/skills/remotion/rules/tailwind.md +0 -11
- package/corpus/templates/videos/.builder/skills/remotion/rules/text-animations.md +0 -18
- package/corpus/templates/videos/.builder/skills/remotion/rules/timing.md +0 -103
- package/corpus/templates/videos/.builder/skills/remotion/rules/transparent-videos.md +0 -35
- package/corpus/templates/videos/.builder/skills/remotion/rules/trimming.md +0 -38
- package/corpus/templates/videos/.builder/skills/remotion/rules/videos.md +0 -54
- package/corpus/templates/videos/.dockerignore +0 -62
- package/corpus/templates/videos/.env.example +0 -4
- package/corpus/templates/videos/.oxfmtrc.json +0 -8
- package/corpus/templates/videos/AGENTS.md +0 -46
- package/corpus/templates/videos/CHANGELOG.md +0 -10
- package/corpus/templates/videos/DEVELOPING.md +0 -143
- package/corpus/templates/videos/README.md +0 -33
- package/corpus/templates/videos/actions/analyze-brand-assets.ts +0 -151
- package/corpus/templates/videos/actions/apply-design-system.ts +0 -35
- package/corpus/templates/videos/actions/create-design-system.ts +0 -84
- package/corpus/templates/videos/actions/create-folder.ts +0 -48
- package/corpus/templates/videos/actions/db-connect.ts +0 -45
- package/corpus/templates/videos/actions/db-health.ts +0 -24
- package/corpus/templates/videos/actions/db-status.ts +0 -28
- package/corpus/templates/videos/actions/delete-composition.ts +0 -272
- package/corpus/templates/videos/actions/delete-folder.ts +0 -27
- package/corpus/templates/videos/actions/generate-animated-component.ts +0 -470
- package/corpus/templates/videos/actions/get-composition.ts +0 -36
- package/corpus/templates/videos/actions/get-design-system.ts +0 -35
- package/corpus/templates/videos/actions/import-code.ts +0 -67
- package/corpus/templates/videos/actions/import-design-project.ts +0 -42
- package/corpus/templates/videos/actions/import-document.ts +0 -125
- package/corpus/templates/videos/actions/import-from-url.ts +0 -18
- package/corpus/templates/videos/actions/import-github.ts +0 -182
- package/corpus/templates/videos/actions/list-compositions.ts +0 -32
- package/corpus/templates/videos/actions/list-design-systems.ts +0 -66
- package/corpus/templates/videos/actions/list-folders.ts +0 -61
- package/corpus/templates/videos/actions/move-composition-to-folder.ts +0 -59
- package/corpus/templates/videos/actions/navigate.ts +0 -40
- package/corpus/templates/videos/actions/rename-folder.ts +0 -41
- package/corpus/templates/videos/actions/run.ts +0 -2
- package/corpus/templates/videos/actions/save-composition.ts +0 -114
- package/corpus/templates/videos/actions/set-default-design-system.ts +0 -40
- package/corpus/templates/videos/actions/update-composition.ts +0 -81
- package/corpus/templates/videos/actions/update-design-system.ts +0 -68
- package/corpus/templates/videos/actions/validate-compositions.ts +0 -502
- package/corpus/templates/videos/actions/view-screen.ts +0 -48
- package/corpus/templates/videos/app/components/CameraControls.tsx +0 -442
- package/corpus/templates/videos/app/components/CameraToolbar.tsx +0 -437
- package/corpus/templates/videos/app/components/CloudUpgrade.tsx +0 -287
- package/corpus/templates/videos/app/components/CollabPresenceBar.tsx +0 -81
- package/corpus/templates/videos/app/components/CompSettingsEditor.tsx +0 -107
- package/corpus/templates/videos/app/components/ComponentLibrarySidebar.tsx +0 -457
- package/corpus/templates/videos/app/components/ComponentPropsPanel.tsx +0 -227
- package/corpus/templates/videos/app/components/ComponentsSidebar.tsx +0 -70
- package/corpus/templates/videos/app/components/CompositionCard.tsx +0 -147
- package/corpus/templates/videos/app/components/CurrentElementPanel.tsx +0 -835
- package/corpus/templates/videos/app/components/CursorControls.tsx +0 -664
- package/corpus/templates/videos/app/components/CursorPositioningOverlay.tsx +0 -238
- package/corpus/templates/videos/app/components/LibraryFolderRow.tsx +0 -235
- package/corpus/templates/videos/app/components/MotionCurveSelect.tsx +0 -61
- package/corpus/templates/videos/app/components/NewCompositionPopover.tsx +0 -192
- package/corpus/templates/videos/app/components/PropsEditor.tsx +0 -210
- package/corpus/templates/videos/app/components/QuestionFlow.tsx +0 -40
- package/corpus/templates/videos/app/components/Sidebar.tsx +0 -609
- package/corpus/templates/videos/app/components/StudioHeader.tsx +0 -109
- package/corpus/templates/videos/app/components/Timeline.tsx +0 -2067
- package/corpus/templates/videos/app/components/TrackPropertiesPanel.tsx +0 -922
- package/corpus/templates/videos/app/components/TweaksPanel.tsx +0 -277
- package/corpus/templates/videos/app/components/VideoPlayer.tsx +0 -487
- package/corpus/templates/videos/app/components/design-system/DesignSystemCard.tsx +0 -134
- package/corpus/templates/videos/app/components/design-system/DesignSystemPreview.tsx +0 -176
- package/corpus/templates/videos/app/components/design-system/DesignSystemSetup.tsx +0 -707
- package/corpus/templates/videos/app/components/keyframes/KeyframeActionButtons.tsx +0 -78
- package/corpus/templates/videos/app/components/keyframes/KeyframeNavigation.tsx +0 -59
- package/corpus/templates/videos/app/components/keyframes/PropertyNumberInput.tsx +0 -56
- package/corpus/templates/videos/app/components/layout/Header.tsx +0 -64
- package/corpus/templates/videos/app/components/layout/HeaderActions.tsx +0 -84
- package/corpus/templates/videos/app/components/layout/Layout.tsx +0 -132
- package/corpus/templates/videos/app/components/layout/NavSidebar.tsx +0 -180
- package/corpus/templates/videos/app/components/ui/accordion.tsx +0 -56
- package/corpus/templates/videos/app/components/ui/alert-dialog.tsx +0 -139
- package/corpus/templates/videos/app/components/ui/alert.tsx +0 -59
- package/corpus/templates/videos/app/components/ui/aspect-ratio.tsx +0 -5
- package/corpus/templates/videos/app/components/ui/avatar.tsx +0 -48
- package/corpus/templates/videos/app/components/ui/badge.tsx +0 -37
- package/corpus/templates/videos/app/components/ui/breadcrumb.tsx +0 -115
- package/corpus/templates/videos/app/components/ui/button.tsx +0 -57
- package/corpus/templates/videos/app/components/ui/calendar.tsx +0 -68
- package/corpus/templates/videos/app/components/ui/card.tsx +0 -86
- package/corpus/templates/videos/app/components/ui/carousel.tsx +0 -260
- package/corpus/templates/videos/app/components/ui/chart.tsx +0 -375
- package/corpus/templates/videos/app/components/ui/checkbox.tsx +0 -28
- package/corpus/templates/videos/app/components/ui/collapsible.tsx +0 -9
- package/corpus/templates/videos/app/components/ui/command.tsx +0 -154
- package/corpus/templates/videos/app/components/ui/context-menu.tsx +0 -202
- package/corpus/templates/videos/app/components/ui/dialog.tsx +0 -130
- package/corpus/templates/videos/app/components/ui/drawer.tsx +0 -116
- package/corpus/templates/videos/app/components/ui/dropdown-menu.tsx +0 -212
- package/corpus/templates/videos/app/components/ui/form.tsx +0 -177
- package/corpus/templates/videos/app/components/ui/hover-card.tsx +0 -27
- package/corpus/templates/videos/app/components/ui/input-otp.tsx +0 -69
- package/corpus/templates/videos/app/components/ui/input.tsx +0 -22
- package/corpus/templates/videos/app/components/ui/label.tsx +0 -24
- package/corpus/templates/videos/app/components/ui/menubar.tsx +0 -234
- package/corpus/templates/videos/app/components/ui/navigation-menu.tsx +0 -128
- package/corpus/templates/videos/app/components/ui/pagination.tsx +0 -121
- package/corpus/templates/videos/app/components/ui/popover.tsx +0 -44
- package/corpus/templates/videos/app/components/ui/progress.tsx +0 -26
- package/corpus/templates/videos/app/components/ui/radio-group.tsx +0 -42
- package/corpus/templates/videos/app/components/ui/resizable.tsx +0 -43
- package/corpus/templates/videos/app/components/ui/scroll-area.tsx +0 -46
- package/corpus/templates/videos/app/components/ui/select.tsx +0 -158
- package/corpus/templates/videos/app/components/ui/separator.tsx +0 -29
- package/corpus/templates/videos/app/components/ui/sheet.tsx +0 -160
- package/corpus/templates/videos/app/components/ui/sidebar.tsx +0 -782
- package/corpus/templates/videos/app/components/ui/skeleton.tsx +0 -15
- package/corpus/templates/videos/app/components/ui/slider.tsx +0 -26
- package/corpus/templates/videos/app/components/ui/sonner.tsx +0 -58
- package/corpus/templates/videos/app/components/ui/spinner.tsx +0 -17
- package/corpus/templates/videos/app/components/ui/switch.tsx +0 -27
- package/corpus/templates/videos/app/components/ui/table.tsx +0 -117
- package/corpus/templates/videos/app/components/ui/tabs.tsx +0 -53
- package/corpus/templates/videos/app/components/ui/textarea.tsx +0 -23
- package/corpus/templates/videos/app/components/ui/toast.tsx +0 -127
- package/corpus/templates/videos/app/components/ui/toaster.tsx +0 -33
- package/corpus/templates/videos/app/components/ui/toggle-group.tsx +0 -59
- package/corpus/templates/videos/app/components/ui/toggle.tsx +0 -43
- package/corpus/templates/videos/app/components/ui/tooltip.tsx +0 -30
- package/corpus/templates/videos/app/components/ui/use-toast.ts +0 -3
- package/corpus/templates/videos/app/config/constants.ts +0 -204
- package/corpus/templates/videos/app/contexts/CompositionContext.tsx +0 -437
- package/corpus/templates/videos/app/contexts/CurrentElementContext.tsx +0 -247
- package/corpus/templates/videos/app/contexts/PlaybackContext.tsx +0 -65
- package/corpus/templates/videos/app/contexts/TimelineContext.tsx +0 -433
- package/corpus/templates/videos/app/entry.client.tsx +0 -19
- package/corpus/templates/videos/app/entry.server.tsx +0 -10
- package/corpus/templates/videos/app/global.css +0 -171
- package/corpus/templates/videos/app/hooks/use-composition-collab.ts +0 -269
- package/corpus/templates/videos/app/hooks/use-composition-design-system.ts +0 -47
- package/corpus/templates/videos/app/hooks/use-database-compositions.ts +0 -144
- package/corpus/templates/videos/app/hooks/use-db-status.ts +0 -30
- package/corpus/templates/videos/app/hooks/use-design-systems.ts +0 -21
- package/corpus/templates/videos/app/hooks/use-folders.ts +0 -199
- package/corpus/templates/videos/app/hooks/use-mobile.tsx +0 -21
- package/corpus/templates/videos/app/hooks/use-navigation-state.ts +0 -52
- package/corpus/templates/videos/app/hooks/use-question-flow.ts +0 -14
- package/corpus/templates/videos/app/hooks/use-toast.ts +0 -188
- package/corpus/templates/videos/app/hooks/useUnsavedChanges.ts +0 -48
- package/corpus/templates/videos/app/i18n/ar-SA.ts +0 -446
- package/corpus/templates/videos/app/i18n/de-DE.ts +0 -470
- package/corpus/templates/videos/app/i18n/en-US.ts +0 -452
- package/corpus/templates/videos/app/i18n/es-ES.ts +0 -468
- package/corpus/templates/videos/app/i18n/fr-FR.ts +0 -469
- package/corpus/templates/videos/app/i18n/hi-IN.ts +0 -446
- package/corpus/templates/videos/app/i18n/index.ts +0 -34
- package/corpus/templates/videos/app/i18n/ja-JP.ts +0 -460
- package/corpus/templates/videos/app/i18n/ko-KR.ts +0 -453
- package/corpus/templates/videos/app/i18n/pt-BR.ts +0 -461
- package/corpus/templates/videos/app/i18n/zh-CN.ts +0 -437
- package/corpus/templates/videos/app/i18n/zh-TW.ts +0 -437
- package/corpus/templates/videos/app/lib/database-compositions.ts +0 -67
- package/corpus/templates/videos/app/lib/design-systems.ts +0 -234
- package/corpus/templates/videos/app/lib/tab-id.ts +0 -1
- package/corpus/templates/videos/app/lib/utils.ts +0 -1
- package/corpus/templates/videos/app/pages/ComponentLibrary.tsx +0 -134
- package/corpus/templates/videos/app/pages/ComponentLibraryView.tsx +0 -362
- package/corpus/templates/videos/app/pages/CompositionView.tsx +0 -715
- package/corpus/templates/videos/app/pages/DesignSystems.tsx +0 -180
- package/corpus/templates/videos/app/pages/Index.tsx +0 -258
- package/corpus/templates/videos/app/pages/NewComposition.tsx +0 -95
- package/corpus/templates/videos/app/pages/NotFound.tsx +0 -36
- package/corpus/templates/videos/app/remotion/CameraHost.tsx +0 -223
- package/corpus/templates/videos/app/remotion/animations/useElementAnimations.ts +0 -231
- package/corpus/templates/videos/app/remotion/componentRegistry.ts +0 -473
- package/corpus/templates/videos/app/remotion/components/AnimatedElement.tsx +0 -436
- package/corpus/templates/videos/app/remotion/components/InteractiveElement.tsx +0 -159
- package/corpus/templates/videos/app/remotion/components/InteractiveZoneEditor.tsx +0 -273
- package/corpus/templates/videos/app/remotion/compositions/BlankComposition.tsx +0 -204
- package/corpus/templates/videos/app/remotion/compositions/index.ts +0 -2
- package/corpus/templates/videos/app/remotion/createComponentCursorTrack.ts +0 -132
- package/corpus/templates/videos/app/remotion/docs/CURSOR_TRACKS.md +0 -285
- package/corpus/templates/videos/app/remotion/easingFunctions.ts +0 -255
- package/corpus/templates/videos/app/remotion/hooks/createInteractiveComposition.tsx +0 -283
- package/corpus/templates/videos/app/remotion/hooks/useCursorHistory.ts +0 -72
- package/corpus/templates/videos/app/remotion/hooks/useCursorTypeFromHover.ts +0 -35
- package/corpus/templates/videos/app/remotion/hooks/useEditableZones.tsx +0 -267
- package/corpus/templates/videos/app/remotion/hooks/useHoverAnimation.ts +0 -90
- package/corpus/templates/videos/app/remotion/hooks/useHoverAnimationSmooth.ts +0 -146
- package/corpus/templates/videos/app/remotion/hooks/useInteractiveComponent.ts +0 -711
- package/corpus/templates/videos/app/remotion/hooks/useRegisterInteractiveElement.ts +0 -56
- package/corpus/templates/videos/app/remotion/library-components/Button.tsx +0 -252
- package/corpus/templates/videos/app/remotion/library-components/Card.tsx +0 -241
- package/corpus/templates/videos/app/remotion/library-components/CodePanel.tsx +0 -1005
- package/corpus/templates/videos/app/remotion/library-components/FileItem.tsx +0 -196
- package/corpus/templates/videos/app/remotion/library-components/FolderItem.tsx +0 -199
- package/corpus/templates/videos/app/remotion/library-components/PrimaryButton.tsx +0 -177
- package/corpus/templates/videos/app/remotion/library-components/SecondaryButton.tsx +0 -167
- package/corpus/templates/videos/app/remotion/library-components/SectionHeader.tsx +0 -108
- package/corpus/templates/videos/app/remotion/library-components/TEMPLATE.tsx +0 -211
- package/corpus/templates/videos/app/remotion/library-components/index.ts +0 -10
- package/corpus/templates/videos/app/remotion/registry.ts +0 -91
- package/corpus/templates/videos/app/remotion/testing/animationTestUtils.ts +0 -366
- package/corpus/templates/videos/app/remotion/trackAnimation.ts +0 -179
- package/corpus/templates/videos/app/remotion/trackHelpers.ts +0 -110
- package/corpus/templates/videos/app/remotion/ui-components/Cursor.tsx +0 -182
- package/corpus/templates/videos/app/remotion/ui-components/InteractiveButton.tsx +0 -116
- package/corpus/templates/videos/app/remotion/ui-components/InteractiveCard.tsx +0 -126
- package/corpus/templates/videos/app/remotion/ui-components/index.ts +0 -16
- package/corpus/templates/videos/app/remotion/utils/animationHelpers.ts +0 -444
- package/corpus/templates/videos/app/remotion/utils/interactiveElements.ts +0 -235
- package/corpus/templates/videos/app/remotion/utils/springAnimation.ts +0 -76
- package/corpus/templates/videos/app/root.tsx +0 -165
- package/corpus/templates/videos/app/routes/$.tsx +0 -10
- package/corpus/templates/videos/app/routes/_index.tsx +0 -25
- package/corpus/templates/videos/app/routes/c.$compositionId.tsx +0 -10
- package/corpus/templates/videos/app/routes/components.tsx +0 -10
- package/corpus/templates/videos/app/routes/design-systems.tsx +0 -10
- package/corpus/templates/videos/app/routes/extensions.$id.$slug.tsx +0 -2
- package/corpus/templates/videos/app/routes/extensions.$id.tsx +0 -5
- package/corpus/templates/videos/app/routes/extensions._index.tsx +0 -5
- package/corpus/templates/videos/app/routes/extensions.tsx +0 -5
- package/corpus/templates/videos/app/routes/settings.tsx +0 -88
- package/corpus/templates/videos/app/routes/team.tsx +0 -11
- package/corpus/templates/videos/app/routes.ts +0 -4
- package/corpus/templates/videos/app/state.ts +0 -77
- package/corpus/templates/videos/app/types/elementAnimations.ts +0 -121
- package/corpus/templates/videos/app/types.ts +0 -200
- package/corpus/templates/videos/app/utils/compositionHelpers.ts +0 -445
- package/corpus/templates/videos/app/utils/debug.ts +0 -63
- package/corpus/templates/videos/app/utils/keyframeUtils.ts +0 -331
- package/corpus/templates/videos/app/utils/timelineCoordinates.ts +0 -79
- package/corpus/templates/videos/app/vite-env.d.ts +0 -6
- package/corpus/templates/videos/changelog/2026-06-24-a-new-settings-page-gives-quick-access-to-language-workspace.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-24-added-a-language-picker-and-localized-app-chrome-for-support.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-27-traditional-chinese-copy-uses-taiwan-terminology.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-28-left-sidebar-collapses-into-an-animated-icon-rail.md +0 -6
- package/corpus/templates/videos/changelog/2026-06-29-video-layouts-adapt-when-the-agent-sidebar-is-open.md +0 -6
- package/corpus/templates/videos/components.json +0 -20
- package/corpus/templates/videos/data/sync-config.json +0 -3
- package/corpus/templates/videos/docs/examples/create-composition.example.ts +0 -128
- package/corpus/templates/videos/drizzle.config.ts +0 -3
- package/corpus/templates/videos/learnings.defaults.md +0 -5
- package/corpus/templates/videos/package.json +0 -114
- package/corpus/templates/videos/public/agent-native-icon-dark.svg +0 -10
- package/corpus/templates/videos/public/agent-native-icon-light.svg +0 -10
- package/corpus/templates/videos/public/agent-native-logo-dark.svg +0 -21
- package/corpus/templates/videos/public/agent-native-logo-light.svg +0 -21
- package/corpus/templates/videos/public/favicon.svg +0 -1
- package/corpus/templates/videos/public/icon-180.svg +0 -1
- package/corpus/templates/videos/public/icon-192.svg +0 -1
- package/corpus/templates/videos/public/icon-512.svg +0 -1
- package/corpus/templates/videos/public/manifest.json +0 -21
- package/corpus/templates/videos/public/placeholder.svg +0 -1
- package/corpus/templates/videos/public/robots.txt +0 -14
- package/corpus/templates/videos/react-router.config.ts +0 -7
- package/corpus/templates/videos/server/db/index.ts +0 -37
- package/corpus/templates/videos/server/db/schema.ts +0 -55
- package/corpus/templates/videos/server/middleware/auth.ts +0 -15
- package/corpus/templates/videos/server/plugins/agent-chat.ts +0 -29
- package/corpus/templates/videos/server/plugins/auth.ts +0 -14
- package/corpus/templates/videos/server/plugins/collab.ts +0 -11
- package/corpus/templates/videos/server/plugins/core-routes.ts +0 -22
- package/corpus/templates/videos/server/plugins/db.ts +0 -160
- package/corpus/templates/videos/server/routes/[...page].get.ts +0 -5
- package/corpus/templates/videos/server/routes/[...page].head.ts +0 -1
- package/corpus/templates/videos/server/routes/api/save-composition-defaults.post.ts +0 -274
- package/corpus/templates/videos/shared/api.ts +0 -75
- package/corpus/templates/videos/ssr-entry.ts +0 -15
- package/corpus/templates/videos/tsconfig.json +0 -21
- package/corpus/templates/videos/vite.config.ts +0 -19
- package/corpus/templates/videos/vitest.config.ts +0 -16
- package/docs/content/locales/ar-SA/template-videos.mdx +0 -336
- package/docs/content/locales/de-DE/template-videos.mdx +0 -336
- package/docs/content/locales/es-ES/template-videos.mdx +0 -336
- package/docs/content/locales/fr-FR/template-videos.mdx +0 -336
- package/docs/content/locales/hi-IN/template-videos.mdx +0 -336
- package/docs/content/locales/ja-JP/template-videos.mdx +0 -336
- package/docs/content/locales/ko-KR/template-videos.mdx +0 -336
- package/docs/content/locales/pt-BR/template-videos.mdx +0 -336
- package/docs/content/locales/zh-CN/template-videos.mdx +0 -334
- package/docs/content/locales/zh-TW/template-videos.mdx +0 -334
- package/docs/content/template-videos.mdx +0 -332
|
@@ -26,7 +26,18 @@ let _migrationExecRefCount = 0;
|
|
|
26
26
|
|
|
27
27
|
async function acquireMigrationExec(): Promise<DbExec> {
|
|
28
28
|
if (!_migrationExecPromise) {
|
|
29
|
-
|
|
29
|
+
const opened = createDbExec({ url: getMigrationDatabaseUrl() });
|
|
30
|
+
_migrationExecPromise = opened;
|
|
31
|
+
opened.catch(() => {
|
|
32
|
+
// Opening the connection failed. Reset the shared state so the next
|
|
33
|
+
// caller retries with a fresh connection instead of awaiting this
|
|
34
|
+
// permanently rejected promise — and zero the ref count, because none
|
|
35
|
+
// of the awaiters that failed here will ever call release.
|
|
36
|
+
if (_migrationExecPromise === opened) {
|
|
37
|
+
_migrationExecPromise = null;
|
|
38
|
+
_migrationExecRefCount = 0;
|
|
39
|
+
}
|
|
40
|
+
});
|
|
30
41
|
}
|
|
31
42
|
_migrationExecRefCount++;
|
|
32
43
|
return _migrationExecPromise;
|
|
@@ -187,12 +198,25 @@ export interface RunMigrationsOptions {
|
|
|
187
198
|
*
|
|
188
199
|
* { version: 14, sql: { postgres: "ALTER TABLE …" } } // no-op on sqlite
|
|
189
200
|
* { version: 15, sql: { sqlite: "…", postgres: "…" } } // both dialects
|
|
201
|
+
*
|
|
202
|
+
* `name` is an optional stable, unique slug that opts a migration into
|
|
203
|
+
* **name-based tracking** instead of the legacy version-number gate. See the
|
|
204
|
+
* "Name-based tracking" section on `runMigrations` for why this exists and
|
|
205
|
+
* exactly how the two gating strategies interact.
|
|
190
206
|
*/
|
|
191
207
|
export type MigrationSql = string | { postgres?: string; sqlite?: string };
|
|
192
208
|
|
|
193
209
|
export interface MigrationEntry {
|
|
194
210
|
version: number;
|
|
195
211
|
sql: MigrationSql;
|
|
212
|
+
/**
|
|
213
|
+
* Stable, unique slug for this migration (e.g. `"analytics-alert-rules-table"`).
|
|
214
|
+
* When present, this migration is tracked by NAME instead of by version
|
|
215
|
+
* number — see the `runMigrations` doc comment for the full rationale and
|
|
216
|
+
* gating rules. Must be unique across the migration list; a duplicate name
|
|
217
|
+
* throws at startup (programmer error, not a runtime data problem).
|
|
218
|
+
*/
|
|
219
|
+
name?: string;
|
|
196
220
|
}
|
|
197
221
|
|
|
198
222
|
function resolveMigrationSql(sql: MigrationSql, pg: boolean): string | null {
|
|
@@ -201,6 +225,63 @@ function resolveMigrationSql(sql: MigrationSql, pg: boolean): string | null {
|
|
|
201
225
|
return raw ?? null;
|
|
202
226
|
}
|
|
203
227
|
|
|
228
|
+
/**
|
|
229
|
+
* Runs a list of migrations against the configured database, gated by a
|
|
230
|
+
* per-table bookkeeping row (`options.table`) so repeated boots only apply
|
|
231
|
+
* new migrations.
|
|
232
|
+
*
|
|
233
|
+
* ## Name-based tracking (why it exists)
|
|
234
|
+
*
|
|
235
|
+
* The legacy gate is purely numeric: `SELECT MAX(version)` from the
|
|
236
|
+
* bookkeeping table, then apply every entry whose `version` is greater. That
|
|
237
|
+
* scheme silently breaks down when **two independent branches each extend the
|
|
238
|
+
* same migration list with different DDL under the same version numbers** —
|
|
239
|
+
* exactly what happened to the analytics template's v75-v83 range. Branch A
|
|
240
|
+
* shipped alert-rule tables as v75-v78; branch B shipped unrelated DDL as its
|
|
241
|
+
* own v75-v83. Whichever branch deployed first recorded "v75..v83 applied"
|
|
242
|
+
* in the bookkeeping table. When the other branch merged and deployed, its
|
|
243
|
+
* migrations at those same version numbers were never applied — `MAX(version)`
|
|
244
|
+
* was already ≥ their version, so the gate treated them as done even though
|
|
245
|
+
* their actual DDL had never run. The result: `analytics_migrations` showed
|
|
246
|
+
* rows for 1..83 with no gaps, yet `analytics_alert_rules`,
|
|
247
|
+
* `analytics_alert_incidents`, and `session_recordings.network_error_count`
|
|
248
|
+
* did not exist in production. Version numbers are not a stable identity —
|
|
249
|
+
* they're just sequence position, and sequence position collides across
|
|
250
|
+
* branches.
|
|
251
|
+
*
|
|
252
|
+
* Name-based tracking fixes this by keying application on a stable, unique
|
|
253
|
+
* **string slug** instead of a position in a shared integer sequence:
|
|
254
|
+
*
|
|
255
|
+
* - Entries with a `name` are recorded in a companion table,
|
|
256
|
+
* `${table}_named` (`name TEXT PRIMARY KEY`), and APPLY IFF their name is
|
|
257
|
+
* absent from that table — completely independent of version numbers or
|
|
258
|
+
* the legacy `MAX(version)` gate. Two branches can both ship a migration
|
|
259
|
+
* named `"analytics-alert-rules-table"` at version 75, or one at version 75
|
|
260
|
+
* and the other at version 90 after a rebase — either way it applies
|
|
261
|
+
* exactly once per database, keyed on the name.
|
|
262
|
+
* - Entries WITHOUT a `name` keep the exact legacy behavior
|
|
263
|
+
* (`version > MAX(recorded version)`), so nothing changes for existing
|
|
264
|
+
* unnamed migrations.
|
|
265
|
+
* - Named migrations still execute in list order, interleaved with unnamed
|
|
266
|
+
* ones exactly as written.
|
|
267
|
+
* - When a named migration's DDL runs, we record BOTH the named row (always)
|
|
268
|
+
* and — if its `version` is greater than the current legacy max — the
|
|
269
|
+
* legacy version row too, in the SAME atomic batch/transaction as the DDL.
|
|
270
|
+
* This keeps the legacy `MAX(version)` gate monotonically advancing for
|
|
271
|
+
* any unnamed migrations that come after it in the list, while ensuring a
|
|
272
|
+
* named migration is never "double recorded" in a way that would let it
|
|
273
|
+
* re-apply.
|
|
274
|
+
* - A duplicate `name` across the migration list throws at startup — that's
|
|
275
|
+
* a programmer error (copy-paste or merge mistake), not a runtime data
|
|
276
|
+
* problem, and failing loud beats silently tracking the wrong row.
|
|
277
|
+
*
|
|
278
|
+
* New migrations should always set a `name`. Legacy unnamed migrations don't
|
|
279
|
+
* need to be renamed retroactively — the two gating strategies coexist in the
|
|
280
|
+
* same list — but if a table is EVER at risk of being shared across parallel
|
|
281
|
+
* branches (any template's own migrations qualify, since branches routinely
|
|
282
|
+
* extend the same list concurrently), giving new entries a name is what makes
|
|
283
|
+
* them immune to the collision class described above.
|
|
284
|
+
*/
|
|
204
285
|
export function runMigrations(
|
|
205
286
|
migrations: Array<MigrationEntry>,
|
|
206
287
|
options: RunMigrationsOptions,
|
|
@@ -217,6 +298,25 @@ export function runMigrations(
|
|
|
217
298
|
"for why this is required (shared-DB version-collision bug).",
|
|
218
299
|
);
|
|
219
300
|
}
|
|
301
|
+
|
|
302
|
+
// Duplicate-name detection — programmer error, fail loud at startup rather
|
|
303
|
+
// than silently tracking the wrong migration's applied state.
|
|
304
|
+
{
|
|
305
|
+
const seenNames = new Set<string>();
|
|
306
|
+
for (const m of migrations) {
|
|
307
|
+
if (!m.name) continue;
|
|
308
|
+
if (seenNames.has(m.name)) {
|
|
309
|
+
throw new Error(
|
|
310
|
+
`runMigrations: duplicate migration name "${m.name}" in the migration list for table "${table}". ` +
|
|
311
|
+
"Migration names must be unique — pick a different stable slug.",
|
|
312
|
+
);
|
|
313
|
+
}
|
|
314
|
+
seenNames.add(m.name);
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
const namedTable = `${table}_named`;
|
|
319
|
+
|
|
220
320
|
return async () => {
|
|
221
321
|
try {
|
|
222
322
|
// Check for Cloudflare D1 binding (only if DATABASE_URL not set)
|
|
@@ -227,20 +327,50 @@ export function runMigrations(
|
|
|
227
327
|
`CREATE TABLE IF NOT EXISTS ${table} (version INTEGER PRIMARY KEY)`,
|
|
228
328
|
)
|
|
229
329
|
.run();
|
|
330
|
+
await d1
|
|
331
|
+
.prepare(
|
|
332
|
+
`CREATE TABLE IF NOT EXISTS ${namedTable} (name TEXT PRIMARY KEY, version INTEGER, applied_at TEXT NOT NULL DEFAULT (datetime('now')))`,
|
|
333
|
+
)
|
|
334
|
+
.run();
|
|
230
335
|
const firstRow = await d1
|
|
231
336
|
.prepare(`SELECT MAX(version) as v FROM ${table}`)
|
|
232
337
|
.first<{ v?: number }>();
|
|
233
338
|
const current = (firstRow?.v as number) ?? 0;
|
|
234
339
|
|
|
235
|
-
|
|
340
|
+
const appliedNamesRows = await d1
|
|
341
|
+
.prepare(`SELECT name FROM ${namedTable}`)
|
|
342
|
+
.all();
|
|
343
|
+
const appliedNames = new Set(
|
|
344
|
+
(appliedNamesRows?.results ?? []).map((r) => String(r.name)),
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
const pending = migrations.filter((m) =>
|
|
348
|
+
m.name ? !appliedNames.has(m.name) : m.version > current,
|
|
349
|
+
);
|
|
350
|
+
|
|
351
|
+
for (const m of pending) {
|
|
236
352
|
try {
|
|
237
353
|
// D1 is SQLite-compatible
|
|
238
354
|
const raw = resolveMigrationSql(m.sql, false);
|
|
355
|
+
const recordStatements = [
|
|
356
|
+
m.name
|
|
357
|
+
? d1
|
|
358
|
+
.prepare(
|
|
359
|
+
`INSERT OR IGNORE INTO ${namedTable} (name, version) VALUES (?, ?)`,
|
|
360
|
+
)
|
|
361
|
+
.bind(m.name, m.version)
|
|
362
|
+
: null,
|
|
363
|
+
m.version > current
|
|
364
|
+
? d1
|
|
365
|
+
.prepare(`INSERT OR IGNORE INTO ${table} VALUES (?)`)
|
|
366
|
+
.bind(m.version)
|
|
367
|
+
: null,
|
|
368
|
+
].filter((s): s is NonNullable<typeof s> => s != null);
|
|
369
|
+
|
|
239
370
|
if (raw == null) {
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
.run();
|
|
371
|
+
// Dialect-gated migration with no SQL for this dialect; still
|
|
372
|
+
// record it so we don't retry forever.
|
|
373
|
+
for (const stmt of recordStatements) await stmt.run();
|
|
244
374
|
continue;
|
|
245
375
|
}
|
|
246
376
|
const originalStatements = splitSqlStatements(raw);
|
|
@@ -263,27 +393,22 @@ export function runMigrations(
|
|
|
263
393
|
throw err;
|
|
264
394
|
}
|
|
265
395
|
}
|
|
266
|
-
await
|
|
267
|
-
.prepare(`INSERT OR IGNORE INTO ${table} VALUES (?)`)
|
|
268
|
-
.bind(m.version)
|
|
269
|
-
.run();
|
|
396
|
+
for (const stmt of recordStatements) await stmt.run();
|
|
270
397
|
} else {
|
|
271
|
-
// Atomic batch: all statements +
|
|
398
|
+
// Atomic batch: all statements + bookkeeping inserts land in
|
|
272
399
|
// the same transaction. A failing statement rolls the whole
|
|
273
|
-
// migration back, so we never record a half-applied
|
|
400
|
+
// migration back, so we never record a half-applied migration.
|
|
274
401
|
await d1.batch([
|
|
275
402
|
...statements.map((s) => d1.prepare(s.sql)),
|
|
276
|
-
|
|
277
|
-
.prepare(`INSERT OR IGNORE INTO ${table} VALUES (?)`)
|
|
278
|
-
.bind(m.version),
|
|
403
|
+
...recordStatements,
|
|
279
404
|
]);
|
|
280
405
|
}
|
|
281
406
|
console.log(
|
|
282
|
-
`[db] Applied migration v${m.version} (${statements.length} statement${statements.length === 1 ? "" : "s"})`,
|
|
407
|
+
`[db] Applied migration ${m.name ? `"${m.name}" ` : ""}v${m.version} (${statements.length} statement${statements.length === 1 ? "" : "s"})`,
|
|
283
408
|
);
|
|
284
409
|
} catch (err) {
|
|
285
410
|
console.error(
|
|
286
|
-
`[db] Migration v${m.version} FAILED:`,
|
|
411
|
+
`[db] Migration ${m.name ? `"${m.name}" ` : ""}v${m.version} FAILED:`,
|
|
287
412
|
(err as Error).message,
|
|
288
413
|
"\nSQL:",
|
|
289
414
|
JSON.stringify(m.sql),
|
|
@@ -317,6 +442,12 @@ export function runMigrations(
|
|
|
317
442
|
// ---------------------------------------------------------------------------
|
|
318
443
|
|
|
319
444
|
let current = -1; // sentinel: "table missing" → treat all as pending
|
|
445
|
+
let namedRowsMissing = false; // sentinel: "named table missing" → no names applied yet
|
|
446
|
+
|
|
447
|
+
// Any migration with a `name` is a candidate regardless of version, so
|
|
448
|
+
// the fast-path "anything pending?" check must also account for names.
|
|
449
|
+
const hasNamedMigrations = migrations.some((m) => m.name);
|
|
450
|
+
let appliedNames = new Set<string>();
|
|
320
451
|
|
|
321
452
|
if (pg) {
|
|
322
453
|
try {
|
|
@@ -327,12 +458,26 @@ export function runMigrations(
|
|
|
327
458
|
} catch {
|
|
328
459
|
// Table doesn't exist yet — leave current = -1 so all migrations apply.
|
|
329
460
|
}
|
|
461
|
+
if (hasNamedMigrations) {
|
|
462
|
+
try {
|
|
463
|
+
const { rows } = await getDbExec().execute(
|
|
464
|
+
`SELECT name FROM ${namedTable}`,
|
|
465
|
+
);
|
|
466
|
+
appliedNames = new Set(rows.map((r) => String(r.name)));
|
|
467
|
+
} catch {
|
|
468
|
+
// Named table doesn't exist yet — leave appliedNames empty so all
|
|
469
|
+
// named migrations apply.
|
|
470
|
+
namedRowsMissing = true;
|
|
471
|
+
}
|
|
472
|
+
}
|
|
330
473
|
}
|
|
331
474
|
|
|
332
475
|
// For SQLite we still use getDbExec() as exec throughout (no pooler concern).
|
|
333
476
|
// For Postgres we only open the direct exec when there are pending migrations.
|
|
334
477
|
const pendingFast = pg
|
|
335
|
-
? migrations.filter((m) =>
|
|
478
|
+
? migrations.filter((m) =>
|
|
479
|
+
m.name ? !appliedNames.has(m.name) : m.version > current,
|
|
480
|
+
)
|
|
336
481
|
: null; // SQLite: compute after table creation below
|
|
337
482
|
|
|
338
483
|
// Short-circuit: Postgres with nothing to do — skip the direct connection entirely.
|
|
@@ -355,6 +500,16 @@ export function runMigrations(
|
|
|
355
500
|
),
|
|
356
501
|
{ maxAttempts: 6, baseDelayMs: 1000, rethrow: true },
|
|
357
502
|
);
|
|
503
|
+
// Companion name-keyed bookkeeping table — never alters the existing
|
|
504
|
+
// `${table}`'s PRIMARY KEY, so legacy version rows keep working exactly
|
|
505
|
+
// as before. See the `runMigrations` doc comment for why this exists.
|
|
506
|
+
await retrySqliteBusy(
|
|
507
|
+
() =>
|
|
508
|
+
exec.execute(
|
|
509
|
+
`CREATE TABLE IF NOT EXISTS ${namedTable} (name TEXT PRIMARY KEY, version INTEGER, applied_at ${pg ? "TIMESTAMP NOT NULL DEFAULT now()" : "TEXT NOT NULL DEFAULT (datetime('now'))"})`,
|
|
510
|
+
),
|
|
511
|
+
{ maxAttempts: 6, baseDelayMs: 1000, rethrow: true },
|
|
512
|
+
);
|
|
358
513
|
|
|
359
514
|
// For Postgres, current was already set by the fast-path SELECT above.
|
|
360
515
|
// For SQLite we run the SELECT now (via the same exec, which is the singleton).
|
|
@@ -363,20 +518,39 @@ export function runMigrations(
|
|
|
363
518
|
`SELECT MAX(version) as v FROM ${table}`,
|
|
364
519
|
);
|
|
365
520
|
current = (rows[0]?.v as number) ?? 0;
|
|
366
|
-
|
|
521
|
+
if (hasNamedMigrations) {
|
|
522
|
+
const { rows: nameRows } = await exec.execute(
|
|
523
|
+
`SELECT name FROM ${namedTable}`,
|
|
524
|
+
);
|
|
525
|
+
appliedNames = new Set(nameRows.map((r) => String(r.name)));
|
|
526
|
+
}
|
|
527
|
+
} else if (current === -1 || (hasNamedMigrations && namedRowsMissing)) {
|
|
367
528
|
// Fast-path read failed (table was absent on the pooler): re-read via the
|
|
368
529
|
// direct exec now that CREATE TABLE IF NOT EXISTS has ensured it exists.
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
530
|
+
if (current === -1) {
|
|
531
|
+
const { rows } = await exec.execute(
|
|
532
|
+
`SELECT MAX(version) as v FROM ${table}`,
|
|
533
|
+
);
|
|
534
|
+
current = (rows[0]?.v as number) ?? 0;
|
|
535
|
+
}
|
|
536
|
+
if (hasNamedMigrations && namedRowsMissing) {
|
|
537
|
+
const { rows: nameRows } = await exec.execute(
|
|
538
|
+
`SELECT name FROM ${namedTable}`,
|
|
539
|
+
);
|
|
540
|
+
appliedNames = new Set(nameRows.map((r) => String(r.name)));
|
|
541
|
+
}
|
|
373
542
|
}
|
|
374
543
|
|
|
375
|
-
const
|
|
544
|
+
const insertVersionSql = pg
|
|
376
545
|
? `INSERT INTO ${table} VALUES (?) ON CONFLICT DO NOTHING`
|
|
377
546
|
: `INSERT OR IGNORE INTO ${table} VALUES (?)`;
|
|
547
|
+
const insertNamedSql = pg
|
|
548
|
+
? `INSERT INTO ${namedTable} (name, version) VALUES (?, ?) ON CONFLICT DO NOTHING`
|
|
549
|
+
: `INSERT OR IGNORE INTO ${namedTable} (name, version) VALUES (?, ?)`;
|
|
378
550
|
|
|
379
|
-
const pending = migrations.filter((m) =>
|
|
551
|
+
const pending = migrations.filter((m) =>
|
|
552
|
+
m.name ? !appliedNames.has(m.name) : m.version > current,
|
|
553
|
+
);
|
|
380
554
|
if (pending.length > 0) {
|
|
381
555
|
console.log(
|
|
382
556
|
`[db] Applying ${pending.length} migration(s) on ${pg ? "Postgres" : "SQLite/libsql"}…`,
|
|
@@ -385,10 +559,32 @@ export function runMigrations(
|
|
|
385
559
|
|
|
386
560
|
for (const m of pending) {
|
|
387
561
|
const raw = resolveMigrationSql(m.sql, pg);
|
|
562
|
+
const label = m.name
|
|
563
|
+
? `"${m.name}" (v${m.version})`
|
|
564
|
+
: `v${m.version}`;
|
|
565
|
+
|
|
566
|
+
// Record BOTH the named row (always, when named) and the legacy
|
|
567
|
+
// version row (only if this migration actually advances the legacy
|
|
568
|
+
// MAX) — atomically with the DDL below. This keeps the legacy gate
|
|
569
|
+
// monotonic for any unnamed migrations later in the list, while a
|
|
570
|
+
// named migration is tracked by name regardless of version.
|
|
571
|
+
const recordSql: Array<{ sql: string; args: unknown[] }> = [];
|
|
572
|
+
if (m.name) {
|
|
573
|
+
recordSql.push({
|
|
574
|
+
sql: insertNamedSql,
|
|
575
|
+
args: [m.name, m.version],
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
if (m.version > current) {
|
|
579
|
+
recordSql.push({ sql: insertVersionSql, args: [m.version] });
|
|
580
|
+
}
|
|
581
|
+
|
|
388
582
|
if (raw == null) {
|
|
389
583
|
// Dialect-gated migration with no SQL for this dialect; still mark
|
|
390
584
|
// as applied so we don't retry forever.
|
|
391
|
-
|
|
585
|
+
for (const stmt of recordSql) await exec.execute(stmt);
|
|
586
|
+
if (m.version > current) current = m.version;
|
|
587
|
+
if (m.name) appliedNames.add(m.name);
|
|
392
588
|
continue;
|
|
393
589
|
}
|
|
394
590
|
// Split BEFORE adapting so we can remember which original statements
|
|
@@ -414,22 +610,27 @@ export function runMigrations(
|
|
|
414
610
|
throw err;
|
|
415
611
|
}
|
|
416
612
|
}
|
|
417
|
-
|
|
613
|
+
for (const stmt of recordSql) await exec.execute(stmt);
|
|
614
|
+
if (m.version > current) current = m.version;
|
|
615
|
+
if (m.name) appliedNames.add(m.name);
|
|
418
616
|
console.log(
|
|
419
|
-
`[db] Applied migration
|
|
617
|
+
`[db] Applied migration ${label} (${statements.length} statement${statements.length === 1 ? "" : "s"})`,
|
|
420
618
|
);
|
|
421
619
|
} catch (err) {
|
|
422
620
|
if (pg && isPermissionError(err)) {
|
|
423
621
|
// The connected role lacks privilege for this migration (e.g. a
|
|
424
622
|
// permission-limited dev/replica role that doesn't own the table).
|
|
425
623
|
// Don't crash-loop the whole server over it — warn and STOP here.
|
|
426
|
-
// We must NOT continue to later migrations: pending work is
|
|
427
|
-
// as `version > MAX(recorded version)`, so applying a later
|
|
428
|
-
// would advance MAX past this unrecorded one and
|
|
429
|
-
// Stopping leaves MAX at the last recorded
|
|
430
|
-
// privileged role resumes from this exact
|
|
624
|
+
// We must NOT continue to later migrations: unnamed pending work is
|
|
625
|
+
// computed as `version > MAX(recorded version)`, so applying a later
|
|
626
|
+
// unnamed migration would advance MAX past this unrecorded one and
|
|
627
|
+
// orphan it forever. Stopping leaves MAX at the last recorded
|
|
628
|
+
// version, so a properly-privileged role resumes from this exact
|
|
629
|
+
// migration, in order. (A named migration skipped here simply
|
|
630
|
+
// isn't recorded by name either, so it's retried next boot same as
|
|
631
|
+
// the legacy gate — no orphaning risk from name-based tracking.)
|
|
431
632
|
console.warn(
|
|
432
|
-
`[db] Migration
|
|
633
|
+
`[db] Migration ${label} skipped — insufficient privilege: ${(err as Error).message}. ` +
|
|
433
634
|
`Apply it with a DB role that owns the table. ` +
|
|
434
635
|
`Halting further migrations so this one isn't orphaned. ` +
|
|
435
636
|
`Set <APP_NAME>_DATABASE_URL (e.g. PLAN_DATABASE_URL) to a database this app owns — a file: URL uses local SQLite.`,
|
|
@@ -439,7 +640,7 @@ export function runMigrations(
|
|
|
439
640
|
break;
|
|
440
641
|
}
|
|
441
642
|
console.error(
|
|
442
|
-
`[db] Migration
|
|
643
|
+
`[db] Migration ${label} FAILED:`,
|
|
443
644
|
(err as Error).message,
|
|
444
645
|
"\nStatement:",
|
|
445
646
|
currentStmt,
|
|
@@ -445,17 +445,12 @@ async function executeJob(
|
|
|
445
445
|
useHostedDefault: true,
|
|
446
446
|
});
|
|
447
447
|
|
|
448
|
-
// Hard-abort backstop: 5 minutes. On hosted runtimes the soft-timeout
|
|
449
|
-
// will fire first; locally this is the only guard.
|
|
450
|
-
const hardAbortTimer = setTimeout(
|
|
451
|
-
() => {
|
|
452
|
-
// startRun's abort controller handles this below, but we still need
|
|
453
|
-
// the handle to clear it in the finally block.
|
|
454
|
-
},
|
|
455
|
-
5 * 60 * 1000,
|
|
456
|
-
);
|
|
457
|
-
|
|
458
448
|
let jobError: Error | null = null;
|
|
449
|
+
// Hard-abort backstop: 5 minutes. On hosted runtimes the soft-timeout
|
|
450
|
+
// will fire first; locally this is the only guard. Cleared when the
|
|
451
|
+
// run completes so finished jobs don't leave a live timer keeping the
|
|
452
|
+
// process/event loop alive for the remainder of the window.
|
|
453
|
+
let hardAbortTimer: ReturnType<typeof setTimeout> | null = null;
|
|
459
454
|
await new Promise<void>((resolve, reject) => {
|
|
460
455
|
const activeRun = startRun(
|
|
461
456
|
runId,
|
|
@@ -479,6 +474,10 @@ async function executeJob(
|
|
|
479
474
|
},
|
|
480
475
|
// onComplete: run finished (completed or aborted)
|
|
481
476
|
async (run) => {
|
|
477
|
+
if (hardAbortTimer) {
|
|
478
|
+
clearTimeout(hardAbortTimer);
|
|
479
|
+
hardAbortTimer = null;
|
|
480
|
+
}
|
|
482
481
|
if (run.status === "completed") {
|
|
483
482
|
resolve();
|
|
484
483
|
} else {
|
|
@@ -491,11 +490,11 @@ async function executeJob(
|
|
|
491
490
|
},
|
|
492
491
|
);
|
|
493
492
|
|
|
494
|
-
//
|
|
495
|
-
//
|
|
496
|
-
|
|
497
|
-
setTimeout(
|
|
493
|
+
// Abort the run-manager's own controller after 5 minutes if the
|
|
494
|
+
// run hasn't finished naturally.
|
|
495
|
+
hardAbortTimer = setTimeout(
|
|
498
496
|
() => {
|
|
497
|
+
hardAbortTimer = null;
|
|
499
498
|
if (activeRun.status === "running") {
|
|
500
499
|
activeRun.abort.abort("job_hard_timeout");
|
|
501
500
|
reject(new Error("Job timed out after 5 minutes"));
|
|
@@ -506,6 +505,10 @@ async function executeJob(
|
|
|
506
505
|
}).catch((err: any) => {
|
|
507
506
|
jobError = err;
|
|
508
507
|
});
|
|
508
|
+
if (hardAbortTimer) {
|
|
509
|
+
clearTimeout(hardAbortTimer);
|
|
510
|
+
hardAbortTimer = null;
|
|
511
|
+
}
|
|
509
512
|
|
|
510
513
|
if (jobError) throw jobError;
|
|
511
514
|
|
|
@@ -8,6 +8,162 @@ function spanId(): string {
|
|
|
8
8
|
return `span-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
|
|
9
9
|
}
|
|
10
10
|
|
|
11
|
+
function normalizeTrackingSlug(value: string | undefined): string | undefined {
|
|
12
|
+
const raw = value?.trim().toLowerCase();
|
|
13
|
+
if (!raw) return undefined;
|
|
14
|
+
return raw
|
|
15
|
+
.replace(/^@agent-native\//, "")
|
|
16
|
+
.replace(/[^a-z0-9._-]+/g, "-")
|
|
17
|
+
.replace(/^-+|-+$/g, "");
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
function appSlugFromUrl(value: string | undefined): string | undefined {
|
|
21
|
+
if (!value?.trim()) return undefined;
|
|
22
|
+
try {
|
|
23
|
+
const raw = /^[a-z][a-z0-9+.-]*:\/\//i.test(value)
|
|
24
|
+
? value
|
|
25
|
+
: `https://${value}`;
|
|
26
|
+
const hostname = new URL(raw).hostname.toLowerCase();
|
|
27
|
+
if (hostname.endsWith(".agent-native.com")) {
|
|
28
|
+
return normalizeTrackingSlug(
|
|
29
|
+
hostname.slice(0, -".agent-native.com".length),
|
|
30
|
+
);
|
|
31
|
+
}
|
|
32
|
+
return normalizeTrackingSlug(hostname.split(".")[0]);
|
|
33
|
+
} catch {
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
function trackingIdentityProperties(): Record<string, string> {
|
|
39
|
+
const packageApp = normalizeTrackingSlug(process.env.npm_package_name);
|
|
40
|
+
const urlApp =
|
|
41
|
+
appSlugFromUrl(process.env.APP_URL) ||
|
|
42
|
+
appSlugFromUrl(process.env.BETTER_AUTH_URL) ||
|
|
43
|
+
appSlugFromUrl(process.env.URL) ||
|
|
44
|
+
appSlugFromUrl(process.env.DEPLOY_URL) ||
|
|
45
|
+
appSlugFromUrl(process.env.VERCEL_PROJECT_PRODUCTION_URL) ||
|
|
46
|
+
appSlugFromUrl(process.env.VERCEL_URL);
|
|
47
|
+
const app =
|
|
48
|
+
normalizeTrackingSlug(process.env.AGENT_NATIVE_APP) ||
|
|
49
|
+
normalizeTrackingSlug(process.env.VITE_AGENT_NATIVE_APP) ||
|
|
50
|
+
urlApp ||
|
|
51
|
+
packageApp ||
|
|
52
|
+
normalizeTrackingSlug(process.env.APP_NAME);
|
|
53
|
+
const template =
|
|
54
|
+
normalizeTrackingSlug(process.env.AGENT_NATIVE_TEMPLATE) ||
|
|
55
|
+
normalizeTrackingSlug(process.env.VITE_AGENT_NATIVE_TEMPLATE) ||
|
|
56
|
+
normalizeTrackingSlug(process.env.APP_TEMPLATE) ||
|
|
57
|
+
normalizeTrackingSlug(process.env.VITE_APP_TEMPLATE) ||
|
|
58
|
+
app;
|
|
59
|
+
|
|
60
|
+
return {
|
|
61
|
+
...(app ? { app, agent_native_app: app } : {}),
|
|
62
|
+
...(template ? { template, agent_native_template: template } : {}),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function llmProviderFromEngine(
|
|
67
|
+
engineName: string | undefined,
|
|
68
|
+
model: string,
|
|
69
|
+
): string {
|
|
70
|
+
const engine = engineName?.trim();
|
|
71
|
+
if (engine?.startsWith("ai-sdk:")) return engine.slice("ai-sdk:".length);
|
|
72
|
+
if (engine) return engine;
|
|
73
|
+
if (/claude|anthropic/i.test(model)) return "anthropic";
|
|
74
|
+
if (/gpt|openai|codex/i.test(model)) return "openai";
|
|
75
|
+
if (/gemini|google/i.test(model)) return "google";
|
|
76
|
+
return "unknown";
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function costUsdFromCenticents(value: number): number {
|
|
80
|
+
return Math.round((value / 10_000) * 1_000_000) / 1_000_000;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function emitLlmGenerationTrackingEvent(args: {
|
|
84
|
+
runId: string;
|
|
85
|
+
threadId: string | null;
|
|
86
|
+
userId: string | null;
|
|
87
|
+
parentSpanId: string;
|
|
88
|
+
llmSpanId: string;
|
|
89
|
+
engineName: string | undefined;
|
|
90
|
+
model: string;
|
|
91
|
+
inputTokens: number;
|
|
92
|
+
outputTokens: number;
|
|
93
|
+
cacheReadTokens: number;
|
|
94
|
+
cacheWriteTokens: number;
|
|
95
|
+
costCentsX100: number;
|
|
96
|
+
durationMs: number;
|
|
97
|
+
status: "success" | "error";
|
|
98
|
+
errorMessage: string | null;
|
|
99
|
+
toolCalls: number;
|
|
100
|
+
successfulTools: number;
|
|
101
|
+
failedTools: number;
|
|
102
|
+
createdAt: number;
|
|
103
|
+
}): void {
|
|
104
|
+
const provider = llmProviderFromEngine(args.engineName, args.model);
|
|
105
|
+
const costUsd = costUsdFromCenticents(args.costCentsX100);
|
|
106
|
+
const error = args.errorMessage ?? undefined;
|
|
107
|
+
const properties: Record<string, unknown> = {
|
|
108
|
+
...trackingIdentityProperties(),
|
|
109
|
+
source: "agent_observability",
|
|
110
|
+
span_type: "llm_call",
|
|
111
|
+
run_id: args.runId,
|
|
112
|
+
thread_id: args.threadId,
|
|
113
|
+
parent_span_id: args.parentSpanId,
|
|
114
|
+
span_id: args.llmSpanId,
|
|
115
|
+
model: args.model,
|
|
116
|
+
provider,
|
|
117
|
+
input_tokens: args.inputTokens,
|
|
118
|
+
output_tokens: args.outputTokens,
|
|
119
|
+
total_tokens: args.inputTokens + args.outputTokens,
|
|
120
|
+
cache_read_tokens: args.cacheReadTokens,
|
|
121
|
+
cache_write_tokens: args.cacheWriteTokens,
|
|
122
|
+
cost_cents_x100: args.costCentsX100,
|
|
123
|
+
cost_usd: costUsd,
|
|
124
|
+
duration_ms: args.durationMs,
|
|
125
|
+
status: args.status,
|
|
126
|
+
tool_calls: args.toolCalls,
|
|
127
|
+
successful_tools: args.successfulTools,
|
|
128
|
+
failed_tools: args.failedTools,
|
|
129
|
+
created_at: new Date(args.createdAt).toISOString(),
|
|
130
|
+
created_at_ms: args.createdAt,
|
|
131
|
+
$ai_trace_id: args.runId,
|
|
132
|
+
$ai_session_id: args.threadId ?? undefined,
|
|
133
|
+
$ai_span_id: args.llmSpanId,
|
|
134
|
+
$ai_span_name: "agent_run",
|
|
135
|
+
$ai_parent_id: args.parentSpanId,
|
|
136
|
+
$ai_model: args.model,
|
|
137
|
+
$ai_provider: provider,
|
|
138
|
+
$ai_input_tokens: args.inputTokens,
|
|
139
|
+
$ai_output_tokens: args.outputTokens,
|
|
140
|
+
$ai_latency: Math.round((args.durationMs / 1000) * 1000) / 1000,
|
|
141
|
+
$ai_is_error: args.status === "error",
|
|
142
|
+
$ai_error: error,
|
|
143
|
+
$ai_cache_read_input_tokens: args.cacheReadTokens,
|
|
144
|
+
$ai_cache_creation_input_tokens: args.cacheWriteTokens,
|
|
145
|
+
$ai_request_count: 1,
|
|
146
|
+
$ai_total_cost_usd: costUsd,
|
|
147
|
+
};
|
|
148
|
+
if (error) properties.error_message = error;
|
|
149
|
+
|
|
150
|
+
for (const key of Object.keys(properties)) {
|
|
151
|
+
if (properties[key] === undefined) delete properties[key];
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
try {
|
|
155
|
+
void import("../tracking/registry.js")
|
|
156
|
+
.then(({ track }) => {
|
|
157
|
+
track("$ai_generation", properties, {
|
|
158
|
+
userId: args.userId ?? undefined,
|
|
159
|
+
});
|
|
160
|
+
})
|
|
161
|
+
.catch(() => {});
|
|
162
|
+
} catch {
|
|
163
|
+
// Tracking must never affect the agent run or trace persistence.
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
11
167
|
/** Keys whose values are stripped from persisted tool inputs when
|
|
12
168
|
* `captureToolArgs` is enabled. Matched case-insensitively and tolerant
|
|
13
169
|
* of `_` / `-` separators. M14 in the MCP/A2A audit: tool calls
|
|
@@ -301,8 +457,9 @@ export async function instrumentAgentLoop(opts: {
|
|
|
301
457
|
let llmCallCount = 0;
|
|
302
458
|
if (usage) {
|
|
303
459
|
llmCallCount = 1;
|
|
460
|
+
const llmSpanId = spanId();
|
|
304
461
|
const llmSpan: TraceSpan = {
|
|
305
|
-
id:
|
|
462
|
+
id: llmSpanId,
|
|
306
463
|
runId,
|
|
307
464
|
threadId,
|
|
308
465
|
userId,
|
|
@@ -321,6 +478,30 @@ export async function instrumentAgentLoop(opts: {
|
|
|
321
478
|
createdAt: runStart,
|
|
322
479
|
};
|
|
323
480
|
spans.push(llmSpan);
|
|
481
|
+
emitLlmGenerationTrackingEvent({
|
|
482
|
+
runId,
|
|
483
|
+
threadId,
|
|
484
|
+
userId,
|
|
485
|
+
parentSpanId,
|
|
486
|
+
llmSpanId,
|
|
487
|
+
engineName:
|
|
488
|
+
typeof loopOpts.engine?.name === "string"
|
|
489
|
+
? loopOpts.engine.name
|
|
490
|
+
: undefined,
|
|
491
|
+
model: usage.model,
|
|
492
|
+
inputTokens: usage.inputTokens,
|
|
493
|
+
outputTokens: usage.outputTokens,
|
|
494
|
+
cacheReadTokens: usage.cacheReadTokens,
|
|
495
|
+
cacheWriteTokens: usage.cacheWriteTokens,
|
|
496
|
+
costCentsX100,
|
|
497
|
+
durationMs: totalDurationMs,
|
|
498
|
+
status: runStatus,
|
|
499
|
+
errorMessage,
|
|
500
|
+
toolCalls: toolCallCount,
|
|
501
|
+
successfulTools,
|
|
502
|
+
failedTools,
|
|
503
|
+
createdAt: runStart,
|
|
504
|
+
});
|
|
324
505
|
}
|
|
325
506
|
|
|
326
507
|
const parentSpan: TraceSpan = {
|