@agent-native/core 0.114.16 → 0.115.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (456) hide show
  1. package/agent-native.eject.json +2 -0
  2. package/corpus/README.md +3 -3
  3. package/corpus/core/CHANGELOG.md +29 -0
  4. package/corpus/core/agent-native.eject.json +2 -0
  5. package/corpus/core/docs/content/agent-native-toolkit.mdx +16 -0
  6. package/corpus/core/docs/content/recurring-jobs.mdx +35 -6
  7. package/corpus/core/export-snapshot.json +4 -0
  8. package/corpus/core/package.json +5 -1
  9. package/corpus/core/src/action.ts +22 -1
  10. package/corpus/core/src/agent/production-agent.ts +105 -3
  11. package/corpus/core/src/cli/templates-meta.ts +12 -0
  12. package/corpus/core/src/client/AssistantChat.tsx +53 -26
  13. package/corpus/core/src/client/agent-page/AgentJobsTab.tsx +19 -0
  14. package/corpus/core/src/client/agent-page/use-jobs.ts +1 -0
  15. package/corpus/core/src/client/chat/message-components.tsx +35 -1
  16. package/corpus/core/src/client/chat/tool-call-display.tsx +38 -3
  17. package/corpus/core/src/connections/catalog.ts +20 -1
  18. package/corpus/core/src/connections/reader.ts +65 -0
  19. package/corpus/core/src/dashboard-storage/index.ts +27 -0
  20. package/corpus/core/src/dashboard-storage/panel-source.ts +168 -0
  21. package/corpus/core/src/dashboard-storage/schema.ts +62 -0
  22. package/corpus/core/src/dashboard-storage/store.ts +333 -0
  23. package/corpus/core/src/deploy/build.ts +95 -16
  24. package/corpus/core/src/eject/provider-api-definitions.ts +1 -0
  25. package/corpus/core/src/eject/workspace-connections.ts +1 -0
  26. package/corpus/core/src/extensions/actions.ts +199 -73
  27. package/corpus/core/src/jobs/actions/list-recurring-jobs.ts +2 -0
  28. package/corpus/core/src/jobs/scheduler.ts +71 -4
  29. package/corpus/core/src/jobs/tools.ts +31 -1
  30. package/corpus/core/src/localization/default-messages.ts +1 -0
  31. package/corpus/core/src/mcp-client/index.ts +6 -0
  32. package/corpus/core/src/provider-api/actions/provider-api.ts +1 -1
  33. package/corpus/core/src/provider-api/index.ts +190 -5
  34. package/corpus/core/src/secrets/register-framework-secrets.ts +8 -0
  35. package/corpus/core/src/server/agent-chat/context-tools.ts +9 -0
  36. package/corpus/core/src/server/agent-chat/framework-prompts.ts +2 -2
  37. package/corpus/core/src/server/agent-chat-plugin.ts +22 -2
  38. package/corpus/core/src/server/core-routes-plugin.ts +1 -0
  39. package/corpus/core/src/server/credential-provider.ts +9 -3
  40. package/corpus/core/src/server/workspace-provider-oauth.ts +181 -4
  41. package/corpus/core/src/styles/agent-native.css +45 -2
  42. package/corpus/core/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  43. package/corpus/core/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  44. package/corpus/core/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  45. package/corpus/core/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  46. package/corpus/core/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  47. package/corpus/core/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  48. package/corpus/core/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  49. package/corpus/core/src/triggers/actions.ts +11 -2
  50. package/corpus/core/src/triggers/dispatcher.ts +20 -1
  51. package/corpus/core/src/triggers/types.ts +5 -0
  52. package/corpus/core/src/vite/action-types-plugin.ts +9 -1
  53. package/corpus/templates/analytics/.agents/skills/agent-native-docs/SKILL.md +115 -0
  54. package/corpus/templates/analytics/AGENTS.md +11 -11
  55. package/corpus/templates/analytics/_gitignore +39 -0
  56. package/corpus/templates/analytics/actions/query-dashboard-panel.ts +30 -0
  57. package/corpus/templates/analytics/actions/update-dashboard.ts +2 -1
  58. package/corpus/templates/analytics/app/lib/sql-query.ts +11 -25
  59. package/corpus/templates/analytics/changelog/2026-07-21-fixed-extension-updates-failing-before-changes-could-be-appl.md +6 -0
  60. package/corpus/templates/analytics/server/lib/dashboard-panel-query.ts +1 -0
  61. package/corpus/templates/analytics/server/lib/dashboard-panel-source-resolver.ts +51 -0
  62. package/corpus/templates/analytics/server/lib/prometheus.ts +1 -1
  63. package/corpus/templates/analytics/server/plugins/agent-chat.ts +1 -1
  64. package/corpus/templates/assets/.agents/skills/agent-native-docs/SKILL.md +115 -0
  65. package/corpus/templates/brain/.agents/skills/agent-native-docs/SKILL.md +115 -0
  66. package/corpus/templates/calendar/.agents/skills/agent-native-docs/SKILL.md +115 -0
  67. package/corpus/templates/calendar/_gitignore +39 -0
  68. package/corpus/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  69. package/corpus/templates/chat/AGENTS.md +1 -1
  70. package/corpus/templates/clips/.agents/skills/agent-native-docs/SKILL.md +115 -0
  71. package/corpus/templates/clips/AGENTS.md +7 -0
  72. package/corpus/templates/clips/actions/prepare-crm-call-evidence.ts +58 -0
  73. package/corpus/templates/clips/app/components/recorder/recorder-engine.ts +88 -11
  74. package/corpus/templates/clips/changelog/2026-07-21-crm-call-evidence-handoff.md +6 -0
  75. package/corpus/templates/clips/changelog/2026-07-21-recording-retries-and-restarts-keep-their-upload-session-so-.md +6 -0
  76. package/corpus/templates/clips/chrome-extension/src/background.ts +20 -5
  77. package/corpus/templates/clips/chrome-extension/src/native-recording-state.ts +19 -0
  78. package/corpus/templates/clips/chrome-extension/src/offscreen.ts +8 -0
  79. package/corpus/templates/clips/desktop/src/overlays/recording-pill.tsx +9 -0
  80. package/corpus/templates/clips/desktop/src-tauri/src/recording_indicator.rs +54 -28
  81. package/corpus/templates/clips/server/plugins/agent-chat.ts +1 -0
  82. package/corpus/templates/content/.agents/skills/agent-native-docs/SKILL.md +115 -0
  83. package/corpus/templates/content/_gitignore +39 -0
  84. package/corpus/templates/content/learnings.defaults.md +5 -0
  85. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  86. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +133 -0
  87. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +128 -0
  88. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +145 -0
  89. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  90. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +100 -0
  91. package/corpus/templates/crm/.env.example +5 -0
  92. package/corpus/templates/crm/AGENTS.md +120 -0
  93. package/corpus/templates/crm/CHANGELOG.md +1 -0
  94. package/corpus/templates/crm/DEVELOPING.md +66 -0
  95. package/corpus/templates/crm/README.md +106 -0
  96. package/corpus/templates/crm/_gitignore +12 -0
  97. package/corpus/templates/crm/actions/_crm-action-utils.ts +87 -0
  98. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  99. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  100. package/corpus/templates/crm/actions/apply-crm-proposals.ts +203 -0
  101. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  102. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  103. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  104. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  105. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  106. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  107. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  108. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +33 -0
  109. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  110. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  111. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  112. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  113. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  114. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  115. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  116. package/corpus/templates/crm/actions/list-crm-proposals.ts +31 -0
  117. package/corpus/templates/crm/actions/list-crm-records.ts +79 -0
  118. package/corpus/templates/crm/actions/list-crm-saved-views.ts +15 -0
  119. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  120. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  121. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  122. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  123. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  124. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  125. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  126. package/corpus/templates/crm/actions/navigate.ts +63 -0
  127. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  128. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  129. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  130. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  131. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  132. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  133. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  134. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  135. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  136. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +275 -0
  137. package/corpus/templates/crm/actions/run.ts +11 -0
  138. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  139. package/corpus/templates/crm/actions/save-crm-saved-view.ts +119 -0
  140. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  141. package/corpus/templates/crm/actions/update-crm-record.ts +508 -0
  142. package/corpus/templates/crm/actions/view-screen.ts +218 -0
  143. package/corpus/templates/crm/agent-native.app-skill.json +58 -0
  144. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  145. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +83 -0
  146. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +225 -0
  147. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +413 -0
  148. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +510 -0
  149. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +134 -0
  150. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +367 -0
  151. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +92 -0
  152. package/corpus/templates/crm/app/components/crm/Surface.tsx +96 -0
  153. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  154. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +106 -0
  155. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +84 -0
  156. package/corpus/templates/crm/app/entry.client.tsx +16 -0
  157. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  158. package/corpus/templates/crm/app/global.css +167 -0
  159. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +60 -0
  160. package/corpus/templates/crm/app/i18n/en-US.ts +89 -0
  161. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  162. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  163. package/corpus/templates/crm/app/lib/navigation.ts +54 -0
  164. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  165. package/corpus/templates/crm/app/lib/types.ts +172 -0
  166. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  167. package/corpus/templates/crm/app/root.tsx +88 -0
  168. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  169. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  170. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  171. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  172. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  173. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  174. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  175. package/corpus/templates/crm/app/routes/proposals.tsx +266 -0
  176. package/corpus/templates/crm/app/routes/records.$recordId.tsx +35 -0
  177. package/corpus/templates/crm/app/routes/settings.tsx +63 -0
  178. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  179. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  180. package/corpus/templates/crm/app/routes/views.tsx +333 -0
  181. package/corpus/templates/crm/app/routes.ts +17 -0
  182. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  183. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +6 -0
  184. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +6 -0
  185. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +6 -0
  186. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +6 -0
  187. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +6 -0
  188. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +6 -0
  189. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +6 -0
  190. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +6 -0
  191. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +6 -0
  192. package/corpus/templates/crm/components.json +20 -0
  193. package/corpus/templates/crm/docs/architecture/crm-contract.md +180 -0
  194. package/corpus/templates/crm/learnings.defaults.md +5 -0
  195. package/corpus/templates/crm/package.json +59 -0
  196. package/corpus/templates/crm/public/favicon.svg +1 -0
  197. package/corpus/templates/crm/public/icon-180.svg +1 -0
  198. package/corpus/templates/crm/public/manifest.json +11 -0
  199. package/corpus/templates/crm/react-router.config.ts +7 -0
  200. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  201. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  202. package/corpus/templates/crm/server/crm/crm-mirror.ts +711 -0
  203. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1143 -0
  204. package/corpus/templates/crm/server/crm/native-adapter.ts +1715 -0
  205. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  206. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  207. package/corpus/templates/crm/server/db/crm-store.ts +1170 -0
  208. package/corpus/templates/crm/server/db/index.ts +169 -0
  209. package/corpus/templates/crm/server/db/schema.ts +441 -0
  210. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  211. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  212. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +100 -0
  213. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +144 -0
  214. package/corpus/templates/crm/server/lib/intelligence/summary.ts +141 -0
  215. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  216. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  217. package/corpus/templates/crm/server/plugins/agent-chat.ts +68 -0
  218. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  219. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  220. package/corpus/templates/crm/server/plugins/db.ts +454 -0
  221. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  222. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  223. package/corpus/templates/crm/shared/crm-contract.ts +254 -0
  224. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  225. package/corpus/templates/crm/ssr-entry.ts +11 -0
  226. package/corpus/templates/crm/tsconfig.json +24 -0
  227. package/corpus/templates/crm/vite.config.ts +15 -0
  228. package/corpus/templates/crm/vitest.config.ts +5 -0
  229. package/corpus/templates/design/.agents/skills/agent-native-docs/SKILL.md +115 -0
  230. package/corpus/templates/dispatch/.agents/skills/agent-native-docs/SKILL.md +115 -0
  231. package/corpus/templates/forms/.agents/skills/agent-native-docs/SKILL.md +115 -0
  232. package/corpus/templates/forms/_gitignore +39 -0
  233. package/corpus/templates/forms/learnings.defaults.md +5 -0
  234. package/corpus/templates/macros/.agents/skills/agent-native-docs/SKILL.md +115 -0
  235. package/corpus/templates/macros/_gitignore +39 -0
  236. package/corpus/templates/macros/learnings.defaults.md +5 -0
  237. package/corpus/templates/mail/.agents/skills/agent-native-docs/SKILL.md +115 -0
  238. package/corpus/templates/mail/_gitignore +39 -0
  239. package/corpus/templates/plan/.agents/skills/agent-native-docs/SKILL.md +115 -0
  240. package/corpus/templates/slides/.agents/skills/agent-native-docs/SKILL.md +115 -0
  241. package/corpus/templates/slides/_gitignore +39 -0
  242. package/corpus/templates/tasks/.agents/skills/agent-native-docs/SKILL.md +27 -0
  243. package/corpus/templates/tasks/_gitignore +39 -0
  244. package/corpus/toolkit/CHANGELOG.md +12 -0
  245. package/corpus/toolkit/README.md +30 -0
  246. package/corpus/toolkit/agent-native.eject.json +33 -0
  247. package/corpus/toolkit/package.json +15 -1
  248. package/corpus/toolkit/src/dashboard/DataTable.tsx +273 -0
  249. package/corpus/toolkit/src/dashboard/DateRangePicker.tsx +57 -0
  250. package/corpus/toolkit/src/dashboard/GenericChartPanel.tsx +461 -0
  251. package/corpus/toolkit/src/dashboard/MetricCard.tsx +54 -0
  252. package/corpus/toolkit/src/dashboard/StatsCard.tsx +49 -0
  253. package/corpus/toolkit/src/dashboard/dashboard-layout.ts +329 -0
  254. package/corpus/toolkit/src/dashboard/index.ts +6 -0
  255. package/corpus/toolkit/src/index.ts +1 -0
  256. package/corpus/toolkit/src/ui/calendar.tsx +8 -8
  257. package/corpus/toolkit/src/ui/date-picker.tsx +4 -1
  258. package/dist/action.d.ts +14 -1
  259. package/dist/action.d.ts.map +1 -1
  260. package/dist/action.js.map +1 -1
  261. package/dist/agent/production-agent.d.ts +3 -1
  262. package/dist/agent/production-agent.d.ts.map +1 -1
  263. package/dist/agent/production-agent.js +83 -3
  264. package/dist/agent/production-agent.js.map +1 -1
  265. package/dist/cli/templates-meta.d.ts.map +1 -1
  266. package/dist/cli/templates-meta.js +12 -0
  267. package/dist/cli/templates-meta.js.map +1 -1
  268. package/dist/client/AssistantChat.d.ts +4 -0
  269. package/dist/client/AssistantChat.d.ts.map +1 -1
  270. package/dist/client/AssistantChat.js +30 -17
  271. package/dist/client/AssistantChat.js.map +1 -1
  272. package/dist/client/agent-page/AgentJobsTab.d.ts.map +1 -1
  273. package/dist/client/agent-page/AgentJobsTab.js +3 -1
  274. package/dist/client/agent-page/AgentJobsTab.js.map +1 -1
  275. package/dist/client/agent-page/use-jobs.d.ts +1 -0
  276. package/dist/client/agent-page/use-jobs.d.ts.map +1 -1
  277. package/dist/client/agent-page/use-jobs.js.map +1 -1
  278. package/dist/client/chat/message-components.d.ts +5 -0
  279. package/dist/client/chat/message-components.d.ts.map +1 -1
  280. package/dist/client/chat/message-components.js +17 -1
  281. package/dist/client/chat/message-components.js.map +1 -1
  282. package/dist/client/chat/tool-call-display.d.ts +3 -1
  283. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  284. package/dist/client/chat/tool-call-display.js +17 -7
  285. package/dist/client/chat/tool-call-display.js.map +1 -1
  286. package/dist/collab/awareness.d.ts +2 -2
  287. package/dist/collab/awareness.d.ts.map +1 -1
  288. package/dist/collab/routes.d.ts +1 -1
  289. package/dist/collab/struct-routes.d.ts +1 -1
  290. package/dist/connections/catalog.d.ts +17 -3
  291. package/dist/connections/catalog.d.ts.map +1 -1
  292. package/dist/connections/catalog.js +16 -1
  293. package/dist/connections/catalog.js.map +1 -1
  294. package/dist/connections/reader.d.ts +18 -0
  295. package/dist/connections/reader.d.ts.map +1 -1
  296. package/dist/connections/reader.js +41 -0
  297. package/dist/connections/reader.js.map +1 -1
  298. package/dist/dashboard-storage/index.d.ts +4 -0
  299. package/dist/dashboard-storage/index.d.ts.map +1 -0
  300. package/dist/dashboard-storage/index.js +4 -0
  301. package/dist/dashboard-storage/index.js.map +1 -0
  302. package/dist/dashboard-storage/panel-source.d.ts +68 -0
  303. package/dist/dashboard-storage/panel-source.d.ts.map +1 -0
  304. package/dist/dashboard-storage/panel-source.js +76 -0
  305. package/dist/dashboard-storage/panel-source.js.map +1 -0
  306. package/dist/dashboard-storage/schema.d.ts +562 -0
  307. package/dist/dashboard-storage/schema.d.ts.map +1 -0
  308. package/dist/dashboard-storage/schema.js +32 -0
  309. package/dist/dashboard-storage/schema.js.map +1 -0
  310. package/dist/dashboard-storage/store.d.ts +62 -0
  311. package/dist/dashboard-storage/store.d.ts.map +1 -0
  312. package/dist/dashboard-storage/store.js +227 -0
  313. package/dist/dashboard-storage/store.js.map +1 -0
  314. package/dist/deploy/build.d.ts +7 -0
  315. package/dist/deploy/build.d.ts.map +1 -1
  316. package/dist/deploy/build.js +78 -14
  317. package/dist/deploy/build.js.map +1 -1
  318. package/dist/eject/provider-api-definitions.d.ts +2 -1
  319. package/dist/eject/provider-api-definitions.d.ts.map +1 -1
  320. package/dist/eject/provider-api-definitions.js +1 -0
  321. package/dist/eject/provider-api-definitions.js.map +1 -1
  322. package/dist/eject/workspace-connections.d.ts.map +1 -1
  323. package/dist/eject/workspace-connections.js +1 -0
  324. package/dist/eject/workspace-connections.js.map +1 -1
  325. package/dist/extensions/actions.d.ts.map +1 -1
  326. package/dist/extensions/actions.js +165 -67
  327. package/dist/extensions/actions.js.map +1 -1
  328. package/dist/file-upload/actions/upload-image.d.ts +1 -1
  329. package/dist/jobs/actions/list-recurring-jobs.d.ts +1 -0
  330. package/dist/jobs/actions/list-recurring-jobs.d.ts.map +1 -1
  331. package/dist/jobs/actions/list-recurring-jobs.js +1 -0
  332. package/dist/jobs/actions/list-recurring-jobs.js.map +1 -1
  333. package/dist/jobs/scheduler.d.ts +17 -2
  334. package/dist/jobs/scheduler.d.ts.map +1 -1
  335. package/dist/jobs/scheduler.js +51 -2
  336. package/dist/jobs/scheduler.js.map +1 -1
  337. package/dist/jobs/tools.d.ts.map +1 -1
  338. package/dist/jobs/tools.js +32 -2
  339. package/dist/jobs/tools.js.map +1 -1
  340. package/dist/localization/default-messages.d.ts +1 -0
  341. package/dist/localization/default-messages.d.ts.map +1 -1
  342. package/dist/localization/default-messages.js +1 -0
  343. package/dist/localization/default-messages.js.map +1 -1
  344. package/dist/mcp-client/index.d.ts +2 -0
  345. package/dist/mcp-client/index.d.ts.map +1 -1
  346. package/dist/mcp-client/index.js +5 -0
  347. package/dist/mcp-client/index.js.map +1 -1
  348. package/dist/notifications/routes.d.ts +3 -3
  349. package/dist/observability/routes.d.ts +5 -5
  350. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  351. package/dist/provider-api/actions/provider-api.d.ts +8 -6
  352. package/dist/provider-api/actions/provider-api.d.ts.map +1 -1
  353. package/dist/provider-api/actions/provider-api.js +1 -1
  354. package/dist/provider-api/actions/provider-api.js.map +1 -1
  355. package/dist/provider-api/index.d.ts +11 -7
  356. package/dist/provider-api/index.d.ts.map +1 -1
  357. package/dist/provider-api/index.js +143 -5
  358. package/dist/provider-api/index.js.map +1 -1
  359. package/dist/resources/handlers.d.ts +1 -1
  360. package/dist/secrets/register-framework-secrets.d.ts.map +1 -1
  361. package/dist/secrets/register-framework-secrets.js +7 -0
  362. package/dist/secrets/register-framework-secrets.js.map +1 -1
  363. package/dist/secrets/routes.d.ts +9 -9
  364. package/dist/server/agent-chat/context-tools.d.ts.map +1 -1
  365. package/dist/server/agent-chat/context-tools.js +9 -0
  366. package/dist/server/agent-chat/context-tools.js.map +1 -1
  367. package/dist/server/agent-chat/framework-prompts.js +2 -2
  368. package/dist/server/agent-chat/framework-prompts.js.map +1 -1
  369. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  370. package/dist/server/agent-chat-plugin.js +18 -2
  371. package/dist/server/agent-chat-plugin.js.map +1 -1
  372. package/dist/server/core-routes-plugin.d.ts.map +1 -1
  373. package/dist/server/core-routes-plugin.js +1 -0
  374. package/dist/server/core-routes-plugin.js.map +1 -1
  375. package/dist/server/credential-provider.d.ts +4 -3
  376. package/dist/server/credential-provider.d.ts.map +1 -1
  377. package/dist/server/credential-provider.js +9 -3
  378. package/dist/server/credential-provider.js.map +1 -1
  379. package/dist/server/transcribe-voice.d.ts +1 -1
  380. package/dist/server/workspace-provider-oauth.d.ts +6 -1
  381. package/dist/server/workspace-provider-oauth.d.ts.map +1 -1
  382. package/dist/server/workspace-provider-oauth.js +141 -4
  383. package/dist/server/workspace-provider-oauth.js.map +1 -1
  384. package/dist/styles/agent-native.css +45 -2
  385. package/dist/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  386. package/dist/templates/chat/AGENTS.md +1 -1
  387. package/dist/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  388. package/dist/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  389. package/dist/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  390. package/dist/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  391. package/dist/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  392. package/dist/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  393. package/dist/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  394. package/dist/triggers/actions.d.ts.map +1 -1
  395. package/dist/triggers/actions.js +10 -2
  396. package/dist/triggers/actions.js.map +1 -1
  397. package/dist/triggers/dispatcher.d.ts.map +1 -1
  398. package/dist/triggers/dispatcher.js +15 -0
  399. package/dist/triggers/dispatcher.js.map +1 -1
  400. package/dist/triggers/types.d.ts +5 -0
  401. package/dist/triggers/types.d.ts.map +1 -1
  402. package/dist/triggers/types.js.map +1 -1
  403. package/dist/vite/action-types-plugin.d.ts.map +1 -1
  404. package/dist/vite/action-types-plugin.js +4 -1
  405. package/dist/vite/action-types-plugin.js.map +1 -1
  406. package/docs/content/agent-native-toolkit.mdx +16 -0
  407. package/docs/content/recurring-jobs.mdx +35 -6
  408. package/package.json +6 -2
  409. package/src/action.ts +22 -1
  410. package/src/agent/production-agent.ts +105 -3
  411. package/src/cli/templates-meta.ts +12 -0
  412. package/src/client/AssistantChat.tsx +53 -26
  413. package/src/client/agent-page/AgentJobsTab.tsx +19 -0
  414. package/src/client/agent-page/use-jobs.ts +1 -0
  415. package/src/client/chat/message-components.tsx +35 -1
  416. package/src/client/chat/tool-call-display.tsx +38 -3
  417. package/src/connections/catalog.ts +20 -1
  418. package/src/connections/reader.ts +65 -0
  419. package/src/dashboard-storage/index.ts +27 -0
  420. package/src/dashboard-storage/panel-source.ts +168 -0
  421. package/src/dashboard-storage/schema.ts +62 -0
  422. package/src/dashboard-storage/store.ts +333 -0
  423. package/src/deploy/build.ts +95 -16
  424. package/src/eject/provider-api-definitions.ts +1 -0
  425. package/src/eject/workspace-connections.ts +1 -0
  426. package/src/extensions/actions.ts +199 -73
  427. package/src/jobs/actions/list-recurring-jobs.ts +2 -0
  428. package/src/jobs/scheduler.ts +71 -4
  429. package/src/jobs/tools.ts +31 -1
  430. package/src/localization/default-messages.ts +1 -0
  431. package/src/mcp-client/index.ts +6 -0
  432. package/src/provider-api/actions/provider-api.ts +1 -1
  433. package/src/provider-api/index.ts +190 -5
  434. package/src/secrets/register-framework-secrets.ts +8 -0
  435. package/src/server/agent-chat/context-tools.ts +9 -0
  436. package/src/server/agent-chat/framework-prompts.ts +2 -2
  437. package/src/server/agent-chat-plugin.ts +22 -2
  438. package/src/server/core-routes-plugin.ts +1 -0
  439. package/src/server/credential-provider.ts +9 -3
  440. package/src/server/workspace-provider-oauth.ts +181 -4
  441. package/src/styles/agent-native.css +45 -2
  442. package/src/templates/chat/.agents/skills/agent-native-docs/SKILL.md +27 -0
  443. package/src/templates/chat/AGENTS.md +1 -1
  444. package/src/templates/default/.agents/skills/agent-native-docs/SKILL.md +27 -0
  445. package/src/templates/default/.agents/skills/app-branding/SKILL.md +159 -0
  446. package/src/templates/default/.agents/skills/app-permissions/SKILL.md +155 -0
  447. package/src/templates/headless/.agents/skills/agent-native-docs/SKILL.md +27 -0
  448. package/src/templates/workspace-core/.agents/skills/agent-native-docs/SKILL.md +27 -0
  449. package/src/templates/workspace-core/.agents/skills/extensions/SKILL.md +31 -18
  450. package/src/templates/workspace-core/.agents/skills/recurring-jobs/SKILL.md +15 -0
  451. package/src/triggers/actions.ts +11 -2
  452. package/src/triggers/dispatcher.ts +20 -1
  453. package/src/triggers/types.ts +5 -0
  454. package/src/vite/action-types-plugin.ts +9 -1
  455. package/corpus/templates/analytics/server/handlers/sql-query.ts +0 -36
  456. package/corpus/templates/analytics/server/routes/api/sql-query.post.ts +0 -1
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agent-native/core",
3
- "version": "0.114.16",
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"
@@ -382,7 +386,7 @@
382
386
  "yjs": "^13.6.31",
