@agent-native/core 0.114.16 → 0.115.3
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 +41 -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 +122 -3
- package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +19 -2
- 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/blocks/library/wireframe.tsx +3 -1
- 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/plan/.agents/skills/visual-plan/SKILL.md +19 -2
- package/corpus/templates/plan/AGENTS.md +10 -0
- package/corpus/templates/plan/actions/create-prototype-plan.ts +27 -3
- package/corpus/templates/plan/actions/get-plan-blocks.ts +1 -1
- package/corpus/templates/plan/actions/update-visual-plan.ts +3 -2
- package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +18 -4
- package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +10 -3
- package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +3 -1
- package/corpus/templates/plan/app/i18n/en-US.ts +6 -0
- package/corpus/templates/plan/app/lib/create-plan-routing.ts +39 -0
- package/corpus/templates/plan/app/pages/PlansPage.tsx +31 -107
- package/corpus/templates/plan/changelog/2026-07-22-high-fidelity-mockup-requests-now-preserve-branded-css-use-d.md +6 -0
- package/corpus/templates/plan/shared/plan-content.ts +110 -2
- 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 +97 -3
- package/dist/agent/production-agent.js.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
- package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
- package/dist/cli/skills-content/visual-plan-skill.js +19 -2
- package/dist/cli/skills-content/visual-plan-skill.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/blocks/library/wireframe.d.ts.map +1 -1
- package/dist/client/blocks/library/wireframe.js +3 -2
- package/dist/client/blocks/library/wireframe.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/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/progress/routes.d.ts +1 -1
- 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/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/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 +7 -3
- package/src/action.ts +22 -1
- package/src/agent/production-agent.ts +122 -3
- package/src/cli/skills-content/visual-plan-skill.ts +19 -2
- 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/blocks/library/wireframe.tsx +3 -1
- 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
|
@@ -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 |
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: app-branding
|
|
3
|
+
description: >-
|
|
4
|
+
How to rename or rebrand the app so every surface — title, package metadata,
|
|
5
|
+
PWA manifest, and icons — stays consistent. Use when a prompt establishes or
|
|
6
|
+
implies a new app name, title, or visual identity, OR when you generate an app
|
|
7
|
+
title, theme, or icon yourself while scaffolding an app from an initial prompt.
|
|
8
|
+
scope: dev
|
|
9
|
+
metadata:
|
|
10
|
+
internal: true
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
# App Branding
|
|
14
|
+
|
|
15
|
+
## Trigger
|
|
16
|
+
|
|
17
|
+
Read this skill whenever the app's name, title, or visual identity is being
|
|
18
|
+
established or changed — whether the user states it or **you derive it yourself**.
|
|
19
|
+
|
|
20
|
+
- **Explicit** — the prompt names the app: "rename this app to …", "this is a
|
|
21
|
+
Todo app called …", "call this app …".
|
|
22
|
+
- **Implicit / agent-generated** — the prompt describes what to build but leaves
|
|
23
|
+
the branding to you: "build me a habit tracker", "turn this into a recipe
|
|
24
|
+
manager", "make a CRM for my studio". The moment you decide on a title, theme
|
|
25
|
+
color, or icon from that prompt, treat it as a branding change and apply the
|
|
26
|
+
full checklist so your generated identity lands on every surface — not just
|
|
27
|
+
the one screen you happen to be building.
|
|
28
|
+
|
|
29
|
+
If you are inventing an app title, theme, or icon as part of scaffolding a new
|
|
30
|
+
app from an initial prompt, that counts — run the checklist in the same pass.
|
|
31
|
+
|
|
32
|
+
## Rule
|
|
33
|
+
|
|
34
|
+
Apply **all** of the updates below in a single consistent pass. Depending on the
|
|
35
|
+
template, the app name may live in one source-of-truth module or be spread
|
|
36
|
+
across several files — either way, a partial rename leaves the app half-branded
|
|
37
|
+
(a stale tab title, launcher label, or icon).
|
|
38
|
+
|
|
39
|
+
Derive three values once, then reuse them everywhere:
|
|
40
|
+
|
|
41
|
+
- **Title** — human-readable display name, e.g. `"My Task App"`.
|
|
42
|
+
- **Slug** — URL/npm-safe form: lowercase letters, digits, and hyphens only,
|
|
43
|
+
e.g. `"my-task-app"`.
|
|
44
|
+
- **Description** — one sentence describing what the app does.
|
|
45
|
+
|
|
46
|
+
## Locate the layout first
|
|
47
|
+
|
|
48
|
+
Branding lives in different places depending on the template. Detect which
|
|
49
|
+
layout you are in before editing:
|
|
50
|
+
|
|
51
|
+
- **Centralized layout** — `app/lib/app-config.ts` exists. It is the single
|
|
52
|
+
source of truth for the name and title; the frontend surfaces (`<title>`,
|
|
53
|
+
route `meta()`, header, sidebar, index heading, `apple-mobile-web-app-title`)
|
|
54
|
+
derive from its `APP_NAME` / `APP_TITLE` exports, so you change the name in one
|
|
55
|
+
place.
|
|
56
|
+
- **Inlined layout** — no `app/lib/app-config.ts`. The name and title are
|
|
57
|
+
written directly into `package.json`, each route's `meta()`, and
|
|
58
|
+
`app/root.tsx`. You must update each surface individually.
|
|
59
|
+
|
|
60
|
+
When in doubt, `grep -rn` the current title and slug across `app/`, `server/`,
|
|
61
|
+
`package.json`, and `public/` and fix every real hit — the two layouts share the
|
|
62
|
+
manifest and icon steps regardless.
|
|
63
|
+
|
|
64
|
+
## The Checklist
|
|
65
|
+
|
|
66
|
+
### Step 1 — App name + title source
|
|
67
|
+
|
|
68
|
+
**Centralized layout** (`app/lib/app-config.ts`): change both constants and stop —
|
|
69
|
+
the rest of the frontend derives from them.
|
|
70
|
+
|
|
71
|
+
- `rawAppName` → the **slug**.
|
|
72
|
+
- `rawAppTitle` → the **title**.
|
|
73
|
+
|
|
74
|
+
**Inlined layout** (no `app-config.ts`): set the title/slug at each surface.
|
|
75
|
+
|
|
76
|
+
- Every route `meta()` title under `app/routes/*.tsx` (e.g. `_index.tsx`,
|
|
77
|
+
`agent.tsx`, `settings.tsx`) — replace the app title. These are seeded from a
|
|
78
|
+
`{{APP_TITLE}}` placeholder at scaffold time and become plain literals
|
|
79
|
+
afterward.
|
|
80
|
+
- Any `useActionQuery("hello", { name: … })` in `app/routes/_index.tsx` seeded
|
|
81
|
+
with the title.
|
|
82
|
+
- `app/root.tsx` `apple-mobile-web-app-title` — a literal (often `"App"`); set it
|
|
83
|
+
to the **title**.
|
|
84
|
+
|
|
85
|
+
### Step 2 — `package.json` (both layouts)
|
|
86
|
+
|
|
87
|
+
- `displayName` → the **title** (add the field if the template omits it).
|
|
88
|
+
- `description` → the **description** (add if absent).
|
|
89
|
+
- `name` → the **slug**. Only change this if the user explicitly asks to rename
|
|
90
|
+
the package (it is the npm package identifier).
|
|
91
|
+
|
|
92
|
+
### Step 3 — Login / auth title (centralized layout only)
|
|
93
|
+
|
|
94
|
+
If `server/plugins/auth.ts` exists it keeps its **own** duplicate `rawAppTitle`,
|
|
95
|
+
used on the login/signup pages. Set it to the same **title** as
|
|
96
|
+
`app/lib/app-config.ts`. (The inlined layout's `server/middleware/auth.ts`
|
|
97
|
+
carries no app title — skip this step there.)
|
|
98
|
+
|
|
99
|
+
### Step 4 — `public/manifest.json` (both layouts)
|
|
100
|
+
|
|
101
|
+
This is a static file (not generated by a plugin). Update:
|
|
102
|
+
|
|
103
|
+
- `name` → the **title** (full install name in OS app drawers).
|
|
104
|
+
- `short_name` → a compact launcher label; keep it ≤12 characters, abbreviating
|
|
105
|
+
the title if needed.
|
|
106
|
+
- `description` → the same **description** used in `package.json`.
|
|
107
|
+
|
|
108
|
+
### Step 5 — Icon SVG files (both layouts)
|
|
109
|
+
|
|
110
|
+
Replace the icon files with a new mark that reflects the app's identity. The set
|
|
111
|
+
present depends on the template; update each one you find:
|
|
112
|
+
|
|
113
|
+
| File | Purpose |
|
|
114
|
+
| --- | --- |
|
|
115
|
+
| `public/favicon.svg` | Browser tab favicon |
|
|
116
|
+
| `public/icon-180.svg` | Apple touch icon (iOS home screen) |
|
|
117
|
+
| `public/icon-192.svg` | PWA install icon (Android / Chrome) |
|
|
118
|
+
| `public/icon-512.svg` | PWA install icon (large / splash) |
|
|
119
|
+
|
|
120
|
+
Build the icon from **SVG primitives** — do not embed a base64-encoded PNG. All
|
|
121
|
+
files should share the same visual design; only the `width` and `height`
|
|
122
|
+
attributes differ. A simple, reliable approach: a filled rounded square in the
|
|
123
|
+
brand color with the first letter (or a relevant glyph) centered in white.
|
|
124
|
+
|
|
125
|
+
Template to adapt (change `fill`, the letter/glyph, and `rx` to suit the brand):
|
|
126
|
+
|
|
127
|
+
```svg
|
|
128
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="192" height="192" viewBox="0 0 192 192">
|
|
129
|
+
<rect width="192" height="192" rx="40" fill="#2563EB"/>
|
|
130
|
+
<text x="96" y="130" font-family="system-ui, sans-serif" font-size="110"
|
|
131
|
+
font-weight="700" fill="white" text-anchor="middle">A</text>
|
|
132
|
+
</svg>
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
Keep `width`/`height` at `180`, `192`, and `512` for the respective icon files;
|
|
136
|
+
`favicon.svg` can use any of these sizes (the `viewBox` keeps it scalable).
|
|
137
|
+
|
|
138
|
+
## What NOT to change
|
|
139
|
+
|
|
140
|
+
These are stable identifiers or template-internal files, not user-facing brand:
|
|
141
|
+
|
|
142
|
+
- `configureTracking({ app, template })` in `app/root.tsx` — analytics
|
|
143
|
+
identifiers seeded at scaffold time; leave them. This holds even in the inlined
|
|
144
|
+
layout, where `app` was seeded from the slug — changing it re-keys analytics
|
|
145
|
+
history.
|
|
146
|
+
- `server/plugins/agent-chat.ts` `appId` (centralized layout) — a stable
|
|
147
|
+
platform analytics/routing key; leave it exactly as scaffolded.
|
|
148
|
+
- `.github/workflows/*.yml` — template automation; references the repo/template
|
|
149
|
+
identity, not the running app.
|
|
150
|
+
- `AGENTS.md` / `DEVELOPING.md` — developer docs for the template itself.
|
|
151
|
+
|
|
152
|
+
## Verification
|
|
153
|
+
|
|
154
|
+
- `pnpm typecheck` passes.
|
|
155
|
+
- Grep for the old title/slug across `app/`, `server/`, `package.json`, and
|
|
156
|
+
`public/` — no unintended leftovers remain (except the intentional
|
|
157
|
+
"do not change" identifiers above).
|
|
158
|
+
- The browser tab title, sidebar/header, and index heading all show the new
|
|
159
|
+
title.
|
|
@@ -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 |
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/triggers/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"actions.d.ts","sourceRoot":"","sources":["../../src/triggers/actions.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,8BAA8B,CAAC;AA4NhE,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CA4G7B"}
|
package/dist/triggers/actions.js
CHANGED
|
@@ -97,6 +97,7 @@ async function handleDefine(args, getCurrentUser) {
|
|
|
97
97
|
condition: args.condition || undefined,
|
|
98
98
|
mode: "agentic",
|
|
99
99
|
domain: args.domain || undefined,
|
|
100
|
+
delegatedPolicyId: args.delegated_policy_id || undefined,
|
|
100
101
|
createdBy: owner,
|
|
101
102
|
runAs: "creator",
|
|
102
103
|
};
|
|
@@ -124,6 +125,9 @@ async function handleUpdate(args, getCurrentUser) {
|
|
|
124
125
|
if (args.condition !== undefined) {
|
|
125
126
|
meta.condition = args.condition || undefined;
|
|
126
127
|
}
|
|
128
|
+
if (args.delegated_policy_id !== undefined) {
|
|
129
|
+
meta.delegatedPolicyId = args.delegated_policy_id || undefined;
|
|
130
|
+
}
|
|
127
131
|
const newBody = args.body ?? body;
|
|
128
132
|
await resourcePut(resource.owner, resource.path, buildTriggerContent(meta, newBody));
|
|
129
133
|
await refreshEventSubscriptions();
|
|
@@ -175,8 +179,8 @@ export function createAutomationToolEntries(getCurrentUser) {
|
|
|
175
179
|
|
|
176
180
|
- **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.
|
|
177
181
|
- **list**: List all automations (triggers). Shows name, event, condition, mode, status, and domain. Optional params: domain, enabled_only.
|
|
178
|
-
- **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.
|
|
179
|
-
- **update**: Update an existing automation's settings (enabled, condition, body, etc.). Required param: name.
|
|
182
|
+
- **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.
|
|
183
|
+
- **update**: Update an existing automation's settings (enabled, condition, body, delegated_policy_id, etc.). Required param: name.
|
|
180
184
|
- **delete**: Delete an automation. Always confirm with the user first. Required param: name.
|
|
181
185
|
- **fire-test**: Fire a test event to validate automations. Emits a test.event.fired event. Optional param: data (JSON string).`,
|
|
182
186
|
parameters: {
|
|
@@ -217,6 +221,10 @@ export function createAutomationToolEntries(getCurrentUser) {
|
|
|
217
221
|
type: "string",
|
|
218
222
|
description: "Domain tag for grouping (mail, calendar, clips, etc.). Used by define and list.",
|
|
219
223
|
},
|
|
224
|
+
delegated_policy_id: {
|
|
225
|
+
type: "string",
|
|
226
|
+
description: "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.",
|
|
227
|
+
},
|
|
220
228
|
body: {
|
|
221
229
|
type: "string",
|
|
222
230
|
description: "The natural-language instructions for what to do when the automation fires. This becomes the agent's prompt in agentic mode. Used by define and update.",
|