@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.
Files changed (476) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +41 -0
  4. package/corpus/core/agent-native.eject.json +2 -0
  5. package/corpus/core/docs/content/agent-native-toolkit.mdx +16 -0
  6. package/corpus/core/docs/content/recurring-jobs.mdx +35 -6
  7. package/corpus/core/export-snapshot.json +4 -0
  8. package/corpus/core/package.json +5 -1
  9. package/corpus/core/src/action.ts +22 -1
  10. package/corpus/core/src/agent/production-agent.ts +122 -3
  11. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +19 -2
  12. package/corpus/core/src/cli/templates-meta.ts +12 -0
  13. package/corpus/core/src/client/AssistantChat.tsx +53 -26
  14. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
  15. package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
  16. package/corpus/core/src/client/blocks/library/wireframe.tsx +3 -1
  17. package/corpus/core/src/client/chat/message-components.tsx +35 -1
  18. package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
  19. package/corpus/core/src/connections/catalog.ts +20 -1
  20. package/corpus/core/src/connections/reader.ts +65 -0
  21. package/corpus/core/src/dashboard-storage/index.ts +27 -0
  22. package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
  23. package/corpus/core/src/dashboard-storage/schema.ts +62 -0
  24. package/corpus/core/src/dashboard-storage/store.ts +333 -0
  25. package/corpus/core/src/deploy/build.ts +95 -16
  26. package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
  27. package/corpus/core/src/eject/workspace-connections.ts +1 -0
  28. package/corpus/core/src/extensions/actions.ts +199 -73
  29. package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
  30. package/corpus/core/src/jobs/scheduler.ts +71 -4
  31. package/corpus/core/src/jobs/tools.ts +31 -1
  32. package/corpus/core/src/localization/default-messages.ts +1 -0
  33. package/corpus/core/src/mcp-client/index.ts +6 -0
  34. package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
  35. package/corpus/core/src/provider-api/index.ts +190 -5
  36. package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
  37. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
  38. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  39. package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
  40. package/corpus/core/src/server/core-routes-plugin.ts +1 -0
  41. package/corpus/core/src/server/credential-provider.ts +9 -3
  42. package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
  43. package/corpus/core/src/styles/agent-native.css +45 -2
  44. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  45. package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  46. package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  47. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  51. package/corpus/core/src/triggers/actions.ts +11 -2
  52. package/corpus/core/src/triggers/dispatcher.ts +20 -1
  53. package/corpus/core/src/triggers/types.ts +5 -0
  54. package/corpus/core/src/vite/action-types-plugin.ts +9 -1
  55. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
  56. package/corpus/templates/analytics/AGENTS.md +11 -11
  57. package/corpus/templates/analytics/_gitignore +39 -0
  58. package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
  59. package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
  60. package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
  61. package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
  62. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
  63. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
  64. package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
  65. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
  66. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
  67. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
  68. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
  69. package/corpus/templates/calendar/_gitignore +39 -0
  70. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  71. package/corpus/templates/chat/AGENTS.md +1 -1
  72. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
  73. package/corpus/templates/clips/AGENTS.md +7 -0
  74. package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
  75. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
  76. package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
  77. package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
  78. package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
  79. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
  80. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
  81. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
  82. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
  83. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  84. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
  85. package/corpus/templates/content/_gitignore +39 -0
  86. package/corpus/templates/content/learnings.defaults.md +5 -0
  87. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  88. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
  89. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
  90. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  91. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  92. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
  93. package/corpus/templates/crm/.env.example +5 -0
  94. package/corpus/templates/crm/AGENTS.md +120 -0
  95. package/corpus/templates/crm/CHANGELOG.md +1 -0
  96. package/corpus/templates/crm/DEVELOPING.md +66 -0
  97. package/corpus/templates/crm/README.md +106 -0
  98. package/corpus/templates/crm/_gitignore +12 -0
  99. package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
  100. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  101. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  102. package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -0
  103. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  104. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  105. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  106. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  107. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  108. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  109. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  110. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -0
  111. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  112. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  113. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  114. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  115. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  116. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  117. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  118. package/corpus/templates/crm/actions/list-crm-proposals.ts +31 -0
  119. package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
  120. package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -0
  121. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  122. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  123. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  124. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  125. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  126. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  127. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  128. package/corpus/templates/crm/actions/navigate.ts +63 -0
  129. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  130. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  131. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  132. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  133. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  134. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  135. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  136. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  137. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  138. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
  139. package/corpus/templates/crm/actions/run.ts +11 -0
  140. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  141. package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
  142. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  143. package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
  144. package/corpus/templates/crm/actions/view-screen.ts +218 -0
  145. package/corpus/templates/crm/agent-native.app-skill.json +58 -0
  146. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  147. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
  148. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
  149. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
  150. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
  151. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
  152. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
  153. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
  154. package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
  155. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  156. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
  157. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
  158. package/corpus/templates/crm/app/entry.client.tsx +16 -0
  159. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  160. package/corpus/templates/crm/app/global.css +167 -0
  161. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +60 -0
  162. package/corpus/templates/crm/app/i18n/en-US.ts +89 -0
  163. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  164. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  165. package/corpus/templates/crm/app/lib/navigation.ts +54 -0
  166. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  167. package/corpus/templates/crm/app/lib/types.ts +172 -0
  168. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  169. package/corpus/templates/crm/app/root.tsx +88 -0
  170. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  171. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  172. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  173. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  174. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  175. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  176. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  177. package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
  178. package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
  179. package/corpus/templates/crm/app/routes/settings.tsx +63 -0
  180. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  181. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  182. package/corpus/templates/crm/app/routes/views.tsx +333 -0
  183. package/corpus/templates/crm/app/routes.ts +17 -0
  184. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  185. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
  186. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
  187. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
  188. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
  189. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
  190. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
  191. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
  192. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
  193. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
  194. package/corpus/templates/crm/components.json +20 -0
  195. package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
  196. package/corpus/templates/crm/learnings.defaults.md +5 -0
  197. package/corpus/templates/crm/package.json +59 -0
  198. package/corpus/templates/crm/public/favicon.svg +1 -0
  199. package/corpus/templates/crm/public/icon-180.svg +1 -0
  200. package/corpus/templates/crm/public/manifest.json +11 -0
  201. package/corpus/templates/crm/react-router.config.ts +7 -0
  202. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  203. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  204. package/corpus/templates/crm/server/crm/crm-mirror.ts +711 -0
  205. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
  206. package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -0
  207. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  208. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  209. package/corpus/templates/crm/server/db/crm-store.ts +1170 -0
  210. package/corpus/templates/crm/server/db/index.ts +169 -0
  211. package/corpus/templates/crm/server/db/schema.ts +441 -0
  212. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  213. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  214. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +100 -0
  215. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
  216. package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -0
  217. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  218. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  219. package/corpus/templates/crm/server/plugins/agent-chat.ts +68 -0
  220. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  221. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  222. package/corpus/templates/crm/server/plugins/db.ts +454 -0
  223. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  224. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  225. package/corpus/templates/crm/shared/crm-contract.ts +254 -0
  226. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  227. package/corpus/templates/crm/ssr-entry.ts +11 -0
  228. package/corpus/templates/crm/tsconfig.json +24 -0
  229. package/corpus/templates/crm/vite.config.ts +15 -0
  230. package/corpus/templates/crm/vitest.config.ts +5 -0
  231. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +115 -0
  232. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
  233. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
  234. package/corpus/templates/forms/_gitignore +39 -0
  235. package/corpus/templates/forms/learnings.defaults.md +5 -0
  236. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
  237. package/corpus/templates/macros/_gitignore +39 -0
  238. package/corpus/templates/macros/learnings.defaults.md +5 -0
  239. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
  240. package/corpus/templates/mail/_gitignore +39 -0
  241. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
  242. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +19 -2
  243. package/corpus/templates/plan/AGENTS.md +10 -0
  244. package/corpus/templates/plan/actions/create-prototype-plan.ts +27 -3
  245. package/corpus/templates/plan/actions/get-plan-blocks.ts +1 -1
  246. package/corpus/templates/plan/actions/update-visual-plan.ts +3 -2
  247. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +18 -4
  248. package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +10 -3
  249. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +3 -1
  250. package/corpus/templates/plan/app/i18n/en-US.ts +6 -0
  251. package/corpus/templates/plan/app/lib/create-plan-routing.ts +39 -0
  252. package/corpus/templates/plan/app/pages/PlansPage.tsx +31 -107
  253. package/corpus/templates/plan/changelog/2026-07-22-high-fidelity-mockup-requests-now-preserve-branded-css-use-d.md +6 -0
  254. package/corpus/templates/plan/shared/plan-content.ts +110 -2
  255. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
  256. package/corpus/templates/slides/_gitignore +39 -0
  257. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
  258. package/corpus/templates/tasks/_gitignore +39 -0
  259. package/corpus/toolkit/CHANGELOG.md +12 -0
  260. package/corpus/toolkit/README.md +30 -0
  261. package/corpus/toolkit/agent-native.eject.json +33 -0
  262. package/corpus/toolkit/package.json +15 -1
  263. package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
  264. package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
  265. package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
  266. package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
  267. package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
  268. package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
  269. package/corpus/toolkit/src/dashboard/index.ts +6 -0
  270. package/corpus/toolkit/src/index.ts +1 -0
  271. package/corpus/toolkit/src/ui/calendar.tsx +8 -8
  272. package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
  273. package/dist/action.d.ts +14 -1
  274. package/dist/action.d.ts.map +1 -1
  275. package/dist/action.js.map +1 -1
  276. package/dist/agent/production-agent.d.ts +3 -1
  277. package/dist/agent/production-agent.d.ts.map +1 -1
  278. package/dist/agent/production-agent.js +97 -3
  279. package/dist/agent/production-agent.js.map +1 -1
  280. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  281. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  282. package/dist/cli/skills-content/visual-plan-skill.js +19 -2
  283. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  284. package/dist/cli/templates-meta.d.ts.map +1 -1
  285. package/dist/cli/templates-meta.js +12 -0
  286. package/dist/cli/templates-meta.js.map +1 -1
  287. package/dist/client/AssistantChat.d.ts +4 -0
  288. package/dist/client/AssistantChat.d.ts.map +1 -1
  289. package/dist/client/AssistantChat.js +30 -17
  290. package/dist/client/AssistantChat.js.map +1 -1
  291. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  292. package/dist/client/agent-page/AgentJobsTab.js +3 -1
  293. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  294. package/dist/client/agent-page/use-jobs.d.ts +1 -0
  295. package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
  296. package/dist/client/agent-page/use-jobs.js.map +1 -1
  297. package/dist/client/blocks/library/wireframe.d.ts.map +1 -1
  298. package/dist/client/blocks/library/wireframe.js +3 -2
  299. package/dist/client/blocks/library/wireframe.js.map +1 -1
  300. package/dist/client/chat/message-components.d.ts +5 -0
  301. package/dist/client/chat/message-components.d.ts.map +1 -1
  302. package/dist/client/chat/message-components.js +17 -1
  303. package/dist/client/chat/message-components.js.map +1 -1
  304. package/dist/client/chat/tool-call-display.d.ts +3 -1
  305. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  306. package/dist/client/chat/tool-call-display.js +17 -7
  307. package/dist/client/chat/tool-call-display.js.map +1 -1
  308. package/dist/collab/routes.d.ts +1 -1
  309. package/dist/collab/struct-routes.d.ts +1 -1
  310. package/dist/connections/catalog.d.ts +17 -3
  311. package/dist/connections/catalog.d.ts.map +1 -1
  312. package/dist/connections/catalog.js +16 -1
  313. package/dist/connections/catalog.js.map +1 -1
  314. package/dist/connections/reader.d.ts +18 -0
  315. package/dist/connections/reader.d.ts.map +1 -1
  316. package/dist/connections/reader.js +41 -0
  317. package/dist/connections/reader.js.map +1 -1
  318. package/dist/dashboard-storage/index.d.ts +4 -0
  319. package/dist/dashboard-storage/index.d.ts.map +1 -0
  320. package/dist/dashboard-storage/index.js +4 -0
  321. package/dist/dashboard-storage/index.js.map +1 -0
  322. package/dist/dashboard-storage/panel-source.d.ts +68 -0
  323. package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
  324. package/dist/dashboard-storage/panel-source.js +76 -0
  325. package/dist/dashboard-storage/panel-source.js.map +1 -0
  326. package/dist/dashboard-storage/schema.d.ts +562 -0
  327. package/dist/dashboard-storage/schema.d.ts.map +1 -0
  328. package/dist/dashboard-storage/schema.js +32 -0
  329. package/dist/dashboard-storage/schema.js.map +1 -0
  330. package/dist/dashboard-storage/store.d.ts +62 -0
  331. package/dist/dashboard-storage/store.d.ts.map +1 -0
  332. package/dist/dashboard-storage/store.js +227 -0
  333. package/dist/dashboard-storage/store.js.map +1 -0
  334. package/dist/deploy/build.d.ts +7 -0
  335. package/dist/deploy/build.d.ts.map +1 -1
  336. package/dist/deploy/build.js +78 -14
  337. package/dist/deploy/build.js.map +1 -1
  338. package/dist/eject/provider-api-definitions.d.ts +2 -1
  339. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  340. package/dist/eject/provider-api-definitions.js +1 -0
  341. package/dist/eject/provider-api-definitions.js.map +1 -1
  342. package/dist/eject/workspace-connections.d.ts.map +1 -1
  343. package/dist/eject/workspace-connections.js +1 -0
  344. package/dist/eject/workspace-connections.js.map +1 -1
  345. package/dist/extensions/actions.d.ts.map +1 -1
  346. package/dist/extensions/actions.js +165 -67
  347. package/dist/extensions/actions.js.map +1 -1
  348. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  349. package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
  350. package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
  351. package/dist/jobs/actions/list-recurring-jobs.js +1 -0
  352. package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
  353. package/dist/jobs/scheduler.d.ts +17 -2
  354. package/dist/jobs/scheduler.d.ts.map +1 -1
  355. package/dist/jobs/scheduler.js +51 -2
  356. package/dist/jobs/scheduler.js.map +1 -1
  357. package/dist/jobs/tools.d.ts.map +1 -1
  358. package/dist/jobs/tools.js +32 -2
  359. package/dist/jobs/tools.js.map +1 -1
  360. package/dist/localization/default-messages.d.ts +1 -0
  361. package/dist/localization/default-messages.d.ts.map +1 -1
  362. package/dist/localization/default-messages.js +1 -0
  363. package/dist/localization/default-messages.js.map +1 -1
  364. package/dist/mcp-client/index.d.ts +2 -0
  365. package/dist/mcp-client/index.d.ts.map +1 -1
  366. package/dist/mcp-client/index.js +5 -0
  367. package/dist/mcp-client/index.js.map +1 -1
  368. package/dist/notifications/routes.d.ts +3 -3
  369. package/dist/progress/routes.d.ts +1 -1
  370. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  371. package/dist/provider-api/actions/provider-api.d.ts +8 -6
  372. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  373. package/dist/provider-api/actions/provider-api.js +1 -1
  374. package/dist/provider-api/actions/provider-api.js.map +1 -1
  375. package/dist/provider-api/index.d.ts +11 -7
  376. package/dist/provider-api/index.d.ts.map +1 -1
  377. package/dist/provider-api/index.js +143 -5
  378. package/dist/provider-api/index.js.map +1 -1
  379. package/dist/resources/handlers.d.ts +1 -1
  380. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  381. package/dist/secrets/register-framework-secrets.js +7 -0
  382. package/dist/secrets/register-framework-secrets.js.map +1 -1
  383. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  384. package/dist/server/agent-chat/context-tools.js +9 -0
  385. package/dist/server/agent-chat/context-tools.js.map +1 -1
  386. package/dist/server/agent-chat/framework-prompts.js +2 -2
  387. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  388. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  389. package/dist/server/agent-chat-plugin.js +18 -2
  390. package/dist/server/agent-chat-plugin.js.map +1 -1
  391. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  392. package/dist/server/core-routes-plugin.js +1 -0
  393. package/dist/server/core-routes-plugin.js.map +1 -1
  394. package/dist/server/credential-provider.d.ts +4 -3
  395. package/dist/server/credential-provider.d.ts.map +1 -1
  396. package/dist/server/credential-provider.js +9 -3
  397. package/dist/server/credential-provider.js.map +1 -1
  398. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  399. package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
  400. package/dist/server/workspace-provider-oauth.js +141 -4
  401. package/dist/server/workspace-provider-oauth.js.map +1 -1
  402. package/dist/styles/agent-native.css +45 -2
  403. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  404. package/dist/templates/chat/AGENTS.md +1 -1
  405. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  406. package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  407. package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  408. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  409. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  410. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  411. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  412. package/dist/triggers/actions.d.ts.map +1 -1
  413. package/dist/triggers/actions.js +10 -2
  414. package/dist/triggers/actions.js.map +1 -1
  415. package/dist/triggers/dispatcher.d.ts.map +1 -1
  416. package/dist/triggers/dispatcher.js +15 -0
  417. package/dist/triggers/dispatcher.js.map +1 -1
  418. package/dist/triggers/types.d.ts +5 -0
  419. package/dist/triggers/types.d.ts.map +1 -1
  420. package/dist/triggers/types.js.map +1 -1
  421. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  422. package/dist/vite/action-types-plugin.js +4 -1
  423. package/dist/vite/action-types-plugin.js.map +1 -1
  424. package/docs/content/agent-native-toolkit.mdx +16 -0
  425. package/docs/content/recurring-jobs.mdx +35 -6
  426. package/package.json +7 -3
  427. package/src/action.ts +22 -1
  428. package/src/agent/production-agent.ts +122 -3
  429. package/src/cli/skills-content/visual-plan-skill.ts +19 -2
  430. package/src/cli/templates-meta.ts +12 -0
  431. package/src/client/AssistantChat.tsx +53 -26
  432. package/src/client/agent-page/AgentJobsTab.tsx +19 -0
  433. package/src/client/agent-page/use-jobs.ts +1 -0
  434. package/src/client/blocks/library/wireframe.tsx +3 -1
  435. package/src/client/chat/message-components.tsx +35 -1
  436. package/src/client/chat/tool-call-display.tsx +38 -3
  437. package/src/connections/catalog.ts +20 -1
  438. package/src/connections/reader.ts +65 -0
  439. package/src/dashboard-storage/index.ts +27 -0
  440. package/src/dashboard-storage/panel-source.ts +168 -0
  441. package/src/dashboard-storage/schema.ts +62 -0
  442. package/src/dashboard-storage/store.ts +333 -0
  443. package/src/deploy/build.ts +95 -16
  444. package/src/eject/provider-api-definitions.ts +1 -0
  445. package/src/eject/workspace-connections.ts +1 -0
  446. package/src/extensions/actions.ts +199 -73
  447. package/src/jobs/actions/list-recurring-jobs.ts +2 -0
  448. package/src/jobs/scheduler.ts +71 -4
  449. package/src/jobs/tools.ts +31 -1
  450. package/src/localization/default-messages.ts +1 -0
  451. package/src/mcp-client/index.ts +6 -0
  452. package/src/provider-api/actions/provider-api.ts +1 -1
  453. package/src/provider-api/index.ts +190 -5
  454. package/src/secrets/register-framework-secrets.ts +8 -0
  455. package/src/server/agent-chat/context-tools.ts +9 -0
  456. package/src/server/agent-chat/framework-prompts.ts +2 -2
  457. package/src/server/agent-chat-plugin.ts +22 -2
  458. package/src/server/core-routes-plugin.ts +1 -0
  459. package/src/server/credential-provider.ts +9 -3
  460. package/src/server/workspace-provider-oauth.ts +181 -4
  461. package/src/styles/agent-native.css +45 -2
  462. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  463. package/src/templates/chat/AGENTS.md +1 -1
  464. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  465. package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  466. package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  467. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  468. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  469. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  470. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  471. package/src/triggers/actions.ts +11 -2
  472. package/src/triggers/dispatcher.ts +20 -1
  473. package/src/triggers/types.ts +5 -0
  474. package/src/vite/action-types-plugin.ts +9 -1
  475. package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
  476. 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` for full-body
231
- replacement, but full-body replacement requires `allowFullReplacement: true`.
232
- Inline `content` still works for everything you author yourself use
233
- `contentFromAttachment` only to avoid regurgitating something the user already
234
- pasted.
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. Prefer granular `edits` for surgical
239
- changes instead of regenerating the full HTML. For medium/large extensions,
240
- add stable section comments around major blocks so future agents can target
241
- them without touching unrelated indentation:
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 unless `allowFullReplacement: true` is
246
- explicitly supplied for a user-requested visual rewrite or complete replacement
247
- body. If a focused edit fails, inspect the current body and adjust its target;
248
- do not retry unchanged arguments.
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
- "edits": "[{\"op\":\"replace-section\",\"section\":\"npm-daily-chart\",\"content\":\"<section>...</section>\"}]",
262
- "format": true
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 is
282
- still available for broad rewrites when `allowFullReplacement: true` is
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. Optional: enabled, condition, body.
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
- if (!content.includes("defineAction") && !reexportsDefaultAction) {
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 {
@@ -1,36 +0,0 @@
1
- import { readBody } from "@agent-native/core/server";
2
- import { defineEventHandler, setResponseStatus } from "h3";
3
-
4
- import { runApiHandlerWithContext } from "../lib/credentials";
5
- import {
6
- isDashboardPanelSource,
7
- normalizeDashboardPanelQuery,
8
- runDashboardPanelQuery,
9
- } from "../lib/dashboard-panel-query";
10
-
11
- export const handleSqlQuery = defineEventHandler(async (event) => {
12
- return runApiHandlerWithContext(event, async (ctx) => {
13
- const { query: rawQuery, source } = (await readBody(event)) as {
14
- query?: unknown;
15
- source?: unknown;
16
- };
17
-
18
- if (!isDashboardPanelSource(source)) {
19
- setResponseStatus(event, 400);
20
- return {
21
- error:
22
- "Invalid source. Must be 'bigquery', 'ga4', 'amplitude', 'first-party', 'demo', 'prometheus', or 'program'",
23
- };
24
- }
25
-
26
- try {
27
- const query = normalizeDashboardPanelQuery(source, rawQuery);
28
- return await runDashboardPanelQuery({ source, query, ctx });
29
- } catch (error: any) {
30
- const message = error?.message || String(error);
31
- console.error(`SQL query error (${source}):`, message);
32
- setResponseStatus(event, /DB query timed out/i.test(message) ? 504 : 400);
33
- return { error: message };
34
- }
35
- });
36
- });
@@ -1 +0,0 @@
1
- export { handleSqlQuery as default } from "../../handlers/sql-query";