@agent-native/core 0.114.16 → 0.115.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (476) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +41 -0
  4. package/corpus/core/agent-native.eject.json +2 -0
  5. package/corpus/core/docs/content/agent-native-toolkit.mdx +16 -0
  6. package/corpus/core/docs/content/recurring-jobs.mdx +35 -6
  7. package/corpus/core/export-snapshot.json +4 -0
  8. package/corpus/core/package.json +5 -1
  9. package/corpus/core/src/action.ts +22 -1
  10. package/corpus/core/src/agent/production-agent.ts +122 -3
  11. package/corpus/core/src/cli/skills-content/visual-plan-skill.ts +19 -2
  12. package/corpus/core/src/cli/templates-meta.ts +12 -0
  13. package/corpus/core/src/client/AssistantChat.tsx +53 -26
  14. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
  15. package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
  16. package/corpus/core/src/client/blocks/library/wireframe.tsx +3 -1
  17. package/corpus/core/src/client/chat/message-components.tsx +35 -1
  18. package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
  19. package/corpus/core/src/connections/catalog.ts +20 -1
  20. package/corpus/core/src/connections/reader.ts +65 -0
  21. package/corpus/core/src/dashboard-storage/index.ts +27 -0
  22. package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
  23. package/corpus/core/src/dashboard-storage/schema.ts +62 -0
  24. package/corpus/core/src/dashboard-storage/store.ts +333 -0
  25. package/corpus/core/src/deploy/build.ts +95 -16
  26. package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
  27. package/corpus/core/src/eject/workspace-connections.ts +1 -0
  28. package/corpus/core/src/extensions/actions.ts +199 -73
  29. package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
  30. package/corpus/core/src/jobs/scheduler.ts +71 -4
  31. package/corpus/core/src/jobs/tools.ts +31 -1
  32. package/corpus/core/src/localization/default-messages.ts +1 -0
  33. package/corpus/core/src/mcp-client/index.ts +6 -0
  34. package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
  35. package/corpus/core/src/provider-api/index.ts +190 -5
  36. package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
  37. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
  38. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  39. package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
  40. package/corpus/core/src/server/core-routes-plugin.ts +1 -0
  41. package/corpus/core/src/server/credential-provider.ts +9 -3
  42. package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
  43. package/corpus/core/src/styles/agent-native.css +45 -2
  44. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  45. package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  46. package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  47. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  49. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  50. package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  51. package/corpus/core/src/triggers/actions.ts +11 -2
  52. package/corpus/core/src/triggers/dispatcher.ts +20 -1
  53. package/corpus/core/src/triggers/types.ts +5 -0
  54. package/corpus/core/src/vite/action-types-plugin.ts +9 -1
  55. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
  56. package/corpus/templates/analytics/AGENTS.md +11 -11
  57. package/corpus/templates/analytics/_gitignore +39 -0
  58. package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
  59. package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
  60. package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
  61. package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
  62. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
  63. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
  64. package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
  65. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
  66. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
  67. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
  68. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
  69. package/corpus/templates/calendar/_gitignore +39 -0
  70. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  71. package/corpus/templates/chat/AGENTS.md +1 -1
  72. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
  73. package/corpus/templates/clips/AGENTS.md +7 -0
  74. package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
  75. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
  76. package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
  77. package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
  78. package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
  79. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
  80. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
  81. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
  82. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
  83. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  84. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
  85. package/corpus/templates/content/_gitignore +39 -0
  86. package/corpus/templates/content/learnings.defaults.md +5 -0
  87. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  88. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
  89. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
  90. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  91. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  92. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
  93. package/corpus/templates/crm/.env.example +5 -0
  94. package/corpus/templates/crm/AGENTS.md +120 -0
  95. package/corpus/templates/crm/CHANGELOG.md +1 -0
  96. package/corpus/templates/crm/DEVELOPING.md +66 -0
  97. package/corpus/templates/crm/README.md +106 -0
  98. package/corpus/templates/crm/_gitignore +12 -0
  99. package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
  100. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  101. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  102. package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -0
  103. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  104. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  105. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  106. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  107. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  108. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  109. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  110. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -0
  111. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  112. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  113. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  114. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  115. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  116. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  117. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  118. package/corpus/templates/crm/actions/list-crm-proposals.ts +31 -0
  119. package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
  120. package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -0
  121. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  122. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  123. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  124. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  125. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  126. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  127. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  128. package/corpus/templates/crm/actions/navigate.ts +63 -0
  129. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  130. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  131. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  132. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  133. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  134. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  135. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  136. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  137. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  138. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
  139. package/corpus/templates/crm/actions/run.ts +11 -0
  140. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  141. package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
  142. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  143. package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
  144. package/corpus/templates/crm/actions/view-screen.ts +218 -0
  145. package/corpus/templates/crm/agent-native.app-skill.json +58 -0
  146. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  147. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
  148. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
  149. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
  150. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
  151. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
  152. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
  153. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
  154. package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
  155. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  156. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
  157. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
  158. package/corpus/templates/crm/app/entry.client.tsx +16 -0
  159. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  160. package/corpus/templates/crm/app/global.css +167 -0
  161. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +60 -0
  162. package/corpus/templates/crm/app/i18n/en-US.ts +89 -0
  163. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  164. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  165. package/corpus/templates/crm/app/lib/navigation.ts +54 -0
  166. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  167. package/corpus/templates/crm/app/lib/types.ts +172 -0
  168. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  169. package/corpus/templates/crm/app/root.tsx +88 -0
  170. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  171. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  172. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  173. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  174. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  175. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  176. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  177. package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
  178. package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
  179. package/corpus/templates/crm/app/routes/settings.tsx +63 -0
  180. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  181. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  182. package/corpus/templates/crm/app/routes/views.tsx +333 -0
  183. package/corpus/templates/crm/app/routes.ts +17 -0
  184. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  185. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
  186. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
  187. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
  188. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
  189. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
  190. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
  191. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
  192. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
  193. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
  194. package/corpus/templates/crm/components.json +20 -0
  195. package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
  196. package/corpus/templates/crm/learnings.defaults.md +5 -0
  197. package/corpus/templates/crm/package.json +59 -0
  198. package/corpus/templates/crm/public/favicon.svg +1 -0
  199. package/corpus/templates/crm/public/icon-180.svg +1 -0
  200. package/corpus/templates/crm/public/manifest.json +11 -0
  201. package/corpus/templates/crm/react-router.config.ts +7 -0
  202. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  203. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  204. package/corpus/templates/crm/server/crm/crm-mirror.ts +711 -0
  205. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
  206. package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -0
  207. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  208. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  209. package/corpus/templates/crm/server/db/crm-store.ts +1170 -0
  210. package/corpus/templates/crm/server/db/index.ts +169 -0
  211. package/corpus/templates/crm/server/db/schema.ts +441 -0
  212. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  213. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  214. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +100 -0
  215. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
  216. package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -0
  217. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  218. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  219. package/corpus/templates/crm/server/plugins/agent-chat.ts +68 -0
  220. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  221. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  222. package/corpus/templates/crm/server/plugins/db.ts +454 -0
  223. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  224. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  225. package/corpus/templates/crm/shared/crm-contract.ts +254 -0
  226. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  227. package/corpus/templates/crm/ssr-entry.ts +11 -0
  228. package/corpus/templates/crm/tsconfig.json +24 -0
  229. package/corpus/templates/crm/vite.config.ts +15 -0
  230. package/corpus/templates/crm/vitest.config.ts +5 -0
  231. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +115 -0
  232. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
  233. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
  234. package/corpus/templates/forms/_gitignore +39 -0
  235. package/corpus/templates/forms/learnings.defaults.md +5 -0
  236. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
  237. package/corpus/templates/macros/_gitignore +39 -0
  238. package/corpus/templates/macros/learnings.defaults.md +5 -0
  239. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
  240. package/corpus/templates/mail/_gitignore +39 -0
  241. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
  242. package/corpus/templates/plan/.agents/skills/visual-plan/SKILL.md +19 -2
  243. package/corpus/templates/plan/AGENTS.md +10 -0
  244. package/corpus/templates/plan/actions/create-prototype-plan.ts +27 -3
  245. package/corpus/templates/plan/actions/get-plan-blocks.ts +1 -1
  246. package/corpus/templates/plan/actions/update-visual-plan.ts +3 -2
  247. package/corpus/templates/plan/app/components/plan/PlanContentRenderer.tsx +18 -4
  248. package/corpus/templates/plan/app/components/plan/PlanVisualSurface.tsx +10 -3
  249. package/corpus/templates/plan/app/components/plan/wireframe/Wireframe.tsx +3 -1
  250. package/corpus/templates/plan/app/i18n/en-US.ts +6 -0
  251. package/corpus/templates/plan/app/lib/create-plan-routing.ts +39 -0
  252. package/corpus/templates/plan/app/pages/PlansPage.tsx +31 -107
  253. package/corpus/templates/plan/changelog/2026-07-22-high-fidelity-mockup-requests-now-preserve-branded-css-use-d.md +6 -0
  254. package/corpus/templates/plan/shared/plan-content.ts +110 -2
  255. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
  256. package/corpus/templates/slides/_gitignore +39 -0
  257. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
  258. package/corpus/templates/tasks/_gitignore +39 -0
  259. package/corpus/toolkit/CHANGELOG.md +12 -0
  260. package/corpus/toolkit/README.md +30 -0
  261. package/corpus/toolkit/agent-native.eject.json +33 -0
  262. package/corpus/toolkit/package.json +15 -1
  263. package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
  264. package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
  265. package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
  266. package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
  267. package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
  268. package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
  269. package/corpus/toolkit/src/dashboard/index.ts +6 -0
  270. package/corpus/toolkit/src/index.ts +1 -0
  271. package/corpus/toolkit/src/ui/calendar.tsx +8 -8
  272. package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
  273. package/dist/action.d.ts +14 -1
  274. package/dist/action.d.ts.map +1 -1
  275. package/dist/action.js.map +1 -1
  276. package/dist/agent/production-agent.d.ts +3 -1
  277. package/dist/agent/production-agent.d.ts.map +1 -1
  278. package/dist/agent/production-agent.js +97 -3
  279. package/dist/agent/production-agent.js.map +1 -1
  280. package/dist/cli/skills-content/visual-plan-skill.d.ts +1 -1
  281. package/dist/cli/skills-content/visual-plan-skill.d.ts.map +1 -1
  282. package/dist/cli/skills-content/visual-plan-skill.js +19 -2
  283. package/dist/cli/skills-content/visual-plan-skill.js.map +1 -1
  284. package/dist/cli/templates-meta.d.ts.map +1 -1
  285. package/dist/cli/templates-meta.js +12 -0
  286. package/dist/cli/templates-meta.js.map +1 -1
  287. package/dist/client/AssistantChat.d.ts +4 -0
  288. package/dist/client/AssistantChat.d.ts.map +1 -1
  289. package/dist/client/AssistantChat.js +30 -17
  290. package/dist/client/AssistantChat.js.map +1 -1
  291. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  292. package/dist/client/agent-page/AgentJobsTab.js +3 -1
  293. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  294. package/dist/client/agent-page/use-jobs.d.ts +1 -0
  295. package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
  296. package/dist/client/agent-page/use-jobs.js.map +1 -1
  297. package/dist/client/blocks/library/wireframe.d.ts.map +1 -1
  298. package/dist/client/blocks/library/wireframe.js +3 -2
  299. package/dist/client/blocks/library/wireframe.js.map +1 -1
  300. package/dist/client/chat/message-components.d.ts +5 -0
  301. package/dist/client/chat/message-components.d.ts.map +1 -1
  302. package/dist/client/chat/message-components.js +17 -1
  303. package/dist/client/chat/message-components.js.map +1 -1
  304. package/dist/client/chat/tool-call-display.d.ts +3 -1
  305. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  306. package/dist/client/chat/tool-call-display.js +17 -7
  307. package/dist/client/chat/tool-call-display.js.map +1 -1
  308. package/dist/collab/routes.d.ts +1 -1
  309. package/dist/collab/struct-routes.d.ts +1 -1
  310. package/dist/connections/catalog.d.ts +17 -3
  311. package/dist/connections/catalog.d.ts.map +1 -1
  312. package/dist/connections/catalog.js +16 -1
  313. package/dist/connections/catalog.js.map +1 -1
  314. package/dist/connections/reader.d.ts +18 -0
  315. package/dist/connections/reader.d.ts.map +1 -1
  316. package/dist/connections/reader.js +41 -0
  317. package/dist/connections/reader.js.map +1 -1
  318. package/dist/dashboard-storage/index.d.ts +4 -0
  319. package/dist/dashboard-storage/index.d.ts.map +1 -0
  320. package/dist/dashboard-storage/index.js +4 -0
  321. package/dist/dashboard-storage/index.js.map +1 -0
  322. package/dist/dashboard-storage/panel-source.d.ts +68 -0
  323. package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
  324. package/dist/dashboard-storage/panel-source.js +76 -0
  325. package/dist/dashboard-storage/panel-source.js.map +1 -0
  326. package/dist/dashboard-storage/schema.d.ts +562 -0
  327. package/dist/dashboard-storage/schema.d.ts.map +1 -0
  328. package/dist/dashboard-storage/schema.js +32 -0
  329. package/dist/dashboard-storage/schema.js.map +1 -0
  330. package/dist/dashboard-storage/store.d.ts +62 -0
  331. package/dist/dashboard-storage/store.d.ts.map +1 -0
  332. package/dist/dashboard-storage/store.js +227 -0
  333. package/dist/dashboard-storage/store.js.map +1 -0
  334. package/dist/deploy/build.d.ts +7 -0
  335. package/dist/deploy/build.d.ts.map +1 -1
  336. package/dist/deploy/build.js +78 -14
  337. package/dist/deploy/build.js.map +1 -1
  338. package/dist/eject/provider-api-definitions.d.ts +2 -1
  339. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  340. package/dist/eject/provider-api-definitions.js +1 -0
  341. package/dist/eject/provider-api-definitions.js.map +1 -1
  342. package/dist/eject/workspace-connections.d.ts.map +1 -1
  343. package/dist/eject/workspace-connections.js +1 -0
  344. package/dist/eject/workspace-connections.js.map +1 -1
  345. package/dist/extensions/actions.d.ts.map +1 -1
  346. package/dist/extensions/actions.js +165 -67
  347. package/dist/extensions/actions.js.map +1 -1
  348. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  349. package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
  350. package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
  351. package/dist/jobs/actions/list-recurring-jobs.js +1 -0
  352. package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
  353. package/dist/jobs/scheduler.d.ts +17 -2
  354. package/dist/jobs/scheduler.d.ts.map +1 -1
  355. package/dist/jobs/scheduler.js +51 -2
  356. package/dist/jobs/scheduler.js.map +1 -1
  357. package/dist/jobs/tools.d.ts.map +1 -1
  358. package/dist/jobs/tools.js +32 -2
  359. package/dist/jobs/tools.js.map +1 -1
  360. package/dist/localization/default-messages.d.ts +1 -0
  361. package/dist/localization/default-messages.d.ts.map +1 -1
  362. package/dist/localization/default-messages.js +1 -0
  363. package/dist/localization/default-messages.js.map +1 -1
  364. package/dist/mcp-client/index.d.ts +2 -0
  365. package/dist/mcp-client/index.d.ts.map +1 -1
  366. package/dist/mcp-client/index.js +5 -0
  367. package/dist/mcp-client/index.js.map +1 -1
  368. package/dist/notifications/routes.d.ts +3 -3
  369. package/dist/progress/routes.d.ts +1 -1
  370. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  371. package/dist/provider-api/actions/provider-api.d.ts +8 -6
  372. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  373. package/dist/provider-api/actions/provider-api.js +1 -1
  374. package/dist/provider-api/actions/provider-api.js.map +1 -1
  375. package/dist/provider-api/index.d.ts +11 -7
  376. package/dist/provider-api/index.d.ts.map +1 -1
  377. package/dist/provider-api/index.js +143 -5
  378. package/dist/provider-api/index.js.map +1 -1
  379. package/dist/resources/handlers.d.ts +1 -1
  380. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  381. package/dist/secrets/register-framework-secrets.js +7 -0
  382. package/dist/secrets/register-framework-secrets.js.map +1 -1
  383. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  384. package/dist/server/agent-chat/context-tools.js +9 -0
  385. package/dist/server/agent-chat/context-tools.js.map +1 -1
  386. package/dist/server/agent-chat/framework-prompts.js +2 -2
  387. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  388. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  389. package/dist/server/agent-chat-plugin.js +18 -2
  390. package/dist/server/agent-chat-plugin.js.map +1 -1
  391. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  392. package/dist/server/core-routes-plugin.js +1 -0
  393. package/dist/server/core-routes-plugin.js.map +1 -1
  394. package/dist/server/credential-provider.d.ts +4 -3
  395. package/dist/server/credential-provider.d.ts.map +1 -1
  396. package/dist/server/credential-provider.js +9 -3
  397. package/dist/server/credential-provider.js.map +1 -1
  398. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  399. package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
  400. package/dist/server/workspace-provider-oauth.js +141 -4
  401. package/dist/server/workspace-provider-oauth.js.map +1 -1
  402. package/dist/styles/agent-native.css +45 -2
  403. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  404. package/dist/templates/chat/AGENTS.md +1 -1
  405. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  406. package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  407. package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  408. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  409. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  410. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  411. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  412. package/dist/triggers/actions.d.ts.map +1 -1
  413. package/dist/triggers/actions.js +10 -2
  414. package/dist/triggers/actions.js.map +1 -1
  415. package/dist/triggers/dispatcher.d.ts.map +1 -1
  416. package/dist/triggers/dispatcher.js +15 -0
  417. package/dist/triggers/dispatcher.js.map +1 -1
  418. package/dist/triggers/types.d.ts +5 -0
  419. package/dist/triggers/types.d.ts.map +1 -1
  420. package/dist/triggers/types.js.map +1 -1
  421. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  422. package/dist/vite/action-types-plugin.js +4 -1
  423. package/dist/vite/action-types-plugin.js.map +1 -1
  424. package/docs/content/agent-native-toolkit.mdx +16 -0
  425. package/docs/content/recurring-jobs.mdx +35 -6
  426. package/package.json +7 -3
  427. package/src/action.ts +22 -1
  428. package/src/agent/production-agent.ts +122 -3
  429. package/src/cli/skills-content/visual-plan-skill.ts +19 -2
  430. package/src/cli/templates-meta.ts +12 -0
  431. package/src/client/AssistantChat.tsx +53 -26
  432. package/src/client/agent-page/AgentJobsTab.tsx +19 -0
  433. package/src/client/agent-page/use-jobs.ts +1 -0
  434. package/src/client/blocks/library/wireframe.tsx +3 -1
  435. package/src/client/chat/message-components.tsx +35 -1
  436. package/src/client/chat/tool-call-display.tsx +38 -3
  437. package/src/connections/catalog.ts +20 -1
  438. package/src/connections/reader.ts +65 -0
  439. package/src/dashboard-storage/index.ts +27 -0
  440. package/src/dashboard-storage/panel-source.ts +168 -0
  441. package/src/dashboard-storage/schema.ts +62 -0
  442. package/src/dashboard-storage/store.ts +333 -0
  443. package/src/deploy/build.ts +95 -16
  444. package/src/eject/provider-api-definitions.ts +1 -0
  445. package/src/eject/workspace-connections.ts +1 -0
  446. package/src/extensions/actions.ts +199 -73
  447. package/src/jobs/actions/list-recurring-jobs.ts +2 -0
  448. package/src/jobs/scheduler.ts +71 -4
  449. package/src/jobs/tools.ts +31 -1
  450. package/src/localization/default-messages.ts +1 -0
  451. package/src/mcp-client/index.ts +6 -0
  452. package/src/provider-api/actions/provider-api.ts +1 -1
  453. package/src/provider-api/index.ts +190 -5
  454. package/src/secrets/register-framework-secrets.ts +8 -0
  455. package/src/server/agent-chat/context-tools.ts +9 -0
  456. package/src/server/agent-chat/framework-prompts.ts +2 -2
  457. package/src/server/agent-chat-plugin.ts +22 -2
  458. package/src/server/core-routes-plugin.ts +1 -0
  459. package/src/server/credential-provider.ts +9 -3
  460. package/src/server/workspace-provider-oauth.ts +181 -4
  461. package/src/styles/agent-native.css +45 -2
  462. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  463. package/src/templates/chat/AGENTS.md +1 -1
  464. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  465. package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  466. package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  467. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  468. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  469. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  470. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  471. package/src/triggers/actions.ts +11 -2
  472. package/src/triggers/dispatcher.ts +20 -1
  473. package/src/triggers/types.ts +5 -0
  474. package/src/vite/action-types-plugin.ts +9 -1
  475. package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
  476. package/corpus/templates/analytics/server/routes/api/sql-query.post.ts +0 -1
