@agent-native/core 0.114.16 → 0.115.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/agent-native.eject.json +2 -0
- package/corpus/README.md +3 -3
- package/corpus/core/CHANGELOG.md +29 -0
- package/corpus/core/agent-native.eject.json +2 -0
- package/corpus/core/docs/content/agent-native-toolkit.mdx +16 -0
- package/corpus/core/docs/content/recurring-jobs.mdx +35 -6
- package/corpus/core/export-snapshot.json +4 -0
- package/corpus/core/package.json +5 -1
- package/corpus/core/src/action.ts +22 -1
- package/corpus/core/src/agent/production-agent.ts +105 -3
- package/corpus/core/src/cli/templates-meta.ts +12 -0
- package/corpus/core/src/client/AssistantChat.tsx +53 -26
- package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
- package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
- package/corpus/core/src/client/chat/message-components.tsx +35 -1
- package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
- package/corpus/core/src/connections/catalog.ts +20 -1
- package/corpus/core/src/connections/reader.ts +65 -0
- package/corpus/core/src/dashboard-storage/index.ts +27 -0
- package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
- package/corpus/core/src/dashboard-storage/schema.ts +62 -0
- package/corpus/core/src/dashboard-storage/store.ts +333 -0
- package/corpus/core/src/deploy/build.ts +95 -16
- package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
- package/corpus/core/src/eject/workspace-connections.ts +1 -0
- package/corpus/core/src/extensions/actions.ts +199 -73
- package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
- package/corpus/core/src/jobs/scheduler.ts +71 -4
- package/corpus/core/src/jobs/tools.ts +31 -1
- package/corpus/core/src/localization/default-messages.ts +1 -0
- package/corpus/core/src/mcp-client/index.ts +6 -0
- package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
- package/corpus/core/src/provider-api/index.ts +190 -5
- package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
- package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
- package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
- package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
- package/corpus/core/src/server/core-routes-plugin.ts +1 -0
- package/corpus/core/src/server/credential-provider.ts +9 -3
- package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
- package/corpus/core/src/styles/agent-native.css +45 -2
- package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
- package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
- package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
- package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
- package/corpus/core/src/triggers/actions.ts +11 -2
- package/corpus/core/src/triggers/dispatcher.ts +20 -1
- package/corpus/core/src/triggers/types.ts +5 -0
- package/corpus/core/src/vite/action-types-plugin.ts +9 -1
- package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/analytics/AGENTS.md +11 -11
- package/corpus/templates/analytics/_gitignore +39 -0
- package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
- package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
- package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
- package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
- package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
- package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
- package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
- package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
- package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/calendar/_gitignore +39 -0
- package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/templates/chat/AGENTS.md +1 -1
- package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/clips/AGENTS.md +7 -0
- package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
- package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
- package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
- package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
- package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
- package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
- package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
- package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
- package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
- package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
- package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/content/_gitignore +39 -0
- package/corpus/templates/content/learnings.defaults.md +5 -0
- package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
- package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
- package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
- package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
- package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
- package/corpus/templates/crm/.env.example +5 -0
- package/corpus/templates/crm/AGENTS.md +120 -0
- package/corpus/templates/crm/CHANGELOG.md +1 -0
- package/corpus/templates/crm/DEVELOPING.md +66 -0
- package/corpus/templates/crm/README.md +106 -0
- package/corpus/templates/crm/_gitignore +12 -0
- package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
- package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
- package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
- package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -0
- package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
- package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
- package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
- package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
- package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
- package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
- package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
- package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -0
- package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
- package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
- package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
- package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
- package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
- package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
- package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
- package/corpus/templates/crm/actions/list-crm-proposals.ts +31 -0
- package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
- package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -0
- package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
- package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
- package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
- package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
- package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
- package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
- package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
- package/corpus/templates/crm/actions/navigate.ts +63 -0
- package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
- package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
- package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
- package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
- package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
- package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
- package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
- package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
- package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
- package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
- package/corpus/templates/crm/actions/run.ts +11 -0
- package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
- package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
- package/corpus/templates/crm/actions/sync-crm.ts +146 -0
- package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
- package/corpus/templates/crm/actions/view-screen.ts +218 -0
- package/corpus/templates/crm/agent-native.app-skill.json +58 -0
- package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
- package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
- package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
- package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
- package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
- package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
- package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
- package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
- package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
- package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
- package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
- package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
- package/corpus/templates/crm/app/entry.client.tsx +16 -0
- package/corpus/templates/crm/app/entry.server.tsx +10 -0
- package/corpus/templates/crm/app/global.css +167 -0
- package/corpus/templates/crm/app/hooks/use-navigation-state.ts +60 -0
- package/corpus/templates/crm/app/i18n/en-US.ts +89 -0
- package/corpus/templates/crm/app/i18n/index.ts +34 -0
- package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
- package/corpus/templates/crm/app/lib/navigation.ts +54 -0
- package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
- package/corpus/templates/crm/app/lib/types.ts +172 -0
- package/corpus/templates/crm/app/lib/utils.ts +1 -0
- package/corpus/templates/crm/app/root.tsx +88 -0
- package/corpus/templates/crm/app/routes/_index.tsx +26 -0
- package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
- package/corpus/templates/crm/app/routes/agent.tsx +5 -0
- package/corpus/templates/crm/app/routes/ask.tsx +53 -0
- package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
- package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
- package/corpus/templates/crm/app/routes/people.tsx +41 -0
- package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
- package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
- package/corpus/templates/crm/app/routes/settings.tsx +63 -0
- package/corpus/templates/crm/app/routes/setup.tsx +308 -0
- package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
- package/corpus/templates/crm/app/routes/views.tsx +333 -0
- package/corpus/templates/crm/app/routes.ts +17 -0
- package/corpus/templates/crm/app/vite-env.d.ts +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
- package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
- package/corpus/templates/crm/components.json +20 -0
- package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
- package/corpus/templates/crm/learnings.defaults.md +5 -0
- package/corpus/templates/crm/package.json +59 -0
- package/corpus/templates/crm/public/favicon.svg +1 -0
- package/corpus/templates/crm/public/icon-180.svg +1 -0
- package/corpus/templates/crm/public/manifest.json +11 -0
- package/corpus/templates/crm/react-router.config.ts +7 -0
- package/corpus/templates/crm/server/crm/adapter.ts +32 -0
- package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
- package/corpus/templates/crm/server/crm/crm-mirror.ts +711 -0
- package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
- package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -0
- package/corpus/templates/crm/server/crm/read-through.ts +207 -0
- package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
- package/corpus/templates/crm/server/db/crm-store.ts +1170 -0
- package/corpus/templates/crm/server/db/index.ts +169 -0
- package/corpus/templates/crm/server/db/schema.ts +441 -0
- package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
- package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
- package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +100 -0
- package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
- package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -0
- package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
- package/corpus/templates/crm/server/middleware/auth.ts +4 -0
- package/corpus/templates/crm/server/plugins/agent-chat.ts +68 -0
- package/corpus/templates/crm/server/plugins/auth.ts +14 -0
- package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
- package/corpus/templates/crm/server/plugins/db.ts +454 -0
- package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
- package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
- package/corpus/templates/crm/shared/crm-contract.ts +254 -0
- package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
- package/corpus/templates/crm/ssr-entry.ts +11 -0
- package/corpus/templates/crm/tsconfig.json +24 -0
- package/corpus/templates/crm/vite.config.ts +15 -0
- package/corpus/templates/crm/vitest.config.ts +5 -0
- package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/forms/_gitignore +39 -0
- package/corpus/templates/forms/learnings.defaults.md +5 -0
- package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/macros/_gitignore +39 -0
- package/corpus/templates/macros/learnings.defaults.md +5 -0
- package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/mail/_gitignore +39 -0
- package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
- package/corpus/templates/slides/_gitignore +39 -0
- package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/corpus/templates/tasks/_gitignore +39 -0
- package/corpus/toolkit/CHANGELOG.md +12 -0
- package/corpus/toolkit/README.md +30 -0
- package/corpus/toolkit/agent-native.eject.json +33 -0
- package/corpus/toolkit/package.json +15 -1
- package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
- package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
- package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
- package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
- package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
- package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
- package/corpus/toolkit/src/dashboard/index.ts +6 -0
- package/corpus/toolkit/src/index.ts +1 -0
- package/corpus/toolkit/src/ui/calendar.tsx +8 -8
- package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
- package/dist/action.d.ts +14 -1
- package/dist/action.d.ts.map +1 -1
- package/dist/action.js.map +1 -1
- package/dist/agent/production-agent.d.ts +3 -1
- package/dist/agent/production-agent.d.ts.map +1 -1
- package/dist/agent/production-agent.js +83 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/templates-meta.d.ts.map +1 -1
- package/dist/cli/templates-meta.js +12 -0
- package/dist/cli/templates-meta.js.map +1 -1
- package/dist/client/AssistantChat.d.ts +4 -0
- package/dist/client/AssistantChat.d.ts.map +1 -1
- package/dist/client/AssistantChat.js +30 -17
- package/dist/client/AssistantChat.js.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
- package/dist/client/agent-page/AgentJobsTab.js +3 -1
- package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
- package/dist/client/agent-page/use-jobs.d.ts +1 -0
- package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
- package/dist/client/agent-page/use-jobs.js.map +1 -1
- package/dist/client/chat/message-components.d.ts +5 -0
- package/dist/client/chat/message-components.d.ts.map +1 -1
- package/dist/client/chat/message-components.js +17 -1
- package/dist/client/chat/message-components.js.map +1 -1
- package/dist/client/chat/tool-call-display.d.ts +3 -1
- package/dist/client/chat/tool-call-display.d.ts.map +1 -1
- package/dist/client/chat/tool-call-display.js +17 -7
- package/dist/client/chat/tool-call-display.js.map +1 -1
- package/dist/collab/awareness.d.ts +2 -2
- package/dist/collab/awareness.d.ts.map +1 -1
- package/dist/collab/routes.d.ts +1 -1
- package/dist/collab/struct-routes.d.ts +1 -1
- package/dist/connections/catalog.d.ts +17 -3
- package/dist/connections/catalog.d.ts.map +1 -1
- package/dist/connections/catalog.js +16 -1
- package/dist/connections/catalog.js.map +1 -1
- package/dist/connections/reader.d.ts +18 -0
- package/dist/connections/reader.d.ts.map +1 -1
- package/dist/connections/reader.js +41 -0
- package/dist/connections/reader.js.map +1 -1
- package/dist/dashboard-storage/index.d.ts +4 -0
- package/dist/dashboard-storage/index.d.ts.map +1 -0
- package/dist/dashboard-storage/index.js +4 -0
- package/dist/dashboard-storage/index.js.map +1 -0
- package/dist/dashboard-storage/panel-source.d.ts +68 -0
- package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
- package/dist/dashboard-storage/panel-source.js +76 -0
- package/dist/dashboard-storage/panel-source.js.map +1 -0
- package/dist/dashboard-storage/schema.d.ts +562 -0
- package/dist/dashboard-storage/schema.d.ts.map +1 -0
- package/dist/dashboard-storage/schema.js +32 -0
- package/dist/dashboard-storage/schema.js.map +1 -0
- package/dist/dashboard-storage/store.d.ts +62 -0
- package/dist/dashboard-storage/store.d.ts.map +1 -0
- package/dist/dashboard-storage/store.js +227 -0
- package/dist/dashboard-storage/store.js.map +1 -0
- package/dist/deploy/build.d.ts +7 -0
- package/dist/deploy/build.d.ts.map +1 -1
- package/dist/deploy/build.js +78 -14
- package/dist/deploy/build.js.map +1 -1
- package/dist/eject/provider-api-definitions.d.ts +2 -1
- package/dist/eject/provider-api-definitions.d.ts.map +1 -1
- package/dist/eject/provider-api-definitions.js +1 -0
- package/dist/eject/provider-api-definitions.js.map +1 -1
- package/dist/eject/workspace-connections.d.ts.map +1 -1
- package/dist/eject/workspace-connections.js +1 -0
- package/dist/eject/workspace-connections.js.map +1 -1
- package/dist/extensions/actions.d.ts.map +1 -1
- package/dist/extensions/actions.js +165 -67
- package/dist/extensions/actions.js.map +1 -1
- package/dist/file-upload/actions/upload-image.d.ts +1 -1
- package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
- package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
- package/dist/jobs/actions/list-recurring-jobs.js +1 -0
- package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
- package/dist/jobs/scheduler.d.ts +17 -2
- package/dist/jobs/scheduler.d.ts.map +1 -1
- package/dist/jobs/scheduler.js +51 -2
- package/dist/jobs/scheduler.js.map +1 -1
- package/dist/jobs/tools.d.ts.map +1 -1
- package/dist/jobs/tools.js +32 -2
- package/dist/jobs/tools.js.map +1 -1
- package/dist/localization/default-messages.d.ts +1 -0
- package/dist/localization/default-messages.d.ts.map +1 -1
- package/dist/localization/default-messages.js +1 -0
- package/dist/localization/default-messages.js.map +1 -1
- package/dist/mcp-client/index.d.ts +2 -0
- package/dist/mcp-client/index.d.ts.map +1 -1
- package/dist/mcp-client/index.js +5 -0
- package/dist/mcp-client/index.js.map +1 -1
- package/dist/notifications/routes.d.ts +3 -3
- package/dist/observability/routes.d.ts +5 -5
- package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
- package/dist/provider-api/actions/provider-api.d.ts +8 -6
- package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
- package/dist/provider-api/actions/provider-api.js +1 -1
- package/dist/provider-api/actions/provider-api.js.map +1 -1
- package/dist/provider-api/index.d.ts +11 -7
- package/dist/provider-api/index.d.ts.map +1 -1
- package/dist/provider-api/index.js +143 -5
- package/dist/provider-api/index.js.map +1 -1
- package/dist/resources/handlers.d.ts +1 -1
- package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
- package/dist/secrets/register-framework-secrets.js +7 -0
- package/dist/secrets/register-framework-secrets.js.map +1 -1
- package/dist/secrets/routes.d.ts +9 -9
- package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
- package/dist/server/agent-chat/context-tools.js +9 -0
- package/dist/server/agent-chat/context-tools.js.map +1 -1
- package/dist/server/agent-chat/framework-prompts.js +2 -2
- 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 +18 -2
- package/dist/server/agent-chat-plugin.js.map +1 -1
- package/dist/server/core-routes-plugin.d.ts.map +1 -1
- package/dist/server/core-routes-plugin.js +1 -0
- package/dist/server/core-routes-plugin.js.map +1 -1
- package/dist/server/credential-provider.d.ts +4 -3
- package/dist/server/credential-provider.d.ts.map +1 -1
- package/dist/server/credential-provider.js +9 -3
- package/dist/server/credential-provider.js.map +1 -1
- package/dist/server/transcribe-voice.d.ts +1 -1
- package/dist/server/workspace-provider-oauth.d.ts +6 -1
- package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
- package/dist/server/workspace-provider-oauth.js +141 -4
- package/dist/server/workspace-provider-oauth.js.map +1 -1
- package/dist/styles/agent-native.css +45 -2
- package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/chat/AGENTS.md +1 -1
- package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
- package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
- package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
- package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
- package/dist/triggers/actions.d.ts.map +1 -1
- package/dist/triggers/actions.js +10 -2
- package/dist/triggers/actions.js.map +1 -1
- package/dist/triggers/dispatcher.d.ts.map +1 -1
- package/dist/triggers/dispatcher.js +15 -0
- package/dist/triggers/dispatcher.js.map +1 -1
- package/dist/triggers/types.d.ts +5 -0
- package/dist/triggers/types.d.ts.map +1 -1
- package/dist/triggers/types.js.map +1 -1
- package/dist/vite/action-types-plugin.d.ts.map +1 -1
- package/dist/vite/action-types-plugin.js +4 -1
- package/dist/vite/action-types-plugin.js.map +1 -1
- package/docs/content/agent-native-toolkit.mdx +16 -0
- package/docs/content/recurring-jobs.mdx +35 -6
- package/package.json +6 -2
- package/src/action.ts +22 -1
- package/src/agent/production-agent.ts +105 -3
- package/src/cli/templates-meta.ts +12 -0
- package/src/client/AssistantChat.tsx +53 -26
- package/src/client/agent-page/AgentJobsTab.tsx +19 -0
- package/src/client/agent-page/use-jobs.ts +1 -0
- package/src/client/chat/message-components.tsx +35 -1
- package/src/client/chat/tool-call-display.tsx +38 -3
- package/src/connections/catalog.ts +20 -1
- package/src/connections/reader.ts +65 -0
- package/src/dashboard-storage/index.ts +27 -0
- package/src/dashboard-storage/panel-source.ts +168 -0
- package/src/dashboard-storage/schema.ts +62 -0
- package/src/dashboard-storage/store.ts +333 -0
- package/src/deploy/build.ts +95 -16
- package/src/eject/provider-api-definitions.ts +1 -0
- package/src/eject/workspace-connections.ts +1 -0
- package/src/extensions/actions.ts +199 -73
- package/src/jobs/actions/list-recurring-jobs.ts +2 -0
- package/src/jobs/scheduler.ts +71 -4
- package/src/jobs/tools.ts +31 -1
- package/src/localization/default-messages.ts +1 -0
- package/src/mcp-client/index.ts +6 -0
- package/src/provider-api/actions/provider-api.ts +1 -1
- package/src/provider-api/index.ts +190 -5
- package/src/secrets/register-framework-secrets.ts +8 -0
- package/src/server/agent-chat/context-tools.ts +9 -0
- package/src/server/agent-chat/framework-prompts.ts +2 -2
- package/src/server/agent-chat-plugin.ts +22 -2
- package/src/server/core-routes-plugin.ts +1 -0
- package/src/server/credential-provider.ts +9 -3
- package/src/server/workspace-provider-oauth.ts +181 -4
- package/src/styles/agent-native.css +45 -2
- package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/chat/AGENTS.md +1 -1
- package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
- package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
- package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
- package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
- package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
- package/src/triggers/actions.ts +11 -2
- package/src/triggers/dispatcher.ts +20 -1
- package/src/triggers/types.ts +5 -0
- package/src/vite/action-types-plugin.ts +9 -1
- package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
- package/corpus/templates/analytics/server/routes/api/sql-query.post.ts +0 -1
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: app-permissions
|
|
3
|
+
description: >-
|
|
4
|
+
How to enable browser feature permissions (camera, microphone, geolocation,
|
|
5
|
+
screen capture, clipboard, wake-lock) that the framework's default
|
|
6
|
+
Permissions-Policy header blocks. Use when the app must access a device or
|
|
7
|
+
browser capability that is silently failing.
|
|
8
|
+
scope: dev
|
|
9
|
+
metadata:
|
|
10
|
+
internal: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# App Permissions — Enabling Browser Features
|
|
14
|
+
|
|
15
|
+
## Rule
|
|
16
|
+
|
|
17
|
+
When the app needs a browser feature that the default `Permissions-Policy`
|
|
18
|
+
disables, re-enable it for first-party use in
|
|
19
|
+
`server/plugins/permission-policy.ts` — change only the directive the feature
|
|
20
|
+
needs, never weaken the others, and never edit the `@agent-native/*` framework
|
|
21
|
+
package.
|
|
22
|
+
|
|
23
|
+
## Why
|
|
24
|
+
|
|
25
|
+
There are **two independent layers** between the app and a device capability, and
|
|
26
|
+
this skill only touches the first one:
|
|
27
|
+
|
|
28
|
+
1. **The `Permissions-Policy` gate.** This HTTP response header decides whether a
|
|
29
|
+
feature is even available in the document:
|
|
30
|
+
- `feature=()` — disabled everywhere. The JS API fails and **no browser prompt
|
|
31
|
+
is possible**.
|
|
32
|
+
- `feature=(self)` — allowed for same-origin (first-party) code.
|
|
33
|
+
- `feature=*` — allowed including cross-origin iframes.
|
|
34
|
+
2. **The browser's own permission prompt.** The Allow/Block dialog only appears
|
|
35
|
+
when the app's JS actually calls the API (`getUserMedia`,
|
|
36
|
+
`navigator.geolocation.getCurrentPosition`, `getDisplayMedia`, …) **and** the
|
|
37
|
+
gate above allows the feature.
|
|
38
|
+
|
|
39
|
+
So this skill's job is only to **open the gate**. It does not — and cannot —
|
|
40
|
+
grant the permission itself; the user still approves the browser prompt when the
|
|
41
|
+
app calls the API. If the gate is closed, the prompt never even shows and the
|
|
42
|
+
call silently fails, which is the symptom that brings you here.
|
|
43
|
+
|
|
44
|
+
The framework sets this default on every response (via `@agent-native/core`'s
|
|
45
|
+
security-headers middleware, mounted before routes, last-write-wins):
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
camera=*, microphone=(self), geolocation=(), screen-wake-lock=()
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
Note the empty allowlists: `geolocation=()` and `screen-wake-lock=()` are
|
|
52
|
+
disabled document-wide by default. Camera and microphone are already open.
|
|
53
|
+
|
|
54
|
+
## How
|
|
55
|
+
|
|
56
|
+
1. **Locate the plugin.** If `server/plugins/permission-policy.ts` already exists,
|
|
57
|
+
edit its `PERMISSIONS_POLICY` string to add or adjust the directive the feature
|
|
58
|
+
needs. If it does not exist, create it from the template below.
|
|
59
|
+
2. **Change only what's needed.** Start from the framework default string and flip
|
|
60
|
+
only the directive(s) the feature requires — e.g. `geolocation=()` →
|
|
61
|
+
`geolocation=(self)`. Keep every other directive exactly as the default unless
|
|
62
|
+
the feature genuinely needs it relaxed. Prefer `(self)` over `*`; only use `*`
|
|
63
|
+
when a cross-origin iframe must use the feature (the default already does this
|
|
64
|
+
for `camera`).
|
|
65
|
+
3. **Keep the first-request deferral.** The security middleware is registered
|
|
66
|
+
during bootstrap and `Permissions-Policy` is last-write-wins. If this plugin
|
|
67
|
+
called `getH3App(nitroApp).use(...)` at bootstrap time it would register
|
|
68
|
+
*before* the security middleware and be overwritten. Registering inside the
|
|
69
|
+
first `request` hook makes the handler append **after** the security
|
|
70
|
+
middleware, so its value wins. Do not "simplify" this into a bootstrap-time
|
|
71
|
+
`.use()`.
|
|
72
|
+
4. **Typecheck.** Editing server source is a Tier 2 change — run `pnpm typecheck`
|
|
73
|
+
afterward (see `self-modifying-code`).
|
|
74
|
+
|
|
75
|
+
Reference implementation (`server/plugins/permission-policy.ts`):
|
|
76
|
+
|
|
77
|
+
```ts
|
|
78
|
+
import { getH3App } from "@agent-native/core/server";
|
|
79
|
+
import { defineEventHandler, setResponseHeader } from "h3";
|
|
80
|
+
|
|
81
|
+
// Framework default: camera=*, microphone=(self), geolocation=(), screen-wake-lock=()
|
|
82
|
+
// Empty allowlist () disables a feature document-wide (no browser prompt).
|
|
83
|
+
// Re-enable only what the app needs, for first-party (self) use.
|
|
84
|
+
// Registered on first request so this .use() appends AFTER the core
|
|
85
|
+
// security middleware (last write wins for Permissions-Policy).
|
|
86
|
+
const PERMISSIONS_POLICY =
|
|
87
|
+
"camera=*, microphone=(self), geolocation=(self), screen-wake-lock=()";
|
|
88
|
+
|
|
89
|
+
export default (nitroApp: {
|
|
90
|
+
hooks?: { hook?: (name: string, cb: () => void) => void };
|
|
91
|
+
}) => {
|
|
92
|
+
const hook = nitroApp?.hooks?.hook;
|
|
93
|
+
if (typeof hook !== "function") return;
|
|
94
|
+
|
|
95
|
+
let registered = false;
|
|
96
|
+
hook.call(nitroApp.hooks, "request", () => {
|
|
97
|
+
if (registered) return;
|
|
98
|
+
registered = true;
|
|
99
|
+
getH3App(nitroApp).use(
|
|
100
|
+
defineEventHandler((event) => {
|
|
101
|
+
setResponseHeader(event, "Permissions-Policy", PERMISSIONS_POLICY);
|
|
102
|
+
}),
|
|
103
|
+
);
|
|
104
|
+
});
|
|
105
|
+
};
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
## Common directives
|
|
109
|
+
|
|
110
|
+
Map the capability the app needs to the `Permissions-Policy` directive to add:
|
|
111
|
+
|
|
112
|
+
| Capability | Directive | Recommended value |
|
|
113
|
+
| --- | --- | --- |
|
|
114
|
+
| Current location | `geolocation` | `geolocation=(self)` |
|
|
115
|
+
| Camera | `camera` | `camera=*` (framework default) or `camera=(self)` |
|
|
116
|
+
| Microphone | `microphone` | `microphone=(self)` |
|
|
117
|
+
| Screen / tab capture | `display-capture` | `display-capture=(self)` |
|
|
118
|
+
| Keep screen awake | `screen-wake-lock` | `screen-wake-lock=(self)` |
|
|
119
|
+
| Clipboard read/write | `clipboard-read`, `clipboard-write` | `clipboard-read=(self), clipboard-write=(self)` |
|
|
120
|
+
| Fullscreen | `fullscreen` | `fullscreen=(self)` |
|
|
121
|
+
| Motion / orientation sensors | `accelerometer`, `gyroscope`, `magnetometer` | `accelerometer=(self)` (etc.) |
|
|
122
|
+
|
|
123
|
+
Add directives to the comma-separated string; the browser ignores tokens it
|
|
124
|
+
doesn't recognize, so unknown/experimental features degrade gracefully.
|
|
125
|
+
|
|
126
|
+
**Not every capability is governed by `Permissions-Policy`.** The Notifications
|
|
127
|
+
API and Web Push, for example, are gated only by their own browser prompt — they
|
|
128
|
+
need no directive here. For surfacing alerts to the user in-app, see the
|
|
129
|
+
`notifications` skill.
|
|
130
|
+
|
|
131
|
+
## Don't
|
|
132
|
+
|
|
133
|
+
- **Don't edit `@agent-native/*` package files** or the core security-headers
|
|
134
|
+
middleware — Tier 4, off limits (see `self-modifying-code`). Override the header
|
|
135
|
+
from this app-owned plugin instead.
|
|
136
|
+
- **Don't register the handler at bootstrap time.** It will run before the
|
|
137
|
+
security middleware and its header value will be overwritten. Use the first
|
|
138
|
+
`request` hook as shown.
|
|
139
|
+
- **Don't broaden a directive to `*`** when `(self)` is enough — `*` exposes the
|
|
140
|
+
feature to cross-origin iframes.
|
|
141
|
+
- **Don't blanket-enable** features the app doesn't actually use; keep the closed
|
|
142
|
+
directives closed.
|
|
143
|
+
- **Don't add `/api/*` routes or client-side hacks** to work around a blocked
|
|
144
|
+
feature — the fix is the header.
|
|
145
|
+
|
|
146
|
+
## Related Skills
|
|
147
|
+
|
|
148
|
+
- **security** — HTTP response headers and app-level data/access permissions
|
|
149
|
+
(distinct from these browser feature permissions).
|
|
150
|
+
- **self-modifying-code** — editing server source is a Tier 2 change; typecheck
|
|
151
|
+
after and checkpoint with git.
|
|
152
|
+
- **notifications** — user-facing alerts and the Notifications API, which this
|
|
153
|
+
skill does not cover.
|
|
154
|
+
- **adding-a-feature** — the four-area checklist when the capability is part of a
|
|
155
|
+
larger feature.
|
|
@@ -66,6 +66,33 @@ state, auth, and agent-chat runtime contracts. Never edit `node_modules` or
|
|
|
66
66
|
deep-import its private source. Manual copying is only the fallback described by
|
|
67
67
|
an unknown third-party package's add-style blueprint.
|
|
68
68
|
|
|
69
|
+
## Reuse Proven Patterns (rg + cp)
|
|
70
|
+
|
|
71
|
+
Version-matched installed source outranks web docs or memory: it is the exact
|
|
72
|
+
code shipping with this app. `node_modules/@agent-native/core/corpus/templates/`
|
|
73
|
+
holds source for every first-party template, not just the one this app started
|
|
74
|
+
from, so a pattern from the mail template is fair game for a tasks app. Grep
|
|
75
|
+
across it, then copy a whole file as a starting point instead of writing the
|
|
76
|
+
pattern from scratch:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Find how other templates solved a similar problem
|
|
80
|
+
rg -n "drag.*drop|reorder" node_modules/@agent-native/core/corpus/templates
|
|
81
|
+
|
|
82
|
+
# Grab a proven action file as a starting point, then adapt names/schema
|
|
83
|
+
cp node_modules/@agent-native/core/corpus/templates/mail/actions/archive-email.ts \
|
|
84
|
+
actions/archive-item.ts
|
|
85
|
+
|
|
86
|
+
# Read the full framework source behind an API, not just the corpus copy
|
|
87
|
+
rg -n "defineAction" node_modules/@agent-native/core/src/action.ts
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Copying template-level app code (actions, components, skill files) is the
|
|
91
|
+
expected reuse path — templates exist to be forked. This is different from
|
|
92
|
+
copying `core`/`toolkit` **runtime internals**: for those, follow
|
|
93
|
+
`customizing-agent-native`'s configure/compose/eject ladder instead of
|
|
94
|
+
hand-duplicating framework logic.
|
|
95
|
+
|
|
69
96
|
## Useful Slugs
|
|
70
97
|
|
|
71
98
|
| Need | Slugs |
|
|
@@ -66,6 +66,33 @@ state, auth, and agent-chat runtime contracts. Never edit `node_modules` or
|
|
|
66
66
|
deep-import its private source. Manual copying is only the fallback described by
|
|
67
67
|
an unknown third-party package's add-style blueprint.
|
|
68
68
|
|
|
69
|
+
## Reuse Proven Patterns (rg + cp)
|
|
70
|
+
|
|
71
|
+
Version-matched installed source outranks web docs or memory: it is the exact
|
|
72
|
+
code shipping with this app. `node_modules/@agent-native/core/corpus/templates/`
|
|
73
|
+
holds source for every first-party template, not just the one this app started
|
|
74
|
+
from, so a pattern from the mail template is fair game for a tasks app. Grep
|
|
75
|
+
across it, then copy a whole file as a starting point instead of writing the
|
|
76
|
+
pattern from scratch:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Find how other templates solved a similar problem
|
|
80
|
+
rg -n "drag.*drop|reorder" node_modules/@agent-native/core/corpus/templates
|
|
81
|
+
|
|
82
|
+
# Grab a proven action file as a starting point, then adapt names/schema
|
|
83
|
+
cp node_modules/@agent-native/core/corpus/templates/mail/actions/archive-email.ts \
|
|
84
|
+
actions/archive-item.ts
|
|
85
|
+
|
|
86
|
+
# Read the full framework source behind an API, not just the corpus copy
|
|
87
|
+
rg -n "defineAction" node_modules/@agent-native/core/src/action.ts
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Copying template-level app code (actions, components, skill files) is the
|
|
91
|
+
expected reuse path — templates exist to be forked. This is different from
|
|
92
|
+
copying `core`/`toolkit` **runtime internals**: for those, follow
|
|
93
|
+
`customizing-agent-native`'s configure/compose/eject ladder instead of
|
|
94
|
+
hand-duplicating framework logic.
|
|
95
|
+
|
|
69
96
|
## Useful Slugs
|
|
70
97
|
|
|
71
98
|
| Need | Slugs |
|
|
@@ -227,25 +227,29 @@ extension content:
|
|
|
227
227
|
{ "name": "My Dashboard", "contentFromAttachment": "latest" }
|
|
228
228
|
```
|
|
229
229
|
|
|
230
|
-
`update-extension` accepts the same `contentFromAttachment`
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
`
|
|
234
|
-
|
|
230
|
+
`update-extension` accepts the same `contentFromAttachment` inside its compact
|
|
231
|
+
`payloadJson` string for a full-body replacement. Use `operation: "replace"`;
|
|
232
|
+
that explicit operation is the safety acknowledgement for a broad rewrite.
|
|
233
|
+
Inline `content` still works inside `payloadJson` for everything you author
|
|
234
|
+
yourself — use `contentFromAttachment` only to avoid regurgitating something
|
|
235
|
+
the user already pasted.
|
|
235
236
|
|
|
236
237
|
## Editing an extension
|
|
237
238
|
|
|
238
|
-
Use the `update-extension` action
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
239
|
+
Use the `update-extension` action with exactly `id`, `operation`, and
|
|
240
|
+
`payloadJson`. The payload is encoded as a JSON string so model gateways cannot
|
|
241
|
+
fill every optional field with empty placeholders. Prefer `operation: "edit"`
|
|
242
|
+
with granular `edits` inside `payloadJson` for surgical changes instead of
|
|
243
|
+
regenerating the full HTML. For medium/large extensions, add stable section
|
|
244
|
+
comments around major blocks so future agents can target them without touching
|
|
245
|
+
unrelated indentation:
|
|
242
246
|
|
|
243
247
|
For data-only repairs, preserve the existing layout, CSS, copy, and
|
|
244
248
|
interactions. Do not reconstruct and submit the entire body. The action and
|
|
245
|
-
store reject full-body replacement
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
+
store reject implicit full-body replacement; choose `operation: "replace"`
|
|
250
|
+
only for a user-requested visual rewrite or complete replacement body. If a
|
|
251
|
+
focused edit fails, inspect the current body and adjust its target; do not retry
|
|
252
|
+
unchanged arguments.
|
|
249
253
|
|
|
250
254
|
```html
|
|
251
255
|
<!-- agent-native:section npm-daily-chart -->
|
|
@@ -258,8 +262,8 @@ Then update just that section:
|
|
|
258
262
|
```json
|
|
259
263
|
{
|
|
260
264
|
"id": "EXTENSION_ID",
|
|
261
|
-
"
|
|
262
|
-
"format":
|
|
265
|
+
"operation": "edit",
|
|
266
|
+
"payloadJson": "{\"edits\":[{\"op\":\"replace-section\",\"section\":\"npm-daily-chart\",\"content\":\"<section>...</section>\"}],\"format\":true}"
|
|
263
267
|
}
|
|
264
268
|
```
|
|
265
269
|
|
|
@@ -278,9 +282,8 @@ Supported `edits` operations:
|
|
|
278
282
|
|
|
279
283
|
Use `expectedMatches` when ambiguity would be dangerous. Missing required
|
|
280
284
|
targets fail instead of silently doing nothing. Pass `format: true` to run
|
|
281
|
-
Prettier on the final HTML after the patch. Full `content` replacement
|
|
282
|
-
|
|
283
|
-
supplied.
|
|
285
|
+
Prettier on the final HTML after the patch. Full `content` replacement remains
|
|
286
|
+
available for broad rewrites through `operation: "replace"`.
|
|
284
287
|
|
|
285
288
|
Legacy `patches` still work for simple literal replacements:
|
|
286
289
|
|
|
@@ -304,6 +307,16 @@ PUT /_agent-native/extensions/:id
|
|
|
304
307
|
{ "content": "full new HTML", "allowFullReplacement": true }
|
|
305
308
|
```
|
|
306
309
|
|
|
310
|
+
For the agent action, use the compact form instead:
|
|
311
|
+
|
|
312
|
+
```json
|
|
313
|
+
{
|
|
314
|
+
"id": "EXTENSION_ID",
|
|
315
|
+
"operation": "replace",
|
|
316
|
+
"payloadJson": "{\"content\":\"full new HTML\"}"
|
|
317
|
+
}
|
|
318
|
+
```
|
|
319
|
+
|
|
307
320
|
## History and rollback
|
|
308
321
|
|
|
309
322
|
Extensions keep a snapshot history in SQL. A version is recorded when an
|
|
@@ -21,6 +21,21 @@ Recurring jobs are scheduled tasks the agent executes automatically on a cron sc
|
|
|
21
21
|
3. A scheduler polls every 60 seconds, finds due jobs, and executes them via `runAgentLoop`
|
|
22
22
|
4. Job results are saved as chat threads
|
|
23
23
|
|
|
24
|
+
## Connected MCPs in background jobs
|
|
25
|
+
|
|
26
|
+
Jobs can use connected remote MCPs with the same server-side OAuth lifecycle as
|
|
27
|
+
interactive chat. When creating a job that needs an MCP, bind the exact
|
|
28
|
+
advertised `mcp__<server>__<tool>` names through `mcpTools`. The scheduler
|
|
29
|
+
resolves only that allowlist under the job's persisted user/org request
|
|
30
|
+
context; it never stores or exposes OAuth tokens, URLs, or arbitrary proxy
|
|
31
|
+
targets. A revoked connector or missing tool fails the run clearly instead of
|
|
32
|
+
silently widening access.
|
|
33
|
+
|
|
34
|
+
Use an app-owned bounded import/upsert action for writes. Keep provider-specific
|
|
35
|
+
response mapping, provenance, deduplication, and write policy in the app rather
|
|
36
|
+
than in core. For example, a job can read meeting notes from any connected MCP
|
|
37
|
+
and pass normalized action items to an app's idempotent `import` action.
|
|
38
|
+
|
|
24
39
|
## Job Tool (built in)
|
|
25
40
|
|
|
26
41
|
| Tool | Action | Purpose |
|
|
@@ -124,6 +124,7 @@ async function handleDefine(
|
|
|
124
124
|
condition: args.condition || undefined,
|
|
125
125
|
mode: "agentic",
|
|
126
126
|
domain: args.domain || undefined,
|
|
127
|
+
delegatedPolicyId: args.delegated_policy_id || undefined,
|
|
127
128
|
createdBy: owner,
|
|
128
129
|
runAs: "creator",
|
|
129
130
|
};
|
|
@@ -163,6 +164,9 @@ async function handleUpdate(
|
|
|
163
164
|
if (args.condition !== undefined) {
|
|
164
165
|
meta.condition = args.condition || undefined;
|
|
165
166
|
}
|
|
167
|
+
if (args.delegated_policy_id !== undefined) {
|
|
168
|
+
meta.delegatedPolicyId = args.delegated_policy_id || undefined;
|
|
169
|
+
}
|
|
166
170
|
const newBody = args.body ?? body;
|
|
167
171
|
|
|
168
172
|
await resourcePut(
|
|
@@ -235,8 +239,8 @@ export function createAutomationToolEntries(
|
|
|
235
239
|
|
|
236
240
|
- **list-events**: List all registered event types that automations can subscribe to. Returns event names, descriptions, and payload schemas. Call this BEFORE defining an automation to discover available events.
|
|
237
241
|
- **list**: List all automations (triggers). Shows name, event, condition, mode, status, and domain. Optional params: domain, enabled_only.
|
|
238
|
-
- **define**: Create a new automation. IMPORTANT: Always confirm with the user before calling — show them a summary of what will be created. Required params: name, trigger_type, body. Optional: event, schedule, condition, mode, domain.
|
|
239
|
-
- **update**: Update an existing automation's settings (enabled, condition, body, etc.). Required param: name.
|
|
242
|
+
- **define**: Create a new automation. IMPORTANT: Always confirm with the user before calling — show them a summary of what will be created. Required params: name, trigger_type, body. Optional: event, schedule, condition, mode, domain, delegated_policy_id.
|
|
243
|
+
- **update**: Update an existing automation's settings (enabled, condition, body, delegated_policy_id, etc.). Required param: name.
|
|
240
244
|
- **delete**: Delete an automation. Always confirm with the user first. Required param: name.
|
|
241
245
|
- **fire-test**: Fire a test event to validate automations. Emits a test.event.fired event. Optional param: data (JSON string).`,
|
|
242
246
|
parameters: {
|
|
@@ -284,6 +288,11 @@ export function createAutomationToolEntries(
|
|
|
284
288
|
description:
|
|
285
289
|
"Domain tag for grouping (mail, calendar, clips, etc.). Used by define and list.",
|
|
286
290
|
},
|
|
291
|
+
delegated_policy_id: {
|
|
292
|
+
type: "string",
|
|
293
|
+
description:
|
|
294
|
+
"Optional app-owned stored policy id. It is passed by the trusted trigger runtime, never as action input. Only use an id documented by the app.",
|
|
295
|
+
},
|
|
287
296
|
body: {
|
|
288
297
|
type: "string",
|
|
289
298
|
description:
|
|
@@ -94,6 +94,9 @@ export function parseTriggerFrontmatter(content: string): {
|
|
|
94
94
|
case "domain":
|
|
95
95
|
meta.domain = value;
|
|
96
96
|
break;
|
|
97
|
+
case "delegatedPolicyId":
|
|
98
|
+
meta.delegatedPolicyId = value || undefined;
|
|
99
|
+
break;
|
|
97
100
|
case "createdBy":
|
|
98
101
|
meta.createdBy = value;
|
|
99
102
|
break;
|
|
@@ -135,6 +138,16 @@ export function buildTriggerContent(
|
|
|
135
138
|
lines.push(`condition: "${meta.condition.replace(/"/g, '\\"')}"`);
|
|
136
139
|
lines.push(`mode: ${meta.mode}`);
|
|
137
140
|
if (meta.domain) lines.push(`domain: ${meta.domain}`);
|
|
141
|
+
if (
|
|
142
|
+
meta.delegatedPolicyId &&
|
|
143
|
+
!/^[a-z0-9][a-z0-9._:-]{0,127}$/i.test(meta.delegatedPolicyId)
|
|
144
|
+
) {
|
|
145
|
+
throw new Error(
|
|
146
|
+
"Delegated automation policy IDs must be 1-128 letters, numbers, dots, underscores, colons, or hyphens.",
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
if (meta.delegatedPolicyId)
|
|
150
|
+
lines.push(`delegatedPolicyId: ${meta.delegatedPolicyId}`);
|
|
138
151
|
if (meta.createdBy) lines.push(`createdBy: ${meta.createdBy}`);
|
|
139
152
|
if (meta.orgId) lines.push(`orgId: ${meta.orgId}`);
|
|
140
153
|
if (meta.runAs) lines.push(`runAs: ${meta.runAs}`);
|
|
@@ -360,7 +373,7 @@ async function isTriggerRunAsStillValid(
|
|
|
360
373
|
}
|
|
361
374
|
|
|
362
375
|
async function dispatchAgentic(
|
|
363
|
-
resource: { path: string; owner: string; content: string },
|
|
376
|
+
resource: { id: string; path: string; owner: string; content: string },
|
|
364
377
|
meta: TriggerFrontmatter,
|
|
365
378
|
body: string,
|
|
366
379
|
payload: unknown,
|
|
@@ -483,6 +496,12 @@ ${body}`;
|
|
|
483
496
|
send: (event) => events.push(event),
|
|
484
497
|
signal: controller.signal,
|
|
485
498
|
threadId: thread.id,
|
|
499
|
+
actionCaller: "automation",
|
|
500
|
+
automation: {
|
|
501
|
+
triggerId: resource.id,
|
|
502
|
+
triggerName,
|
|
503
|
+
policyId: meta.delegatedPolicyId,
|
|
504
|
+
},
|
|
486
505
|
});
|
|
487
506
|
} finally {
|
|
488
507
|
clearTimeout(timeout);
|
|
@@ -25,6 +25,11 @@ export interface TriggerFrontmatter {
|
|
|
25
25
|
mode: "agentic" | "deterministic";
|
|
26
26
|
/** Domain tag for filtering in per-template UIs. */
|
|
27
27
|
domain?: string;
|
|
28
|
+
/**
|
|
29
|
+
* Optional application-owned policy id carried into actions by the trusted
|
|
30
|
+
* trigger dispatcher. It is not model-supplied action input.
|
|
31
|
+
*/
|
|
32
|
+
delegatedPolicyId?: string;
|
|
28
33
|
createdBy?: string;
|
|
29
34
|
orgId?: string;
|
|
30
35
|
runAs?: "creator" | "shared";
|
|
@@ -187,7 +187,15 @@ function scanActionFiles(actionsDir: string): string[] {
|
|
|
187
187
|
const content = fs.readFileSync(path.join(actionsDir, f), "utf-8");
|
|
188
188
|
const reexportsDefaultAction =
|
|
189
189
|
/export\s*\{\s*default\s*\}\s*from\s*["'][^"']+["']/.test(content);
|
|
190
|
-
|
|
190
|
+
const exportsActionFactory =
|
|
191
|
+
/export\s+default\s+(?:create[A-Z][A-Za-z0-9]*Action|defineActionFactory)\s*\(/.test(
|
|
192
|
+
content,
|
|
193
|
+
);
|
|
194
|
+
if (
|
|
195
|
+
!content.includes("defineAction") &&
|
|
196
|
+
!reexportsDefaultAction &&
|
|
197
|
+
!exportsActionFactory
|
|
198
|
+
) {
|
|
191
199
|
return false;
|
|
192
200
|
}
|
|
193
201
|
} catch {
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: agent-native-docs
|
|
3
|
+
description: >-
|
|
4
|
+
How to find version-matched Agent Native framework docs and source bundled in
|
|
5
|
+
node_modules. Use before implementing or answering questions about
|
|
6
|
+
@agent-native/core APIs, generated apps, workspaces, templates, or advanced
|
|
7
|
+
features.
|
|
8
|
+
scope: dev
|
|
9
|
+
metadata:
|
|
10
|
+
internal: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# Agent Native Docs Lookup
|
|
14
|
+
|
|
15
|
+
## Rule
|
|
16
|
+
|
|
17
|
+
Before implementing or explaining non-trivial Agent Native behavior, read the
|
|
18
|
+
version-matched docs installed with `@agent-native/core`. When examples,
|
|
19
|
+
imports, or implementation details matter, inspect the packaged source corpus
|
|
20
|
+
too.
|
|
21
|
+
|
|
22
|
+
## Why
|
|
23
|
+
|
|
24
|
+
Generated apps and workspaces may be on a different framework version than the
|
|
25
|
+
public docs or model memory. The installed package is the source that matches
|
|
26
|
+
the app in front of you. It also includes a source-only corpus of core and
|
|
27
|
+
first-party templates so agents can replicate current best-practice patterns
|
|
28
|
+
without needing the framework monorepo checkout.
|
|
29
|
+
|
|
30
|
+
## How
|
|
31
|
+
|
|
32
|
+
From a generated app directory:
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pnpm action docs-search --query "<feature>"
|
|
36
|
+
pnpm action docs-search --slug <slug>
|
|
37
|
+
pnpm action docs-search --list
|
|
38
|
+
pnpm action source-search --query "<pattern>"
|
|
39
|
+
pnpm action source-search --path templates/plan/AGENTS.md
|
|
40
|
+
pnpm action source-search --path toolkit/src/index.ts
|
|
41
|
+
pnpm action source-search --list
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
The headless `pnpm agent` loop and built-in app agent also expose a read-only
|
|
45
|
+
`docs-search` tool with the same `query`, `slug`, and `list` options, plus a
|
|
46
|
+
read-only `source-search` tool with `query`, `path`, and `list`.
|
|
47
|
+
|
|
48
|
+
If the action runner is unavailable, search the package directly:
|
|
49
|
+
|
|
50
|
+
```bash
|
|
51
|
+
rg -n "actions|automations|a2a|sharing" node_modules/@agent-native/core/docs
|
|
52
|
+
rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Then read `node_modules/@agent-native/core/docs/AGENTS.md` or the matching file
|
|
56
|
+
under `node_modules/@agent-native/core/docs/content/`. For source examples,
|
|
57
|
+
read files under `node_modules/@agent-native/core/corpus/core/` or
|
|
58
|
+
`node_modules/@agent-native/core/corpus/templates/`.
|
|
59
|
+
|
|
60
|
+
Toolkit source is searchable at `toolkit/` in the Core corpus and also ships as
|
|
61
|
+
readable TypeScript under `node_modules/@agent-native/toolkit/src/`. Read
|
|
62
|
+
`customizing-agent-native` before taking ownership of a shared component: inspect package
|
|
63
|
+
source as a read-only reference, then configure, compose, or eject the smallest
|
|
64
|
+
supported unit into app-owned source. Preserve public actions, application
|
|
65
|
+
state, auth, and agent-chat runtime contracts. Never edit `node_modules` or
|
|
66
|
+
deep-import its private source. Manual copying is only the fallback described by
|
|
67
|
+
an unknown third-party package's add-style blueprint.
|
|
68
|
+
|
|
69
|
+
## Reuse Proven Patterns (rg + cp)
|
|
70
|
+
|
|
71
|
+
Version-matched installed source outranks web docs or memory: it is the exact
|
|
72
|
+
code shipping with this app. `node_modules/@agent-native/core/corpus/templates/`
|
|
73
|
+
holds source for every first-party template, not just the one this app started
|
|
74
|
+
from, so a pattern from the mail template is fair game for a tasks app. Grep
|
|
75
|
+
across it, then copy a whole file as a starting point instead of writing the
|
|
76
|
+
pattern from scratch:
|
|
77
|
+
|
|
78
|
+
```bash
|
|
79
|
+
# Find how other templates solved a similar problem
|
|
80
|
+
rg -n "drag.*drop|reorder" node_modules/@agent-native/core/corpus/templates
|
|
81
|
+
|
|
82
|
+
# Grab a proven action file as a starting point, then adapt names/schema
|
|
83
|
+
cp node_modules/@agent-native/core/corpus/templates/mail/actions/archive-email.ts \
|
|
84
|
+
actions/archive-item.ts
|
|
85
|
+
|
|
86
|
+
# Read the full framework source behind an API, not just the corpus copy
|
|
87
|
+
rg -n "defineAction" node_modules/@agent-native/core/src/action.ts
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
Copying template-level app code (actions, components, skill files) is the
|
|
91
|
+
expected reuse path — templates exist to be forked. This is different from
|
|
92
|
+
copying `core`/`toolkit` **runtime internals**: for those, follow
|
|
93
|
+
`customizing-agent-native`'s configure/compose/eject ladder instead of
|
|
94
|
+
hand-duplicating framework logic.
|
|
95
|
+
|
|
96
|
+
## Useful Slugs
|
|
97
|
+
|
|
98
|
+
| Need | Slugs |
|
|
99
|
+
| ------------------------------ | ------------------------------------------------------------- |
|
|
100
|
+
| Actions and typed client calls | `actions`, `client` |
|
|
101
|
+
| SQL, auth, access, sharing | `database`, `authentication`, `security`, `sharing` |
|
|
102
|
+
| UI state visible to the agent | `context-awareness` |
|
|
103
|
+
| Headless and chat-first apps | `pure-agent-apps`, `agent-surfaces`, `using-your-agent` |
|
|
104
|
+
| Automations and schedules | `automations`, `recurring-jobs` |
|
|
105
|
+
| Cross-app and external agents | `a2a-protocol`, `external-agents`, `mcp-protocol`, `mcp-apps` |
|
|
106
|
+
| Skills and instructions | `skills-guide`, `writing-agent-instructions` |
|
|
107
|
+
|
|
108
|
+
## Don't
|
|
109
|
+
|
|
110
|
+
- Do not rely on memory for framework APIs when package docs are present.
|
|
111
|
+
- Do not add custom REST wrappers for app data before reading `actions`.
|
|
112
|
+
- Do not add inline LLM calls before reading `using-your-agent` and
|
|
113
|
+
`agent-surfaces`.
|
|
114
|
+
- Do not copy framework runtime internals when a public API or narrow UI copy
|
|
115
|
+
will do; read `customizing-agent-native` for the supported override ladder.
|
|
@@ -211,17 +211,17 @@ membership id when its native update status reports `update-available`.
|
|
|
211
211
|
it as an extension instead and tell the user why.
|
|
212
212
|
- For an existing extension-backed dashboard or migrated surface such as Risk
|
|
213
213
|
Meeting, separate data repair from visual redesign. Inspect the dashboard and
|
|
214
|
-
extension first, then
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
`
|
|
224
|
-
|
|
214
|
+
extension first, then call `update-extension` with exactly `id`,
|
|
215
|
+
`operation: "edit"`, and a `payloadJson` string containing focused
|
|
216
|
+
`patches`/`edits` that touch only the data-loading seam. Never send empty
|
|
217
|
+
placeholder fields. Preserve the existing layout, CSS, copy, and interactions;
|
|
218
|
+
never reconstruct the full HTML body for a data-only fix. A request that
|
|
219
|
+
combines a visual rewrite (for example compacting, removing sections,
|
|
220
|
+
renaming, or changing padding) with a data repair is still a broad rewrite;
|
|
221
|
+
after inspecting the current extension, use `operation: "replace"` with the
|
|
222
|
+
complete replacement body inside `payloadJson`. Use
|
|
223
|
+
`set-resource-visibility` for sharing changes. If a focused edit fails, do not
|
|
224
|
+
retry unchanged arguments.
|
|
225
225
|
- Use framework sharing and access helpers for dashboards, analyses, and saved
|
|
226
226
|
resources.
|
|
227
227
|
- Dashboard email reports live in SQL via the
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
# React Router generated types
|
|
2
|
+
.react-router/
|
|
3
|
+
|
|
4
|
+
# Logs
|
|
5
|
+
logs
|
|
6
|
+
*.log
|
|
7
|
+
npm-debug.log*
|
|
8
|
+
pnpm-debug.log*
|
|
9
|
+
|
|
10
|
+
node_modules
|
|
11
|
+
dist
|
|
12
|
+
dist-ssr
|
|
13
|
+
*.local
|
|
14
|
+
|
|
15
|
+
# Editor directories and files
|
|
16
|
+
.vscode/*
|
|
17
|
+
!.vscode/extensions.json
|
|
18
|
+
.idea
|
|
19
|
+
.DS_Store
|
|
20
|
+
*.suo
|
|
21
|
+
*.ntvs*
|
|
22
|
+
*.njsproj
|
|
23
|
+
*.sln
|
|
24
|
+
*.sw?
|
|
25
|
+
|
|
26
|
+
# Environment
|
|
27
|
+
.env
|
|
28
|
+
.env.*
|
|
29
|
+
!.env.example
|
|
30
|
+
|
|
31
|
+
# Data
|
|
32
|
+
data/uploads/
|
|
33
|
+
data/settings.json
|
|
34
|
+
data/.sessions.json
|
|
35
|
+
|
|
36
|
+
# Learnings (personal preferences and memory — use learnings.defaults.md for tracked defaults)
|
|
37
|
+
learnings.md
|
|
38
|
+
|
|
39
|
+
.vercel/
|