@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":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.d.ts","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"AAkWA,wBAAgB,aAAa,gCAI5B"}
|
|
@@ -3,8 +3,10 @@ import { useEffect, useState } from "react";
|
|
|
3
3
|
import { isRouteErrorResponse, useInRouterContext, useRouteError, } from "react-router";
|
|
4
4
|
import { DEFAULT_LOCALE, LOCALE_HYDRATION_GLOBAL, LOCALE_STORAGE_KEY, normalizeLocaleCode, } from "../localization/shared.js";
|
|
5
5
|
import { appPath } from "./api-path.js";
|
|
6
|
+
import { ErrorReportActions } from "./ErrorReportActions.js";
|
|
6
7
|
import { isDynamicImportFailureMessage, recoverFromStaleChunkError, } from "./route-chunk-recovery.js";
|
|
7
|
-
const
|
|
8
|
+
const primaryActionClassName = "inline-flex h-9 items-center gap-1.5 rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer";
|
|
9
|
+
const secondaryActionClassName = "inline-flex h-9 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 text-sm font-medium text-foreground shadow-sm hover:bg-accent";
|
|
8
10
|
const errorCopy = {
|
|
9
11
|
"en-US": {
|
|
10
12
|
loadingLatest: "Loading the latest version...",
|
|
@@ -15,6 +17,9 @@ const errorCopy = {
|
|
|
15
17
|
statusTitle: (status) => `${status} Error`,
|
|
16
18
|
goHome: "Go home",
|
|
17
19
|
reload: "Reload",
|
|
20
|
+
sendFeedback: "Send feedback",
|
|
21
|
+
feedbackPlaceholder: "Describe what happened before this error appeared.",
|
|
22
|
+
openGitHubIssue: "Open GitHub issue",
|
|
18
23
|
},
|
|
19
24
|
"zh-CN": {
|
|
20
25
|
loadingLatest: "正在加载最新版本...",
|
|
@@ -25,6 +30,9 @@ const errorCopy = {
|
|
|
25
30
|
statusTitle: (status) => `${status} 错误`,
|
|
26
31
|
goHome: "回到首页",
|
|
27
32
|
reload: "重新加载",
|
|
33
|
+
sendFeedback: "发送反馈",
|
|
34
|
+
feedbackPlaceholder: "描述此错误出现前发生了什么。",
|
|
35
|
+
openGitHubIssue: "打开 GitHub issue",
|
|
28
36
|
},
|
|
29
37
|
"zh-TW": {
|
|
30
38
|
loadingLatest: "正在載入最新版本...",
|
|
@@ -35,6 +43,9 @@ const errorCopy = {
|
|
|
35
43
|
statusTitle: (status) => `${status} 錯誤`,
|
|
36
44
|
goHome: "回首頁",
|
|
37
45
|
reload: "重新載入",
|
|
46
|
+
sendFeedback: "傳送意見回饋",
|
|
47
|
+
feedbackPlaceholder: "描述此錯誤出現前發生了什麼。",
|
|
48
|
+
openGitHubIssue: "開啟 GitHub issue",
|
|
38
49
|
},
|
|
39
50
|
"es-ES": {
|
|
40
51
|
loadingLatest: "Cargando la versión más reciente...",
|
|
@@ -45,6 +56,9 @@ const errorCopy = {
|
|
|
45
56
|
statusTitle: (status) => `Error ${status}`,
|
|
46
57
|
goHome: "Ir al inicio",
|
|
47
58
|
reload: "Recargar",
|
|
59
|
+
sendFeedback: "Enviar comentarios",
|
|
60
|
+
feedbackPlaceholder: "Describe qué pasó antes de que apareciera este error.",
|
|
61
|
+
openGitHubIssue: "Abrir issue en GitHub",
|
|
48
62
|
},
|
|
49
63
|
"fr-FR": {
|
|
50
64
|
loadingLatest: "Chargement de la dernière version...",
|
|
@@ -55,6 +69,9 @@ const errorCopy = {
|
|
|
55
69
|
statusTitle: (status) => `Erreur ${status}`,
|
|
56
70
|
goHome: "Accueil",
|
|
57
71
|
reload: "Recharger",
|
|
72
|
+
sendFeedback: "Envoyer un retour",
|
|
73
|
+
feedbackPlaceholder: "Décrivez ce qui s'est passé avant cette erreur.",
|
|
74
|
+
openGitHubIssue: "Ouvrir une issue GitHub",
|
|
58
75
|
},
|
|
59
76
|
"de-DE": {
|
|
60
77
|
loadingLatest: "Neueste Version wird geladen...",
|
|
@@ -65,6 +82,9 @@ const errorCopy = {
|
|
|
65
82
|
statusTitle: (status) => `Fehler ${status}`,
|
|
66
83
|
goHome: "Zur Startseite",
|
|
67
84
|
reload: "Neu laden",
|
|
85
|
+
sendFeedback: "Feedback senden",
|
|
86
|
+
feedbackPlaceholder: "Beschreiben Sie, was vor diesem Fehler passiert ist.",
|
|
87
|
+
openGitHubIssue: "GitHub-Issue öffnen",
|
|
68
88
|
},
|
|
69
89
|
"ja-JP": {
|
|
70
90
|
loadingLatest: "最新バージョンを読み込み中...",
|
|
@@ -75,6 +95,9 @@ const errorCopy = {
|
|
|
75
95
|
statusTitle: (status) => `${status} エラー`,
|
|
76
96
|
goHome: "ホームへ",
|
|
77
97
|
reload: "再読み込み",
|
|
98
|
+
sendFeedback: "フィードバックを送信",
|
|
99
|
+
feedbackPlaceholder: "このエラーの直前に起きたことを説明してください。",
|
|
100
|
+
openGitHubIssue: "GitHub issue を開く",
|
|
78
101
|
},
|
|
79
102
|
"ko-KR": {
|
|
80
103
|
loadingLatest: "최신 버전을 불러오는 중...",
|
|
@@ -85,6 +108,9 @@ const errorCopy = {
|
|
|
85
108
|
statusTitle: (status) => `${status} 오류`,
|
|
86
109
|
goHome: "홈으로 이동",
|
|
87
110
|
reload: "새로고침",
|
|
111
|
+
sendFeedback: "피드백 보내기",
|
|
112
|
+
feedbackPlaceholder: "이 오류가 나타나기 전에 무슨 일이 있었는지 적어 주세요.",
|
|
113
|
+
openGitHubIssue: "GitHub issue 열기",
|
|
88
114
|
},
|
|
89
115
|
"pt-BR": {
|
|
90
116
|
loadingLatest: "Carregando a versão mais recente...",
|
|
@@ -95,6 +121,9 @@ const errorCopy = {
|
|
|
95
121
|
statusTitle: (status) => `Erro ${status}`,
|
|
96
122
|
goHome: "Ir para início",
|
|
97
123
|
reload: "Recarregar",
|
|
124
|
+
sendFeedback: "Enviar feedback",
|
|
125
|
+
feedbackPlaceholder: "Descreva o que aconteceu antes deste erro aparecer.",
|
|
126
|
+
openGitHubIssue: "Abrir issue no GitHub",
|
|
98
127
|
},
|
|
99
128
|
"hi-IN": {
|
|
100
129
|
loadingLatest: "नवीनतम संस्करण लोड हो रहा है...",
|
|
@@ -105,6 +134,9 @@ const errorCopy = {
|
|
|
105
134
|
statusTitle: (status) => `${status} त्रुटि`,
|
|
106
135
|
goHome: "होम पर जाएं",
|
|
107
136
|
reload: "रीलोड करें",
|
|
137
|
+
sendFeedback: "फ़ीडबैक भेजें",
|
|
138
|
+
feedbackPlaceholder: "इस त्रुटि से पहले क्या हुआ, उसका वर्णन करें।",
|
|
139
|
+
openGitHubIssue: "GitHub issue खोलें",
|
|
108
140
|
},
|
|
109
141
|
"ar-SA": {
|
|
110
142
|
loadingLatest: "جار تحميل أحدث إصدار...",
|
|
@@ -115,6 +147,9 @@ const errorCopy = {
|
|
|
115
147
|
statusTitle: (status) => `خطأ ${status}`,
|
|
116
148
|
goHome: "العودة للرئيسية",
|
|
117
149
|
reload: "إعادة التحميل",
|
|
150
|
+
sendFeedback: "إرسال الملاحظات",
|
|
151
|
+
feedbackPlaceholder: "صف ما حدث قبل ظهور هذا الخطأ.",
|
|
152
|
+
openGitHubIssue: "فتح مشكلة في GitHub",
|
|
118
153
|
},
|
|
119
154
|
};
|
|
120
155
|
function readErrorLocale() {
|
|
@@ -224,7 +259,7 @@ function ErrorScreen({ error }) {
|
|
|
224
259
|
if (typeof console !== "undefined" && error) {
|
|
225
260
|
console.error("[ErrorBoundary]", error);
|
|
226
261
|
}
|
|
227
|
-
return (_jsx("main", { className: "flex items-center justify-center min-h-screen p-4 bg-background text-foreground", children: _jsxs("div", { className: "flex flex-col items-center text-center max-w-md", children: [status && (_jsx("span", { className: "text-7xl font-bold tracking-tight text-muted-foreground/40", children: status })), _jsx("h1", { className: "mt-3 text-2xl font-semibold", children: title }), _jsx("p", { className: "mt-2 text-muted-foreground text-sm", children: details }), _jsx("a", { href: appPath("/"), className:
|
|
262
|
+
return (_jsx("main", { className: "flex items-center justify-center min-h-screen p-4 bg-background text-foreground", children: _jsxs("div", { className: "flex flex-col items-center text-center max-w-md", children: [status && (_jsx("span", { className: "text-7xl font-bold tracking-tight text-muted-foreground/40", children: status })), _jsx("h1", { className: "mt-3 text-2xl font-semibold", children: title }), _jsx("p", { className: "mt-2 text-muted-foreground text-sm", children: details }), _jsxs("div", { className: "mt-6 flex flex-wrap justify-center gap-2", children: [_jsx("a", { href: appPath("/"), className: primaryActionClassName, children: copy.goHome }), _jsx("button", { type: "button", onClick: () => window.location.reload(), className: secondaryActionClassName, children: copy.reload }), _jsx(ErrorReportActions, { appName: "Agent Native", title: title, details: details, status: status, issueTitle: `Error screen: ${title}`, feedbackLabel: copy.sendFeedback, feedbackPlaceholder: copy.feedbackPlaceholder, githubLabel: copy.openGitHubIssue, feedbackClassName: "h-9", githubClassName: "h-9" })] }), stack && (_jsx("pre", { className: "mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded", children: _jsx("code", { children: stack }) }))] }) }));
|
|
228
263
|
}
|
|
229
264
|
function RoutedErrorScreen() {
|
|
230
265
|
return _jsx(ErrorScreen, { error: useRouteError() });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\n\nimport {\n DEFAULT_LOCALE,\n LOCALE_HYDRATION_GLOBAL,\n LOCALE_STORAGE_KEY,\n normalizeLocaleCode,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport { appPath } from \"./api-path.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst homeLinkClassName =\n \"mt-6 inline-flex items-center gap-1.5 rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\n\nconst errorCopy: Record<\n LocaleCode,\n {\n loadingLatest: string;\n genericTitle: string;\n genericDetails: string;\n notFoundTitle: string;\n notFoundDetails: string;\n statusTitle: (status: number) => string;\n goHome: string;\n reload: string;\n }\n> = {\n \"en-US\": {\n loadingLatest: \"Loading the latest version...\",\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails: \"We couldn't find this page.\",\n statusTitle: (status) => `${status} Error`,\n goHome: \"Go home\",\n reload: \"Reload\",\n },\n \"zh-CN\": {\n loadingLatest: \"正在加载最新版本...\",\n genericTitle: \"出错了\",\n genericDetails: \"发生了意外错误。\",\n notFoundTitle: \"页面未找到\",\n notFoundDetails: \"我们找不到这个页面。\",\n statusTitle: (status) => `${status} 错误`,\n goHome: \"回到首页\",\n reload: \"重新加载\",\n },\n \"zh-TW\": {\n loadingLatest: \"正在載入最新版本...\",\n genericTitle: \"發生錯誤\",\n genericDetails: \"發生未預期的錯誤。\",\n notFoundTitle: \"找不到頁面\",\n notFoundDetails: \"找不到這個頁面。\",\n statusTitle: (status) => `${status} 錯誤`,\n goHome: \"回首頁\",\n reload: \"重新載入\",\n },\n \"es-ES\": {\n loadingLatest: \"Cargando la versión más reciente...\",\n genericTitle: \"Algo salió mal\",\n genericDetails: \"Se produjo un error inesperado.\",\n notFoundTitle: \"Página no encontrada\",\n notFoundDetails: \"No pudimos encontrar esta página.\",\n statusTitle: (status) => `Error ${status}`,\n goHome: \"Ir al inicio\",\n reload: \"Recargar\",\n },\n \"fr-FR\": {\n loadingLatest: \"Chargement de la dernière version...\",\n genericTitle: \"Un problème est survenu\",\n genericDetails: \"Une erreur inattendue s'est produite.\",\n notFoundTitle: \"Page introuvable\",\n notFoundDetails: \"Nous n'avons pas trouvé cette page.\",\n statusTitle: (status) => `Erreur ${status}`,\n goHome: \"Accueil\",\n reload: \"Recharger\",\n },\n \"de-DE\": {\n loadingLatest: \"Neueste Version wird geladen...\",\n genericTitle: \"Etwas ist schiefgelaufen\",\n genericDetails: \"Ein unerwarteter Fehler ist aufgetreten.\",\n notFoundTitle: \"Seite nicht gefunden\",\n notFoundDetails: \"Wir konnten diese Seite nicht finden.\",\n statusTitle: (status) => `Fehler ${status}`,\n goHome: \"Zur Startseite\",\n reload: \"Neu laden\",\n },\n \"ja-JP\": {\n loadingLatest: \"最新バージョンを読み込み中...\",\n genericTitle: \"問題が発生しました\",\n genericDetails: \"予期しないエラーが発生しました。\",\n notFoundTitle: \"ページが見つかりません\",\n notFoundDetails: \"このページは見つかりませんでした。\",\n statusTitle: (status) => `${status} エラー`,\n goHome: \"ホームへ\",\n reload: \"再読み込み\",\n },\n \"ko-KR\": {\n loadingLatest: \"최신 버전을 불러오는 중...\",\n genericTitle: \"문제가 발생했습니다\",\n genericDetails: \"예기치 않은 오류가 발생했습니다.\",\n notFoundTitle: \"페이지를 찾을 수 없음\",\n notFoundDetails: \"이 페이지를 찾을 수 없습니다.\",\n statusTitle: (status) => `${status} 오류`,\n goHome: \"홈으로 이동\",\n reload: \"새로고침\",\n },\n \"pt-BR\": {\n loadingLatest: \"Carregando a versão mais recente...\",\n genericTitle: \"Algo deu errado\",\n genericDetails: \"Ocorreu um erro inesperado.\",\n notFoundTitle: \"Página não encontrada\",\n notFoundDetails: \"Não encontramos esta página.\",\n statusTitle: (status) => `Erro ${status}`,\n goHome: \"Ir para início\",\n reload: \"Recarregar\",\n },\n \"hi-IN\": {\n loadingLatest: \"नवीनतम संस्करण लोड हो रहा है...\",\n genericTitle: \"कुछ गलत हो गया\",\n genericDetails: \"एक अनपेक्षित त्रुटि हुई।\",\n notFoundTitle: \"पेज नहीं मिला\",\n notFoundDetails: \"हमें यह पेज नहीं मिला।\",\n statusTitle: (status) => `${status} त्रुटि`,\n goHome: \"होम पर जाएं\",\n reload: \"रीलोड करें\",\n },\n \"ar-SA\": {\n loadingLatest: \"جار تحميل أحدث إصدار...\",\n genericTitle: \"حدث خطأ ما\",\n genericDetails: \"حدث خطأ غير متوقع.\",\n notFoundTitle: \"الصفحة غير موجودة\",\n notFoundDetails: \"تعذر العثور على هذه الصفحة.\",\n statusTitle: (status) => `خطأ ${status}`,\n goHome: \"العودة للرئيسية\",\n reload: \"إعادة التحميل\",\n },\n};\n\nfunction readErrorLocale(): LocaleCode {\n if (typeof window === \"undefined\") return DEFAULT_LOCALE;\n const hydrated = (window as any)[LOCALE_HYDRATION_GLOBAL]?.locale;\n const stored = window.localStorage?.getItem(LOCALE_STORAGE_KEY);\n return (\n normalizeLocaleCode(hydrated) ??\n normalizeLocaleCode(stored) ??\n DEFAULT_LOCALE\n );\n}\n\nfunction useErrorCopy() {\n const [locale, setLocale] = useState<LocaleCode>(readErrorLocale);\n useEffect(() => {\n setLocale(readErrorLocale());\n }, []);\n return errorCopy[locale] ?? errorCopy[DEFAULT_LOCALE];\n}\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n const copy = useErrorCopy();\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">{copy.loadingLatest}</p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const copy = useErrorCopy();\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = copy.genericTitle;\n let details = copy.genericDetails;\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = copy.notFoundTitle;\n details = copy.notFoundDetails;\n } else {\n title = copy.statusTitle(error.status);\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <a href={appPath(\"/\")} className={homeLinkClassName}>\n {copy.goHome}\n </a>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className=\"mt-3 inline-flex cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 py-2 text-sm font-medium text-foreground shadow-sm hover:bg-accent\"\n >\n {copy.reload}\n </button>\n {stack && (\n <pre className=\"mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ErrorBoundary.js","sourceRoot":"","sources":["../../src/client/ErrorBoundary.tsx"],"names":[],"mappings":"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","sourcesContent":["import { useEffect, useState } from \"react\";\nimport {\n isRouteErrorResponse,\n useInRouterContext,\n useRouteError,\n} from \"react-router\";\n\nimport {\n DEFAULT_LOCALE,\n LOCALE_HYDRATION_GLOBAL,\n LOCALE_STORAGE_KEY,\n normalizeLocaleCode,\n type LocaleCode,\n} from \"../localization/shared.js\";\nimport { appPath } from \"./api-path.js\";\nimport { ErrorReportActions } from \"./ErrorReportActions.js\";\nimport {\n isDynamicImportFailureMessage,\n recoverFromStaleChunkError,\n} from \"./route-chunk-recovery.js\";\n\nconst primaryActionClassName =\n \"inline-flex h-9 items-center gap-1.5 rounded-md bg-primary px-4 text-sm font-medium text-primary-foreground shadow-sm hover:bg-primary/90 cursor-pointer\";\nconst secondaryActionClassName =\n \"inline-flex h-9 cursor-pointer items-center gap-1.5 rounded-md border border-border bg-background px-4 text-sm font-medium text-foreground shadow-sm hover:bg-accent\";\n\nconst errorCopy: Record<\n LocaleCode,\n {\n loadingLatest: string;\n genericTitle: string;\n genericDetails: string;\n notFoundTitle: string;\n notFoundDetails: string;\n statusTitle: (status: number) => string;\n goHome: string;\n reload: string;\n sendFeedback: string;\n feedbackPlaceholder: string;\n openGitHubIssue: string;\n }\n> = {\n \"en-US\": {\n loadingLatest: \"Loading the latest version...\",\n genericTitle: \"Something went wrong\",\n genericDetails: \"An unexpected error occurred.\",\n notFoundTitle: \"Page not found\",\n notFoundDetails: \"We couldn't find this page.\",\n statusTitle: (status) => `${status} Error`,\n goHome: \"Go home\",\n reload: \"Reload\",\n sendFeedback: \"Send feedback\",\n feedbackPlaceholder: \"Describe what happened before this error appeared.\",\n openGitHubIssue: \"Open GitHub issue\",\n },\n \"zh-CN\": {\n loadingLatest: \"正在加载最新版本...\",\n genericTitle: \"出错了\",\n genericDetails: \"发生了意外错误。\",\n notFoundTitle: \"页面未找到\",\n notFoundDetails: \"我们找不到这个页面。\",\n statusTitle: (status) => `${status} 错误`,\n goHome: \"回到首页\",\n reload: \"重新加载\",\n sendFeedback: \"发送反馈\",\n feedbackPlaceholder: \"描述此错误出现前发生了什么。\",\n openGitHubIssue: \"打开 GitHub issue\",\n },\n \"zh-TW\": {\n loadingLatest: \"正在載入最新版本...\",\n genericTitle: \"發生錯誤\",\n genericDetails: \"發生未預期的錯誤。\",\n notFoundTitle: \"找不到頁面\",\n notFoundDetails: \"找不到這個頁面。\",\n statusTitle: (status) => `${status} 錯誤`,\n goHome: \"回首頁\",\n reload: \"重新載入\",\n sendFeedback: \"傳送意見回饋\",\n feedbackPlaceholder: \"描述此錯誤出現前發生了什麼。\",\n openGitHubIssue: \"開啟 GitHub issue\",\n },\n \"es-ES\": {\n loadingLatest: \"Cargando la versión más reciente...\",\n genericTitle: \"Algo salió mal\",\n genericDetails: \"Se produjo un error inesperado.\",\n notFoundTitle: \"Página no encontrada\",\n notFoundDetails: \"No pudimos encontrar esta página.\",\n statusTitle: (status) => `Error ${status}`,\n goHome: \"Ir al inicio\",\n reload: \"Recargar\",\n sendFeedback: \"Enviar comentarios\",\n feedbackPlaceholder:\n \"Describe qué pasó antes de que apareciera este error.\",\n openGitHubIssue: \"Abrir issue en GitHub\",\n },\n \"fr-FR\": {\n loadingLatest: \"Chargement de la dernière version...\",\n genericTitle: \"Un problème est survenu\",\n genericDetails: \"Une erreur inattendue s'est produite.\",\n notFoundTitle: \"Page introuvable\",\n notFoundDetails: \"Nous n'avons pas trouvé cette page.\",\n statusTitle: (status) => `Erreur ${status}`,\n goHome: \"Accueil\",\n reload: \"Recharger\",\n sendFeedback: \"Envoyer un retour\",\n feedbackPlaceholder: \"Décrivez ce qui s'est passé avant cette erreur.\",\n openGitHubIssue: \"Ouvrir une issue GitHub\",\n },\n \"de-DE\": {\n loadingLatest: \"Neueste Version wird geladen...\",\n genericTitle: \"Etwas ist schiefgelaufen\",\n genericDetails: \"Ein unerwarteter Fehler ist aufgetreten.\",\n notFoundTitle: \"Seite nicht gefunden\",\n notFoundDetails: \"Wir konnten diese Seite nicht finden.\",\n statusTitle: (status) => `Fehler ${status}`,\n goHome: \"Zur Startseite\",\n reload: \"Neu laden\",\n sendFeedback: \"Feedback senden\",\n feedbackPlaceholder: \"Beschreiben Sie, was vor diesem Fehler passiert ist.\",\n openGitHubIssue: \"GitHub-Issue öffnen\",\n },\n \"ja-JP\": {\n loadingLatest: \"最新バージョンを読み込み中...\",\n genericTitle: \"問題が発生しました\",\n genericDetails: \"予期しないエラーが発生しました。\",\n notFoundTitle: \"ページが見つかりません\",\n notFoundDetails: \"このページは見つかりませんでした。\",\n statusTitle: (status) => `${status} エラー`,\n goHome: \"ホームへ\",\n reload: \"再読み込み\",\n sendFeedback: \"フィードバックを送信\",\n feedbackPlaceholder: \"このエラーの直前に起きたことを説明してください。\",\n openGitHubIssue: \"GitHub issue を開く\",\n },\n \"ko-KR\": {\n loadingLatest: \"최신 버전을 불러오는 중...\",\n genericTitle: \"문제가 발생했습니다\",\n genericDetails: \"예기치 않은 오류가 발생했습니다.\",\n notFoundTitle: \"페이지를 찾을 수 없음\",\n notFoundDetails: \"이 페이지를 찾을 수 없습니다.\",\n statusTitle: (status) => `${status} 오류`,\n goHome: \"홈으로 이동\",\n reload: \"새로고침\",\n sendFeedback: \"피드백 보내기\",\n feedbackPlaceholder:\n \"이 오류가 나타나기 전에 무슨 일이 있었는지 적어 주세요.\",\n openGitHubIssue: \"GitHub issue 열기\",\n },\n \"pt-BR\": {\n loadingLatest: \"Carregando a versão mais recente...\",\n genericTitle: \"Algo deu errado\",\n genericDetails: \"Ocorreu um erro inesperado.\",\n notFoundTitle: \"Página não encontrada\",\n notFoundDetails: \"Não encontramos esta página.\",\n statusTitle: (status) => `Erro ${status}`,\n goHome: \"Ir para início\",\n reload: \"Recarregar\",\n sendFeedback: \"Enviar feedback\",\n feedbackPlaceholder: \"Descreva o que aconteceu antes deste erro aparecer.\",\n openGitHubIssue: \"Abrir issue no GitHub\",\n },\n \"hi-IN\": {\n loadingLatest: \"नवीनतम संस्करण लोड हो रहा है...\",\n genericTitle: \"कुछ गलत हो गया\",\n genericDetails: \"एक अनपेक्षित त्रुटि हुई।\",\n notFoundTitle: \"पेज नहीं मिला\",\n notFoundDetails: \"हमें यह पेज नहीं मिला।\",\n statusTitle: (status) => `${status} त्रुटि`,\n goHome: \"होम पर जाएं\",\n reload: \"रीलोड करें\",\n sendFeedback: \"फ़ीडबैक भेजें\",\n feedbackPlaceholder: \"इस त्रुटि से पहले क्या हुआ, उसका वर्णन करें।\",\n openGitHubIssue: \"GitHub issue खोलें\",\n },\n \"ar-SA\": {\n loadingLatest: \"جار تحميل أحدث إصدار...\",\n genericTitle: \"حدث خطأ ما\",\n genericDetails: \"حدث خطأ غير متوقع.\",\n notFoundTitle: \"الصفحة غير موجودة\",\n notFoundDetails: \"تعذر العثور على هذه الصفحة.\",\n statusTitle: (status) => `خطأ ${status}`,\n goHome: \"العودة للرئيسية\",\n reload: \"إعادة التحميل\",\n sendFeedback: \"إرسال الملاحظات\",\n feedbackPlaceholder: \"صف ما حدث قبل ظهور هذا الخطأ.\",\n openGitHubIssue: \"فتح مشكلة في GitHub\",\n },\n};\n\nfunction readErrorLocale(): LocaleCode {\n if (typeof window === \"undefined\") return DEFAULT_LOCALE;\n const hydrated = (window as any)[LOCALE_HYDRATION_GLOBAL]?.locale;\n const stored = window.localStorage?.getItem(LOCALE_STORAGE_KEY);\n return (\n normalizeLocaleCode(hydrated) ??\n normalizeLocaleCode(stored) ??\n DEFAULT_LOCALE\n );\n}\n\nfunction useErrorCopy() {\n const [locale, setLocale] = useState<LocaleCode>(readErrorLocale);\n useEffect(() => {\n setLocale(readErrorLocale());\n }, []);\n return errorCopy[locale] ?? errorCopy[DEFAULT_LOCALE];\n}\n\nfunction useApplyThemeClass() {\n useEffect(() => {\n const root = document.documentElement;\n if (root.classList.contains(\"dark\") || root.classList.contains(\"light\"))\n return;\n try {\n const stored = localStorage.getItem(\"theme\");\n if (stored === \"dark\") {\n root.classList.add(\"dark\");\n } else if (stored === \"light\") {\n root.classList.add(\"light\");\n } else if (window.matchMedia(\"(prefers-color-scheme: dark)\").matches) {\n root.classList.add(\"dark\");\n }\n } catch {}\n }, []);\n}\n\nfunction errorMessageOf(error: unknown): string {\n if (error instanceof Error) return error.message;\n return typeof error === \"string\" ? error : \"\";\n}\n\n/**\n * When a route renders against a stale lazy chunk after a deploy (the chunk's\n * hashed filename no longer exists), the import rejection surfaces here. Reload\n * once to fetch fresh assets instead of stranding the user on an error screen.\n * The reload is loop-guarded; if it cannot recover, fall back to the screen.\n */\nfunction useStaleChunkRecovery(error: unknown): boolean {\n const [recovering, setRecovering] = useState(() =>\n isDynamicImportFailureMessage(errorMessageOf(error)),\n );\n useEffect(() => {\n if (!isDynamicImportFailureMessage(errorMessageOf(error))) {\n setRecovering(false);\n return;\n }\n if (!recoverFromStaleChunkError(error)) setRecovering(false);\n }, [error]);\n return recovering;\n}\n\nfunction UpdatingScreen() {\n const copy = useErrorCopy();\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <p className=\"text-muted-foreground text-sm\">{copy.loadingLatest}</p>\n </main>\n );\n}\n\nfunction ErrorScreen({ error }: { error: unknown }) {\n const copy = useErrorCopy();\n const recovering = useStaleChunkRecovery(error);\n // While auto-recovering a stale chunk, show a neutral state and skip the\n // console.error below so the transient, self-healing failure does not get\n // reported as a hard error.\n if (recovering) return <UpdatingScreen />;\n\n let status: number | null = null;\n let title = copy.genericTitle;\n let details = copy.genericDetails;\n let stack: string | undefined;\n\n if (isRouteErrorResponse(error)) {\n status = error.status;\n if (error.status === 404) {\n title = copy.notFoundTitle;\n details = copy.notFoundDetails;\n } else {\n title = copy.statusTitle(error.status);\n details = error.statusText || details;\n }\n } else if (error instanceof Error) {\n // Always surface the underlying error message — a generic\n // \"An unexpected error occurred.\" in production tells users (and us)\n // nothing. The stack trace is still gated to dev so we don't leak\n // internals to end users.\n if (error.message) {\n details = error.message;\n }\n if (\n typeof process !== \"undefined\" &&\n process.env.NODE_ENV !== \"production\"\n ) {\n stack = error.stack;\n }\n } else if (typeof error === \"string\" && error) {\n details = error;\n }\n\n // Log to the console so the underlying failure is recoverable from\n // browser devtools / Sentry even when the UI hides the stack.\n if (typeof console !== \"undefined\" && error) {\n console.error(\"[ErrorBoundary]\", error);\n }\n\n return (\n <main className=\"flex items-center justify-center min-h-screen p-4 bg-background text-foreground\">\n <div className=\"flex flex-col items-center text-center max-w-md\">\n {status && (\n <span className=\"text-7xl font-bold tracking-tight text-muted-foreground/40\">\n {status}\n </span>\n )}\n <h1 className=\"mt-3 text-2xl font-semibold\">{title}</h1>\n <p className=\"mt-2 text-muted-foreground text-sm\">{details}</p>\n <div className=\"mt-6 flex flex-wrap justify-center gap-2\">\n <a href={appPath(\"/\")} className={primaryActionClassName}>\n {copy.goHome}\n </a>\n <button\n type=\"button\"\n onClick={() => window.location.reload()}\n className={secondaryActionClassName}\n >\n {copy.reload}\n </button>\n <ErrorReportActions\n appName=\"Agent Native\"\n title={title}\n details={details}\n status={status}\n issueTitle={`Error screen: ${title}`}\n feedbackLabel={copy.sendFeedback}\n feedbackPlaceholder={copy.feedbackPlaceholder}\n githubLabel={copy.openGitHubIssue}\n feedbackClassName=\"h-9\"\n githubClassName=\"h-9\"\n />\n </div>\n {stack && (\n <pre className=\"mt-6 w-full text-start text-xs overflow-auto p-4 bg-muted rounded\">\n <code>{stack}</code>\n </pre>\n )}\n </div>\n </main>\n );\n}\n\nfunction RoutedErrorScreen() {\n return <ErrorScreen error={useRouteError()} />;\n}\n\nexport function ErrorBoundary() {\n useApplyThemeClass();\n if (!useInRouterContext()) return <ErrorScreen error={undefined} />;\n return <RoutedErrorScreen />;\n}\n"]}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type ErrorReportTemplateOptions } from "./error-reporting.js";
|
|
2
|
+
export interface ErrorReportActionsProps extends ErrorReportTemplateOptions {
|
|
3
|
+
feedbackLabel?: string;
|
|
4
|
+
feedbackPlaceholder?: string;
|
|
5
|
+
githubLabel?: string;
|
|
6
|
+
className?: string;
|
|
7
|
+
feedbackClassName?: string;
|
|
8
|
+
githubClassName?: string;
|
|
9
|
+
side?: "top" | "bottom" | "left" | "right";
|
|
10
|
+
align?: "start" | "center" | "end";
|
|
11
|
+
}
|
|
12
|
+
export declare function ErrorReportActions({ feedbackLabel, feedbackPlaceholder, githubLabel, className, feedbackClassName, githubClassName, side, align, ...report }: ErrorReportActionsProps): import("react").JSX.Element;
|
|
13
|
+
//# sourceMappingURL=ErrorReportActions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorReportActions.d.ts","sourceRoot":"","sources":["../../src/client/ErrorReportActions.tsx"],"names":[],"mappings":"AAEA,OAAO,EAGL,KAAK,0BAA0B,EAChC,MAAM,sBAAsB,CAAC;AAI9B,MAAM,WAAW,uBAAwB,SAAQ,0BAA0B;IACzE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;CACpC;AAED,wBAAgB,kBAAkB,CAAC,EACjC,aAA+B,EAC/B,mBAA0E,EAC1E,WAAiC,EACjC,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,IAAY,EACZ,KAAgB,EAChB,GAAG,MAAM,EACV,EAAE,uBAAuB,+BAqCzB"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { IconBrandGithub } from "@tabler/icons-react";
|
|
3
|
+
import { buildErrorReportTemplate, buildGitHubIssueUrl, } from "./error-reporting.js";
|
|
4
|
+
import { FeedbackButton } from "./FeedbackButton.js";
|
|
5
|
+
import { cn } from "./utils.js";
|
|
6
|
+
export function ErrorReportActions({ feedbackLabel = "Send feedback", feedbackPlaceholder = "Describe what happened before this error appeared.", githubLabel = "Open GitHub issue", className, feedbackClassName, githubClassName, side = "top", align = "center", ...report }) {
|
|
7
|
+
const template = buildErrorReportTemplate({
|
|
8
|
+
...report,
|
|
9
|
+
prompt: report.prompt ?? feedbackPlaceholder,
|
|
10
|
+
});
|
|
11
|
+
const githubIssueUrl = buildGitHubIssueUrl(report);
|
|
12
|
+
return (_jsxs("div", { className: cn("flex flex-wrap items-center justify-center gap-2", className), children: [_jsx(FeedbackButton, { variant: "outlined", label: feedbackLabel, placeholder: feedbackPlaceholder, initialValue: template, side: side, align: align, className: cn("h-8 text-xs", feedbackClassName) }), _jsxs("a", { href: githubIssueUrl, target: "_blank", rel: "noreferrer", className: cn("inline-flex h-8 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground underline-offset-4 hover:bg-muted/60 hover:text-foreground hover:underline", githubClassName), children: [_jsx(IconBrandGithub, { className: "size-3.5" }), githubLabel] })] }));
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=ErrorReportActions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ErrorReportActions.js","sourceRoot":"","sources":["../../src/client/ErrorReportActions.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,OAAO,EACL,wBAAwB,EACxB,mBAAmB,GAEpB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AACrD,OAAO,EAAE,EAAE,EAAE,MAAM,YAAY,CAAC;AAahC,MAAM,UAAU,kBAAkB,CAAC,EACjC,aAAa,GAAG,eAAe,EAC/B,mBAAmB,GAAG,oDAAoD,EAC1E,WAAW,GAAG,mBAAmB,EACjC,SAAS,EACT,iBAAiB,EACjB,eAAe,EACf,IAAI,GAAG,KAAK,EACZ,KAAK,GAAG,QAAQ,EAChB,GAAG,MAAM,EACe;IACxB,MAAM,QAAQ,GAAG,wBAAwB,CAAC;QACxC,GAAG,MAAM;QACT,MAAM,EAAE,MAAM,CAAC,MAAM,IAAI,mBAAmB;KAC7C,CAAC,CAAC;IACH,MAAM,cAAc,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAEnD,OAAO,CACL,eACE,SAAS,EAAE,EAAE,CACX,kDAAkD,EAClD,SAAS,CACV,aAED,KAAC,cAAc,IACb,OAAO,EAAC,UAAU,EAClB,KAAK,EAAE,aAAa,EACpB,WAAW,EAAE,mBAAmB,EAChC,YAAY,EAAE,QAAQ,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,KAAK,EACZ,SAAS,EAAE,EAAE,CAAC,aAAa,EAAE,iBAAiB,CAAC,GAC/C,EACF,aACE,IAAI,EAAE,cAAc,EACpB,MAAM,EAAC,QAAQ,EACf,GAAG,EAAC,YAAY,EAChB,SAAS,EAAE,EAAE,CACX,+JAA+J,EAC/J,eAAe,CAChB,aAED,KAAC,eAAe,IAAC,SAAS,EAAC,UAAU,GAAG,EACvC,WAAW,IACV,IACA,CACP,CAAC;AACJ,CAAC","sourcesContent":["import { IconBrandGithub } from \"@tabler/icons-react\";\n\nimport {\n buildErrorReportTemplate,\n buildGitHubIssueUrl,\n type ErrorReportTemplateOptions,\n} from \"./error-reporting.js\";\nimport { FeedbackButton } from \"./FeedbackButton.js\";\nimport { cn } from \"./utils.js\";\n\nexport interface ErrorReportActionsProps extends ErrorReportTemplateOptions {\n feedbackLabel?: string;\n feedbackPlaceholder?: string;\n githubLabel?: string;\n className?: string;\n feedbackClassName?: string;\n githubClassName?: string;\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n}\n\nexport function ErrorReportActions({\n feedbackLabel = \"Send feedback\",\n feedbackPlaceholder = \"Describe what happened before this error appeared.\",\n githubLabel = \"Open GitHub issue\",\n className,\n feedbackClassName,\n githubClassName,\n side = \"top\",\n align = \"center\",\n ...report\n}: ErrorReportActionsProps) {\n const template = buildErrorReportTemplate({\n ...report,\n prompt: report.prompt ?? feedbackPlaceholder,\n });\n const githubIssueUrl = buildGitHubIssueUrl(report);\n\n return (\n <div\n className={cn(\n \"flex flex-wrap items-center justify-center gap-2\",\n className,\n )}\n >\n <FeedbackButton\n variant=\"outlined\"\n label={feedbackLabel}\n placeholder={feedbackPlaceholder}\n initialValue={template}\n side={side}\n align={align}\n className={cn(\"h-8 text-xs\", feedbackClassName)}\n />\n <a\n href={githubIssueUrl}\n target=\"_blank\"\n rel=\"noreferrer\"\n className={cn(\n \"inline-flex h-8 items-center gap-1.5 rounded-md px-2 text-xs text-muted-foreground underline-offset-4 hover:bg-muted/60 hover:text-foreground hover:underline\",\n githubClassName,\n )}\n >\n <IconBrandGithub className=\"size-3.5\" />\n {githubLabel}\n </a>\n </div>\n );\n}\n"]}
|
|
@@ -14,6 +14,8 @@ export interface FeedbackButtonProps {
|
|
|
14
14
|
align?: "start" | "center" | "end";
|
|
15
15
|
/** Placeholder text for the textarea. */
|
|
16
16
|
placeholder?: string;
|
|
17
|
+
/** Optional text to prefill when the popover opens. */
|
|
18
|
+
initialValue?: string;
|
|
17
19
|
/** Current chat session/thread id, when the host already knows it. */
|
|
18
20
|
chatSessionId?: string | null;
|
|
19
21
|
/** Chat localStorage namespace, when the host uses per-app chat storage. */
|
|
@@ -24,5 +26,5 @@ export interface FeedbackButtonProps {
|
|
|
24
26
|
/** Optional custom trigger element. */
|
|
25
27
|
trigger?: ReactNode;
|
|
26
28
|
}
|
|
27
|
-
export declare function FeedbackButton({ variant, label, url, className, side, align, placeholder, chatSessionId, chatStorageKey, open: controlledOpen, onOpenChange, trigger: customTrigger, }: FeedbackButtonProps): import("react").JSX.Element;
|
|
29
|
+
export declare function FeedbackButton({ variant, label, url, className, side, align, placeholder, initialValue, chatSessionId, chatStorageKey, open: controlledOpen, onOpenChange, trigger: customTrigger, }: FeedbackButtonProps): import("react").JSX.Element;
|
|
28
30
|
//# sourceMappingURL=FeedbackButton.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButton.d.ts","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAyNf,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iFAAiF;IACjF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,uCAAuC;IACvC,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAeD,wBAAgB,cAAc,CAAC,EAC7B,OAAmB,EACnB,KAAK,EACL,GAA0B,EAC1B,SAAS,EACT,IAAI,EACJ,KAAa,EACb,WAAW,EACX,aAAa,EACb,cAAc,EACd,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,OAAO,EAAE,aAAa,GACvB,EAAE,mBAAmB,+
|
|
1
|
+
{"version":3,"file":"FeedbackButton.d.ts","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,SAAS,EACf,MAAM,OAAO,CAAC;AAyNf,MAAM,WAAW,mBAAmB;IAClC;;;;OAIG;IACH,OAAO,CAAC,EAAE,SAAS,GAAG,MAAM,GAAG,UAAU,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mEAAmE;IACnE,IAAI,CAAC,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;IAC3C,KAAK,CAAC,EAAE,OAAO,GAAG,QAAQ,GAAG,KAAK,CAAC;IACnC,yCAAyC;IACzC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,uDAAuD;IACvD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,4EAA4E;IAC5E,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,iFAAiF;IACjF,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,CAAC,IAAI,EAAE,OAAO,KAAK,IAAI,CAAC;IACvC,uCAAuC;IACvC,OAAO,CAAC,EAAE,SAAS,CAAC;CACrB;AAeD,wBAAgB,cAAc,CAAC,EAC7B,OAAmB,EACnB,KAAK,EACL,GAA0B,EAC1B,SAAS,EACT,IAAI,EACJ,KAAa,EACb,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,IAAI,EAAE,cAAc,EACpB,YAAY,EACZ,OAAO,EAAE,aAAa,GACvB,EAAE,mBAAmB,+BA6QrB"}
|
|
@@ -5,7 +5,7 @@ import { IconMessage2, IconCheck } from "@tabler/icons-react";
|
|
|
5
5
|
import { useState, useEffect, useRef, useCallback, } from "react";
|
|
6
6
|
import { DEFAULT_LOCALE } from "../localization/shared.js";
|
|
7
7
|
import { getFeedbackClientContext } from "./feedback-context.js";
|
|
8
|
-
import {
|
|
8
|
+
import { useOptionalLocale } from "./i18n.js";
|
|
9
9
|
import { useSession } from "./use-session.js";
|
|
10
10
|
import { cn } from "./utils.js";
|
|
11
11
|
const DEFAULT_FEEDBACK_URL = "https://forms.agent-native.com/f/agent-native-feedback/_16ewV";
|
|
@@ -194,10 +194,11 @@ const honeypotStyle = {
|
|
|
194
194
|
height: "1px",
|
|
195
195
|
overflow: "hidden",
|
|
196
196
|
};
|
|
197
|
-
export function FeedbackButton({ variant = "sidebar", label, url = DEFAULT_FEEDBACK_URL, className, side, align = "end", placeholder, chatSessionId, chatStorageKey, open: controlledOpen, onOpenChange, trigger: customTrigger, }) {
|
|
197
|
+
export function FeedbackButton({ variant = "sidebar", label, url = DEFAULT_FEEDBACK_URL, className, side, align = "end", placeholder, initialValue, chatSessionId, chatStorageKey, open: controlledOpen, onOpenChange, trigger: customTrigger, }) {
|
|
198
198
|
const target = parseTarget(url);
|
|
199
199
|
const { session } = useSession();
|
|
200
|
-
const
|
|
200
|
+
const localeContext = useOptionalLocale();
|
|
201
|
+
const locale = localeContext?.locale ?? DEFAULT_LOCALE;
|
|
201
202
|
const copy = FEEDBACK_COPY[locale] ?? FEEDBACK_COPY[DEFAULT_LOCALE];
|
|
202
203
|
const resolvedLabel = label ?? copy.label;
|
|
203
204
|
const [uncontrolledOpen, setUncontrolledOpen] = useState(false);
|
|
@@ -221,7 +222,7 @@ export function FeedbackButton({ variant = "sidebar", label, url = DEFAULT_FEEDB
|
|
|
221
222
|
if (!open)
|
|
222
223
|
return;
|
|
223
224
|
openedAtRef.current = Date.now();
|
|
224
|
-
setValue("");
|
|
225
|
+
setValue(initialValue ?? "");
|
|
225
226
|
setHoneypot("");
|
|
226
227
|
setSubmitting(false);
|
|
227
228
|
setSubmitted(false);
|
|
@@ -246,7 +247,7 @@ export function FeedbackButton({ variant = "sidebar", label, url = DEFAULT_FEEDB
|
|
|
246
247
|
closeTimerRef.current = null;
|
|
247
248
|
}
|
|
248
249
|
};
|
|
249
|
-
}, [open, url]);
|
|
250
|
+
}, [copy.invalidUrl, copy.loadError, initialValue, open, url]);
|
|
250
251
|
const submit = useCallback(async (e) => {
|
|
251
252
|
e?.preventDefault();
|
|
252
253
|
if (!target || submitting)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { IconMessage2, IconCheck } from \"@tabler/icons-react\";\nimport {\n useState,\n useEffect,\n useRef,\n useCallback,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from \"react\";\n\nimport { DEFAULT_LOCALE, type LocaleCode } from \"../localization/shared.js\";\nimport { getFeedbackClientContext } from \"./feedback-context.js\";\nimport { useLocale } from \"./i18n.js\";\nimport { useSession } from \"./use-session.js\";\nimport { cn } from \"./utils.js\";\n\nconst DEFAULT_FEEDBACK_URL =\n \"https://forms.agent-native.com/f/agent-native-feedback/_16ewV\";\n\nfunction isSyntheticAgentNativeAnonymousEmail(\n value: string | null | undefined,\n): boolean {\n return /^anon-[^\\s@]+@agent-native\\.com$/i.test(value ?? \"\");\n}\n\ninterface ParsedTarget {\n endpoint: string;\n slug: string;\n}\n\ninterface FormSchema {\n formId: string;\n fieldId: string;\n}\n\nconst FEEDBACK_COPY: Record<\n LocaleCode,\n {\n label: string;\n placeholder: string;\n submit: string;\n submitting: string;\n success: string;\n loadError: string;\n invalidUrl: string;\n emptyError: string;\n sendError: string;\n keyboardHint: string;\n }\n> = {\n \"en-US\": {\n label: \"Feedback\",\n placeholder: \"What's working, what's broken, or what would you change?\",\n submit: \"Send feedback\",\n submitting: \"Sending...\",\n success: \"Thanks for the feedback!\",\n loadError: \"Couldn't load feedback form\",\n invalidUrl: \"Invalid feedback URL\",\n emptyError: \"Please write something first\",\n sendError: \"Couldn't send feedback\",\n keyboardHint: \"{{shortcut}}+Enter to send\",\n },\n \"zh-CN\": {\n label: \"反馈\",\n placeholder: \"哪些地方好用、哪里坏了,或你想改什么?\",\n submit: \"发送反馈\",\n submitting: \"正在发送...\",\n success: \"感谢你的反馈!\",\n loadError: \"无法加载反馈表单\",\n invalidUrl: \"反馈 URL 无效\",\n emptyError: \"请先写点内容\",\n sendError: \"无法发送反馈\",\n keyboardHint: \"{{shortcut}}+Enter 发送\",\n },\n \"zh-TW\": {\n label: \"意見回饋\",\n placeholder: \"哪些地方好用、哪裡壞了,或你想改什麼?\",\n submit: \"送出意見回饋\",\n submitting: \"正在送出...\",\n success: \"感謝你的意見回饋。\",\n loadError: \"無法載入意見回饋表單\",\n invalidUrl: \"意見回饋 URL 無效\",\n emptyError: \"請先輸入內容\",\n sendError: \"無法送出意見回饋\",\n keyboardHint: \"{{shortcut}}+Enter 送出\",\n },\n \"es-ES\": {\n label: \"Comentarios\",\n placeholder: \"¿Qué funciona, qué falla o qué cambiarías?\",\n submit: \"Enviar comentarios\",\n submitting: \"Enviando...\",\n success: \"Gracias por tus comentarios.\",\n loadError: \"No se pudo cargar el formulario\",\n invalidUrl: \"URL de comentarios no válida\",\n emptyError: \"Escribe algo primero\",\n sendError: \"No se pudieron enviar los comentarios\",\n keyboardHint: \"{{shortcut}}+Enter para enviar\",\n },\n \"fr-FR\": {\n label: \"Retour\",\n placeholder: \"Qu'est-ce qui marche, casse ou devrait changer ?\",\n submit: \"Envoyer\",\n submitting: \"Envoi...\",\n success: \"Merci pour votre retour.\",\n loadError: \"Impossible de charger le formulaire\",\n invalidUrl: \"URL de retour invalide\",\n emptyError: \"Écrivez quelque chose d'abord\",\n sendError: \"Impossible d'envoyer le retour\",\n keyboardHint: \"{{shortcut}}+Entrée pour envoyer\",\n },\n \"de-DE\": {\n label: \"Feedback\",\n placeholder: \"Was funktioniert, was ist kaputt, was würdest du ändern?\",\n submit: \"Feedback senden\",\n submitting: \"Wird gesendet...\",\n success: \"Danke für dein Feedback!\",\n loadError: \"Feedback-Formular konnte nicht geladen werden\",\n invalidUrl: \"Ungültige Feedback-URL\",\n emptyError: \"Bitte zuerst etwas schreiben\",\n sendError: \"Feedback konnte nicht gesendet werden\",\n keyboardHint: \"{{shortcut}}+Enter zum Senden\",\n },\n \"ja-JP\": {\n label: \"フィードバック\",\n placeholder: \"良い点、問題点、変更したい点を教えてください。\",\n submit: \"送信\",\n submitting: \"送信中...\",\n success: \"フィードバックありがとうございます。\",\n loadError: \"フォームを読み込めませんでした\",\n invalidUrl: \"フィードバック URL が無効です\",\n emptyError: \"先に内容を入力してください\",\n sendError: \"送信できませんでした\",\n keyboardHint: \"{{shortcut}}+Enter で送信\",\n },\n \"ko-KR\": {\n label: \"피드백\",\n placeholder: \"잘 되는 점, 깨진 점, 바꾸고 싶은 점을 알려주세요.\",\n submit: \"피드백 보내기\",\n submitting: \"보내는 중...\",\n success: \"피드백 감사합니다.\",\n loadError: \"피드백 양식을 불러올 수 없습니다\",\n invalidUrl: \"피드백 URL이 올바르지 않습니다\",\n emptyError: \"먼저 내용을 입력해 주세요\",\n sendError: \"피드백을 보낼 수 없습니다\",\n keyboardHint: \"{{shortcut}}+Enter로 보내기\",\n },\n \"pt-BR\": {\n label: \"Feedback\",\n placeholder: \"O que funciona, quebrou ou você mudaria?\",\n submit: \"Enviar feedback\",\n submitting: \"Enviando...\",\n success: \"Obrigado pelo feedback!\",\n loadError: \"Não foi possível carregar o formulário\",\n invalidUrl: \"URL de feedback inválida\",\n emptyError: \"Escreva algo primeiro\",\n sendError: \"Não foi possível enviar o feedback\",\n keyboardHint: \"{{shortcut}}+Enter para enviar\",\n },\n \"hi-IN\": {\n label: \"फ़ीडबैक\",\n placeholder: \"क्या काम कर रहा है, क्या टूटा है, या आप क्या बदलना चाहेंगे?\",\n submit: \"फ़ीडबैक भेजें\",\n submitting: \"भेजा जा रहा है...\",\n success: \"फ़ीडबैक के लिए धन्यवाद!\",\n loadError: \"फ़ीडबैक फ़ॉर्म लोड नहीं हुआ\",\n invalidUrl: \"फ़ीडबैक URL अमान्य है\",\n emptyError: \"पहले कुछ लिखें\",\n sendError: \"फ़ीडबैक भेजा नहीं जा सका\",\n keyboardHint: \"भेजने के लिए {{shortcut}}+Enter\",\n },\n \"ar-SA\": {\n label: \"ملاحظات\",\n placeholder: \"ما الذي يعمل، وما المعطل، وما الذي تريد تغييره؟\",\n submit: \"إرسال الملاحظات\",\n submitting: \"جار الإرسال...\",\n success: \"شكرا لملاحظاتك!\",\n loadError: \"تعذر تحميل نموذج الملاحظات\",\n invalidUrl: \"رابط الملاحظات غير صالح\",\n emptyError: \"اكتب شيئا أولا\",\n sendError: \"تعذر إرسال الملاحظات\",\n keyboardHint: \"{{shortcut}}+Enter للإرسال\",\n },\n};\n\nfunction parseTarget(url: string): ParsedTarget | null {\n try {\n const u = new URL(url);\n const idx = u.pathname.indexOf(\"/f/\");\n if (idx === -1) return null;\n const slug = u.pathname.slice(idx + 3).replace(/\\/$/, \"\");\n if (!slug) return null;\n return { endpoint: u.origin, slug };\n } catch {\n return null;\n }\n}\n\nconst schemaCache = new Map<string, Promise<FormSchema>>();\n\nasync function loadSchema(target: ParsedTarget): Promise<FormSchema> {\n const key = `${target.endpoint}|${target.slug}`;\n let pending = schemaCache.get(key);\n if (pending) return pending;\n pending = (async () => {\n const res = await fetch(\n `${target.endpoint}/api/forms/public/${encodeURIComponent(target.slug)}`,\n { headers: { Accept: \"application/json\" } },\n );\n if (!res.ok) throw new Error(`form fetch ${res.status}`);\n const body = (await res.json()) as {\n id: string;\n fields: Array<{ id: string; type: string }>;\n };\n const field =\n body.fields.find((f) => f.type === \"textarea\") ??\n body.fields.find((f) => f.type === \"text\") ??\n body.fields[0];\n if (!field) throw new Error(\"form has no fields\");\n return { formId: body.id, fieldId: field.id };\n })();\n pending.catch(() => schemaCache.delete(key));\n schemaCache.set(key, pending);\n return pending;\n}\n\nexport interface FeedbackButtonProps {\n /**\n * \"sidebar\" renders a full-width row with icon + label (for app left sidebars).\n * \"icon\" renders a small icon-only button (for dense toolbars, e.g. the agent panel header).\n * \"outlined\" renders an outlined pill button with icon + label (for top-nav bars, e.g. docs).\n */\n variant?: \"sidebar\" | \"icon\" | \"outlined\";\n label?: string;\n url?: string;\n className?: string;\n /** Which side the popover opens on. Defaults match the variant. */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n /** Placeholder text for the textarea. */\n placeholder?: string;\n /** Current chat session/thread id, when the host already knows it. */\n chatSessionId?: string | null;\n /** Chat localStorage namespace, when the host uses per-app chat storage. */\n chatStorageKey?: string | null;\n /** Controlled popover open state for hosts that trigger feedback from a menu. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Optional custom trigger element. */\n trigger?: ReactNode;\n}\n\nconst surfaceStyle: CSSProperties = {\n width: \"min(380px, calc(100vw - 32px))\",\n};\n\nconst honeypotStyle: CSSProperties = {\n position: \"absolute\",\n left: \"-10000px\",\n top: \"auto\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n};\n\nexport function FeedbackButton({\n variant = \"sidebar\",\n label,\n url = DEFAULT_FEEDBACK_URL,\n className,\n side,\n align = \"end\",\n placeholder,\n chatSessionId,\n chatStorageKey,\n open: controlledOpen,\n onOpenChange,\n trigger: customTrigger,\n}: FeedbackButtonProps) {\n const target = parseTarget(url);\n const { session } = useSession();\n const { locale } = useLocale();\n const copy = FEEDBACK_COPY[locale] ?? FEEDBACK_COPY[DEFAULT_LOCALE];\n const resolvedLabel = label ?? copy.label;\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = useCallback(\n (nextOpen: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [controlledOpen, onOpenChange],\n );\n const [value, setValue] = useState(\"\");\n const [honeypot, setHoneypot] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [schema, setSchema] = useState<FormSchema | null>(null);\n const openedAtRef = useRef<number>(0);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n // Reset transient state and kick off schema load on each open.\n useEffect(() => {\n if (!open) return;\n openedAtRef.current = Date.now();\n setValue(\"\");\n setHoneypot(\"\");\n setSubmitting(false);\n setSubmitted(false);\n setError(null);\n setSchema(null);\n if (target) {\n loadSchema(target)\n .then((s) => setSchema(s))\n .catch((err) => {\n console.error(\"[FeedbackButton] schema load failed\", err);\n setError(copy.loadError);\n });\n } else {\n setError(copy.invalidUrl);\n }\n const t = setTimeout(() => textareaRef.current?.focus(), 30);\n return () => {\n clearTimeout(t);\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n };\n }, [open, url]);\n\n const submit = useCallback(\n async (e?: FormEvent) => {\n e?.preventDefault();\n if (!target || submitting) return;\n const trimmed = value.trim();\n if (!trimmed) {\n setError(copy.emptyError);\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n const resolvedSchema = schema ?? (await loadSchema(target));\n if (!schema) setSchema(resolvedSchema);\n const submitterEmail = isSyntheticAgentNativeAnonymousEmail(\n session?.email,\n )\n ? null\n : session?.email;\n const feedbackContext = getFeedbackClientContext({\n chatSessionId,\n storageKey: chatStorageKey,\n });\n const res = await fetch(\n `${target.endpoint}/api/submit/${encodeURIComponent(resolvedSchema.formId)}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n data: { [resolvedSchema.fieldId]: trimmed },\n _t: openedAtRef.current,\n _hp: honeypot,\n _meta: {\n ...(submitterEmail ? { submitterEmail } : {}),\n ...feedbackContext,\n },\n }),\n },\n );\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(body.error || `submit failed (${res.status})`);\n }\n setSubmitted(true);\n closeTimerRef.current = setTimeout(() => setOpen(false), 1400);\n } catch (err) {\n setSubmitting(false);\n setError(err instanceof Error ? err.message : copy.sendError);\n }\n },\n [\n target,\n schema,\n value,\n honeypot,\n submitting,\n session?.email,\n chatSessionId,\n chatStorageKey,\n setOpen,\n copy.emptyError,\n copy.sendError,\n ],\n );\n\n let trigger;\n if (customTrigger) {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n {customTrigger}\n </PopoverPrimitive.Trigger>\n );\n } else if (variant === \"icon\") {\n trigger = (\n <TooltipPrimitive.Provider delayDuration={200}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={resolvedLabel}\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n className,\n )}\n >\n <IconMessage2 size={14} />\n </button>\n </PopoverPrimitive.Trigger>\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n sideOffset={6}\n className=\"z-[100040] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {resolvedLabel}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n } else if (variant === \"outlined\") {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={resolvedLabel}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-border bg-transparent px-3 text-sm text-muted-foreground transition hover:border-foreground/40 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 size={14} stroke={1.5} />\n <span>{resolvedLabel}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n } else {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 className=\"h-4 w-4\" />\n <span>{resolvedLabel}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n }\n\n const resolvedSide = side ?? (variant === \"sidebar\" ? \"top\" : \"bottom\");\n const resolvedPlaceholder = placeholder ?? copy.placeholder;\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side={resolvedSide}\n align={align}\n sideOffset={8}\n collisionPadding={16}\n className=\"z-[100040] overflow-hidden rounded-lg border border-border bg-popover shadow-xl outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\"\n style={surfaceStyle}\n >\n {submitted ? (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-500\">\n <IconCheck size={20} stroke={2.5} />\n </div>\n <div className=\"text-sm font-medium text-foreground\">\n {copy.success}\n </div>\n </div>\n ) : (\n <form onSubmit={submit} className=\"flex flex-col gap-3 p-3\">\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") submit();\n }}\n placeholder={resolvedPlaceholder}\n rows={5}\n maxLength={10000}\n className=\"w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <input\n type=\"text\"\n tabIndex={-1}\n autoComplete=\"off\"\n aria-hidden=\"true\"\n value={honeypot}\n onChange={(e) => setHoneypot(e.target.value)}\n style={honeypotStyle}\n />\n <div className=\"flex items-center justify-between gap-3\">\n <div\n className={cn(\n \"text-[11px]\",\n error ? \"text-destructive\" : \"text-muted-foreground/75\",\n )}\n >\n {error ??\n copy.keyboardHint.replace(\n \"{{shortcut}}\",\n /Mac|iPhone|iPad/.test(navigator.userAgent)\n ? \"⌘\"\n : \"Ctrl\",\n )}\n </div>\n <button\n type=\"submit\"\n disabled={submitting || !value.trim()}\n className=\"inline-flex h-8 items-center justify-center rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {submitting ? copy.submitting : copy.submit}\n </button>\n </div>\n </form>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"file":"FeedbackButton.js","sourceRoot":"","sources":["../../src/client/FeedbackButton.tsx"],"names":[],"mappings":"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","sourcesContent":["import * as PopoverPrimitive from \"@radix-ui/react-popover\";\nimport * as TooltipPrimitive from \"@radix-ui/react-tooltip\";\nimport { IconMessage2, IconCheck } from \"@tabler/icons-react\";\nimport {\n useState,\n useEffect,\n useRef,\n useCallback,\n type CSSProperties,\n type FormEvent,\n type ReactNode,\n} from \"react\";\n\nimport { DEFAULT_LOCALE, type LocaleCode } from \"../localization/shared.js\";\nimport { getFeedbackClientContext } from \"./feedback-context.js\";\nimport { useOptionalLocale } from \"./i18n.js\";\nimport { useSession } from \"./use-session.js\";\nimport { cn } from \"./utils.js\";\n\nconst DEFAULT_FEEDBACK_URL =\n \"https://forms.agent-native.com/f/agent-native-feedback/_16ewV\";\n\nfunction isSyntheticAgentNativeAnonymousEmail(\n value: string | null | undefined,\n): boolean {\n return /^anon-[^\\s@]+@agent-native\\.com$/i.test(value ?? \"\");\n}\n\ninterface ParsedTarget {\n endpoint: string;\n slug: string;\n}\n\ninterface FormSchema {\n formId: string;\n fieldId: string;\n}\n\nconst FEEDBACK_COPY: Record<\n LocaleCode,\n {\n label: string;\n placeholder: string;\n submit: string;\n submitting: string;\n success: string;\n loadError: string;\n invalidUrl: string;\n emptyError: string;\n sendError: string;\n keyboardHint: string;\n }\n> = {\n \"en-US\": {\n label: \"Feedback\",\n placeholder: \"What's working, what's broken, or what would you change?\",\n submit: \"Send feedback\",\n submitting: \"Sending...\",\n success: \"Thanks for the feedback!\",\n loadError: \"Couldn't load feedback form\",\n invalidUrl: \"Invalid feedback URL\",\n emptyError: \"Please write something first\",\n sendError: \"Couldn't send feedback\",\n keyboardHint: \"{{shortcut}}+Enter to send\",\n },\n \"zh-CN\": {\n label: \"反馈\",\n placeholder: \"哪些地方好用、哪里坏了,或你想改什么?\",\n submit: \"发送反馈\",\n submitting: \"正在发送...\",\n success: \"感谢你的反馈!\",\n loadError: \"无法加载反馈表单\",\n invalidUrl: \"反馈 URL 无效\",\n emptyError: \"请先写点内容\",\n sendError: \"无法发送反馈\",\n keyboardHint: \"{{shortcut}}+Enter 发送\",\n },\n \"zh-TW\": {\n label: \"意見回饋\",\n placeholder: \"哪些地方好用、哪裡壞了,或你想改什麼?\",\n submit: \"送出意見回饋\",\n submitting: \"正在送出...\",\n success: \"感謝你的意見回饋。\",\n loadError: \"無法載入意見回饋表單\",\n invalidUrl: \"意見回饋 URL 無效\",\n emptyError: \"請先輸入內容\",\n sendError: \"無法送出意見回饋\",\n keyboardHint: \"{{shortcut}}+Enter 送出\",\n },\n \"es-ES\": {\n label: \"Comentarios\",\n placeholder: \"¿Qué funciona, qué falla o qué cambiarías?\",\n submit: \"Enviar comentarios\",\n submitting: \"Enviando...\",\n success: \"Gracias por tus comentarios.\",\n loadError: \"No se pudo cargar el formulario\",\n invalidUrl: \"URL de comentarios no válida\",\n emptyError: \"Escribe algo primero\",\n sendError: \"No se pudieron enviar los comentarios\",\n keyboardHint: \"{{shortcut}}+Enter para enviar\",\n },\n \"fr-FR\": {\n label: \"Retour\",\n placeholder: \"Qu'est-ce qui marche, casse ou devrait changer ?\",\n submit: \"Envoyer\",\n submitting: \"Envoi...\",\n success: \"Merci pour votre retour.\",\n loadError: \"Impossible de charger le formulaire\",\n invalidUrl: \"URL de retour invalide\",\n emptyError: \"Écrivez quelque chose d'abord\",\n sendError: \"Impossible d'envoyer le retour\",\n keyboardHint: \"{{shortcut}}+Entrée pour envoyer\",\n },\n \"de-DE\": {\n label: \"Feedback\",\n placeholder: \"Was funktioniert, was ist kaputt, was würdest du ändern?\",\n submit: \"Feedback senden\",\n submitting: \"Wird gesendet...\",\n success: \"Danke für dein Feedback!\",\n loadError: \"Feedback-Formular konnte nicht geladen werden\",\n invalidUrl: \"Ungültige Feedback-URL\",\n emptyError: \"Bitte zuerst etwas schreiben\",\n sendError: \"Feedback konnte nicht gesendet werden\",\n keyboardHint: \"{{shortcut}}+Enter zum Senden\",\n },\n \"ja-JP\": {\n label: \"フィードバック\",\n placeholder: \"良い点、問題点、変更したい点を教えてください。\",\n submit: \"送信\",\n submitting: \"送信中...\",\n success: \"フィードバックありがとうございます。\",\n loadError: \"フォームを読み込めませんでした\",\n invalidUrl: \"フィードバック URL が無効です\",\n emptyError: \"先に内容を入力してください\",\n sendError: \"送信できませんでした\",\n keyboardHint: \"{{shortcut}}+Enter で送信\",\n },\n \"ko-KR\": {\n label: \"피드백\",\n placeholder: \"잘 되는 점, 깨진 점, 바꾸고 싶은 점을 알려주세요.\",\n submit: \"피드백 보내기\",\n submitting: \"보내는 중...\",\n success: \"피드백 감사합니다.\",\n loadError: \"피드백 양식을 불러올 수 없습니다\",\n invalidUrl: \"피드백 URL이 올바르지 않습니다\",\n emptyError: \"먼저 내용을 입력해 주세요\",\n sendError: \"피드백을 보낼 수 없습니다\",\n keyboardHint: \"{{shortcut}}+Enter로 보내기\",\n },\n \"pt-BR\": {\n label: \"Feedback\",\n placeholder: \"O que funciona, quebrou ou você mudaria?\",\n submit: \"Enviar feedback\",\n submitting: \"Enviando...\",\n success: \"Obrigado pelo feedback!\",\n loadError: \"Não foi possível carregar o formulário\",\n invalidUrl: \"URL de feedback inválida\",\n emptyError: \"Escreva algo primeiro\",\n sendError: \"Não foi possível enviar o feedback\",\n keyboardHint: \"{{shortcut}}+Enter para enviar\",\n },\n \"hi-IN\": {\n label: \"फ़ीडबैक\",\n placeholder: \"क्या काम कर रहा है, क्या टूटा है, या आप क्या बदलना चाहेंगे?\",\n submit: \"फ़ीडबैक भेजें\",\n submitting: \"भेजा जा रहा है...\",\n success: \"फ़ीडबैक के लिए धन्यवाद!\",\n loadError: \"फ़ीडबैक फ़ॉर्म लोड नहीं हुआ\",\n invalidUrl: \"फ़ीडबैक URL अमान्य है\",\n emptyError: \"पहले कुछ लिखें\",\n sendError: \"फ़ीडबैक भेजा नहीं जा सका\",\n keyboardHint: \"भेजने के लिए {{shortcut}}+Enter\",\n },\n \"ar-SA\": {\n label: \"ملاحظات\",\n placeholder: \"ما الذي يعمل، وما المعطل، وما الذي تريد تغييره؟\",\n submit: \"إرسال الملاحظات\",\n submitting: \"جار الإرسال...\",\n success: \"شكرا لملاحظاتك!\",\n loadError: \"تعذر تحميل نموذج الملاحظات\",\n invalidUrl: \"رابط الملاحظات غير صالح\",\n emptyError: \"اكتب شيئا أولا\",\n sendError: \"تعذر إرسال الملاحظات\",\n keyboardHint: \"{{shortcut}}+Enter للإرسال\",\n },\n};\n\nfunction parseTarget(url: string): ParsedTarget | null {\n try {\n const u = new URL(url);\n const idx = u.pathname.indexOf(\"/f/\");\n if (idx === -1) return null;\n const slug = u.pathname.slice(idx + 3).replace(/\\/$/, \"\");\n if (!slug) return null;\n return { endpoint: u.origin, slug };\n } catch {\n return null;\n }\n}\n\nconst schemaCache = new Map<string, Promise<FormSchema>>();\n\nasync function loadSchema(target: ParsedTarget): Promise<FormSchema> {\n const key = `${target.endpoint}|${target.slug}`;\n let pending = schemaCache.get(key);\n if (pending) return pending;\n pending = (async () => {\n const res = await fetch(\n `${target.endpoint}/api/forms/public/${encodeURIComponent(target.slug)}`,\n { headers: { Accept: \"application/json\" } },\n );\n if (!res.ok) throw new Error(`form fetch ${res.status}`);\n const body = (await res.json()) as {\n id: string;\n fields: Array<{ id: string; type: string }>;\n };\n const field =\n body.fields.find((f) => f.type === \"textarea\") ??\n body.fields.find((f) => f.type === \"text\") ??\n body.fields[0];\n if (!field) throw new Error(\"form has no fields\");\n return { formId: body.id, fieldId: field.id };\n })();\n pending.catch(() => schemaCache.delete(key));\n schemaCache.set(key, pending);\n return pending;\n}\n\nexport interface FeedbackButtonProps {\n /**\n * \"sidebar\" renders a full-width row with icon + label (for app left sidebars).\n * \"icon\" renders a small icon-only button (for dense toolbars, e.g. the agent panel header).\n * \"outlined\" renders an outlined pill button with icon + label (for top-nav bars, e.g. docs).\n */\n variant?: \"sidebar\" | \"icon\" | \"outlined\";\n label?: string;\n url?: string;\n className?: string;\n /** Which side the popover opens on. Defaults match the variant. */\n side?: \"top\" | \"bottom\" | \"left\" | \"right\";\n align?: \"start\" | \"center\" | \"end\";\n /** Placeholder text for the textarea. */\n placeholder?: string;\n /** Optional text to prefill when the popover opens. */\n initialValue?: string;\n /** Current chat session/thread id, when the host already knows it. */\n chatSessionId?: string | null;\n /** Chat localStorage namespace, when the host uses per-app chat storage. */\n chatStorageKey?: string | null;\n /** Controlled popover open state for hosts that trigger feedback from a menu. */\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Optional custom trigger element. */\n trigger?: ReactNode;\n}\n\nconst surfaceStyle: CSSProperties = {\n width: \"min(380px, calc(100vw - 32px))\",\n};\n\nconst honeypotStyle: CSSProperties = {\n position: \"absolute\",\n left: \"-10000px\",\n top: \"auto\",\n width: \"1px\",\n height: \"1px\",\n overflow: \"hidden\",\n};\n\nexport function FeedbackButton({\n variant = \"sidebar\",\n label,\n url = DEFAULT_FEEDBACK_URL,\n className,\n side,\n align = \"end\",\n placeholder,\n initialValue,\n chatSessionId,\n chatStorageKey,\n open: controlledOpen,\n onOpenChange,\n trigger: customTrigger,\n}: FeedbackButtonProps) {\n const target = parseTarget(url);\n const { session } = useSession();\n const localeContext = useOptionalLocale();\n const locale = localeContext?.locale ?? DEFAULT_LOCALE;\n const copy = FEEDBACK_COPY[locale] ?? FEEDBACK_COPY[DEFAULT_LOCALE];\n const resolvedLabel = label ?? copy.label;\n\n const [uncontrolledOpen, setUncontrolledOpen] = useState(false);\n const open = controlledOpen ?? uncontrolledOpen;\n const setOpen = useCallback(\n (nextOpen: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange?.(nextOpen);\n },\n [controlledOpen, onOpenChange],\n );\n const [value, setValue] = useState(\"\");\n const [honeypot, setHoneypot] = useState(\"\");\n const [submitting, setSubmitting] = useState(false);\n const [submitted, setSubmitted] = useState(false);\n const [error, setError] = useState<string | null>(null);\n const [schema, setSchema] = useState<FormSchema | null>(null);\n const openedAtRef = useRef<number>(0);\n const closeTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const textareaRef = useRef<HTMLTextAreaElement | null>(null);\n\n // Reset transient state and kick off schema load on each open.\n useEffect(() => {\n if (!open) return;\n openedAtRef.current = Date.now();\n setValue(initialValue ?? \"\");\n setHoneypot(\"\");\n setSubmitting(false);\n setSubmitted(false);\n setError(null);\n setSchema(null);\n if (target) {\n loadSchema(target)\n .then((s) => setSchema(s))\n .catch((err) => {\n console.error(\"[FeedbackButton] schema load failed\", err);\n setError(copy.loadError);\n });\n } else {\n setError(copy.invalidUrl);\n }\n const t = setTimeout(() => textareaRef.current?.focus(), 30);\n return () => {\n clearTimeout(t);\n if (closeTimerRef.current) {\n clearTimeout(closeTimerRef.current);\n closeTimerRef.current = null;\n }\n };\n }, [copy.invalidUrl, copy.loadError, initialValue, open, url]);\n\n const submit = useCallback(\n async (e?: FormEvent) => {\n e?.preventDefault();\n if (!target || submitting) return;\n const trimmed = value.trim();\n if (!trimmed) {\n setError(copy.emptyError);\n return;\n }\n setSubmitting(true);\n setError(null);\n try {\n const resolvedSchema = schema ?? (await loadSchema(target));\n if (!schema) setSchema(resolvedSchema);\n const submitterEmail = isSyntheticAgentNativeAnonymousEmail(\n session?.email,\n )\n ? null\n : session?.email;\n const feedbackContext = getFeedbackClientContext({\n chatSessionId,\n storageKey: chatStorageKey,\n });\n const res = await fetch(\n `${target.endpoint}/api/submit/${encodeURIComponent(resolvedSchema.formId)}`,\n {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({\n data: { [resolvedSchema.fieldId]: trimmed },\n _t: openedAtRef.current,\n _hp: honeypot,\n _meta: {\n ...(submitterEmail ? { submitterEmail } : {}),\n ...feedbackContext,\n },\n }),\n },\n );\n if (!res.ok) {\n const body = (await res.json().catch(() => ({}))) as {\n error?: string;\n };\n throw new Error(body.error || `submit failed (${res.status})`);\n }\n setSubmitted(true);\n closeTimerRef.current = setTimeout(() => setOpen(false), 1400);\n } catch (err) {\n setSubmitting(false);\n setError(err instanceof Error ? err.message : copy.sendError);\n }\n },\n [\n target,\n schema,\n value,\n honeypot,\n submitting,\n session?.email,\n chatSessionId,\n chatStorageKey,\n setOpen,\n copy.emptyError,\n copy.sendError,\n ],\n );\n\n let trigger;\n if (customTrigger) {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n {customTrigger}\n </PopoverPrimitive.Trigger>\n );\n } else if (variant === \"icon\") {\n trigger = (\n <TooltipPrimitive.Provider delayDuration={200}>\n <TooltipPrimitive.Root>\n <TooltipPrimitive.Trigger asChild>\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={resolvedLabel}\n className={cn(\n \"flex h-6 w-6 items-center justify-center rounded text-muted-foreground hover:text-foreground hover:bg-accent/50\",\n className,\n )}\n >\n <IconMessage2 size={14} />\n </button>\n </PopoverPrimitive.Trigger>\n </TooltipPrimitive.Trigger>\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n sideOffset={6}\n className=\"z-[100040] overflow-hidden rounded-md border border-border bg-popover px-2 py-1 text-[11px] text-foreground shadow-md animate-in fade-in-0 zoom-in-95\"\n >\n {resolvedLabel}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n </TooltipPrimitive.Root>\n </TooltipPrimitive.Provider>\n );\n } else if (variant === \"outlined\") {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n aria-label={resolvedLabel}\n className={cn(\n \"flex h-8 items-center gap-2 rounded-md border border-border bg-transparent px-3 text-sm text-muted-foreground transition hover:border-foreground/40 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 size={14} stroke={1.5} />\n <span>{resolvedLabel}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n } else {\n trigger = (\n <PopoverPrimitive.Trigger asChild>\n <button\n type=\"button\"\n className={cn(\n \"flex w-full items-center gap-3 rounded-lg px-3 py-2 text-sm text-muted-foreground transition-colors hover:bg-accent/50 hover:text-foreground\",\n className,\n )}\n >\n <IconMessage2 className=\"h-4 w-4\" />\n <span>{resolvedLabel}</span>\n </button>\n </PopoverPrimitive.Trigger>\n );\n }\n\n const resolvedSide = side ?? (variant === \"sidebar\" ? \"top\" : \"bottom\");\n const resolvedPlaceholder = placeholder ?? copy.placeholder;\n\n return (\n <PopoverPrimitive.Root open={open} onOpenChange={setOpen}>\n {trigger}\n <PopoverPrimitive.Portal>\n <PopoverPrimitive.Content\n side={resolvedSide}\n align={align}\n sideOffset={8}\n collisionPadding={16}\n className=\"z-[100040] overflow-hidden rounded-lg border border-border bg-popover shadow-xl outline-none data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2\"\n style={surfaceStyle}\n >\n {submitted ? (\n <div className=\"flex flex-col items-center justify-center gap-3 px-6 py-10 text-center\">\n <div className=\"flex h-10 w-10 items-center justify-center rounded-full bg-emerald-500/10 text-emerald-500\">\n <IconCheck size={20} stroke={2.5} />\n </div>\n <div className=\"text-sm font-medium text-foreground\">\n {copy.success}\n </div>\n </div>\n ) : (\n <form onSubmit={submit} className=\"flex flex-col gap-3 p-3\">\n <textarea\n ref={textareaRef}\n value={value}\n onChange={(e) => setValue(e.target.value)}\n onKeyDown={(e) => {\n if ((e.metaKey || e.ctrlKey) && e.key === \"Enter\") submit();\n }}\n placeholder={resolvedPlaceholder}\n rows={5}\n maxLength={10000}\n className=\"w-full resize-none rounded-md border border-input bg-background px-3 py-2 text-sm text-foreground placeholder:text-muted-foreground focus:outline-none focus:ring-2 focus:ring-ring\"\n />\n <input\n type=\"text\"\n tabIndex={-1}\n autoComplete=\"off\"\n aria-hidden=\"true\"\n value={honeypot}\n onChange={(e) => setHoneypot(e.target.value)}\n style={honeypotStyle}\n />\n <div className=\"flex items-center justify-between gap-3\">\n <div\n className={cn(\n \"text-[11px]\",\n error ? \"text-destructive\" : \"text-muted-foreground/75\",\n )}\n >\n {error ??\n copy.keyboardHint.replace(\n \"{{shortcut}}\",\n /Mac|iPhone|iPad/.test(navigator.userAgent)\n ? \"⌘\"\n : \"Ctrl\",\n )}\n </div>\n <button\n type=\"submit\"\n disabled={submitting || !value.trim()}\n className=\"inline-flex h-8 items-center justify-center rounded-md bg-primary px-3 text-xs font-medium text-primary-foreground hover:bg-primary/90 disabled:opacity-50\"\n >\n {submitting ? copy.submitting : copy.submit}\n </button>\n </div>\n </form>\n )}\n </PopoverPrimitive.Content>\n </PopoverPrimitive.Portal>\n </PopoverPrimitive.Root>\n );\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-chat-adapter.d.ts","sourceRoot":"","sources":["../../src/client/agent-chat-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAOhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAmBrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,oBAAoB;AAC9B;;;;GAIG;AACD,KAAK;AACP,0EAA0E;GACxE,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"agent-chat-adapter.d.ts","sourceRoot":"","sources":["../../src/client/agent-chat-adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAsB,MAAM,qBAAqB,CAAC;AAOhF,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAmBrE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,MAAM,oBAAoB;AAC9B;;;;GAIG;AACD,KAAK;AACP,0EAA0E;GACxE,WAAW,CAAC;AAssChB;;;;GAIG;AACH;;;GAGG;AACH,MAAM,WAAW,6BAA6B;IAC5C,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IAC5C,SAAS,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,SAAS,CAAA;KAAE,CAAC;IACrD,WAAW,CAAC,EAAE;QAAE,OAAO,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS,CAAA;KAAE,CAAC;IACxD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE;QAAE,OAAO,EAAE,eAAe,GAAG,IAAI,GAAG,SAAS,CAAA;KAAE,CAAC;IAC3D,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAyED,wBAAgB,sBAAsB,CACpC,OAAO,CAAC,EAAE,6BAA6B,GACtC,gBAAgB,CAi8DlB"}
|
|
@@ -92,11 +92,12 @@ const STARTUP_RESPONSE_TIMEOUT_MS = 45_000;
|
|
|
92
92
|
const BACKGROUND_FOLLOW_POLL_INTERVAL_MS = 1_000;
|
|
93
93
|
// How long the follow loop tolerates seeing NO active run for this turn before
|
|
94
94
|
// treating the turn as ended. The server pre-inserts the successor row before
|
|
95
|
-
// the old chunk completes, so a healthy chain never shows an idle gap;
|
|
96
|
-
//
|
|
97
|
-
//
|
|
98
|
-
//
|
|
99
|
-
|
|
95
|
+
// the old chunk completes, so a healthy chain never shows an idle gap; allow a
|
|
96
|
+
// wider window here because the server's unclaimed-handoff recovery can span
|
|
97
|
+
// the 25s grace plus sweep/DB latency. This stays below the background
|
|
98
|
+
// reconnect stuck threshold, but gives the server-owned recovery brain time to
|
|
99
|
+
// surface the successor or terminal errored run before the client reports idle.
|
|
100
|
+
const BACKGROUND_FOLLOW_IDLE_TIMEOUT_MS = 150_000;
|
|
100
101
|
/**
|
|
101
102
|
* User-facing copy for the server's background terminal reasons
|
|
102
103
|
* (`agent_runs.terminal_reason`, surfaced by /runs/active). These runs died in
|