@@ -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",
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: 1521
32
- - toolkit files: 137
33
- - template files: 6194
31
+ - core files: 1527
32
+ - toolkit files: 144
33
+ - template files: 6369
@@ -1,5 +1,46 @@
1
1
  # @agent-native/core
2
2
 
3
+ ## 0.115.3
4
+
5
+ ### Patch Changes
6
+
7
+ - a841109: Teach visual-plan agents to create and promote full-fidelity design surfaces without losing scoped CSS or duplicating an existing plan.
8
+
9
+ ## 0.115.2
10
+
11
+ ### Patch Changes
12
+
13
+ - f0601ec: Collapse duplicate assistant tool-call ids in the shared agent loop so providers do not reject replayed tool-call history.
14
+
15
+ ## 0.115.1
16
+
17
+ ### Patch Changes
18
+
19
+ - 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`.
20
+
21
+ ## 0.115.0
22
+
23
+ ### Minor Changes
24
+
25
+ - 0341a7d: Allow the published CLI to scaffold the hidden CRM template explicitly, and include factory-backed actions in production static registries.
26
+ - 0341a7d: Pass trusted trigger automation lineage and a stored policy id to action runs.
27
+ - 0341a7d: Add reusable per-app dashboard storage factories, bounded revision history, and provider-neutral panel source resolvers.
28
+ - 0341a7d: Add Salesforce workspace connections and CRM reader metadata for template-owned integrations.
29
+
30
+ ### Patch Changes
31
+
32
+ - 0341a7d: Allow hosted authenticated requests to use deployment-level transactional email configuration.
33
+ - 0341a7d: Keep Netlify-hosted apps and their databases warm with site-local scheduled health checks.
34
+ - 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.
35
+ - 0341a7d: Require an explicit workspace connection when making Salesforce provider API requests, so each request uses a matched instance URL and OAuth account.
36
+ - 0341a7d: Prevent model gateways from breaking extension edits by using a compact required update contract and normalizing optional placeholder arguments before validation.
37
+ - 0341a7d: Fix Salesforce token refresh when configured with Consumer Key/Secret.
38
+ - 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.
39
+ - 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.
40
+ - 0341a7d: Make the missing-AI composer state visibly actionable with a Connect AI button.
41
+ - Updated dependencies [0341a7d]
42
+ - @agent-native/toolkit@0.9.0
43
+
3
44
  ## 0.114.16
4
45
 
5
46
  ### 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",
@@ -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.16",
3
+ "version": "0.115.3",
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";
@@ -3083,6 +3087,21 @@ function normalizeToolCallInputForHistory(
3083
3087
  return { rawInput: input };
3084
3088
  }
3085
3089
 
3090
+ function dedupeAssistantToolCallsById(
3091
+ content: import("./engine/types.js").EngineContentPart[],
3092
+ ): import("./engine/types.js").EngineContentPart[] {
3093
+ const seenToolCallIds = new Set<string>();
3094
+ const deduped: import("./engine/types.js").EngineContentPart[] = [];
3095
+ for (const part of content) {
3096
+ if (part.type === "tool-call") {
3097
+ if (seenToolCallIds.has(part.id)) continue;
3098
+ seenToolCallIds.add(part.id);
3099
+ }
3100
+ deduped.push(part);
3101
+ }
3102
+ return deduped;
3103
+ }
3104
+
3086
3105
  function toolInputSchemaErrorResult(
3087
3106
  toolName: string,
3088
3107
  input: unknown,
@@ -3107,6 +3126,91 @@ const rawToolInputAjv = new Ajv({
3107
3126
 
3108
3127
  const rawToolInputValidatorCache = new WeakMap<object, ValidateFunction>();
3109
3128
 
3129
+ const optionalPlaceholderAjv = new Ajv({
3130
+ strict: false,
3131
+ allErrors: false,
3132
+ coerceTypes: false,
3133
+ useDefaults: false,
3134
+ removeAdditional: false,
3135
+ });
3136
+
3137
+ const optionalPlaceholderValidatorCache = new WeakMap<
3138
+ object,
3139
+ ValidateFunction
3140
+ >();
3141
+
3142
+ function isStructurallyEmptyToolValue(value: unknown): boolean {
3143
+ if (value === false) return true;
3144
+ if (value === null) return true;
3145
+ if (typeof value === "string") return value.trim().length === 0;
3146
+ if (Array.isArray(value)) {
3147
+ return (
3148
+ value.length === 0 ||
3149
+ value.every(
3150
+ (item) =>
3151
+ item !== null &&
3152
+ typeof item === "object" &&
3153
+ !Array.isArray(item) &&
3154
+ Object.keys(item).length === 0,
3155
+ )
3156
+ );
3157
+ }
3158
+ return (
3159
+ typeof value === "object" &&
3160
+ value !== null &&
3161
+ Object.keys(value).length === 0
3162
+ );
3163
+ }
3164
+
3165
+ function schemaAcceptsToolValue(schema: object, value: unknown): boolean {
3166
+ let validator = optionalPlaceholderValidatorCache.get(schema);
3167
+ if (!validator) {
3168
+ try {
3169
+ validator = optionalPlaceholderAjv.compile(schema);
3170
+ optionalPlaceholderValidatorCache.set(schema, validator);
3171
+ } catch {
3172
+ return false;
3173
+ }
3174
+ }
3175
+ return Boolean(validator(value));
3176
+ }
3177
+
3178
+ /**
3179
+ * Some model gateways fill every optional tool field with an empty sentinel
3180
+ * instead of omitting it. One schema-invalid empty value proves that pattern;
3181
+ * only then strip the other optional empty/default sentinels from the call.
3182
+ * Calls whose empty values are all schema-valid keep their intentional clears.
3183
+ */
3184
+ function normalizeOptionalToolPlaceholders(
3185
+ schema: RawJsonSchema | undefined,
3186
+ input: unknown,
3187
+ ): { input: unknown; changed: boolean } {
3188
+ if (!schema?.properties || !input || typeof input !== "object") {
3189
+ return { input, changed: false };
3190
+ }
3191
+ if (Array.isArray(input)) return { input, changed: false };
3192
+
3193
+ const required = new Set(
3194
+ Array.isArray(schema.required) ? schema.required : [],
3195
+ );
3196
+ const placeholders: string[] = [];
3197
+ let hasSchemaInvalidPlaceholder = false;
3198
+ for (const [key, value] of Object.entries(input as Record<string, unknown>)) {
3199
+ if (required.has(key) || !isStructurallyEmptyToolValue(value)) continue;
3200
+ const propertySchema = schema.properties[key];
3201
+ if (!propertySchema || typeof propertySchema !== "object") continue;
3202
+ placeholders.push(key);
3203
+ if (!schemaAcceptsToolValue(propertySchema, value)) {
3204
+ hasSchemaInvalidPlaceholder = true;
3205
+ }
3206
+ }
3207
+ if (!hasSchemaInvalidPlaceholder) return { input, changed: false };
3208
+
3209
+ const normalized = { ...(input as Record<string, unknown>) };
3210
+ for (const key of placeholders) delete normalized[key];
3211
+ return { input: normalized, changed: true };
3212
+ }
3213
+
3110
3214
  function getRawToolInputValidator(schema: RawJsonSchema): ValidateFunction {
3111
3215
  const cached = rawToolInputValidatorCache.get(schema);
3112
3216
  if (cached) return cached;
@@ -3163,6 +3267,8 @@ export async function runAgentLoop(opts: {
3163
3267
  orgId?: string | null;
3164
3268
  /** Action invocation attribution. Defaults to the normal agent tool loop. */
3165
3269
  actionCaller?: ActionCaller;
3270
+ /** Trusted trigger lineage for automation-dispatched action calls. */
3271
+ automation?: ActionAutomationContext;
3166
3272
  /** Concrete execution id used for cross-app trace correlation. */
3167
3273
  runId?: string;
3168
3274
  /** Verified/telemetry-only delegated lineage supplied by the transport. */
@@ -3905,6 +4011,8 @@ export async function runAgentLoop(opts: {
3905
4011
  }
3906
4012
  }
3907
4013
 
4014
+ assistantContent = dedupeAssistantToolCallsById(assistantContent);
4015
+
3908
4016
  const assistantContentForHistory = assistantContent.map((part) =>
3909
4017
  part.type === "tool-call"
3910
4018
  ? {
@@ -4068,11 +4176,20 @@ export async function runAgentLoop(opts: {
4068
4176
  const runToolCall = async (
4069
4177
  toolCall: import("./engine/types.js").EngineToolCallPart,
4070
4178
  ): Promise<EngineContentPart> => {
4179
+ const actionEntry = actions[toolCall.name];
4180
+ const placeholderNormalization = actionEntry
4181
+ ? normalizeOptionalToolPlaceholders(
4182
+ actionEntry.tool.parameters,
4183
+ toolCall.input,
4184
+ )
4185
+ : { input: toolCall.input, changed: false };
4186
+ if (placeholderNormalization.changed) {
4187
+ toolCall = { ...toolCall, input: placeholderNormalization.input };
4188
+ }
4071
4189
  const wireToolInput = JSON.stringify(toolCall.input ?? {});
4072
4190
  const normalizedToolInput = normalizeToolCallInputForHistory(
4073
4191
  toolCall.input,
4074
4192
  );
4075
- const actionEntry = actions[toolCall.name];
4076
4193
  const sourceSweepGuard = shouldGuardRepeatedSourceSweep({
4077
4194
  toolName: toolCall.name,
4078
4195
  entry: actionEntry,
@@ -4227,6 +4344,7 @@ export async function runAgentLoop(opts: {
4227
4344
  userEmail: getRequestUserEmail(),
4228
4345
  orgId: getRequestOrgId() ?? null,
4229
4346
  caller: opts.actionCaller ?? "tool",
4347
+ automation: opts.automation,
4230
4348
  networkProtocol: opts.networkProtocol,
4231
4349
  networkId: opts.networkId,
4232
4350
  networkPeer: opts.networkPeer,
@@ -4490,7 +4608,7 @@ export async function runAgentLoop(opts: {
4490
4608
  });
4491
4609
 
4492
4610
  const toolCallSchemaError = toolCallErrors.get(toolCall.id);
4493
- if (toolCallSchemaError) {
4611
+ if (toolCallSchemaError && !placeholderNormalization.changed) {
4494
4612
  const result = finalizeToolErrorResult(
4495
4613
  toolInputSchemaErrorResult(
4496
4614
  toolCall.name,
@@ -4663,6 +4781,7 @@ export async function runAgentLoop(opts: {
4663
4781
  userEmail: actionUserEmail ?? undefined,
4664
4782
  orgId: actionOrgId,
4665
4783
  caller: opts.actionCaller ?? "tool",
4784
+ automation: opts.automation,
4666
4785
  networkProtocol: opts.networkProtocol,
4667
4786
  networkId: opts.networkId,
4668
4787
  networkPeer: opts.networkPeer,
@@ -301,6 +301,18 @@ and screen ids across both surfaces. The canvas is the inspectable static refere
301
301
  the prototype is the interactive version of that same flow, not a separate
302
302
  design direction.
303
303
 
304
+ Treat “higher fidelity,” “pixel-accurate,” “polished mockup,” “production-like,”
305
+ “real design,” and “not a sketch/wireframe” as design-first language even when
306
+ the request also says “mockup.” For a new plan, use \`create-plan-design\`. For
307
+ an existing plan, keep the same plan id and call \`update-visual-plan\` with a
308
+ \`set-visual-render-mode\` patch using \`renderMode: "design"\` plus the upgraded
309
+ screen HTML/CSS in the same update. Ground the result in the real app shell,
310
+ tokens, typography, spacing, and states, and add stable \`data-design-id\`
311
+ targets. Put scoped styles in each screen's \`css\` field, never in a \`<style>\`
312
+ tag. The viewer-local Clean toggle only changes one browser's wireframe
313
+ preference; it is not a fidelity upgrade. Do not create a duplicate plan to
314
+ handle a fidelity follow-up.
315
+
304
316
  ## Wireframe quality — read \`references/wireframe.md\`
305
317
 
306
318
  UI recap/plan wireframes must meet a strict quality bar — full-width chrome,
@@ -349,7 +361,9 @@ directory before authoring a plan.
349
361
  visual surface, canvas only, or canvas + prototype.
350
362
  - \`create-ui-plan\`: start a UI-first plan when the work is primarily product UI.
351
363
  - \`create-prototype-plan\`: start a prototype-first plan with a functional top
352
- review surface.
364
+ review surface. If the interaction itself must also be high fidelity, set each
365
+ screen's \`renderMode\` to \`design\` and pass scoped styles through \`css\`;
366
+ otherwise use \`create-plan-design\` for design-first review.
353
367
  - \`create-plan-design\`: start a full-fidelity branded Design-tab plan with an
354
368
  optional matching Prototype tab.
355
369
  - \`convert-visual-plan-to-prototype\`: convert an existing HTML wireframe canvas
@@ -357,7 +371,10 @@ directory before authoring a plan.
357
371
  - \`create-visual-questions\`: use only when the user explicitly asks for a visual
358
372
  intake questionnaire, not as \`/visual-plan\` preflight.
359
373
  - \`update-visual-plan\`: revise content, status, or comments with targeted
360
- \`contentPatches\` (see Core Workflow steps 6-7). \`replace-blocks\` and full
374
+ \`contentPatches\` (see Core Workflow steps 6-7). Use
375
+ \`set-visual-render-mode\` with \`renderMode: "design"\` when promoting an
376
+ existing plan to high fidelity, together with deliberate screen HTML/CSS;
377
+ render mode alone only removes sketch treatment. \`replace-blocks\` and full
361
378
  \`content\` replacement require \`expectedUpdatedAt\` from a fresh
362
379
  \`get-visual-plan\` call.
363
380
  - \`read-visual-plan-source\`: read the normalized plan as \`plan.mdx\`,
@@ -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",
@@ -1591,6 +1591,15 @@ export function shouldShowGlobalRunningStatus({
1591
1591
  ) {
1592
1592
  return false;
1593
1593
  }
1594
+ // The reasoning cell already owns the generic Thinking state. Activity
1595
+ // events can briefly reassert that same label between reasoning deltas;
1596
+ // rendering both makes a second Thinking row flash beneath the thought.
1597
+ if (
1598
+ runningActivityLabel === "Thinking" &&
1599
+ (latestMessageHasReasoning || contentHasVisibleReasoning(reconnectContent))
1600
+ ) {
1601
+ return false;
1602
+ }
1594
1603
  if (runningActivityLabel) return true;
1595
1604
 
1596
1605
  return (
@@ -1598,6 +1607,16 @@ export function shouldShowGlobalRunningStatus({
1598
1607
  );
1599
1608
  }
1600
1609
 
1610
+ export function assistantChatAutoscrollStatusKey({
1611
+ showGlobalRunningStatus,
1612
+ runningStatusLabel,
1613
+ }: {
1614
+ showGlobalRunningStatus: boolean;
1615
+ runningStatusLabel: string;
1616
+ }): string {
1617
+ return showGlobalRunningStatus ? runningStatusLabel : "idle";
1618
+ }
1619
+
1601
1620
  type QueuedMessage = {
1602
1621
  id: string;
1603
1622
  text: string;
@@ -4804,11 +4823,28 @@ const AssistantChatInner = forwardRef<
4804
4823
  adapterHandoffPending || reconnectTailOnlyRef.current,
4805
4824
  },
4806
4825
  );
4826
+ const latestMessage = messages[messages.length - 1];
4827
+ const reconnectStatusContent =
4828
+ visibleReconnectContent.length > 0
4829
+ ? visibleReconnectContent
4830
+ : reconnectContent.length === 0
4831
+ ? reconnectActivityContent
4832
+ : [];
4833
+ const showGlobalRunningStatus = shouldShowGlobalRunningStatus({
4834
+ showRunningInUI,
4835
+ runningActivityLabel,
4836
+ runningActivityTool,
4837
+ latestMessage,
4838
+ reconnectContent: reconnectStatusContent,
4839
+ });
4807
4840
  const autoscrollFollowKey = [
4808
4841
  messages.map(messageFollowKey).join(";"),
4809
4842
  `q:${queuedMessages.map(queuedMessageFollowKey).join("|")}`,
4810
4843
  `r:${reconnectContentFollowKey(visibleReconnectContent)}`,
4811
- `status:${showRunningInUI ? runningStatusLabel : "idle"}`,
4844
+ `status:${assistantChatAutoscrollStatusKey({
4845
+ showGlobalRunningStatus,
4846
+ runningStatusLabel,
4847
+ })}`,
4812
4848
  ].join(";;");
4813
4849
  const {
4814
4850
  scrollRef,
@@ -4882,21 +4918,7 @@ const AssistantChatInner = forwardRef<
4882
4918
  () => latestNonRecoveryUserMessageText(messages),
4883
4919
  [messages],
4884
4920
  );
4885
- const latestMessage = messages[messages.length - 1];
4886
4921
  const latestMessageRole = latestMessage?.role;
4887
- const reconnectStatusContent =
4888
- visibleReconnectContent.length > 0
4889
- ? visibleReconnectContent
4890
- : reconnectContent.length === 0
4891
- ? reconnectActivityContent
4892
- : [];
4893
- const showGlobalRunningStatus = shouldShowGlobalRunningStatus({
4894
- showRunningInUI,
4895
- runningActivityLabel,
4896
- runningActivityTool,
4897
- latestMessage,
4898
- reconnectContent: reconnectStatusContent,
4899
- });
4900
4922
  const latestAssistantWasPlan =
4901
4923
  latestMessageRole === "assistant" &&
4902
4924
  getRequestModeMetadata(latestMessage) === "plan";
@@ -5535,18 +5557,23 @@ const AssistantChatInner = forwardRef<
5535
5557
  className="agent-composer-missing-key-trigger"
5536
5558
  aria-label="Connect AI to start chatting"
5537
5559
  >
5538
- <span className="agent-composer-missing-key-copy">
5539
- <span className="agent-composer-missing-key-title">
5540
- {missingApiKeySetupLayout === "sidebar"
5541
- ? "Connect AI to chat"
5542
- : "Connect AI to start chatting"}
5543
- </span>
5544
- {missingApiKeySetupLayout !== "sidebar" ? (
5545
- <span className="agent-composer-missing-key-description">
5546
- Builder.io includes free credits, or use
5547
- your own API key.
5560
+ <span className="agent-composer-missing-key-content">
5561
+ <span className="agent-composer-missing-key-copy">
5562
+ <span className="agent-composer-missing-key-title">
5563
+ {missingApiKeySetupLayout === "sidebar"
5564
+ ? "Connect AI to chat"
5565
+ : "Connect AI to start chatting"}
5548
5566
  </span>
5549
- ) : null}
5567
+ {missingApiKeySetupLayout !== "sidebar" ? (
5568
+ <span className="agent-composer-missing-key-description">
5569
+ Builder.io includes free credits, or use
5570
+ your own API key.
5571
+ </span>
5572
+ ) : null}
5573
+ </span>
5574
+ <span className="agent-composer-missing-key-cta">
5575
+ Connect AI
5576
+ </span>
5550
5577
  </span>
5551
5578
  </button>
5552
5579
  </PopoverTrigger>
@@ -432,6 +432,25 @@ export function AgentJobsTab({ canManageOrg = false }: AgentPageTabProps) {
432
432
  <p className="mt-1 whitespace-pre-wrap text-sm text-muted-foreground">
433
433
  {detailsTarget.instructions}
434
434
  </p>
435
+ {detailsTarget.mcpTools.length > 0 ? (
436
+ <div className="mt-4">
437
+ <p className="text-xs font-medium text-foreground">
438
+ {t("jobs.mcpTools", {
439
+ defaultValue: "Connected MCP tools",
440
+ })}
441
+ </p>
442
+ <div className="mt-1 flex flex-wrap gap-1.5">
443
+ {detailsTarget.mcpTools.map((toolName) => (
444
+ <code
445
+ key={toolName}
446
+ className="rounded bg-muted px-1.5 py-0.5 text-[11px] text-muted-foreground"
447
+ >
448
+ {toolName}
449
+ </code>
450
+ ))}
451
+ </div>
452
+ </div>
453
+ ) : null}
435
454
  </div>
436
455
  ) : null}
437
456
  </DialogContent>
@@ -18,6 +18,7 @@ export interface RecurringJob {
18
18
  lastError: string | null;
19
19
  nextRun: string | null;
20
20
  createdBy: string | null;
21
+ mcpTools: string[];
21
22
  canUpdate: boolean;
22
23
  }
23
24