383
387
  "zod": "^4.3.6",
384
388
  "@agent-native/recap-cli": "0.5.0",
385
- "@agent-native/toolkit": "^0.8.2"
389
+ "@agent-native/toolkit": "^0.9.0"
386
390
  },
387
391
  "devDependencies": {
388
392
  "@ai-sdk/anthropic": "^3.0.71",
package/src/action.ts CHANGED
@@ -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",
@@ -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
 
@@ -859,6 +859,27 @@ export function assistantMessageHasUnresolvedTool(content: unknown): boolean {
859
859
  });
860
860
  }
861
861
 
862
+ // Only the last assistant message may shimmer as "the currently running
863
+ // tool" — an older message's dangling unresolved tool-call must never
864
+ // shimmer once a later run is active.
865
+ export function computeLatestRunningToolCallId(
866
+ content: ContentPart[] | undefined,
867
+ { chatRunning, isLast }: { chatRunning: boolean; isLast: boolean },
868
+ ): string | null {
869
+ if (!isLast) return null;
870
+ return (
871
+ content?.reduce(
872
+ (latestToolCallId, part) =>
873
+ part.type === "tool-call" &&
874
+ part.result === undefined &&
875
+ (chatRunning || part.activity === true)
876
+ ? part.toolCallId
877
+ : latestToolCallId,
878
+ null as string | null,
879
+ ) ?? null
880
+ );
881
+ }
882
+
862
883
  export function shouldShowAssistantMessageFooter({
863
884
  isLast,
864
885
  chatRunning,
@@ -1157,6 +1178,10 @@ export function AssistantMessage() {
1157
1178
  (p.type !== "tool-call" || p.activity !== true) &&
1158
1179
  isCollapsibleAssistantWorkPart(p),
1159
1180
  );
1181
+ const latestRunningToolCallId = computeLatestRunningToolCallId(msgContent, {
1182
+ chatRunning,
1183
+ isLast,
1184
+ });
1160
1185
 
1161
1186
  if (!hasRenderableContent) return null;
1162
1187
 
@@ -1201,7 +1226,16 @@ export function AssistantMessage() {
1201
1226
  case "reasoning":
1202
1227
  return <ReasoningMessagePart />;
1203
1228
  case "tool-call":
1204
- return part.toolUI ?? <ToolCallFallback {...part} />;
1229
+ return (
1230
+ part.toolUI ?? (
1231
+ <ToolCallFallback
1232
+ {...part}
1233
+ isLatestRunning={
1234
+ part.toolCallId === latestRunningToolCallId
1235
+ }
1236
+ />
1237
+ )
1238
+ );
1205
1239
  default:
1206
1240
  return null;
1207
1241
  }
@@ -104,6 +104,10 @@ function ToolLongRunningHintShell({
104
104
  children: React.ReactNode;
105
105
  }) {
106
106
  const [showLongRunningHint, setShowLongRunningHint] = useState(false);
107
+ // useState initializer runs once at mount: a row that mounts already
108
+ // resolved never animates, while a tool appended during an active stream
109
+ // mounts running and animates in.
110
+ const [animateEntry] = useState(isRunning);
107
111
 
108
112
  useEffect(() => {
109
113
  if (!isRunning) {
@@ -118,14 +122,21 @@ function ToolLongRunningHintShell({
118
122
  }, [isRunning, toolName]);
119
123
 
120
124
  return (
121
- <>
125
+ <div
126
+ className={cn(
127
+ "agent-tool-call",
128
+ animateEntry &&
129
+ "motion-safe:animate-in motion-safe:fade-in-0 motion-safe:slide-in-from-bottom-1 motion-safe:duration-200 motion-safe:ease-[var(--ease-out-strong)]",
130
+ )}
131
+ data-running={isRunning ? "true" : undefined}
132
+ >
122
133
  {children}
123
134
  {isRunning && showLongRunningHint && (
124
135
  <div className="mt-0.5 px-2.5 text-[11px] leading-snug text-muted-foreground/80">
125
136
  Still working. Large updates can take a minute or two.
126
137
  </div>
127
138
  )}
128
- </>
139
+ </div>
129
140
  );
130
141
  }
131
142
 
@@ -542,6 +553,7 @@ export function ToolCallDisplay({
542
553
  structuredMeta,
543
554
  approval,
544
555
  repeatCount,
556
+ isLatestRunning = isRunning,
545
557
  }: {
546
558
  toolName: string;
547
559
  argsText?: string;
@@ -553,6 +565,7 @@ export function ToolCallDisplay({
553
565
  structuredMeta?: Record<string, unknown>;
554
566
  approval?: { approvalKey: string; dismissed?: boolean };
555
567
  repeatCount?: number;
568
+ isLatestRunning?: boolean;
556
569
  }) {
557
570
  // Delegate to bespoke cells when structured metadata is present.
558
571
  // These must be separate components so hook order in ToolCallDisplayGeneric
@@ -603,6 +616,7 @@ export function ToolCallDisplay({
603
616
  mcpApp={mcpApp}
604
617
  chatUI={chatUI}
605
618
  isRunning={isRunning}
619
+ isLatestRunning={isLatestRunning}
606
620
  approval={approval}
607
621
  repeatCount={repeatCount}
608
622
  />,
@@ -617,6 +631,7 @@ function ToolCallDisplayGeneric({
617
631
  mcpApp,
618
632
  chatUI,
619
633
  isRunning,
634
+ isLatestRunning,
620
635
  approval,
621
636
  repeatCount,
622
637
  }: {
@@ -627,6 +642,7 @@ function ToolCallDisplayGeneric({
627
642
  mcpApp?: AgentMcpAppPayload;
628
643
  chatUI?: ActionChatUIConfig;
629
644
  isRunning: boolean;
645
+ isLatestRunning: boolean;
630
646
  approval?: { approvalKey: string; dismissed?: boolean };
631
647
  repeatCount?: number;
632
648
  }) {
@@ -786,7 +802,14 @@ function ToolCallDisplayGeneric({
786
802
  </>
787
803
  )}
788
804
  </span>
789
- <span className="min-w-0 truncate font-normal">{displayName}</span>
805
+ <span
806
+ className={cn(
807
+ "min-w-0 truncate font-normal",
808
+ isRunning && isLatestRunning && "agent-running-shimmer",
809
+ )}
810
+ >
811
+ {displayName}
812
+ </span>
790
813
  {repeatCount && repeatCount > 1 && (
791
814
  <span
792
815
  className="shrink-0 rounded border border-border/60 px-1.5 py-0.5 text-[10px] leading-none text-muted-foreground"
@@ -864,6 +887,7 @@ export function ToolCallFallback({
864
887
  activity?: boolean;
865
888
  approval?: { approvalKey: string; dismissed?: boolean };
866
889
  repeatCount?: number;
890
+ isLatestRunning?: boolean;
867
891
  }) {
868
892
  const chatRunning = React.useContext(ChatRunningContext);
869
893
  const isRunning =
@@ -884,6 +908,7 @@ export function ToolCallFallback({
884
908
  chatUI={rest.chatUI}
885
909
  structuredMeta={rest.structuredMeta}
886
910
  isRunning={isRunning}
911
+ isLatestRunning={rest.isLatestRunning}
887
912
  approval={rest.approval}
888
913
  repeatCount={rest.repeatCount}
889
914
  />
@@ -910,6 +935,15 @@ export function ReconnectStreamMessage({
910
935
  content.at(-1)?.type === "text" ? content.length - 1 : -1;
911
936
  const streamingReasoningPartIndex =
912
937
  content.at(-1)?.type === "reasoning" ? content.length - 1 : -1;
938
+ const latestRunningToolIndex = content.reduce(
939
+ (latestIndex, part, index) =>
940
+ part.type === "tool-call" &&
941
+ part.result === undefined &&
942
+ (chatRunning || part.activity === true)
943
+ ? index
944
+ : latestIndex,
945
+ -1,
946
+ );
913
947
 
914
948
  const renderPart = (part: ContentPart, i: number) => {
915
949
  if (part.type === "text") {
@@ -949,6 +983,7 @@ export function ReconnectStreamMessage({
949
983
  isRunning={
950
984
  part.result === undefined && (chatRunning || part.activity === true)
951
985
  }
986
+ isLatestRunning={i === latestRunningToolIndex}
952
987
  approval={part.approval}
953
988
  repeatCount={part.repeatCount}
954
989
  />
@@ -13,6 +13,7 @@ export type WorkspaceConnectionTemplateUse =
13
13
  | "calendar"
14
14
  | "clips"
15
15
  | "content"
16
+ | "crm"
16
17
  | "design"
17
18
  | "dispatch"
18
19
  | "forms"
@@ -27,6 +28,7 @@ export type WorkspaceConnectionProviderId =
27
28
  | "gmail"
28
29
  | "google_drive"
29
30
  | "hubspot"
31
+ | "salesforce"
30
32
  | "jira"
31
33
  | "sentry"
32
34
  | "granola"
@@ -239,7 +241,24 @@ export const WORKSPACE_CONNECTION_PROVIDERS = [
239
241
  ],
240
242
  },
241
243
  capabilities: ["search", "import", "crm"],
242
- recommendedTemplateUses: ["analytics", "brain", "mail", "dispatch"],
244
+ recommendedTemplateUses: ["analytics", "brain", "crm", "mail", "dispatch"],
245
+ }),
246
+ defineWorkspaceConnectionProvider({
247
+ id: "salesforce",
248
+ label: "Salesforce",
249
+ description:
250
+ "CRM accounts, contacts, opportunities, custom objects, and activity history for customer-aware apps.",
251
+ credentialKeys: [],
252
+ oauth: {
253
+ provider: "salesforce",
254
+ authorizationUrl:
255
+ "https://login.salesforce.com/services/oauth2/authorize",
256
+ tokenUrl: "https://login.salesforce.com/services/oauth2/token",
257
+ refreshUrl: "https://login.salesforce.com/services/oauth2/token",
258
+ scopes: ["api", "refresh_token", "id"],
259
+ },
260
+ capabilities: ["search", "import", "crm"],
261
+ recommendedTemplateUses: ["analytics", "brain", "crm", "dispatch"],
243
262
  }),
244
263
  defineWorkspaceConnectionProvider({
245
264
  id: "jira",