@agent-native/core 0.121.2 → 0.122.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/corpus/README.md +2 -2
- package/corpus/core/CHANGELOG.md +139 -0
- package/corpus/core/docs/content/actions.mdx +2 -2
- package/corpus/core/docs/content/agent-surfaces.mdx +1 -1
- package/corpus/core/docs/content/authentication.mdx +2 -0
- package/corpus/core/docs/content/deployment.mdx +36 -0
- package/corpus/core/docs/content/http-api.mdx +266 -0
- package/corpus/core/docs/content/syncing-template-changes.mdx +159 -0
- package/corpus/core/package.json +2 -1
- package/corpus/core/src/a2a/activity.ts +38 -27
- package/corpus/core/src/agent/engine/builder-engine.ts +35 -4
- package/corpus/core/src/agent/run-manager.ts +20 -1
- package/corpus/core/src/agent/run-store.ts +4 -1
- package/corpus/core/src/agent/types.ts +28 -8
- package/corpus/core/src/chat-threads/store.ts +45 -0
- package/corpus/core/src/checkpoints/index.ts +2 -0
- package/corpus/core/src/checkpoints/route-match.ts +13 -0
- package/corpus/core/src/cli/create.ts +105 -17
- package/corpus/core/src/cli/index.ts +20 -0
- package/corpus/core/src/cli/template-baseline.ts +410 -0
- package/corpus/core/src/cli/template-sync.ts +1004 -0
- package/corpus/core/src/cli/templates-meta.ts +1 -0
- package/corpus/core/src/client/AssistantChat.tsx +38 -12
- package/corpus/core/src/client/NewWorkspaceAppFlow.tsx +75 -10
- package/corpus/core/src/client/chat/message-components.tsx +127 -66
- package/corpus/core/src/client/chat/tool-call-display.tsx +29 -5
- package/corpus/core/src/client/error-format.ts +18 -0
- package/corpus/core/src/client/org/OrgSwitcher.tsx +30 -8
- package/corpus/core/src/client/org/TeamPage.tsx +7 -6
- package/corpus/core/src/client/sse-event-processor.ts +3 -0
- package/corpus/core/src/data-widgets/index.ts +41 -0
- package/corpus/core/src/deploy/build.ts +11 -9
- package/corpus/core/src/integrations/webhook-handler.ts +63 -9
- package/corpus/core/src/org/auto-join-domain.ts +4 -3
- package/corpus/core/src/org/context.ts +108 -39
- package/corpus/core/src/org/index.ts +5 -0
- package/corpus/core/src/org/service-identity.ts +60 -0
- package/corpus/core/src/provider-api/index.ts +22 -1
- package/corpus/core/src/scripts/docs/search.ts +12 -1
- package/corpus/core/src/server/agent-chat/context-tools.ts +9 -4
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +38 -66
- package/corpus/core/src/server/agent-chat-plugin.ts +17 -10
- package/corpus/core/src/server/agents-bundle.ts +84 -5
- package/corpus/core/src/server/auth.ts +4 -3
- package/corpus/core/src/server/builder-browser.ts +47 -19
- package/corpus/core/src/server/core-routes-plugin.ts +2 -2
- package/corpus/core/src/server/credential-provider.ts +209 -68
- package/corpus/core/src/server/index.ts +3 -0
- package/corpus/core/src/server/prompts/framework-core-compact.ts +6 -13
- package/corpus/core/src/server/prompts/framework-core.ts +9 -21
- package/corpus/core/src/server/prompts/index.ts +0 -1
- package/corpus/core/src/server/prompts/shared-rules.ts +19 -11
- package/corpus/core/src/server/ssr-handler.ts +13 -2
- package/corpus/core/src/settings/user-settings.ts +13 -1
- package/corpus/core/src/shared/cache-control.ts +141 -0
- package/corpus/core/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/chat/_gitignore +1 -0
- package/corpus/core/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/core/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
- package/corpus/core/src/vite/agents-bundle-plugin.ts +7 -6
- package/corpus/core/src/vite/client.ts +5 -0
- package/corpus/templates/analytics/.agents/skills/adhoc-analysis/SKILL.md +4 -5
- package/corpus/templates/analytics/.agents/skills/admin-surfaces/SKILL.md +55 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/SKILL.md +10 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-management/references/template-catalog-and-demo.md +62 -0
- package/corpus/templates/analytics/.agents/skills/dashboard-ops/SKILL.md +85 -0
- package/corpus/templates/analytics/.agents/skills/data-querying/SKILL.md +27 -2
- package/corpus/templates/analytics/.agents/skills/data-querying/references/inline-chart-embeds.md +139 -0
- package/corpus/templates/analytics/.agents/skills/monitoring/SKILL.md +77 -0
- package/corpus/templates/analytics/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/analytics/AGENTS.md +91 -563
- package/corpus/templates/analytics/_gitignore +1 -0
- package/corpus/templates/analytics/actions/bigquery.ts +12 -4
- package/corpus/templates/analytics/actions/generate-chart.ts +5 -5
- package/corpus/templates/analytics/app/components/dashboard/SqlChart.tsx +30 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/DashboardFilterBar.tsx +3 -0
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/SqlChartCard.tsx +1 -1
- package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/index.tsx +1 -0
- package/corpus/templates/analytics/changelog/2026-07-24-analytics-finds-saved-dashboards-and-queries-far-more-reliab.md +6 -0
- package/corpus/templates/analytics/changelog/2026-07-24-notion-access-errors-now-explain-that-a-page-needs-sharing-w.md +6 -0
- package/corpus/templates/analytics/server/lib/agent-chat-plan-mode.ts +7 -0
- package/corpus/templates/analytics/server/lib/analytics-query-catalog.ts +191 -30
- package/corpus/templates/analytics/server/lib/bigquery.ts +11 -1
- package/corpus/templates/analytics/server/lib/notion.ts +15 -4
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +10 -0
- package/corpus/templates/assets/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/brain/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/brain/_gitignore +1 -0
- package/corpus/templates/calendar/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/calendar/_gitignore +1 -0
- package/corpus/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/chat/_gitignore +1 -0
- package/corpus/templates/clips/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/clips/.agents/skills/video-sharing/SKILL.md +34 -0
- package/corpus/templates/clips/AGENTS.md +5 -4
- package/corpus/templates/clips/_gitignore +1 -0
- package/corpus/templates/clips/actions/cleanup-transcript.ts +5 -0
- package/corpus/templates/clips/actions/get-recording-insights.ts +44 -8
- package/corpus/templates/clips/actions/get-recording-player-data.ts +39 -70
- package/corpus/templates/clips/actions/list-clip-views.ts +2 -4
- package/corpus/templates/clips/actions/list-recordings.ts +69 -19
- package/corpus/templates/clips/actions/list-viewers.ts +5 -2
- package/corpus/templates/clips/actions/regenerate-summary.ts +5 -1
- package/corpus/templates/clips/actions/request-transcript.ts +28 -1
- package/corpus/templates/clips/app/components/editor/stitch-manager.tsx +21 -1
- package/corpus/templates/clips/app/components/meetings/quick-ask-sidebar.tsx +14 -1
- package/corpus/templates/clips/app/components/player/insights-panel.tsx +8 -20
- package/corpus/templates/clips/app/components/player/recording-views-badge.tsx +335 -0
- package/corpus/templates/clips/app/components/player/video-player.tsx +13 -8
- package/corpus/templates/clips/app/components/sharing/share-ui.tsx +2 -1
- package/corpus/templates/clips/app/i18n/en-US.ts +13 -2
- package/corpus/templates/clips/app/lib/capture-permissions.ts +110 -0
- package/corpus/templates/clips/app/lib/recording-link.ts +32 -0
- package/corpus/templates/clips/app/routes/_app.meetings.$meetingId.tsx +27 -0
- package/corpus/templates/clips/app/routes/r.$recordingId.tsx +46 -15
- package/corpus/templates/clips/app/routes/record.tsx +77 -31
- package/corpus/templates/clips/app/routes/share.$shareId.tsx +42 -31
- package/corpus/templates/clips/changelog/2026-07-24-clip-pages-now-show-a-view-count-with-viewer-avatars-next-to.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clip-summaries-read-like-a-description-you-d-write-yourself-.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clip-view-counts-now-separate-human-views-from-agent-views-s.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clips-actions-can-now-be-called-by-org-service-tokens-so-ext.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-clips-no-longer-briefly-shows-a-dock-icon-while-launching.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-fixed-owner-and-editor-share-links-redirecting-to-the-record.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-meeting-and-note-recordings-now-start-as-a-compact-pill-on-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-new-clips-now-copy-a-shareable-link-instead-of-the-owner-onl.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-opening-a-share-link-as-the-clip-s-owner-now-goes-straight-t.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-permissions-and-rewind-controls-now-use-compact-consistent-h.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-quitting-the-desktop-app-no-longer-shows-a-false-macos-crash.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-screen-recording-permission-errors-now-name-the-exact-app-to.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-the-desktop-app-now-copies-a-new-clip-s-share-link-to-your-c.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-the-recording-toolbar-now-stays-above-other-apps-including-o.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-transcript-captions-now-use-real-speech-timings-instead-of-a.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-24-video-playback-no-longer-stutters-and-replays-the-last-momen.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +17 -1
- package/corpus/templates/clips/desktop/package.json +2 -0
- package/corpus/templates/clips/desktop/src/app.tsx +89 -0
- package/corpus/templates/clips/desktop/src/hooks/useMeetingTranscription.ts +9 -3
- package/corpus/templates/clips/desktop/src/lib/audio-meter.ts +51 -0
- package/corpus/templates/clips/desktop/src/lib/native-notification.ts +44 -0
- package/corpus/templates/clips/desktop/src/lib/recording-link.ts +67 -0
- package/corpus/templates/clips/desktop/src/overlays/live-audio-bars.tsx +35 -35
- package/corpus/templates/clips/desktop/src/overlays/live-transcript.tsx +3 -2
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +47 -46
- package/corpus/templates/clips/desktop/src/styles.css +127 -78
- package/corpus/templates/clips/desktop/src-tauri/Cargo.toml +7 -0
- package/corpus/templates/clips/desktop/src-tauri/Info.plist +6 -0
- package/corpus/templates/clips/desktop/src-tauri/capabilities/default.json +1 -0
- package/corpus/templates/clips/desktop/src-tauri/src/clips/mod.rs +7 -3
- package/corpus/templates/clips/desktop/src-tauri/src/lib.rs +4 -1
- package/corpus/templates/clips/desktop/src-tauri/src/main.rs +8 -0
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +21 -10
- package/corpus/templates/clips/desktop/src-tauri/src/util.rs +40 -0
- package/corpus/templates/clips/server/db/schema.ts +25 -0
- package/corpus/templates/clips/server/lib/agent-views.ts +145 -0
- package/corpus/templates/clips/server/lib/public-agent-context.ts +7 -0
- package/corpus/templates/clips/server/lib/recording-share-grant.ts +79 -0
- package/corpus/templates/clips/server/lib/recordings.ts +51 -3
- package/corpus/templates/clips/server/plugins/db.ts +23 -0
- package/corpus/templates/clips/server/routes/api/public-recording.get.ts +49 -17
- package/corpus/templates/clips/shared/recording-link.ts +43 -0
- package/corpus/templates/clips/shared/share-attribution.ts +4 -0
- package/corpus/templates/clips/shared/share-dashboard-redirect.ts +42 -0
- package/corpus/templates/clips/shared/view-analytics.ts +26 -0
- package/corpus/templates/content/.agents/skills/content/SKILL.md +5 -0
- package/corpus/templates/content/.agents/skills/content/references/local-file-mode.md +135 -0
- package/corpus/templates/content/.agents/skills/document-editing/SKILL.md +12 -0
- package/corpus/templates/content/.agents/skills/document-editing/references/databases.md +238 -0
- package/corpus/templates/content/.agents/skills/document-editing/references/document-behavior.md +91 -0
- package/corpus/templates/content/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/content/AGENTS.md +62 -583
- package/corpus/templates/content/_gitignore +1 -0
- package/corpus/templates/design/.agents/skills/creative-context/SKILL.md +11 -0
- package/corpus/templates/design/.agents/skills/design-generation/SKILL.md +50 -8
- package/corpus/templates/design/.agents/skills/design-generation/references/code-layers.md +81 -0
- package/corpus/templates/design/.agents/skills/design-generation/references/code-workspace.md +42 -0
- package/corpus/templates/design/.agents/skills/design-generation/references/editor-extensions.md +34 -0
- package/corpus/templates/design/.agents/skills/responsive-breakpoints/SKILL.md +4 -1
- package/corpus/templates/design/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/design/.agents/skills/visual-edit/SKILL.md +17 -0
- package/corpus/templates/design/.generated/bridge/editor-chrome.generated.ts +8196 -0
- package/corpus/templates/design/.generated/bridge/embedded-wheel.generated.ts +265 -0
- package/corpus/templates/design/.generated/bridge/hit-test.generated.ts +642 -0
- package/corpus/templates/design/.generated/bridge/motion-preview.generated.ts +571 -0
- package/corpus/templates/design/.generated/bridge/nav.generated.ts +91 -0
- package/corpus/templates/design/.generated/bridge/sample.generated.ts +23 -0
- package/corpus/templates/design/.generated/bridge/shader-fill-preview.generated.ts +263 -0
- package/corpus/templates/design/.generated/bridge/shader-runtime.generated.ts +518 -0
- package/corpus/templates/design/.generated/bridge/tweak.generated.ts +20 -0
- package/corpus/templates/design/.generated/bridge/zoom.generated.ts +32 -0
- package/corpus/templates/design/AGENTS.md +88 -503
- package/corpus/templates/design/_gitignore +1 -0
- package/corpus/templates/dispatch/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/dispatch/_gitignore +1 -0
- package/corpus/templates/dispatch/changelog/2026-07-24-signing-in-now-puts-you-in-your-companys-workspace.md +6 -0
- package/corpus/templates/forms/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/forms/_gitignore +1 -0
- package/corpus/templates/forms/server/lib/public-form-ssr.ts +2 -2
- package/corpus/templates/macros/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/macros/_gitignore +1 -0
- package/corpus/templates/mail/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/mail/_gitignore +1 -0
- package/corpus/templates/plan/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/plan/_gitignore +1 -0
- package/corpus/templates/slides/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/slides/_gitignore +1 -0
- package/corpus/templates/slides/server/plugins/db.ts +4 -0
- package/corpus/templates/tasks/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/corpus/templates/tasks/AGENTS.md +1 -1
- package/corpus/templates/tasks/_gitignore +1 -0
- package/dist/a2a/activity.d.ts +4 -1
- package/dist/a2a/activity.d.ts.map +1 -1
- package/dist/a2a/activity.js +27 -16
- package/dist/a2a/activity.js.map +1 -1
- package/dist/agent/engine/builder-engine.d.ts +1 -0
- package/dist/agent/engine/builder-engine.d.ts.map +1 -1
- package/dist/agent/engine/builder-engine.js +31 -4
- package/dist/agent/engine/builder-engine.js.map +1 -1
- package/dist/agent/run-manager.d.ts.map +1 -1
- package/dist/agent/run-manager.js +18 -1
- package/dist/agent/run-manager.js.map +1 -1
- package/dist/agent/run-store.d.ts +1 -0
- package/dist/agent/run-store.d.ts.map +1 -1
- package/dist/agent/run-store.js +2 -1
- package/dist/agent/run-store.js.map +1 -1
- package/dist/agent/types.d.ts +12 -1
- package/dist/agent/types.d.ts.map +1 -1
- package/dist/agent/types.js +21 -1
- package/dist/agent/types.js.map +1 -1
- package/dist/chat-threads/store.d.ts +10 -0
- package/dist/chat-threads/store.d.ts.map +1 -1
- package/dist/chat-threads/store.js +41 -0
- package/dist/chat-threads/store.js.map +1 -1
- package/dist/checkpoints/index.d.ts +1 -0
- package/dist/checkpoints/index.d.ts.map +1 -1
- package/dist/checkpoints/index.js +1 -0
- package/dist/checkpoints/index.js.map +1 -1
- package/dist/checkpoints/route-match.d.ts +8 -0
- package/dist/checkpoints/route-match.d.ts.map +1 -0
- package/dist/checkpoints/route-match.js +13 -0
- package/dist/checkpoints/route-match.js.map +1 -0
- package/dist/cli/create.d.ts +35 -4
- package/dist/cli/create.d.ts.map +1 -1
- package/dist/cli/create.js +69 -19
- package/dist/cli/create.js.map +1 -1
- package/dist/cli/index.js +19 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/template-baseline.d.ts +54 -0
- package/dist/cli/template-baseline.d.ts.map +1 -0
- package/dist/cli/template-baseline.js +334 -0
- package/dist/cli/template-baseline.js.map +1 -0
- package/dist/cli/template-sync.d.ts +57 -0
- package/dist/cli/template-sync.d.ts.map +1 -0
- package/dist/cli/template-sync.js +787 -0
- package/dist/cli/template-sync.js.map +1 -0
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +1 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +2 -1
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +38 -10
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.d.ts.map +1 -1
- package/dist/client/NewWorkspaceAppFlow.js +32 -2
- package/dist/client/NewWorkspaceAppFlow.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +20 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +81 -46
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +14 -6
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/client/error-format.d.ts.map +1 -1
- package/dist/client/error-format.js +13 -0
- package/dist/client/error-format.js.map +1 -1
- package/dist/client/org/OrgSwitcher.d.ts +8 -1
- package/dist/client/org/OrgSwitcher.d.ts.map +1 -1
- package/dist/client/org/OrgSwitcher.js +3 -2
- package/dist/client/org/OrgSwitcher.js.map +1 -1
- package/dist/client/org/TeamPage.d.ts.map +1 -1
- package/dist/client/org/TeamPage.js +1 -1
- package/dist/client/org/TeamPage.js.map +1 -1
- package/dist/client/sse-event-processor.d.ts.map +1 -1
- package/dist/client/sse-event-processor.js +3 -0
- package/dist/client/sse-event-processor.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/data-widgets/index.d.ts +3 -0
- package/dist/data-widgets/index.d.ts.map +1 -1
- package/dist/data-widgets/index.js +33 -0
- package/dist/data-widgets/index.js.map +1 -1
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +11 -7
- package/dist/deploy/build.js.map +1 -1
- package/dist/eject/provider-api-definitions.d.ts +1 -0
- package/dist/eject/provider-api-definitions.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.d.ts.map +1 -1
- package/dist/integrations/webhook-handler.js +46 -9
- package/dist/integrations/webhook-handler.js.map +1 -1
- package/dist/org/auto-join-domain.d.ts +3 -2
- package/dist/org/auto-join-domain.d.ts.map +1 -1
- package/dist/org/auto-join-domain.js +1 -1
- package/dist/org/auto-join-domain.js.map +1 -1
- package/dist/org/context.d.ts.map +1 -1
- package/dist/org/context.js +84 -28
- package/dist/org/context.js.map +1 -1
- package/dist/org/index.d.ts +1 -0
- package/dist/org/index.d.ts.map +1 -1
- package/dist/org/index.js +1 -0
- package/dist/org/index.js.map +1 -1
- package/dist/org/service-identity.d.ts +43 -0
- package/dist/org/service-identity.d.ts.map +1 -0
- package/dist/org/service-identity.js +34 -0
- package/dist/org/service-identity.js.map +1 -0
- package/dist/provider-api/actions/custom-provider-registration.d.ts +14 -14
- package/dist/provider-api/actions/provider-api.d.ts +13 -11
- package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
- package/dist/provider-api/index.d.ts +4 -0
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +17 -1
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/scripts/docs/search.d.ts.map +1 -1
- package/dist/scripts/docs/search.js +12 -1
- package/dist/scripts/docs/search.js.map +1 -1
- package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
- package/dist/server/agent-chat/context-tools.js +3 -3
- package/dist/server/agent-chat/context-tools.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.d.ts +8 -3
- package/dist/server/agent-chat/framework-prompts.d.ts.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +33 -62
- package/dist/server/agent-chat/framework-prompts.js.map +1 -1
- package/dist/server/agent-chat-plugin.d.ts.map +1 -1
- package/dist/server/agent-chat-plugin.js +16 -10
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/agents-bundle.d.ts +18 -0
- package/dist/server/agents-bundle.d.ts.map +1 -1
- package/dist/server/agents-bundle.js +70 -4
- package/dist/server/agents-bundle.js.map +1 -1
- package/dist/server/auth.d.ts.map +1 -1
- package/dist/server/auth.js +4 -3
- package/dist/server/auth.js.map +1 -1
- package/dist/server/builder-browser.d.ts.map +1 -1
- package/dist/server/builder-browser.js +43 -19
- package/dist/server/builder-browser.js.map +1 -1
- package/dist/server/core-routes-plugin.js +2 -2
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +38 -2
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +142 -64
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.d.ts.map +1 -1
- package/dist/server/index.js +1 -1
- package/dist/server/index.js.map +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts +1 -1
- package/dist/server/prompts/framework-core-compact.d.ts.map +1 -1
- package/dist/server/prompts/framework-core-compact.js +7 -13
- package/dist/server/prompts/framework-core-compact.js.map +1 -1
- package/dist/server/prompts/framework-core.d.ts +1 -1
- package/dist/server/prompts/framework-core.d.ts.map +1 -1
- package/dist/server/prompts/framework-core.js +10 -21
- package/dist/server/prompts/framework-core.js.map +1 -1
- package/dist/server/prompts/index.d.ts +1 -1
- package/dist/server/prompts/index.d.ts.map +1 -1
- package/dist/server/prompts/index.js +1 -1
- package/dist/server/prompts/index.js.map +1 -1
- package/dist/server/prompts/shared-rules.d.ts +16 -10
- package/dist/server/prompts/shared-rules.d.ts.map +1 -1
- package/dist/server/prompts/shared-rules.js +19 -10
- package/dist/server/prompts/shared-rules.js.map +1 -1
- package/dist/server/ssr-handler.d.ts +1 -1
- package/dist/server/ssr-handler.d.ts.map +1 -1
- package/dist/server/ssr-handler.js +10 -3
- package/dist/server/ssr-handler.js.map +1 -1
- package/dist/settings/user-settings.d.ts.map +1 -1
- package/dist/settings/user-settings.js +13 -1
- package/dist/settings/user-settings.js.map +1 -1
- package/dist/shared/cache-control.d.ts +52 -0
- package/dist/shared/cache-control.d.ts.map +1 -1
- package/dist/shared/cache-control.js +107 -0
- package/dist/shared/cache-control.js.map +1 -1
- package/dist/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/chat/_gitignore +1 -0
- package/dist/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
- package/dist/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/dist/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
- package/dist/vite/agents-bundle-plugin.d.ts.map +1 -1
- package/dist/vite/agents-bundle-plugin.js +8 -7
- package/dist/vite/agents-bundle-plugin.js.map +1 -1
- package/dist/vite/client.d.ts.map +1 -1
- package/dist/vite/client.js +2 -0
- package/dist/vite/client.js.map +1 -1
- package/docs/content/actions.mdx +2 -2
- package/docs/content/agent-surfaces.mdx +1 -1
- package/docs/content/authentication.mdx +2 -0
- package/docs/content/deployment.mdx +36 -0
- package/docs/content/http-api.mdx +266 -0
- package/docs/content/syncing-template-changes.mdx +159 -0
- package/package.json +4 -3
- package/src/a2a/activity.ts +38 -27
- package/src/agent/engine/builder-engine.ts +35 -4
- package/src/agent/run-manager.ts +20 -1
- package/src/agent/run-store.ts +4 -1
- package/src/agent/types.ts +28 -8
- package/src/chat-threads/store.ts +45 -0
- package/src/checkpoints/index.ts +2 -0
- package/src/checkpoints/route-match.ts +13 -0
- package/src/cli/create.ts +105 -17
- package/src/cli/index.ts +20 -0
- package/src/cli/template-baseline.ts +410 -0
- package/src/cli/template-sync.ts +1004 -0
- package/src/cli/templates-meta.ts +1 -0
- package/src/client/AssistantChat.tsx +38 -12
- package/src/client/NewWorkspaceAppFlow.tsx +75 -10
- package/src/client/chat/message-components.tsx +127 -66
- package/src/client/chat/tool-call-display.tsx +29 -5
- package/src/client/error-format.ts +18 -0
- package/src/client/org/OrgSwitcher.tsx +30 -8
- package/src/client/org/TeamPage.tsx +7 -6
- package/src/client/sse-event-processor.ts +3 -0
- package/src/data-widgets/index.ts +41 -0
- package/src/deploy/build.ts +11 -9
- package/src/integrations/webhook-handler.ts +63 -9
- package/src/org/auto-join-domain.ts +4 -3
- package/src/org/context.ts +108 -39
- package/src/org/index.ts +5 -0
- package/src/org/service-identity.ts +60 -0
- package/src/provider-api/index.ts +22 -1
- package/src/scripts/docs/search.ts +12 -1
- package/src/server/__snapshots__/agent-chat-plugin.surface.spec.ts.snap +25 -36
- package/src/server/agent-chat/context-tools.ts +9 -4
- package/src/server/agent-chat/framework-prompts.ts +38 -66
- package/src/server/agent-chat-plugin.ts +17 -10
- package/src/server/agents-bundle.ts +84 -5
- package/src/server/auth.ts +4 -3
- package/src/server/builder-browser.ts +47 -19
- package/src/server/core-routes-plugin.ts +2 -2
- package/src/server/credential-provider.ts +209 -68
- package/src/server/index.ts +3 -0
- package/src/server/prompts/framework-core-compact.ts +6 -13
- package/src/server/prompts/framework-core.ts +9 -21
- package/src/server/prompts/index.ts +0 -1
- package/src/server/prompts/shared-rules.ts +19 -11
- package/src/server/ssr-handler.ts +13 -2
- package/src/settings/user-settings.ts +13 -1
- package/src/shared/cache-control.ts +141 -0
- package/src/templates/chat/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/chat/_gitignore +1 -0
- package/src/templates/default/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/headless/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/workspace-core/.agents/skills/performance/SKILL.md +19 -0
- package/src/templates/workspace-core/.agents/skills/upgrade-agent-native/SKILL.md +24 -2
- package/src/templates/workspace-core/.agents/skills/visual-answer/SKILL.md +1 -0
- package/src/vite/agents-bundle-plugin.ts +7 -6
- package/src/vite/client.ts +5 -0
package/docs/content/actions.mdx
CHANGED
|
@@ -225,7 +225,7 @@ export default defineAction({
|
|
|
225
225
|
|
|
226
226
|
For a `GET` action, `leadId` is passed as a query param: `/_agent-native/actions/get-lead?leadId=abc`.
|
|
227
227
|
|
|
228
|
-
<Endpoint id="doc-block-uhuudd" title="The auto-mounted action endpoint" method="GET" path="/_agent-native/actions/get-lead" summary={"Every action is mounted here automatically — the filename is the action name."} auth={"Session cookie
|
|
228
|
+
<Endpoint id="doc-block-uhuudd" title="The auto-mounted action endpoint" method="GET" path="/_agent-native/actions/get-lead" summary={"Every action is mounted here automatically — the filename is the action name."} auth={"Session cookie (frontend calls carry `X-Agent-Native-Frontend: 1`), or `Authorization: Bearer <token>` for external callers"} params={[
|
|
229
229
|
{
|
|
230
230
|
"name": "leadId",
|
|
231
231
|
"in": "query",
|
|
@@ -244,7 +244,7 @@ For a `GET` action, `leadId` is passed as a query param: `/_agent-native/actions
|
|
|
244
244
|
}
|
|
245
245
|
]}>
|
|
246
246
|
|
|
247
|
-
POST by default; `http: { method: "GET" }` makes it a GET. The React hooks and `callAction` always call this path by name, regardless of any `http.path` override.
|
|
247
|
+
POST by default; `http: { method: "GET" }` makes it a GET. The React hooks and `callAction` always call this path by name, regardless of any `http.path` override. External systems can call the same route with a long-lived bearer token — see [HTTP API](/docs/http-api).
|
|
248
248
|
|
|
249
249
|
</Endpoint>
|
|
250
250
|
|
|
@@ -220,7 +220,7 @@ One action is then callable as:
|
|
|
220
220
|
}
|
|
221
221
|
]}>
|
|
222
222
|
|
|
223
|
-
Every `defineAction` is auto-mounted at `/_agent-native/actions/<name>`. The JSON body is validated against the action's zod schema before `run` executes.
|
|
223
|
+
Every `defineAction` is auto-mounted at `/_agent-native/actions/<name>`. The JSON body is validated against the action's zod schema before `run` executes. To call it from an external system with a long-lived bearer token, see [HTTP API](/docs/http-api).
|
|
224
224
|
|
|
225
225
|
</Endpoint>
|
|
226
226
|
|
|
@@ -404,6 +404,8 @@ function SignInCta() {
|
|
|
404
404
|
|
|
405
405
|
Normal app pages use one impersonal, public-cacheable SSR shell for every visitor. `AppProviders` checks the session on the client; on a private path such as `/dashboard`, it redirects an anonymous visitor to `/_agent-native/sign-in?return=%2Fdashboard` before mounting private app UI. After sign-in, the visitor returns to `/dashboard`. Pass `isPublicPath` for public/SEO routes, or `sessionBypass` for a surface that authenticates through another scoped mechanism such as an MCP embed token.
|
|
406
406
|
|
|
407
|
+
How long that shell is cached is a deployment-wide setting — see [SSR Caching](/docs/deployment#ssr-caching) for `AGENT_NATIVE_SSR_CACHE`. Shortening or disabling the cache changes duration only; SSR still renders the anonymous branch with cookies stripped.
|
|
408
|
+
|
|
407
409
|
### Behind the scenes: Google OAuth
|
|
408
410
|
|
|
409
411
|
Both flows (the explicit `/_agent-native/sign-in` entrypoint and the bookmarked-path case) thread the return URL through the OAuth state. The state is HMAC-signed, so it can't be forged in transit. On the callback, the return URL is re-validated as same-origin before the redirect — so a leaked signing key still can't be turned into an open-redirect oracle.
|
|
@@ -457,6 +457,41 @@ export default defineConfig({
|
|
|
457
457
|
});
|
|
458
458
|
```
|
|
459
459
|
|
|
460
|
+
## SSR Caching {#ssr-caching}
|
|
461
|
+
|
|
462
|
+
Every SSR HTML response and every React Router `.data` response is one impersonal, public shell: `createH3SSRHandler` strips cookies before rendering, so the same bytes are correct for every visitor and all personalization happens on the client after load. That is what makes it safe to stamp a single hard-cache policy on those responses by default:
|
|
463
|
+
|
|
464
|
+
```txt
|
|
465
|
+
cache-control: public, max-age=600, stale-while-revalidate=604800, stale-if-error=3600
|
|
466
|
+
```
|
|
467
|
+
|
|
468
|
+
The same value is mirrored onto `cdn-cache-control` and `netlify-cdn-cache-control`. One shared CDN entry then serves the whole site instead of a per-request render, which is the single biggest lever on first-response latency — leave it on unless one of the cases below applies to your deployment.
|
|
469
|
+
|
|
470
|
+
### Overriding with `AGENT_NATIVE_SSR_CACHE` {#ssr-cache-env}
|
|
471
|
+
|
|
472
|
+
Set `AGENT_NATIVE_SSR_CACHE` in the deploy environment to change the policy for the whole deployment:
|
|
473
|
+
|
|
474
|
+
| Value | Result |
|
|
475
|
+
| --------------------------------------------------- | ------------------------------------------------------------------------------------ |
|
|
476
|
+
| unset, `on`, `default`, `true`, `1` | The default policy above, unchanged. Recommended — best performance. |
|
|
477
|
+
| `off`, `false`, `0`, `none`, `no-store`, `disabled` | `no-store` on `cache-control`, `cdn-cache-control`, and `netlify-cdn-cache-control`. |
|
|
478
|
+
| A duration: `30`, `30s`, `5m`, `2h` | `public, max-age=<n>, stale-while-revalidate=<n>, stale-if-error=3600`. |
|
|
479
|
+
|
|
480
|
+
Bare numbers are seconds. `stale-while-revalidate` deliberately mirrors `max-age` for a custom duration: a short freshness window paired with the default seven-day stale window would hand back exactly the staleness you opted out of. An unrecognized value logs a warning and falls back to the default, so a typo can never silently disable the CDN.
|
|
481
|
+
|
|
482
|
+
Turn it down or off when either of these is true:
|
|
483
|
+
|
|
484
|
+
1. **Your host does not purge its CDN on deploy.** Netlify and Vercel do; some self-managed setups do not. Without a purge, a shipped build can keep serving the previous shell for `max-age` plus `stale-while-revalidate`.
|
|
485
|
+
2. **Your loaders return mutable public data.** After a successful mutation, a `useRevalidator()` or redirect-after-action re-fetch can read the browser's cached `.data` copy instead of fresh loader output.
|
|
486
|
+
|
|
487
|
+
The setting applies to every public-shell surface: React Router SSR HTML and `.data`, the login HTML shell, the `/_agent-native/speculation-rules.json` route, the docs site, and the public-form SSR in the forms template. The generated Cloudflare Worker resolves it at build time, so set it in the deploy environment before the build runs.
|
|
488
|
+
|
|
489
|
+
Three things to keep in mind:
|
|
490
|
+
|
|
491
|
+
- **Turning caching off does not make SSR personalized.** Cookies are still stripped before render and SSR loaders still see the anonymous branch. Per-user data must still be resolved client-side. This variable controls cache _duration_ only.
|
|
492
|
+
- **It is deployment-wide, not per-route, by design.** A per-route or per-request cache override is how one visitor's payload ends up in another visitor's shared CDN entry, so the framework does not offer one — `guard:ssr-cache-shell` enforces it.
|
|
493
|
+
- **For mutation-fresh data, prefer actions over disabling the cache.** App data belongs in [actions](/docs/actions), read from the client with `useActionQuery` / `useActionMutation` and kept live by `useDbSync()` polling; none of that goes through the SSR shell cache. Keep SSR loaders rendering the public shell, and reach for this variable only when you genuinely want loader data fresher.
|
|
494
|
+
|
|
460
495
|
## Environment Variables {#environment-variables}
|
|
461
496
|
|
|
462
497
|
### Build / Runtime {#env-runtime}
|
|
@@ -467,6 +502,7 @@ export default defineConfig({
|
|
|
467
502
|
| `NITRO_PRESET` | Override build preset at build time |
|
|
468
503
|
| `APP_BASE_PATH` | Mount the app under a prefix (e.g. `/mail`). Set automatically by `npx @agent-native/core@latest deploy`; leave unset for standalone. |
|
|
469
504
|
| `AGENT_PROD_CODE_EXECUTION` | Optional production code-execution mode: `off` (default), `sandboxed`, or `trusted`. See [Production Code Execution](#production-code-execution). |
|
|
505
|
+
| `AGENT_NATIVE_SSR_CACHE` | Deployment-wide SSR shell cache policy: unset/`on` keeps the default hard-cache, `off` sends `no-store`, or a duration such as `30s` / `5m` sets a shorter freshness. See [SSR Caching](#ssr-caching). |
|
|
470
506
|
| `AGENT_NATIVE_BUILDER_RELAY_SECRET` | Dedicated 32+ char shared HMAC secret for preview-safe Builder authorization relay. Set the same value on the approved corporate callback deployment and preview deployments only when authorization must land in an isolated preview database. |
|
|
471
507
|
| `AGENT_NATIVE_BUILDER_RELAY_TARGET_ORIGINS` | Corporate callback-only, comma-separated allowlist of exact trusted preview origins (for example, `https://0123456789abcdef01234567--content.netlify.app`). Set it only on the corporate callback deployment. Netlify origins must use an immutable, deploy-specific 24-hex permalink; mutable `deploy-preview-*` aliases, wildcards, and domain suffixes are rejected. |
|
|
472
508
|
|
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "HTTP API: Call Actions from Anything"
|
|
3
|
+
description: "Call an agent-native app's actions over plain HTTP with a long-lived bearer token — from a support-desk bot, a CI job, a cron script, or any backend service, no browser session required."
|
|
4
|
+
search: "HTTP API bearer token service token connect CLI curl action endpoint server-to-server webhook CI backend integration Authorization header revoke rotate"
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# HTTP API
|
|
8
|
+
|
|
9
|
+
**This page: call an app's actions from an external system over HTTP.** Use it when a support-desk bot, a CI job, a cron script, a Lambda, or any backend service needs to invoke your app without a browser and without an MCP client.
|
|
10
|
+
|
|
11
|
+
| If you want to… | Read |
|
|
12
|
+
| ---------------------------------------------------- | ---------------------------------------- |
|
|
13
|
+
| Call one action from a script or backend service | **This page** — HTTP API |
|
|
14
|
+
| Let an AI host discover and call every action | [MCP Server](/docs/mcp-protocol) |
|
|
15
|
+
| Connect Claude, ChatGPT, Codex, Cursor to your app | [External Agents](/docs/external-agents) |
|
|
16
|
+
| Have another agent-native app delegate work to yours | [A2A Protocol](/docs/a2a-protocol) |
|
|
17
|
+
| Define the operation in the first place | [Actions](/docs/actions) |
|
|
18
|
+
|
|
19
|
+
Every `defineAction` in `actions/` is already an HTTP endpoint. The frontend calls it through `useActionQuery` / `useActionMutation` with a session cookie, but the same route accepts an `Authorization: Bearer` token, so anything that can make an HTTPS request can call it. There is no separate "public API" to build and no REST wrapper to maintain — the action you wrote for the agent and the UI is the API.
|
|
20
|
+
|
|
21
|
+
## When to use this surface {#when}
|
|
22
|
+
|
|
23
|
+
Pick HTTP when the caller is code and already knows exactly which operation it wants:
|
|
24
|
+
|
|
25
|
+
| Caller | Use |
|
|
26
|
+
| ------------------------------------------------------ | -------------------------------------- |
|
|
27
|
+
| A script, backend service, CI job, or webhook consumer | **HTTP** — this page |
|
|
28
|
+
| An LLM host that should discover tools and choose | [MCP](/docs/mcp-protocol) |
|
|
29
|
+
| Another agent-native app delegating a fuzzy task | [A2A](/docs/a2a-protocol) |
|
|
30
|
+
| A browser page in your own app | `useActionQuery` / `useActionMutation` |
|
|
31
|
+
|
|
32
|
+
HTTP is the cheapest of the three: one request, one JSON body, one JSON response, no handshake, no session, no model in the loop. MCP and A2A both sit on top of the same actions — reach for them when the caller needs a tool catalog or the whole agent loop, not a single known operation.
|
|
33
|
+
|
|
34
|
+
## Mint a token {#mint-token}
|
|
35
|
+
|
|
36
|
+
Tokens come from the `connect` CLI. There are two kinds, and the choice matters.
|
|
37
|
+
|
|
38
|
+
**Personal token** — bound to the person who runs the command. Use it for your own scripts and local development.
|
|
39
|
+
|
|
40
|
+
```bash
|
|
41
|
+
npx @agent-native/core@latest connect https://clips.example.com
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
This opens a browser sign-in, then writes the token into your local MCP client configs. Rows the token creates are owned by you.
|
|
45
|
+
|
|
46
|
+
**Org service token** — bound to a synthetic, organization-owned identity rather than a person. Use it for anything that must keep running after people change teams: CI, a support-desk bot, a scheduled integration.
|
|
47
|
+
|
|
48
|
+
```bash
|
|
49
|
+
npx @agent-native/core@latest connect https://clips.example.com \
|
|
50
|
+
--service-token support-desk --ttl-days 90
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
The command still authenticates you in the browser first — minting requires org **owner or admin** — but the resulting token's subject is `svc-support-desk@service.<orgId>`. It survives you leaving the org or revoking your own personal tokens, and the rows it creates are org-scoped, so every org member can see them. The token value is printed exactly once and is never written to a local config file; copy it straight into your secret store.
|
|
54
|
+
|
|
55
|
+
| | Personal token | Org service token |
|
|
56
|
+
| ---------------------------- | --------------------------- | -------------------------------- |
|
|
57
|
+
| Identity | The person who minted it | `svc-<name>@service.<orgId>` |
|
|
58
|
+
| Survives that person leaving | No | Yes |
|
|
59
|
+
| Rows it creates | Owned by that person | Org-scoped |
|
|
60
|
+
| Who can mint | Any signed-in user | Org owner/admin only |
|
|
61
|
+
| Best for | Your own scripts, local dev | CI, bots, scheduled integrations |
|
|
62
|
+
|
|
63
|
+
Both default to a 365-day lifetime and accept `--ttl-days` between 1 and 365. If a machine cannot open a browser, the app's connect page at `https://<app>/mcp/connect` is the fallback: sign in there, copy the token, and pass it with `connect <url> --token <token>` or paste it directly into your secret store.
|
|
64
|
+
|
|
65
|
+
For a self-hosted, single-tenant app where per-person identity does not matter, the static `ACCESS_TOKEN` / `ACCESS_TOKENS` environment variables are the simplest option — see [Authentication — Static MCP Bearer Tokens](/docs/authentication#access-tokens).
|
|
66
|
+
|
|
67
|
+
## Call an action {#call}
|
|
68
|
+
|
|
69
|
+
The route is `POST /_agent-native/actions/<action-id>`. The action id defaults to the action's filename, so `actions/import-loom-recording.ts` mounts at `/_agent-native/actions/import-loom-recording`.
|
|
70
|
+
|
|
71
|
+
The request body is the raw JSON of the action's zod schema — no envelope, no `{ args: ... }` wrapper. The response is the action's return value serialized bare at the top level, not wrapped in `{ result: ... }`.
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
curl -sS -X POST \
|
|
75
|
+
https://clips.example.com/_agent-native/actions/import-loom-recording \
|
|
76
|
+
-H "Authorization: Bearer $AGENT_NATIVE_TOKEN" \
|
|
77
|
+
-H "Content-Type: application/json" \
|
|
78
|
+
-d '{"url": "https://www.loom.com/share/EXAMPLE_SHARE_ID"}'
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```json
|
|
82
|
+
{
|
|
83
|
+
"recordingId": "rec_8f2a91",
|
|
84
|
+
"title": "Checkout fails on Safari 17",
|
|
85
|
+
"status": "imported"
|
|
86
|
+
}
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
<Endpoint id="doc-block-http-api-action" title="Call an action over HTTP" method="POST" path="/_agent-native/actions/import-loom-recording" summary={"Invoke any action by id with a bearer token — no browser session required."} auth={"Authorization: Bearer <connect-minted personal or org service token>, or a session cookie for same-origin browser calls"} params={[
|
|
90
|
+
{
|
|
91
|
+
"name": "Authorization",
|
|
92
|
+
"in": "header",
|
|
93
|
+
"type": "string",
|
|
94
|
+
"required": true,
|
|
95
|
+
"description": "Bearer <token> from `connect` or `connect --service-token`. Omit only for same-origin browser calls that carry the session cookie."
|
|
96
|
+
},
|
|
97
|
+
{
|
|
98
|
+
"name": "Content-Type",
|
|
99
|
+
"in": "header",
|
|
100
|
+
"type": "string",
|
|
101
|
+
"required": true,
|
|
102
|
+
"description": "application/json for POST actions."
|
|
103
|
+
}
|
|
104
|
+
]} request={{
|
|
105
|
+
"contentType": "application/json",
|
|
106
|
+
"example": "{\n \"url\": \"https://www.loom.com/share/EXAMPLE_SHARE_ID\"\n}"
|
|
107
|
+
}} responses={[
|
|
108
|
+
{
|
|
109
|
+
"status": "200",
|
|
110
|
+
"description": "The action's return value, serialized bare at the top level.",
|
|
111
|
+
"example": "{\n \"recordingId\": \"rec_8f2a91\",\n \"title\": \"Checkout fails on Safari 17\",\n \"status\": \"imported\"\n}"
|
|
112
|
+
},
|
|
113
|
+
{
|
|
114
|
+
"status": "400",
|
|
115
|
+
"description": "Input failed the action's zod schema before run() fired.",
|
|
116
|
+
"example": "{ \"error\": \"Invalid action parameters: url: Required\" }"
|
|
117
|
+
},
|
|
118
|
+
{
|
|
119
|
+
"status": "401",
|
|
120
|
+
"description": "Missing, expired, revoked, or wrong-audience token."
|
|
121
|
+
},
|
|
122
|
+
{
|
|
123
|
+
"status": "405",
|
|
124
|
+
"description": "Wrong HTTP method for this action.",
|
|
125
|
+
"example": "{ \"error\": \"Method not allowed. Use POST.\" }"
|
|
126
|
+
},
|
|
127
|
+
{
|
|
128
|
+
"status": "500",
|
|
129
|
+
"description": "The action threw. The real message stays server-side.",
|
|
130
|
+
"example": "{ \"error\": \"Internal server error\" }"
|
|
131
|
+
}
|
|
132
|
+
]}>
|
|
133
|
+
|
|
134
|
+
The body is validated against the action's zod schema before `run` executes. The token is verified the same way the app's MCP endpoint verifies it: same signature check, same audience binding to `{appUrl}/mcp`, same revocation gate. The caller's organization comes from the token's signed `org_id` claim — never from an ambient browser cookie that happens to ride along on the request.
|
|
135
|
+
|
|
136
|
+
</Endpoint>
|
|
137
|
+
|
|
138
|
+
### GET actions and query params {#get-actions}
|
|
139
|
+
|
|
140
|
+
An action that declares an `http` override is reachable with the method it names, and `GET` args arrive as query params instead of a JSON body:
|
|
141
|
+
|
|
142
|
+
```ts filename="actions/get-lead.ts"
|
|
143
|
+
export default defineAction({
|
|
144
|
+
description: "Get details for a lead.",
|
|
145
|
+
schema: z.object({ leadId: z.string() }),
|
|
146
|
+
http: { method: "GET" },
|
|
147
|
+
run: async ({ leadId }) => {
|
|
148
|
+
/* ... */
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```bash
|
|
154
|
+
curl -sS \
|
|
155
|
+
"https://crm.example.com/_agent-native/actions/get-lead?leadId=lead_123" \
|
|
156
|
+
-H "Authorization: Bearer $AGENT_NATIVE_TOKEN"
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
`http: { path: "..." }` changes the mounted URL for direct HTTP callers only, and `http: false` removes the endpoint entirely. See [Actions — HTTP config](/docs/actions#http) for the full option set.
|
|
160
|
+
|
|
161
|
+
### Errors {#errors}
|
|
162
|
+
|
|
163
|
+
Every failure returns `{ "error": string }` with an appropriate status:
|
|
164
|
+
|
|
165
|
+
| Status | Meaning |
|
|
166
|
+
| ------ | --------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
167
|
+
| `400` | Input failed the action's zod schema. The message names the offending field. |
|
|
168
|
+
| `401` | Missing, expired, revoked, or wrong-audience bearer token. |
|
|
169
|
+
| `403` | Authenticated, but not allowed to touch this data — see [When it 403s](#troubleshooting). |
|
|
170
|
+
| `405` | Wrong method. The message tells you which one the action declares. |
|
|
171
|
+
| `409` | Only for browser clients running a stale build; server-to-server callers never see it. |
|
|
172
|
+
| `500` | The action threw. The response message is always `Internal server error` — the real detail is logged server-side with a capture id, never returned. |
|
|
173
|
+
|
|
174
|
+
Treat a `500` as "check the app's logs", not "read the error text". Actions that want to return a specific, user-facing failure should throw with an explicit `statusCode` below 500; those messages do come back verbatim.
|
|
175
|
+
|
|
176
|
+
### CSRF and CORS {#csrf-cors}
|
|
177
|
+
|
|
178
|
+
A cookieless server-to-server call skips CSRF entirely — there is no session cookie to confuse, so there is nothing to protect against. You do not need to fetch a CSRF token, and you should not send cookies.
|
|
179
|
+
|
|
180
|
+
Cross-origin calls _from a browser_ are different: they need an allowlisted origin. If you are calling from browser JavaScript on another domain, configure the app's CORS allowlist first. Server-side callers are unaffected.
|
|
181
|
+
|
|
182
|
+
## Worked example: a support-desk bot {#worked-example}
|
|
183
|
+
|
|
184
|
+
A support-desk bot watches inbound tickets. When a customer attaches a Loom share link to a bug report, the bot imports it into Clips so the support team can comment on the recording, clip the relevant 20 seconds, and attach it to the engineering issue.
|
|
185
|
+
|
|
186
|
+
**1. Mint a token the bot owns.** Run this once, as an org owner or admin:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
npx @agent-native/core@latest connect https://clips.example.com \
|
|
190
|
+
--service-token support-desk --ttl-days 365
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
Copy the printed value into the bot's secret store as `AGENT_NATIVE_TOKEN`. It is shown once and never stored by the app.
|
|
194
|
+
|
|
195
|
+
**2. Call the action when a ticket arrives.**
|
|
196
|
+
|
|
197
|
+
```ts
|
|
198
|
+
const res = await fetch(
|
|
199
|
+
"https://clips.example.com/_agent-native/actions/import-loom-recording",
|
|
200
|
+
{
|
|
201
|
+
method: "POST",
|
|
202
|
+
headers: {
|
|
203
|
+
Authorization: `Bearer ${process.env.AGENT_NATIVE_TOKEN}`,
|
|
204
|
+
"Content-Type": "application/json",
|
|
205
|
+
},
|
|
206
|
+
body: JSON.stringify({ url: shareUrl }),
|
|
207
|
+
},
|
|
208
|
+
);
|
|
209
|
+
|
|
210
|
+
if (!res.ok) {
|
|
211
|
+
const { error } = await res.json();
|
|
212
|
+
throw new Error(`Clips import failed (${res.status}): ${error}`);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
const { recordingId } = await res.json();
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
**3. Link back to the recording.** Post `https://clips.example.com/r/${recordingId}` into the ticket thread. Because the bot used an org service token, the recording is org-scoped: every teammate who opens that link sees it, and it does not disappear when the person who set up the bot changes teams.
|
|
219
|
+
|
|
220
|
+
The action ran exactly as it would have from chat or the UI — same validation, same access checks, same app state write that focuses the new recording for anyone who has the app open.
|
|
221
|
+
|
|
222
|
+
## Lifetime, rotation, and revocation {#lifecycle}
|
|
223
|
+
|
|
224
|
+
Tokens are JWTs signed by the app and bound to that app's audience. A token minted for one app cannot call another.
|
|
225
|
+
|
|
226
|
+
- **Lifetime** — 365 days by default, `--ttl-days` between 1 and 365. Shorter is better for anything that runs unattended.
|
|
227
|
+
- **Rotation** — mint the new token, deploy it to the caller, confirm traffic is flowing, then revoke the old one. There is no in-place rotation; the two tokens are independent and can overlap.
|
|
228
|
+
- **Revocation** — every token carries a `jti`, and revocation is a `jti` check on every request, so a revoked token stops working immediately. Use the `list-org-service-tokens` action to see names, who minted them, and last-used timestamps, then `revoke-org-service-token` with the id. Both are owner/admin-gated for writes; any org member can list.
|
|
229
|
+
- **Recovery** — the token value is never stored, only its `jti`. If you lose it, mint a new one and revoke the old.
|
|
230
|
+
|
|
231
|
+
Because `list-org-service-tokens` reports `lastUsedAt`, it doubles as a cleanup tool: anything that has not been used in months is a candidate for revocation.
|
|
232
|
+
|
|
233
|
+
<Callout id="doc-block-http-api-security" tone="warning">
|
|
234
|
+
|
|
235
|
+
**Treat the token exactly like a password.** It authenticates as a real identity in your organization, and it is long-lived by default.
|
|
236
|
+
|
|
237
|
+
- Put it in a secret manager or CI secret, never in source, a Dockerfile, a log line, or a client-side bundle.
|
|
238
|
+
- Give each caller its own named service token (`--service-token support-desk`, `--service-token ci`) so you can revoke one without breaking the others, and so `lastUsedAt` tells you who is actually calling.
|
|
239
|
+
- Prefer the shortest `--ttl-days` the caller can live with.
|
|
240
|
+
- A service token acts as an org **`member`, and only ever `member`.** The synthetic `svc-*@service.<orgId>` identity is never inserted into `org_members`; it resolves an implicit member role for the org it was minted against, and nothing higher. So it can read and write that org's data like any member, but it cannot mint further tokens, revoke existing ones, or manage org members and settings — every one of those is admin-gated. It can still do everything a normal member can do with the org's data, so scope it deliberately.
|
|
241
|
+
- Actions you never want reachable this way should set `http: false` (agent and CLI only) or `toolCallable: false`. See [Actions — Exposure flags](/docs/actions#exposure-flags).
|
|
242
|
+
|
|
243
|
+
</Callout>
|
|
244
|
+
|
|
245
|
+
## When it 403s {#troubleshooting}
|
|
246
|
+
|
|
247
|
+
A `401` means the token was not accepted at all. A `403` means the token _was_ accepted and the request then failed an access check — a different problem with a different fix.
|
|
248
|
+
|
|
249
|
+
| Symptom | Likely cause |
|
|
250
|
+
| ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
251
|
+
| `401` on every call, immediately after minting | Token minted against a different app URL. It is audience-bound to `{appUrl}/mcp`; mint it against the app you are calling. |
|
|
252
|
+
| `401` that started working and then stopped | Expired (check `--ttl-days`) or revoked. Check `list-org-service-tokens` with `includeRevoked: true`. |
|
|
253
|
+
| `403` on a data action | The identity is not scoped to the org that owns the row. Confirm the token was minted with an active org, and that the row is org-scoped rather than owned by a person. |
|
|
254
|
+
| `403` on a data action from a service token only | The app authorizes with its own `org_members` role lookup and has not adopted `implicitServiceOrgRole` from `@agent-native/core/org`, so the synthetic identity resolves no role. |
|
|
255
|
+
| `403` on `create-org-service-token` / `revoke-org-service-token` | The caller is an org `member`, or is a service token. Minting and revoking require a human owner/admin. |
|
|
256
|
+
| `403` from browser JavaScript, but curl works | Cross-origin browser call from an origin that is not allowlisted. See [CSRF and CORS](#csrf-cors). |
|
|
257
|
+
| `405` with a method you did not expect | The action declares `http: { method: "GET" }`. Send args as query params, not a JSON body. |
|
|
258
|
+
| `404` | Wrong action id, an `http: { path: "..." }` override, or `http: false`. |
|
|
259
|
+
|
|
260
|
+
## What's next {#related-docs}
|
|
261
|
+
|
|
262
|
+
- [**Actions**](/docs/actions) — define the operation once; HTTP, MCP, A2A, CLI, and the UI all call the same one
|
|
263
|
+
- [**Authentication**](/docs/authentication) — session auth, orgs, and static `ACCESS_TOKEN` bearers
|
|
264
|
+
- [**MCP Server**](/docs/mcp-protocol) — the tool-catalog surface these tokens are audience-bound to
|
|
265
|
+
- [**A2A Protocol**](/docs/a2a-protocol) — agent-to-agent delegation between agent-native apps
|
|
266
|
+
- [**Security**](/docs/security) — data scoping, access guards, and secret handling
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: "Syncing Template Changes"
|
|
3
|
+
description: "agent-native template pulls later upstream first-party template changes into an app that was generated from a template, using a real per-file three-way merge against a pristine baseline."
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Syncing Template Changes
|
|
7
|
+
|
|
8
|
+
`agent-native create` copies a first-party template into your app and then makes it yours — substituting the app name, renaming `_gitignore`, rewriting `package.json`, pinning `workspace:*` and `catalog:` dependencies to concrete versions, and (in a workspace) swapping in inherited auth and chat plugins. From that moment the app is a fork. Fixes and improvements that land in the template upstream do not reach it.
|
|
9
|
+
|
|
10
|
+
`agent-native upgrade` does not close that gap. It moves package versions, runs import codemods, and refreshes skill directories — it never touches a file that was copied out of a template.
|
|
11
|
+
|
|
12
|
+
`agent-native template` is the missing half. It re-fetches the template at a newer version, re-applies the exact transforms `create` applied, and merges the result into your app file by file.
|
|
13
|
+
|
|
14
|
+
## Quick start {#quick-start}
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
agent-native upgrade
|
|
18
|
+
agent-native template sync
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
`sync` defaults to the template version matching your installed `@agent-native/core`, so running it after `upgrade` keeps code and packages on the same version.
|
|
22
|
+
|
|
23
|
+
Look before you merge:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
agent-native template status
|
|
27
|
+
agent-native template diff
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## How the merge works {#how-the-merge-works}
|
|
31
|
+
|
|
32
|
+
A useful merge needs three trees, not two:
|
|
33
|
+
|
|
34
|
+
- **base** — the pristine template as it was when your app was generated.
|
|
35
|
+
- **theirs** — the same template at the version you are syncing to, put through the same transform pipeline.
|
|
36
|
+
- **ours** — your app as it stands now.
|
|
37
|
+
|
|
38
|
+
With those, every file falls into a clear case. Upstream did not touch it, so it is left alone. You never touched it, so it fast-forwards. Both of you changed it, so it gets conflict markers. Nothing is overwritten just because it differs.
|
|
39
|
+
|
|
40
|
+
Without a base, "sync" can only mean overwrite, which silently discards your work or reverts upstream's.
|
|
41
|
+
|
|
42
|
+
## The baseline {#the-baseline}
|
|
43
|
+
|
|
44
|
+
The base tree is stored as a git ref in your own repo:
|
|
45
|
+
|
|
46
|
+
```txt
|
|
47
|
+
refs/agent-native/template-baseline/apps/slides
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
It is written with git plumbing against a throwaway index file. Your `HEAD`, your branch, your index, and your working tree are never touched — running `template baseline` mid-edit is safe, and `git status` reads identically before and after.
|
|
51
|
+
|
|
52
|
+
On first write, the fetch and push refspecs for `refs/agent-native/*` are added to your remote so the baseline survives a clone. If the app is not in a git repo, the baseline falls back to a tarball under `.agent-native/`.
|
|
53
|
+
|
|
54
|
+
Apps generated before provenance existed have no baseline. Create one, then sync:
|
|
55
|
+
|
|
56
|
+
```bash
|
|
57
|
+
agent-native template baseline
|
|
58
|
+
agent-native template sync
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Provenance {#provenance}
|
|
62
|
+
|
|
63
|
+
`create` records what a later merge needs in the app's `package.json`:
|
|
64
|
+
|
|
65
|
+
```json
|
|
66
|
+
{
|
|
67
|
+
"agent-native": {
|
|
68
|
+
"scaffold": {
|
|
69
|
+
"template": "slides",
|
|
70
|
+
"frameworkSkills": "default",
|
|
71
|
+
"templateRef": "@agent-native/core@0.120.3",
|
|
72
|
+
"templateSource": "github",
|
|
73
|
+
"coreVersion": "0.120.3",
|
|
74
|
+
"shape": "workspace"
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
`templateRef` is the immutable tag the template was actually fetched from, which is what makes the base reproducible. `shape` decides whether the workspace transforms are replayed during materialization.
|
|
81
|
+
|
|
82
|
+
## Commands {#commands}
|
|
83
|
+
|
|
84
|
+
### status {#status}
|
|
85
|
+
|
|
86
|
+
```bash
|
|
87
|
+
agent-native template status [app]
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Reports the recorded ref, the latest available ref, whether a baseline exists, how many files upstream changed, and how many you have modified locally.
|
|
91
|
+
|
|
92
|
+
### diff {#diff}
|
|
93
|
+
|
|
94
|
+
```bash
|
|
95
|
+
agent-native template diff [app] [--to <ref>]
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
A read-only unified diff of what changed upstream between your baseline and the target. Writes nothing.
|
|
99
|
+
|
|
100
|
+
### sync {#sync}
|
|
101
|
+
|
|
102
|
+
```bash
|
|
103
|
+
agent-native template sync [app] [--to <ref>] [--dry-run] [--force]
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
Performs the merge. `--to` defaults to the ref matching the installed core. `--dry-run` prints the plan without writing.
|
|
107
|
+
|
|
108
|
+
`sync` refuses to run when the app directory has uncommitted changes, so a bad merge is always recoverable with `git checkout`. `--force` overrides this; prefer committing first.
|
|
109
|
+
|
|
110
|
+
When the merge is clean, the baseline advances automatically. When there are conflicts it deliberately does not — see `accept`.
|
|
111
|
+
|
|
112
|
+
### accept {#accept}
|
|
113
|
+
|
|
114
|
+
```bash
|
|
115
|
+
agent-native template accept [app]
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
Advances the baseline after you resolve conflict markers. It refuses while any `<<<<<<<` remains, so the baseline can never move past an unresolved merge and quietly bake conflict markers into your next base.
|
|
119
|
+
|
|
120
|
+
### baseline {#baseline}
|
|
121
|
+
|
|
122
|
+
```bash
|
|
123
|
+
agent-native template baseline [app] [--ref <ref>] [--template <name>]
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
Records a baseline for an app that predates scaffold provenance. Pass `--ref` when you know which version the app actually came from; the closer it is to the truth, the fewer phantom conflicts the first sync produces.
|
|
127
|
+
|
|
128
|
+
## What is never merged {#what-is-never-merged}
|
|
129
|
+
|
|
130
|
+
Some files are yours by definition, and some cannot be merged meaningfully:
|
|
131
|
+
|
|
132
|
+
- Secrets and local config: `.env`, `.env.local`
|
|
133
|
+
- Lockfiles: `pnpm-lock.yaml`
|
|
134
|
+
- Generated output: `node_modules`, `.output`, `.react-router`, `dist`, `build`
|
|
135
|
+
- App-owned content: `learnings.md`, pending entries under `changelog/`
|
|
136
|
+
|
|
137
|
+
Binary files are never marker-merged. If both sides changed one, your copy is kept and the file is reported for manual handling. Symlinks are reported rather than clobbered.
|
|
138
|
+
|
|
139
|
+
## Contributing changes back {#contributing-changes-back}
|
|
140
|
+
|
|
141
|
+
Syncing is one-directional by design: upstream is the source of truth for template content, and the transforms `create` applies are not perfectly reversible. Recovering `{{APP_NAME}}` from a concrete app name is a guess, and files that `create` rewrote wholesale — `package.json`, `netlify.toml`, `app/root.tsx`, `server/plugins/auth.ts` — have no faithful inverse at all.
|
|
142
|
+
|
|
143
|
+
If you are working inside the framework monorepo and want to push an app-side improvement back into a template, the `contribute:template` script does the reverse pass with those limits made explicit:
|
|
144
|
+
|
|
145
|
+
```bash
|
|
146
|
+
pnpm contribute:template --app <path-to-app> --dry-run
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
It diffs your app against its baseline so only your own changes are candidates, inverts the placeholder substitution on just those files, three-way merges them into `templates/<name>/` as unstaged edits on the current branch, and prints everything it refused to touch so you can port the intent by hand.
|
|
150
|
+
|
|
151
|
+
## Relationship to other commands {#relationship-to-other-commands}
|
|
152
|
+
|
|
153
|
+
| Command | Moves |
|
|
154
|
+
| ---------------------------- | -------------------------------------------------------------- |
|
|
155
|
+
| `agent-native upgrade` | `@agent-native/*` package versions, imports, skill directories |
|
|
156
|
+
| `agent-native template sync` | files copied out of a template at scaffold time |
|
|
157
|
+
| `agent-native eject` | a framework component into app-owned source, with provenance |
|
|
158
|
+
|
|
159
|
+
`upgrade` and `template sync` are complementary and safe to run together. `eject` is the opposite move — it takes ownership of a file deliberately, and ejected files are tracked separately in `agent-native.ejections.json`.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@agent-native/core",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.122.0",
|
|
4
4
|
"description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
|
|
5
5
|
"homepage": "https://github.com/BuilderIO/agent-native#readme",
|
|
6
6
|
"bugs": {
|
|
@@ -139,6 +139,7 @@
|
|
|
139
139
|
"./client/AgentPanel": "./dist/client/AgentPanel.js",
|
|
140
140
|
"./client/application-state": "./dist/client/application-state.js",
|
|
141
141
|
"./client/api-path": "./dist/client/api-path.js",
|
|
142
|
+
"./client/clipboard": "./dist/client/clipboard.js",
|
|
142
143
|
"./client/route-state": "./dist/client/route-state.js",
|
|
143
144
|
"./client/observability": "./dist/client/observability/index.js",
|
|
144
145
|
"./client/onboarding": "./dist/client/onboarding/index.js",
|
|
@@ -389,8 +390,8 @@
|
|
|
389
390
|
"y-protocols": "^1.0.7",
|
|
390
391
|
"yjs": "^13.6.31",
|
|
391
392
|
"zod": "^4.3.6",
|
|
392
|
-
"@agent-native/
|
|
393
|
-
"@agent-native/
|
|
393
|
+
"@agent-native/toolkit": "^0.10.6",
|
|
394
|
+
"@agent-native/recap-cli": "0.5.1"
|
|
394
395
|
},
|
|
395
396
|
"devDependencies": {
|
|
396
397
|
"@ai-sdk/anthropic": "^3.0.71",
|