@agent-native/core 0.137.7 → 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/components/recorder/pre-record-panel.tsx +65 -18
- 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/i18n/en-US.ts +4 -0
- 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/desktop/package.json +1 -0
- package/corpus/templates/clips/desktop/src/app.tsx +70 -6
- package/corpus/templates/clips/desktop/src/components/AlertDialog.tsx +131 -0
- package/corpus/templates/clips/desktop/src/styles.css +129 -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/design-generation/SKILL.md +2 -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/generate-design.ts +3 -2
- 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 +96 -14
- package/corpus/templates/design/agent-native.json +12 -0
- package/corpus/templates/design/app/components/design/DesignImportPanel.tsx +7 -2
- package/corpus/templates/design/app/components/design/FigmaHydrationDialog.tsx +11 -2
- package/corpus/templates/design/app/components/design/edit-panel/component-section.tsx +1 -1
- package/corpus/templates/design/app/components/editor/PromptDialog.tsx +8 -1
- package/corpus/templates/design/app/i18n-data.ts +53 -22
- package/corpus/templates/design/app/lib/design-file-upload.ts +2 -3
- package/corpus/templates/design/app/lib/upload-limits.ts +4 -0
- package/corpus/templates/design/app/pages/DesignSystemSetup.tsx +1 -1
- package/corpus/templates/design/changelog/2026-08-05-chat-attachments-now-warn-before-upload-when-they-exceed-the.md +6 -0
- package/corpus/templates/design/changelog/2026-08-05-figma-fig-uploads-now-show-a-clear-4-mb-limit-up-front-inste.md +6 -0
- package/corpus/templates/design/scripts/qa-figma-stress-import.ts +1 -1
- package/corpus/templates/design/server/handlers/import-design-file.ts +9 -5
- package/corpus/templates/design/server/handlers/uploads.ts +13 -9
- package/corpus/templates/design/server/lib/fig-file-limits.ts +2 -1
- package/corpus/templates/design/server/lib/figma-image-hydration.ts +1 -1
- package/corpus/templates/design/server/lib/figma-node-import.ts +1 -1
- package/corpus/templates/design/server/lib/request-body-limits.ts +11 -0
- package/corpus/templates/design/shared/canvas-frames.ts +81 -0
- 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/require-session.js +13 -4
- 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/client/use-session.d.ts +11 -0
- package/dist/client/use-session.js +34 -6
- package/dist/collab/routes.d.ts +2 -2
- 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 +6 -6
- 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/progress/routes.d.ts +1 -1
- 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/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
|
@@ -12,6 +12,12 @@ import {
|
|
|
12
12
|
firstPartyCacheKey,
|
|
13
13
|
withFirstPartyCache,
|
|
14
14
|
} from "./first-party-analytics-cache.js";
|
|
15
|
+
import {
|
|
16
|
+
classifyFirstPartyAnalyticsQuery,
|
|
17
|
+
queryOutcomeFromError,
|
|
18
|
+
recordFirstPartyAnalyticsQueryPressure,
|
|
19
|
+
} from "./first-party-analytics-health.js";
|
|
20
|
+
import { upsertFirstPartyAnalyticsRollups } from "./first-party-analytics-rollups.js";
|
|
15
21
|
|
|
16
22
|
export interface AnalyticsScope {
|
|
17
23
|
userEmail: string;
|
|
@@ -42,10 +48,19 @@ export interface AnalyticsQueryOptions {
|
|
|
42
48
|
|
|
43
49
|
const MAX_EVENTS_PER_REQUEST = 100;
|
|
44
50
|
const MAX_QUERY_ROWS = 5_000;
|
|
45
|
-
const
|
|
51
|
+
const FIRST_PARTY_QUERY_TABLE_NAMES = [
|
|
46
52
|
"analytics_events",
|
|
53
|
+
"analytics_event_daily_rollups",
|
|
54
|
+
"analytics_user_days",
|
|
47
55
|
"session_recordings",
|
|
56
|
+
] as const;
|
|
57
|
+
const FIRST_PARTY_QUERY_TABLES = new Set<string>(FIRST_PARTY_QUERY_TABLE_NAMES);
|
|
58
|
+
const FIRST_PARTY_ROLLUP_TABLES = new Set([
|
|
59
|
+
"analytics_event_daily_rollups",
|
|
60
|
+
"analytics_user_days",
|
|
48
61
|
]);
|
|
62
|
+
const FIRST_PARTY_QUERY_TABLE_PATTERN = FIRST_PARTY_QUERY_TABLE_NAMES.join("|");
|
|
63
|
+
const FIRST_PARTY_QUERY_TABLE_LIST = FIRST_PARTY_QUERY_TABLE_NAMES.join(", ");
|
|
49
64
|
const RESERVED_ALIAS_WORDS = new Set([
|
|
50
65
|
"where",
|
|
51
66
|
"on",
|
|
@@ -495,6 +510,19 @@ export async function recordAnalyticsEvents(
|
|
|
495
510
|
.update(schema.analyticsPublicKeys)
|
|
496
511
|
.set({ lastUsedAt: receivedAt })
|
|
497
512
|
.where(eq(schema.analyticsPublicKeys.id, key.id));
|
|
513
|
+
|
|
514
|
+
try {
|
|
515
|
+
await upsertFirstPartyAnalyticsRollups(rows);
|
|
516
|
+
} catch (error) {
|
|
517
|
+
// Raw events are the durable ingest record. Keep /track available when
|
|
518
|
+
// a rollup write is temporarily unavailable; the warning preserves the
|
|
519
|
+
// failure signal for operators without turning a successful raw ingest
|
|
520
|
+
// into a client retry and duplicate event batch.
|
|
521
|
+
console.warn(
|
|
522
|
+
"[first-party-analytics] Rollup update failed after raw ingest:",
|
|
523
|
+
error,
|
|
524
|
+
);
|
|
525
|
+
}
|
|
498
526
|
}
|
|
499
527
|
|
|
500
528
|
// Fork captured exceptions into the dedicated error-capture tables. This is
|
|
@@ -608,13 +636,11 @@ export function validateFirstPartyAnalyticsSql(sql: string): void {
|
|
|
608
636
|
}
|
|
609
637
|
if (cteNames.has(ref)) continue;
|
|
610
638
|
throw new Error(
|
|
611
|
-
`First-party analytics queries can only read
|
|
639
|
+
`First-party analytics queries can only read ${FIRST_PARTY_QUERY_TABLE_LIST} (found ${match[1]})`,
|
|
612
640
|
);
|
|
613
641
|
}
|
|
614
642
|
if (!usesAllowedTable) {
|
|
615
|
-
throw new Error(
|
|
616
|
-
"Query must read from analytics_events or session_recordings",
|
|
617
|
-
);
|
|
643
|
+
throw new Error(`Query must read from ${FIRST_PARTY_QUERY_TABLE_LIST}`);
|
|
618
644
|
}
|
|
619
645
|
}
|
|
620
646
|
|
|
@@ -626,6 +652,22 @@ function scopedTableSource(
|
|
|
626
652
|
sql: string;
|
|
627
653
|
args: Array<string | null>;
|
|
628
654
|
} {
|
|
655
|
+
if (FIRST_PARTY_ROLLUP_TABLES.has(tableName)) {
|
|
656
|
+
const tenantKeys = scope.orgId
|
|
657
|
+
? [`org:${scope.orgId}`, `user:${scope.userEmail}`]
|
|
658
|
+
: [`user:${scope.userEmail}`];
|
|
659
|
+
const branches = tenantKeys.map(
|
|
660
|
+
() =>
|
|
661
|
+
`SELECT * FROM ${tableName} WHERE tenant_key = ? AND event_date <= ?`,
|
|
662
|
+
);
|
|
663
|
+
return {
|
|
664
|
+
// Rollups have a tenant_key/event_date index. Keep the org and personal
|
|
665
|
+
// fallback branches separate so rollup reads stay indexable as well.
|
|
666
|
+
sql: `(${branches.join(" UNION ALL ")})`,
|
|
667
|
+
args: tenantKeys.flatMap((tenantKey) => [tenantKey, today]),
|
|
668
|
+
};
|
|
669
|
+
}
|
|
670
|
+
|
|
629
671
|
const freshness = freshnessClause(tableName);
|
|
630
672
|
if (scope.orgId) {
|
|
631
673
|
return {
|
|
@@ -655,8 +697,10 @@ export function scopedAnalyticsSql(
|
|
|
655
697
|
today = todayIsoDate(),
|
|
656
698
|
): { sql: string; args: Array<string | null> } {
|
|
657
699
|
const args: Array<string | null> = [];
|
|
658
|
-
const aliasRe =
|
|
659
|
-
|
|
700
|
+
const aliasRe = new RegExp(
|
|
701
|
+
`\\b(from|join)\\s+(${FIRST_PARTY_QUERY_TABLE_PATTERN})\\b(\\s+(?:as\\s+)?(?!where\\b|on\\b|group\\b|order\\b|limit\\b|join\\b|left\\b|right\\b|inner\\b|outer\\b|cross\\b|full\\b|having\\b|union\\b)([a-zA-Z_][a-zA-Z0-9_]*))?`,
|
|
702
|
+
"gi",
|
|
703
|
+
);
|
|
660
704
|
const rewritten = sql.replace(
|
|
661
705
|
aliasRe,
|
|
662
706
|
(full, keyword, tableName, aliasPart, alias) => {
|
|
@@ -711,18 +755,45 @@ export async function queryFirstPartyAnalytics(
|
|
|
711
755
|
// org_id/owner_email (see scopeClause) — a cache hit can only ever return
|
|
712
756
|
// rows the same tenant was already entitled to query.
|
|
713
757
|
const cacheKey = firstPartyCacheKey(wrappedSql, scoped.args);
|
|
758
|
+
const queryClass = classifyFirstPartyAnalyticsQuery(sql);
|
|
714
759
|
const compute = async (
|
|
715
760
|
queryTimeoutMs = timeoutMs,
|
|
716
761
|
): Promise<AnalyticsQueryResult> => {
|
|
717
762
|
const exec = getDbExec();
|
|
718
|
-
const
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
763
|
+
const startedAt = Date.now();
|
|
764
|
+
try {
|
|
765
|
+
const result = await exec.execute({
|
|
766
|
+
sql: wrappedSql,
|
|
767
|
+
args: scoped.args,
|
|
768
|
+
timeoutMs: queryTimeoutMs,
|
|
769
|
+
maxAttempts: 1,
|
|
770
|
+
});
|
|
771
|
+
const durationMs = Date.now() - startedAt;
|
|
772
|
+
void recordFirstPartyAnalyticsQueryPressure(scope, {
|
|
773
|
+
durationMs,
|
|
774
|
+
outcome: "success",
|
|
775
|
+
queryClass,
|
|
776
|
+
}).catch((error) => {
|
|
777
|
+
console.warn(
|
|
778
|
+
"[first-party-analytics] Query pressure recording failed:",
|
|
779
|
+
error,
|
|
780
|
+
);
|
|
781
|
+
});
|
|
782
|
+
const rows = result.rows as Record<string, unknown>[];
|
|
783
|
+
return { rows, schema: inferSchema(rows) };
|
|
784
|
+
} catch (error) {
|
|
785
|
+
void recordFirstPartyAnalyticsQueryPressure(scope, {
|
|
786
|
+
durationMs: Date.now() - startedAt,
|
|
787
|
+
outcome: queryOutcomeFromError(error),
|
|
788
|
+
queryClass,
|
|
789
|
+
}).catch((recordingError) => {
|
|
790
|
+
console.warn(
|
|
791
|
+
"[first-party-analytics] Query pressure recording failed:",
|
|
792
|
+
recordingError,
|
|
793
|
+
);
|
|
794
|
+
});
|
|
795
|
+
throw error;
|
|
796
|
+
}
|
|
726
797
|
};
|
|
727
798
|
if (!options.cache) return compute();
|
|
728
799
|
return withFirstPartyCache(cacheKey, wrappedSql, compute, { timeoutMs });
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import {
|
|
2
2
|
createProviderApiRuntime,
|
|
3
|
+
listCustomProviders,
|
|
3
4
|
listProviderApiIdsForTemplateUse,
|
|
4
5
|
type ProviderApiCredentialResolver,
|
|
5
6
|
type ProviderApiDocsOptions,
|
|
@@ -8,7 +9,10 @@ import {
|
|
|
8
9
|
type ProviderApiRequestArgs,
|
|
9
10
|
} from "@agent-native/core/provider-api";
|
|
10
11
|
|
|
11
|
-
import {
|
|
12
|
+
import {
|
|
13
|
+
requireRequestCredentialContext,
|
|
14
|
+
tryRequestCredentialContext,
|
|
15
|
+
} from "./credentials-context";
|
|
12
16
|
import { resolveAnalyticsProviderCredential } from "./provider-credentials";
|
|
13
17
|
|
|
14
18
|
export const ANALYTICS_PROVIDER_API_IDS = Array.from(
|
|
@@ -55,6 +59,21 @@ const runtime = createProviderApiRuntime({
|
|
|
55
59
|
getCredentialContext: () =>
|
|
56
60
|
requireRequestCredentialContext("provider API credential"),
|
|
57
61
|
resolveCredential: resolveAnalyticsCredential,
|
|
62
|
+
getCustomProviders: async () => {
|
|
63
|
+
const ctx = tryRequestCredentialContext();
|
|
64
|
+
if (!ctx) return [];
|
|
65
|
+
|
|
66
|
+
const orgProviders = ctx.orgId
|
|
67
|
+
? await listCustomProviders("org", ctx.orgId)
|
|
68
|
+
: [];
|
|
69
|
+
const userProviders = await listCustomProviders("user", ctx.userEmail);
|
|
70
|
+
const seen = new Set<string>();
|
|
71
|
+
return [...orgProviders, ...userProviders].filter((provider) => {
|
|
72
|
+
if (seen.has(provider.id)) return false;
|
|
73
|
+
seen.add(provider.id);
|
|
74
|
+
return true;
|
|
75
|
+
});
|
|
76
|
+
},
|
|
58
77
|
});
|
|
59
78
|
|
|
60
79
|
export function getAnalyticsProviderApiRuntime() {
|
|
@@ -13,7 +13,7 @@ import {
|
|
|
13
13
|
* of silently recording empty, unplayable sessions.
|
|
14
14
|
*/
|
|
15
15
|
export const REPLAY_STORAGE_SETUP_REQUIRED_REASON =
|
|
16
|
-
"Session replay storage is not connected yet. Connect Builder.io or configure S3-compatible storage to record replays.";
|
|
16
|
+
"Session replay storage is not connected yet. Connect Builder.io (free tier available) or configure S3-compatible storage to record replays.";
|
|
17
17
|
|
|
18
18
|
function appDatabaseUrl(): string {
|
|
19
19
|
const appName = process.env.APP_NAME?.toUpperCase().replace(/-/g, "_");
|
|
@@ -941,6 +941,7 @@ export default createAgentChatPlugin({
|
|
|
941
941
|
"For ordinary ad-hoc structured data questions, answer the explicit question after the first relevant successful query or bounded evidence batch. The words all, total, or exact do not require cross-source validation when a single structured query fully covers the requested source and filters. " +
|
|
942
942
|
"If the user challenges coverage, asks why more records were not included, or asks for the updated answer, rerun the relevant source query or revise from the corrected cohort and provide the updated deliverable directly. Do not claim a dashboard artifact was revised unless the revised answer is included in the response or saved with `update-dashboard`. " +
|
|
943
943
|
"Unstructured source records are valid analytics evidence: Pylon tickets, Jira issues, Gong calls/transcripts, Slack messages, and similar text records may be coded for themes, mention counts, sentiment, objections, and qualitative patterns as long as the answer states the inspected sample size and does not imply unsupported statistical certainty. " +
|
|
944
|
+
"SESSION REPLAY / PROMPT EVIDENCE — When a connected MCP exposes behavioral analytics or session replay, use it for qualitative product questions: start with an aggregate or bounded customer cohort, inspect a documented-limit sample of sessions, then read event transcripts and request screenshots or accessibility evidence when available. Treat explicitly typed user text as the prompt; keep generated suggestions, agent responses, and UI labels separate. Report session/user counts, sample bounds, masking or redaction, replay/screenshot availability, and source gaps. Never claim a visual was inspected unless the tool returned it. " +
|
|
944
945
|
"For schema questions, prefer data-dictionary entries and configured warehouse schemas over assumptions; use `search-bigquery-schema` for BigQuery metadata before inventing datasets, tables, or columns. " +
|
|
945
946
|
"Before finalizing any analytics answer, make the evidence trail explicit enough to audit: answer the user's question, name the source(s), time window, sample size or row count, filters, join/match method, caveats/gaps, and recommended next action when useful. Never substitute fabricated numbers for a failed query or unavailable provider. It is fine to ask a clarifying question, provide a plan, or say exactly which source is unavailable as long as you do not present metrics or source-record conclusions without evidence.\n" +
|
|
946
947
|
"</data-source-guidance>";
|
|
@@ -1307,6 +1307,66 @@ const runAnalyticsMigrations = runMigrations(
|
|
|
1307
1307
|
name: "first-party-analytics-cache-expires-idx",
|
|
1308
1308
|
sql: `CREATE INDEX IF NOT EXISTS first_party_analytics_cache_expires_at_idx ON first_party_analytics_cache (expires_at)`,
|
|
1309
1309
|
},
|
|
1310
|
+
{
|
|
1311
|
+
version: 126,
|
|
1312
|
+
name: "analytics-event-daily-rollups-table",
|
|
1313
|
+
sql: `CREATE TABLE IF NOT EXISTS analytics_event_daily_rollups (
|
|
1314
|
+
id TEXT PRIMARY KEY,
|
|
1315
|
+
tenant_key TEXT NOT NULL,
|
|
1316
|
+
owner_email TEXT NOT NULL,
|
|
1317
|
+
org_id TEXT,
|
|
1318
|
+
event_date TEXT NOT NULL,
|
|
1319
|
+
event_name TEXT NOT NULL,
|
|
1320
|
+
app TEXT NOT NULL DEFAULT '',
|
|
1321
|
+
template TEXT NOT NULL DEFAULT '',
|
|
1322
|
+
event_count INTEGER NOT NULL DEFAULT 0
|
|
1323
|
+
)`,
|
|
1324
|
+
},
|
|
1325
|
+
{
|
|
1326
|
+
version: 127,
|
|
1327
|
+
name: "analytics-event-daily-rollups-key-idx",
|
|
1328
|
+
sql: `CREATE UNIQUE INDEX IF NOT EXISTS analytics_event_daily_rollups_key_idx ON analytics_event_daily_rollups (tenant_key, event_date, event_name, app, template)`,
|
|
1329
|
+
},
|
|
1330
|
+
{
|
|
1331
|
+
version: 128,
|
|
1332
|
+
name: "analytics-user-days-table",
|
|
1333
|
+
sql: `CREATE TABLE IF NOT EXISTS analytics_user_days (
|
|
1334
|
+
id TEXT PRIMARY KEY,
|
|
1335
|
+
tenant_key TEXT NOT NULL,
|
|
1336
|
+
owner_email TEXT NOT NULL,
|
|
1337
|
+
org_id TEXT,
|
|
1338
|
+
event_date TEXT NOT NULL,
|
|
1339
|
+
user_key TEXT NOT NULL
|
|
1340
|
+
)`,
|
|
1341
|
+
},
|
|
1342
|
+
{
|
|
1343
|
+
version: 129,
|
|
1344
|
+
name: "analytics-user-days-key-idx",
|
|
1345
|
+
sql: `CREATE UNIQUE INDEX IF NOT EXISTS analytics_user_days_key_idx ON analytics_user_days (tenant_key, event_date, user_key)`,
|
|
1346
|
+
},
|
|
1347
|
+
{
|
|
1348
|
+
version: 130,
|
|
1349
|
+
name: "analytics-query-pressure-daily-table",
|
|
1350
|
+
sql: `CREATE TABLE IF NOT EXISTS analytics_query_pressure_daily (
|
|
1351
|
+
id TEXT PRIMARY KEY,
|
|
1352
|
+
tenant_key TEXT NOT NULL,
|
|
1353
|
+
owner_email TEXT NOT NULL,
|
|
1354
|
+
org_id TEXT,
|
|
1355
|
+
event_date TEXT NOT NULL,
|
|
1356
|
+
query_class TEXT NOT NULL,
|
|
1357
|
+
slow_query_count INTEGER NOT NULL DEFAULT 0,
|
|
1358
|
+
timeout_count INTEGER NOT NULL DEFAULT 0,
|
|
1359
|
+
error_count INTEGER NOT NULL DEFAULT 0,
|
|
1360
|
+
total_duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
1361
|
+
max_duration_ms INTEGER NOT NULL DEFAULT 0,
|
|
1362
|
+
last_seen_at TEXT NOT NULL
|
|
1363
|
+
)`,
|
|
1364
|
+
},
|
|
1365
|
+
{
|
|
1366
|
+
version: 131,
|
|
1367
|
+
name: "analytics-query-pressure-daily-key-idx",
|
|
1368
|
+
sql: `CREATE UNIQUE INDEX IF NOT EXISTS analytics_query_pressure_daily_key_idx ON analytics_query_pressure_daily (tenant_key, event_date, query_class)`,
|
|
1369
|
+
},
|
|
1310
1370
|
],
|
|
1311
1371
|
{ table: "analytics_migrations" },
|
|
1312
1372
|
);
|
|
@@ -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?
|
|
@@ -135,7 +135,7 @@ export async function getGeminiApiKey(): Promise<string> {
|
|
|
135
135
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
136
136
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
137
137
|
message:
|
|
138
|
-
"Asset generation is not configured. Open Settings and either click Connect Builder.io for images, or expand the Asset generation setup step and paste a Gemini API key for videos and image fallback.",
|
|
138
|
+
"Asset generation is not configured. Open Settings and either click Connect Builder.io (free tier available) for images, or expand the Asset generation setup step and paste a Gemini API key for videos and image fallback.",
|
|
139
139
|
});
|
|
140
140
|
}
|
|
141
141
|
return key;
|
|
@@ -153,7 +153,7 @@ async function getOpenAIImageApiKey(): Promise<string> {
|
|
|
153
153
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
154
154
|
byokDocsUrl: "https://platform.openai.com/api-keys",
|
|
155
155
|
message:
|
|
156
|
-
"Image generation is not configured. Open Settings and connect Builder.io, or add an OpenAI or Gemini API key manually.",
|
|
156
|
+
"Image generation is not configured. Open Settings and connect Builder.io (free tier available), or add an OpenAI or Gemini API key manually.",
|
|
157
157
|
});
|
|
158
158
|
}
|
|
159
159
|
return key;
|
|
@@ -274,7 +274,7 @@ export async function generateWithBuilderImageApi(
|
|
|
274
274
|
? "Builder private key is missing"
|
|
275
275
|
: "Builder public key is missing";
|
|
276
276
|
throw new BuilderImageGenerationError(
|
|
277
|
-
"Builder.io is not fully connected for managed image generation. Reconnect Builder.io so both Builder private and public keys are available.",
|
|
277
|
+
"Builder.io is not fully connected for managed image generation. Reconnect Builder.io (free tier available) so both Builder private and public keys are available.",
|
|
278
278
|
401,
|
|
279
279
|
detail,
|
|
280
280
|
);
|
|
@@ -698,7 +698,7 @@ function builderImageGenerationFallbackMessage(
|
|
|
698
698
|
if (input?.mode === "edit") {
|
|
699
699
|
switch (err.status) {
|
|
700
700
|
case 401:
|
|
701
|
-
return `Masked skeleton inpainting needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click Connect Builder.io; manual OpenAI or Gemini fallback cannot pass image-edit masks.`;
|
|
701
|
+
return `Masked skeleton inpainting needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click Connect Builder.io (free tier available); manual OpenAI or Gemini fallback cannot pass image-edit masks.`;
|
|
702
702
|
case 402:
|
|
703
703
|
return `Builder.io is connected, but this Builder space cannot use managed image generation credits${detail} Masked skeleton inpainting cannot use manual OpenAI or Gemini fallback because it must pass an image-edit mask.`;
|
|
704
704
|
case 403:
|
|
@@ -714,7 +714,7 @@ function builderImageGenerationFallbackMessage(
|
|
|
714
714
|
}
|
|
715
715
|
switch (err.status) {
|
|
716
716
|
case 401:
|
|
717
|
-
return `Image generation needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click Connect Builder.io, or expand the Asset generation setup step and add an OpenAI or Gemini API key as the manual fallback.`;
|
|
717
|
+
return `Image generation needs Builder.io connected or reconnected${err.detail ? ` (${err.detail})` : ""}. Open Settings and click Connect Builder.io (free tier available), or expand the Asset generation setup step and add an OpenAI or Gemini API key as the manual fallback.`;
|
|
718
718
|
case 402:
|
|
719
719
|
return `Builder.io is connected, but this Builder space cannot use managed image generation credits${detail} Open Builder space settings or reconnect to a space with image-generation credits, or add an OpenAI or Gemini API key as the manual fallback.`;
|
|
720
720
|
case 403:
|
|
@@ -957,7 +957,7 @@ async function generateWithManualImageProvider(
|
|
|
957
957
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
958
958
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
959
959
|
message:
|
|
960
|
-
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Connect Builder.io managed generation, or switch the preset to a Gemini model with a GEMINI_API_KEY.",
|
|
960
|
+
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Connect Builder.io managed generation (free tier available), or switch the preset to a Gemini model with a GEMINI_API_KEY.",
|
|
961
961
|
});
|
|
962
962
|
}
|
|
963
963
|
if (await isGeminiImageGenerationConfigured()) {
|
|
@@ -969,7 +969,7 @@ async function generateWithManualImageProvider(
|
|
|
969
969
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
970
970
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
971
971
|
message:
|
|
972
|
-
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Connect Builder.io managed generation, or switch the preset to a Gemini model with a GEMINI_API_KEY.",
|
|
972
|
+
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Connect Builder.io managed generation (free tier available), or switch the preset to a Gemini model with a GEMINI_API_KEY.",
|
|
973
973
|
});
|
|
974
974
|
}
|
|
975
975
|
if (input.intent === "restyle" || input.intent === "edit") {
|
|
@@ -993,7 +993,7 @@ export async function generateWithOpenAI(
|
|
|
993
993
|
builderConnectUrl: "/_agent-native/builder/connect",
|
|
994
994
|
byokDocsUrl: "https://aistudio.google.com/apikey",
|
|
995
995
|
message:
|
|
996
|
-
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Connect Builder.io managed generation, or switch the preset to a Gemini model with a GEMINI_API_KEY.",
|
|
996
|
+
"This preset attaches reference board images, which the manual OpenAI fallback cannot pass. Connect Builder.io managed generation (free tier available), or switch the preset to a Gemini model with a GEMINI_API_KEY.",
|
|
997
997
|
});
|
|
998
998
|
}
|
|
999
999
|
const startedAt = Date.now();
|
|
@@ -131,7 +131,7 @@ export async function putObject(input: {
|
|
|
131
131
|
// Local fs fallback for dev (no provider configured).
|
|
132
132
|
if (process.env.NODE_ENV === "production") {
|
|
133
133
|
throw new Error(
|
|
134
|
-
"Asset storage is not configured. Connect Builder.io in onboarding, set BUILDER_PRIVATE_KEY, or fill in the ASSETS_STORAGE_* secrets.",
|
|
134
|
+
"Asset storage is not configured. Connect Builder.io (free tier available) in onboarding, set BUILDER_PRIVATE_KEY, or fill in the ASSETS_STORAGE_* secrets.",
|
|
135
135
|
);
|
|
136
136
|
}
|
|
137
137
|
const localPath = path.join(LOCAL_ROOT, input.key);
|
|
@@ -43,7 +43,7 @@ export default async (nitroApp: any): Promise<void> => {
|
|
|
43
43
|
required: true,
|
|
44
44
|
title: "Image and video generation",
|
|
45
45
|
description:
|
|
46
|
-
"Connect Builder for managed image generation, or add OpenAI/Gemini keys manually. Gemini is required for video generation.",
|
|
46
|
+
"Connect Builder (free tier available) for managed image generation, or add OpenAI/Gemini keys manually. Gemini is required for video generation.",
|
|
47
47
|
methods: [
|
|
48
48
|
{
|
|
49
49
|
id: "builder",
|