@agent-native/core 0.118.0 → 0.118.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 (375) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +21 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/a2a/client.ts +32 -10
  5. package/corpus/core/src/cli/index.ts +18 -10
  6. package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
  7. package/corpus/core/src/cli/templates-meta.ts +0 -12
  8. package/corpus/core/src/cli/workspace-dev.ts +1 -1
  9. package/corpus/core/src/client/AgentPanel.tsx +9 -1
  10. package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
  11. package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
  12. package/corpus/core/src/client/chat/message-components.tsx +53 -8
  13. package/corpus/core/src/client/chat/tool-call-display.tsx +24 -9
  14. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  15. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  16. package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
  17. package/corpus/core/src/client/error-capture.ts +2 -6
  18. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  19. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  20. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -17
  21. package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
  22. package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
  23. package/corpus/core/src/client/session-replay.ts +3 -3
  24. package/corpus/core/src/client/settings/SettingsPanel.tsx +15 -6
  25. package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
  26. package/corpus/core/src/deploy/build.ts +2 -1
  27. package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
  28. package/corpus/core/src/integrations/adapters/slack.ts +84 -5
  29. package/corpus/core/src/integrations/index.ts +5 -1
  30. package/corpus/core/src/localization/default-messages.ts +1 -1
  31. package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
  32. package/corpus/core/src/server/realtime-voice.ts +4 -1
  33. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  34. package/corpus/core/src/terminal/cli-registry.ts +1 -1
  35. package/corpus/core/src/vite/client.ts +166 -1
  36. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
  37. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
  38. package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
  39. package/corpus/templates/brain/app/routes/sources.tsx +181 -114
  40. package/corpus/templates/clips/AGENTS.md +8 -6
  41. package/corpus/templates/clips/actions/request-transcript.ts +90 -420
  42. package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
  43. package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
  44. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
  45. package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
  46. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  47. package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
  48. package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
  49. package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
  50. package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
  51. package/corpus/templates/clips/server/register-secrets.ts +7 -6
  52. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
  53. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
  54. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
  55. package/corpus/templates/content/app/i18n-data.ts +10 -0
  56. package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
  57. package/corpus/templates/plan/app/entry.client.tsx +3 -0
  58. package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
  59. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
  60. package/corpus/templates/slides/app/pages/Index.tsx +1 -0
  61. package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
  62. package/corpus/toolkit/CHANGELOG.md +9 -0
  63. package/corpus/toolkit/package.json +1 -1
  64. package/corpus/toolkit/src/composer/PromptComposer.tsx +5 -1
  65. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
  66. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +30 -0
  67. package/corpus/toolkit/src/conformance/runner.tsx +153 -1
  68. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
  69. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
  70. package/corpus/toolkit/src/editor/index.ts +2 -0
  71. package/corpus/toolkit/src/styles.css +52 -23
  72. package/dist/a2a/client.d.ts +3 -1
  73. package/dist/a2a/client.d.ts.map +1 -1
  74. package/dist/a2a/client.js +17 -12
  75. package/dist/a2a/client.js.map +1 -1
  76. package/dist/cli/index.js +18 -8
  77. package/dist/cli/index.js.map +1 -1
  78. package/dist/cli/multi-frontier-runs.js +3 -3
  79. package/dist/cli/multi-frontier-runs.js.map +1 -1
  80. package/dist/cli/templates-meta.d.ts.map +1 -1
  81. package/dist/cli/templates-meta.js +0 -12
  82. package/dist/cli/templates-meta.js.map +1 -1
  83. package/dist/cli/workspace-dev.js +1 -1
  84. package/dist/cli/workspace-dev.js.map +1 -1
  85. package/dist/client/AgentPanel.d.ts.map +1 -1
  86. package/dist/client/AgentPanel.js +4 -1
  87. package/dist/client/AgentPanel.js.map +1 -1
  88. package/dist/client/RunStuckBanner.d.ts +3 -5
  89. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  90. package/dist/client/RunStuckBanner.js +17 -18
  91. package/dist/client/RunStuckBanner.js.map +1 -1
  92. package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
  93. package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
  94. package/dist/client/chat/action-chat-ui-surface.js +10 -0
  95. package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
  96. package/dist/client/chat/message-components.d.ts +3 -0
  97. package/dist/client/chat/message-components.d.ts.map +1 -1
  98. package/dist/client/chat/message-components.js +40 -7
  99. package/dist/client/chat/message-components.js.map +1 -1
  100. package/dist/client/chat/tool-call-display.d.ts +3 -1
  101. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  102. package/dist/client/chat/tool-call-display.js +13 -9
  103. package/dist/client/chat/tool-call-display.js.map +1 -1
  104. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  105. package/dist/client/chat/widgets/InlineExtensionWidget.js +1 -1
  106. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  107. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  108. package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
  109. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  110. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  111. package/dist/client/conversation/AgentConversation.js +3 -2
  112. package/dist/client/conversation/AgentConversation.js.map +1 -1
  113. package/dist/client/error-capture.d.ts.map +1 -1
  114. package/dist/client/error-capture.js +2 -2
  115. package/dist/client/error-capture.js.map +1 -1
  116. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  117. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  118. package/dist/client/resources/McpConnectionSuggestion.js +9 -8
  119. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  120. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  121. package/dist/client/resources/ResourcesPanel.js +3 -1
  122. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  123. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  124. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  125. package/dist/client/resources/mcp-integration-catalog.js +4 -17
  126. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  127. package/dist/client/resources/mcp-integration-logos.js +2 -2
  128. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  129. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  130. package/dist/client/route-chunk-recovery.js +5 -3
  131. package/dist/client/route-chunk-recovery.js.map +1 -1
  132. package/dist/client/session-replay.js +3 -3
  133. package/dist/client/session-replay.js.map +1 -1
  134. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  135. package/dist/client/settings/SettingsPanel.js +2 -2
  136. package/dist/client/settings/SettingsPanel.js.map +1 -1
  137. package/dist/client/transcription/use-live-transcription.d.ts +3 -3
  138. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  139. package/dist/client/transcription/use-live-transcription.js +22 -11
  140. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  141. package/dist/collab/routes.d.ts +1 -1
  142. package/dist/collab/struct-routes.d.ts +1 -1
  143. package/dist/deploy/build.d.ts.map +1 -1
  144. package/dist/deploy/build.js +1 -1
  145. package/dist/deploy/build.js.map +1 -1
  146. package/dist/guards/db-tool-scoping.js +1 -1
  147. package/dist/guards/db-tool-scoping.js.map +1 -1
  148. package/dist/integrations/adapters/slack.d.ts +1 -0
  149. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  150. package/dist/integrations/adapters/slack.js +61 -5
  151. package/dist/integrations/adapters/slack.js.map +1 -1
  152. package/dist/integrations/index.d.ts +1 -1
  153. package/dist/integrations/index.d.ts.map +1 -1
  154. package/dist/integrations/index.js +1 -1
  155. package/dist/integrations/index.js.map +1 -1
  156. package/dist/localization/default-messages.js +1 -1
  157. package/dist/localization/default-messages.js.map +1 -1
  158. package/dist/mcp-client/oauth-routes.d.ts +3 -0
  159. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  160. package/dist/mcp-client/oauth-routes.js +41 -12
  161. package/dist/mcp-client/oauth-routes.js.map +1 -1
  162. package/dist/notifications/routes.d.ts +2 -2
  163. package/dist/observability/routes.d.ts +3 -3
  164. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  165. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  166. package/dist/secrets/routes.d.ts +6 -6
  167. package/dist/server/realtime-voice.d.ts.map +1 -1
  168. package/dist/server/realtime-voice.js +1 -1
  169. package/dist/server/realtime-voice.js.map +1 -1
  170. package/dist/server/transcribe-voice.d.ts +1 -1
  171. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  172. package/dist/terminal/cli-registry.js +1 -1
  173. package/dist/terminal/cli-registry.js.map +1 -1
  174. package/dist/vite/client.d.ts +8 -1
  175. package/dist/vite/client.d.ts.map +1 -1
  176. package/dist/vite/client.js +113 -2
  177. package/dist/vite/client.js.map +1 -1
  178. package/package.json +2 -2
  179. package/src/a2a/client.ts +32 -10
  180. package/src/cli/index.ts +18 -10
  181. package/src/cli/multi-frontier-runs.ts +5 -3
  182. package/src/cli/templates-meta.ts +0 -12
  183. package/src/cli/workspace-dev.ts +1 -1
  184. package/src/client/AgentPanel.tsx +9 -1
  185. package/src/client/RunStuckBanner.tsx +39 -47
  186. package/src/client/chat/action-chat-ui-surface.tsx +32 -0
  187. package/src/client/chat/message-components.tsx +53 -8
  188. package/src/client/chat/tool-call-display.tsx +24 -9
  189. package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  190. package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  191. package/src/client/conversation/AgentConversation.tsx +12 -1
  192. package/src/client/error-capture.ts +2 -6
  193. package/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  194. package/src/client/resources/ResourcesPanel.tsx +5 -1
  195. package/src/client/resources/mcp-integration-catalog.ts +7 -17
  196. package/src/client/resources/mcp-integration-logos.ts +2 -2
  197. package/src/client/route-chunk-recovery.ts +5 -3
  198. package/src/client/session-replay.ts +3 -3
  199. package/src/client/settings/SettingsPanel.tsx +15 -6
  200. package/src/client/transcription/use-live-transcription.ts +64 -45
  201. package/src/deploy/build.ts +2 -1
  202. package/src/guards/db-tool-scoping.ts +1 -1
  203. package/src/integrations/adapters/slack.ts +84 -5
  204. package/src/integrations/index.ts +5 -1
  205. package/src/localization/default-messages.ts +1 -1
  206. package/src/mcp-client/oauth-routes.ts +45 -12
  207. package/src/server/realtime-voice.ts +4 -1
  208. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  209. package/src/terminal/cli-registry.ts +1 -1
  210. package/src/vite/client.ts +166 -1
  211. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
  212. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
  213. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
  214. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -220
  215. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  216. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
  217. package/corpus/templates/crm/.env.example +0 -5
  218. package/corpus/templates/crm/AGENTS.md +0 -120
  219. package/corpus/templates/crm/CHANGELOG.md +0 -1
  220. package/corpus/templates/crm/DEVELOPING.md +0 -66
  221. package/corpus/templates/crm/README.md +0 -106
  222. package/corpus/templates/crm/_gitignore +0 -12
  223. package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
  224. package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
  225. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
  226. package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
  227. package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
  228. package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
  229. package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
  230. package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
  231. package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
  232. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
  233. package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
  234. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
  235. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
  236. package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
  237. package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
  238. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
  239. package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
  240. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
  241. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
  242. package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
  243. package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
  244. package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
  245. package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
  246. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
  247. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
  248. package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
  249. package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
  250. package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
  251. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
  252. package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
  253. package/corpus/templates/crm/actions/navigate.ts +0 -63
  254. package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
  255. package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
  256. package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
  257. package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
  258. package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
  259. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
  260. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
  261. package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
  262. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
  263. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
  264. package/corpus/templates/crm/actions/run.ts +0 -7
  265. package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
  266. package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
  267. package/corpus/templates/crm/actions/sync-crm.ts +0 -146
  268. package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
  269. package/corpus/templates/crm/actions/view-screen.ts +0 -218
  270. package/corpus/templates/crm/agent-native.app-skill.json +0 -58
  271. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
  272. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -78
  273. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -226
  274. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -414
  275. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
  276. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
  277. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -362
  278. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -93
  279. package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -97
  280. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
  281. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
  282. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
  283. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +0 -1
  284. package/corpus/templates/crm/app/components/ui/badge.tsx +0 -1
  285. package/corpus/templates/crm/app/components/ui/button.tsx +0 -1
  286. package/corpus/templates/crm/app/components/ui/card.tsx +0 -1
  287. package/corpus/templates/crm/app/components/ui/dialog.tsx +0 -1
  288. package/corpus/templates/crm/app/components/ui/input.tsx +0 -1
  289. package/corpus/templates/crm/app/components/ui/label.tsx +0 -1
  290. package/corpus/templates/crm/app/components/ui/select.tsx +0 -1
  291. package/corpus/templates/crm/app/components/ui/sheet.tsx +0 -1
  292. package/corpus/templates/crm/app/components/ui/skeleton.tsx +0 -1
  293. package/corpus/templates/crm/app/components/ui/switch.tsx +0 -1
  294. package/corpus/templates/crm/app/components/ui/table.tsx +0 -1
  295. package/corpus/templates/crm/app/components/ui/tabs.tsx +0 -1
  296. package/corpus/templates/crm/app/components/ui/textarea.tsx +0 -1
  297. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +0 -17
  298. package/corpus/templates/crm/app/design-system.ts +0 -3
  299. package/corpus/templates/crm/app/entry.client.tsx +0 -16
  300. package/corpus/templates/crm/app/entry.server.tsx +0 -10
  301. package/corpus/templates/crm/app/global.css +0 -167
  302. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
  303. package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
  304. package/corpus/templates/crm/app/i18n/index.ts +0 -34
  305. package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
  306. package/corpus/templates/crm/app/lib/navigation.ts +0 -54
  307. package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
  308. package/corpus/templates/crm/app/lib/types.ts +0 -172
  309. package/corpus/templates/crm/app/lib/utils.ts +0 -1
  310. package/corpus/templates/crm/app/root.tsx +0 -91
  311. package/corpus/templates/crm/app/routes/_index.tsx +0 -26
  312. package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
  313. package/corpus/templates/crm/app/routes/agent.tsx +0 -5
  314. package/corpus/templates/crm/app/routes/ask.tsx +0 -53
  315. package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
  316. package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
  317. package/corpus/templates/crm/app/routes/people.tsx +0 -41
  318. package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
  319. package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
  320. package/corpus/templates/crm/app/routes/settings.tsx +0 -63
  321. package/corpus/templates/crm/app/routes/setup.tsx +0 -308
  322. package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
  323. package/corpus/templates/crm/app/routes/views.tsx +0 -333
  324. package/corpus/templates/crm/app/routes.ts +0 -17
  325. package/corpus/templates/crm/app/vite-env.d.ts +0 -6
  326. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
  327. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
  328. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
  329. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
  330. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
  331. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
  332. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
  333. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
  334. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
  335. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
  336. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
  337. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
  338. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
  339. package/corpus/templates/crm/components.json +0 -20
  340. package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
  341. package/corpus/templates/crm/learnings.defaults.md +0 -5
  342. package/corpus/templates/crm/package.json +0 -59
  343. package/corpus/templates/crm/public/favicon.svg +0 -1
  344. package/corpus/templates/crm/public/icon-180.svg +0 -1
  345. package/corpus/templates/crm/public/manifest.json +0 -11
  346. package/corpus/templates/crm/react-router.config.ts +0 -7
  347. package/corpus/templates/crm/server/crm/adapter.ts +0 -32
  348. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
  349. package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
  350. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
  351. package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
  352. package/corpus/templates/crm/server/crm/read-through.ts +0 -207
  353. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
  354. package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
  355. package/corpus/templates/crm/server/db/index.ts +0 -169
  356. package/corpus/templates/crm/server/db/schema.ts +0 -441
  357. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
  358. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
  359. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
  360. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
  361. package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
  362. package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
  363. package/corpus/templates/crm/server/middleware/auth.ts +0 -4
  364. package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
  365. package/corpus/templates/crm/server/plugins/auth.ts +0 -14
  366. package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
  367. package/corpus/templates/crm/server/plugins/db.ts +0 -454
  368. package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
  369. package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
  370. package/corpus/templates/crm/shared/crm-contract.ts +0 -254
  371. package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
  372. package/corpus/templates/crm/ssr-entry.ts +0 -11
  373. package/corpus/templates/crm/tsconfig.json +0 -24
  374. package/corpus/templates/crm/vite.config.ts +0 -15
  375. package/corpus/templates/crm/vitest.config.ts +0 -5
