@agent-native/core 0.114.15 → 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 (467) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/bin/agent-native.js +35 -14
  3. package/bin/launcher.js +34 -0
  4. package/corpus/README.md +3 -3
  5. package/corpus/core/CHANGELOG.md +35 -0
  6. package/corpus/core/agent-native.eject.json +2 -0
  7. package/corpus/core/bin/agent-native.js +35 -14
  8. package/corpus/core/bin/launcher.js +34 -0
  9. package/corpus/core/docs/content/agent-native-toolkit.mdx +16 -0
  10. package/corpus/core/docs/content/recurring-jobs.mdx +35 -6
  11. package/corpus/core/export-snapshot.json +4 -0
  12. package/corpus/core/package.json +5 -1
  13. package/corpus/core/src/action.ts +22 -1
  14. package/corpus/core/src/agent/production-agent.ts +105 -3
  15. package/corpus/core/src/cli/templates-meta.ts +12 -0
  16. package/corpus/core/src/client/AssistantChat.tsx +53 -26
  17. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
  18. package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
  19. package/corpus/core/src/client/chat/message-components.tsx +35 -1
  20. package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
  21. package/corpus/core/src/connections/catalog.ts +20 -1
  22. package/corpus/core/src/connections/reader.ts +65 -0
  23. package/corpus/core/src/dashboard-storage/index.ts +27 -0
  24. package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
  25. package/corpus/core/src/dashboard-storage/schema.ts +62 -0
  26. package/corpus/core/src/dashboard-storage/store.ts +333 -0
  27. package/corpus/core/src/deploy/build.ts +95 -16
  28. package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
  29. package/corpus/core/src/eject/workspace-connections.ts +1 -0
  30. package/corpus/core/src/extensions/actions.ts +199 -73
  31. package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
  32. package/corpus/core/src/jobs/scheduler.ts +71 -4
  33. package/corpus/core/src/jobs/tools.ts +31 -1
  34. package/corpus/core/src/localization/default-messages.ts +1 -0
  35. package/corpus/core/src/mcp-client/index.ts +6 -0
  36. package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
  37. package/corpus/core/src/provider-api/index.ts +190 -5
  38. package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
  39. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
  40. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  41. package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
  42. package/corpus/core/src/server/core-routes-plugin.ts +1 -0
  43. package/corpus/core/src/server/credential-provider.ts +9 -3
  44. package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
  45. package/corpus/core/src/styles/agent-native.css +45 -2
  46. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  47. package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  48. package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  49. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  53. package/corpus/core/src/triggers/actions.ts +11 -2
  54. package/corpus/core/src/triggers/dispatcher.ts +20 -1
  55. package/corpus/core/src/triggers/types.ts +5 -0
  56. package/corpus/core/src/vite/action-types-plugin.ts +9 -1
  57. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
  58. package/corpus/templates/analytics/AGENTS.md +11 -11
  59. package/corpus/templates/analytics/_gitignore +39 -0
  60. package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
  61. package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
  62. package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
  63. package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
  64. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
  65. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
  66. package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
  67. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
  68. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
  69. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
  70. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
  71. package/corpus/templates/calendar/_gitignore +39 -0
  72. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  73. package/corpus/templates/chat/AGENTS.md +1 -1
  74. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
  75. package/corpus/templates/clips/AGENTS.md +7 -0
  76. package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
  77. package/corpus/templates/clips/app/components/library/bulk-action-toolbar.tsx +25 -8
  78. package/corpus/templates/clips/app/components/library/library-grid.tsx +118 -9
  79. package/corpus/templates/clips/app/components/library/library-layout.tsx +1 -1
  80. package/corpus/templates/clips/app/components/library/recording-card.tsx +10 -8
  81. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
  82. package/corpus/templates/clips/app/i18n/en-US.ts +6 -0
  83. package/corpus/templates/clips/app/routes/_app.trash.tsx +16 -1
  84. package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
  85. package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
  86. package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
  87. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
  88. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
  89. package/corpus/templates/clips/desktop/src/app.tsx +24 -3
  90. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
  91. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
  92. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  93. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
  94. package/corpus/templates/content/_gitignore +39 -0
  95. package/corpus/templates/content/app/components/editor/database/DatabaseView.tsx +20 -38
  96. package/corpus/templates/content/app/components/editor/previewDocumentSaveController.ts +40 -1
  97. package/corpus/templates/content/learnings.defaults.md +5 -0
  98. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  99. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
  100. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
  101. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  102. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  103. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
  104. package/corpus/templates/crm/.env.example +5 -0
  105. package/corpus/templates/crm/AGENTS.md +120 -0
  106. package/corpus/templates/crm/CHANGELOG.md +1 -0
  107. package/corpus/templates/crm/DEVELOPING.md +66 -0
  108. package/corpus/templates/crm/README.md +106 -0
  109. package/corpus/templates/crm/_gitignore +12 -0
  110. package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
  111. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  112. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  113. package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -0
  114. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  115. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  116. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  117. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  118. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  119. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  120. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  121. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -0
  122. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  123. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  124. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  125. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  126. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  127. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  128. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  129. package/corpus/templates/crm/actions/list-crm-proposals.ts +31 -0
  130. package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
  131. package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -0
  132. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  133. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  134. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  135. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  136. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  137. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  138. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  139. package/corpus/templates/crm/actions/navigate.ts +63 -0
  140. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  141. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  142. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  143. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  144. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  145. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  146. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  147. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  148. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  149. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
  150. package/corpus/templates/crm/actions/run.ts +11 -0
  151. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  152. package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
  153. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  154. package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
  155. package/corpus/templates/crm/actions/view-screen.ts +218 -0
  156. package/corpus/templates/crm/agent-native.app-skill.json +58 -0
  157. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  158. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
  159. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
  160. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
  161. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
  162. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
  163. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
  164. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
  165. package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
  166. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  167. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
  168. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
  169. package/corpus/templates/crm/app/entry.client.tsx +16 -0
  170. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  171. package/corpus/templates/crm/app/global.css +167 -0
  172. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +60 -0
  173. package/corpus/templates/crm/app/i18n/en-US.ts +89 -0
  174. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  175. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  176. package/corpus/templates/crm/app/lib/navigation.ts +54 -0
  177. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  178. package/corpus/templates/crm/app/lib/types.ts +172 -0
  179. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  180. package/corpus/templates/crm/app/root.tsx +88 -0
  181. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  182. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  183. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  184. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  185. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  186. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  187. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  188. package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
  189. package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
  190. package/corpus/templates/crm/app/routes/settings.tsx +63 -0
  191. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  192. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  193. package/corpus/templates/crm/app/routes/views.tsx +333 -0
  194. package/corpus/templates/crm/app/routes.ts +17 -0
  195. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  196. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
  197. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
  198. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
  199. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
  200. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
  201. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
  202. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
  203. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
  204. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
  205. package/corpus/templates/crm/components.json +20 -0
  206. package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
  207. package/corpus/templates/crm/learnings.defaults.md +5 -0
  208. package/corpus/templates/crm/package.json +59 -0
  209. package/corpus/templates/crm/public/favicon.svg +1 -0
  210. package/corpus/templates/crm/public/icon-180.svg +1 -0
  211. package/corpus/templates/crm/public/manifest.json +11 -0
  212. package/corpus/templates/crm/react-router.config.ts +7 -0
  213. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  214. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  215. package/corpus/templates/crm/server/crm/crm-mirror.ts +711 -0
  216. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
  217. package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -0
  218. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  219. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  220. package/corpus/templates/crm/server/db/crm-store.ts +1170 -0
  221. package/corpus/templates/crm/server/db/index.ts +169 -0
  222. package/corpus/templates/crm/server/db/schema.ts +441 -0
  223. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  224. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  225. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +100 -0
  226. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
  227. package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -0
  228. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  229. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  230. package/corpus/templates/crm/server/plugins/agent-chat.ts +68 -0
  231. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  232. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  233. package/corpus/templates/crm/server/plugins/db.ts +454 -0
  234. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  235. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  236. package/corpus/templates/crm/shared/crm-contract.ts +254 -0
  237. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  238. package/corpus/templates/crm/ssr-entry.ts +11 -0
  239. package/corpus/templates/crm/tsconfig.json +24 -0
  240. package/corpus/templates/crm/vite.config.ts +15 -0
  241. package/corpus/templates/crm/vitest.config.ts +5 -0
  242. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +115 -0
  243. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
  244. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
  245. package/corpus/templates/forms/_gitignore +39 -0
  246. package/corpus/templates/forms/learnings.defaults.md +5 -0
  247. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
  248. package/corpus/templates/macros/_gitignore +39 -0
  249. package/corpus/templates/macros/learnings.defaults.md +5 -0
  250. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
  251. package/corpus/templates/mail/_gitignore +39 -0
  252. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
  253. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
  254. package/corpus/templates/slides/_gitignore +39 -0
  255. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
  256. package/corpus/templates/tasks/_gitignore +39 -0
  257. package/corpus/toolkit/CHANGELOG.md +12 -0
  258. package/corpus/toolkit/README.md +30 -0
  259. package/corpus/toolkit/agent-native.eject.json +33 -0
  260. package/corpus/toolkit/package.json +15 -1
  261. package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
  262. package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
  263. package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
  264. package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
  265. package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
  266. package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
  267. package/corpus/toolkit/src/dashboard/index.ts +6 -0
  268. package/corpus/toolkit/src/index.ts +1 -0
  269. package/corpus/toolkit/src/ui/calendar.tsx +8 -8
  270. package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
  271. package/dist/action.d.ts +14 -1
  272. package/dist/action.d.ts.map +1 -1
  273. package/dist/action.js.map +1 -1
  274. package/dist/agent/production-agent.d.ts +3 -1
  275. package/dist/agent/production-agent.d.ts.map +1 -1
  276. package/dist/agent/production-agent.js +83 -3
  277. package/dist/agent/production-agent.js.map +1 -1
  278. package/dist/cli/templates-meta.d.ts.map +1 -1
  279. package/dist/cli/templates-meta.js +12 -0
  280. package/dist/cli/templates-meta.js.map +1 -1
  281. package/dist/client/AssistantChat.d.ts +4 -0
  282. package/dist/client/AssistantChat.d.ts.map +1 -1
  283. package/dist/client/AssistantChat.js +30 -17
  284. package/dist/client/AssistantChat.js.map +1 -1
  285. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  286. package/dist/client/agent-page/AgentJobsTab.js +3 -1
  287. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  288. package/dist/client/agent-page/use-jobs.d.ts +1 -0
  289. package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
  290. package/dist/client/agent-page/use-jobs.js.map +1 -1
  291. package/dist/client/chat/message-components.d.ts +5 -0
  292. package/dist/client/chat/message-components.d.ts.map +1 -1
  293. package/dist/client/chat/message-components.js +17 -1
  294. package/dist/client/chat/message-components.js.map +1 -1
  295. package/dist/client/chat/tool-call-display.d.ts +3 -1
  296. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  297. package/dist/client/chat/tool-call-display.js +17 -7
  298. package/dist/client/chat/tool-call-display.js.map +1 -1
  299. package/dist/collab/awareness.d.ts +2 -2
  300. package/dist/collab/awareness.d.ts.map +1 -1
  301. package/dist/collab/routes.d.ts +1 -1
  302. package/dist/collab/struct-routes.d.ts +1 -1
  303. package/dist/connections/catalog.d.ts +17 -3
  304. package/dist/connections/catalog.d.ts.map +1 -1
  305. package/dist/connections/catalog.js +16 -1
  306. package/dist/connections/catalog.js.map +1 -1
  307. package/dist/connections/reader.d.ts +18 -0
  308. package/dist/connections/reader.d.ts.map +1 -1
  309. package/dist/connections/reader.js +41 -0
  310. package/dist/connections/reader.js.map +1 -1
  311. package/dist/dashboard-storage/index.d.ts +4 -0
  312. package/dist/dashboard-storage/index.d.ts.map +1 -0
  313. package/dist/dashboard-storage/index.js +4 -0
  314. package/dist/dashboard-storage/index.js.map +1 -0
  315. package/dist/dashboard-storage/panel-source.d.ts +68 -0
  316. package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
  317. package/dist/dashboard-storage/panel-source.js +76 -0
  318. package/dist/dashboard-storage/panel-source.js.map +1 -0
  319. package/dist/dashboard-storage/schema.d.ts +562 -0
  320. package/dist/dashboard-storage/schema.d.ts.map +1 -0
  321. package/dist/dashboard-storage/schema.js +32 -0
  322. package/dist/dashboard-storage/schema.js.map +1 -0
  323. package/dist/dashboard-storage/store.d.ts +62 -0
  324. package/dist/dashboard-storage/store.d.ts.map +1 -0
  325. package/dist/dashboard-storage/store.js +227 -0
  326. package/dist/dashboard-storage/store.js.map +1 -0
  327. package/dist/deploy/build.d.ts +7 -0
  328. package/dist/deploy/build.d.ts.map +1 -1
  329. package/dist/deploy/build.js +78 -14
  330. package/dist/deploy/build.js.map +1 -1
  331. package/dist/eject/provider-api-definitions.d.ts +2 -1
  332. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  333. package/dist/eject/provider-api-definitions.js +1 -0
  334. package/dist/eject/provider-api-definitions.js.map +1 -1
  335. package/dist/eject/workspace-connections.d.ts.map +1 -1
  336. package/dist/eject/workspace-connections.js +1 -0
  337. package/dist/eject/workspace-connections.js.map +1 -1
  338. package/dist/extensions/actions.d.ts.map +1 -1
  339. package/dist/extensions/actions.js +165 -67
  340. package/dist/extensions/actions.js.map +1 -1
  341. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  342. package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
  343. package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
  344. package/dist/jobs/actions/list-recurring-jobs.js +1 -0
  345. package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
  346. package/dist/jobs/scheduler.d.ts +17 -2
  347. package/dist/jobs/scheduler.d.ts.map +1 -1
  348. package/dist/jobs/scheduler.js +51 -2
  349. package/dist/jobs/scheduler.js.map +1 -1
  350. package/dist/jobs/tools.d.ts.map +1 -1
  351. package/dist/jobs/tools.js +32 -2
  352. package/dist/jobs/tools.js.map +1 -1
  353. package/dist/localization/default-messages.d.ts +1 -0
  354. package/dist/localization/default-messages.d.ts.map +1 -1
  355. package/dist/localization/default-messages.js +1 -0
  356. package/dist/localization/default-messages.js.map +1 -1
  357. package/dist/mcp-client/index.d.ts +2 -0
  358. package/dist/mcp-client/index.d.ts.map +1 -1
  359. package/dist/mcp-client/index.js +5 -0
  360. package/dist/mcp-client/index.js.map +1 -1
  361. package/dist/observability/routes.d.ts +1 -1
  362. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  363. package/dist/provider-api/actions/provider-api.d.ts +8 -6
  364. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  365. package/dist/provider-api/actions/provider-api.js +1 -1
  366. package/dist/provider-api/actions/provider-api.js.map +1 -1
  367. package/dist/provider-api/index.d.ts +11 -7
  368. package/dist/provider-api/index.d.ts.map +1 -1
  369. package/dist/provider-api/index.js +143 -5
  370. package/dist/provider-api/index.js.map +1 -1
  371. package/dist/resources/handlers.d.ts +1 -1
  372. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  373. package/dist/secrets/register-framework-secrets.js +7 -0
  374. package/dist/secrets/register-framework-secrets.js.map +1 -1
  375. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  376. package/dist/server/agent-chat/context-tools.js +9 -0
  377. package/dist/server/agent-chat/context-tools.js.map +1 -1
  378. package/dist/server/agent-chat/framework-prompts.js +2 -2
  379. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  380. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  381. package/dist/server/agent-chat-plugin.js +18 -2
  382. package/dist/server/agent-chat-plugin.js.map +1 -1
  383. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  384. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  385. package/dist/server/core-routes-plugin.js +1 -0
  386. package/dist/server/core-routes-plugin.js.map +1 -1
  387. package/dist/server/credential-provider.d.ts +4 -3
  388. package/dist/server/credential-provider.d.ts.map +1 -1
  389. package/dist/server/credential-provider.js +9 -3
  390. package/dist/server/credential-provider.js.map +1 -1
  391. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  392. package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
  393. package/dist/server/workspace-provider-oauth.js +141 -4
  394. package/dist/server/workspace-provider-oauth.js.map +1 -1
  395. package/dist/styles/agent-native.css +45 -2
  396. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  397. package/dist/templates/chat/AGENTS.md +1 -1
  398. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  399. package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  400. package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  401. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  402. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  403. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  404. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  405. package/dist/triggers/actions.d.ts.map +1 -1
  406. package/dist/triggers/actions.js +10 -2
  407. package/dist/triggers/actions.js.map +1 -1
  408. package/dist/triggers/dispatcher.d.ts.map +1 -1
  409. package/dist/triggers/dispatcher.js +15 -0
  410. package/dist/triggers/dispatcher.js.map +1 -1
  411. package/dist/triggers/types.d.ts +5 -0
  412. package/dist/triggers/types.d.ts.map +1 -1
  413. package/dist/triggers/types.js.map +1 -1
  414. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  415. package/dist/vite/action-types-plugin.js +4 -1
  416. package/dist/vite/action-types-plugin.js.map +1 -1
  417. package/docs/content/agent-native-toolkit.mdx +16 -0
  418. package/docs/content/recurring-jobs.mdx +35 -6
  419. package/package.json +6 -2
  420. package/src/action.ts +22 -1
  421. package/src/agent/production-agent.ts +105 -3
  422. package/src/cli/templates-meta.ts +12 -0
  423. package/src/client/AssistantChat.tsx +53 -26
  424. package/src/client/agent-page/AgentJobsTab.tsx +19 -0
  425. package/src/client/agent-page/use-jobs.ts +1 -0
  426. package/src/client/chat/message-components.tsx +35 -1
  427. package/src/client/chat/tool-call-display.tsx +38 -3
  428. package/src/connections/catalog.ts +20 -1
  429. package/src/connections/reader.ts +65 -0
  430. package/src/dashboard-storage/index.ts +27 -0
  431. package/src/dashboard-storage/panel-source.ts +168 -0
  432. package/src/dashboard-storage/schema.ts +62 -0
  433. package/src/dashboard-storage/store.ts +333 -0
  434. package/src/deploy/build.ts +95 -16
  435. package/src/eject/provider-api-definitions.ts +1 -0
  436. package/src/eject/workspace-connections.ts +1 -0
  437. package/src/extensions/actions.ts +199 -73
  438. package/src/jobs/actions/list-recurring-jobs.ts +2 -0
  439. package/src/jobs/scheduler.ts +71 -4
  440. package/src/jobs/tools.ts +31 -1
  441. package/src/localization/default-messages.ts +1 -0
  442. package/src/mcp-client/index.ts +6 -0
  443. package/src/provider-api/actions/provider-api.ts +1 -1
  444. package/src/provider-api/index.ts +190 -5
  445. package/src/secrets/register-framework-secrets.ts +8 -0
  446. package/src/server/agent-chat/context-tools.ts +9 -0
  447. package/src/server/agent-chat/framework-prompts.ts +2 -2
  448. package/src/server/agent-chat-plugin.ts +22 -2
  449. package/src/server/core-routes-plugin.ts +1 -0
  450. package/src/server/credential-provider.ts +9 -3
  451. package/src/server/workspace-provider-oauth.ts +181 -4
  452. package/src/styles/agent-native.css +45 -2
  453. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  454. package/src/templates/chat/AGENTS.md +1 -1
  455. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  456. package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  457. package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  458. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  459. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  460. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  461. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  462. package/src/triggers/actions.ts +11 -2
  463. package/src/triggers/dispatcher.ts +20 -1
  464. package/src/triggers/types.ts +5 -0
  465. package/src/vite/action-types-plugin.ts +9 -1
  466. package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
  467. package/corpus/templates/analytics/server/routes/api/sql-query.post.ts +0 -1
