@agent-native/core 0.137.8 → 0.138.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-native.eject.json +2 -0
- package/corpus/README.md +1 -1
- package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/analytics/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +15 -0
- package/corpus/templates/analytics/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/analytics/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/analytics/AGENTS.md +2 -2
- package/corpus/templates/analytics/actions/get-first-party-analytics-health.ts +65 -0
- package/corpus/templates/analytics/actions/provider-api-catalog.ts +3 -6
- package/corpus/templates/analytics/actions/provider-api-docs.ts +3 -6
- package/corpus/templates/analytics/actions/provider-api-request.ts +3 -6
- package/corpus/templates/analytics/actions/query-agent-native-analytics.ts +3 -3
- package/corpus/templates/analytics/agent-native.json +12 -0
- package/corpus/templates/analytics/app/i18n-data.ts +162 -0
- package/corpus/templates/analytics/app/pages/DataSources.tsx +126 -1
- package/corpus/templates/analytics/changelog/2026-08-05-analytics-now-flags-neon-pressure-and-guides-high-volume-tra.md +6 -0
- package/corpus/templates/analytics/changelog/2026-08-05-first-party-analytics-uses-compact-rollups-for-faster-usage-.md +6 -0
- package/corpus/templates/analytics/server/db/schema.ts +52 -0
- package/corpus/templates/analytics/server/lib/credential-keys.ts +3 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics-health.ts +397 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics-rollups.ts +182 -0
- package/corpus/templates/analytics/server/lib/first-party-analytics.ts +86 -15
- package/corpus/templates/analytics/server/lib/provider-api.ts +20 -1
- package/corpus/templates/analytics/server/lib/replay-storage.ts +1 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/analytics/server/plugins/db.ts +60 -0
- package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/assets/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/assets/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/assets/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/assets/agent-native.json +12 -0
- package/corpus/templates/assets/server/lib/generation.ts +8 -8
- package/corpus/templates/assets/server/lib/storage.ts +1 -1
- package/corpus/templates/assets/server/plugins/onboarding.ts +1 -1
- package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/brain/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/brain/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/brain/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/brain/agent-native.json +12 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/calendar/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/calendar/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/calendar/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/calendar/agent-native.json +12 -0
- package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/chat/AGENTS.md +3 -0
- package/corpus/templates/chat/DESIGN.md +28 -0
- package/corpus/templates/chat/agent-native.json +12 -0
- package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/clips/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/clips/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/clips/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +2 -2
- package/corpus/templates/clips/actions/delete-recording-permanent.ts +3 -0
- package/corpus/templates/clips/actions/get-playback-position.ts +68 -0
- package/corpus/templates/clips/actions/import-loom-recording.ts +2 -2
- package/corpus/templates/clips/actions/save-playback-position.ts +80 -0
- package/corpus/templates/clips/actions/set-thumbnail.ts +1 -1
- package/corpus/templates/clips/agent-native.json +12 -0
- package/corpus/templates/clips/app/components/player/video-player.tsx +54 -5
- package/corpus/templates/clips/app/hooks/use-playback-position.ts +188 -0
- package/corpus/templates/clips/app/hooks/use-view-tracking.ts +6 -24
- package/corpus/templates/clips/app/lib/playback-position.ts +99 -0
- package/corpus/templates/clips/app/lib/viewer-session.ts +29 -0
- package/corpus/templates/clips/changelog/2026-08-05-clip-buffering-now-uses-buffering-copy-after-playback.md +6 -0
- package/corpus/templates/clips/changelog/2026-08-05-clips-remembers-your-playback-position-when-you-reopen-a-cli.md +6 -0
- package/corpus/templates/clips/learnings.defaults.md +1 -1
- package/corpus/templates/clips/server/db/schema.ts +18 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +1 -1
- package/corpus/templates/clips/server/lib/video-storage.ts +1 -1
- package/corpus/templates/clips/server/plugins/db.ts +15 -0
- package/corpus/templates/clips/server/routes/api/media/index.post.ts +1 -1
- package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/content/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +13 -0
- package/corpus/templates/content/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/content/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/content/AGENTS.md +1 -0
- package/corpus/templates/content/actions/_content-database-mutation-lock.ts +41 -0
- package/corpus/templates/content/actions/_content-database-row-migration.ts +569 -0
- package/corpus/templates/content/actions/_database-source-utils.ts +82 -36
- package/corpus/templates/content/actions/_database-utils.ts +5 -0
- package/corpus/templates/content/actions/_delete-content-space.ts +25 -11
- package/corpus/templates/content/actions/add-database-item.ts +60 -42
- package/corpus/templates/content/actions/attach-content-database-source.ts +2 -0
- package/corpus/templates/content/actions/configure-document-property.ts +99 -104
- package/corpus/templates/content/actions/delete-content-database.ts +19 -7
- package/corpus/templates/content/actions/delete-document-property.ts +47 -58
- package/corpus/templates/content/actions/delete-document.ts +390 -167
- package/corpus/templates/content/actions/disconnect-content-database-source.ts +41 -24
- package/corpus/templates/content/actions/duplicate-database-item.ts +63 -31
- package/corpus/templates/content/actions/duplicate-database-items.ts +86 -43
- package/corpus/templates/content/actions/duplicate-document-property.ts +37 -14
- package/corpus/templates/content/actions/migrate-content-database-rows.ts +830 -0
- package/corpus/templates/content/actions/move-database-item.ts +14 -0
- package/corpus/templates/content/actions/permanently-delete-document.ts +27 -6
- package/corpus/templates/content/actions/remove-database-items.ts +13 -0
- package/corpus/templates/content/actions/reorder-document-property.ts +45 -46
- package/corpus/templates/content/actions/set-document-property.ts +68 -28
- package/corpus/templates/content/actions/submit-content-database-form.ts +49 -0
- package/corpus/templates/content/actions/transcribe-media.ts +1 -1
- package/corpus/templates/content/agent-native.json +12 -0
- package/corpus/templates/content/app/components/editor/image-upload.ts +2 -2
- package/corpus/templates/content/app/i18n-data.ts +1 -1
- package/corpus/templates/content/changelog/2026-08-01-content-can-reorganize-every-row-in-an-existing-database-as-.md +6 -0
- package/corpus/templates/content/parity/matrix.md +1 -1
- package/corpus/templates/content/parity/matrix.ts +4 -2
- package/corpus/templates/content/server/db/schema.ts +30 -0
- package/corpus/templates/content/server/plugins/db.ts +24 -0
- package/corpus/templates/content/server/plugins/onboarding.ts +2 -2
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/crm/agent-native.json +12 -0
- package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/design/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/design/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/design/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/design/CODE_NATIVE_DESIGN_STUDIO_IMPLEMENTATION_PLAN.md +2 -2
- package/corpus/templates/design/DESIGN-STUDIO-PLAN.md +2 -2
- package/corpus/templates/design/actions/apply-design-token-edit.ts +1 -1
- package/corpus/templates/design/actions/capture-design-state.ts +1 -1
- package/corpus/templates/design/actions/connect-builder-app.ts +2 -2
- package/corpus/templates/design/actions/create-design-branch.ts +1 -1
- package/corpus/templates/design/actions/create-fusion-app.ts +3 -3
- package/corpus/templates/design/actions/deploy-design-preview.ts +1 -1
- package/corpus/templates/design/actions/get-component-details.ts +1 -1
- package/corpus/templates/design/actions/get-design-branch-diff.ts +1 -1
- package/corpus/templates/design/actions/index-components.ts +3 -3
- package/corpus/templates/design/actions/index-design-system-with-builder.ts +1 -1
- package/corpus/templates/design/actions/migrate-inline-design-to-app.ts +3 -3
- package/corpus/templates/design/actions/open-component-source.ts +1 -1
- package/corpus/templates/design/actions/update-design.ts +61 -0
- package/corpus/templates/design/agent-native.json +12 -0
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +1 -1
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +1 -1
- package/corpus/templates/design/scripts/qa-figma-stress-import.ts +1 -1
- package/corpus/templates/design/server/lib/figma-node-import.ts +1 -1
- package/corpus/templates/design/shared/design-source-capabilities.ts +25 -9
- package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/dispatch/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/dispatch/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/dispatch/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/dispatch/agent-native.json +12 -0
- package/corpus/templates/factory/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/factory/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/factory/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/factory/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/factory/agent-native.json +12 -0
- package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/forms/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/forms/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/forms/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/forms/actions/export-responses.ts +1 -1
- package/corpus/templates/forms/agent-native.json +12 -0
- package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/macros/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/macros/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/macros/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/macros/agent-native.json +12 -0
- package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/mail/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/mail/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/mail/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/mail/agent-native.json +12 -0
- package/corpus/templates/mail/app/i18n/en-US.ts +1 -1
- package/corpus/templates/mail/server/lib/media-upload.ts +1 -1
- package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/plan/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/plan/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/plan/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/plan/agent-native.json +12 -0
- package/corpus/templates/plan/server/lib/plan-assets.ts +1 -1
- package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/slides/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/slides/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/slides/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/slides/actions/generate-image-api.ts +1 -1
- package/corpus/templates/slides/actions/generate-slides-ai.ts +1 -1
- package/corpus/templates/slides/actions/import-file.ts +2 -2
- package/corpus/templates/slides/actions/index-design-system-with-builder.ts +1 -1
- package/corpus/templates/slides/agent-native.json +12 -0
- package/corpus/templates/slides/app/components/design-system/DesignSystemSetup.tsx +1 -1
- package/corpus/templates/slides/app/i18n/en-US.ts +2 -2
- package/corpus/templates/slides/app/lib/deck-sorting.ts +19 -0
- package/corpus/templates/slides/app/lib/image-drop-to-agent.ts +1 -1
- package/corpus/templates/slides/app/pages/Index.tsx +7 -2
- package/corpus/templates/slides/changelog/2026-08-05-decks-are-now-sorted-by-most-recently-updated.md +6 -0
- package/corpus/templates/slides/server/handlers/assets.ts +1 -1
- package/corpus/templates/slides/server/handlers/uploads.ts +1 -1
- package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/corpus/templates/tasks/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/corpus/templates/tasks/.agents/skills/frontend-design/SKILL.md +23 -2
- package/corpus/templates/tasks/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/corpus/templates/tasks/agent-native.json +12 -0
- package/dist/action.d.ts +6 -0
- package/dist/agent/engine/builder-engine.js +2 -2
- package/dist/agent/engine/credential-errors.d.ts +1 -1
- package/dist/agent/engine/credential-errors.js +2 -2
- package/dist/agent/production-agent.js +3 -2
- package/dist/brand-kit/fig/index.js +1 -1
- package/dist/cli/agent.js +45 -3
- package/dist/cli/code-agent-executor.js +2 -1
- package/dist/cli/create.d.ts +9 -1
- package/dist/cli/create.js +94 -1
- package/dist/cli/doctor.d.ts +8 -11
- package/dist/cli/doctor.js +92 -24
- package/dist/cli/index.js +6 -5
- package/dist/client/AgentAskPopover.d.ts +3 -1
- package/dist/client/AgentAskPopover.js +2 -2
- package/dist/client/AgentPanel.js +9 -3
- package/dist/client/AssistantChat.js +54 -33
- package/dist/client/MultiTabAssistantChat.js +1 -1
- package/dist/client/RouteTransitionIndicator.d.ts +7 -0
- package/dist/client/RouteTransitionIndicator.js +31 -0
- package/dist/client/agent-engine-key.js +1 -1
- package/dist/client/app-providers.js +11 -2
- package/dist/client/chat/message-components.js +1 -1
- package/dist/client/chat/run-recovery.js +1 -1
- package/dist/client/chat/tool-call-display.d.ts +3 -1
- package/dist/client/chat/tool-call-display.js +4 -3
- package/dist/client/chat-model-groups.d.ts +6 -0
- package/dist/client/chat-model-groups.js +11 -0
- package/dist/client/error-format.js +1 -1
- package/dist/client/i18n.js +1 -1
- package/dist/client/onboarding/FirstRunOnboarding.d.ts +5 -1
- package/dist/client/onboarding/FirstRunOnboarding.js +29 -13
- package/dist/client/onboarding/first-run-enabled.d.ts +6 -1
- package/dist/client/onboarding/first-run-enabled.js +33 -3
- package/dist/client/onboarding/use-onboarding.js +16 -11
- package/dist/client/resources/mcp-integration-catalog.js +26 -0
- package/dist/client/resources/mcp-integration-logos.js +4 -0
- package/dist/client/route-warmup.js +56 -10
- package/dist/client/settings/AccountSettingsCard.js +78 -3
- package/dist/client/settings/SettingsPanel.js +1 -1
- package/dist/client/settings/VoiceTranscriptionSection.js +2 -2
- package/dist/client/settings/useBuilderStatus.js +1 -1
- package/dist/client/setup-connections/useBuilderConnectCardController.js +1 -1
- package/dist/client/ui/index.d.ts +1 -0
- package/dist/client/ui/index.js +1 -0
- package/dist/client/uploads/upload-editor-image.js +1 -1
- package/dist/client/use-chat-threads.js +3 -0
- package/dist/collab/routes.d.ts +2 -2
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/config.d.ts +48 -0
- package/dist/config.js +111 -0
- package/dist/db/migrations.js +5 -0
- package/dist/eject/provider-api-definitions.d.ts +1 -1
- package/dist/eject/provider-api-definitions.js +1 -0
- package/dist/eject/remote-mcp-presets.js +1 -0
- package/dist/extensions/web-search-tool.js +2 -2
- package/dist/file-upload/actions/upload-image.js +1 -1
- package/dist/file-upload/registry.js +1 -1
- package/dist/guards/index.d.ts +3 -0
- package/dist/guards/index.js +2 -0
- package/dist/guards/no-empty-migrations.d.ts +14 -0
- package/dist/guards/no-empty-migrations.js +126 -0
- package/dist/index.browser.d.ts +1 -0
- package/dist/index.browser.js +3 -0
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -0
- package/dist/localization/default-messages.d.ts +24 -0
- package/dist/localization/default-messages.js +26 -2
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/onboarding/app-profile.js +1 -1
- package/dist/onboarding/plugin.d.ts +2 -0
- package/dist/onboarding/plugin.js +29 -2
- package/dist/provider-api/actions/custom-provider-registration.d.ts +16 -16
- package/dist/provider-api/actions/provider-api.d.ts +13 -13
- package/dist/provider-api/index.d.ts +4 -4
- package/dist/provider-api/index.js +35 -0
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/resources/handlers.js +1 -1
- package/dist/scripts/docs/framework-search.d.ts +9 -0
- package/dist/scripts/docs/framework-search.js +239 -0
- package/dist/scripts/docs/index.js +1 -0
- package/dist/scripts/docs/search.d.ts +10 -0
- package/dist/scripts/docs/search.js +1 -1
- package/dist/scripts/docs/source-search.d.ts +10 -2
- package/dist/scripts/docs/source-search.js +108 -41
- package/dist/search-utils/index.d.ts +11 -0
- package/dist/search-utils/index.js +72 -0
- package/dist/server/action-change.d.ts +6 -0
- package/dist/server/action-change.js +28 -14
- package/dist/server/action-discovery.js +9 -0
- package/dist/server/action-routes.js +1 -0
- package/dist/server/agent-chat/browser-team-tools.js +1 -1
- package/dist/server/agent-chat/script-entries.js +43 -2
- package/dist/server/agent-engine-api-key-route.d.ts +1 -1
- package/dist/server/auth-login-mode.d.ts +8 -0
- package/dist/server/auth-login-mode.js +17 -0
- package/dist/server/auth.js +100 -15
- package/dist/server/better-auth-instance.d.ts +36 -0
- package/dist/server/better-auth-instance.js +25 -3
- package/dist/server/builder-design-systems.js +1 -1
- package/dist/server/core-routes-plugin.js +17 -14
- package/dist/server/credential-provider.js +3 -3
- package/dist/server/email-templates.d.ts +7 -0
- package/dist/server/email-templates.js +24 -0
- package/dist/server/email.d.ts +17 -0
- package/dist/server/email.js +22 -1
- package/dist/server/framework-request-handler.js +6 -0
- package/dist/server/onboarding-html.d.ts +2 -0
- package/dist/server/onboarding-html.js +169 -8
- package/dist/server/realtime-token.d.ts +1 -1
- package/dist/server/realtime-voice.js +1 -1
- package/dist/server/sentry.d.ts +1 -1
- package/dist/server/transcribe-voice.js +3 -3
- package/dist/shared/first-run-onboarding.d.ts +1 -0
- package/dist/shared/first-run-onboarding.js +1 -0
- package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/dist/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/dist/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
- package/dist/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/dist/templates/chat/AGENTS.md +3 -0
- package/dist/templates/chat/DESIGN.md +28 -0
- package/dist/templates/chat/agent-native.json +12 -0
- package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/dist/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/dist/templates/default/.agents/skills/frontend-design/SKILL.md +23 -2
- package/dist/templates/default/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/dist/templates/default/AGENTS.md +4 -0
- package/dist/templates/default/DESIGN.md +30 -0
- package/dist/templates/default/agent-native.json +9 -0
- package/dist/templates/default/app/i18n/ar-SA.ts +2 -2
- package/dist/templates/default/app/i18n/de-DE.ts +2 -2
- package/dist/templates/default/app/i18n/en-US.ts +2 -2
- package/dist/templates/default/app/i18n/es-ES.ts +2 -2
- package/dist/templates/default/app/i18n/fr-FR.ts +2 -2
- package/dist/templates/default/app/i18n/hi-IN.ts +2 -2
- package/dist/templates/default/app/i18n/ja-JP.ts +2 -2
- package/dist/templates/default/app/i18n/ko-KR.ts +2 -2
- package/dist/templates/default/app/i18n/pt-BR.ts +2 -2
- package/dist/templates/default/app/i18n/zh-CN.ts +2 -2
- package/dist/templates/default/app/i18n/zh-TW.ts +1 -1
- package/dist/templates/default/package.json +1 -0
- package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/dist/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/dist/templates/headless/agent-native.json +9 -0
- package/dist/templates/headless/package.json +2 -0
- package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/dist/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/dist/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +23 -2
- package/dist/templates/workspace-core/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/dist/templates/workspace-core/AGENTS.md +3 -0
- package/dist/templates/workspace-core/DESIGN.md +35 -0
- package/dist/templates/workspace-root/AGENTS.md +3 -0
- package/dist/templates/workspace-root/DESIGN.md +35 -0
- package/dist/templates/workspace-root/agent-native.json +9 -0
- package/dist/templates/workspace-root/package.json +3 -0
- package/dist/transcription/builder-transcription.js +1 -1
- package/dist/user-profile/actions/change-password.d.ts +8 -0
- package/dist/user-profile/actions/change-password.js +24 -0
- package/dist/user-profile/actions/get-auth-methods.d.ts +6 -0
- package/dist/user-profile/actions/get-auth-methods.js +23 -0
- package/dist/user-profile/actions/set-password.d.ts +7 -0
- package/dist/user-profile/actions/set-password.js +23 -0
- package/dist/vite/client.d.ts +8 -1
- package/dist/vite/client.js +63 -12
- package/dist/vite/index.d.ts +1 -0
- package/dist/vite/index.js +1 -0
- package/docs/AGENTS.md +7 -2
- package/docs/SKILL.md +7 -5
- package/docs/content/agent-native-config.mdx +165 -0
- package/docs/content/agent-native-toolkit.mdx +1 -1
- package/docs/content/deployment.mdx +7 -2
- package/docs/content/doctor.mdx +21 -13
- package/docs/content/environment-variables.mdx +158 -0
- package/docs/content/file-uploads.mdx +1 -1
- package/docs/content/getting-started.mdx +1 -1
- package/docs/content/key-concepts.mdx +1 -1
- package/docs/content/multi-app-workspace.mdx +1 -1
- package/docs/content/template-clips-ai-and-editing.mdx +6 -6
- package/docs/content/template-clips-developers.mdx +3 -3
- package/docs/content/toolkit-settings.mdx +1 -1
- package/docs/content/voice-input.mdx +4 -4
- package/package.json +6 -2
- package/src/eject/provider-api-definitions.ts +1 -0
- package/src/eject/remote-mcp-presets.ts +1 -0
- package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/src/templates/chat/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/src/templates/chat/.agents/skills/frontend-design/SKILL.md +23 -2
- package/src/templates/chat/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/src/templates/chat/AGENTS.md +3 -0
- package/src/templates/chat/DESIGN.md +28 -0
- package/src/templates/chat/agent-native.json +12 -0
- package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/src/templates/default/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/src/templates/default/.agents/skills/frontend-design/SKILL.md +23 -2
- package/src/templates/default/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/src/templates/default/AGENTS.md +4 -0
- package/src/templates/default/DESIGN.md +30 -0
- package/src/templates/default/agent-native.json +9 -0
- package/src/templates/default/app/i18n/ar-SA.ts +2 -2
- package/src/templates/default/app/i18n/de-DE.ts +2 -2
- package/src/templates/default/app/i18n/en-US.ts +2 -2
- package/src/templates/default/app/i18n/es-ES.ts +2 -2
- package/src/templates/default/app/i18n/fr-FR.ts +2 -2
- package/src/templates/default/app/i18n/hi-IN.ts +2 -2
- package/src/templates/default/app/i18n/ja-JP.ts +2 -2
- package/src/templates/default/app/i18n/ko-KR.ts +2 -2
- package/src/templates/default/app/i18n/pt-BR.ts +2 -2
- package/src/templates/default/app/i18n/zh-CN.ts +2 -2
- package/src/templates/default/app/i18n/zh-TW.ts +1 -1
- package/src/templates/default/package.json +1 -0
- package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/src/templates/headless/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/src/templates/headless/agent-native.json +9 -0
- package/src/templates/headless/package.json +2 -0
- package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +23 -3
- package/src/templates/workspace-core/.agents/skills/agent-native-toolkit/SKILL.md +16 -0
- package/src/templates/workspace-core/.agents/skills/frontend-design/SKILL.md +23 -2
- package/src/templates/workspace-core/.agents/skills/frontend-design/references/visual-direction.md +99 -0
- package/src/templates/workspace-core/AGENTS.md +3 -0
- package/src/templates/workspace-core/DESIGN.md +35 -0
- package/src/templates/workspace-root/AGENTS.md +3 -0
- package/src/templates/workspace-root/DESIGN.md +35 -0
- package/src/templates/workspace-root/agent-native.json +9 -0
- package/src/templates/workspace-root/package.json +3 -0
|
@@ -72,6 +72,14 @@ const EN_AUTH_COPY = {
|
|
|
72
72
|
passwordMinPlaceholder: "At least 8 characters",
|
|
73
73
|
confirmPasswordPlaceholder: "Confirm password",
|
|
74
74
|
enterPasswordPlaceholder: "Enter password",
|
|
75
|
+
magicLinkTitle: "Sign in with a link",
|
|
76
|
+
magicLinkSubtitle: "Enter your email and we'll send you a secure sign-in link",
|
|
77
|
+
sendMagicLink: "Email me a sign-in link",
|
|
78
|
+
magicLinkSent: "Check your email",
|
|
79
|
+
magicLinkSentCopy: "We sent a secure sign-in link to",
|
|
80
|
+
magicLinkFailed: "Could not send sign-in link.",
|
|
81
|
+
usePasswordInstead: "Use a password instead",
|
|
82
|
+
backToMagicLink: "Use a sign-in link instead",
|
|
75
83
|
signupProgress: "Signup progress",
|
|
76
84
|
progressAccount: "Account",
|
|
77
85
|
progressVerify: "Verify",
|
|
@@ -160,6 +168,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
160
168
|
passwordMinPlaceholder: "至少 8 个字符",
|
|
161
169
|
confirmPasswordPlaceholder: "确认密码",
|
|
162
170
|
enterPasswordPlaceholder: "输入密码",
|
|
171
|
+
magicLinkTitle: "使用链接登录",
|
|
172
|
+
magicLinkSubtitle: "输入邮箱,我们会发送安全登录链接",
|
|
173
|
+
sendMagicLink: "发送登录链接到邮箱",
|
|
174
|
+
magicLinkSent: "检查你的邮箱",
|
|
175
|
+
magicLinkSentCopy: "我们已向以下邮箱发送安全登录链接:",
|
|
176
|
+
magicLinkFailed: "无法发送登录链接。",
|
|
177
|
+
usePasswordInstead: "改用密码",
|
|
178
|
+
backToMagicLink: "改用登录链接",
|
|
163
179
|
signupProgress: "注册进度",
|
|
164
180
|
progressAccount: "账户",
|
|
165
181
|
progressVerify: "验证",
|
|
@@ -246,6 +262,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
246
262
|
passwordMinPlaceholder: "至少 8 個字元",
|
|
247
263
|
confirmPasswordPlaceholder: "確認密碼",
|
|
248
264
|
enterPasswordPlaceholder: "輸入密碼",
|
|
265
|
+
magicLinkTitle: "使用連結登入",
|
|
266
|
+
magicLinkSubtitle: "輸入電子郵件,我們會寄送安全登入連結",
|
|
267
|
+
sendMagicLink: "寄送登入連結",
|
|
268
|
+
magicLinkSent: "檢查你的電子郵件",
|
|
269
|
+
magicLinkSentCopy: "我們已向以下電子郵件寄送安全登入連結:",
|
|
270
|
+
magicLinkFailed: "無法寄送登入連結。",
|
|
271
|
+
usePasswordInstead: "改用密碼",
|
|
272
|
+
backToMagicLink: "改用登入連結",
|
|
249
273
|
signupProgress: "註冊進度",
|
|
250
274
|
progressAccount: "帳號",
|
|
251
275
|
progressVerify: "驗證",
|
|
@@ -332,6 +356,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
332
356
|
passwordMinPlaceholder: "Al menos 8 caracteres",
|
|
333
357
|
confirmPasswordPlaceholder: "Confirmar contraseña",
|
|
334
358
|
enterPasswordPlaceholder: "Introduce la contraseña",
|
|
359
|
+
magicLinkTitle: "Inicia sesión con un enlace",
|
|
360
|
+
magicLinkSubtitle: "Introduce tu email y te enviaremos un enlace seguro",
|
|
361
|
+
sendMagicLink: "Enviarme un enlace de inicio de sesión",
|
|
362
|
+
magicLinkSent: "Revisa tu email",
|
|
363
|
+
magicLinkSentCopy: "Enviamos un enlace seguro a",
|
|
364
|
+
magicLinkFailed: "No se pudo enviar el enlace de inicio de sesión.",
|
|
365
|
+
usePasswordInstead: "Usar una contraseña",
|
|
366
|
+
backToMagicLink: "Usar un enlace de inicio de sesión",
|
|
335
367
|
signupProgress: "Progreso de registro",
|
|
336
368
|
progressAccount: "Cuenta",
|
|
337
369
|
progressVerify: "Verificar",
|
|
@@ -418,6 +450,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
418
450
|
passwordMinPlaceholder: "Au moins 8 caractères",
|
|
419
451
|
confirmPasswordPlaceholder: "Confirmer le mot de passe",
|
|
420
452
|
enterPasswordPlaceholder: "Saisir le mot de passe",
|
|
453
|
+
magicLinkTitle: "Se connecter avec un lien",
|
|
454
|
+
magicLinkSubtitle: "Saisissez votre e-mail et nous vous enverrons un lien sécurisé",
|
|
455
|
+
sendMagicLink: "M'envoyer un lien de connexion",
|
|
456
|
+
magicLinkSent: "Vérifiez votre e-mail",
|
|
457
|
+
magicLinkSentCopy: "Nous avons envoyé un lien sécurisé à",
|
|
458
|
+
magicLinkFailed: "Impossible d'envoyer le lien de connexion.",
|
|
459
|
+
usePasswordInstead: "Utiliser un mot de passe",
|
|
460
|
+
backToMagicLink: "Utiliser un lien de connexion",
|
|
421
461
|
signupProgress: "Progression de l'inscription",
|
|
422
462
|
progressAccount: "Compte",
|
|
423
463
|
progressVerify: "Vérifier",
|
|
@@ -504,6 +544,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
504
544
|
passwordMinPlaceholder: "Mindestens 8 Zeichen",
|
|
505
545
|
confirmPasswordPlaceholder: "Passwort bestätigen",
|
|
506
546
|
enterPasswordPlaceholder: "Passwort eingeben",
|
|
547
|
+
magicLinkTitle: "Mit einem Link anmelden",
|
|
548
|
+
magicLinkSubtitle: "Gib deine E-Mail ein und wir senden dir einen sicheren Anmeldelink",
|
|
549
|
+
sendMagicLink: "Anmeldelink per E-Mail senden",
|
|
550
|
+
magicLinkSent: "Prüfe deine E-Mail",
|
|
551
|
+
magicLinkSentCopy: "Wir haben einen sicheren Anmeldelink gesendet an",
|
|
552
|
+
magicLinkFailed: "Anmeldelink konnte nicht gesendet werden.",
|
|
553
|
+
usePasswordInstead: "Stattdessen Passwort verwenden",
|
|
554
|
+
backToMagicLink: "Stattdessen Anmeldelink verwenden",
|
|
507
555
|
signupProgress: "Registrierungsfortschritt",
|
|
508
556
|
progressAccount: "Konto",
|
|
509
557
|
progressVerify: "Prüfen",
|
|
@@ -590,6 +638,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
590
638
|
passwordMinPlaceholder: "8 文字以上",
|
|
591
639
|
confirmPasswordPlaceholder: "パスワードを確認",
|
|
592
640
|
enterPasswordPlaceholder: "パスワードを入力",
|
|
641
|
+
magicLinkTitle: "リンクでサインイン",
|
|
642
|
+
magicLinkSubtitle: "メールアドレスを入力すると、安全なサインインリンクを送信します",
|
|
643
|
+
sendMagicLink: "サインインリンクをメールで送信",
|
|
644
|
+
magicLinkSent: "メールを確認してください",
|
|
645
|
+
magicLinkSentCopy: "安全なサインインリンクを送信しました:",
|
|
646
|
+
magicLinkFailed: "サインインリンクを送信できませんでした。",
|
|
647
|
+
usePasswordInstead: "パスワードを使用する",
|
|
648
|
+
backToMagicLink: "サインインリンクを使用する",
|
|
593
649
|
signupProgress: "登録の進行状況",
|
|
594
650
|
progressAccount: "アカウント",
|
|
595
651
|
progressVerify: "確認",
|
|
@@ -676,6 +732,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
676
732
|
passwordMinPlaceholder: "8자 이상",
|
|
677
733
|
confirmPasswordPlaceholder: "비밀번호 확인",
|
|
678
734
|
enterPasswordPlaceholder: "비밀번호 입력",
|
|
735
|
+
magicLinkTitle: "링크로 로그인",
|
|
736
|
+
magicLinkSubtitle: "이메일을 입력하면 안전한 로그인 링크를 보내드립니다",
|
|
737
|
+
sendMagicLink: "로그인 링크 이메일 받기",
|
|
738
|
+
magicLinkSent: "이메일을 확인하세요",
|
|
739
|
+
magicLinkSentCopy: "안전한 로그인 링크를 보냈습니다:",
|
|
740
|
+
magicLinkFailed: "로그인 링크를 보낼 수 없습니다.",
|
|
741
|
+
usePasswordInstead: "비밀번호 사용",
|
|
742
|
+
backToMagicLink: "로그인 링크 사용",
|
|
679
743
|
signupProgress: "가입 진행 상황",
|
|
680
744
|
progressAccount: "계정",
|
|
681
745
|
progressVerify: "확인",
|
|
@@ -762,6 +826,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
762
826
|
passwordMinPlaceholder: "Pelo menos 8 caracteres",
|
|
763
827
|
confirmPasswordPlaceholder: "Confirmar senha",
|
|
764
828
|
enterPasswordPlaceholder: "Digite a senha",
|
|
829
|
+
magicLinkTitle: "Entrar com um link",
|
|
830
|
+
magicLinkSubtitle: "Digite seu email e enviaremos um link seguro de acesso",
|
|
831
|
+
sendMagicLink: "Enviar link de acesso por email",
|
|
832
|
+
magicLinkSent: "Confira seu email",
|
|
833
|
+
magicLinkSentCopy: "Enviamos um link seguro para",
|
|
834
|
+
magicLinkFailed: "Não foi possível enviar o link de acesso.",
|
|
835
|
+
usePasswordInstead: "Usar uma senha",
|
|
836
|
+
backToMagicLink: "Usar um link de acesso",
|
|
765
837
|
signupProgress: "Progresso do cadastro",
|
|
766
838
|
progressAccount: "Conta",
|
|
767
839
|
progressVerify: "Verificar",
|
|
@@ -848,6 +920,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
848
920
|
passwordMinPlaceholder: "कम से कम 8 अक्षर",
|
|
849
921
|
confirmPasswordPlaceholder: "पासवर्ड की पुष्टि करें",
|
|
850
922
|
enterPasswordPlaceholder: "पासवर्ड दर्ज करें",
|
|
923
|
+
magicLinkTitle: "लिंक से साइन इन करें",
|
|
924
|
+
magicLinkSubtitle: "अपना ईमेल दर्ज करें और हम सुरक्षित साइन-इन लिंक भेजेंगे",
|
|
925
|
+
sendMagicLink: "मुझे साइन-इन लिंक ईमेल करें",
|
|
926
|
+
magicLinkSent: "अपना ईमेल देखें",
|
|
927
|
+
magicLinkSentCopy: "हमने सुरक्षित साइन-इन लिंक यहां भेजा है:",
|
|
928
|
+
magicLinkFailed: "साइन-इन लिंक नहीं भेजा जा सका।",
|
|
929
|
+
usePasswordInstead: "पासवर्ड का उपयोग करें",
|
|
930
|
+
backToMagicLink: "साइन-इन लिंक का उपयोग करें",
|
|
851
931
|
signupProgress: "साइनअप प्रगति",
|
|
852
932
|
progressAccount: "खाता",
|
|
853
933
|
progressVerify: "सत्यापित करें",
|
|
@@ -934,6 +1014,14 @@ const AUTH_LOCALE_COPY = {
|
|
|
934
1014
|
passwordMinPlaceholder: "8 أحرف على الأقل",
|
|
935
1015
|
confirmPasswordPlaceholder: "تأكيد كلمة المرور",
|
|
936
1016
|
enterPasswordPlaceholder: "أدخل كلمة المرور",
|
|
1017
|
+
magicLinkTitle: "تسجيل الدخول باستخدام رابط",
|
|
1018
|
+
magicLinkSubtitle: "أدخل بريدك الإلكتروني وسنرسل لك رابط تسجيل دخول آمنًا",
|
|
1019
|
+
sendMagicLink: "إرسال رابط تسجيل الدخول إلى بريدي",
|
|
1020
|
+
magicLinkSent: "تحقق من بريدك الإلكتروني",
|
|
1021
|
+
magicLinkSentCopy: "أرسلنا رابط تسجيل دخول آمنًا إلى",
|
|
1022
|
+
magicLinkFailed: "تعذر إرسال رابط تسجيل الدخول.",
|
|
1023
|
+
usePasswordInstead: "استخدام كلمة مرور بدلًا من ذلك",
|
|
1024
|
+
backToMagicLink: "استخدام رابط تسجيل الدخول بدلًا من ذلك",
|
|
937
1025
|
signupProgress: "تقدم التسجيل",
|
|
938
1026
|
progressAccount: "الحساب",
|
|
939
1027
|
progressVerify: "التحقق",
|
|
@@ -1126,6 +1214,8 @@ function isAgentNativeHostedHost(host) {
|
|
|
1126
1214
|
export function getOnboardingHtml(opts = {}) {
|
|
1127
1215
|
const showGoogle = hasGoogleOAuth();
|
|
1128
1216
|
const googleOnly = !!opts.googleOnly;
|
|
1217
|
+
const authMode = opts.authMode ?? "password";
|
|
1218
|
+
const magicLinkMode = authMode === "magic-link";
|
|
1129
1219
|
// In a Google-only app, Google is the sole sign-in method, so always render
|
|
1130
1220
|
// a working button — never gate it on env vars detected at render time. The
|
|
1131
1221
|
// login page is a public, CDN-cacheable shell served to everyone (per-user
|
|
@@ -2239,8 +2329,8 @@ ${marketingStyles}
|
|
|
2239
2329
|
${localePickerHtml}
|
|
2240
2330
|
${marketingPanelHtml}
|
|
2241
2331
|
<div class="card">
|
|
2242
|
-
<h1 id="heading"${i18nAttr(googleOnly ? "signInTitle" : "welcomeTitle")}>${esc(t(googleOnly ? "signInTitle" : "welcomeTitle"))}</h1>
|
|
2243
|
-
<p class="subtitle" id="subtitle"${i18nAttr(googleOnly ? "googleOnlySubtitle" : "createAccountSubtitle")}>${esc(t(googleOnly ? "googleOnlySubtitle" : "createAccountSubtitle"))}</p>
|
|
2332
|
+
<h1 id="heading"${i18nAttr(googleOnly ? "signInTitle" : magicLinkMode ? "magicLinkTitle" : "welcomeTitle")}>${esc(t(googleOnly ? "signInTitle" : magicLinkMode ? "magicLinkTitle" : "welcomeTitle"))}</h1>
|
|
2333
|
+
<p class="subtitle" id="subtitle"${i18nAttr(googleOnly ? "googleOnlySubtitle" : magicLinkMode ? "magicLinkSubtitle" : "createAccountSubtitle")}>${esc(t(googleOnly ? "googleOnlySubtitle" : magicLinkMode ? "magicLinkSubtitle" : "createAccountSubtitle"))}</p>
|
|
2244
2334
|
<p
|
|
2245
2335
|
class="upgrade-note"
|
|
2246
2336
|
id="upgrade-note"
|
|
@@ -2264,7 +2354,7 @@ ${googleOnly ? "" : `\n <div class="divider" id="auth-divider"${i18nAttr("divid
|
|
|
2264
2354
|
: ""}
|
|
2265
2355
|
${googleOnly
|
|
2266
2356
|
? ""
|
|
2267
|
-
:
|
|
2357
|
+
: `${magicLinkMode ? '\n <form id="magic-link-form" class="form">\n <label for="m-email"' + i18nAttr("email") + ">" + esc(t("email")) + '</label>\n <input id="m-email" type="email" autocomplete="email" autofocus placeholder="you@example.com" required />\n <button type="submit"' + i18nAttr("sendMagicLink") + ">" + esc(t("sendMagicLink")) + '</button>\n <p class="msg" id="m-msg"></p>\n <p style="margin-top:0.75rem;font-size:0.75rem;text-align:center">\n <a href="#" id="use-password-link" class="link-button"' + i18nAttr("usePasswordInstead") + ">" + esc(t("usePasswordInstead")) + "</a>\n </p>\n </form>\n" : ""} <div class="tabs"${magicLinkMode ? " hidden" : ""}>
|
|
2268
2358
|
<button class="tab" data-tab="signup"${i18nAttr("createAccount")}>${esc(t("createAccount"))}</button>
|
|
2269
2359
|
<button class="tab" data-tab="login"${i18nAttr("signIn")}>${esc(t("signIn"))}</button>
|
|
2270
2360
|
</div>
|
|
@@ -2311,6 +2401,7 @@ ${signupLocalModeNoteHtml}
|
|
|
2311
2401
|
<p style="margin-top:0.75rem;font-size:0.75rem;text-align:right">
|
|
2312
2402
|
<a href="#" id="forgot-link" style="color:#888;text-decoration:underline;text-underline-offset:2px"${i18nAttr("forgotPassword")}>${esc(t("forgotPassword"))}</a>
|
|
2313
2403
|
</p>
|
|
2404
|
+
${magicLinkMode ? `<p style="margin-top:0.5rem;font-size:0.75rem;text-align:center"><a href="#" id="back-to-magic-link" class="link-button"${i18nAttr("backToMagicLink")}>${esc(t("backToMagicLink"))}</a></p>` : ""}
|
|
2314
2405
|
</form>
|
|
2315
2406
|
|
|
2316
2407
|
<form id="forgot-form" class="form">
|
|
@@ -2361,7 +2452,8 @@ ${signInJourneyInlineScript()}
|
|
|
2361
2452
|
var __AN_AUTH_MARKETING_LOCALES = ${JSON.stringify(AUTH_MARKETING_LOCALE_COPY)};
|
|
2362
2453
|
var __anAuthLocale = __AN_AUTH_DEFAULT_LOCALE;
|
|
2363
2454
|
var __anAuthLocalePreference = 'system';
|
|
2364
|
-
var
|
|
2455
|
+
var __AN_AUTH_MODE = ${JSON.stringify(authMode)};
|
|
2456
|
+
var __anAuthView = ${JSON.stringify(googleOnly ? "googleOnly" : magicLinkMode ? "magicLink" : "signup")};
|
|
2365
2457
|
function __anAuthLocaleIsSupported(value) {
|
|
2366
2458
|
return __AN_AUTH_SUPPORTED_LOCALES.indexOf(value) !== -1;
|
|
2367
2459
|
}
|
|
@@ -2429,6 +2521,7 @@ ${signInJourneyInlineScript()}
|
|
|
2429
2521
|
if (view === 'forgot') return { heading: 'resetPasswordTitle', subtitle: 'resetPasswordSubtitle' };
|
|
2430
2522
|
if (view === 'verification') return { heading: 'checkEmailTitle', subtitle: 'finishAccountSubtitle' };
|
|
2431
2523
|
if (view === 'googleOnly') return { heading: 'signInTitle', subtitle: 'googleOnlySubtitle' };
|
|
2524
|
+
if (view === 'magicLink') return { heading: 'magicLinkTitle', subtitle: 'magicLinkSubtitle' };
|
|
2432
2525
|
return { heading: 'welcomeTitle', subtitle: 'createAccountSubtitle' };
|
|
2433
2526
|
}
|
|
2434
2527
|
function __anRefreshAuthViewCopy() {
|
|
@@ -3049,7 +3142,14 @@ ${googleOnly
|
|
|
3049
3142
|
function clearRememberedPendingSignupEmail() {
|
|
3050
3143
|
rememberPendingSignupEmail('');
|
|
3051
3144
|
}
|
|
3052
|
-
|
|
3145
|
+
function showMagicLinkForm() {
|
|
3146
|
+
var form = document.getElementById('magic-link-form');
|
|
3147
|
+
if (!form) return;
|
|
3148
|
+
forms.forEach(function(x) { x.classList.remove('active'); });
|
|
3149
|
+
form.classList.add('active');
|
|
3150
|
+
__anSetAuthView('magicLink');
|
|
3151
|
+
}
|
|
3152
|
+
function setActiveTab(name, opts) {
|
|
3053
3153
|
if (name !== 'signup' && name !== 'login') return;
|
|
3054
3154
|
var form = document.getElementById(name + '-form');
|
|
3055
3155
|
if (!form) return;
|
|
@@ -3156,7 +3256,10 @@ ${googleOnly
|
|
|
3156
3256
|
__anRedirectToSignedInApp();
|
|
3157
3257
|
return { ok: true };
|
|
3158
3258
|
}
|
|
3159
|
-
var data = await res.json().catch(function() {
|
|
3259
|
+
var data = await res.json().catch(function(error) {
|
|
3260
|
+
console.warn('[auth] Could not parse sign-in response', error);
|
|
3261
|
+
return null;
|
|
3262
|
+
});
|
|
3160
3263
|
var error = (data && (data.error || data.message)) || __anT('finishSignInFailed');
|
|
3161
3264
|
return {
|
|
3162
3265
|
ok: false,
|
|
@@ -3299,7 +3402,7 @@ ${googleOnly
|
|
|
3299
3402
|
}
|
|
3300
3403
|
}
|
|
3301
3404
|
(function initActiveTab() {
|
|
3302
|
-
var initial = 'signup';
|
|
3405
|
+
var initial = __AN_AUTH_MODE === 'magic-link' ? 'magicLink' : 'signup';
|
|
3303
3406
|
try {
|
|
3304
3407
|
var params = new URLSearchParams(location.search);
|
|
3305
3408
|
var qp = params.get('tab');
|
|
@@ -3318,7 +3421,8 @@ ${googleOnly
|
|
|
3318
3421
|
if (stored === 'login' || stored === 'signup') initial = stored;
|
|
3319
3422
|
}
|
|
3320
3423
|
} catch (e) {}
|
|
3321
|
-
|
|
3424
|
+
if (initial === 'magicLink') showMagicLinkForm();
|
|
3425
|
+
else setActiveTab(initial, { persist: false });
|
|
3322
3426
|
try {
|
|
3323
3427
|
if (__anIsVerifiedRedirectSuccess()) {
|
|
3324
3428
|
var rememberedEmail = readRememberedPendingSignupEmail();
|
|
@@ -3338,6 +3442,63 @@ ${googleOnly
|
|
|
3338
3442
|
setActiveTab(t.dataset.tab, { persist: true });
|
|
3339
3443
|
}); });
|
|
3340
3444
|
|
|
3445
|
+
var usePasswordLink = document.getElementById('use-password-link');
|
|
3446
|
+
if (usePasswordLink) usePasswordLink.addEventListener('click', function(e) {
|
|
3447
|
+
e.preventDefault();
|
|
3448
|
+
setActiveTab('login', { persist: false });
|
|
3449
|
+
var magicEmail = document.getElementById('m-email');
|
|
3450
|
+
var loginEmail = document.getElementById('l-email');
|
|
3451
|
+
if (magicEmail && loginEmail && magicEmail.value) loginEmail.value = magicEmail.value;
|
|
3452
|
+
});
|
|
3453
|
+
var backToMagicLink = document.getElementById('back-to-magic-link');
|
|
3454
|
+
if (backToMagicLink) backToMagicLink.addEventListener('click', function(e) {
|
|
3455
|
+
e.preventDefault();
|
|
3456
|
+
showMagicLinkForm();
|
|
3457
|
+
});
|
|
3458
|
+
|
|
3459
|
+
var magicLinkForm = document.getElementById('magic-link-form');
|
|
3460
|
+
if (magicLinkForm) magicLinkForm.addEventListener('submit', async function(e) {
|
|
3461
|
+
e.preventDefault();
|
|
3462
|
+
var btn = magicLinkForm.querySelector('button[type="submit"]');
|
|
3463
|
+
var msg = document.getElementById('m-msg');
|
|
3464
|
+
var emailInput = document.getElementById('m-email');
|
|
3465
|
+
var email = __anNormalizeAuthEmail(emailInput && emailInput.value);
|
|
3466
|
+
msg.classList.remove('show', 'error', 'success');
|
|
3467
|
+
if (!__anIsValidAuthEmail(email)) {
|
|
3468
|
+
__anShowEmailValidationError(emailInput, msg);
|
|
3469
|
+
return;
|
|
3470
|
+
}
|
|
3471
|
+
var originalLabel = btn.textContent;
|
|
3472
|
+
btn.disabled = true;
|
|
3473
|
+
btn.textContent = __anT('sending');
|
|
3474
|
+
try {
|
|
3475
|
+
var res = await fetch(__anPath('/_agent-native/auth/magic-link'), {
|
|
3476
|
+
method: 'POST',
|
|
3477
|
+
headers: { 'Content-Type': 'application/json' },
|
|
3478
|
+
body: JSON.stringify({ email: email, callbackURL: __anResumeHref() }),
|
|
3479
|
+
});
|
|
3480
|
+
var data = await res.json().catch(function(error) {
|
|
3481
|
+
console.warn('[auth] Could not parse magic-link response', error);
|
|
3482
|
+
return null;
|
|
3483
|
+
});
|
|
3484
|
+
if (res.ok) {
|
|
3485
|
+
msg.textContent = __anT('magicLinkSent') + '. ' + __anT('magicLinkSentCopy') + ' ' + email + '.';
|
|
3486
|
+
msg.classList.add('show', 'success');
|
|
3487
|
+
btn.textContent = __anT('sent');
|
|
3488
|
+
return;
|
|
3489
|
+
}
|
|
3490
|
+
msg.textContent = (data && (data.error || data.message)) || __anT('magicLinkFailed');
|
|
3491
|
+
msg.classList.add('show', 'error');
|
|
3492
|
+
btn.disabled = false;
|
|
3493
|
+
btn.textContent = originalLabel;
|
|
3494
|
+
} catch (err) {
|
|
3495
|
+
msg.textContent = __anT('networkErrorDashRetry');
|
|
3496
|
+
msg.classList.add('show', 'error');
|
|
3497
|
+
btn.disabled = false;
|
|
3498
|
+
btn.textContent = originalLabel;
|
|
3499
|
+
}
|
|
3500
|
+
});
|
|
3501
|
+
|
|
3341
3502
|
document.getElementById('signup-form').addEventListener('submit', async function(e) {
|
|
3342
3503
|
e.preventDefault();
|
|
3343
3504
|
var form = e.currentTarget;
|
|
@@ -26,9 +26,9 @@ export declare function createRealtimeTokenHandler(): import("h3").EventHandlerW
|
|
|
26
26
|
expiresAt?: undefined;
|
|
27
27
|
ttlSeconds?: undefined;
|
|
28
28
|
} | {
|
|
29
|
-
error?: undefined;
|
|
30
29
|
token: string;
|
|
31
30
|
expiresAt: string;
|
|
32
31
|
ttlSeconds: number;
|
|
32
|
+
error?: undefined;
|
|
33
33
|
}>>;
|
|
34
34
|
//# sourceMappingURL=realtime-token.d.ts.map
|
|
@@ -412,7 +412,7 @@ function createSessionHandler(tools, capabilities, options) {
|
|
|
412
412
|
if (!builderConfigured && !apiKey) {
|
|
413
413
|
setResponseStatus(event, 409);
|
|
414
414
|
return {
|
|
415
|
-
error: "Connect Builder or configure an OpenAI API key to use realtime voice.",
|
|
415
|
+
error: "Connect Builder (free tier available) or configure an OpenAI API key to use realtime voice.",
|
|
416
416
|
code: "realtime_voice_setup_required",
|
|
417
417
|
};
|
|
418
418
|
}
|
package/dist/server/sentry.d.ts
CHANGED
|
@@ -57,7 +57,7 @@ export declare function setSentryRequestContext(ctx: {
|
|
|
57
57
|
* this just records the error for observability.
|
|
58
58
|
*/
|
|
59
59
|
export declare function captureAuthError(error: unknown, context: {
|
|
60
|
-
route: "login" | "signup" | "logout";
|
|
60
|
+
route: "login" | "signup" | "logout" | "magic-link";
|
|
61
61
|
email?: string;
|
|
62
62
|
}): string | undefined;
|
|
63
63
|
export interface RouteErrorContext {
|
|
@@ -269,7 +269,7 @@ export function createTranscribeVoiceHandler() {
|
|
|
269
269
|
if (!(await hasBuilderPrivateKey())) {
|
|
270
270
|
setResponseStatus(event, 400);
|
|
271
271
|
return {
|
|
272
|
-
error: `${label} is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.`,
|
|
272
|
+
error: `${label} is selected but Builder.io is not connected. Connect Builder.io (free tier available) in Settings, or change the provider preference.`,
|
|
273
273
|
};
|
|
274
274
|
}
|
|
275
275
|
try {
|
|
@@ -403,7 +403,7 @@ export function createTranscribeVoiceHandler() {
|
|
|
403
403
|
return {
|
|
404
404
|
error: builderError
|
|
405
405
|
? `Builder transcription failed: ${builderError}. Add GEMINI_API_KEY, GROQ_API_KEY, or OPENAI_API_KEY in Settings → API Keys to enable a fallback provider.`
|
|
406
|
-
: "No voice transcription provider configured. Connect Builder.io or add GEMINI_API_KEY / GROQ_API_KEY / OPENAI_API_KEY in Settings → API Keys.",
|
|
406
|
+
: "No voice transcription provider configured. Connect Builder.io (free tier available) or add GEMINI_API_KEY / GROQ_API_KEY / OPENAI_API_KEY in Settings → API Keys.",
|
|
407
407
|
};
|
|
408
408
|
}
|
|
409
409
|
return await callWhisperCompat({
|
|
@@ -489,7 +489,7 @@ async function cleanupTranscriptText({ event, text, instructions, contextPack, p
|
|
|
489
489
|
if (!(await hasBuilderPrivateKey())) {
|
|
490
490
|
setResponseStatus(event, 400);
|
|
491
491
|
return {
|
|
492
|
-
error: "Builder.io cleanup is selected but Builder.io is not connected. Connect Builder.io in Settings, or change the provider preference.",
|
|
492
|
+
error: "Builder.io cleanup is selected but Builder.io is not connected. Connect Builder.io (free tier available) in Settings, or change the provider preference.",
|
|
493
493
|
};
|
|
494
494
|
}
|
|
495
495
|
try {
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
export declare const FIRST_RUN_ONBOARDING_COOKIE = "agent-native-first-run";
|
|
2
2
|
export declare const FIRST_RUN_ONBOARDING_MAX_AGE: number;
|
|
3
|
+
export declare const FIRST_RUN_ONBOARDING_COMPLETED_KEY = "onboarding:first-run-completed";
|
|
3
4
|
//# sourceMappingURL=first-run-onboarding.d.ts.map
|
|
@@ -31,6 +31,26 @@ the framework monorepo checkout.
|
|
|
31
31
|
|
|
32
32
|
From a generated app directory:
|
|
33
33
|
|
|
34
|
+
```bash
|
|
35
|
+
pnpm action framework-search --pattern "defineAction"
|
|
36
|
+
pnpm action framework-search --pattern "templates/*/actions/*.ts" --mode glob --scope source
|
|
37
|
+
pnpm action framework-search --pattern "Agent(?:Panel|Sidebar)" --mode regex --scope source
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Use `framework-search` first when a question may cross the docs and source
|
|
41
|
+
boundary. It searches the version-matched framework docs, runtime-visible
|
|
42
|
+
skills, readable Core or Toolkit package source, and first-party template
|
|
43
|
+
corpus in one bounded read-only call. Use `scope: docs` or `scope: source` to
|
|
44
|
+
narrow it, then use the existing focused readers for the page or file you need.
|
|
45
|
+
|
|
46
|
+
The same tool is available in the headless `pnpm agent` loop and every built-in
|
|
47
|
+
app agent. Its default substring mode is safest for ordinary questions; use
|
|
48
|
+
`glob` for wildcard paths, `sql-like` for `%` and `_` wildcards, and `regex`
|
|
49
|
+
for precise structural matches. Results are bounded, so refine the pattern or
|
|
50
|
+
path instead of treating a truncated result as exhaustive.
|
|
51
|
+
|
|
52
|
+
From a generated app directory, the lower-level readers remain available:
|
|
53
|
+
|
|
34
54
|
```bash
|
|
35
55
|
pnpm action docs-search --query "<feature>"
|
|
36
56
|
pnpm action docs-search --slug <slug>
|
|
@@ -41,9 +61,9 @@ pnpm action source-search --path templates/chat/actions/hello.ts
|
|
|
41
61
|
pnpm action source-search --list
|
|
42
62
|
```
|
|
43
63
|
|
|
44
|
-
The headless `pnpm agent` loop and built-in app agent also expose
|
|
45
|
-
`
|
|
46
|
-
|
|
64
|
+
The headless `pnpm agent` loop and built-in app agent also expose read-only
|
|
65
|
+
`framework-search`, `docs-search`, and `source-search` tools. Use the unified
|
|
66
|
+
tool for discovery, then the focused tools for full page or file reads.
|
|
47
67
|
|
|
48
68
|
If the action runner is unavailable, search the package directly:
|
|
49
69
|
|
|
@@ -65,6 +65,22 @@ Contextual agent UI is not a reason to expose every option at once. Start with
|
|
|
65
65
|
the domain task's primary action, reveal review or configuration only when the
|
|
66
66
|
current state needs it, and let the sidebar carry conversational depth.
|
|
67
67
|
|
|
68
|
+
## Visual Direction And Workspace Variety
|
|
69
|
+
|
|
70
|
+
Shared workspace behavior should be consistent without forcing every app into
|
|
71
|
+
the same visual skin. Keep shell and component tokens semantic, then let each
|
|
72
|
+
app declare a named direction in `DESIGN.md` before styling. A new app should
|
|
73
|
+
choose its palette family and composition from the product context, compare
|
|
74
|
+
nearby apps, and avoid inheriting their accent by default. Use the
|
|
75
|
+
`frontend-design` visual-direction reference for mode, palette, type, density,
|
|
76
|
+
shape, anti-references, and the `distill` / `typeset` / `colorize` / `layout` /
|
|
77
|
+
`polish` / `audit` review vocabulary.
|
|
78
|
+
|
|
79
|
+
Do not make warm beige plus terracotta the workspace fallback. Preserve a
|
|
80
|
+
workspace-level brand when one exists; otherwise keep shared chrome neutral and
|
|
81
|
+
allow app-owned accents to distinguish products while retaining accessible
|
|
82
|
+
semantic states and the shared AgentSidebar contract.
|
|
83
|
+
|
|
68
84
|
## Discover Before Building
|
|
69
85
|
|
|
70
86
|
Before creating an app-local version of repeated workspace or agent UI:
|
|
@@ -34,6 +34,22 @@ Before coding, decide:
|
|
|
34
34
|
|
|
35
35
|
Then implement working code that is cohesive, accessible, responsive, and polished in small details: typography, spacing, copy, motion, empty states, loading states, focus states, and error states.
|
|
36
36
|
|
|
37
|
+
## Visual Direction Contract
|
|
38
|
+
|
|
39
|
+
Before styling a new app or workspace surface, define its product mode,
|
|
40
|
+
audience, visual world, palette family, type treatment, composition, shape
|
|
41
|
+
language, and anti-references in `DESIGN.md`. Read
|
|
42
|
+
`references/visual-direction.md` for the direction families and review
|
|
43
|
+
vocabulary. This is the Impeccable-inspired design contract for Agent-Native
|
|
44
|
+
apps: understand the product, name the mode, deal a few coherent directions,
|
|
45
|
+
commit to one, and audit the result instead of averaging back to a starter.
|
|
46
|
+
|
|
47
|
+
Preserve an existing brand system and component library. When no brand exists,
|
|
48
|
+
choose a deliberate direction based on the domain and compare sibling apps
|
|
49
|
+
before selecting its accent family. Shared behavior and semantic token names
|
|
50
|
+
should stay consistent; palette, density, composition, type contrast, and
|
|
51
|
+
shape language should not be identical by default.
|
|
52
|
+
|
|
37
53
|
## Minimalism And Progressive Disclosure
|
|
38
54
|
|
|
39
55
|
Default to Apple/Linear-level restraint: make the primary workflow obvious, then remove everything that does not help that workflow right now. A polished UI often has fewer visible controls, fewer borders, fewer labels, and fewer explanatory surfaces than the first reasonable implementation.
|
|
@@ -81,13 +97,13 @@ passed this requirement yet.
|
|
|
81
97
|
operational apps, make a clear sans-serif hierarchy the default; reserve a
|
|
82
98
|
serif or editorial face for a deliberate content preview or brand moment,
|
|
83
99
|
not the whole application shell.
|
|
84
|
-
- **Color and theme**: Use semantic tokens and CSS variables. Avoid one-note palettes and default purple/blue gradients unless the brand demands them.
|
|
100
|
+
- **Color and theme**: Use semantic tokens and CSS variables. Avoid one-note palettes, default warm beige/terracotta, and default purple/blue gradients unless the brand demands them. New apps should choose a product-fitting accent family rather than inherit the previous app's color.
|
|
85
101
|
- **Motion**: Prefer purposeful transitions and small state changes. Use CSS transitions/keyframes unless the app already uses a motion library. Never `transition-all` — list the properties that actually change (e.g. `transition-[opacity,transform]`). Use the shared easing tokens defined in `packages/core/src/styles/agent-native.css` instead of hand-typing curves: `var(--ease-drawer)` (260ms, drawers/app chrome), `var(--ease-collapse)` (200ms, expand/collapse), `var(--ease-out-strong)` (snappy entrances) — in Tailwind, `ease-[var(--ease-collapse)]`. Enter/exit with ease-out, never `ease-in`. Overlays that zoom in must set the Radix origin var (e.g. `origin-[--radix-popover-content-transform-origin]`). Animate `transform`/`opacity`, not width/height/padding/box-shadow. Gate looping or large-movement animations with `motion-reduce:`. Command palettes and keyboard-triggered actions get no animation.
|
|
86
102
|
- **Composition**: Match the workflow. Operational apps should be dense and scannable; marketing or portfolio pages can be more immersive.
|
|
87
103
|
- **Visual assets**: Websites, games, and object-focused pages need real or generated media when images help users understand the subject.
|
|
88
104
|
- **Responsive fit**: Text must not overflow buttons, cards, tabs, sidebars, or fixed-format tools. Use stable dimensions for boards, grids, toolbars, and counters.
|
|
89
105
|
|
|
90
|
-
**Beat convergence, not just defaults.** You sample toward the "on-distribution" center, so naming what to avoid is not enough: every "don't" needs a "do", or you converge on the next safe option
|
|
106
|
+
**Beat convergence, not just defaults.** You sample toward the "on-distribution" center, so naming what to avoid is not enough: every "don't" needs a "do", or you converge on the next safe option. Commit to one named direction, pair any reference with the reason it fits, and match implementation effort to the vision. If the brief is open, consider two or three coherent visual worlds, then commit to one instead of averaging them. When building on an existing app, inspect its tokens/type/components first and treat any drift back to a default as a missing token to pin, not something to re-prompt.
|
|
91
107
|
|
|
92
108
|
## Agent-Native UI Rules
|
|
93
109
|
|
|
@@ -164,6 +180,9 @@ as an operator would use it repeatedly:
|
|
|
164
180
|
- For review flows, stack the source/original first and the generated or safe
|
|
165
181
|
result second by default. Use side-by-side comparison only when the content
|
|
166
182
|
is short enough to scan without excessive horizontal reading.
|
|
183
|
+
- Compare the result with sibling apps. Shared toolkit behavior should feel
|
|
184
|
+
consistent, but a repeated palette, hero composition, type pairing, and
|
|
185
|
+
radius language without a product reason is visual drift, not consistency.
|
|
167
186
|
- Check the result at the target desktop width and a narrow width. If the first
|
|
168
187
|
viewport feels like documentation instead of a tool, subtract again.
|
|
169
188
|
|
|
@@ -216,6 +235,8 @@ For substantial frontend work:
|
|
|
216
235
|
5. When registering or changing a company adapter, run
|
|
217
236
|
`@agent-native/toolkit/conformance`, including mixed-overlay focus,
|
|
218
237
|
`portalContainer`, and z-index stacking checks.
|
|
238
|
+
6. For a new app or a visual redesign, review `DESIGN.md` against the rendered
|
|
239
|
+
surface and run the anti-slop audit in `references/visual-direction.md`.
|
|
219
240
|
|
|
220
241
|
## Related Skills
|
|
221
242
|
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
# Visual Direction Reference
|
|
2
|
+
|
|
3
|
+
Use this reference when a new app or workspace needs a visual point of view and
|
|
4
|
+
does not already have an established brand system. It adapts the useful parts
|
|
5
|
+
of Impeccable's workflow: understand the product, name the surface mode, deal
|
|
6
|
+
several coherent directions, commit to one, and audit the result for defaults
|
|
7
|
+
that became the design by accident.
|
|
8
|
+
|
|
9
|
+
## The direction contract
|
|
10
|
+
|
|
11
|
+
Before writing UI, capture these decisions in the app's `DESIGN.md`:
|
|
12
|
+
|
|
13
|
+
| Decision | What to record |
|
|
14
|
+
| -------------------- | ------------------------------------------------------------------- |
|
|
15
|
+
| Product mode | `operate`, `read`, `persuade`, or `experience` |
|
|
16
|
+
| Audience and cadence | Who uses it, how often, and under what conditions |
|
|
17
|
+
| Visual world | A short name and the feeling it creates |
|
|
18
|
+
| Palette family | The semantic accent family and neutral undertone |
|
|
19
|
+
| Type treatment | Sans-first, editorial contrast, or display-led emphasis |
|
|
20
|
+
| Composition | Dense console, focused workbench, document, canvas, or guided steps |
|
|
21
|
+
| Shape language | Quiet corners, crisp geometry, or soft utility surfaces |
|
|
22
|
+
| Anti-references | Defaults this app must not drift toward |
|
|
23
|
+
|
|
24
|
+
`DESIGN.md` is a portable design contract, not a license to bypass the app's
|
|
25
|
+
tokens or component system. If the app already has a brand system, document it
|
|
26
|
+
and preserve it. If it does not, choose a direction before styling.
|
|
27
|
+
|
|
28
|
+
## Palette families
|
|
29
|
+
|
|
30
|
+
Use one family as an accent and keep the rest of the system semantic and quiet.
|
|
31
|
+
These are starting points, not a fixed theme library:
|
|
32
|
+
|
|
33
|
+
| Family | Good fit | Typical character |
|
|
34
|
+
| ---------------- | ------------------------------------------- | --------------------------------- |
|
|
35
|
+
| Ink / graphite | Admin, security, sensitive review | Serious, low-noise, high contrast |
|
|
36
|
+
| Cobalt / sky | Planning, collaboration, scheduling | Clear, trustworthy, alert |
|
|
37
|
+
| Pine / teal | Automation, systems, finance, data | Calm, capable, grounded |
|
|
38
|
+
| Indigo / violet | Slides, creative tools, research | Exploratory, focused, expressive |
|
|
39
|
+
| Plum / berry | Publishing, knowledge, editorial work | Distinctive, thoughtful, human |
|
|
40
|
+
| Coral / rose | Communication, people, customer workflows | Warm, direct, social |
|
|
41
|
+
| Ochre / citron | Lightweight planning or energetic utilities | Optimistic, sparing, directional |
|
|
42
|
+
| Paper / charcoal | Long-form reading, exports, approvals | Tactile, restrained, legible |
|
|
43
|
+
|
|
44
|
+
Do not make warm beige plus terracotta the universal fallback. Do not rotate
|
|
45
|
+
through saturated colors mechanically. Choose the family that supports the
|
|
46
|
+
workflow, then verify contrast, dark mode, focus states, destructive states,
|
|
47
|
+
and the sidebar boundary.
|
|
48
|
+
|
|
49
|
+
## Variation without chaos
|
|
50
|
+
|
|
51
|
+
Vary at least two independent axes when sibling apps share a workspace:
|
|
52
|
+
|
|
53
|
+
- accent family or neutral undertone;
|
|
54
|
+
- information density and page composition;
|
|
55
|
+
- type contrast and display treatment;
|
|
56
|
+
- radius and border language;
|
|
57
|
+
- navigation emphasis and use of whitespace.
|
|
58
|
+
|
|
59
|
+
Keep shared behavior, semantic token names, accessibility, and AgentSidebar
|
|
60
|
+
placement consistent. The goal is a family of products, not five unrelated
|
|
61
|
+
themes and not five copies of the same starter.
|
|
62
|
+
|
|
63
|
+
For a batch of apps, keep a small direction ledger in the workspace
|
|
64
|
+
`DESIGN.md` or the handoff. Record each app's mode, direction, and palette
|
|
65
|
+
family, then choose a new family or a clearly different composition for the
|
|
66
|
+
next app unless an existing brand requires reuse. Never copy a sibling's
|
|
67
|
+
`global.css` palette block or treat the last app's accent as the generator
|
|
68
|
+
default.
|
|
69
|
+
|
|
70
|
+
## Review vocabulary
|
|
71
|
+
|
|
72
|
+
Make one named intervention at a time so the agent can reason about the
|
|
73
|
+
change:
|
|
74
|
+
|
|
75
|
+
- `distill` - remove copy, controls, cards, and chrome that do not serve the
|
|
76
|
+
next decision;
|
|
77
|
+
- `typeset` - repair hierarchy, measure, line length, and emphasis;
|
|
78
|
+
- `colorize` - establish a restrained semantic palette and contrast states;
|
|
79
|
+
- `layout` - repair grouping, density, alignment, and responsive composition;
|
|
80
|
+
- `polish` - resolve the small visual inconsistencies after the structure is
|
|
81
|
+
right;
|
|
82
|
+
- `audit` - check slop, accessibility, responsive behavior, and visual drift.
|
|
83
|
+
|
|
84
|
+
Do not average several directions into a generic compromise. Deal two or three
|
|
85
|
+
coherent options when the brief is open, select one, and encode the decision in
|
|
86
|
+
tokens and `DESIGN.md`.
|
|
87
|
+
|
|
88
|
+
## Anti-slop audit
|
|
89
|
+
|
|
90
|
+
Before handoff, inspect the first viewport and ask:
|
|
91
|
+
|
|
92
|
+
- Did the app inherit the neighboring app's palette or hero layout without a
|
|
93
|
+
product reason?
|
|
94
|
+
- Are there equal-weight cards, status chips, helper paragraphs, or controls
|
|
95
|
+
that should be removed or disclosed?
|
|
96
|
+
- Does the typography fit the product mode instead of decorating the shell?
|
|
97
|
+
- Is the AgentSidebar distinct but quiet, with the domain page still primary?
|
|
98
|
+
- Are focus, loading, empty, error, dark, and narrow-width states part of the
|
|
99
|
+
same design direction?
|
|
@@ -22,6 +22,9 @@ workflow needs durable UI around the conversation.
|
|
|
22
22
|
- Use a sans-first SaaS hierarchy with one restrained visual cue; reserve serif
|
|
23
23
|
type for content previews. Give the AgentSidebar a subtle surface/divider
|
|
24
24
|
boundary, and stack original/generated review vertically by default.
|
|
25
|
+
- Before visual work, read `frontend-design` and fill in `DESIGN.md`. Choose a
|
|
26
|
+
product-fitting visual direction and palette family; do not make warm beige
|
|
27
|
+
plus terracotta the default or copy a sibling app's accent automatically.
|
|
25
28
|
- Every AI-labeled button must call `sendToAgentChat()` with
|
|
26
29
|
`openSidebar: true`; label deterministic local actions as local or preview.
|
|
27
30
|
- Scale effort to the task. A small, well-specified change is a short read, the
|