@@ -1,308 +0,0 @@
1
- import {
2
- useActionMutation,
3
- useActionQuery,
4
- } from "@agent-native/core/client/hooks";
5
- import { useMemo, useState } from "react";
6
- import { Link, useNavigate } from "react-router";
7
- import { toast } from "sonner";
8
-
9
- import { PageHeader } from "@/components/crm/Surface";
10
- import { Button } from "@/components/ui/button";
11
- import { Input } from "@/components/ui/input";
12
- import { Label } from "@/components/ui/label";
13
- import {
14
- Select,
15
- SelectContent,
16
- SelectItem,
17
- SelectTrigger,
18
- SelectValue,
19
- } from "@/components/ui/select";
20
-
21
- interface WorkspaceConnection {
22
- id: string;
23
- provider: "hubspot" | "salesforce";
24
- label: string;
25
- accountLabel?: string | null;
26
- status: string;
27
- }
28
-
29
- export default function SetupRoute() {
30
- const navigate = useNavigate();
31
- const connectionsQuery = useActionQuery<unknown>(
32
- "list-workspace-connections" as never,
33
- { includeDisabled: false } as never,
34
- );
35
- const connections = useMemo(
36
- () => crmConnections(connectionsQuery.data),
37
- [connectionsQuery.data],
38
- );
39
- const [workspaceConnectionId, setWorkspaceConnectionId] = useState("");
40
- const [pipelineIds, setPipelineIds] = useState("");
41
- const [historyDays, setHistoryDays] = useState("90");
42
- const configure = useActionMutation<
43
- { id: string },
44
- {
45
- workspaceConnectionId: string;
46
- provider: "hubspot" | "salesforce";
47
- selectedPipelineIds: string[];
48
- selectedObjectTypes: string[];
49
- }
50
- >("configure-crm-connection" as never);
51
- const configureNative = useActionMutation<
52
- { id: string },
53
- Record<string, never>
54
- >("configure-native-crm" as never);
55
- const sync = useActionMutation<
56
- unknown,
57
- {
58
- connectionId: string;
59
- objectType: string;
60
- scope: { updatedAfter: string; pipelineIds?: string[] };
61
- maxPages: number;
62
- }
63
- >("sync-crm" as never);
64
-
65
- const selected = connections.find(
66
- (connection) => connection.id === workspaceConnectionId,
67
- );
68
-
69
- async function syncRecentRecords() {
70
- if (!selected) return;
71
- const selectedPipelines = pipelineIds
72
- .split(",")
73
- .map((value) => value.trim())
74
- .filter(Boolean)
75
- .slice(0, 50);
76
- const days = Math.max(
77
- 1,
78
- Math.min(365, Number.parseInt(historyDays, 10) || 90),
79
- );
80
- try {
81
- const connection = await configure.mutateAsync({
82
- workspaceConnectionId,
83
- provider: selected.provider,
84
- selectedPipelineIds:
85
- selected.provider === "hubspot" ? selectedPipelines : [],
86
- selectedObjectTypes: objectTypesForProvider(selected.provider),
87
- });
88
- const updatedAfter = new Date(
89
- Date.now() - days * 24 * 60 * 60 * 1_000,
90
- ).toISOString();
91
- for (const objectType of objectTypesForProvider(selected.provider)) {
92
- await sync.mutateAsync({
93
- connectionId: connection.id,
94
- objectType,
95
- scope: {
96
- updatedAfter,
97
- ...(selected.provider === "hubspot" &&
98
- objectType === "deals" &&
99
- selectedPipelines.length
100
- ? { pipelineIds: selectedPipelines }
101
- : {}),
102
- },
103
- maxPages: 2,
104
- });
105
- }
106
- toast.success(
107
- `Recent ${providerLabel(selected.provider)} records are ready.`,
108
- );
109
- navigate("/", { replace: true });
110
- } catch (error) {
111
- toast.error(error instanceof Error ? error.message : "CRM sync failed.");
112
- }
113
- }
114
-
115
- async function startNativeCrm() {
116
- try {
117
- await configureNative.mutateAsync({});
118
- toast.success("Your native CRM is ready.");
119
- navigate("/", { replace: true });
120
- } catch (error) {
121
- toast.error(
122
- error instanceof Error ? error.message : "Could not start native CRM.",
123
- );
124
- }
125
- }
126
-
127
- return (
128
- <>
129
- <PageHeader
130
- eyebrow="CRM"
131
- title="Set up CRM"
132
- description="Start with CRM's built-in SQL store, or connect a scoped HubSpot or Salesforce companion."
133
- />
134
- <div className="mx-auto grid w-full max-w-xl gap-6 p-5 sm:p-7">
135
- <section className="grid gap-4 rounded-lg border border-border/70 bg-card p-4">
136
- <div className="grid gap-1">
137
- <p className="text-sm font-medium">Start with Native SQL</p>
138
- <p className="text-sm leading-6 text-muted-foreground">
139
- Run accounts, people, opportunities, saved views, tasks, and
140
- cadence without connecting another CRM. Your CRM is
141
- local-authoritative and portable across SQLite, Postgres, and D1.
142
- </p>
143
- </div>
144
- <Button
145
- className="w-full sm:w-fit"
146
- disabled={configureNative.isPending}
147
- onClick={() => void startNativeCrm()}
148
- >
149
- {configureNative.isPending ? "Starting…" : "Start with Native SQL"}
150
- </Button>
151
- </section>
152
- <div className="flex items-center gap-3 text-xs font-medium uppercase tracking-[0.12em] text-muted-foreground">
153
- <span className="h-px flex-1 bg-border" />
154
- Or connect an existing CRM
155
- <span className="h-px flex-1 bg-border" />
156
- </div>
157
- <div className="grid gap-2">
158
- <Label htmlFor="crm-connection">CRM connection</Label>
159
- <Select
160
- value={workspaceConnectionId}
161
- onValueChange={setWorkspaceConnectionId}
162
- disabled={connectionsQuery.isLoading}
163
- >
164
- <SelectTrigger id="crm-connection">
165
- <SelectValue placeholder="Select HubSpot or Salesforce" />
166
- </SelectTrigger>
167
- <SelectContent>
168
- {connections.map((connection) => (
169
- <SelectItem key={connection.id} value={connection.id}>
170
- {connection.label} · {providerLabel(connection.provider)}
171
- {connection.accountLabel
172
- ? ` · ${connection.accountLabel}`
173
- : ""}
174
- </SelectItem>
175
- ))}
176
- </SelectContent>
177
- </Select>
178
- <p className="text-xs text-muted-foreground">
179
- Only workspace Connections granted to this app can be used. CRM
180
- never stores provider tokens.
181
- </p>
182
- </div>
183
- <div className="grid gap-4 rounded-lg border border-border/70 bg-card p-4 sm:grid-cols-2">
184
- <div className="grid gap-2">
185
- <Label htmlFor="history-days">Recent history</Label>
186
- <Input
187
- id="history-days"
188
- type="number"
189
- min={1}
190
- max={365}
191
- value={historyDays}
192
- onChange={(event) => setHistoryDays(event.target.value)}
193
- />
194
- <p className="text-xs text-muted-foreground">
195
- Days, capped at 365.
196
- </p>
197
- </div>
198
- {selected?.provider === "hubspot" ? (
199
- <div className="grid gap-2">
200
- <Label htmlFor="pipeline-ids">Deal pipeline IDs</Label>
201
- <Input
202
- id="pipeline-ids"
203
- value={pipelineIds}
204
- maxLength={8_000}
205
- placeholder="Optional, comma-separated"
206
- onChange={(event) => setPipelineIds(event.target.value)}
207
- />
208
- <p className="text-xs text-muted-foreground">
209
- Leave blank for recently updated deals.
210
- </p>
211
- </div>
212
- ) : selected?.provider === "salesforce" ? (
213
- <div className="grid gap-2">
214
- <p className="text-sm font-medium">Salesforce objects</p>
215
- <p className="text-xs leading-5 text-muted-foreground">
216
- CRM mirrors recently updated Accounts, Contacts, and
217
- Opportunities in this initial cohort.
218
- </p>
219
- </div>
220
- ) : (
221
- <div className="grid gap-2">
222
- <p className="text-sm font-medium">Cohort objects</p>
223
- <p className="text-xs leading-5 text-muted-foreground">
224
- Choose a connection to see its initial object cohort.
225
- </p>
226
- </div>
227
- )}
228
- </div>
229
- {connections.length ? (
230
- <Button
231
- disabled={
232
- !selected ||
233
- selected.status !== "connected" ||
234
- configure.isPending ||
235
- sync.isPending
236
- }
237
- onClick={() => void syncRecentRecords()}
238
- >
239
- {configure.isPending || sync.isPending
240
- ? "Syncing…"
241
- : "Configure and sync"}
242
- </Button>
243
- ) : (
244
- <div className="rounded-lg border border-dashed border-border p-5 text-center">
245
- <p className="text-sm font-medium">
246
- No connected HubSpot or Salesforce account is available.
247
- </p>
248
- <p className="mt-1 text-sm text-muted-foreground">
249
- You can start with Native SQL above, or authorize a provider and
250
- grant it to CRM from shared settings.
251
- </p>
252
- <Button asChild variant="outline" className="mt-4">
253
- <Link to="/settings/connections">Open shared connections</Link>
254
- </Button>
255
- <p className="mt-3 text-xs text-muted-foreground">
256
- Using a Salesforce sandbox?{" "}
257
- <a
258
- className="font-medium text-foreground underline underline-offset-4"
259
- href="/_agent-native/connections/oauth/salesforce/start?environment=sandbox"
260
- >
261
- Authorize the sandbox directly
262
- </a>
263
- .
264
- </p>
265
- </div>
266
- )}
267
- </div>
268
- </>
269
- );
270
- }
271
-
272
- function crmConnections(data: unknown): WorkspaceConnection[] {
273
- if (!data || typeof data !== "object") return [];
274
- const rows = (data as { connections?: unknown }).connections;
275
- if (!Array.isArray(rows)) return [];
276
- return rows.flatMap((row) => {
277
- if (!row || typeof row !== "object") return [];
278
- const item = row as Record<string, unknown>;
279
- if (
280
- (item.provider !== "hubspot" && item.provider !== "salesforce") ||
281
- typeof item.id !== "string" ||
282
- typeof item.label !== "string" ||
283
- typeof item.status !== "string"
284
- ) {
285
- return [];
286
- }
287
- return [
288
- {
289
- id: item.id,
290
- provider: item.provider,
291
- label: item.label,
292
- accountLabel:
293
- typeof item.accountLabel === "string" ? item.accountLabel : null,
294
- status: item.status,
295
- },
296
- ];
297
- });
298
- }
299
-
300
- function objectTypesForProvider(provider: WorkspaceConnection["provider"]) {
301
- return provider === "hubspot"
302
- ? ["companies", "contacts", "deals"]
303
- : ["Account", "Contact", "Opportunity"];
304
- }
305
-
306
- function providerLabel(provider: WorkspaceConnection["provider"]) {
307
- return provider === "hubspot" ? "HubSpot" : "Salesforce";
308
- }
@@ -1,252 +0,0 @@
1
- import {
2
- useActionMutation,
3
- useActionQuery,
4
- } from "@agent-native/core/client/hooks";
5
- import { IconCheck, IconPlus, IconX } from "@tabler/icons-react";
6
- import { useState } from "react";
7
- import { Link } from "react-router";
8
- import { toast } from "sonner";
9
-
10
- import {
11
- LoadingRows,
12
- PageHeader,
13
- SetupEmptyState,
14
- } from "@/components/crm/Surface";
15
- import { Badge } from "@/components/ui/badge";
16
- import { Button } from "@/components/ui/button";
17
- import {
18
- Dialog,
19
- DialogContent,
20
- DialogDescription,
21
- DialogFooter,
22
- DialogHeader,
23
- DialogTitle,
24
- DialogTrigger,
25
- } from "@/components/ui/dialog";
26
- import { Input } from "@/components/ui/input";
27
- import { Label } from "@/components/ui/label";
28
- import { Textarea } from "@/components/ui/textarea";
29
- import { normalizeTasks } from "@/lib/types";
30
-
31
- interface ManageTaskInput {
32
- taskId?: string;
33
- title?: string;
34
- description?: string;
35
- dueAt?: string;
36
- status?: "open" | "done" | "cancelled";
37
- }
38
-
39
- export default function TasksRoute() {
40
- const query = useActionQuery<unknown>(
41
- "list-crm-tasks" as never,
42
- { limit: 100 } as never,
43
- );
44
- const manage = useActionMutation<unknown, ManageTaskInput>(
45
- "manage-crm-task" as never,
46
- );
47
- const tasks = normalizeTasks(query.data);
48
- const [pendingTaskIds, setPendingTaskIds] = useState<Set<string>>(new Set());
49
-
50
- async function setStatus(
51
- taskId: string,
52
- status: "open" | "done" | "cancelled",
53
- ) {
54
- setPendingTaskIds((current) => new Set(current).add(taskId));
55
- try {
56
- await manage.mutateAsync({ taskId, status });
57
- toast.success(status === "done" ? "Task completed." : "Task updated.");
58
- } catch (error) {
59
- const message =
60
- error instanceof Error ? error.message : "Task update failed.";
61
- toast.error(
62
- message.includes("mirrored provider task")
63
- ? "This is a mirrored provider task. Create a CRM proposal or complete it upstream."
64
- : message,
65
- );
66
- } finally {
67
- setPendingTaskIds((current) => {
68
- const next = new Set(current);
69
- next.delete(taskId);
70
- return next;
71
- });
72
- }
73
- }
74
-
75
- return (
76
- <>
77
- <PageHeader
78
- eyebrow="Work"
79
- title="Tasks"
80
- description="Local follow-up work connected to the records you can access."
81
- actions={<CreateTaskDialog mutation={manage} />}
82
- />
83
- {query.isLoading ? (
84
- <LoadingRows rows={7} />
85
- ) : tasks.length ? (
86
- <div className="divide-y divide-border/70">
87
- {tasks.map((task) => (
88
- <div
89
- key={task.id}
90
- className="flex flex-wrap items-center gap-3 px-5 py-4 sm:px-7"
91
- >
92
- <div className="min-w-0 flex-1">
93
- <div className="flex flex-wrap items-center gap-2">
94
- <p className="text-sm font-medium">{task.title}</p>
95
- <Badge variant="secondary" className="font-normal capitalize">
96
- {task.status}
97
- </Badge>
98
- </div>
99
- <p className="mt-1 text-xs text-muted-foreground">
100
- {task.dueAt ? `Due ${formatDate(task.dueAt)}` : "No due date"}
101
- {task.recordId ? (
102
- <>
103
- {" · "}
104
- <Link
105
- to={`/records/${encodeURIComponent(task.recordId)}`}
106
- className="underline-offset-4 hover:underline"
107
- >
108
- Open record
109
- </Link>
110
- </>
111
- ) : null}
112
- </p>
113
- </div>
114
- <div className="flex items-center gap-2">
115
- {task.status !== "done" ? (
116
- <Button
117
- variant="outline"
118
- size="sm"
119
- className="gap-1.5"
120
- disabled={pendingTaskIds.has(task.id)}
121
- onClick={() => void setStatus(task.id, "done")}
122
- >
123
- <IconCheck className="size-4" /> Complete
124
- </Button>
125
- ) : (
126
- <Button
127
- variant="ghost"
128
- size="sm"
129
- disabled={pendingTaskIds.has(task.id)}
130
- onClick={() => void setStatus(task.id, "open")}
131
- >
132
- Reopen
133
- </Button>
134
- )}
135
- {task.status !== "cancelled" ? (
136
- <Button
137
- variant="ghost"
138
- size="icon"
139
- disabled={pendingTaskIds.has(task.id)}
140
- aria-label={`Cancel ${task.title}`}
141
- onClick={() => void setStatus(task.id, "cancelled")}
142
- >
143
- <IconX className="size-4" />
144
- </Button>
145
- ) : null}
146
- </div>
147
- </div>
148
- ))}
149
- </div>
150
- ) : (
151
- <SetupEmptyState
152
- title="No follow-up tasks"
153
- description="Create a task here or from a CRM record to keep the next action visible."
154
- />
155
- )}
156
- </>
157
- );
158
- }
159
-
160
- function CreateTaskDialog({
161
- mutation,
162
- }: {
163
- mutation: {
164
- isPending: boolean;
165
- mutateAsync: (input: ManageTaskInput) => Promise<unknown>;
166
- };
167
- }) {
168
- const [open, setOpen] = useState(false);
169
- const [title, setTitle] = useState("");
170
- const [description, setDescription] = useState("");
171
- const [dueAt, setDueAt] = useState("");
172
-
173
- async function createTask() {
174
- try {
175
- await mutation.mutateAsync({
176
- title,
177
- description: description || undefined,
178
- dueAt: dueAt ? new Date(dueAt).toISOString() : undefined,
179
- status: "open",
180
- });
181
- setOpen(false);
182
- setTitle("");
183
- setDescription("");
184
- setDueAt("");
185
- toast.success("Task created.");
186
- } catch (error) {
187
- toast.error(
188
- error instanceof Error ? error.message : "Task creation failed.",
189
- );
190
- }
191
- }
192
-
193
- return (
194
- <Dialog open={open} onOpenChange={setOpen}>
195
- <DialogTrigger asChild>
196
- <Button size="sm" className="gap-2">
197
- <IconPlus className="size-4" /> New task
198
- </Button>
199
- </DialogTrigger>
200
- <DialogContent className="sm:max-w-md">
201
- <DialogHeader>
202
- <DialogTitle>Create follow-up task</DialogTitle>
203
- <DialogDescription>
204
- Tasks are local by default and never write to the provider silently.
205
- </DialogDescription>
206
- </DialogHeader>
207
- <div className="grid gap-4 py-2">
208
- <div className="grid gap-2">
209
- <Label htmlFor="task-title">Title</Label>
210
- <Input
211
- id="task-title"
212
- value={title}
213
- maxLength={300}
214
- onChange={(event) => setTitle(event.target.value)}
215
- />
216
- </div>
217
- <div className="grid gap-2">
218
- <Label htmlFor="task-description">Description</Label>
219
- <Textarea
220
- id="task-description"
221
- value={description}
222
- maxLength={2_000}
223
- onChange={(event) => setDescription(event.target.value)}
224
- />
225
- </div>
226
- <div className="grid gap-2">
227
- <Label htmlFor="task-due">Due</Label>
228
- <Input
229
- id="task-due"
230
- type="datetime-local"
231
- value={dueAt}
232
- onChange={(event) => setDueAt(event.target.value)}
233
- />
234
- </div>
235
- </div>
236
- <DialogFooter>
237
- <Button
238
- onClick={() => void createTask()}
239
- disabled={!title.trim() || mutation.isPending}
240
- >
241
- Create task
242
- </Button>
243
- </DialogFooter>
244
- </DialogContent>
245
- </Dialog>
246
- );
247
- }
248
-
249
- function formatDate(value: string) {
250
- const date = new Date(value);
251
- return Number.isNaN(date.valueOf()) ? value : date.toLocaleString();
252
- }