@@ -61,6 +61,7 @@
61
61
  "gmail",
62
62
  "google_drive",
63
63
  "hubspot",
64
+ "salesforce",
64
65
  "jira",
65
66
  "sentry",
66
67
  "granola",
@@ -98,6 +99,7 @@
98
99
  "granola",
99
100
  "grafana",
100
101
  "hubspot",
102
+ "salesforce",
101
103
  "jira",
102
104
  "mixpanel",
103
105
  "notion",
@@ -5,6 +5,8 @@ import { existsSync, statSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
7
 
8
+ import { shouldUseSourceFallback } from "./launcher.js";
9
+
8
10
  const binDir = dirname(fileURLToPath(import.meta.url));
9
11
  const distEntry = join(binDir, "../dist/cli/index.js");
10
12
  const sourceEntry = join(binDir, "../src/cli/index.ts");
@@ -16,31 +18,50 @@ const freshnessChecks = [
16
18
  ],
17
19
  ];
18
20
 
19
- function shouldUseSourceFallback() {
20
- if (!existsSync(sourceEntry)) return false;
21
- if (!existsSync(distEntry)) return true;
21
+ // The tsx source fallback and mtime freshness check are for local monorepo
22
+ // development only. Published installs ship both src and dist, and tarball
23
+ // extraction can leave .ts files newer than .js, which must not trigger tsx
24
+ // (not a runtime dependency). Only consider the fallback in a source checkout.
25
+ const isSourceCheckout = existsSync(join(binDir, "../tsconfig.cli.json"));
26
+
27
+ function statMtimeMs(path) {
22
28
  try {
23
- return freshnessChecks.some(
24
- ([source, dist]) =>
25
- existsSync(source) &&
26
- existsSync(dist) &&
27
- statSync(source).mtimeMs > statSync(dist).mtimeMs,
28
- );
29
+ return statSync(path).mtimeMs;
29
30
  } catch {
30
- return false;
31
+ return 0;
31
32
  }
32
33
  }
33
34
 
34
- if (!shouldUseSourceFallback() && existsSync(distEntry)) {
35
- await import(pathToFileURL(distEntry).href);
36
- } else {
37
- if (!existsSync(sourceEntry)) {
35
+ const freshness = freshnessChecks.map(([source, dist]) => {
36
+ const sourceExists = existsSync(source);
37
+ const distExists = existsSync(dist);
38
+ return {
39
+ sourceExists,
40
+ distExists,
41
+ sourceMtimeMs: sourceExists ? statMtimeMs(source) : 0,
42
+ distMtimeMs: distExists ? statMtimeMs(dist) : 0,
43
+ };
44
+ });
45
+
46
+ const useSourceFallback = shouldUseSourceFallback({
47
+ isSourceCheckout,
48
+ sourceEntryExists: existsSync(sourceEntry),
49
+ distEntryExists: existsSync(distEntry),
50
+ freshness,
51
+ });
52
+
53
+ if (!useSourceFallback) {
54
+ // Installed packages (and up-to-date checkouts) always run the shipped build.
55
+ // tsx is not a runtime dependency, so it must never be invoked here.
56
+ if (!existsSync(distEntry)) {
38
57
  console.error(
39
58
  "agent-native CLI build output is missing. Run `pnpm --filter @agent-native/core build` and try again.",
40
59
  );
41
60
  process.exit(1);
42
61
  }
43
62
 
63
+ await import(pathToFileURL(distEntry).href);
64
+ } else {
44
65
  const child = spawn("tsx", [sourceEntry, ...process.argv.slice(2)], {
45
66
  stdio: "inherit",
46
67
  env: process.env,
@@ -0,0 +1,34 @@
1
+ // Pure decision logic for the agent-native CLI launcher shim, kept dependency
2
+ // free so it can be unit tested without touching the filesystem.
3
+ //
4
+ // The tsx source fallback and mtime freshness check exist for local monorepo
5
+ // development only. Published installs ship both src and dist, and tarball
6
+ // extraction can leave .ts files newer than .js — that must never route to tsx
7
+ // (not a runtime dependency), or `npx @agent-native/core ...` fails with
8
+ // `spawn tsx ENOENT`. The `isSourceCheckout` gate is what keeps installed
9
+ // packages on the shipped dist build.
10
+
11
+ /**
12
+ * @param {object} input
13
+ * @param {boolean} input.isSourceCheckout Whether we run from a monorepo checkout.
14
+ * @param {boolean} input.sourceEntryExists Whether the .ts CLI entry exists.
15
+ * @param {boolean} input.distEntryExists Whether the compiled .js CLI entry exists.
16
+ * @param {Array<{sourceExists: boolean, distExists: boolean, sourceMtimeMs: number, distMtimeMs: number}>} [input.freshness]
17
+ * @returns {boolean}
18
+ */
19
+ export function shouldUseSourceFallback({
20
+ isSourceCheckout,
21
+ sourceEntryExists,
22
+ distEntryExists,
23
+ freshness = [],
24
+ }) {
25
+ if (!isSourceCheckout) return false;
26
+ if (!sourceEntryExists) return false;
27
+ if (!distEntryExists) return true;
28
+ return freshness.some(
29
+ (pair) =>
30
+ pair.sourceExists &&
31
+ pair.distExists &&
32
+ pair.sourceMtimeMs > pair.distMtimeMs,
33
+ );
34
+ }
package/corpus/README.md CHANGED
@@ -28,6 +28,6 @@ rg -n "defineAction|useActionQuery" node_modules/@agent-native/core/corpus
28
28
 
29
29
  ## Generated Counts
30
30
 
31
- - core files: 1520
32
- - toolkit files: 137
33
- - template files: 6194
31
+ - core files: 1527
32
+ - toolkit files: 144
33
+ - template files: 6367
@@ -1,5 +1,40 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.115.1
4
+
5
+ ### Patch Changes
6
+
7
+ - 321567c: Add `app-branding` and `app-permissions` to the default framework skill set. `app-branding` is layout-aware — it handles both the centralized `app/lib/app-config.ts` source-of-truth layout and the inlined layout where the name/title live across `package.json`, route `meta()`, and `app/root.tsx`. Generated apps using `frameworkSkills: "default"` now receive both skills on scaffold and `skills update`.
8
+
9
+ ## 0.115.0
10
+
11
+ ### Minor Changes
12
+
13
+ - 0341a7d: Allow the published CLI to scaffold the hidden CRM template explicitly, and include factory-backed actions in production static registries.
14
+ - 0341a7d: Pass trusted trigger automation lineage and a stored policy id to action runs.
15
+ - 0341a7d: Add reusable per-app dashboard storage factories, bounded revision history, and provider-neutral panel source resolvers.
16
+ - 0341a7d: Add Salesforce workspace connections and CRM reader metadata for template-owned integrations.
17
+
18
+ ### Patch Changes
19
+
20
+ - 0341a7d: Allow hosted authenticated requests to use deployment-level transactional email configuration.
21
+ - 0341a7d: Keep Netlify-hosted apps and their databases warm with site-local scheduled health checks.
22
+ - 0341a7d: Prevent duplicate Thinking statuses and scroll bounce during streamed reasoning, while giving active tool rows a clear live state and new tool rows a subtle entrance.
23
+ - 0341a7d: Require an explicit workspace connection when making Salesforce provider API requests, so each request uses a matched instance URL and OAuth account.
24
+ - 0341a7d: Prevent model gateways from breaking extension edits by using a compact required update contract and normalizing optional placeholder arguments before validation.
25
+ - 0341a7d: Fix Salesforce token refresh when configured with Consumer Key/Secret.
26
+ - 0341a7d: Allow recurring jobs to bind an explicit MCP tool allowlist and resolve those connected capabilities with the job's existing user/org OAuth context.
27
+ - 0341a7d: Teach the agent-native-docs skill to reuse node_modules reference source with rg and cp: version-matched installed source beats web docs, and every first-party template's corpus is fair game to copy and adapt, not just runtime internals that need the customizing-agent-native ladder.
28
+ - 0341a7d: Make the missing-AI composer state visibly actionable with a Connect AI button.
29
+ - Updated dependencies [0341a7d]
30
+ - @agent-native/toolkit@0.9.0
31
+
32
+ ## 0.114.16
33
+
34
+ ### Patch Changes
35
+
36
+ - 3a3eb9a: Fix `npx @agent-native/core create` failing with `spawn tsx ENOENT`. The CLI launcher's tsx source fallback is now scoped to monorepo source checkouts, so installed packages always run the shipped `dist` build even when tarball extraction leaves `.ts` files newer than their compiled `.js`.
37
+
3
38
  ## 0.114.15
4
39
 
5
40
  ### Patch Changes
@@ -61,6 +61,7 @@
61
61
  "gmail",
62
62
  "google_drive",
63
63
  "hubspot",
64
+ "salesforce",
64
65
  "jira",
65
66
  "sentry",
66
67
  "granola",
@@ -98,6 +99,7 @@
98
99
  "granola",
99
100
  "grafana",
100
101
  "hubspot",
102
+ "salesforce",
101
103
  "jira",
102
104
  "mixpanel",
103
105
  "notion",
@@ -5,6 +5,8 @@ import { existsSync, statSync } from "node:fs";
5
5
  import { dirname, join } from "node:path";
6
6
  import { fileURLToPath, pathToFileURL } from "node:url";
7
7
 
8
+ import { shouldUseSourceFallback } from "./launcher.js";
9
+
8
10
  const binDir = dirname(fileURLToPath(import.meta.url));
9
11
  const distEntry = join(binDir, "../dist/cli/index.js");
10
12
  const sourceEntry = join(binDir, "../src/cli/index.ts");
@@ -16,31 +18,50 @@ const freshnessChecks = [
16
18
  ],
17
19
  ];
18
20
 
19
- function shouldUseSourceFallback() {
20
- if (!existsSync(sourceEntry)) return false;
21
- if (!existsSync(distEntry)) return true;
21
+ // The tsx source fallback and mtime freshness check are for local monorepo
22
+ // development only. Published installs ship both src and dist, and tarball
23
+ // extraction can leave .ts files newer than .js, which must not trigger tsx
24
+ // (not a runtime dependency). Only consider the fallback in a source checkout.
25
+ const isSourceCheckout = existsSync(join(binDir, "../tsconfig.cli.json"));
26
+
27
+ function statMtimeMs(path) {
22
28
  try {
23
- return freshnessChecks.some(
24
- ([source, dist]) =>
25
- existsSync(source) &&
26
- existsSync(dist) &&
27
- statSync(source).mtimeMs > statSync(dist).mtimeMs,
28
- );
29
+ return statSync(path).mtimeMs;
29
30
  } catch {
30
- return false;
31
+ return 0;
31
32
  }
32
33
  }
33
34
 
34
- if (!shouldUseSourceFallback() && existsSync(distEntry)) {
35
- await import(pathToFileURL(distEntry).href);
36
- } else {
37
- if (!existsSync(sourceEntry)) {
35
+ const freshness = freshnessChecks.map(([source, dist]) => {
36
+ const sourceExists = existsSync(source);
37
+ const distExists = existsSync(dist);
38
+ return {
39
+ sourceExists,
40
+ distExists,
41
+ sourceMtimeMs: sourceExists ? statMtimeMs(source) : 0,
42
+ distMtimeMs: distExists ? statMtimeMs(dist) : 0,
43
+ };
44
+ });
45
+
46
+ const useSourceFallback = shouldUseSourceFallback({
47
+ isSourceCheckout,
48
+ sourceEntryExists: existsSync(sourceEntry),
49
+ distEntryExists: existsSync(distEntry),
50
+ freshness,
51
+ });
52
+
53
+ if (!useSourceFallback) {
54
+ // Installed packages (and up-to-date checkouts) always run the shipped build.
55
+ // tsx is not a runtime dependency, so it must never be invoked here.
56
+ if (!existsSync(distEntry)) {
38
57
  console.error(
39
58
  "agent-native CLI build output is missing. Run `pnpm --filter @agent-native/core build` and try again.",
40
59
  );
41
60
  process.exit(1);
42
61
  }
43
62
 
63
+ await import(pathToFileURL(distEntry).href);
64
+ } else {
44
65
  const child = spawn("tsx", [sourceEntry, ...process.argv.slice(2)], {
45
66
  stdio: "inherit",
46
67
  env: process.env,
@@ -0,0 +1,34 @@
1
+ // Pure decision logic for the agent-native CLI launcher shim, kept dependency
2
+ // free so it can be unit tested without touching the filesystem.
3
+ //
4
+ // The tsx source fallback and mtime freshness check exist for local monorepo
5
+ // development only. Published installs ship both src and dist, and tarball
6
+ // extraction can leave .ts files newer than .js — that must never route to tsx
7
+ // (not a runtime dependency), or `npx @agent-native/core ...` fails with
8
+ // `spawn tsx ENOENT`. The `isSourceCheckout` gate is what keeps installed
9
+ // packages on the shipped dist build.
10
+
11
+ /**
12
+ * @param {object} input
13
+ * @param {boolean} input.isSourceCheckout Whether we run from a monorepo checkout.
14
+ * @param {boolean} input.sourceEntryExists Whether the .ts CLI entry exists.
15
+ * @param {boolean} input.distEntryExists Whether the compiled .js CLI entry exists.
16
+ * @param {Array<{sourceExists: boolean, distExists: boolean, sourceMtimeMs: number, distMtimeMs: number}>} [input.freshness]
17
+ * @returns {boolean}
18
+ */
19
+ export function shouldUseSourceFallback({
20
+ isSourceCheckout,
21
+ sourceEntryExists,
22
+ distEntryExists,
23
+ freshness = [],
24
+ }) {
25
+ if (!isSourceCheckout) return false;
26
+ if (!sourceEntryExists) return false;
27
+ if (!distEntryExists) return true;
28
+ return freshness.some(
29
+ (pair) =>
30
+ pair.sourceExists &&
31
+ pair.distExists &&
32
+ pair.sourceMtimeMs > pair.distMtimeMs,
33
+ );
34
+ }
@@ -112,6 +112,22 @@ being rebuilt in slightly different ways every time.
112
112
  keep an independent lifecycle manifest, dependency graph, and release cadence.
113
113
  - Dispatch remains a **separate product**, not a Toolkit capability module.
114
114
 
115
+ ## Dashboard kit {#dashboard-kit}
116
+
117
+ `@agent-native/toolkit/dashboard` is an ejectable, presentation-only unit for
118
+ metric and stats cards, data tables, date-range controls, panel ordering and
119
+ layout, and generic chart rendering. It receives rows and callbacks from an
120
+ app-owned adapter: it never fetches data, resolves credentials, or owns a
121
+ dashboard's state.
122
+
123
+ Use `agent-native eject inspect toolkit/dashboard` before applying
124
+ `toolkit/dashboard` to an app. Keep durable dashboards in that app with
125
+ `@agent-native/core/dashboard-storage`: instantiate its access-scoped schema
126
+ and store per app, not in a cross-app dashboard table. Panel data flows through
127
+ a `PanelSourceResolver`; the built-in `program` source runs an app-owned data
128
+ program and is the canonical no-provider default. Provider resolvers belong in
129
+ the app that owns their connection and query policy.
130
+
115
131
  ## Implementation Boundary {#implementation-boundary}
116
132
 
117
133
  Toolkit docs are organized by reusable product capability, not npm package.
@@ -60,9 +60,37 @@ That's it. The body is a prompt the agent runs at each scheduled firing. The age
60
60
  | `lastStatus` | `"success"` \| `"error"` \| … | _(managed)_ | Latest outcome. |
61
61
  | `lastError` | string | _(managed)_ | Error message if the last run failed. |
62
62
  | `nextRun` | ISO timestamp | _(managed)_ | Computed from `schedule`; used by the scheduler to decide when to fire next. |
63
+ | `mcpTools` | array of MCP tool names | _(none)_ | Optional explicit allowlist such as `mcp__server__tool`; credentials stay in the connected MCP grant. |
63
64
 
64
65
  The `last*` and `nextRun` fields are written by the scheduler. You can read them to see the history, but don't edit them by hand — the next run will overwrite.
65
66
 
67
+ ## Connecting MCP tools to a job {#connected-mcps}
68
+
69
+ Recurring jobs can use remote or local MCP tools that are already connected to
70
+ the app. Ask the agent to discover the exact names with `tool-search`, then
71
+ bind only the tools that job needs with `mcpTools`:
72
+
73
+ ```md
74
+ ---
75
+ schedule: "0 * * * *"
76
+ enabled: true
77
+ mcpTools:
78
+ ["mcp__meeting-notes__list_recordings", "mcp__meeting-notes__get_transcript"]
79
+ ---
80
+
81
+ Find new recordings since the last successful run. Extract only actionable
82
+ follow-ups, then call the app's bounded import action once with stable source
83
+ and external ids, a short citation, and the recording URL. Do not import the
84
+ full transcript.
85
+ ```
86
+
87
+ The job stores tool names, not MCP URLs, access tokens, or OAuth refresh
88
+ tokens. At run time, the framework resolves the connected grant in the job's
89
+ creator or organization request context and exposes only the allowlisted
90
+ tools. Keep the list narrow, and use an idempotent app action for the final
91
+ import so overlapping runs do not create duplicates. See [MCP Clients](/docs/mcp-clients)
92
+ for connection and OAuth setup.
93
+
66
94
  ## Cron syntax {#cron}
67
95
 
68
96
  Standard 5-field cron (minute, hour, day-of-month, month, day-of-week):
@@ -191,12 +219,12 @@ The scheduler is a framework plugin (the internal `processRecurringJobs()` routi
191
219
 
192
220
  A single `manage-jobs` tool is registered in every template. The `action` parameter selects the operation:
193
221
 
194
- | Action | Parameters | Purpose |
195
- | -------- | -------------------------------------------------------------------------- | ------------------------------------------------------------ |
196
- | `create` | `name`, `schedule`, `instructions` (required); `scope`, `runAs`, `model` | Create a new recurring job |
197
- | `list` | `scope` (`personal`, `shared`, or all) | List all jobs with status (schedule, enabled, last/next run) |
198
- | `update` | `name` (required); `schedule`, `instructions`, `enabled`, `runAs`, `model` | Edit an existing job |
199
- | `delete` | `name` (required) | Delete a job — always confirm with the user first |
222
+ | Action | Parameters | Purpose |
223
+ | -------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------ |
224
+ | `create` | `name`, `schedule`, `instructions` (required); `scope`, `runAs`, `model`, `mcpTools` | Create a new recurring job |
225
+ | `list` | `scope` (`personal`, `shared`, or all) | List all jobs with status (schedule, enabled, last/next run) |
226
+ | `update` | `name` (required); `schedule`, `instructions`, `enabled`, `runAs`, `model`, `mcpTools` | Edit an existing job |
227
+ | `delete` | `name` (required) | Delete a job — always confirm with the user first |
200
228
 
201
229
  `model` is optional on both `create` and `update` — pass a model id to override the channel/app/engine default for that one routine.
202
230
 
@@ -216,4 +244,5 @@ Recurring jobs are "how do I make the agent act on its own?" The scheduling pack
216
244
  - [**Automations**](/docs/automations) — add event triggers and conditions to the same `jobs/` format
217
245
  - [**Agent Resources**](/docs/workspace) — where jobs live alongside skills, memory, and custom agents
218
246
  - [**Actions**](/docs/actions) — the tools a job calls
247
+ - [**MCP Clients**](/docs/mcp-clients) — connect remote or local MCP tools and OAuth grants
219
248
  - [**Agent Teams**](/docs/agent-teams) — jobs often spawn sub-agents to do parallel work
@@ -144,6 +144,10 @@
144
144
  "dist/data-programs/index.d.ts",
145
145
  "dist/data-programs/index.js"
146
146
  ],
147
+ "./dashboard-storage": [
148
+ "dist/dashboard-storage/index.d.ts",
149
+ "dist/dashboard-storage/index.js"
150
+ ],
147
151
  "./data-widgets": ["dist/data-widgets/index.js"],
148
152
  "./db": ["dist/db/index.js"],
149
153
  "./db-admin": ["dist/db-admin/index.js"],
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.114.15",
3
+ "version": "0.115.1",
4
4
  "description": "Framework for agent-native application development — where AI agents and UI share SQL state, actions, and context",
5
5
  "homepage": "https://github.com/BuilderIO/agent-native#readme",
6
6
  "bugs": {
@@ -276,6 +276,10 @@
276
276
  "types": "./dist/data-programs/index.d.ts",
277
277
  "default": "./dist/data-programs/index.js"
278
278
  },
279
+ "./dashboard-storage": {
280
+ "types": "./dist/dashboard-storage/index.d.ts",
281
+ "default": "./dist/dashboard-storage/index.js"
282
+ },
279
283
  "./local-artifacts": {
280
284
  "types": "./dist/local-artifacts/index.d.ts",
281
285
  "default": "./dist/local-artifacts/index.js"
@@ -27,8 +27,27 @@ import type { ActionAuditConfig } from "./audit/types.js";
27
27
  * - `"a2a"` — a direct, explicitly exposed read-only A2A action dispatch.
28
28
  * Natural-language A2A delegation still runs through the agent loop and its
29
29
  * selected actions are attributed as `"tool"`.
30
+ * - `"automation"` — an event-triggered automation dispatched from a stored
31
+ * workspace trigger with trusted trigger lineage.
30
32
  */
31
- export type ActionCaller = "tool" | "http" | "frontend" | "cli" | "mcp" | "a2a";
33
+ export type ActionCaller =
34
+ | "tool"
35
+ | "http"
36
+ | "frontend"
37
+ | "cli"
38
+ | "mcp"
39
+ | "a2a"
40
+ | "automation";
41
+
42
+ /**
43
+ * Trusted automation lineage added by the trigger dispatcher. Action inputs
44
+ * must never be used to create or override this context.
45
+ */
46
+ export interface ActionAutomationContext {
47
+ triggerId: string;
48
+ triggerName: string;
49
+ policyId?: string;
50
+ }
32
51
 
33
52
  /**
34
53
  * Context passed as the optional second argument to an action's `run`.
@@ -56,6 +75,8 @@ export interface ActionRunContext {
56
75
  orgId?: string | null;
57
76
  /** How this action was invoked. */
58
77
  caller: ActionCaller;
78
+ /** Present only for trigger-dispatched automation calls. */
79
+ automation?: ActionAutomationContext;
59
80
  /** Verified network lineage for direct delegated action calls. */
60
81
  networkProtocol?: "a2a" | "mcp" | "provider-api";
61
82
  networkId?: string;
@@ -8,7 +8,11 @@ import {
8
8
  } from "h3";
9
9
  import type { EventHandler as H3EventHandler } from "h3";
10
10
 
11
- import { isAgentActionStopError, type ActionCaller } from "../action.js";
11
+ import {
12
+ isAgentActionStopError,
13
+ type ActionAutomationContext,
14
+ type ActionCaller,
15
+ } from "../action.js";
12
16
  import { readAppState } from "../application-state/script-helpers.js";
13
17
  import { isReadOnlyShellCommand } from "../coding-tools/index.js";
14
18
  import { extensionIdFromPathname } from "../extensions/path.js";
@@ -3107,6 +3111,91 @@ const rawToolInputAjv = new Ajv({
3107
3111
 
3108
3112
  const rawToolInputValidatorCache = new WeakMap<object, ValidateFunction>();
3109
3113
 
3114
+ const optionalPlaceholderAjv = new Ajv({
3115
+ strict: false,
3116
+ allErrors: false,
3117
+ coerceTypes: false,
3118
+ useDefaults: false,
3119
+ removeAdditional: false,
3120
+ });
3121
+
3122
+ const optionalPlaceholderValidatorCache = new WeakMap<
3123
+ object,
3124
+ ValidateFunction
3125
+ >();
3126
+
3127
+ function isStructurallyEmptyToolValue(value: unknown): boolean {
3128
+ if (value === false) return true;
3129
+ if (value === null) return true;
3130
+ if (typeof value === "string") return value.trim().length === 0;
3131
+ if (Array.isArray(value)) {
3132
+ return (
3133
+ value.length === 0 ||
3134
+ value.every(
3135
+ (item) =>
3136
+ item !== null &&
3137
+ typeof item === "object" &&
3138
+ !Array.isArray(item) &&
3139
+ Object.keys(item).length === 0,
3140
+ )
3141
+ );
3142
+ }
3143
+ return (
3144
+ typeof value === "object" &&
3145
+ value !== null &&
3146
+ Object.keys(value).length === 0
3147
+ );
3148
+ }
3149
+
3150
+ function schemaAcceptsToolValue(schema: object, value: unknown): boolean {
3151
+ let validator = optionalPlaceholderValidatorCache.get(schema);
3152
+ if (!validator) {
3153
+ try {
3154
+ validator = optionalPlaceholderAjv.compile(schema);
3155
+ optionalPlaceholderValidatorCache.set(schema, validator);
3156
+ } catch {
3157
+ return false;
3158
+ }
3159
+ }
3160
+ return Boolean(validator(value));
3161
+ }
3162
+
3163
+ /**
3164
+ * Some model gateways fill every optional tool field with an empty sentinel
3165
+ * instead of omitting it. One schema-invalid empty value proves that pattern;
3166
+ * only then strip the other optional empty/default sentinels from the call.
3167
+ * Calls whose empty values are all schema-valid keep their intentional clears.
3168
+ */
3169
+ function normalizeOptionalToolPlaceholders(
3170
+ schema: RawJsonSchema | undefined,
3171
+ input: unknown,
3172
+ ): { input: unknown; changed: boolean } {
3173
+ if (!schema?.properties || !input || typeof input !== "object") {
3174
+ return { input, changed: false };
3175
+ }
3176
+ if (Array.isArray(input)) return { input, changed: false };
3177
+
3178
+ const required = new Set(
3179
+ Array.isArray(schema.required) ? schema.required : [],
3180
+ );
3181
+ const placeholders: string[] = [];
3182
+ let hasSchemaInvalidPlaceholder = false;
3183
+ for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
3184
+ if (required.has(key) || !isStructurallyEmptyToolValue(value)) continue;
3185
+ const propertySchema = schema.properties[key];
3186
+ if (!propertySchema || typeof propertySchema !== "object") continue;
3187
+ placeholders.push(key);
3188
+ if (!schemaAcceptsToolValue(propertySchema, value)) {
3189
+ hasSchemaInvalidPlaceholder = true;
3190
+ }
3191
+ }
3192
+ if (!hasSchemaInvalidPlaceholder) return { input, changed: false };
3193
+
3194
+ const normalized = { ...(input as Record<string, unknown>) };
3195
+ for (const key of placeholders) delete normalized[key];
3196
+ return { input: normalized, changed: true };
3197
+ }
3198
+
3110
3199
  function getRawToolInputValidator(schema: RawJsonSchema): ValidateFunction {
3111
3200
  const cached = rawToolInputValidatorCache.get(schema);
3112
3201
  if (cached) return cached;
@@ -3163,6 +3252,8 @@ export async function runAgentLoop(opts: {
3163
3252
  orgId?: string | null;
3164
3253
  /** Action invocation attribution. Defaults to the normal agent tool loop. */
3165
3254
  actionCaller?: ActionCaller;
3255
+ /** Trusted trigger lineage for automation-dispatched action calls. */
3256
+ automation?: ActionAutomationContext;
3166
3257
  /** Concrete execution id used for cross-app trace correlation. */
3167
3258
  runId?: string;
3168
3259
  /** Verified/telemetry-only delegated lineage supplied by the transport. */
@@ -4068,11 +4159,20 @@ export async function runAgentLoop(opts: {
4068
4159
  const runToolCall = async (
4069
4160
  toolCall: import("./engine/types.js").EngineToolCallPart,
4070
4161
  ): Promise<EngineContentPart> => {
4162
+ const actionEntry = actions[toolCall.name];
4163
+ const placeholderNormalization = actionEntry
4164
+ ? normalizeOptionalToolPlaceholders(
4165
+ actionEntry.tool.parameters,
4166
+ toolCall.input,
4167
+ )
4168
+ : { input: toolCall.input, changed: false };
4169
+ if (placeholderNormalization.changed) {
4170
+ toolCall = { ...toolCall, input: placeholderNormalization.input };
4171
+ }
4071
4172
  const wireToolInput = JSON.stringify(toolCall.input ?? {});
4072
4173
  const normalizedToolInput = normalizeToolCallInputForHistory(
4073
4174
  toolCall.input,
4074
4175
  );
4075
- const actionEntry = actions[toolCall.name];
4076
4176
  const sourceSweepGuard = shouldGuardRepeatedSourceSweep({
4077
4177
  toolName: toolCall.name,
4078
4178
  entry: actionEntry,
@@ -4227,6 +4327,7 @@ export async function runAgentLoop(opts: {
4227
4327
  userEmail: getRequestUserEmail(),
4228
4328
  orgId: getRequestOrgId() ?? null,
4229
4329
  caller: opts.actionCaller ?? "tool",
4330
+ automation: opts.automation,
4230
4331
  networkProtocol: opts.networkProtocol,
4231
4332
  networkId: opts.networkId,
4232
4333
  networkPeer: opts.networkPeer,
@@ -4490,7 +4591,7 @@ export async function runAgentLoop(opts: {
4490
4591
  });
4491
4592
 
4492
4593
  const toolCallSchemaError = toolCallErrors.get(toolCall.id);
4493
- if (toolCallSchemaError) {
4594
+ if (toolCallSchemaError && !placeholderNormalization.changed) {
4494
4595
  const result = finalizeToolErrorResult(
4495
4596
  toolInputSchemaErrorResult(
4496
4597
  toolCall.name,
@@ -4663,6 +4764,7 @@ export async function runAgentLoop(opts: {
4663
4764
  userEmail: actionUserEmail ?? undefined,
4664
4765
  orgId: actionOrgId,
4665
4766
  caller: opts.actionCaller ?? "tool",
4767
+ automation: opts.automation,
4666
4768
  networkProtocol: opts.networkProtocol,
4667
4769
  networkId: opts.networkId,
4668
4770
  networkPeer: opts.networkPeer,
@@ -228,6 +228,18 @@ export const TEMPLATES: TemplateMeta[] = [
228
228
  hidden: true,
229
229
  core: false,
230
230
  },
231
+ {
232
+ name: "crm",
233
+ label: "CRM",
234
+ hint: "Agent-native CRM companion with scoped HubSpot intelligence, workflows, and write proposals",
235
+ icon: "Users",
236
+ color: "#2563EB",
237
+ colorRgb: "37 99 235",
238
+ devPort: 8107,
239
+ hidden: true,
240
+ defaultMode: "dev",
241
+ core: false,
242
+ },
231
243
  {
232
244
  name: "macros",
233
245
  label: "Macros",