@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
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core script: framework-search
|
|
3
|
+
*
|
|
4
|
+
* Search the version-matched framework docs and readable source together.
|
|
5
|
+
* This is intentionally bounded and read-only so every app chat can use the
|
|
6
|
+
* same fallback when a question is not answered by the docs alone.
|
|
7
|
+
*/
|
|
8
|
+
import fs from "node:fs";
|
|
9
|
+
import { createTextMatcher, } from "../../search-utils/index.js";
|
|
10
|
+
import { parseArgs } from "../utils.js";
|
|
11
|
+
import { loadAllDocs } from "./search.js";
|
|
12
|
+
import { listSourceFiles } from "./source-search.js";
|
|
13
|
+
const DEFAULT_LIMIT = 30;
|
|
14
|
+
const MAX_LIMIT = 50;
|
|
15
|
+
const MAX_SNIPPETS_PER_RESULT = 3;
|
|
16
|
+
function parseScope(value) {
|
|
17
|
+
if (!value)
|
|
18
|
+
return { value: "all" };
|
|
19
|
+
if (value === "all" || value === "docs" || value === "source") {
|
|
20
|
+
return { value };
|
|
21
|
+
}
|
|
22
|
+
return { error: `Invalid scope "${value}". Use all, docs, or source.` };
|
|
23
|
+
}
|
|
24
|
+
function parseMode(value) {
|
|
25
|
+
if (!value)
|
|
26
|
+
return { value: "substring" };
|
|
27
|
+
if (value === "substring" ||
|
|
28
|
+
value === "glob" ||
|
|
29
|
+
value === "sql-like" ||
|
|
30
|
+
value === "regex") {
|
|
31
|
+
return { value };
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
error: `Invalid mode "${value}". Use substring, glob, sql-like, or regex.`,
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
function parseLimit(value) {
|
|
38
|
+
if (!value)
|
|
39
|
+
return { value: DEFAULT_LIMIT };
|
|
40
|
+
const parsed = Number(value);
|
|
41
|
+
if (!Number.isInteger(parsed) || parsed < 1) {
|
|
42
|
+
return { error: "Limit must be a positive integer." };
|
|
43
|
+
}
|
|
44
|
+
return { value: Math.min(parsed, MAX_LIMIT) };
|
|
45
|
+
}
|
|
46
|
+
function docsAsEntries(docs) {
|
|
47
|
+
return docs.map((doc) => ({
|
|
48
|
+
kind: "doc",
|
|
49
|
+
path: `docs/${doc.slug}`,
|
|
50
|
+
title: doc.title,
|
|
51
|
+
body: `${doc.title}\n${doc.description}\n${doc.body}`,
|
|
52
|
+
}));
|
|
53
|
+
}
|
|
54
|
+
function sourceAsEntries(files) {
|
|
55
|
+
const entries = [];
|
|
56
|
+
let unreadable = 0;
|
|
57
|
+
for (const file of files) {
|
|
58
|
+
try {
|
|
59
|
+
entries.push({
|
|
60
|
+
kind: "source",
|
|
61
|
+
path: file.relativePath,
|
|
62
|
+
body: fs.readFileSync(file.absolutePath, "utf-8"),
|
|
63
|
+
file,
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
catch {
|
|
67
|
+
unreadable += 1;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return { entries, unreadable };
|
|
71
|
+
}
|
|
72
|
+
function snippetsForEntry(entry, matcher, pathMatch) {
|
|
73
|
+
const snippets = [];
|
|
74
|
+
const lines = entry.body.split(/\r?\n/);
|
|
75
|
+
for (let index = 0; index < lines.length; index += 1) {
|
|
76
|
+
if (!matcher.matches(lines[index]))
|
|
77
|
+
continue;
|
|
78
|
+
const line = lines[index].trim();
|
|
79
|
+
if (!line)
|
|
80
|
+
continue;
|
|
81
|
+
snippets.push(`${index + 1}: ${line.slice(0, 260)}`);
|
|
82
|
+
if (snippets.length >= MAX_SNIPPETS_PER_RESULT)
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
if (snippets.length === 0 && pathMatch) {
|
|
86
|
+
const firstLine = lines.find((line) => line.trim());
|
|
87
|
+
if (firstLine)
|
|
88
|
+
snippets.push(`1: ${firstLine.trim().slice(0, 260)}`);
|
|
89
|
+
}
|
|
90
|
+
return snippets;
|
|
91
|
+
}
|
|
92
|
+
function pathMatches(path, filter) {
|
|
93
|
+
if (!filter)
|
|
94
|
+
return { matches: true };
|
|
95
|
+
const matcher = createTextMatcher(filter, "glob");
|
|
96
|
+
return { matches: matcher.matches(path), error: matcher.error };
|
|
97
|
+
}
|
|
98
|
+
async function searchFramework(options) {
|
|
99
|
+
const [docs, sourceResult] = await Promise.all([
|
|
100
|
+
options.scope === "source" ? Promise.resolve([]) : loadAllDocs(),
|
|
101
|
+
options.scope === "docs"
|
|
102
|
+
? Promise.resolve({ entries: [], unreadable: 0 })
|
|
103
|
+
: Promise.resolve(sourceAsEntries(listSourceFiles())),
|
|
104
|
+
]);
|
|
105
|
+
const entries = [
|
|
106
|
+
...(options.scope === "source" ? [] : docsAsEntries(docs)),
|
|
107
|
+
...(options.scope === "docs" ? [] : sourceResult.entries),
|
|
108
|
+
];
|
|
109
|
+
const matcher = createTextMatcher(options.pattern, options.mode);
|
|
110
|
+
if (matcher.error) {
|
|
111
|
+
return { hits: [], total: 0, unreadable: 0 };
|
|
112
|
+
}
|
|
113
|
+
const hits = [];
|
|
114
|
+
for (const entry of entries) {
|
|
115
|
+
const pathResult = pathMatches(entry.path, options.pathFilter);
|
|
116
|
+
if (pathResult.error)
|
|
117
|
+
continue;
|
|
118
|
+
if (!pathResult.matches)
|
|
119
|
+
continue;
|
|
120
|
+
const pathMatch = matcher.matches(entry.path);
|
|
121
|
+
const contentMatch = matcher.matches(entry.body);
|
|
122
|
+
if (!pathMatch && !contentMatch)
|
|
123
|
+
continue;
|
|
124
|
+
const snippets = snippetsForEntry(entry, matcher, pathMatch);
|
|
125
|
+
hits.push({ entry, pathMatch, snippets });
|
|
126
|
+
}
|
|
127
|
+
// Keep the result deterministic and favor docs titles and exact path hits.
|
|
128
|
+
hits.sort((a, b) => {
|
|
129
|
+
const aScore = (a.pathMatch ? 2 : 0) + (a.entry.kind === "doc" ? 1 : 0);
|
|
130
|
+
const bScore = (b.pathMatch ? 2 : 0) + (b.entry.kind === "doc" ? 1 : 0);
|
|
131
|
+
return bScore - aScore || a.entry.path.localeCompare(b.entry.path);
|
|
132
|
+
});
|
|
133
|
+
return {
|
|
134
|
+
hits: hits.slice(0, options.limit),
|
|
135
|
+
total: hits.length,
|
|
136
|
+
unreadable: sourceResult.unreadable,
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
function printHelp() {
|
|
140
|
+
console.log(`Usage: pnpm action framework-search [options]
|
|
141
|
+
|
|
142
|
+
Options:
|
|
143
|
+
--pattern <text> Text, wildcard, SQL-like, or regex pattern to search
|
|
144
|
+
--query <text> Alias for --pattern
|
|
145
|
+
--scope <scope> all, docs, or source (default: all)
|
|
146
|
+
--mode <mode> substring, glob, sql-like, or regex (default: substring)
|
|
147
|
+
--path <glob> Optional glob to limit matching paths
|
|
148
|
+
--limit <number> Maximum files to return (default: ${DEFAULT_LIMIT}, max: ${MAX_LIMIT})
|
|
149
|
+
--list List the searchable docs and source roots
|
|
150
|
+
--help Show this help message`);
|
|
151
|
+
}
|
|
152
|
+
export default async function frameworkSearchScript(args) {
|
|
153
|
+
const parsed = parseArgs(args);
|
|
154
|
+
if (parsed.help === "true") {
|
|
155
|
+
printHelp();
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
const scopeResult = parseScope(parsed.scope);
|
|
159
|
+
if (scopeResult.error) {
|
|
160
|
+
console.log(scopeResult.error);
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const scope = scopeResult.value;
|
|
164
|
+
const modeResult = parseMode(parsed.mode);
|
|
165
|
+
if (modeResult.error) {
|
|
166
|
+
console.log(modeResult.error);
|
|
167
|
+
return;
|
|
168
|
+
}
|
|
169
|
+
const mode = modeResult.value;
|
|
170
|
+
const limitResult = parseLimit(parsed.limit);
|
|
171
|
+
if (limitResult.error) {
|
|
172
|
+
console.log(limitResult.error);
|
|
173
|
+
return;
|
|
174
|
+
}
|
|
175
|
+
const limit = limitResult.value;
|
|
176
|
+
if (parsed.list === "true") {
|
|
177
|
+
const [docs, sourceFiles] = await Promise.all([
|
|
178
|
+
scope === "source" ? Promise.resolve([]) : loadAllDocs(),
|
|
179
|
+
scope === "docs"
|
|
180
|
+
? Promise.resolve([])
|
|
181
|
+
: Promise.resolve(listSourceFiles()),
|
|
182
|
+
]);
|
|
183
|
+
console.log(JSON.stringify({
|
|
184
|
+
docs: docs.map((doc) => ({ slug: doc.slug, title: doc.title })),
|
|
185
|
+
source: {
|
|
186
|
+
files: sourceFiles.length,
|
|
187
|
+
roots: Array.from(new Set(sourceFiles.map((file) => file.relativePath.split("/")[0]))),
|
|
188
|
+
},
|
|
189
|
+
}, null, 2));
|
|
190
|
+
return;
|
|
191
|
+
}
|
|
192
|
+
const pattern = parsed.pattern ?? parsed.query;
|
|
193
|
+
if (!pattern) {
|
|
194
|
+
printHelp();
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const matcher = createTextMatcher(pattern, mode);
|
|
198
|
+
if (matcher.error) {
|
|
199
|
+
console.log(matcher.error);
|
|
200
|
+
return;
|
|
201
|
+
}
|
|
202
|
+
if (parsed.path) {
|
|
203
|
+
const pathMatcher = createTextMatcher(parsed.path, "glob");
|
|
204
|
+
if (pathMatcher.error) {
|
|
205
|
+
console.log(pathMatcher.error);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
const result = await searchFramework({
|
|
210
|
+
pattern,
|
|
211
|
+
mode,
|
|
212
|
+
scope,
|
|
213
|
+
pathFilter: parsed.path,
|
|
214
|
+
limit,
|
|
215
|
+
});
|
|
216
|
+
if (result.total === 0) {
|
|
217
|
+
console.log(`No matches in the indexed ${scope} corpus for ${JSON.stringify(pattern)}.`);
|
|
218
|
+
console.log("The search covers version-matched framework docs, runtime-visible skills, and readable Core, Toolkit, and first-party template source. A miss is not proof that an implementation is absent if the relevant package source is not published in this app.");
|
|
219
|
+
if (result.unreadable > 0) {
|
|
220
|
+
console.log(`Skipped ${result.unreadable} unreadable source file(s).`);
|
|
221
|
+
}
|
|
222
|
+
return;
|
|
223
|
+
}
|
|
224
|
+
console.log(`Found ${result.total} matching file(s) in ${scope} using ${mode} mode for ${JSON.stringify(pattern)}:\n`);
|
|
225
|
+
for (const hit of result.hits) {
|
|
226
|
+
const label = hit.entry.kind === "doc" ? "doc" : "source";
|
|
227
|
+
console.log(`[${label}] ${hit.entry.path}${hit.entry.title ? ` - ${hit.entry.title}` : ""}`);
|
|
228
|
+
for (const snippet of hit.snippets)
|
|
229
|
+
console.log(` ${snippet}`);
|
|
230
|
+
console.log("");
|
|
231
|
+
}
|
|
232
|
+
if (result.total > result.hits.length) {
|
|
233
|
+
console.log(`Showing ${result.hits.length} of ${result.total} matching files. Refine --path, --pattern, or --limit for more targeted evidence.`);
|
|
234
|
+
}
|
|
235
|
+
if (result.unreadable > 0) {
|
|
236
|
+
console.log(`Skipped ${result.unreadable} unreadable source file(s).`);
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=framework-search.js.map
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
export const coreDocsScripts = {
|
|
2
|
+
"framework-search": (args) => import("./framework-search.js").then((m) => m.default(args)),
|
|
2
3
|
"docs-search": (args) => import("./search.js").then((m) => m.default(args)),
|
|
3
4
|
"source-search": (args) => import("./source-search.js").then((m) => m.default(args)),
|
|
4
5
|
};
|
|
@@ -9,5 +9,15 @@
|
|
|
9
9
|
* pnpm action docs-search --slug authentication
|
|
10
10
|
* pnpm action docs-search --list
|
|
11
11
|
*/
|
|
12
|
+
interface DocMeta {
|
|
13
|
+
slug: string;
|
|
14
|
+
title: string;
|
|
15
|
+
description: string;
|
|
16
|
+
}
|
|
17
|
+
export interface DocFull extends DocMeta {
|
|
18
|
+
body: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function loadAllDocs(): Promise<DocFull[]>;
|
|
12
21
|
export default function docsSearchScript(args: string[]): Promise<void>;
|
|
22
|
+
export {};
|
|
13
23
|
//# sourceMappingURL=search.d.ts.map
|
|
@@ -164,7 +164,7 @@ async function loadAgentBundleDocs() {
|
|
|
164
164
|
return [];
|
|
165
165
|
}
|
|
166
166
|
}
|
|
167
|
-
async function loadAllDocs() {
|
|
167
|
+
export async function loadAllDocs() {
|
|
168
168
|
return [...loadFilesystemDocs(), ...(await loadAgentBundleDocs())];
|
|
169
169
|
}
|
|
170
170
|
async function searchDocs(query) {
|
|
@@ -1,15 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core script: source-search
|
|
3
3
|
*
|
|
4
|
-
* Search and read
|
|
5
|
-
*
|
|
4
|
+
* Search and read version-matched framework source.
|
|
5
|
+
* First-party templates are generated into @agent-native/core/corpus during
|
|
6
|
+
* package build; Core and Toolkit source are read from their installed roots.
|
|
6
7
|
*
|
|
7
8
|
* Usage:
|
|
8
9
|
* pnpm action source-search --query "defineAction"
|
|
9
10
|
* pnpm action source-search --path templates/chat/actions/hello.ts
|
|
11
|
+
* pnpm action source-search --path core/src/action.ts
|
|
10
12
|
* pnpm action source-search --path templates/plan/AGENTS.md
|
|
11
13
|
* pnpm action source-search --list
|
|
12
14
|
*/
|
|
15
|
+
export interface SourceFile {
|
|
16
|
+
relativePath: string;
|
|
17
|
+
absolutePath: string;
|
|
18
|
+
visibilityRoot?: string;
|
|
19
|
+
}
|
|
13
20
|
/**
|
|
14
21
|
* The corpus is a sibling of the package root, so a bundled serverless deploy
|
|
15
22
|
* never carries it. Callers register this tool conditionally: advertising a
|
|
@@ -17,5 +24,6 @@
|
|
|
17
24
|
* and reads to it like the code genuinely does not exist.
|
|
18
25
|
*/
|
|
19
26
|
export declare function hasSourceCorpus(): boolean;
|
|
27
|
+
export declare function listSourceFiles(): SourceFile[];
|
|
20
28
|
export default function sourceSearchScript(args: string[]): Promise<void>;
|
|
21
29
|
//# sourceMappingURL=source-search.d.ts.map
|
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Core script: source-search
|
|
3
3
|
*
|
|
4
|
-
* Search and read
|
|
5
|
-
*
|
|
4
|
+
* Search and read version-matched framework source.
|
|
5
|
+
* First-party templates are generated into @agent-native/core/corpus during
|
|
6
|
+
* package build; Core and Toolkit source are read from their installed roots.
|
|
6
7
|
*
|
|
7
8
|
* Usage:
|
|
8
9
|
* pnpm action source-search --query "defineAction"
|
|
9
10
|
* pnpm action source-search --path templates/chat/actions/hello.ts
|
|
11
|
+
* pnpm action source-search --path core/src/action.ts
|
|
10
12
|
* pnpm action source-search --path templates/plan/AGENTS.md
|
|
11
13
|
* pnpm action source-search --list
|
|
12
14
|
*/
|
|
@@ -57,6 +59,40 @@ function getCorpusRoot() {
|
|
|
57
59
|
// dist/scripts/docs/source-search.js -> corpus/
|
|
58
60
|
return path.resolve(path.dirname(fileURLToPath(import.meta.url)), "../../../corpus");
|
|
59
61
|
}
|
|
62
|
+
function getPackageRoot() {
|
|
63
|
+
return path.dirname(getCorpusRoot());
|
|
64
|
+
}
|
|
65
|
+
function getToolkitSourceRoot() {
|
|
66
|
+
const candidates = [
|
|
67
|
+
path.resolve(getPackageRoot(), "../toolkit/src"),
|
|
68
|
+
path.resolve(process.cwd(), "node_modules/@agent-native/toolkit/src"),
|
|
69
|
+
];
|
|
70
|
+
return candidates.find((candidate) => fs.existsSync(candidate)) ?? null;
|
|
71
|
+
}
|
|
72
|
+
function getSourceRoots() {
|
|
73
|
+
const corpusRoot = getCorpusRoot();
|
|
74
|
+
const roots = [
|
|
75
|
+
{
|
|
76
|
+
prefix: "templates",
|
|
77
|
+
directory: path.join(corpusRoot, "templates"),
|
|
78
|
+
visibilityRoot: corpusRoot,
|
|
79
|
+
},
|
|
80
|
+
];
|
|
81
|
+
// A monorepo checkout has the authored Core source. Published packages do
|
|
82
|
+
// not carry the whole source tree, so use their readable dist output.
|
|
83
|
+
const coreSourceRoot = path.join(getPackageRoot(), "src");
|
|
84
|
+
roots.push(fs.existsSync(path.join(coreSourceRoot, "server"))
|
|
85
|
+
? { prefix: "core/src", directory: coreSourceRoot }
|
|
86
|
+
: { prefix: "core/dist", directory: path.join(getPackageRoot(), "dist") });
|
|
87
|
+
const toolkitSourceRoot = getToolkitSourceRoot();
|
|
88
|
+
if (toolkitSourceRoot) {
|
|
89
|
+
roots.push({
|
|
90
|
+
prefix: "toolkit/src",
|
|
91
|
+
directory: toolkitSourceRoot,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
return roots;
|
|
95
|
+
}
|
|
60
96
|
/**
|
|
61
97
|
* The corpus is a sibling of the package root, so a bundled serverless deploy
|
|
62
98
|
* never carries it. Callers register this tool conditionally: advertising a
|
|
@@ -125,29 +161,52 @@ function isRuntimeVisibleCorpusPath(corpusRoot, absolutePath) {
|
|
|
125
161
|
return true;
|
|
126
162
|
}
|
|
127
163
|
}
|
|
128
|
-
function listFiles(dir, base = dir,
|
|
164
|
+
function listFiles(dir, base = dir, visibilityRoot) {
|
|
129
165
|
if (!fs.existsSync(dir))
|
|
130
166
|
return [];
|
|
131
167
|
const files = [];
|
|
132
|
-
|
|
168
|
+
let entries;
|
|
169
|
+
try {
|
|
170
|
+
entries = fs.readdirSync(dir, { withFileTypes: true });
|
|
171
|
+
}
|
|
172
|
+
catch {
|
|
173
|
+
return files;
|
|
174
|
+
}
|
|
175
|
+
for (const entry of entries) {
|
|
133
176
|
const abs = path.join(dir, entry.name);
|
|
134
|
-
if (!isRuntimeVisibleCorpusPath(
|
|
177
|
+
if (visibilityRoot && !isRuntimeVisibleCorpusPath(visibilityRoot, abs)) {
|
|
135
178
|
continue;
|
|
179
|
+
}
|
|
136
180
|
if (entry.isDirectory()) {
|
|
137
|
-
files.push(...listFiles(abs, base,
|
|
181
|
+
files.push(...listFiles(abs, base, visibilityRoot));
|
|
138
182
|
}
|
|
139
183
|
else if (entry.isFile() && isProbablyTextFile(abs)) {
|
|
140
|
-
|
|
184
|
+
let stat;
|
|
185
|
+
try {
|
|
186
|
+
stat = fs.statSync(abs);
|
|
187
|
+
}
|
|
188
|
+
catch {
|
|
189
|
+
continue;
|
|
190
|
+
}
|
|
141
191
|
if (stat.size <= MAX_FILE_BYTES) {
|
|
142
192
|
files.push({
|
|
143
193
|
absolutePath: abs,
|
|
144
194
|
relativePath: path.relative(base, abs).split(path.sep).join("/"),
|
|
195
|
+
visibilityRoot,
|
|
145
196
|
});
|
|
146
197
|
}
|
|
147
198
|
}
|
|
148
199
|
}
|
|
149
200
|
return files.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
150
201
|
}
|
|
202
|
+
export function listSourceFiles() {
|
|
203
|
+
return getSourceRoots()
|
|
204
|
+
.flatMap((root) => listFiles(root.directory, root.directory, root.visibilityRoot).map((file) => ({
|
|
205
|
+
...file,
|
|
206
|
+
relativePath: `${root.prefix}/${file.relativePath}`,
|
|
207
|
+
})))
|
|
208
|
+
.sort((a, b) => a.relativePath.localeCompare(b.relativePath));
|
|
209
|
+
}
|
|
151
210
|
function lineSnippet(line, terms) {
|
|
152
211
|
const trimmed = line.trim();
|
|
153
212
|
if (trimmed.length <= 220)
|
|
@@ -162,7 +221,6 @@ function lineSnippet(line, terms) {
|
|
|
162
221
|
return `${start > 0 ? "..." : ""}${trimmed.slice(start, end)}${end < trimmed.length ? "..." : ""}`;
|
|
163
222
|
}
|
|
164
223
|
function searchCorpus(query) {
|
|
165
|
-
const corpusRoot = getCorpusRoot();
|
|
166
224
|
const terms = query
|
|
167
225
|
.toLowerCase()
|
|
168
226
|
.split(/\s+/)
|
|
@@ -171,7 +229,9 @@ function searchCorpus(query) {
|
|
|
171
229
|
if (terms.length === 0)
|
|
172
230
|
return [];
|
|
173
231
|
const results = [];
|
|
174
|
-
for (const file of
|
|
232
|
+
for (const file of listSourceFiles()) {
|
|
233
|
+
if (/\.(?:spec|test)\.[cm]?[jt]sx?$/.test(file.relativePath))
|
|
234
|
+
continue;
|
|
175
235
|
let raw = "";
|
|
176
236
|
try {
|
|
177
237
|
raw = fs.readFileSync(file.absolutePath, "utf-8");
|
|
@@ -204,26 +264,37 @@ function searchCorpus(query) {
|
|
|
204
264
|
}
|
|
205
265
|
return results.sort((a, b) => b.score - a.score || a.file.localeCompare(b.file));
|
|
206
266
|
}
|
|
207
|
-
function
|
|
267
|
+
function readSourcePath(relative) {
|
|
208
268
|
if (!isValidPath(relative)) {
|
|
209
|
-
return `Invalid
|
|
269
|
+
return `Invalid source path: ${relative}`;
|
|
210
270
|
}
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
271
|
+
const sourceRoot = getSourceRoots().find((root) => relative === root.prefix || relative.startsWith(`${root.prefix}/`));
|
|
272
|
+
if (!sourceRoot)
|
|
273
|
+
return `Source path not found: ${relative}`;
|
|
274
|
+
const rootRelativePath = relative
|
|
275
|
+
.slice(sourceRoot.prefix.length)
|
|
276
|
+
.replace(/^\//, "");
|
|
277
|
+
const target = path.resolve(sourceRoot.directory, rootRelativePath);
|
|
278
|
+
if (!target.startsWith(sourceRoot.directory + path.sep) &&
|
|
279
|
+
target !== sourceRoot.directory) {
|
|
280
|
+
return `Invalid source path: ${relative}`;
|
|
215
281
|
}
|
|
216
282
|
if (!fs.existsSync(target)) {
|
|
217
|
-
return `
|
|
283
|
+
return `Source path not found: ${relative}`;
|
|
218
284
|
}
|
|
219
|
-
if (
|
|
220
|
-
|
|
285
|
+
if (sourceRoot.visibilityRoot &&
|
|
286
|
+
!isRuntimeVisibleCorpusPath(sourceRoot.visibilityRoot, target)) {
|
|
287
|
+
return `Source path is not available to runtime source-search: ${relative}`;
|
|
221
288
|
}
|
|
222
289
|
const stat = fs.statSync(target);
|
|
223
290
|
if (stat.isDirectory()) {
|
|
224
291
|
const entries = fs
|
|
225
292
|
.readdirSync(target, { withFileTypes: true })
|
|
226
|
-
.filter((entry) =>
|
|
293
|
+
.filter((entry) => {
|
|
294
|
+
if (!sourceRoot.visibilityRoot)
|
|
295
|
+
return true;
|
|
296
|
+
return isRuntimeVisibleCorpusPath(sourceRoot.visibilityRoot, path.join(target, entry.name));
|
|
297
|
+
})
|
|
227
298
|
.map((entry) => `${entry.isDirectory() ? "dir " : "file"} ${entry.name}`)
|
|
228
299
|
.sort();
|
|
229
300
|
const shown = entries.slice(0, 200);
|
|
@@ -239,33 +310,30 @@ function readCorpusPath(relative) {
|
|
|
239
310
|
.join("\n");
|
|
240
311
|
}
|
|
241
312
|
if (!stat.isFile())
|
|
242
|
-
return `Unsupported
|
|
313
|
+
return `Unsupported source path: ${relative}`;
|
|
243
314
|
if (!isProbablyTextFile(target))
|
|
244
|
-
return `Not a text
|
|
315
|
+
return `Not a text source file: ${relative}`;
|
|
245
316
|
if (stat.size > MAX_FILE_BYTES) {
|
|
246
|
-
return `
|
|
317
|
+
return `Source file is too large to read through source-search: ${relative}`;
|
|
247
318
|
}
|
|
248
319
|
const raw = fs.readFileSync(target, "utf-8");
|
|
249
320
|
if (raw.length <= MAX_READ_CHARS)
|
|
250
321
|
return raw;
|
|
251
322
|
return `${raw.slice(0, MAX_READ_CHARS)}\n\n... truncated at ${MAX_READ_CHARS} characters. Use a narrower path or direct rg for more context.`;
|
|
252
323
|
}
|
|
253
|
-
function
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
const sectionRoot = path.join(corpusRoot, section);
|
|
258
|
-
const files = listFiles(sectionRoot);
|
|
259
|
-
const children = fs.existsSync(sectionRoot)
|
|
324
|
+
function listSourceRoots() {
|
|
325
|
+
return getSourceRoots().map((root) => {
|
|
326
|
+
const files = listFiles(root.directory, root.directory, root.visibilityRoot);
|
|
327
|
+
const children = fs.existsSync(root.directory)
|
|
260
328
|
? fs
|
|
261
|
-
.readdirSync(
|
|
329
|
+
.readdirSync(root.directory, { withFileTypes: true })
|
|
262
330
|
.filter((entry) => entry.isDirectory())
|
|
263
331
|
.map((entry) => entry.name)
|
|
264
332
|
.sort()
|
|
265
333
|
: [];
|
|
266
334
|
return {
|
|
267
|
-
section,
|
|
268
|
-
path:
|
|
335
|
+
section: root.prefix,
|
|
336
|
+
path: root.prefix,
|
|
269
337
|
files: files.length,
|
|
270
338
|
directories: children,
|
|
271
339
|
};
|
|
@@ -273,27 +341,26 @@ function listCorpus() {
|
|
|
273
341
|
}
|
|
274
342
|
export default async function sourceSearchScript(args) {
|
|
275
343
|
const parsed = parseArgs(args);
|
|
276
|
-
const corpusRoot = getCorpusRoot();
|
|
277
344
|
if (parsed.help === "true") {
|
|
278
345
|
console.log(`Usage: pnpm action source-search [options]
|
|
279
346
|
|
|
280
347
|
Options:
|
|
281
|
-
--query <text> Search source
|
|
282
|
-
--path <path> Read a
|
|
283
|
-
--list List
|
|
348
|
+
--query <text> Search readable framework source by keyword
|
|
349
|
+
--path <path> Read a source file or list a source directory
|
|
350
|
+
--list List source roots
|
|
284
351
|
--help Show this help message`);
|
|
285
352
|
return;
|
|
286
353
|
}
|
|
287
|
-
if (!
|
|
288
|
-
console.log(
|
|
354
|
+
if (!hasSourceCorpus()) {
|
|
355
|
+
console.log("Version-matched source is not available. Build or reinstall @agent-native/core so its source corpus and readable package sources are present.");
|
|
289
356
|
return;
|
|
290
357
|
}
|
|
291
358
|
if (parsed.list === "true") {
|
|
292
|
-
console.log(JSON.stringify(
|
|
359
|
+
console.log(JSON.stringify(listSourceRoots(), null, 2));
|
|
293
360
|
return;
|
|
294
361
|
}
|
|
295
362
|
if (parsed.path) {
|
|
296
|
-
console.log(
|
|
363
|
+
console.log(readSourcePath(parsed.path));
|
|
297
364
|
return;
|
|
298
365
|
}
|
|
299
366
|
if (parsed.query) {
|
|
@@ -310,7 +377,7 @@ Options:
|
|
|
310
377
|
}
|
|
311
378
|
console.log("");
|
|
312
379
|
}
|
|
313
|
-
console.log("Use --path <file> to read a specific
|
|
380
|
+
console.log("Use --path <file> to read a specific source file.");
|
|
314
381
|
return;
|
|
315
382
|
}
|
|
316
383
|
console.log("Provide --query, --path, or --list. Use --help for details.");
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
export type SearchMatchMode = "allTerms" | "anyTerm" | "phrase" | "regex";
|
|
2
|
+
export type TextSearchMode = "substring" | "glob" | "sql-like" | "regex";
|
|
3
|
+
export interface TextMatcher {
|
|
4
|
+
matches(value: string): boolean;
|
|
5
|
+
error?: string;
|
|
6
|
+
}
|
|
2
7
|
export declare function escapeLikeTerm(value: string): string;
|
|
3
8
|
export declare function normalizeSearchTerms(query: string): string[];
|
|
4
9
|
export declare function matchesSearchMode(value: string, query: string, mode: SearchMatchMode): boolean;
|
|
10
|
+
/**
|
|
11
|
+
* Build a bounded, case-insensitive matcher for agent-facing text search.
|
|
12
|
+
* Regexes are deliberately constrained because these matchers may scan a
|
|
13
|
+
* packaged source corpus during a single agent turn.
|
|
14
|
+
*/
|
|
15
|
+
export declare function createTextMatcher(pattern: string, mode?: TextSearchMode): TextMatcher;
|
|
5
16
|
export declare function buildSearchSnippet(value: string, terms: string[], maxLength?: number): string;
|
|
6
17
|
export declare function scoreSearchText(fields: {
|
|
7
18
|
title?: string | null;
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import safeRegex from "safe-regex2";
|
|
2
|
+
const MAX_TEXT_SEARCH_PATTERN_LENGTH = 240;
|
|
2
3
|
const STOPWORDS = new Set([
|
|
3
4
|
"about",
|
|
4
5
|
"and",
|
|
@@ -57,6 +58,77 @@ export function matchesSearchMode(value, query, mode) {
|
|
|
57
58
|
? tokens.every((term) => normalizedValue.includes(term))
|
|
58
59
|
: tokens.some((term) => normalizedValue.includes(term));
|
|
59
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* Build a bounded, case-insensitive matcher for agent-facing text search.
|
|
63
|
+
* Regexes are deliberately constrained because these matchers may scan a
|
|
64
|
+
* packaged source corpus during a single agent turn.
|
|
65
|
+
*/
|
|
66
|
+
export function createTextMatcher(pattern, mode = "substring") {
|
|
67
|
+
if (!pattern) {
|
|
68
|
+
return { matches: () => false, error: "Search pattern cannot be empty." };
|
|
69
|
+
}
|
|
70
|
+
if (pattern.length > MAX_TEXT_SEARCH_PATTERN_LENGTH) {
|
|
71
|
+
return {
|
|
72
|
+
matches: () => false,
|
|
73
|
+
error: `Search pattern is limited to ${MAX_TEXT_SEARCH_PATTERN_LENGTH} characters.`,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
if (mode === "substring") {
|
|
77
|
+
const normalized = pattern.toLowerCase();
|
|
78
|
+
return {
|
|
79
|
+
matches: (value) => value.toLowerCase().includes(normalized),
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
const regexSource = mode === "regex" ? pattern : wildcardPatternToRegex(pattern, mode);
|
|
83
|
+
try {
|
|
84
|
+
const matcher = new RegExp(regexSource, "isu");
|
|
85
|
+
if (mode === "regex" && !safeRegex(pattern)) {
|
|
86
|
+
return {
|
|
87
|
+
matches: () => false,
|
|
88
|
+
error: "Regex pattern is too complex for a bounded source search.",
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
return { matches: (value) => matcher.test(value) };
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
return {
|
|
95
|
+
matches: () => false,
|
|
96
|
+
error: `Invalid ${mode} search pattern.`,
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
function wildcardPatternToRegex(pattern, mode) {
|
|
101
|
+
let source = "";
|
|
102
|
+
let escaped = false;
|
|
103
|
+
for (const character of pattern) {
|
|
104
|
+
if (escaped) {
|
|
105
|
+
source += escapeRegexCharacter(character);
|
|
106
|
+
escaped = false;
|
|
107
|
+
continue;
|
|
108
|
+
}
|
|
109
|
+
if (character === "\\") {
|
|
110
|
+
escaped = true;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
const isMany = mode === "glob" ? character === "*" : character === "%";
|
|
114
|
+
const isOne = mode === "glob" ? character === "?" : character === "_";
|
|
115
|
+
if (isMany) {
|
|
116
|
+
source += "[\\s\\S]*";
|
|
117
|
+
}
|
|
118
|
+
else if (isOne) {
|
|
119
|
+
source += "[\\s\\S]";
|
|
120
|
+
}
|
|
121
|
+
else {
|
|
122
|
+
source += escapeRegexCharacter(character);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
if (escaped)
|
|
126
|
+
source += "\\\\";
|
|
127
|
+
return source;
|
|
128
|
+
}
|
|
129
|
+
function escapeRegexCharacter(value) {
|
|
130
|
+
return value.replace(/[\\^$.*+?()[\]{}|]/g, "\\$&");
|
|
131
|
+
}
|
|
60
132
|
export function buildSearchSnippet(value, terms, maxLength = 260) {
|
|
61
133
|
const text = normalizeText(value);
|
|
62
134
|
if (text.length <= maxLength)
|