@agent-native/core 0.114.16 → 0.115.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +29 -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 +105 -3
  11. package/corpus/core/src/cli/templates-meta.ts +12 -0
  12. package/corpus/core/src/client/AssistantChat.tsx +53 -26
  13. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
  14. package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
  15. package/corpus/core/src/client/chat/message-components.tsx +35 -1
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
  17. package/corpus/core/src/connections/catalog.ts +20 -1
  18. package/corpus/core/src/connections/reader.ts +65 -0
  19. package/corpus/core/src/dashboard-storage/index.ts +27 -0
  20. package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
  21. package/corpus/core/src/dashboard-storage/schema.ts +62 -0
  22. package/corpus/core/src/dashboard-storage/store.ts +333 -0
  23. package/corpus/core/src/deploy/build.ts +95 -16
  24. package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
  25. package/corpus/core/src/eject/workspace-connections.ts +1 -0
  26. package/corpus/core/src/extensions/actions.ts +199 -73
  27. package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
  28. package/corpus/core/src/jobs/scheduler.ts +71 -4
  29. package/corpus/core/src/jobs/tools.ts +31 -1
  30. package/corpus/core/src/localization/default-messages.ts +1 -0
  31. package/corpus/core/src/mcp-client/index.ts +6 -0
  32. package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
  33. package/corpus/core/src/provider-api/index.ts +190 -5
  34. package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
  35. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
  36. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  37. package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
  38. package/corpus/core/src/server/core-routes-plugin.ts +1 -0
  39. package/corpus/core/src/server/credential-provider.ts +9 -3
  40. package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
  41. package/corpus/core/src/styles/agent-native.css +45 -2
  42. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  43. package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  44. package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  45. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  46. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  47. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  49. package/corpus/core/src/triggers/actions.ts +11 -2
  50. package/corpus/core/src/triggers/dispatcher.ts +20 -1
  51. package/corpus/core/src/triggers/types.ts +5 -0
  52. package/corpus/core/src/vite/action-types-plugin.ts +9 -1
  53. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
  54. package/corpus/templates/analytics/AGENTS.md +11 -11
  55. package/corpus/templates/analytics/_gitignore +39 -0
  56. package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
  57. package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
  58. package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
  59. package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
  60. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
  61. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
  62. package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
  63. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
  64. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
  65. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
  66. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
  67. package/corpus/templates/calendar/_gitignore +39 -0
  68. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  69. package/corpus/templates/chat/AGENTS.md +1 -1
  70. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
  71. package/corpus/templates/clips/AGENTS.md +7 -0
  72. package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
  73. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
  74. package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
  75. package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
  76. package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
  77. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
  78. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
  79. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
  80. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
  81. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  82. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
  83. package/corpus/templates/content/_gitignore +39 -0
  84. package/corpus/templates/content/learnings.defaults.md +5 -0
  85. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  86. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
  87. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
  88. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  89. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  90. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
  91. package/corpus/templates/crm/.env.example +5 -0
  92. package/corpus/templates/crm/AGENTS.md +120 -0
  93. package/corpus/templates/crm/CHANGELOG.md +1 -0
  94. package/corpus/templates/crm/DEVELOPING.md +66 -0
  95. package/corpus/templates/crm/README.md +106 -0
  96. package/corpus/templates/crm/_gitignore +12 -0
  97. package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
  98. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  99. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  100. package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -0
  101. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  102. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  103. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  104. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  105. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  106. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  107. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  108. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -0
  109. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  110. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  111. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  112. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  113. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  114. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  115. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  116. package/corpus/templates/crm/actions/list-crm-proposals.ts +31 -0
  117. package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
  118. package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -0
  119. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  120. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  121. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  122. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  123. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  124. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  125. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  126. package/corpus/templates/crm/actions/navigate.ts +63 -0
  127. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  128. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  129. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  130. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  131. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  132. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  133. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  134. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  135. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  136. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
  137. package/corpus/templates/crm/actions/run.ts +11 -0
  138. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  139. package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
  140. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  141. package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
  142. package/corpus/templates/crm/actions/view-screen.ts +218 -0
  143. package/corpus/templates/crm/agent-native.app-skill.json +58 -0
  144. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  145. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
  146. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
  147. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
  148. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
  149. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
  150. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
  151. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
  152. package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
  153. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  154. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
  155. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
  156. package/corpus/templates/crm/app/entry.client.tsx +16 -0
  157. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  158. package/corpus/templates/crm/app/global.css +167 -0
  159. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +60 -0
  160. package/corpus/templates/crm/app/i18n/en-US.ts +89 -0
  161. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  162. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  163. package/corpus/templates/crm/app/lib/navigation.ts +54 -0
  164. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  165. package/corpus/templates/crm/app/lib/types.ts +172 -0
  166. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  167. package/corpus/templates/crm/app/root.tsx +88 -0
  168. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  169. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  170. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  171. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  172. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  173. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  174. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  175. package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
  176. package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
  177. package/corpus/templates/crm/app/routes/settings.tsx +63 -0
  178. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  179. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  180. package/corpus/templates/crm/app/routes/views.tsx +333 -0
  181. package/corpus/templates/crm/app/routes.ts +17 -0
  182. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  183. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
  184. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
  185. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
  186. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
  187. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
  188. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
  189. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
  190. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
  191. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
  192. package/corpus/templates/crm/components.json +20 -0
  193. package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
  194. package/corpus/templates/crm/learnings.defaults.md +5 -0
  195. package/corpus/templates/crm/package.json +59 -0
  196. package/corpus/templates/crm/public/favicon.svg +1 -0
  197. package/corpus/templates/crm/public/icon-180.svg +1 -0
  198. package/corpus/templates/crm/public/manifest.json +11 -0
  199. package/corpus/templates/crm/react-router.config.ts +7 -0
  200. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  201. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  202. package/corpus/templates/crm/server/crm/crm-mirror.ts +711 -0
  203. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
  204. package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -0
  205. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  206. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  207. package/corpus/templates/crm/server/db/crm-store.ts +1170 -0
  208. package/corpus/templates/crm/server/db/index.ts +169 -0
  209. package/corpus/templates/crm/server/db/schema.ts +441 -0
  210. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  211. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  212. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +100 -0
  213. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
  214. package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -0
  215. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  216. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  217. package/corpus/templates/crm/server/plugins/agent-chat.ts +68 -0
  218. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  219. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  220. package/corpus/templates/crm/server/plugins/db.ts +454 -0
  221. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  222. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  223. package/corpus/templates/crm/shared/crm-contract.ts +254 -0
  224. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  225. package/corpus/templates/crm/ssr-entry.ts +11 -0
  226. package/corpus/templates/crm/tsconfig.json +24 -0
  227. package/corpus/templates/crm/vite.config.ts +15 -0
  228. package/corpus/templates/crm/vitest.config.ts +5 -0
  229. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +115 -0
  230. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
  231. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
  232. package/corpus/templates/forms/_gitignore +39 -0
  233. package/corpus/templates/forms/learnings.defaults.md +5 -0
  234. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
  235. package/corpus/templates/macros/_gitignore +39 -0
  236. package/corpus/templates/macros/learnings.defaults.md +5 -0
  237. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
  238. package/corpus/templates/mail/_gitignore +39 -0
  239. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
  240. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
  241. package/corpus/templates/slides/_gitignore +39 -0
  242. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
  243. package/corpus/templates/tasks/_gitignore +39 -0
  244. package/corpus/toolkit/CHANGELOG.md +12 -0
  245. package/corpus/toolkit/README.md +30 -0
  246. package/corpus/toolkit/agent-native.eject.json +33 -0
  247. package/corpus/toolkit/package.json +15 -1
  248. package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
  249. package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
  250. package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
  251. package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
  252. package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
  253. package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
  254. package/corpus/toolkit/src/dashboard/index.ts +6 -0
  255. package/corpus/toolkit/src/index.ts +1 -0
  256. package/corpus/toolkit/src/ui/calendar.tsx +8 -8
  257. package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
  258. package/dist/action.d.ts +14 -1
  259. package/dist/action.d.ts.map +1 -1
  260. package/dist/action.js.map +1 -1
  261. package/dist/agent/production-agent.d.ts +3 -1
  262. package/dist/agent/production-agent.d.ts.map +1 -1
  263. package/dist/agent/production-agent.js +83 -3
  264. package/dist/agent/production-agent.js.map +1 -1
  265. package/dist/cli/templates-meta.d.ts.map +1 -1
  266. package/dist/cli/templates-meta.js +12 -0
  267. package/dist/cli/templates-meta.js.map +1 -1
  268. package/dist/client/AssistantChat.d.ts +4 -0
  269. package/dist/client/AssistantChat.d.ts.map +1 -1
  270. package/dist/client/AssistantChat.js +30 -17
  271. package/dist/client/AssistantChat.js.map +1 -1
  272. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  273. package/dist/client/agent-page/AgentJobsTab.js +3 -1
  274. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  275. package/dist/client/agent-page/use-jobs.d.ts +1 -0
  276. package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
  277. package/dist/client/agent-page/use-jobs.js.map +1 -1
  278. package/dist/client/chat/message-components.d.ts +5 -0
  279. package/dist/client/chat/message-components.d.ts.map +1 -1
  280. package/dist/client/chat/message-components.js +17 -1
  281. package/dist/client/chat/message-components.js.map +1 -1
  282. package/dist/client/chat/tool-call-display.d.ts +3 -1
  283. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  284. package/dist/client/chat/tool-call-display.js +17 -7
  285. package/dist/client/chat/tool-call-display.js.map +1 -1
  286. package/dist/collab/awareness.d.ts +2 -2
  287. package/dist/collab/awareness.d.ts.map +1 -1
  288. package/dist/collab/routes.d.ts +1 -1
  289. package/dist/collab/struct-routes.d.ts +1 -1
  290. package/dist/connections/catalog.d.ts +17 -3
  291. package/dist/connections/catalog.d.ts.map +1 -1
  292. package/dist/connections/catalog.js +16 -1
  293. package/dist/connections/catalog.js.map +1 -1
  294. package/dist/connections/reader.d.ts +18 -0
  295. package/dist/connections/reader.d.ts.map +1 -1
  296. package/dist/connections/reader.js +41 -0
  297. package/dist/connections/reader.js.map +1 -1
  298. package/dist/dashboard-storage/index.d.ts +4 -0
  299. package/dist/dashboard-storage/index.d.ts.map +1 -0
  300. package/dist/dashboard-storage/index.js +4 -0
  301. package/dist/dashboard-storage/index.js.map +1 -0
  302. package/dist/dashboard-storage/panel-source.d.ts +68 -0
  303. package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
  304. package/dist/dashboard-storage/panel-source.js +76 -0
  305. package/dist/dashboard-storage/panel-source.js.map +1 -0
  306. package/dist/dashboard-storage/schema.d.ts +562 -0
  307. package/dist/dashboard-storage/schema.d.ts.map +1 -0
  308. package/dist/dashboard-storage/schema.js +32 -0
  309. package/dist/dashboard-storage/schema.js.map +1 -0
  310. package/dist/dashboard-storage/store.d.ts +62 -0
  311. package/dist/dashboard-storage/store.d.ts.map +1 -0
  312. package/dist/dashboard-storage/store.js +227 -0
  313. package/dist/dashboard-storage/store.js.map +1 -0
  314. package/dist/deploy/build.d.ts +7 -0
  315. package/dist/deploy/build.d.ts.map +1 -1
  316. package/dist/deploy/build.js +78 -14
  317. package/dist/deploy/build.js.map +1 -1
  318. package/dist/eject/provider-api-definitions.d.ts +2 -1
  319. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  320. package/dist/eject/provider-api-definitions.js +1 -0
  321. package/dist/eject/provider-api-definitions.js.map +1 -1
  322. package/dist/eject/workspace-connections.d.ts.map +1 -1
  323. package/dist/eject/workspace-connections.js +1 -0
  324. package/dist/eject/workspace-connections.js.map +1 -1
  325. package/dist/extensions/actions.d.ts.map +1 -1
  326. package/dist/extensions/actions.js +165 -67
  327. package/dist/extensions/actions.js.map +1 -1
  328. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  329. package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
  330. package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
  331. package/dist/jobs/actions/list-recurring-jobs.js +1 -0
  332. package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
  333. package/dist/jobs/scheduler.d.ts +17 -2
  334. package/dist/jobs/scheduler.d.ts.map +1 -1
  335. package/dist/jobs/scheduler.js +51 -2
  336. package/dist/jobs/scheduler.js.map +1 -1
  337. package/dist/jobs/tools.d.ts.map +1 -1
  338. package/dist/jobs/tools.js +32 -2
  339. package/dist/jobs/tools.js.map +1 -1
  340. package/dist/localization/default-messages.d.ts +1 -0
  341. package/dist/localization/default-messages.d.ts.map +1 -1
  342. package/dist/localization/default-messages.js +1 -0
  343. package/dist/localization/default-messages.js.map +1 -1
  344. package/dist/mcp-client/index.d.ts +2 -0
  345. package/dist/mcp-client/index.d.ts.map +1 -1
  346. package/dist/mcp-client/index.js +5 -0
  347. package/dist/mcp-client/index.js.map +1 -1
  348. package/dist/notifications/routes.d.ts +3 -3
  349. package/dist/observability/routes.d.ts +5 -5
  350. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  351. package/dist/provider-api/actions/provider-api.d.ts +8 -6
  352. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  353. package/dist/provider-api/actions/provider-api.js +1 -1
  354. package/dist/provider-api/actions/provider-api.js.map +1 -1
  355. package/dist/provider-api/index.d.ts +11 -7
  356. package/dist/provider-api/index.d.ts.map +1 -1
  357. package/dist/provider-api/index.js +143 -5
  358. package/dist/provider-api/index.js.map +1 -1
  359. package/dist/resources/handlers.d.ts +1 -1
  360. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  361. package/dist/secrets/register-framework-secrets.js +7 -0
  362. package/dist/secrets/register-framework-secrets.js.map +1 -1
  363. package/dist/secrets/routes.d.ts +9 -9
  364. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  365. package/dist/server/agent-chat/context-tools.js +9 -0
  366. package/dist/server/agent-chat/context-tools.js.map +1 -1
  367. package/dist/server/agent-chat/framework-prompts.js +2 -2
  368. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  369. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  370. package/dist/server/agent-chat-plugin.js +18 -2
  371. package/dist/server/agent-chat-plugin.js.map +1 -1
  372. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  373. package/dist/server/core-routes-plugin.js +1 -0
  374. package/dist/server/core-routes-plugin.js.map +1 -1
  375. package/dist/server/credential-provider.d.ts +4 -3
  376. package/dist/server/credential-provider.d.ts.map +1 -1
  377. package/dist/server/credential-provider.js +9 -3
  378. package/dist/server/credential-provider.js.map +1 -1
  379. package/dist/server/transcribe-voice.d.ts +1 -1
  380. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  381. package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
  382. package/dist/server/workspace-provider-oauth.js +141 -4
  383. package/dist/server/workspace-provider-oauth.js.map +1 -1
  384. package/dist/styles/agent-native.css +45 -2
  385. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  386. package/dist/templates/chat/AGENTS.md +1 -1
  387. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  388. package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  389. package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  390. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  391. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  392. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  393. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  394. package/dist/triggers/actions.d.ts.map +1 -1
  395. package/dist/triggers/actions.js +10 -2
  396. package/dist/triggers/actions.js.map +1 -1
  397. package/dist/triggers/dispatcher.d.ts.map +1 -1
  398. package/dist/triggers/dispatcher.js +15 -0
  399. package/dist/triggers/dispatcher.js.map +1 -1
  400. package/dist/triggers/types.d.ts +5 -0
  401. package/dist/triggers/types.d.ts.map +1 -1
  402. package/dist/triggers/types.js.map +1 -1
  403. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  404. package/dist/vite/action-types-plugin.js +4 -1
  405. package/dist/vite/action-types-plugin.js.map +1 -1
  406. package/docs/content/agent-native-toolkit.mdx +16 -0
  407. package/docs/content/recurring-jobs.mdx +35 -6
  408. package/package.json +6 -2
  409. package/src/action.ts +22 -1
  410. package/src/agent/production-agent.ts +105 -3
  411. package/src/cli/templates-meta.ts +12 -0
  412. package/src/client/AssistantChat.tsx +53 -26
  413. package/src/client/agent-page/AgentJobsTab.tsx +19 -0
  414. package/src/client/agent-page/use-jobs.ts +1 -0
  415. package/src/client/chat/message-components.tsx +35 -1
  416. package/src/client/chat/tool-call-display.tsx +38 -3
  417. package/src/connections/catalog.ts +20 -1
  418. package/src/connections/reader.ts +65 -0
  419. package/src/dashboard-storage/index.ts +27 -0
  420. package/src/dashboard-storage/panel-source.ts +168 -0
  421. package/src/dashboard-storage/schema.ts +62 -0
  422. package/src/dashboard-storage/store.ts +333 -0
  423. package/src/deploy/build.ts +95 -16
  424. package/src/eject/provider-api-definitions.ts +1 -0
  425. package/src/eject/workspace-connections.ts +1 -0
  426. package/src/extensions/actions.ts +199 -73
  427. package/src/jobs/actions/list-recurring-jobs.ts +2 -0
  428. package/src/jobs/scheduler.ts +71 -4
  429. package/src/jobs/tools.ts +31 -1
  430. package/src/localization/default-messages.ts +1 -0
  431. package/src/mcp-client/index.ts +6 -0
  432. package/src/provider-api/actions/provider-api.ts +1 -1
  433. package/src/provider-api/index.ts +190 -5
  434. package/src/secrets/register-framework-secrets.ts +8 -0
  435. package/src/server/agent-chat/context-tools.ts +9 -0
  436. package/src/server/agent-chat/framework-prompts.ts +2 -2
  437. package/src/server/agent-chat-plugin.ts +22 -2
  438. package/src/server/core-routes-plugin.ts +1 -0
  439. package/src/server/credential-provider.ts +9 -3
  440. package/src/server/workspace-provider-oauth.ts +181 -4
  441. package/src/styles/agent-native.css +45 -2
  442. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  443. package/src/templates/chat/AGENTS.md +1 -1
  444. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  445. package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  446. package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  447. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  448. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  449. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  450. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  451. package/src/triggers/actions.ts +11 -2
  452. package/src/triggers/dispatcher.ts +20 -1
  453. package/src/triggers/types.ts +5 -0
  454. package/src/vite/action-types-plugin.ts +9 -1
  455. package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
  456. 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 |
@@ -1,4 +1,4 @@
1
- # {{APP_NAME}} — Agent Guide
1
+ # Chat — Agent Guide
2
2
 
3
3
  Chat is the minimal chat-first agent-native app template. Keep chat as the
4
4
  primary surface, add actions for real capabilities, and add screens only when a
@@ -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` 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 |
@@ -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;AAwNhE,wBAAgB,2BAA2B,CACzC,cAAc,EAAE,MAAM,MAAM,GAC3B,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAuG7B"}
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"}
@@ -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. Optional: enabled, condition, body.
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.",