@agent-native/core 0.85.7 → 0.86.1
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 +1 -1
- package/corpus/core/CHANGELOG.md +133 -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 +7 -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/AgentPanel.tsx +10 -0
- package/corpus/core/src/client/AssistantChat.tsx +194 -21
- package/corpus/core/src/client/ErrorBoundary.tsx +67 -12
- package/corpus/core/src/client/ErrorReportActions.tsx +69 -0
- package/corpus/core/src/client/FeedbackButton.tsx +8 -4
- 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/db-admin/DbAdminPage.tsx +41 -13
- package/corpus/core/src/client/db-admin/SqlEditor.tsx +10 -3
- package/corpus/core/src/client/db-admin/TableEditor.tsx +12 -5
- package/corpus/core/src/client/db-admin/useAgentSync.ts +10 -3
- package/corpus/core/src/client/db-admin/useDbAdmin.ts +65 -16
- package/corpus/core/src/client/error-reporting.ts +100 -0
- package/corpus/core/src/client/index.ts +59 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +0 -4
- package/corpus/core/src/client/org/RequireActiveOrg.tsx +12 -0
- 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 +1088 -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/db-admin/index.ts +26 -0
- package/corpus/core/src/db-admin/operations.ts +87 -49
- package/corpus/core/src/jobs/scheduler.ts +17 -14
- package/corpus/core/src/localization/default-messages.ts +4 -0
- 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/builder-design-systems.ts +328 -9
- 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 +28 -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/app/root.tsx +47 -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 +35 -6
- package/corpus/templates/analytics/actions/delete-db-admin-connection.ts +19 -0
- package/corpus/templates/analytics/actions/list-db-admin-connections.ts +18 -0
- package/corpus/templates/analytics/actions/navigate.ts +28 -4
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +1 -1
- package/corpus/templates/analytics/actions/save-db-admin-connection.ts +33 -0
- package/corpus/templates/analytics/actions/view-screen.ts +65 -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 +16 -0
- package/corpus/templates/analytics/app/i18n/zh-TW.ts +36 -1
- package/corpus/templates/analytics/app/i18n-data.ts +361 -10
- package/corpus/templates/analytics/app/pages/Agents.tsx +512 -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-connect-other-app-databases-from-analytics.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/db/schema.ts +27 -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/db-admin-connections.ts +458 -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 +128 -2
- package/corpus/templates/analytics/server/routes/[base]/_agent-native/analytics-db-admin/[...path].ts +1 -0
- package/corpus/templates/analytics/server/routes/_agent-native/analytics-db-admin/[...path].ts +160 -0
- 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/app/root.tsx +9 -0
- 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/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.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 +63 -19
- 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-design-system.ts +21 -0
- package/corpus/templates/design/actions/get-fusion-deploy-status.ts +86 -0
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +14 -37
- 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 +114 -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 +372 -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 +161 -0
- package/corpus/templates/design/app/components/design/code-workbench/explorer/FileTree.tsx +555 -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 +782 -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/hooks/useDesignHotkeys.ts +6 -0
- package/corpus/templates/design/app/i18n/zh-TW.ts +17 -15
- package/corpus/templates/design/app/i18n-data.ts +185 -160
- package/corpus/templates/design/app/pages/DesignEditor.tsx +1474 -175
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +32 -14
- package/corpus/templates/design/app/pages/Index.tsx +90 -17
- package/corpus/templates/design/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
- 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-editor-is-easier-to-use-with-top-sidebar-tabs-clear.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/builder-design-system-proxy.ts +16 -106
- 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/app/root.tsx +60 -1
- package/corpus/templates/mail/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -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/i18n/ar-SA.ts +3 -0
- package/corpus/templates/plan/app/i18n/de-DE.ts +4 -0
- package/corpus/templates/plan/app/i18n/en-US.ts +4 -0
- package/corpus/templates/plan/app/i18n/es-ES.ts +4 -0
- package/corpus/templates/plan/app/i18n/fr-FR.ts +4 -0
- package/corpus/templates/plan/app/i18n/hi-IN.ts +3 -0
- package/corpus/templates/plan/app/i18n/ja-JP.ts +4 -0
- package/corpus/templates/plan/app/i18n/ko-KR.ts +4 -0
- package/corpus/templates/plan/app/i18n/pt-BR.ts +4 -0
- package/corpus/templates/plan/app/i18n/zh-CN.ts +3 -0
- package/corpus/templates/plan/app/i18n/zh-TW.ts +3 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +289 -66
- package/corpus/templates/plan/changelog/2026-07-03-error-screens-now-include-a-feedback-button-with-debug-info.md +6 -0
- 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 +11 -3
- 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/get-design-system.ts +21 -0
- package/corpus/templates/slides/actions/import-file.ts +15 -7
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +14 -37
- 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/design-system/DesignSystemSetup.tsx +32 -8
- package/corpus/templates/slides/app/components/editor/EditorSidebar.tsx +47 -3
- package/corpus/templates/slides/app/components/editor/EditorToolbar.tsx +34 -39
- package/corpus/templates/slides/app/components/editor/SlideEditor.tsx +507 -72
- package/corpus/templates/slides/app/components/editor/SlideStyleInspector.tsx +346 -0
- package/corpus/templates/slides/app/components/editor/SpeakerNotesPanel.tsx +56 -6
- package/corpus/templates/slides/app/components/editor/TweaksPanel.tsx +46 -96
- package/corpus/templates/slides/app/components/layout/Layout.tsx +6 -1
- 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 +54 -7
- package/corpus/templates/slides/app/i18n/de-DE.ts +53 -8
- package/corpus/templates/slides/app/i18n/en-US.ts +54 -7
- package/corpus/templates/slides/app/i18n/es-ES.ts +53 -8
- package/corpus/templates/slides/app/i18n/fr-FR.ts +53 -8
- package/corpus/templates/slides/app/i18n/hi-IN.ts +54 -7
- package/corpus/templates/slides/app/i18n/ja-JP.ts +53 -8
- package/corpus/templates/slides/app/i18n/ko-KR.ts +53 -7
- package/corpus/templates/slides/app/i18n/pt-BR.ts +53 -8
- package/corpus/templates/slides/app/i18n/zh-CN.ts +54 -7
- package/corpus/templates/slides/app/i18n/zh-TW.ts +54 -7
- package/corpus/templates/slides/app/lib/canvas-zoom.ts +16 -1
- package/corpus/templates/slides/app/pages/DeckEditor.tsx +28 -16
- package/corpus/templates/slides/changelog/2026-07-03-design-system-setup-now-indexes-figma-code-and-design-md-sou.md +6 -0
- 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-slide-editing-now-keeps-thumbnails-speaker-notes-styling-and.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/lib/builder-design-system-proxy.ts +16 -104
- 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/AgentPanel.d.ts.map +1 -1
- package/dist/client/AgentPanel.js +2 -1
- package/dist/client/AgentPanel.js.map +1 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +175 -18
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/ErrorBoundary.d.ts.map +1 -1
- package/dist/client/ErrorBoundary.js +37 -2
- package/dist/client/ErrorBoundary.js.map +1 -1
- package/dist/client/ErrorReportActions.d.ts +13 -0
- package/dist/client/ErrorReportActions.d.ts.map +1 -0
- package/dist/client/ErrorReportActions.js +14 -0
- package/dist/client/ErrorReportActions.js.map +1 -0
- package/dist/client/FeedbackButton.d.ts +3 -1
- package/dist/client/FeedbackButton.d.ts.map +1 -1
- package/dist/client/FeedbackButton.js +6 -5
- package/dist/client/FeedbackButton.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/db-admin/DbAdminPage.d.ts +9 -1
- package/dist/client/db-admin/DbAdminPage.d.ts.map +1 -1
- package/dist/client/db-admin/DbAdminPage.js +17 -13
- package/dist/client/db-admin/DbAdminPage.js.map +1 -1
- package/dist/client/db-admin/SqlEditor.d.ts +3 -1
- package/dist/client/db-admin/SqlEditor.d.ts.map +1 -1
- package/dist/client/db-admin/SqlEditor.js +3 -3
- package/dist/client/db-admin/SqlEditor.js.map +1 -1
- package/dist/client/db-admin/TableEditor.d.ts +3 -1
- package/dist/client/db-admin/TableEditor.d.ts.map +1 -1
- package/dist/client/db-admin/TableEditor.js +6 -6
- package/dist/client/db-admin/TableEditor.js.map +1 -1
- package/dist/client/db-admin/useAgentSync.d.ts +3 -2
- package/dist/client/db-admin/useAgentSync.d.ts.map +1 -1
- package/dist/client/db-admin/useAgentSync.js +8 -4
- package/dist/client/db-admin/useAgentSync.js.map +1 -1
- package/dist/client/db-admin/useDbAdmin.d.ts +11 -7
- package/dist/client/db-admin/useDbAdmin.d.ts.map +1 -1
- package/dist/client/db-admin/useDbAdmin.js +45 -20
- package/dist/client/db-admin/useDbAdmin.js.map +1 -1
- package/dist/client/error-reporting.d.ts +19 -0
- package/dist/client/error-reporting.d.ts.map +1 -0
- package/dist/client/error-reporting.js +71 -0
- package/dist/client/error-reporting.js.map +1 -0
- package/dist/client/index.d.ts +8 -1
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js +9 -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/org/RequireActiveOrg.d.ts.map +1 -1
- package/dist/client/org/RequireActiveOrg.js +2 -1
- package/dist/client/org/RequireActiveOrg.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 +90 -0
- package/dist/client/visual-style-controls.d.ts.map +1 -0
- package/dist/client/visual-style-controls.js +499 -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 +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/db-admin/index.d.ts +3 -0
- package/dist/db-admin/index.d.ts.map +1 -0
- package/dist/db-admin/index.js +2 -0
- package/dist/db-admin/index.js.map +1 -0
- package/dist/db-admin/operations.d.ts +26 -5
- package/dist/db-admin/operations.d.ts.map +1 -1
- package/dist/db-admin/operations.js +66 -55
- package/dist/db-admin/operations.js.map +1 -1
- package/dist/jobs/scheduler.js +17 -10
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/localization/default-messages.d.ts +3 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +3 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/notifications/routes.d.ts +2 -2
- 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/provider-api/corpus-jobs.d.ts +2 -2
- 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/builder-design-systems.d.ts +61 -0
- package/dist/server/builder-design-systems.d.ts.map +1 -1
- package/dist/server/builder-design-systems.js +219 -14
- package/dist/server/builder-design-systems.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 +2 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +2 -1
- 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/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/app/root.tsx +47 -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 +7 -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/app/root.tsx +47 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"collab-plugin.js","sourceRoot":"","sources":["../../src/server/collab-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Nitro plugin that mounts collaborative editing routes.\n *\n * Templates opt in with one line:\n * ```ts\n * // server/plugins/collab.ts\n * import { createCollabPlugin } from \"@agent-native/core/server\";\n * export default createCollabPlugin({ table: \"documents\", contentColumn: \"content\" });\n * ```\n */\n\nimport {\n defineEventHandler,\n getMethod,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\n\nimport { postAwareness, getActiveUsers } from \"../collab/awareness.js\";\nimport { getCollabEmitter } from \"../collab/emitter.js\";\nimport {\n getCollabState,\n postCollabUpdate,\n postCollabText,\n postCollabSearchReplace,\n} from \"../collab/routes.js\";\nimport { hasCollabState } from \"../collab/storage.js\";\nimport {\n postCollabJson,\n getCollabJson,\n postCollabPatch,\n} from \"../collab/struct-routes.js\";\nimport { seedFromText, seedFromJson } from \"../collab/ydoc-manager.js\";\nimport { getDbExec } from \"../db/client.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { resolveAccess, assertAccess } from \"../sharing/access.js\";\nimport { getSession } from \"./auth.js\";\nimport { FRAMEWORK_ROUTE_PREFIX } from \"./core-routes-plugin.js\";\nimport { getH3App, awaitBootstrap } from \"./framework-request-handler.js\";\nimport { recordChange } from \"./poll.js\";\nimport { runWithRequestContext } from \"./request-context.js\";\n\ntype NitroPluginDef = (nitroApp: any) => void | Promise<void>;\n\n/** Default maximum body size in bytes for collab write operations (2 MB). */\nconst DEFAULT_MAX_PAYLOAD_BYTES = 2 * 1024 * 1024;\n\n/**\n * Whether the no-resourceType warning has already been logged once per server\n * process. Avoids flooding logs on every request in templates that deliberately\n * have no sharing model.\n */\nlet _unscoped_warning_logged = false;\n\nexport interface CollabPluginOptions {\n /** Table name containing document content. Default: \"documents\" */\n table?: string;\n /** Column name for text content. Default: \"content\" */\n contentColumn?: string;\n /** Column name for the document ID. Default: \"id\" */\n idColumn?: string;\n /** Whether to auto-seed existing documents on startup. Default: true */\n autoSeed?: boolean;\n /**\n * Callback invoked after a collab update to sync the content column.\n * If not provided, the plugin auto-syncs using table/contentColumn/idColumn.\n */\n onContentSync?: (docId: string, text: string) => Promise<void>;\n /** Content type: \"text\" for Y.Text (default) or \"json\" for Y.Map/Y.Array. */\n contentType?: \"text\" | \"json\";\n /** Column name for JSON content (used when contentType is \"json\"). */\n jsonColumn?: string;\n /**\n * The shareable resource type registered via `registerShareableResource`.\n * Used to enforce access checks on collab routes.\n * Omit only for resources that are always public (no sharing model).\n */\n resourceType?: string;\n /**\n * Map the collab document id to the shareable resource id. Many templates\n * use route-specific collab ids (for example, one doc per slide inside a\n * deck) while sharing is enforced at the parent resource level.\n */\n resolveResourceId?: (docId: string) => string | null | Promise<string | null>;\n /**\n * Maximum allowed body size in bytes for write operations\n * (update/text/json/patch). Requests exceeding this are rejected with 413.\n * Default: 2097152 (2 MB).\n */\n maxPayloadBytes?: number;\n}\n\nexport function createCollabPlugin(\n options: CollabPluginOptions = {},\n): NitroPluginDef {\n const {\n table = \"documents\",\n contentColumn = \"content\",\n idColumn = \"id\",\n autoSeed = true,\n resourceType,\n resolveResourceId,\n maxPayloadBytes = DEFAULT_MAX_PAYLOAD_BYTES,\n } = options;\n\n return async (nitroApp: any) => {\n await awaitBootstrap(nitroApp);\n const P = FRAMEWORK_ROUTE_PREFIX;\n\n // Wire collab emitter → poll ring buffer so clients receive Yjs updates.\n // Security: when resourceType is configured, resolve the resource's\n // owner/org so getChangesSinceForUser can scope delivery. We use\n // resolveAccess to obtain the resource row — it already handles ownership,\n // visibility, and share rows. Rather than trying to enumerate every sharee\n // (which would require querying the shares table for every update), the\n // conservative strategy is:\n // • tag the event with the resource owner's email and org (owner-scoped).\n // • non-owner sharees who have explicit viewer+ access will NOT receive\n // the push event; they fall back to the state-vector catch-up via the\n // poll loop. This is safe (never delivers to someone without access)\n // at the cost of sharees seeing slightly higher latency (state-vector\n // fetch on the next poll cycle) rather than the push path.\n // See also: SECURITY comment in poll.ts on getChangesSinceForUser.\n if (!resourceType && !_unscoped_warning_logged) {\n _unscoped_warning_logged = true;\n console.warn(\n \"[collab] WARNING: createCollabPlugin called without resourceType. \" +\n \"Collab events will be delivered to ALL authenticated users on this deployment \" +\n \"without document-level access scoping. Set resourceType to enable access-scoped delivery.\",\n );\n }\n\n const collabEmitter = getCollabEmitter();\n collabEmitter.on(\"collab\", async (event) => {\n if (!resourceType) {\n // No access model — broadcast to all authenticated users (no owner/orgId tag).\n recordChange(event);\n return;\n }\n\n // Resolve the resource to learn its owner/org so we can scope the event.\n const docId = event.docId as string | undefined;\n if (!docId) {\n recordChange(event);\n return;\n }\n\n try {\n const resourceId = resolveResourceId\n ? await resolveResourceId(docId)\n : docId;\n if (!resourceId) {\n // Cannot resolve resource — drop the event to avoid leaking to\n // unauthorized pollers. The client will catch up via state-vector.\n return;\n }\n\n // Load the resource row to get owner/org. resolveAccess fetches the\n // resource row internally; use getShareableResource to read it cheaply.\n const { requireShareableResource } =\n await import(\"../sharing/registry.js\");\n const reg = requireShareableResource(resourceType);\n const db = reg.getDb() as any;\n const { eq } = await import(\"drizzle-orm\");\n const [resource] = await db\n .select()\n .from(reg.resourceTable)\n .where(eq(reg.resourceTable.id, resourceId))\n .limit(1);\n\n if (!resource) {\n // Resource deleted — drop silently.\n return;\n }\n\n const ownerEmail =\n typeof resource.ownerEmail === \"string\"\n ? resource.ownerEmail\n : undefined;\n const orgId =\n typeof resource.orgId === \"string\" ? resource.orgId : undefined;\n\n // Tag the event with owner/org. Non-owner sharees fall back to poll;\n // this is acceptable (see comment above).\n recordChange({\n ...event,\n ...(ownerEmail ? { owner: ownerEmail } : {}),\n ...(orgId ? { orgId } : {}),\n });\n } catch {\n // If we fail to resolve the resource (DB not ready, etc.) we skip\n // the event rather than broadcasting it without scoping.\n }\n });\n\n // Mount collab routes — manual method dispatch since the path layout is\n // `/collab/:docId/<action>`. The framework strips the `/collab` mount\n // prefix from event.url.pathname before calling us, so we see e.g.\n // `/abc-123/state`.\n getH3App(nitroApp).use(\n `${P}/collab`,\n defineEventHandler(async (event: H3Event) => {\n const parts = (event.url?.pathname || \"\")\n .replace(/^\\/+/, \"\")\n .split(\"/\");\n const docId = parts[0] || \"\";\n const action = parts[1] || \"\";\n if (!docId) return;\n if (event.context) {\n event.context.params = { ...event.context.params, docId };\n }\n const method = getMethod(event);\n\n // Auth check — all collab routes require a session\n const session = await getSession(event).catch(() => null);\n if (!session?.email) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n\n const orgCtx = await getOrgContext(event).catch(() => null);\n const userEmail = session.email;\n const orgId = orgCtx?.orgId ?? undefined;\n\n return runWithRequestContext({ userEmail, orgId }, async () => {\n // Access check — require at least viewer for reads, editor for writes.\n // Awareness routes (POST awareness / GET users) require the same\n // level as other reads so that knowledge of who is editing a doc\n // doesn't leak to users without access.\n if (resourceType) {\n const resourceId = resolveResourceId\n ? await resolveResourceId(docId)\n : docId;\n if (!resourceId) {\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n }\n const isWrite =\n (action === \"update\" && method === \"POST\") ||\n (action === \"text\" && method === \"POST\") ||\n (action === \"search-replace\" && method === \"POST\") ||\n (action === \"json\" && method === \"POST\") ||\n (action === \"patch\" && method === \"POST\");\n\n if (isWrite) {\n // assertAccess throws ForbiddenError (→ 403) if no editor access\n await assertAccess(resourceType, resourceId, \"editor\");\n } else {\n // resolveAccess returns null when no access; return 404 to avoid leaking existence\n const access = await resolveAccess(resourceType, resourceId);\n if (!access) {\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n }\n }\n }\n\n // Payload size limit for write operations\n const isWriteAction =\n (action === \"update\" && method === \"POST\") ||\n (action === \"text\" && method === \"POST\") ||\n (action === \"search-replace\" && method === \"POST\") ||\n (action === \"json\" && method === \"POST\") ||\n (action === \"patch\" && method === \"POST\");\n\n if (isWriteAction) {\n const contentLength = Number(\n event.headers?.get?.(\"content-length\") ?? NaN,\n );\n if (!isNaN(contentLength) && contentLength > maxPayloadBytes) {\n setResponseStatus(event, 413);\n return {\n error: `Payload too large. Maximum is ${maxPayloadBytes} bytes.`,\n };\n }\n // Store limit in context so route handlers can enforce it on the\n // parsed body when content-length is absent or spoofed.\n if (event.context) {\n event.context._collabMaxPayloadBytes = maxPayloadBytes;\n }\n }\n\n if (action === \"state\" && method === \"GET\")\n return getCollabState(event);\n if (action === \"update\" && method === \"POST\")\n return postCollabUpdate(event);\n if (action === \"text\" && method === \"POST\")\n return postCollabText(event);\n if (action === \"search-replace\" && method === \"POST\")\n return postCollabSearchReplace(event);\n if (action === \"json\" && method === \"POST\")\n return postCollabJson(event);\n if (action === \"json\" && method === \"GET\")\n return getCollabJson(event);\n if (action === \"patch\" && method === \"POST\")\n return postCollabPatch(event);\n if (action === \"awareness\" && method === \"POST\")\n return postAwareness(event);\n if (action === \"users\" && method === \"GET\")\n return getActiveUsers(event);\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n });\n }),\n );\n\n // Auto-seed existing documents into collab state\n if (autoSeed) {\n const isJson = options.contentType === \"json\";\n const seedColumn = isJson\n ? options.jsonColumn || contentColumn\n : contentColumn;\n\n // Run in background so it doesn't block startup\n setTimeout(async () => {\n try {\n const client = getDbExec();\n const { rows } = await client.execute(\n `SELECT ${idColumn}, ${seedColumn} FROM ${table}`,\n );\n for (const row of rows) {\n const docId = row[idColumn] as string;\n const exists = await hasCollabState(docId);\n if (exists) continue;\n\n if (isJson) {\n const raw = (row[seedColumn] as string) ?? \"{}\";\n try {\n const parsed = JSON.parse(raw);\n const inferredType: \"map\" | \"array\" = Array.isArray(parsed)\n ? \"array\"\n : \"map\";\n await seedFromJson(docId, parsed, \"data\", inferredType);\n } catch {\n // Invalid JSON — skip\n }\n } else {\n const content = (row[seedColumn] as string) ?? \"\";\n await seedFromText(docId, content);\n }\n }\n } catch {\n // Table may not exist yet on first boot — that's fine\n }\n }, 1000);\n }\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"collab-plugin.js","sourceRoot":"","sources":["../../src/server/collab-plugin.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Nitro plugin that mounts collaborative editing routes.\n *\n * Templates opt in with one line:\n * ```ts\n * // server/plugins/collab.ts\n * import { createCollabPlugin } from \"@agent-native/core/server\";\n * export default createCollabPlugin({ table: \"documents\", contentColumn: \"content\" });\n * ```\n */\n\nimport {\n defineEventHandler,\n getMethod,\n setResponseStatus,\n type H3Event,\n} from \"h3\";\n\nimport { postAwareness, getActiveUsers } from \"../collab/awareness.js\";\nimport { getCollabEmitter } from \"../collab/emitter.js\";\nimport {\n getCollabState,\n postCollabUpdate,\n postCollabText,\n postCollabSearchReplace,\n} from \"../collab/routes.js\";\nimport { hasCollabState } from \"../collab/storage.js\";\nimport {\n postCollabJson,\n getCollabJson,\n postCollabPatch,\n} from \"../collab/struct-routes.js\";\nimport { seedFromText, seedFromJson } from \"../collab/ydoc-manager.js\";\nimport { getDbExec } from \"../db/client.js\";\nimport { getOrgContext } from \"../org/context.js\";\nimport { resolveAccess, assertAccess } from \"../sharing/access.js\";\nimport { getSession } from \"./auth.js\";\nimport { FRAMEWORK_ROUTE_PREFIX } from \"./core-routes-plugin.js\";\nimport { getH3App, awaitBootstrap } from \"./framework-request-handler.js\";\nimport { recordChange } from \"./poll.js\";\nimport { runWithRequestContext } from \"./request-context.js\";\n\ntype NitroPluginDef = (nitroApp: any) => void | Promise<void>;\n\n/** Default maximum body size in bytes for collab write operations (2 MB). */\nconst DEFAULT_MAX_PAYLOAD_BYTES = 2 * 1024 * 1024;\n\ntype CollabAwarenessScope = {\n owner?: string;\n orgId?: string;\n resourceType?: string;\n resourceId?: string;\n};\n\n/**\n * Whether the no-resourceType warning has already been logged once per server\n * process. Avoids flooding logs on every request in templates that deliberately\n * have no sharing model.\n */\nlet _unscoped_warning_logged = false;\n\nexport interface CollabPluginOptions {\n /** Table name containing document content. Default: \"documents\" */\n table?: string;\n /** Column name for text content. Default: \"content\" */\n contentColumn?: string;\n /** Column name for the document ID. Default: \"id\" */\n idColumn?: string;\n /** Whether to auto-seed existing documents on startup. Default: true */\n autoSeed?: boolean;\n /**\n * Callback invoked after a collab update to sync the content column.\n * If not provided, the plugin auto-syncs using table/contentColumn/idColumn.\n */\n onContentSync?: (docId: string, text: string) => Promise<void>;\n /** Content type: \"text\" for Y.Text (default) or \"json\" for Y.Map/Y.Array. */\n contentType?: \"text\" | \"json\";\n /** Column name for JSON content (used when contentType is \"json\"). */\n jsonColumn?: string;\n /**\n * The shareable resource type registered via `registerShareableResource`.\n * Used to enforce access checks on collab routes.\n * Omit only for resources that are always public (no sharing model).\n */\n resourceType?: string;\n /**\n * Map the collab document id to the shareable resource id. Many templates\n * use route-specific collab ids (for example, one doc per slide inside a\n * deck) while sharing is enforced at the parent resource level.\n */\n resolveResourceId?: (docId: string) => string | null | Promise<string | null>;\n /**\n * Maximum allowed body size in bytes for write operations\n * (update/text/json/patch). Requests exceeding this are rejected with 413.\n * Default: 2097152 (2 MB).\n */\n maxPayloadBytes?: number;\n}\n\nexport function createCollabPlugin(\n options: CollabPluginOptions = {},\n): NitroPluginDef {\n const {\n table = \"documents\",\n contentColumn = \"content\",\n idColumn = \"id\",\n autoSeed = true,\n resourceType,\n resolveResourceId,\n maxPayloadBytes = DEFAULT_MAX_PAYLOAD_BYTES,\n } = options;\n\n return async (nitroApp: any) => {\n await awaitBootstrap(nitroApp);\n const P = FRAMEWORK_ROUTE_PREFIX;\n\n // Wire collab emitter → poll ring buffer so clients receive Yjs updates.\n // Security: when resourceType is configured, resolve the resource's\n // owner/org so getChangesSinceForUser can scope delivery. We use\n // resolveAccess to obtain the resource row — it already handles ownership,\n // visibility, and share rows. In addition to the owner/org tags we also\n // tag the event with `resourceType` + `resourceId` so the per-user\n // delivery filter (canSeeChangeForUser) can evaluate resource access\n // directly for non-owner sharees:\n // • tag the event with the resource owner's email and org (owner-scoped)\n // for backward compatibility with the conservative owner/org fast path.\n // • ALSO tag with resourceType/resourceId so canSeeChangeForUser can run\n // an access-aware (cached) check and push to explicit viewer+ sharees\n // who don't match owner/org — instead of only degrading them to the\n // poll fallback.\n // See also: SECURITY comment in poll.ts on canSeeChangeForUser.\n if (!resourceType && !_unscoped_warning_logged) {\n _unscoped_warning_logged = true;\n console.warn(\n \"[collab] WARNING: createCollabPlugin called without resourceType. \" +\n \"Collab events will be delivered to ALL authenticated users on this deployment \" +\n \"without document-level access scoping. Set resourceType to enable access-scoped delivery.\",\n );\n }\n\n const collabEmitter = getCollabEmitter();\n collabEmitter.on(\"collab\", async (event) => {\n if (!resourceType) {\n // No access model — broadcast to all authenticated users (no owner/orgId tag).\n recordChange(event);\n return;\n }\n\n // Resolve the resource to learn its owner/org so we can scope the event.\n const docId = event.docId as string | undefined;\n if (!docId) {\n recordChange(event);\n return;\n }\n\n try {\n const resourceId = resolveResourceId\n ? await resolveResourceId(docId)\n : docId;\n if (!resourceId) {\n // Cannot resolve resource — drop the event to avoid leaking to\n // unauthorized pollers. The client will catch up via state-vector.\n return;\n }\n\n // Load the resource row to get owner/org. resolveAccess fetches the\n // resource row internally; use getShareableResource to read it cheaply.\n const { requireShareableResource } =\n await import(\"../sharing/registry.js\");\n const reg = requireShareableResource(resourceType);\n const db = reg.getDb() as any;\n const { eq } = await import(\"drizzle-orm\");\n const [resource] = await db\n .select()\n .from(reg.resourceTable)\n .where(eq(reg.resourceTable.id, resourceId))\n .limit(1);\n\n if (!resource) {\n // Resource deleted — drop silently.\n return;\n }\n\n const ownerEmail =\n typeof resource.ownerEmail === \"string\"\n ? resource.ownerEmail\n : undefined;\n const orgId =\n typeof resource.orgId === \"string\" ? resource.orgId : undefined;\n\n // Tag the event with owner/org (backward-compat fast path) AND with\n // resourceType/resourceId so canSeeChangeForUser can run an\n // access-aware check for non-owner sharees (see poll.ts).\n recordChange({\n ...event,\n ...(ownerEmail ? { owner: ownerEmail } : {}),\n ...(orgId ? { orgId } : {}),\n resourceType,\n resourceId,\n });\n } catch {\n // If we fail to resolve the resource (DB not ready, etc.) we skip\n // the event rather than broadcasting it without scoping.\n }\n });\n\n // Mount collab routes — manual method dispatch since the path layout is\n // `/collab/:docId/<action>`. The framework strips the `/collab` mount\n // prefix from event.url.pathname before calling us, so we see e.g.\n // `/abc-123/state`.\n getH3App(nitroApp).use(\n `${P}/collab`,\n defineEventHandler(async (event: H3Event) => {\n const parts = (event.url?.pathname || \"\")\n .replace(/^\\/+/, \"\")\n .split(\"/\");\n const docId = parts[0] || \"\";\n const action = parts[1] || \"\";\n if (!docId) return;\n if (event.context) {\n event.context.params = { ...event.context.params, docId };\n }\n const method = getMethod(event);\n\n // Auth check — all collab routes require a session\n const session = await getSession(event).catch(() => null);\n if (!session?.email) {\n setResponseStatus(event, 401);\n return { error: \"Authentication required\" };\n }\n\n const orgCtx = await getOrgContext(event).catch(() => null);\n const userEmail = session.email;\n const orgId = orgCtx?.orgId ?? undefined;\n\n return runWithRequestContext({ userEmail, orgId }, async () => {\n // Access check — require at least viewer for reads, editor for writes.\n // Awareness routes (POST awareness / GET users) require the same\n // level as other reads so that knowledge of who is editing a doc\n // doesn't leak to users without access.\n if (resourceType) {\n const resourceId = resolveResourceId\n ? await resolveResourceId(docId)\n : docId;\n if (!resourceId) {\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n }\n const isWrite =\n (action === \"update\" && method === \"POST\") ||\n (action === \"text\" && method === \"POST\") ||\n (action === \"search-replace\" && method === \"POST\") ||\n (action === \"json\" && method === \"POST\") ||\n (action === \"patch\" && method === \"POST\");\n\n if (isWrite) {\n // assertAccess throws ForbiddenError (→ 403) if no editor access\n const access = await assertAccess(\n resourceType,\n resourceId,\n \"editor\",\n );\n const resource = access.resource as Record<string, unknown>;\n const awarenessScope: CollabAwarenessScope = {\n resourceType,\n resourceId,\n ...(typeof resource.ownerEmail === \"string\"\n ? { owner: resource.ownerEmail }\n : {}),\n ...(typeof resource.orgId === \"string\"\n ? { orgId: resource.orgId }\n : {}),\n };\n if (event.context) {\n event.context._collabAwarenessScope = awarenessScope;\n }\n } else {\n // resolveAccess returns null when no access; return 404 to avoid leaking existence\n const access = await resolveAccess(resourceType, resourceId);\n if (!access) {\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n }\n const resource = access.resource as Record<string, unknown>;\n const awarenessScope: CollabAwarenessScope = {\n resourceType,\n resourceId,\n ...(typeof resource.ownerEmail === \"string\"\n ? { owner: resource.ownerEmail }\n : {}),\n ...(typeof resource.orgId === \"string\"\n ? { orgId: resource.orgId }\n : {}),\n };\n if (event.context) {\n event.context._collabAwarenessScope = awarenessScope;\n }\n }\n }\n\n // Payload size limit for write operations\n const isWriteAction =\n (action === \"update\" && method === \"POST\") ||\n (action === \"text\" && method === \"POST\") ||\n (action === \"search-replace\" && method === \"POST\") ||\n (action === \"json\" && method === \"POST\") ||\n (action === \"patch\" && method === \"POST\");\n\n if (isWriteAction) {\n const contentLength = Number(\n event.headers?.get?.(\"content-length\") ?? NaN,\n );\n if (!isNaN(contentLength) && contentLength > maxPayloadBytes) {\n setResponseStatus(event, 413);\n return {\n error: `Payload too large. Maximum is ${maxPayloadBytes} bytes.`,\n };\n }\n // Store limit in context so route handlers can enforce it on the\n // parsed body when content-length is absent or spoofed.\n if (event.context) {\n event.context._collabMaxPayloadBytes = maxPayloadBytes;\n }\n }\n\n if (action === \"state\" && method === \"GET\")\n return getCollabState(event);\n if (action === \"update\" && method === \"POST\")\n return postCollabUpdate(event);\n if (action === \"text\" && method === \"POST\")\n return postCollabText(event);\n if (action === \"search-replace\" && method === \"POST\")\n return postCollabSearchReplace(event);\n if (action === \"json\" && method === \"POST\")\n return postCollabJson(event);\n if (action === \"json\" && method === \"GET\")\n return getCollabJson(event);\n if (action === \"patch\" && method === \"POST\")\n return postCollabPatch(event);\n if (action === \"awareness\" && method === \"POST\")\n return postAwareness(event);\n if (action === \"users\" && method === \"GET\")\n return getActiveUsers(event);\n setResponseStatus(event, 404);\n return { error: \"Not found\" };\n });\n }),\n );\n\n // Auto-seed existing documents into collab state\n if (autoSeed) {\n const isJson = options.contentType === \"json\";\n const seedColumn = isJson\n ? options.jsonColumn || contentColumn\n : contentColumn;\n\n // Run in background so it doesn't block startup\n setTimeout(async () => {\n try {\n const client = getDbExec();\n const { rows } = await client.execute(\n `SELECT ${idColumn}, ${seedColumn} FROM ${table}`,\n );\n for (const row of rows) {\n const docId = row[idColumn] as string;\n const exists = await hasCollabState(docId);\n if (exists) continue;\n\n if (isJson) {\n const raw = (row[seedColumn] as string) ?? \"{}\";\n try {\n const parsed = JSON.parse(raw);\n const inferredType: \"map\" | \"array\" = Array.isArray(parsed)\n ? \"array\"\n : \"map\";\n await seedFromJson(docId, parsed, \"data\", inferredType);\n } catch {\n // Invalid JSON — skip\n }\n } else {\n const content = (row[seedColumn] as string) ?? \"\";\n await seedFromText(docId, content);\n }\n }\n } catch {\n // Table may not exist yet on first boot — that's fine\n }\n }, 1000);\n }\n };\n}\n"]}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Pure functions for parsing Tailwind configs, CSS files, package.json,
|
|
5
5
|
* documents, and URLs to extract colors, fonts, spacing, border-radius,
|
|
6
6
|
* and CSS custom properties. Used by the import-* actions across all
|
|
7
|
-
* templates (design
|
|
7
|
+
* templates (design and slides).
|
|
8
8
|
*
|
|
9
9
|
* No framework dependencies — no defineAction, no zod, no drizzle.
|
|
10
10
|
*/
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* Pure functions for parsing Tailwind configs, CSS files, package.json,
|
|
5
5
|
* documents, and URLs to extract colors, fonts, spacing, border-radius,
|
|
6
6
|
* and CSS custom properties. Used by the import-* actions across all
|
|
7
|
-
* templates (design
|
|
7
|
+
* templates (design and slides).
|
|
8
8
|
*
|
|
9
9
|
* No framework dependencies — no defineAction, no zod, no drizzle.
|
|
10
10
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"design-token-utils.js","sourceRoot":"","sources":["../../src/server/design-token-utils.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,6BAA6B,CAAC;AAE5D,8EAA8E;AAC9E,YAAY;AACZ,8EAA8E;AAE9E,kEAAkE;AAClE,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,CAAC;AAE5B,6CAA6C;AAC7C,MAAM,CAAC,MAAM,aAAa,GAAG,GAAG,GAAG,IAAI,CAAC;AAExC,qDAAqD;AACrD,MAAM,CAAC,MAAM,aAAa,GAAG,KAAK,CAAC;AAEnC,uDAAuD;AACvD,MAAM,CAAC,MAAM,aAAa,GAAa;IACrC,yBAAyB;IACzB,wBAAwB;IACxB,iBAAiB;IACjB,kBAAkB;IAClB,iBAAiB;IACjB,QAAQ;CACT,CAAC;AAEF,0EAA0E;AAC1E,MAAM,CAAC,MAAM,eAAe,GAAa;IACvC,YAAY;IACZ,QAAQ;IACR,WAAW;IACX,iBAAiB;IACjB,iBAAiB;IACjB,eAAe;IACf,gBAAgB;IAChB,qBAAqB;CACtB,CAAC;AAEF,6CAA6C;AAC7C,MAAM,CAAC,MAAM,cAAc,GAAG,EAAE,CAAC;AAEjC,mDAAmD;AACnD,MAAM,CAAC,MAAM,oBAAoB,GAAG,GAAG,GAAG,IAAI,CAAC;AAE/C,yDAAyD;AACzD,MAAM,CAAC,MAAM,YAAY,GAAG,+BAA+B,CAAC;AAE5D,6CAA6C;AAC7C,MAAM,CAAC,MAAM,cAAc,GACzB,6NAA6N,CAAC;AAEhO,iEAAiE;AACjE,MAAM,CAAC,MAAM,YAAY,GACvB,0bAA0b,CAAC;AAE7b,uEAAuE;AACvE,MAAM,CAAC,MAAM,iBAAiB,GAC5B,sDAAsD,CAAC;AAEzD,mEAAmE;AACnE,MAAM,CAAC,MAAM,mBAAmB,GAAsC;IACpE,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,UAAU,EAAE;IAC1C,EAAE,IAAI,EAAE,kBAAkB,EAAE,KAAK,EAAE,UAAU,EAAE;IAC/C,EAAE,IAAI,EAAE,mBAAmB,EAAE,KAAK,EAAE,mBAAmB,EAAE;IACzD,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,SAAS,EAAE;IAC5C,EAAE,IAAI,EAAE,iBAAiB,EAAE,KAAK,EAAE,SAAS,EAAE;IAC7C,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/B,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE;IAC/B,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACrC,EAAE,IAAI,EAAE,aAAa,EAAE,KAAK,EAAE,aAAa,EAAE;IAC7C,EAAE,IAAI,EAAE,sBAAsB,EAAE,KAAK,EAAE,iBAAiB,EAAE;IAC1D,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE;IACvC,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IACzC,EAAE,IAAI,EAAE,eAAe,EAAE,KAAK,EAAE,WAAW,EAAE;IAC7C,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE;IACnC,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,OAAO,EAAE;CACrC,CAAC;AA4DF,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E;;;;;;;GAOG;AACH,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACjC,IACE,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,WAAW;QACxB,QAAQ,KAAK,SAAS;QACtB,QAAQ,KAAK,OAAO;QACpB,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC;QAC1B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC;QAC5B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,SAAS,CAAC;QAC9B,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC;QAC/B,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC;QAC9B,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC;QAC3B,QAAQ,KAAK,0BAA0B;QACvC,QAAQ,KAAK,iBAAiB,EAC9B,CAAC;QACD,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,iBAAiB;AACjB,8EAA8E;AAE9E,oEAAoE;AACpE,MAAM,UAAU,cAAc,CAAC,GAAW;IAIxC,MAAM,OAAO,GAAG,GAAG;SAChB,IAAI,EAAE;SACN,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;SACtB,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAEvB,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,+DAA+D,CAChE,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IACrE,IAAI,SAAS,EAAE,CAAC;QACd,OAAO,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IACrD,CAAC;IACD,MAAM,QAAQ,GAAG,OAAO,CAAC,KAAK,CAC5B,sDAAsD,CACvD,CAAC;IACF,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC;IACnD,CAAC;IACD,MAAM,IAAI,KAAK,CACb,8CAA8C;QAC5C,8FAA8F,CACjG,CAAC;AACJ,CAAC;AAED,gFAAgF;AAChF,SAAS,aAAa,CACpB,MAAc,EACd,OAAO,GAAuB,EAAE;IAEhC,OAAO;QACL,MAAM,EAAE,MAAM;QACd,YAAY,EAAE,iBAAiB;QAC/B,GAAG,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,UAAU,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvE,CAAC;AACJ,CAAC;AAED,6EAA6E;AAC7E,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,KAAa,EACb,IAAY,EACZ,IAAY,EACZ,OAAO,GAAuB,EAAE;IAEhC,MAAM,GAAG,GAAG,gCAAgC,KAAK,IAAI,IAAI,aAAa,IAAI,EAAE,CAAC;IAC7E,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE;QACnC,OAAO,EAAE,aAAa,CAAC,gCAAgC,EAAE,OAAO,CAAC;QACjE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC;KAC3C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,IAAI,OAA2B,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAA0B,CAAC;YACzD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ;gBAAE,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC;QAC/D,CAAC;QAAC,MAAM,CAAC;YACP,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;gBAC9B,IAAI,IAAI;oBAAE,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;YACzC,CAAC;YAAC,MAAM,CAAC;gBACP,+BAA+B;YACjC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAM,EAAE,CAAC;AACzE,CAAC;AAED,gFAAgF;AAChF,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,KAAa,EACb,IAAY,EACZ,IAAY,EACZ,OAAO,GAAuB,EAAE;IAEhC,MAAM,MAAM,GAAG,MAAM,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;IACvE,OAAO,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;AACxC,CAAC;AAED,8FAA8F;AAC9F,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,KAAa,EACb,IAAY,EACZ,IAAY,EACZ,OAAO,GAAuB,EAAE;IAEhC,MAAM,GAAG,GAAG,gCAAgC,KAAK,IAAI,IAAI,aAAa,IAAI,EAAE,CAAC;IAC7E,WAAW,CAAC,GAAG,CAAC,CAAC;IACjB,MAAM,GAAG,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE;QACnC,OAAO,EAAE,aAAa,CAAC,+BAA+B,EAAE,OAAO,CAAC;QAChE,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,aAAa,CAAC;KAC3C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE;QAAE,OAAO,IAAI,CAAC;IAEzB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;IAC7C,IAAI,EAAE,IAAI,QAAQ,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,aAAa;QAAE,OAAO,IAAI,CAAC;IAExD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,IAAI,CAAC,MAAM,GAAG,aAAa;QAAE,OAAO,IAAI,CAAC;IAC7C,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,yBAAyB;AACzB,8EAA8E;AAE9E,uFAAuF;AACvF,MAAM,UAAU,mBAAmB,CAAC,OAAe;IACjD,MAAM,MAAM,GAA4B,EAAE,CAAC;IAE3C,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAC/B,8CAA8C,CAC/C,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,IAAI,CAAC;YACH,MAAM,MAAM,GAA2B,EAAE,CAAC;YAC1C,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CACnC,4CAA4C,CAC7C,CAAC;YACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;gBACtB,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;YACtB,CAAC;YACD,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;QAC7D,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;QACT,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAC7B,kDAAkD,CACnD,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CACjC,kDAAkD,CACnD,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,UAAU,GAAG,KAAK,CAAC;IAC/D,CAAC;IAED,MAAM,YAAY,GAAG,OAAO,CAAC,KAAK,CAChC,+CAA+C,CAChD,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,OAAO,GAA2B,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,QAAQ,CACpC,6CAA6C,CAC9C,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACvB,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,OAAO,GAAG,OAAO,CAAC;IAChE,CAAC;IAED,MAAM,WAAW,GAAG,OAAO,CAAC,KAAK,CAC/B,oDAAoD,CACrD,CAAC;IACF,IAAI,WAAW,EAAE,CAAC;QAChB,MAAM,KAAK,GAA2B,EAAE,CAAC;QACzC,MAAM,KAAK,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CACnC,4CAA4C,CAC7C,CAAC;QACF,KAAK,MAAM,CAAC,IAAI,KAAK,EAAE,CAAC;YACtB,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrB,CAAC;QACD,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,MAAM,CAAC,YAAY,GAAG,KAAK,CAAC;IACjE,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,8EAA8E;AAC9E,aAAa;AACb,8EAA8E;AAE9E,oFAAoF;AACpF,MAAM,UAAU,QAAQ,CAAC,OAAe;IACtC,MAAM,mBAAmB,GAA2B,EAAE,CAAC;IACvD,MAAM,UAAU,GAAG,OAAO,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IACpE,KAAK,MAAM,CAAC,IAAI,UAAU,EAAE,CAAC;QAC3B,mBAAmB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACjD,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IACtE,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE,CAAC;QAChC,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACxE,IAAI,WAAW;YAAE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;IACrD,CAAC;IAED,MAAM,aAAa,GAAG,OAAO,CAAC,QAAQ,CACpC,qEAAqE,CACtE,CAAC;IACF,KAAK,MAAM,CAAC,IAAI,aAAa,EAAE,CAAC;QAC9B,MAAM,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,qBAAqB,CAAC,CAAC;QACtD,IAAI,WAAW,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,CAAC;QACrE,CAAC;IACH,CAAC;IAED,OAAO;QACL,mBAAmB,EACjB,MAAM,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,MAAM,GAAG,CAAC;YACzC,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,SAAS;QACf,KAAK,EAAE,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS;KAC1D,CAAC;AACJ,CAAC;AAED,8EAA8E;AAC9E,8BAA8B;AAC9B,8EAA8E;AAE9E,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB,CAAC,OAAe;IACpD,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QAChC,MAAM,GAAG,GAAG;YACV,GAAG,GAAG,CAAC,YAAY;YACnB,GAAG,GAAG,CAAC,eAAe;SACvB,CAAC;QACF,IAAI,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,kBAAkB,CAAC;YAAE,OAAO,aAAa,CAAC;QACxE,IAAI,GAAG,CAAC,mBAAmB,CAAC;YAAE,OAAO,mBAAmB,CAAC;QACzD,IAAI,GAAG,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,iBAAiB,CAAC;YAAE,OAAO,SAAS,CAAC;QACtE,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,CAAC;YAAE,OAAO,MAAM,CAAC;QACnD,IAAI,GAAG,CAAC,MAAM,CAAC;YAAE,OAAO,MAAM,CAAC;QAC/B,IAAI,GAAG,CAAC,sBAAsB,CAAC;YAAE,OAAO,iBAAiB,CAAC;QAC1D,IAAI,GAAG,CAAC,UAAU,CAAC;YAAE,OAAO,UAAU,CAAC;QACvC,IAAI,GAAG,CAAC,QAAQ,CAAC;YAAE,OAAO,QAAQ,CAAC;QACnC,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,2CAA2C;AAC3C,8EAA8E;AAE9E,0DAA0D;AAC1D,MAAM,UAAU,uBAAuB;IACrC,OAAO;QACL,MAAM,EAAE,EAAE;QACV,mBAAmB,EAAE,EAAE;QACvB,KAAK,EAAE,EAAE;QACT,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,EAAE;QAChB,gBAAgB,EAAE,IAAI;QACtB,WAAW,EAAE,EAAE;QACf,SAAS,EAAE,IAAI,GAAG,EAAU;KAC7B,CAAC;AACJ,CAAC;AAED,yDAAyD;AACzD,MAAM,UAAU,OAAO,CACrB,KAAwB,EACxB,MAAc,EACd,MAAe;IAEf,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACtD,IAAI,CAAC,UAAU,IAAI,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;QAAE,OAAO;IACzE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9C,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,CAAC;AACnD,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,cAAc,CAC5B,KAAwB,EACxB,OAAe;IAEf,MAAM,OAAO,GAAG,8BAA8B,CAAC;IAC/C,IAAI,KAAK,CAAC;IACV,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC9B,KAAK,CAAC,mBAAmB,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAExC,IACE,oFAAoF,CAAC,IAAI,CACvF,KAAK,CAAC,CAAC,CAAC,CACT,EACD,CAAC;YACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC7B,CAAC;aAAM,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC9D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QAC9B,CAAC;aAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC5C,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;QACnC,CAAC;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,iBAAiB,CAC/B,KAAwB,EACxB,OAAe;IAEf,MAAM,UAAU,GAAG,sBAAsB,CAAC;IAC1C,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GACd,2DAA2D,CAAC;IAC9D,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,UAAU,GACd,mEAAmE,CAAC;IACtE,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QAC/C,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,YAAY,GAChB,+DAA+D,CAAC;IAClE,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;AACH,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,gBAAgB,CAC9B,KAAwB,EACxB,OAAe,EACf,QAAgB;IAEhB,MAAM,iBAAiB,GAAG,sCAAsC,CAAC;IACjE,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACjC,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YAChD,IACE,OAAO;gBACP,CAAC,2EAA2E,CAAC,IAAI,CAC/E,OAAO,CACR,EACD,CAAC;gBACD,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACpC,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,eAAe,GAAG,2BAA2B,CAAC;IACpD,OAAO,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACnB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACzE,IAAI,WAAW,EAAE,CAAC;YAChB,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,CAAC;IACH,CAAC;AACH,CAAC;AAED,wEAAwE;AACxE,MAAM,UAAU,cAAc,CAC5B,KAAwB,EACxB,OAAe,EACf,QAAgB;IAEhB,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAC/B,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAClC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC,CAAC;AAC5E,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,qBAAqB,CACnC,KAAwB,EACxB,OAAe,EACf,QAAgB;IAEhB,KAAK,CAAC,gBAAgB,GAAG,UAAU,CAAC;IAEpC,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IACtE,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,4CAA4C,CAAC;QACjE,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED,MAAM,oBAAoB,GAAG,OAAO,CAAC,KAAK,CAAC,iCAAiC,CAAC,CAAC;IAC9E,IAAI,oBAAoB,EAAE,CAAC;QACzB,MAAM,eAAe,GAAG,kDAAkD,CAAC;QAC3E,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACpE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QACjC,CAAC;IACH,CAAC;IAED,MAAM,iBAAiB,GAAG,OAAO,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxE,IAAI,iBAAiB,EAAE,CAAC;QACtB,MAAM,WAAW,GAAG,6CAA6C,CAAC;QAClE,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC7D,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;IAED,MAAM,gBAAgB,GAAG,OAAO,CAAC,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC5E,IAAI,gBAAgB,EAAE,CAAC;QACrB,MAAM,WAAW,GAAG,4CAA4C,CAAC;QACjE,IAAI,CAAC,CAAC;QACN,OAAO,CAAC,CAAC,GAAG,WAAW,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5D,KAAK,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAElC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;QACrB,QAAQ;QACR,IAAI,EAAE,iBAAiB;QACvB,IAAI,EAAE;YACJ,SAAS,EAAE,CAAC,CAAC,gBAAgB;YAC7B,aAAa,EAAE,CAAC,CAAC,oBAAoB;YACrC,UAAU,EAAE,CAAC,CAAC,iBAAiB;YAC/B,eAAe,EAAE,CAAC,CAAC,gBAAgB;SACpC;KACF,CAAC,CAAC;AACL,CAAC;AAED,qEAAqE;AACrE,MAAM,UAAU,gBAAgB,CAC9B,KAAwB,EACxB,OAAe,EACf,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,IAAI,GAAG,CAAC,GAA4B,EAAE,MAAc,EAAE,EAAE;YAC5D,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAC/C,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;gBAC/C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;oBAC9B,MAAM,KAAK,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;oBAChC,IACE,mEAAmE,CAAC,IAAI,CACtE,KAAK,CACN;wBACD,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,EACjC,CAAC;wBACD,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;oBAC7B,CAAC;yBAAM,IAAI,uBAAuB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC/C,OAAO,CAAC,KAAK,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;oBAClC,CAAC;yBAAM,IAAI,mCAAmC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3D,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;oBAC9B,CAAC;yBAAM,IAAI,iBAAiB,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;wBACzC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC;oBACnC,CAAC;gBACH,CAAC;qBAAM,IACL,KAAK;oBACL,OAAO,KAAK,KAAK,QAAQ;oBACzB,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EACrB,CAAC;oBACD,IAAI,CAAC,KAAgC,EAAE,IAAI,CAAC,CAAC;gBAC/C,CAAC;YACH,CAAC;QACH,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACf,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACrB,QAAQ;YACR,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;SAClC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACrB,QAAQ;YACR,IAAI,EAAE,YAAY;YAClB,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,kBAAkB,CAChC,KAAwB,EACxB,OAAe,EACf,QAAgB;IAEhB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACjC,MAAM,OAAO,GAAG;YACd,GAAG,IAAI,CAAC,YAAY;YACpB,GAAG,IAAI,CAAC,eAAe;SACxB,CAAC;QAEF,MAAM,QAAQ,GAAa,EAAE,CAAC;QAC9B,KAAK,MAAM,EAAE,IAAI,mBAAmB,EAAE,CAAC;YACrC,IAAI,OAAO,IAAI,EAAE,CAAC,IAAI,IAAI,OAAO,EAAE,CAAC;gBAClC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;gBACxB,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;oBAC5B,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC,KAAK,CAAC;gBACpC,CAAC;YACH,CAAC;QACH,CAAC;QAED,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACrB,QAAQ;YACR,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE;SAChC,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;QACP,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACrB,QAAQ;YACR,IAAI,EAAE,cAAc;YACpB,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE;SAC3B,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,2EAA2E;AAC3E,MAAM,UAAU,sBAAsB,CACpC,KAAwB,EACxB,OAAe,EACf,QAAgB;IAEhB,MAAM,eAAe,GACnB,oEAAoE,CAAC;IACvE,IAAI,CAAC,CAAC;IACN,OAAO,CAAC,CAAC,GAAG,eAAe,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACpD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,YAAY,GAAG,uDAAuD,CAAC;IAC7E,OAAO,CAAC,CAAC,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACjD,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,CAAC;IAED,MAAM,iBAAiB,GACrB,yDAAyD,CAAC;IAC5D,OAAO,CAAC,CAAC,GAAG,iBAAiB,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACtD,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACjC,CAAC;IAED,MAAM,cAAc,GAClB,+DAA+D,CAAC;IAClE,OAAO,CAAC,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IAElC,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;QACrB,QAAQ;QACR,IAAI,EAAE,cAAc;QACpB,IAAI,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE;KACvB,CAAC,CAAC;AACL,CAAC;AAED,8DAA8D;AAC9D,MAAM,UAAU,eAAe,CAC7B,KAAwB,EACxB,QAAgB,EAChB,OAAe;IAEf,MAAM,IAAI,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC;IAE/C,IAAI,QAAQ,CAAC,UAAU,CAAC,iBAAiB,CAAC,EAAE,CAAC;QAC3C,qBAAqB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAClD,CAAC;SAAM,IAAI,QAAQ,KAAK,cAAc,EAAE,CAAC;QACvC,kBAAkB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC/C,CAAC;SAAM,IACL,QAAQ,KAAK,YAAY;QACzB,QAAQ,KAAK,aAAa;QAC1B,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EACjC,CAAC;QACD,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC3C,CAAC;SAAM,IACL,kBAAkB,CAAC,IAAI,CAAC,QAAQ,CAAC;QACjC,mBAAmB,CAAC,IAAI,CAAC,QAAQ,CAAC,EAClC,CAAC;QACD,sBAAsB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IACnD,CAAC;SAAM,IACL,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACrB,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QACpB,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,EACrB,CAAC;QACD,iBAAiB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAClC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QAC3C,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/B,KAAK,CAAC,WAAW,CAAC,IAAI,CAAC;YACrB,QAAQ;YACR,IAAI,EAAE,QAAQ;YACd,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;SAC1B,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,gBAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;IAC7C,CAAC;SAAM,IACL,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;QACtB,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,EACtB,CAAC;QACD,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,gBAAgB,EAAE,CAAC;YAC5B,KAAK,CAAC,gBAAgB,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC;QACpE,CAAC;IACH,CAAC;AACH,CAAC;AAED,8EAA8E;AAC9E,8CAA8C;AAC9C,8EAA8E;AAE9E,gDAAgD;AAChD,MAAM,UAAU,MAAM,CAAC,GAAa;IAClC,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,oDAAoD;AACpD,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC3C,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,MAAM,CAAC,CAAC,GAAG,GAAG,EAAE,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,uDAAuD;AACvD,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC;IAC/C,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,2DAA2D;AAC3D,MAAM,UAAU,YAAY,CAAC,QAAgB;IAC3C,MAAM,EAAE,GAAG,QAAQ,CAAC,WAAW,EAAE,CAAC;IAClC,IACE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC;QAC3B,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC;QAEtB,OAAO,cAAc,CAAC;IACxB,IACE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC;QACvB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAElB,OAAO,UAAU,CAAC;IACpB,IACE,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC;QACnB,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC;QAC1B,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAElB,OAAO,aAAa,CAAC;IACvB,IAAI,EAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,mFAAmF;AACnF,MAAM,UAAU,kBAAkB,CAChC,WAAwB,EACxB,OAAgB;IAEhB,MAAM,IAAI,GAAa,EAAE,CAAC;IAE1B,QAAQ,WAAW,EAAE,CAAC;QACpB,KAAK,cAAc;YACjB,IAAI,CAAC,IAAI,CACP,qEAAqE,EACrE,4DAA4D,EAC5D,wDAAwD,EACxD,iEAAiE,EACjE,yDAAyD,CAC1D,CAAC;YACF,MAAM;QACR,KAAK,UAAU;YACb,IAAI,CAAC,IAAI,CACP,kEAAkE,EAClE,wDAAwD,EACxD,2DAA2D,EAC3D,wDAAwD,EACxD,4DAA4D,CAC7D,CAAC;YACF,MAAM;QACR,KAAK,aAAa;YAChB,IAAI,CAAC,IAAI,CACP,mDAAmD,EACnD,iEAAiE,EACjE,yDAAyD,EACzD,4DAA4D,CAC7D,CAAC;YACF,MAAM;QACR,KAAK,KAAK;YACR,IAAI,CAAC,IAAI,CACP,0DAA0D,EAC1D,qDAAqD,EACrD,wDAAwD,CACzD,CAAC;YACF,MAAM;QACR,KAAK,OAAO;YACV,IAAI,CAAC,IAAI,CACP,0DAA0D,EAC1D,wDAAwD,CACzD,CAAC;YACF,MAAM;IACV,CAAC;IAED,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,IAAI,CAAC,IAAI,CACP,8HAA8H,CAC/H,CAAC;IACJ,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8EAA8E;AAC9E,yCAAyC;AACzC,8EAA8E;AAE9E,yDAAyD;AACzD,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,MAAM,EAAE,CAAC;IACrE,WAAW,CAAC,GAAG,CAAC,CAAC;IAEjB,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,GAAG,EAAE;QACxC,OAAO,EAAE;YACP,YAAY,EACV,sEAAsE;SACzE;QACD,MAAM,EAAE,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC;KACnC,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,MAAM,MAAM,GAAwB,EAAE,GAAG,EAAE,CAAC;IAE5C,QAAQ;IACR,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;IAC/D,IAAI,UAAU,EAAE,CAAC;QACf,MAAM,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC1C,CAAC;IAED,mBAAmB;IACnB,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAC1B,kEAAkE,CACnE,CAAC;IACF,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC,CAAC,CAAC;IACxC,CAAC;IAED,mBAAmB;IACnB,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAChC,kEAAkE,CACnE,CAAC;IACF,IAAI,eAAe,EAAE,CAAC;QACpB,MAAM,CAAC,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,CAAC;IACzC,CAAC;IAED,wBAAwB;IACxB,MAAM,aAAa,GAAG,IAAI,CAAC,QAAQ,CAAC,8BAA8B,CAAC,CAAC;IACpE,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,KAAK,MAAM,KAAK,IAAI,aAAa,EAAE,CAAC;QAClC,OAAO,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAC7C,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACpC,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrD,MAAM,CAAC,mBAAmB,GAAG,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;IAC3D,CAAC;IAED,2BAA2B;IAC3B,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IACvC,MAAM,UAAU,GAAG,sBAAsB,CAAC;IAC1C,IAAI,QAAQ,CAAC;IACb,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,MAAM,UAAU,GACd,2DAA2D,CAAC;IAC9D,IAAI,QAAQ,CAAC;IACb,OAAO,CAAC,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;QACnD,YAAY,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC;IAChC,CAAC;IACD,IAAI,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;QAC1B,MAAM,CAAC,MAAM,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;IAED,aAAa;IACb,MAAM,eAAe,GAAG,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC;IACnE,MAAM,KAAK,GAAwC,EAAE,CAAC;IACtD,KAAK,MAAM,KAAK,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACvB,MAAM,WAAW,GAAG,KAAK,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACzE,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE;YAChC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC;SAC1C,CAAC,CAAC;IACL,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACrB,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;IACxC,CAAC;IAED,eAAe;IACf,MAAM,iBAAiB,GAAG,IAAI,CAAC,QAAQ,CACrC,2CAA2C,CAC5C,CAAC;IACF,MAAM,WAAW,GAAa,EAAE,CAAC;IACjC,KAAK,MAAM,KAAK,IAAI,iBAAiB,EAAE,CAAC;QACtC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3B,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;IACnC,CAAC;IAED,WAAW;IACX,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC7B,mEAAmE,CACpE,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,UAAU;IACV,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAC7B,yEAAyE,CAC1E,CAAC;IACF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,CAAC,OAAO,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IACnC,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["/**\n * Shared design-token extraction utilities.\n *\n * Pure functions for parsing Tailwind configs, CSS files, package.json,\n * documents, and URLs to extract colors, fonts, spacing, border-radius,\n * and CSS custom properties. Used by the import-* actions across all\n * templates (design, slides, videos).\n *\n * No framework dependencies — no defineAction, no zod, no drizzle.\n */\n\nimport { ssrfSafeFetch } from \"../extensions/url-safety.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Maximum number of files to fetch from a single GitHub repo. */\nexport const MAX_FILES = 10;\n\n/** Maximum individual file size (100 KB). */\nexport const MAX_FILE_SIZE = 100 * 1024;\n\n/** Timeout for GitHub API / URL fetch calls (ms). */\nexport const FETCH_TIMEOUT = 15000;\n\n/** File-name patterns to look for at the repo root. */\nexport const ROOT_PATTERNS: RegExp[] = [\n /^tailwind\\.config\\.\\w+$/,\n /^postcss\\.config\\.\\w+$/,\n /^\\.?theme\\.\\w+$/,\n /^\\.?tokens\\.\\w+$/,\n /^package\\.json$/,\n /\\.css$/,\n];\n\n/** Secondary paths (files and directories) to check for design tokens. */\nexport const SECONDARY_PATHS: string[] = [\n \"src/styles\",\n \"styles\",\n \"src/theme\",\n \"app/globals.css\",\n \"src/globals.css\",\n \"src/index.css\",\n \"app/layout.tsx\",\n \"src/app/globals.css\",\n];\n\n/** Maximum files accepted in import-code. */\nexport const CODE_MAX_FILES = 20;\n\n/** Maximum total bytes accepted in import-code. */\nexport const CODE_MAX_TOTAL_BYTES = 500 * 1024;\n\n/** Regex for hex colors (3-8 digit, including alpha). */\nexport const HEX_COLOR_RE = /#(?:[0-9a-fA-F]{3,4}){1,2}\\b/g;\n\n/** Regex for well-known named CSS colors. */\nexport const NAMED_COLOR_RE =\n /\\b(red|blue|green|yellow|orange|purple|pink|cyan|magenta|teal|navy|maroon|coral|salmon|gold|silver|gray|grey|indigo|violet|lime|olive|aqua|fuchsia|crimson|turquoise|ivory|beige|lavender|tan|khaki|plum|orchid|sienna)\\b/gi;\n\n/** Regex for well-known font family names found in documents. */\nexport const FONT_NAME_RE =\n /\\b(Helvetica|Arial|Times New Roman|Georgia|Garamond|Futura|Bodoni|Avenir|Proxima Nova|Montserrat|Open Sans|Lato|Poppins|Raleway|Playfair Display|Merriweather|Source Sans|Noto Sans|Work Sans|Nunito|Rubik|Oswald|Roboto|Inter|DM Sans|Space Grotesk|SF Pro|Segoe UI|Calibri|Cambria|Century Gothic|Franklin Gothic|Gill Sans|Fira Sans|Barlow|Manrope|Sora|Plus Jakarta Sans|IBM Plex Sans|IBM Plex Serif|Libre Baskerville|Cormorant|Crimson Text)\\b/gi;\n\n/** Regex matching CSS custom property values that look like colors. */\nexport const COLOR_VAR_PATTERN =\n /^(#[0-9a-fA-F]{3,8}|rgba?\\(|hsla?\\(|oklch\\(|color\\()/;\n\n/** Well-known styling framework deps to detect in package.json. */\nexport const FRAMEWORK_DETECTORS: { name: string; label: string }[] = [\n { name: \"tailwindcss\", label: \"tailwind\" },\n { name: \"@tailwindcss/cli\", label: \"tailwind\" },\n { name: \"styled-components\", label: \"styled-components\" },\n { name: \"@emotion/react\", label: \"emotion\" },\n { name: \"@emotion/styled\", label: \"emotion\" },\n { name: \"sass\", label: \"sass\" },\n { name: \"less\", label: \"less\" },\n { name: \"postcss\", label: \"postcss\" },\n { name: \"css-modules\", label: \"css-modules\" },\n { name: \"@vanilla-extract/css\", label: \"vanilla-extract\" },\n { name: \"stitches\", label: \"stitches\" },\n { name: \"panda-css\", label: \"panda-css\" },\n { name: \"@pandacss/dev\", label: \"panda-css\" },\n { name: \"unocss\", label: \"unocss\" },\n { name: \"windicss\", label: \"windi\" },\n];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ContentType =\n | \"presentation\"\n | \"document\"\n | \"spreadsheet\"\n | \"pdf\"\n | \"other\";\n\nexport interface ParsedCss {\n cssCustomProperties: Record<string, string> | undefined;\n fonts: string[] | undefined;\n}\n\nexport interface ParsedTailwindConfig {\n colors?: Record<string, string>;\n fontFamily?: Record<string, string>;\n spacing?: Record<string, string>;\n borderRadius?: Record<string, string>;\n}\n\nexport interface CodeAnalysisState {\n colors: Record<string, string>;\n cssCustomProperties: Record<string, string>;\n fonts: { family: string; source?: string }[];\n spacing: Record<string, string>;\n borderRadius: Record<string, string>;\n stylingFramework: string | null;\n rawExtracts: { filename: string; type: string; data: unknown }[];\n seenFonts: Set<string>;\n}\n\nexport interface UrlExtractionResult {\n url: string;\n pageTitle?: string;\n metaDescription?: string;\n themeColor?: string;\n cssCustomProperties?: Record<string, string>;\n colors?: string[];\n fontFaces?: { family?: string; src?: string }[];\n googleFonts?: string[];\n ogImage?: string;\n favicon?: string;\n}\n\nexport interface GitHubFetchOptions {\n token?: string | null;\n}\n\nexport interface GitHubJsonResult<T = unknown> {\n ok: boolean;\n status: number;\n data: T | null;\n message?: string;\n}\n\n// ---------------------------------------------------------------------------\n// SSRF Guard\n// ---------------------------------------------------------------------------\n\n/**\n * Cheap synchronous pre-filter for obviously-internal URLs. This is a fast\n * fail, NOT the real guard: it cannot resolve DNS and does not re-check\n * redirects. All actual outbound fetches in this module go through\n * `ssrfSafeFetch`, which performs the DNS-aware check, a connect-time\n * private-IP guard, and per-redirect re-validation. Keep both: this gives a\n * clear early error for literal private hosts, ssrfSafeFetch is the backstop.\n */\nexport function validateUrl(url: string): void {\n const parsed = new URL(url);\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n throw new Error(\"Only http and https URLs are allowed\");\n }\n const hostname = parsed.hostname;\n if (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"0.0.0.0\" ||\n hostname === \"[::1]\" ||\n hostname.startsWith(\"10.\") ||\n hostname.startsWith(\"172.16.\") ||\n hostname.startsWith(\"172.17.\") ||\n hostname.startsWith(\"172.18.\") ||\n hostname.startsWith(\"172.19.\") ||\n hostname.startsWith(\"172.2\") ||\n hostname.startsWith(\"172.30.\") ||\n hostname.startsWith(\"172.31.\") ||\n hostname.startsWith(\"192.168.\") ||\n hostname.endsWith(\".internal\") ||\n hostname.endsWith(\".local\") ||\n hostname === \"metadata.google.internal\" ||\n hostname === \"169.254.169.254\"\n ) {\n throw new Error(\"Internal/private URLs are not allowed\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// GitHub helpers\n// ---------------------------------------------------------------------------\n\n/** Parse a GitHub URL or \"org/repo\" shorthand into owner + repo. */\nexport function parseOwnerRepo(raw: string): {\n owner: string;\n repo: string;\n} {\n const cleaned = raw\n .trim()\n .replace(/[?#].*$/, \"\")\n .replace(/\\/+$/, \"\");\n\n const sshMatch = cleaned.match(\n /^(?:ssh:\\/\\/)?git@github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n );\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n const shorthand = cleaned.match(/^([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/);\n if (shorthand) {\n return { owner: shorthand[1], repo: shorthand[2] };\n }\n const urlMatch = cleaned.match(\n /github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/,\n );\n if (urlMatch) {\n return { owner: urlMatch[1], repo: urlMatch[2] };\n }\n throw new Error(\n \"Could not parse GitHub owner/repo from URL. \" +\n 'Expected format: \"https://github.com/org/repo\", \"org/repo\", or \"git@github.com:org/repo.git\"',\n );\n}\n\n/** Fetch a path from the GitHub Contents API as JSON. Returns null on error. */\nfunction githubHeaders(\n accept: string,\n options: GitHubFetchOptions = {},\n): Record<string, string> {\n return {\n Accept: accept,\n \"User-Agent\": \"AgentNative/1.0\",\n ...(options.token ? { Authorization: `Bearer ${options.token}` } : {}),\n };\n}\n\n/** Fetch a path from the GitHub Contents API as JSON with status details. */\nexport async function fetchGitHubJsonResult<T = unknown>(\n owner: string,\n repo: string,\n path: string,\n options: GitHubFetchOptions = {},\n): Promise<GitHubJsonResult<T>> {\n const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n validateUrl(url);\n const res = await ssrfSafeFetch(url, {\n headers: githubHeaders(\"application/vnd.github.v3+json\", options),\n signal: AbortSignal.timeout(FETCH_TIMEOUT),\n });\n if (!res.ok) {\n let message: string | undefined;\n try {\n const body = (await res.json()) as { message?: unknown };\n if (typeof body.message === \"string\") message = body.message;\n } catch {\n try {\n const text = await res.text();\n if (text) message = text.slice(0, 200);\n } catch {\n // Keep the status-only result.\n }\n }\n return { ok: false, status: res.status, data: null, message };\n }\n return { ok: true, status: res.status, data: (await res.json()) as T };\n}\n\n/** Fetch a path from the GitHub Contents API as JSON. Returns null on error. */\nexport async function fetchGitHubJson(\n owner: string,\n repo: string,\n path: string,\n options: GitHubFetchOptions = {},\n): Promise<unknown> {\n const result = await fetchGitHubJsonResult(owner, repo, path, options);\n return result.ok ? result.data : null;\n}\n\n/** Fetch raw file content from the GitHub Contents API. Returns null on error or oversize. */\nexport async function fetchGitHubRaw(\n owner: string,\n repo: string,\n path: string,\n options: GitHubFetchOptions = {},\n): Promise<string | null> {\n const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n validateUrl(url);\n const res = await ssrfSafeFetch(url, {\n headers: githubHeaders(\"application/vnd.github.v3.raw\", options),\n signal: AbortSignal.timeout(FETCH_TIMEOUT),\n });\n if (!res.ok) return null;\n\n const cl = res.headers.get(\"content-length\");\n if (cl && parseInt(cl, 10) > MAX_FILE_SIZE) return null;\n\n const text = await res.text();\n if (text.length > MAX_FILE_SIZE) return null;\n return text;\n}\n\n// ---------------------------------------------------------------------------\n// Tailwind config parser\n// ---------------------------------------------------------------------------\n\n/** Extract colors, fonts, spacing, borderRadius from a Tailwind config file string. */\nexport function parseTailwindConfig(content: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n const colorsMatch = content.match(\n /colors\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (colorsMatch) {\n try {\n const colors: Record<string, string> = {};\n const pairs = colorsMatch[1].matchAll(\n /['\"]?([\\w-]+)['\"]?\\s*:\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n colors[p[1]] = p[2];\n }\n if (Object.keys(colors).length > 0) result.colors = colors;\n } catch {\n // skip\n }\n }\n\n const fontMatch = content.match(\n /fontFamily\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (fontMatch) {\n const fonts: Record<string, string> = {};\n const pairs = fontMatch[1].matchAll(\n /['\"]?([\\w-]+)['\"]?\\s*:\\s*\\[?\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n fonts[p[1]] = p[2];\n }\n if (Object.keys(fonts).length > 0) result.fontFamily = fonts;\n }\n\n const spacingMatch = content.match(\n /spacing\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (spacingMatch) {\n const spacing: Record<string, string> = {};\n const pairs = spacingMatch[1].matchAll(\n /['\"]?([\\w.-]+)['\"]?\\s*:\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n spacing[p[1]] = p[2];\n }\n if (Object.keys(spacing).length > 0) result.spacing = spacing;\n }\n\n const radiusMatch = content.match(\n /borderRadius\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (radiusMatch) {\n const radii: Record<string, string> = {};\n const pairs = radiusMatch[1].matchAll(\n /['\"]?([\\w-]+)['\"]?\\s*:\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n radii[p[1]] = p[2];\n }\n if (Object.keys(radii).length > 0) result.borderRadius = radii;\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// CSS parser\n// ---------------------------------------------------------------------------\n\n/** Extract CSS custom properties and @font-face / Google Fonts from CSS content. */\nexport function parseCss(content: string): ParsedCss {\n const cssCustomProperties: Record<string, string> = {};\n const varMatches = content.matchAll(/--([\\w-]+)\\s*:\\s*([^;}\\n]+)/g);\n for (const m of varMatches) {\n cssCustomProperties[`--${m[1]}`] = m[2].trim();\n }\n\n const fonts: string[] = [];\n const fontFaceMatches = content.matchAll(/@font-face\\s*\\{([^}]+)\\}/g);\n for (const m of fontFaceMatches) {\n const familyMatch = m[1].match(/font-family\\s*:\\s*[\"']?([^\"';]+)[\"']?/);\n if (familyMatch) fonts.push(familyMatch[1].trim());\n }\n\n const importMatches = content.matchAll(\n /@import\\s+url\\(\\s*['\"]?(fonts\\.googleapis\\.com[^'\")\\s]+)['\"]?\\s*\\)/g,\n );\n for (const m of importMatches) {\n const familyParam = m[1].match(/family=([^&\"')\\s]+)/);\n if (familyParam) {\n fonts.push(decodeURIComponent(familyParam[1]).replace(/\\+/g, \" \"));\n }\n }\n\n return {\n cssCustomProperties:\n Object.keys(cssCustomProperties).length > 0\n ? cssCustomProperties\n : undefined,\n fonts: fonts.length > 0 ? [...new Set(fonts)] : undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Styling framework detection\n// ---------------------------------------------------------------------------\n\n/** Detect the styling framework from a package.json string. */\nexport function detectStylingFramework(content: string): string | undefined {\n try {\n const pkg = JSON.parse(content);\n const all = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n if (all[\"tailwindcss\"] || all[\"@tailwindcss/cli\"]) return \"tailwindcss\";\n if (all[\"styled-components\"]) return \"styled-components\";\n if (all[\"@emotion/react\"] || all[\"@emotion/styled\"]) return \"emotion\";\n if (all[\"sass\"] || all[\"node-sass\"]) return \"sass\";\n if (all[\"less\"]) return \"less\";\n if (all[\"@vanilla-extract/css\"]) return \"vanilla-extract\";\n if (all[\"windicss\"]) return \"windicss\";\n if (all[\"unocss\"]) return \"unocss\";\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Code file analysis helpers (import-code)\n// ---------------------------------------------------------------------------\n\n/** Create a fresh state object for code file analysis. */\nexport function createCodeAnalysisState(): CodeAnalysisState {\n return {\n colors: {},\n cssCustomProperties: {},\n fonts: [],\n spacing: {},\n borderRadius: {},\n stylingFramework: null,\n rawExtracts: [],\n seenFonts: new Set<string>(),\n };\n}\n\n/** De-duplicate and add a font to the analysis state. */\nexport function addFont(\n state: CodeAnalysisState,\n family: string,\n source?: string,\n): void {\n const normalized = family.trim().replace(/[\"']/g, \"\");\n if (!normalized || state.seenFonts.has(normalized.toLowerCase())) return;\n state.seenFonts.add(normalized.toLowerCase());\n state.fonts.push({ family: normalized, source });\n}\n\n/** Extract CSS custom properties, classifying them by name into colors/spacing/radius. */\nexport function extractCssVars(\n state: CodeAnalysisState,\n content: string,\n): void {\n const pattern = /--([\\w-]+)\\s*:\\s*([^;}\\n]+)/g;\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const name = `--${match[1]}`;\n const value = match[2].trim();\n state.cssCustomProperties[name] = value;\n\n if (\n /color|bg|background|text|border|accent|primary|secondary|surface|muted|foreground/i.test(\n match[1],\n )\n ) {\n state.colors[name] = value;\n } else if (/spacing|gap|padding|margin|space/i.test(match[1])) {\n state.spacing[name] = value;\n } else if (/radius|rounded/i.test(match[1])) {\n state.borderRadius[name] = value;\n }\n }\n}\n\n/** Extract literal color values (hex, rgb, hsl, oklch) from content. */\nexport function extractCodeColors(\n state: CodeAnalysisState,\n content: string,\n): void {\n const hexPattern = /#[0-9a-fA-F]{3,8}\\b/g;\n let m;\n while ((m = hexPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n\n const rgbPattern =\n /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+(?:\\s*,\\s*[\\d.]+)?\\s*\\)/g;\n while ((m = rgbPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n\n const hslPattern =\n /hsla?\\(\\s*\\d+\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+%(?:\\s*,\\s*[\\d.]+)?\\s*\\)/g;\n while ((m = hslPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n\n const oklchPattern =\n /oklch\\(\\s*[\\d.]+%?\\s+[\\d.]+\\s+[\\d.]+(?:\\s*\\/\\s*[\\d.]+)?\\s*\\)/g;\n while ((m = oklchPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n}\n\n/** Extract font-family declarations and @font-face blocks from CSS-like content. */\nexport function extractCodeFonts(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n const fontFamilyPattern = /font-family\\s*:\\s*[\"']?([^\"';}\\n]+)/g;\n let m;\n while ((m = fontFamilyPattern.exec(content)) !== null) {\n const families = m[1].split(\",\");\n for (const fam of families) {\n const trimmed = fam.trim().replace(/[\"']/g, \"\");\n if (\n trimmed &&\n !/^(sans-serif|serif|monospace|cursive|fantasy|system-ui|inherit|initial)$/i.test(\n trimmed,\n )\n ) {\n addFont(state, trimmed, filename);\n }\n }\n }\n\n const fontFacePattern = /@font-face\\s*\\{([^}]+)\\}/g;\n while ((m = fontFacePattern.exec(content)) !== null) {\n const block = m[1];\n const familyMatch = block.match(/font-family\\s*:\\s*[\"']?([^\"';]+)[\"']?/);\n if (familyMatch) {\n addFont(state, familyMatch[1], filename);\n }\n }\n}\n\n/** Analyze a CSS/SCSS/LESS file, extracting vars, colors, and fonts. */\nexport function analyzeCssFile(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n extractCssVars(state, content);\n extractCodeColors(state, content);\n extractCodeFonts(state, content, filename);\n state.rawExtracts.push({ filename, type: \"css\", data: { parsed: true } });\n}\n\n/** Analyze a Tailwind config file for tokens. */\nexport function analyzeTailwindConfig(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n state.stylingFramework = \"tailwind\";\n\n const colorsBlockMatch = content.match(/colors\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (colorsBlockMatch) {\n const pairPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = pairPattern.exec(colorsBlockMatch[1])) !== null) {\n state.colors[m[1]] = m[2];\n }\n }\n\n const fontFamilyBlockMatch = content.match(/fontFamily\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (fontFamilyBlockMatch) {\n const fontPairPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*\\[?\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = fontPairPattern.exec(fontFamilyBlockMatch[1])) !== null) {\n addFont(state, m[2], filename);\n }\n }\n\n const spacingBlockMatch = content.match(/spacing\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (spacingBlockMatch) {\n const pairPattern = /[\"']?([\\w.-]+)[\"']?\\s*:\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = pairPattern.exec(spacingBlockMatch[1])) !== null) {\n state.spacing[m[1]] = m[2];\n }\n }\n\n const radiusBlockMatch = content.match(/borderRadius\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (radiusBlockMatch) {\n const pairPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = pairPattern.exec(radiusBlockMatch[1])) !== null) {\n state.borderRadius[m[1]] = m[2];\n }\n }\n\n extractCodeColors(state, content);\n\n state.rawExtracts.push({\n filename,\n type: \"tailwind-config\",\n data: {\n hasColors: !!colorsBlockMatch,\n hasFontFamily: !!fontFamilyBlockMatch,\n hasSpacing: !!spacingBlockMatch,\n hasBorderRadius: !!radiusBlockMatch,\n },\n });\n}\n\n/** Walk a parsed JSON theme object, extracting tokens into state. */\nexport function analyzeJsonTheme(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n try {\n const json = JSON.parse(content);\n const walk = (obj: Record<string, unknown>, prefix: string) => {\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (typeof value === \"string\") {\n const lower = key.toLowerCase();\n if (\n /color|bg|background|text|border|accent|primary|secondary|surface/i.test(\n lower,\n ) ||\n /^#[0-9a-fA-F]{3,8}$/.test(value)\n ) {\n state.colors[path] = value;\n } else if (/font|family|typeface/i.test(lower)) {\n addFont(state, value, filename);\n } else if (/spacing|gap|padding|margin|space/i.test(lower)) {\n state.spacing[path] = value;\n } else if (/radius|rounded/i.test(lower)) {\n state.borderRadius[path] = value;\n }\n } else if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n walk(value as Record<string, unknown>, path);\n }\n }\n };\n walk(json, \"\");\n state.rawExtracts.push({\n filename,\n type: \"json-theme\",\n data: { keys: Object.keys(json) },\n });\n } catch {\n state.rawExtracts.push({\n filename,\n type: \"json-theme\",\n data: { parseError: true },\n });\n }\n}\n\n/** Analyze package.json for styling framework deps. */\nexport function analyzePackageJson(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n try {\n const json = JSON.parse(content);\n const allDeps = {\n ...json.dependencies,\n ...json.devDependencies,\n };\n\n const detected: string[] = [];\n for (const fw of FRAMEWORK_DETECTORS) {\n if (allDeps && fw.name in allDeps) {\n detected.push(fw.label);\n if (!state.stylingFramework) {\n state.stylingFramework = fw.label;\n }\n }\n }\n\n state.rawExtracts.push({\n filename,\n type: \"package-json\",\n data: { stylingDeps: detected },\n });\n } catch {\n state.rawExtracts.push({\n filename,\n type: \"package-json\",\n data: { parseError: true },\n });\n }\n}\n\n/** Analyze a theme source file (theme.ts, tokens.ts) for design tokens. */\nexport function analyzeThemeSourceFile(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n const namedHexPattern =\n /(?:const|let|var|export)\\s+(\\w+)\\s*=\\s*[\"']?(#[0-9a-fA-F]{3,8})\\b/g;\n let m;\n while ((m = namedHexPattern.exec(content)) !== null) {\n state.colors[m[1]] = m[2];\n }\n\n const kvHexPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*[\"'](#[0-9a-fA-F]{3,8})[\"']/g;\n while ((m = kvHexPattern.exec(content)) !== null) {\n state.colors[m[1]] = m[2];\n }\n\n const fontStringPattern =\n /(?:font|family|typeface)\\w*\\s*[:=]\\s*[\"']([^\"']+)[\"']/gi;\n while ((m = fontStringPattern.exec(content)) !== null) {\n addFont(state, m[1], filename);\n }\n\n const spacingPattern =\n /(?:spacing|gap|padding|margin)\\w*\\s*[:=]\\s*[\"']([^\"']+)[\"']/gi;\n while ((m = spacingPattern.exec(content)) !== null) {\n state.spacing[m[0].split(/[:=]/)[0].trim()] = m[1];\n }\n\n extractCodeColors(state, content);\n\n state.rawExtracts.push({\n filename,\n type: \"theme-source\",\n data: { parsed: true },\n });\n}\n\n/** Route a file to the correct analyzer based on filename. */\nexport function analyzeCodeFile(\n state: CodeAnalysisState,\n filename: string,\n content: string,\n): void {\n const name = filename.toLowerCase();\n const basename = name.split(\"/\").pop() ?? name;\n\n if (basename.startsWith(\"tailwind.config\")) {\n analyzeTailwindConfig(state, content, filename);\n } else if (basename === \"package.json\") {\n analyzePackageJson(state, content, filename);\n } else if (\n basename === \"theme.json\" ||\n basename === \"tokens.json\" ||\n basename.endsWith(\".tokens.json\")\n ) {\n analyzeJsonTheme(state, content, filename);\n } else if (name.endsWith(\".css\")) {\n analyzeCssFile(state, content, filename);\n } else if (\n /^theme\\.(ts|js)$/.test(basename) ||\n /^tokens\\.(ts|js)$/.test(basename)\n ) {\n analyzeThemeSourceFile(state, content, filename);\n } else if (\n name.endsWith(\".ts\") ||\n name.endsWith(\".tsx\") ||\n name.endsWith(\".js\") ||\n name.endsWith(\".jsx\")\n ) {\n extractCodeColors(state, content);\n extractCodeFonts(state, content, filename);\n extractCssVars(state, content);\n state.rawExtracts.push({\n filename,\n type: \"source\",\n data: { lightPass: true },\n });\n } else if (name.endsWith(\".json\")) {\n analyzeJsonTheme(state, content, filename);\n } else if (\n name.endsWith(\".scss\") ||\n name.endsWith(\".sass\") ||\n name.endsWith(\".less\")\n ) {\n analyzeCssFile(state, content, filename);\n if (!state.stylingFramework) {\n state.stylingFramework = name.endsWith(\".less\") ? \"less\" : \"sass\";\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Document analysis helpers (import-document)\n// ---------------------------------------------------------------------------\n\n/** Deduplicate and trim an array of strings. */\nexport function unique(arr: string[]): string[] {\n return [...new Set(arr.map((s) => s.trim()))];\n}\n\n/** Extract hex and named colors from plain text. */\nexport function extractDocumentColors(text: string): string[] {\n const hex = text.match(HEX_COLOR_RE) ?? [];\n const named = text.match(NAMED_COLOR_RE) ?? [];\n return unique([...hex, ...named.map((n) => n.toLowerCase())]);\n}\n\n/** Extract known font family names from plain text. */\nexport function extractDocumentFonts(text: string): string[] {\n const matches = text.match(FONT_NAME_RE) ?? [];\n return unique(matches);\n}\n\n/** Classify a file type string into a content category. */\nexport function classifyFile(fileType: string): ContentType {\n const ft = fileType.toLowerCase();\n if (\n ft.includes(\"pptx\") ||\n ft.includes(\"ppt\") ||\n ft.includes(\"presentation\") ||\n ft.includes(\"keynote\")\n )\n return \"presentation\";\n if (\n ft.includes(\"docx\") ||\n ft.includes(\"doc\") ||\n ft.includes(\"document\") ||\n ft.includes(\"rtf\")\n )\n return \"document\";\n if (\n ft.includes(\"xlsx\") ||\n ft.includes(\"xls\") ||\n ft.includes(\"spreadsheet\") ||\n ft.includes(\"csv\")\n )\n return \"spreadsheet\";\n if (ft.includes(\"pdf\")) return \"pdf\";\n return \"other\";\n}\n\n/** Return per-type suggestions for how to use a document for design extraction. */\nexport function suggestionsForType(\n contentType: ContentType,\n hasText: boolean,\n): string[] {\n const base: string[] = [];\n\n switch (contentType) {\n case \"presentation\":\n base.push(\n \"Look for slide master/theme colors — these define the brand palette\",\n \"Check heading fonts on title slides for the brand typeface\",\n \"Note any accent colors used for callouts or highlights\",\n \"Slide backgrounds may reveal primary and secondary brand colors\",\n \"Chart/graph colors often match the brand accent palette\",\n );\n break;\n case \"document\":\n base.push(\n \"Heading styles reveal the typographic hierarchy and heading font\",\n \"Body text font is likely the primary readable typeface\",\n \"Look for colored headings or accent text for brand colors\",\n \"Document margins and spacing suggest preferred density\",\n \"Header/footer formatting may include brand colors or logos\",\n );\n break;\n case \"spreadsheet\":\n base.push(\n \"Header row colors often reflect the brand palette\",\n \"Conditional formatting colors may indicate status/accent colors\",\n \"Chart and graph colors are strong brand palette signals\",\n \"Cell background highlighting colors suggest accent palette\",\n );\n break;\n case \"pdf\":\n base.push(\n \"PDF may contain embedded brand guidelines or style specs\",\n \"Look for consistent heading colors and font choices\",\n \"Background colors and accent bars reveal brand palette\",\n );\n break;\n case \"other\":\n base.push(\n \"Examine any visual elements for recurring color patterns\",\n \"Note any typography that appears intentionally branded\",\n );\n break;\n }\n\n if (!hasText) {\n base.push(\n \"No text content was extracted — ask the user to paste key sections or send the file as a chat attachment for visual analysis\",\n );\n }\n\n return base;\n}\n\n// ---------------------------------------------------------------------------\n// URL scraping helpers (import-from-url)\n// ---------------------------------------------------------------------------\n\n/** Fetch and extract design tokens from a URL's HTML. */\nexport async function extractDesignTokensFromUrl(\n rawUrl: string,\n): Promise<UrlExtractionResult> {\n const url = rawUrl.startsWith(\"http\") ? rawUrl : `https://${rawUrl}`;\n validateUrl(url);\n\n const response = await ssrfSafeFetch(url, {\n headers: {\n \"User-Agent\":\n \"Mozilla/5.0 (compatible; AgentNative/1.0; +https://agent-native.com)\",\n },\n signal: AbortSignal.timeout(10000),\n });\n const html = await response.text();\n\n const result: UrlExtractionResult = { url };\n\n // Title\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/i);\n if (titleMatch) {\n result.pageTitle = titleMatch[1].trim();\n }\n\n // Meta description\n const descMatch = html.match(\n /<meta[^>]*name=[\"']description[\"'][^>]*content=[\"']([^\"']+)[\"']/i,\n );\n if (descMatch) {\n result.metaDescription = descMatch[1];\n }\n\n // Meta theme-color\n const themeColorMatch = html.match(\n /<meta[^>]*name=[\"']theme-color[\"'][^>]*content=[\"']([^\"']+)[\"']/i,\n );\n if (themeColorMatch) {\n result.themeColor = themeColorMatch[1];\n }\n\n // CSS custom properties\n const cssVarMatches = html.matchAll(/--([\\w-]+)\\s*:\\s*([^;}\\n]+)/g);\n const cssVars: Record<string, string> = {};\n for (const match of cssVarMatches) {\n cssVars[`--${match[1]}`] = match[2].trim();\n }\n if (Object.keys(cssVars).length > 0) {\n const entries = Object.entries(cssVars).slice(0, 50);\n result.cssCustomProperties = Object.fromEntries(entries);\n }\n\n // Inline colors (hex, rgb)\n const colorMatches = new Set<string>();\n const hexPattern = /#[0-9a-fA-F]{3,8}\\b/g;\n let hexMatch;\n while ((hexMatch = hexPattern.exec(html)) !== null) {\n colorMatches.add(hexMatch[0]);\n }\n const rgbPattern =\n /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+(?:\\s*,\\s*[\\d.]+)?\\s*\\)/g;\n let rgbMatch;\n while ((rgbMatch = rgbPattern.exec(html)) !== null) {\n colorMatches.add(rgbMatch[0]);\n }\n if (colorMatches.size > 0) {\n result.colors = [...colorMatches].slice(0, 30);\n }\n\n // @font-face\n const fontFaceMatches = html.matchAll(/@font-face\\s*\\{([^}]+)\\}/g);\n const fonts: { family?: string; src?: string }[] = [];\n for (const match of fontFaceMatches) {\n const block = match[1];\n const familyMatch = block.match(/font-family\\s*:\\s*[\"']?([^\"';]+)[\"']?/);\n const srcMatch = block.match(/src\\s*:\\s*([^;]+)/);\n fonts.push({\n family: familyMatch?.[1]?.trim(),\n src: srcMatch?.[1]?.trim()?.slice(0, 200),\n });\n }\n if (fonts.length > 0) {\n result.fontFaces = fonts.slice(0, 20);\n }\n\n // Google Fonts\n const googleFontMatches = html.matchAll(\n /fonts\\.googleapis\\.com\\/css2?\\?[^\"'>\\s]+/g,\n );\n const googleFonts: string[] = [];\n for (const match of googleFontMatches) {\n googleFonts.push(match[0]);\n }\n if (googleFonts.length > 0) {\n result.googleFonts = googleFonts;\n }\n\n // OG image\n const ogImageMatch = html.match(\n /<meta[^>]*property=[\"']og:image[\"'][^>]*content=[\"']([^\"']+)[\"']/i,\n );\n if (ogImageMatch) {\n result.ogImage = ogImageMatch[1];\n }\n\n // Favicon\n const faviconMatch = html.match(\n /<link[^>]*rel=[\"'](?:icon|shortcut icon)[\"'][^>]*href=[\"']([^\"']+)[\"']/i,\n );\n if (faviconMatch) {\n result.favicon = faviconMatch[1];\n }\n\n return result;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"design-token-utils.js","sourceRoot":"","sources":["../../src/server/design-token-utils.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Shared design-token extraction utilities.\n *\n * Pure functions for parsing Tailwind configs, CSS files, package.json,\n * documents, and URLs to extract colors, fonts, spacing, border-radius,\n * and CSS custom properties. Used by the import-* actions across all\n * templates (design and slides).\n *\n * No framework dependencies — no defineAction, no zod, no drizzle.\n */\n\nimport { ssrfSafeFetch } from \"../extensions/url-safety.js\";\n\n// ---------------------------------------------------------------------------\n// Constants\n// ---------------------------------------------------------------------------\n\n/** Maximum number of files to fetch from a single GitHub repo. */\nexport const MAX_FILES = 10;\n\n/** Maximum individual file size (100 KB). */\nexport const MAX_FILE_SIZE = 100 * 1024;\n\n/** Timeout for GitHub API / URL fetch calls (ms). */\nexport const FETCH_TIMEOUT = 15000;\n\n/** File-name patterns to look for at the repo root. */\nexport const ROOT_PATTERNS: RegExp[] = [\n /^tailwind\\.config\\.\\w+$/,\n /^postcss\\.config\\.\\w+$/,\n /^\\.?theme\\.\\w+$/,\n /^\\.?tokens\\.\\w+$/,\n /^package\\.json$/,\n /\\.css$/,\n];\n\n/** Secondary paths (files and directories) to check for design tokens. */\nexport const SECONDARY_PATHS: string[] = [\n \"src/styles\",\n \"styles\",\n \"src/theme\",\n \"app/globals.css\",\n \"src/globals.css\",\n \"src/index.css\",\n \"app/layout.tsx\",\n \"src/app/globals.css\",\n];\n\n/** Maximum files accepted in import-code. */\nexport const CODE_MAX_FILES = 20;\n\n/** Maximum total bytes accepted in import-code. */\nexport const CODE_MAX_TOTAL_BYTES = 500 * 1024;\n\n/** Regex for hex colors (3-8 digit, including alpha). */\nexport const HEX_COLOR_RE = /#(?:[0-9a-fA-F]{3,4}){1,2}\\b/g;\n\n/** Regex for well-known named CSS colors. */\nexport const NAMED_COLOR_RE =\n /\\b(red|blue|green|yellow|orange|purple|pink|cyan|magenta|teal|navy|maroon|coral|salmon|gold|silver|gray|grey|indigo|violet|lime|olive|aqua|fuchsia|crimson|turquoise|ivory|beige|lavender|tan|khaki|plum|orchid|sienna)\\b/gi;\n\n/** Regex for well-known font family names found in documents. */\nexport const FONT_NAME_RE =\n /\\b(Helvetica|Arial|Times New Roman|Georgia|Garamond|Futura|Bodoni|Avenir|Proxima Nova|Montserrat|Open Sans|Lato|Poppins|Raleway|Playfair Display|Merriweather|Source Sans|Noto Sans|Work Sans|Nunito|Rubik|Oswald|Roboto|Inter|DM Sans|Space Grotesk|SF Pro|Segoe UI|Calibri|Cambria|Century Gothic|Franklin Gothic|Gill Sans|Fira Sans|Barlow|Manrope|Sora|Plus Jakarta Sans|IBM Plex Sans|IBM Plex Serif|Libre Baskerville|Cormorant|Crimson Text)\\b/gi;\n\n/** Regex matching CSS custom property values that look like colors. */\nexport const COLOR_VAR_PATTERN =\n /^(#[0-9a-fA-F]{3,8}|rgba?\\(|hsla?\\(|oklch\\(|color\\()/;\n\n/** Well-known styling framework deps to detect in package.json. */\nexport const FRAMEWORK_DETECTORS: { name: string; label: string }[] = [\n { name: \"tailwindcss\", label: \"tailwind\" },\n { name: \"@tailwindcss/cli\", label: \"tailwind\" },\n { name: \"styled-components\", label: \"styled-components\" },\n { name: \"@emotion/react\", label: \"emotion\" },\n { name: \"@emotion/styled\", label: \"emotion\" },\n { name: \"sass\", label: \"sass\" },\n { name: \"less\", label: \"less\" },\n { name: \"postcss\", label: \"postcss\" },\n { name: \"css-modules\", label: \"css-modules\" },\n { name: \"@vanilla-extract/css\", label: \"vanilla-extract\" },\n { name: \"stitches\", label: \"stitches\" },\n { name: \"panda-css\", label: \"panda-css\" },\n { name: \"@pandacss/dev\", label: \"panda-css\" },\n { name: \"unocss\", label: \"unocss\" },\n { name: \"windicss\", label: \"windi\" },\n];\n\n// ---------------------------------------------------------------------------\n// Types\n// ---------------------------------------------------------------------------\n\nexport type ContentType =\n | \"presentation\"\n | \"document\"\n | \"spreadsheet\"\n | \"pdf\"\n | \"other\";\n\nexport interface ParsedCss {\n cssCustomProperties: Record<string, string> | undefined;\n fonts: string[] | undefined;\n}\n\nexport interface ParsedTailwindConfig {\n colors?: Record<string, string>;\n fontFamily?: Record<string, string>;\n spacing?: Record<string, string>;\n borderRadius?: Record<string, string>;\n}\n\nexport interface CodeAnalysisState {\n colors: Record<string, string>;\n cssCustomProperties: Record<string, string>;\n fonts: { family: string; source?: string }[];\n spacing: Record<string, string>;\n borderRadius: Record<string, string>;\n stylingFramework: string | null;\n rawExtracts: { filename: string; type: string; data: unknown }[];\n seenFonts: Set<string>;\n}\n\nexport interface UrlExtractionResult {\n url: string;\n pageTitle?: string;\n metaDescription?: string;\n themeColor?: string;\n cssCustomProperties?: Record<string, string>;\n colors?: string[];\n fontFaces?: { family?: string; src?: string }[];\n googleFonts?: string[];\n ogImage?: string;\n favicon?: string;\n}\n\nexport interface GitHubFetchOptions {\n token?: string | null;\n}\n\nexport interface GitHubJsonResult<T = unknown> {\n ok: boolean;\n status: number;\n data: T | null;\n message?: string;\n}\n\n// ---------------------------------------------------------------------------\n// SSRF Guard\n// ---------------------------------------------------------------------------\n\n/**\n * Cheap synchronous pre-filter for obviously-internal URLs. This is a fast\n * fail, NOT the real guard: it cannot resolve DNS and does not re-check\n * redirects. All actual outbound fetches in this module go through\n * `ssrfSafeFetch`, which performs the DNS-aware check, a connect-time\n * private-IP guard, and per-redirect re-validation. Keep both: this gives a\n * clear early error for literal private hosts, ssrfSafeFetch is the backstop.\n */\nexport function validateUrl(url: string): void {\n const parsed = new URL(url);\n if (![\"http:\", \"https:\"].includes(parsed.protocol)) {\n throw new Error(\"Only http and https URLs are allowed\");\n }\n const hostname = parsed.hostname;\n if (\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"0.0.0.0\" ||\n hostname === \"[::1]\" ||\n hostname.startsWith(\"10.\") ||\n hostname.startsWith(\"172.16.\") ||\n hostname.startsWith(\"172.17.\") ||\n hostname.startsWith(\"172.18.\") ||\n hostname.startsWith(\"172.19.\") ||\n hostname.startsWith(\"172.2\") ||\n hostname.startsWith(\"172.30.\") ||\n hostname.startsWith(\"172.31.\") ||\n hostname.startsWith(\"192.168.\") ||\n hostname.endsWith(\".internal\") ||\n hostname.endsWith(\".local\") ||\n hostname === \"metadata.google.internal\" ||\n hostname === \"169.254.169.254\"\n ) {\n throw new Error(\"Internal/private URLs are not allowed\");\n }\n}\n\n// ---------------------------------------------------------------------------\n// GitHub helpers\n// ---------------------------------------------------------------------------\n\n/** Parse a GitHub URL or \"org/repo\" shorthand into owner + repo. */\nexport function parseOwnerRepo(raw: string): {\n owner: string;\n repo: string;\n} {\n const cleaned = raw\n .trim()\n .replace(/[?#].*$/, \"\")\n .replace(/\\/+$/, \"\");\n\n const sshMatch = cleaned.match(\n /^(?:ssh:\\/\\/)?git@github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?$/,\n );\n if (sshMatch) {\n return { owner: sshMatch[1], repo: sshMatch[2] };\n }\n\n const shorthand = cleaned.match(/^([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/);\n if (shorthand) {\n return { owner: shorthand[1], repo: shorthand[2] };\n }\n const urlMatch = cleaned.match(\n /github\\.com[:/]([^/]+)\\/([^/]+?)(?:\\.git)?(?:\\/.*)?$/,\n );\n if (urlMatch) {\n return { owner: urlMatch[1], repo: urlMatch[2] };\n }\n throw new Error(\n \"Could not parse GitHub owner/repo from URL. \" +\n 'Expected format: \"https://github.com/org/repo\", \"org/repo\", or \"git@github.com:org/repo.git\"',\n );\n}\n\n/** Fetch a path from the GitHub Contents API as JSON. Returns null on error. */\nfunction githubHeaders(\n accept: string,\n options: GitHubFetchOptions = {},\n): Record<string, string> {\n return {\n Accept: accept,\n \"User-Agent\": \"AgentNative/1.0\",\n ...(options.token ? { Authorization: `Bearer ${options.token}` } : {}),\n };\n}\n\n/** Fetch a path from the GitHub Contents API as JSON with status details. */\nexport async function fetchGitHubJsonResult<T = unknown>(\n owner: string,\n repo: string,\n path: string,\n options: GitHubFetchOptions = {},\n): Promise<GitHubJsonResult<T>> {\n const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n validateUrl(url);\n const res = await ssrfSafeFetch(url, {\n headers: githubHeaders(\"application/vnd.github.v3+json\", options),\n signal: AbortSignal.timeout(FETCH_TIMEOUT),\n });\n if (!res.ok) {\n let message: string | undefined;\n try {\n const body = (await res.json()) as { message?: unknown };\n if (typeof body.message === \"string\") message = body.message;\n } catch {\n try {\n const text = await res.text();\n if (text) message = text.slice(0, 200);\n } catch {\n // Keep the status-only result.\n }\n }\n return { ok: false, status: res.status, data: null, message };\n }\n return { ok: true, status: res.status, data: (await res.json()) as T };\n}\n\n/** Fetch a path from the GitHub Contents API as JSON. Returns null on error. */\nexport async function fetchGitHubJson(\n owner: string,\n repo: string,\n path: string,\n options: GitHubFetchOptions = {},\n): Promise<unknown> {\n const result = await fetchGitHubJsonResult(owner, repo, path, options);\n return result.ok ? result.data : null;\n}\n\n/** Fetch raw file content from the GitHub Contents API. Returns null on error or oversize. */\nexport async function fetchGitHubRaw(\n owner: string,\n repo: string,\n path: string,\n options: GitHubFetchOptions = {},\n): Promise<string | null> {\n const url = `https://api.github.com/repos/${owner}/${repo}/contents/${path}`;\n validateUrl(url);\n const res = await ssrfSafeFetch(url, {\n headers: githubHeaders(\"application/vnd.github.v3.raw\", options),\n signal: AbortSignal.timeout(FETCH_TIMEOUT),\n });\n if (!res.ok) return null;\n\n const cl = res.headers.get(\"content-length\");\n if (cl && parseInt(cl, 10) > MAX_FILE_SIZE) return null;\n\n const text = await res.text();\n if (text.length > MAX_FILE_SIZE) return null;\n return text;\n}\n\n// ---------------------------------------------------------------------------\n// Tailwind config parser\n// ---------------------------------------------------------------------------\n\n/** Extract colors, fonts, spacing, borderRadius from a Tailwind config file string. */\nexport function parseTailwindConfig(content: string): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n\n const colorsMatch = content.match(\n /colors\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (colorsMatch) {\n try {\n const colors: Record<string, string> = {};\n const pairs = colorsMatch[1].matchAll(\n /['\"]?([\\w-]+)['\"]?\\s*:\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n colors[p[1]] = p[2];\n }\n if (Object.keys(colors).length > 0) result.colors = colors;\n } catch {\n // skip\n }\n }\n\n const fontMatch = content.match(\n /fontFamily\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (fontMatch) {\n const fonts: Record<string, string> = {};\n const pairs = fontMatch[1].matchAll(\n /['\"]?([\\w-]+)['\"]?\\s*:\\s*\\[?\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n fonts[p[1]] = p[2];\n }\n if (Object.keys(fonts).length > 0) result.fontFamily = fonts;\n }\n\n const spacingMatch = content.match(\n /spacing\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (spacingMatch) {\n const spacing: Record<string, string> = {};\n const pairs = spacingMatch[1].matchAll(\n /['\"]?([\\w.-]+)['\"]?\\s*:\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n spacing[p[1]] = p[2];\n }\n if (Object.keys(spacing).length > 0) result.spacing = spacing;\n }\n\n const radiusMatch = content.match(\n /borderRadius\\s*:\\s*(\\{[\\s\\S]*?\\n\\s{4}\\}|\\{[^}]+\\})/,\n );\n if (radiusMatch) {\n const radii: Record<string, string> = {};\n const pairs = radiusMatch[1].matchAll(\n /['\"]?([\\w-]+)['\"]?\\s*:\\s*['\"]([^'\"]+)['\"]/g,\n );\n for (const p of pairs) {\n radii[p[1]] = p[2];\n }\n if (Object.keys(radii).length > 0) result.borderRadius = radii;\n }\n\n return result;\n}\n\n// ---------------------------------------------------------------------------\n// CSS parser\n// ---------------------------------------------------------------------------\n\n/** Extract CSS custom properties and @font-face / Google Fonts from CSS content. */\nexport function parseCss(content: string): ParsedCss {\n const cssCustomProperties: Record<string, string> = {};\n const varMatches = content.matchAll(/--([\\w-]+)\\s*:\\s*([^;}\\n]+)/g);\n for (const m of varMatches) {\n cssCustomProperties[`--${m[1]}`] = m[2].trim();\n }\n\n const fonts: string[] = [];\n const fontFaceMatches = content.matchAll(/@font-face\\s*\\{([^}]+)\\}/g);\n for (const m of fontFaceMatches) {\n const familyMatch = m[1].match(/font-family\\s*:\\s*[\"']?([^\"';]+)[\"']?/);\n if (familyMatch) fonts.push(familyMatch[1].trim());\n }\n\n const importMatches = content.matchAll(\n /@import\\s+url\\(\\s*['\"]?(fonts\\.googleapis\\.com[^'\")\\s]+)['\"]?\\s*\\)/g,\n );\n for (const m of importMatches) {\n const familyParam = m[1].match(/family=([^&\"')\\s]+)/);\n if (familyParam) {\n fonts.push(decodeURIComponent(familyParam[1]).replace(/\\+/g, \" \"));\n }\n }\n\n return {\n cssCustomProperties:\n Object.keys(cssCustomProperties).length > 0\n ? cssCustomProperties\n : undefined,\n fonts: fonts.length > 0 ? [...new Set(fonts)] : undefined,\n };\n}\n\n// ---------------------------------------------------------------------------\n// Styling framework detection\n// ---------------------------------------------------------------------------\n\n/** Detect the styling framework from a package.json string. */\nexport function detectStylingFramework(content: string): string | undefined {\n try {\n const pkg = JSON.parse(content);\n const all = {\n ...pkg.dependencies,\n ...pkg.devDependencies,\n };\n if (all[\"tailwindcss\"] || all[\"@tailwindcss/cli\"]) return \"tailwindcss\";\n if (all[\"styled-components\"]) return \"styled-components\";\n if (all[\"@emotion/react\"] || all[\"@emotion/styled\"]) return \"emotion\";\n if (all[\"sass\"] || all[\"node-sass\"]) return \"sass\";\n if (all[\"less\"]) return \"less\";\n if (all[\"@vanilla-extract/css\"]) return \"vanilla-extract\";\n if (all[\"windicss\"]) return \"windicss\";\n if (all[\"unocss\"]) return \"unocss\";\n return undefined;\n } catch {\n return undefined;\n }\n}\n\n// ---------------------------------------------------------------------------\n// Code file analysis helpers (import-code)\n// ---------------------------------------------------------------------------\n\n/** Create a fresh state object for code file analysis. */\nexport function createCodeAnalysisState(): CodeAnalysisState {\n return {\n colors: {},\n cssCustomProperties: {},\n fonts: [],\n spacing: {},\n borderRadius: {},\n stylingFramework: null,\n rawExtracts: [],\n seenFonts: new Set<string>(),\n };\n}\n\n/** De-duplicate and add a font to the analysis state. */\nexport function addFont(\n state: CodeAnalysisState,\n family: string,\n source?: string,\n): void {\n const normalized = family.trim().replace(/[\"']/g, \"\");\n if (!normalized || state.seenFonts.has(normalized.toLowerCase())) return;\n state.seenFonts.add(normalized.toLowerCase());\n state.fonts.push({ family: normalized, source });\n}\n\n/** Extract CSS custom properties, classifying them by name into colors/spacing/radius. */\nexport function extractCssVars(\n state: CodeAnalysisState,\n content: string,\n): void {\n const pattern = /--([\\w-]+)\\s*:\\s*([^;}\\n]+)/g;\n let match;\n while ((match = pattern.exec(content)) !== null) {\n const name = `--${match[1]}`;\n const value = match[2].trim();\n state.cssCustomProperties[name] = value;\n\n if (\n /color|bg|background|text|border|accent|primary|secondary|surface|muted|foreground/i.test(\n match[1],\n )\n ) {\n state.colors[name] = value;\n } else if (/spacing|gap|padding|margin|space/i.test(match[1])) {\n state.spacing[name] = value;\n } else if (/radius|rounded/i.test(match[1])) {\n state.borderRadius[name] = value;\n }\n }\n}\n\n/** Extract literal color values (hex, rgb, hsl, oklch) from content. */\nexport function extractCodeColors(\n state: CodeAnalysisState,\n content: string,\n): void {\n const hexPattern = /#[0-9a-fA-F]{3,8}\\b/g;\n let m;\n while ((m = hexPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n\n const rgbPattern =\n /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+(?:\\s*,\\s*[\\d.]+)?\\s*\\)/g;\n while ((m = rgbPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n\n const hslPattern =\n /hsla?\\(\\s*\\d+\\s*,\\s*[\\d.]+%\\s*,\\s*[\\d.]+%(?:\\s*,\\s*[\\d.]+)?\\s*\\)/g;\n while ((m = hslPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n\n const oklchPattern =\n /oklch\\(\\s*[\\d.]+%?\\s+[\\d.]+\\s+[\\d.]+(?:\\s*\\/\\s*[\\d.]+)?\\s*\\)/g;\n while ((m = oklchPattern.exec(content)) !== null) {\n state.colors[m[0]] = m[0];\n }\n}\n\n/** Extract font-family declarations and @font-face blocks from CSS-like content. */\nexport function extractCodeFonts(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n const fontFamilyPattern = /font-family\\s*:\\s*[\"']?([^\"';}\\n]+)/g;\n let m;\n while ((m = fontFamilyPattern.exec(content)) !== null) {\n const families = m[1].split(\",\");\n for (const fam of families) {\n const trimmed = fam.trim().replace(/[\"']/g, \"\");\n if (\n trimmed &&\n !/^(sans-serif|serif|monospace|cursive|fantasy|system-ui|inherit|initial)$/i.test(\n trimmed,\n )\n ) {\n addFont(state, trimmed, filename);\n }\n }\n }\n\n const fontFacePattern = /@font-face\\s*\\{([^}]+)\\}/g;\n while ((m = fontFacePattern.exec(content)) !== null) {\n const block = m[1];\n const familyMatch = block.match(/font-family\\s*:\\s*[\"']?([^\"';]+)[\"']?/);\n if (familyMatch) {\n addFont(state, familyMatch[1], filename);\n }\n }\n}\n\n/** Analyze a CSS/SCSS/LESS file, extracting vars, colors, and fonts. */\nexport function analyzeCssFile(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n extractCssVars(state, content);\n extractCodeColors(state, content);\n extractCodeFonts(state, content, filename);\n state.rawExtracts.push({ filename, type: \"css\", data: { parsed: true } });\n}\n\n/** Analyze a Tailwind config file for tokens. */\nexport function analyzeTailwindConfig(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n state.stylingFramework = \"tailwind\";\n\n const colorsBlockMatch = content.match(/colors\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (colorsBlockMatch) {\n const pairPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = pairPattern.exec(colorsBlockMatch[1])) !== null) {\n state.colors[m[1]] = m[2];\n }\n }\n\n const fontFamilyBlockMatch = content.match(/fontFamily\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (fontFamilyBlockMatch) {\n const fontPairPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*\\[?\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = fontPairPattern.exec(fontFamilyBlockMatch[1])) !== null) {\n addFont(state, m[2], filename);\n }\n }\n\n const spacingBlockMatch = content.match(/spacing\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (spacingBlockMatch) {\n const pairPattern = /[\"']?([\\w.-]+)[\"']?\\s*:\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = pairPattern.exec(spacingBlockMatch[1])) !== null) {\n state.spacing[m[1]] = m[2];\n }\n }\n\n const radiusBlockMatch = content.match(/borderRadius\\s*:\\s*\\{([\\s\\S]*?)\\}/);\n if (radiusBlockMatch) {\n const pairPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*[\"']([^\"']+)[\"']/g;\n let m;\n while ((m = pairPattern.exec(radiusBlockMatch[1])) !== null) {\n state.borderRadius[m[1]] = m[2];\n }\n }\n\n extractCodeColors(state, content);\n\n state.rawExtracts.push({\n filename,\n type: \"tailwind-config\",\n data: {\n hasColors: !!colorsBlockMatch,\n hasFontFamily: !!fontFamilyBlockMatch,\n hasSpacing: !!spacingBlockMatch,\n hasBorderRadius: !!radiusBlockMatch,\n },\n });\n}\n\n/** Walk a parsed JSON theme object, extracting tokens into state. */\nexport function analyzeJsonTheme(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n try {\n const json = JSON.parse(content);\n const walk = (obj: Record<string, unknown>, prefix: string) => {\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (typeof value === \"string\") {\n const lower = key.toLowerCase();\n if (\n /color|bg|background|text|border|accent|primary|secondary|surface/i.test(\n lower,\n ) ||\n /^#[0-9a-fA-F]{3,8}$/.test(value)\n ) {\n state.colors[path] = value;\n } else if (/font|family|typeface/i.test(lower)) {\n addFont(state, value, filename);\n } else if (/spacing|gap|padding|margin|space/i.test(lower)) {\n state.spacing[path] = value;\n } else if (/radius|rounded/i.test(lower)) {\n state.borderRadius[path] = value;\n }\n } else if (\n value &&\n typeof value === \"object\" &&\n !Array.isArray(value)\n ) {\n walk(value as Record<string, unknown>, path);\n }\n }\n };\n walk(json, \"\");\n state.rawExtracts.push({\n filename,\n type: \"json-theme\",\n data: { keys: Object.keys(json) },\n });\n } catch {\n state.rawExtracts.push({\n filename,\n type: \"json-theme\",\n data: { parseError: true },\n });\n }\n}\n\n/** Analyze package.json for styling framework deps. */\nexport function analyzePackageJson(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n try {\n const json = JSON.parse(content);\n const allDeps = {\n ...json.dependencies,\n ...json.devDependencies,\n };\n\n const detected: string[] = [];\n for (const fw of FRAMEWORK_DETECTORS) {\n if (allDeps && fw.name in allDeps) {\n detected.push(fw.label);\n if (!state.stylingFramework) {\n state.stylingFramework = fw.label;\n }\n }\n }\n\n state.rawExtracts.push({\n filename,\n type: \"package-json\",\n data: { stylingDeps: detected },\n });\n } catch {\n state.rawExtracts.push({\n filename,\n type: \"package-json\",\n data: { parseError: true },\n });\n }\n}\n\n/** Analyze a theme source file (theme.ts, tokens.ts) for design tokens. */\nexport function analyzeThemeSourceFile(\n state: CodeAnalysisState,\n content: string,\n filename: string,\n): void {\n const namedHexPattern =\n /(?:const|let|var|export)\\s+(\\w+)\\s*=\\s*[\"']?(#[0-9a-fA-F]{3,8})\\b/g;\n let m;\n while ((m = namedHexPattern.exec(content)) !== null) {\n state.colors[m[1]] = m[2];\n }\n\n const kvHexPattern = /[\"']?([\\w-]+)[\"']?\\s*:\\s*[\"'](#[0-9a-fA-F]{3,8})[\"']/g;\n while ((m = kvHexPattern.exec(content)) !== null) {\n state.colors[m[1]] = m[2];\n }\n\n const fontStringPattern =\n /(?:font|family|typeface)\\w*\\s*[:=]\\s*[\"']([^\"']+)[\"']/gi;\n while ((m = fontStringPattern.exec(content)) !== null) {\n addFont(state, m[1], filename);\n }\n\n const spacingPattern =\n /(?:spacing|gap|padding|margin)\\w*\\s*[:=]\\s*[\"']([^\"']+)[\"']/gi;\n while ((m = spacingPattern.exec(content)) !== null) {\n state.spacing[m[0].split(/[:=]/)[0].trim()] = m[1];\n }\n\n extractCodeColors(state, content);\n\n state.rawExtracts.push({\n filename,\n type: \"theme-source\",\n data: { parsed: true },\n });\n}\n\n/** Route a file to the correct analyzer based on filename. */\nexport function analyzeCodeFile(\n state: CodeAnalysisState,\n filename: string,\n content: string,\n): void {\n const name = filename.toLowerCase();\n const basename = name.split(\"/\").pop() ?? name;\n\n if (basename.startsWith(\"tailwind.config\")) {\n analyzeTailwindConfig(state, content, filename);\n } else if (basename === \"package.json\") {\n analyzePackageJson(state, content, filename);\n } else if (\n basename === \"theme.json\" ||\n basename === \"tokens.json\" ||\n basename.endsWith(\".tokens.json\")\n ) {\n analyzeJsonTheme(state, content, filename);\n } else if (name.endsWith(\".css\")) {\n analyzeCssFile(state, content, filename);\n } else if (\n /^theme\\.(ts|js)$/.test(basename) ||\n /^tokens\\.(ts|js)$/.test(basename)\n ) {\n analyzeThemeSourceFile(state, content, filename);\n } else if (\n name.endsWith(\".ts\") ||\n name.endsWith(\".tsx\") ||\n name.endsWith(\".js\") ||\n name.endsWith(\".jsx\")\n ) {\n extractCodeColors(state, content);\n extractCodeFonts(state, content, filename);\n extractCssVars(state, content);\n state.rawExtracts.push({\n filename,\n type: \"source\",\n data: { lightPass: true },\n });\n } else if (name.endsWith(\".json\")) {\n analyzeJsonTheme(state, content, filename);\n } else if (\n name.endsWith(\".scss\") ||\n name.endsWith(\".sass\") ||\n name.endsWith(\".less\")\n ) {\n analyzeCssFile(state, content, filename);\n if (!state.stylingFramework) {\n state.stylingFramework = name.endsWith(\".less\") ? \"less\" : \"sass\";\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Document analysis helpers (import-document)\n// ---------------------------------------------------------------------------\n\n/** Deduplicate and trim an array of strings. */\nexport function unique(arr: string[]): string[] {\n return [...new Set(arr.map((s) => s.trim()))];\n}\n\n/** Extract hex and named colors from plain text. */\nexport function extractDocumentColors(text: string): string[] {\n const hex = text.match(HEX_COLOR_RE) ?? [];\n const named = text.match(NAMED_COLOR_RE) ?? [];\n return unique([...hex, ...named.map((n) => n.toLowerCase())]);\n}\n\n/** Extract known font family names from plain text. */\nexport function extractDocumentFonts(text: string): string[] {\n const matches = text.match(FONT_NAME_RE) ?? [];\n return unique(matches);\n}\n\n/** Classify a file type string into a content category. */\nexport function classifyFile(fileType: string): ContentType {\n const ft = fileType.toLowerCase();\n if (\n ft.includes(\"pptx\") ||\n ft.includes(\"ppt\") ||\n ft.includes(\"presentation\") ||\n ft.includes(\"keynote\")\n )\n return \"presentation\";\n if (\n ft.includes(\"docx\") ||\n ft.includes(\"doc\") ||\n ft.includes(\"document\") ||\n ft.includes(\"rtf\")\n )\n return \"document\";\n if (\n ft.includes(\"xlsx\") ||\n ft.includes(\"xls\") ||\n ft.includes(\"spreadsheet\") ||\n ft.includes(\"csv\")\n )\n return \"spreadsheet\";\n if (ft.includes(\"pdf\")) return \"pdf\";\n return \"other\";\n}\n\n/** Return per-type suggestions for how to use a document for design extraction. */\nexport function suggestionsForType(\n contentType: ContentType,\n hasText: boolean,\n): string[] {\n const base: string[] = [];\n\n switch (contentType) {\n case \"presentation\":\n base.push(\n \"Look for slide master/theme colors — these define the brand palette\",\n \"Check heading fonts on title slides for the brand typeface\",\n \"Note any accent colors used for callouts or highlights\",\n \"Slide backgrounds may reveal primary and secondary brand colors\",\n \"Chart/graph colors often match the brand accent palette\",\n );\n break;\n case \"document\":\n base.push(\n \"Heading styles reveal the typographic hierarchy and heading font\",\n \"Body text font is likely the primary readable typeface\",\n \"Look for colored headings or accent text for brand colors\",\n \"Document margins and spacing suggest preferred density\",\n \"Header/footer formatting may include brand colors or logos\",\n );\n break;\n case \"spreadsheet\":\n base.push(\n \"Header row colors often reflect the brand palette\",\n \"Conditional formatting colors may indicate status/accent colors\",\n \"Chart and graph colors are strong brand palette signals\",\n \"Cell background highlighting colors suggest accent palette\",\n );\n break;\n case \"pdf\":\n base.push(\n \"PDF may contain embedded brand guidelines or style specs\",\n \"Look for consistent heading colors and font choices\",\n \"Background colors and accent bars reveal brand palette\",\n );\n break;\n case \"other\":\n base.push(\n \"Examine any visual elements for recurring color patterns\",\n \"Note any typography that appears intentionally branded\",\n );\n break;\n }\n\n if (!hasText) {\n base.push(\n \"No text content was extracted — ask the user to paste key sections or send the file as a chat attachment for visual analysis\",\n );\n }\n\n return base;\n}\n\n// ---------------------------------------------------------------------------\n// URL scraping helpers (import-from-url)\n// ---------------------------------------------------------------------------\n\n/** Fetch and extract design tokens from a URL's HTML. */\nexport async function extractDesignTokensFromUrl(\n rawUrl: string,\n): Promise<UrlExtractionResult> {\n const url = rawUrl.startsWith(\"http\") ? rawUrl : `https://${rawUrl}`;\n validateUrl(url);\n\n const response = await ssrfSafeFetch(url, {\n headers: {\n \"User-Agent\":\n \"Mozilla/5.0 (compatible; AgentNative/1.0; +https://agent-native.com)\",\n },\n signal: AbortSignal.timeout(10000),\n });\n const html = await response.text();\n\n const result: UrlExtractionResult = { url };\n\n // Title\n const titleMatch = html.match(/<title[^>]*>([^<]+)<\\/title>/i);\n if (titleMatch) {\n result.pageTitle = titleMatch[1].trim();\n }\n\n // Meta description\n const descMatch = html.match(\n /<meta[^>]*name=[\"']description[\"'][^>]*content=[\"']([^\"']+)[\"']/i,\n );\n if (descMatch) {\n result.metaDescription = descMatch[1];\n }\n\n // Meta theme-color\n const themeColorMatch = html.match(\n /<meta[^>]*name=[\"']theme-color[\"'][^>]*content=[\"']([^\"']+)[\"']/i,\n );\n if (themeColorMatch) {\n result.themeColor = themeColorMatch[1];\n }\n\n // CSS custom properties\n const cssVarMatches = html.matchAll(/--([\\w-]+)\\s*:\\s*([^;}\\n]+)/g);\n const cssVars: Record<string, string> = {};\n for (const match of cssVarMatches) {\n cssVars[`--${match[1]}`] = match[2].trim();\n }\n if (Object.keys(cssVars).length > 0) {\n const entries = Object.entries(cssVars).slice(0, 50);\n result.cssCustomProperties = Object.fromEntries(entries);\n }\n\n // Inline colors (hex, rgb)\n const colorMatches = new Set<string>();\n const hexPattern = /#[0-9a-fA-F]{3,8}\\b/g;\n let hexMatch;\n while ((hexMatch = hexPattern.exec(html)) !== null) {\n colorMatches.add(hexMatch[0]);\n }\n const rgbPattern =\n /rgba?\\(\\s*\\d+\\s*,\\s*\\d+\\s*,\\s*\\d+(?:\\s*,\\s*[\\d.]+)?\\s*\\)/g;\n let rgbMatch;\n while ((rgbMatch = rgbPattern.exec(html)) !== null) {\n colorMatches.add(rgbMatch[0]);\n }\n if (colorMatches.size > 0) {\n result.colors = [...colorMatches].slice(0, 30);\n }\n\n // @font-face\n const fontFaceMatches = html.matchAll(/@font-face\\s*\\{([^}]+)\\}/g);\n const fonts: { family?: string; src?: string }[] = [];\n for (const match of fontFaceMatches) {\n const block = match[1];\n const familyMatch = block.match(/font-family\\s*:\\s*[\"']?([^\"';]+)[\"']?/);\n const srcMatch = block.match(/src\\s*:\\s*([^;]+)/);\n fonts.push({\n family: familyMatch?.[1]?.trim(),\n src: srcMatch?.[1]?.trim()?.slice(0, 200),\n });\n }\n if (fonts.length > 0) {\n result.fontFaces = fonts.slice(0, 20);\n }\n\n // Google Fonts\n const googleFontMatches = html.matchAll(\n /fonts\\.googleapis\\.com\\/css2?\\?[^\"'>\\s]+/g,\n );\n const googleFonts: string[] = [];\n for (const match of googleFontMatches) {\n googleFonts.push(match[0]);\n }\n if (googleFonts.length > 0) {\n result.googleFonts = googleFonts;\n }\n\n // OG image\n const ogImageMatch = html.match(\n /<meta[^>]*property=[\"']og:image[\"'][^>]*content=[\"']([^\"']+)[\"']/i,\n );\n if (ogImageMatch) {\n result.ogImage = ogImageMatch[1];\n }\n\n // Favicon\n const faviconMatch = html.match(\n /<link[^>]*rel=[\"'](?:icon|shortcut icon)[\"'][^>]*href=[\"']([^\"']+)[\"']/i,\n );\n if (faviconMatch) {\n result.favicon = faviconMatch[1];\n }\n\n return result;\n}\n"]}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* fusion-app — server helpers for driving the Builder Fusion app-building
|
|
3
|
+
* backend (ai-services) from agent-native apps.
|
|
4
|
+
*
|
|
5
|
+
* Fusion projects/branches are full running apps: a cloud container runs the
|
|
6
|
+
* dev server (preview URL) and an in-container coding agent applies edits.
|
|
7
|
+
* These helpers cover the lifecycle an app template needs:
|
|
8
|
+
*
|
|
9
|
+
* - `ensureFusionContainer` — boot/attach the branch container, resolve the
|
|
10
|
+
* iframe-able dev-server preview URL.
|
|
11
|
+
* - `sendFusionBranchMessage` — send a prompt to the branch's coding agent
|
|
12
|
+
* (fire-and-forget by default so callers stay
|
|
13
|
+
* within hosted action budgets).
|
|
14
|
+
* - `pushFusionBranch` — push the branch's code to its git remote.
|
|
15
|
+
* - `reserveFusionHostingSlug` — reserve a `<slug>.builder.cloud` hosting slug.
|
|
16
|
+
* - `deployFusionProject` — trigger a hosted deploy of the project.
|
|
17
|
+
* - `getFusionDeploys` — list deploys (poll deploy status).
|
|
18
|
+
*
|
|
19
|
+
* All calls authenticate the same way as `runBuilderAgent`: the Builder
|
|
20
|
+
* private key as a bearer token plus the space/public key as the `apiKey`
|
|
21
|
+
* query param, resolved through the shared credential provider.
|
|
22
|
+
*
|
|
23
|
+
* Endpoints match ai-services `packages/service/main.ts`; streaming endpoints
|
|
24
|
+
* respond with newline-delimited JSON over chunked HTTP.
|
|
25
|
+
*/
|
|
26
|
+
export interface FusionBranchRef {
|
|
27
|
+
projectId: string;
|
|
28
|
+
branchName: string;
|
|
29
|
+
}
|
|
30
|
+
export interface EnsureFusionContainerResult {
|
|
31
|
+
/**
|
|
32
|
+
* `ready` — container is up; `url` is the dev-server preview URL.
|
|
33
|
+
* `provisioning` — still booting when the time budget ran out; callers
|
|
34
|
+
* should poll again.
|
|
35
|
+
* `error` — the backend reported a failure.
|
|
36
|
+
*/
|
|
37
|
+
status: "ready" | "provisioning" | "error";
|
|
38
|
+
url?: string;
|
|
39
|
+
/** Last human-readable progress/error message seen on the stream. */
|
|
40
|
+
message?: string;
|
|
41
|
+
}
|
|
42
|
+
export interface SendFusionMessageResult {
|
|
43
|
+
sent: boolean;
|
|
44
|
+
/** Final agent text when the call waited for completion. */
|
|
45
|
+
response?: string;
|
|
46
|
+
error?: string;
|
|
47
|
+
}
|
|
48
|
+
/** The Builder visual-editor URL for a fusion branch. */
|
|
49
|
+
export declare function getFusionBranchEditorUrl(ref: FusionBranchRef): string;
|
|
50
|
+
/** Public URL for a reserved fusion hosting slug. */
|
|
51
|
+
export declare function getFusionHostingUrl(slug: string): string;
|
|
52
|
+
/**
|
|
53
|
+
* Ensure the branch container is running and resolve its preview URL.
|
|
54
|
+
*
|
|
55
|
+
* Streams provisioning progress from `/projects/ensure-container`; resolves
|
|
56
|
+
* `ready` + `url` from the terminal chunk. When the container is still booting
|
|
57
|
+
* after `timeoutMs`, aborts the request and returns `provisioning` so callers
|
|
58
|
+
* can poll again without blowing their run budget.
|
|
59
|
+
*/
|
|
60
|
+
export declare function ensureFusionContainer(args: FusionBranchRef & {
|
|
61
|
+
timeoutMs?: number;
|
|
62
|
+
}): Promise<EnsureFusionContainerResult>;
|
|
63
|
+
/**
|
|
64
|
+
* Send a prompt to the fusion branch's in-container coding agent via
|
|
65
|
+
* `/projects/branch/message`.
|
|
66
|
+
*
|
|
67
|
+
* Defaults to `fireAndForget: true`: the backend dispatches the message and
|
|
68
|
+
* ends the stream without waiting for the agent turn, so this returns in
|
|
69
|
+
* seconds. Pass `fireAndForget: false` (with a generous `timeoutMs`) to wait
|
|
70
|
+
* for the turn and capture the agent's final text.
|
|
71
|
+
*/
|
|
72
|
+
export declare function sendFusionBranchMessage(args: FusionBranchRef & {
|
|
73
|
+
prompt: string;
|
|
74
|
+
fireAndForget?: boolean;
|
|
75
|
+
timeoutMs?: number;
|
|
76
|
+
userEmail?: string;
|
|
77
|
+
}): Promise<SendFusionMessageResult>;
|
|
78
|
+
/**
|
|
79
|
+
* Push the fusion branch's code to its git remote. Starts/attaches the
|
|
80
|
+
* container if needed, then syncs with `canPush`.
|
|
81
|
+
*/
|
|
82
|
+
export declare function pushFusionBranch(ref: FusionBranchRef): Promise<Record<string, unknown>>;
|
|
83
|
+
/** Reserve a hosting slug (`<slug>.builder.cloud`) for the project. */
|
|
84
|
+
export declare function reserveFusionHostingSlug(args: {
|
|
85
|
+
projectId: string;
|
|
86
|
+
slug: string;
|
|
87
|
+
}): Promise<{
|
|
88
|
+
slug: string;
|
|
89
|
+
}>;
|
|
90
|
+
/**
|
|
91
|
+
* Trigger a hosted deploy for the project. Requires a reserved hosting slug.
|
|
92
|
+
* Returns immediately; poll `getFusionDeploys` for progress
|
|
93
|
+
* (`queued → building → uploading → deploying → live | failed | canceled`).
|
|
94
|
+
*/
|
|
95
|
+
export declare function deployFusionProject(args: {
|
|
96
|
+
projectId: string;
|
|
97
|
+
checkoutBranch?: string;
|
|
98
|
+
}): Promise<{
|
|
99
|
+
deployId: string;
|
|
100
|
+
status: string;
|
|
101
|
+
}>;
|
|
102
|
+
/** List the project's deploys, optionally filtered to one deploy id. */
|
|
103
|
+
export declare function getFusionDeploys(args: {
|
|
104
|
+
projectId: string;
|
|
105
|
+
deployId?: string;
|
|
106
|
+
}): Promise<Array<Record<string, unknown>>>;
|
|
107
|
+
//# sourceMappingURL=fusion-app.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fusion-app.d.ts","sourceRoot":"","sources":["../../src/server/fusion-app.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAIH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,2BAA2B;IAC1C;;;;;OAKG;IACH,MAAM,EAAE,OAAO,GAAG,cAAc,GAAG,OAAO,CAAC;IAC3C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,qEAAqE;IACrE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,OAAO,CAAC;IACd,4DAA4D;IAC5D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAkCD,yDAAyD;AACzD,wBAAgB,wBAAwB,CAAC,GAAG,EAAE,eAAe,GAAG,MAAM,CAGrE;AAED,qDAAqD;AACrD,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAExD;AAiDD;;;;;;;GAOG;AACH,wBAAsB,qBAAqB,CACzC,IAAI,EAAE,eAAe,GAAG;IAAE,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAC7C,OAAO,CAAC,2BAA2B,CAAC,CAkEtC;AAID;;;;;;;;GAQG;AACH,wBAAsB,uBAAuB,CAC3C,IAAI,EAAE,eAAe,GAAG;IACtB,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,GACA,OAAO,CAAC,uBAAuB,CAAC,CAmGlC;AAuCD;;;GAGG;AACH,wBAAsB,gBAAgB,CACpC,GAAG,EAAE,eAAe,GACnB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAKlC;AAED,uEAAuE;AACvE,wBAAsB,wBAAwB,CAAC,IAAI,EAAE;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,OAAO,CAAC;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAQ5B;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CAAC,IAAI,EAAE;IAC9C,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,CAAC,EAAE,MAAM,CAAC;CACzB,GAAG,OAAO,CAAC;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAWhD;AAED,wEAAwE;AACxE,wBAAsB,gBAAgB,CAAC,IAAI,EAAE;IAC3C,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAiB1C"}
|