@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,58 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { getDb, schema } from "../server/db/index.js";
5
- import { requireCrmScope } from "./_crm-action-utils.js";
6
-
7
- export default defineAction({
8
- description:
9
- "Create a bounded keyword or delegated-agent CRM signal detector. Smart detectors define criteria only; this action never calls a model.",
10
- schema: z
11
- .object({
12
- name: z.string().trim().min(1).max(120),
13
- description: z.string().trim().max(500).default(""),
14
- kind: z.enum(["keyword", "smart"]),
15
- keywords: z.array(z.string().trim().min(1).max(80)).max(40).default([]),
16
- classifierPrompt: z.string().trim().max(1_000).default(""),
17
- enabled: z.boolean().default(true),
18
- })
19
- .superRefine((value, ctx) => {
20
- if (value.kind === "keyword" && value.keywords.length === 0) {
21
- ctx.addIssue({
22
- code: "custom",
23
- path: ["keywords"],
24
- message: "Keyword detectors require at least one keyword.",
25
- });
26
- }
27
- if (value.kind === "smart" && !value.classifierPrompt) {
28
- ctx.addIssue({
29
- code: "custom",
30
- path: ["classifierPrompt"],
31
- message: "Smart detectors require a classification criterion.",
32
- });
33
- }
34
- }),
35
- run: async (args, ctx) => {
36
- const scope = requireCrmScope(ctx);
37
- const now = new Date().toISOString();
38
- const id = crypto.randomUUID();
39
- await getDb()
40
- .insert(schema.crmSignalTrackers)
41
- .values({
42
- id,
43
- name: args.name,
44
- description: args.description,
45
- kind: args.kind,
46
- keywordsJson: JSON.stringify(
47
- args.kind === "keyword" ? args.keywords : [],
48
- ),
49
- classifierPrompt: args.kind === "smart" ? args.classifierPrompt : "",
50
- enabled: args.enabled,
51
- isDefault: false,
52
- ...scope,
53
- createdAt: now,
54
- updatedAt: now,
55
- });
56
- return { id, ...args };
57
- },
58
- });
@@ -1,14 +0,0 @@
1
- import { createDeleteStagedDatasetAction } from "@agent-native/core/provider-api/actions/staged-datasets";
2
- import { getCredentialContext } from "@agent-native/core/server/request-context";
3
- import { z } from "zod";
4
-
5
- import { CRM_APP_ID } from "../server/lib/provider-api.js";
6
-
7
- export default createDeleteStagedDatasetAction({
8
- description:
9
- "Delete a caller-scoped staged dataset after CRM analysis is complete.",
10
- schema: z.object({ datasetId: z.string().min(1) }),
11
- appId: CRM_APP_ID,
12
- getOwnerEmail: () => getCredentialContext()?.userEmail ?? null,
13
- http: false,
14
- });
@@ -1,36 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { assertAccess } from "@agent-native/core/sharing";
3
- import { eq } from "drizzle-orm";
4
- import { z } from "zod";
5
-
6
- import { getDb, schema } from "../server/db/index.js";
7
- import {
8
- CLIPS_CALL_EVIDENCE_RECIPE_ID,
9
- buildClipsCallEvidenceRecipe,
10
- } from "../shared/crm-automation-recipes.js";
11
-
12
- export default defineAction({
13
- description:
14
- "Return the default-off Clips call-evidence review recipe for one explicitly selected CRM record. The recipe never passes media, transcripts, or an event URL into CRM.",
15
- schema: z.object({
16
- recipeId: z
17
- .literal(CLIPS_CALL_EVIDENCE_RECIPE_ID)
18
- .default(CLIPS_CALL_EVIDENCE_RECIPE_ID),
19
- recordId: z.string().trim().min(1).max(128),
20
- }),
21
- http: { method: "GET" },
22
- readOnly: true,
23
- run: async ({ recordId }) => {
24
- await assertAccess("crm-record", recordId, "viewer");
25
- const [record] = await getDb()
26
- .select({ displayName: schema.crmRecords.displayName })
27
- .from(schema.crmRecords)
28
- .where(eq(schema.crmRecords.id, recordId))
29
- .limit(1);
30
- if (!record) throw new Error("CRM record was not found.");
31
- return buildClipsCallEvidenceRecipe({
32
- recordId,
33
- recordLabel: record.displayName,
34
- });
35
- },
36
- });
@@ -1,35 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { createProgramPanelSourceResolver } from "@agent-native/core/dashboard-storage";
3
- import { z } from "zod";
4
-
5
- import { crmDashboardStore } from "../server/db/index.js";
6
- import { CRM_APP_ID } from "../server/lib/provider-api.js";
7
- import { requireDashboardAccess } from "./_crm-dashboard.js";
8
- import { initCrmDataPrograms } from "./_crm-data-program-actions.js";
9
-
10
- const programResolver = createProgramPanelSourceResolver({ appId: CRM_APP_ID });
11
-
12
- export default defineAction({
13
- description:
14
- "Resolve one program-backed panel from an access-scoped CRM dashboard for the dashboard UI.",
15
- schema: z.object({
16
- dashboardId: z.string().trim().min(1).max(200),
17
- panelId: z.string().trim().min(1).max(120),
18
- }),
19
- http: { method: "GET" },
20
- readOnly: true,
21
- agentTool: false,
22
- toolCallable: false,
23
- run: async ({ dashboardId, panelId }, ctx?: ActionRunContext) => {
24
- const access = requireDashboardAccess(ctx);
25
- const dashboard = await crmDashboardStore.get(dashboardId, access);
26
- if (!dashboard) throw new Error("CRM dashboard was not found.");
27
- const panel = dashboard.config.panels.find((item) => item.id === panelId);
28
- if (!panel) throw new Error("CRM dashboard panel was not found.");
29
- initCrmDataPrograms();
30
- return programResolver.resolve(
31
- { source: panel.source, query: panel.query },
32
- { userEmail: access.userEmail, orgId: access.orgId ?? null },
33
- );
34
- },
35
- });
@@ -1,14 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { crmDashboardStore } from "../server/db/index.js";
5
- import { requireDashboardAccess } from "./_crm-dashboard.js";
6
-
7
- export default defineAction({
8
- description: "Get one access-scoped CRM dashboard by ID.",
9
- schema: z.object({ id: z.string().trim().min(1).max(200) }),
10
- http: { method: "GET" },
11
- readOnly: true,
12
- run: ({ id }, ctx?: ActionRunContext) =>
13
- crmDashboardStore.get(id, requireDashboardAccess(ctx)),
14
- });
@@ -1,13 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { getCrmOverview } from "../server/db/crm-store.js";
5
-
6
- export default defineAction({
7
- description:
8
- "Return a compact, access-scoped CRM work overview: open follow-up tasks, recently active mirrored records, and pending write proposals.",
9
- schema: z.object({}),
10
- http: { method: "GET" },
11
- readOnly: true,
12
- run: () => getCrmOverview(),
13
- });
@@ -1,61 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { accessFilter } from "@agent-native/core/sharing";
3
- import { and, asc, eq } from "drizzle-orm";
4
- import { z } from "zod";
5
-
6
- import { getDb, schema } from "../server/db/index.js";
7
- import { requireDashboardAccess } from "./_crm-dashboard.js";
8
-
9
- const MAX_PIPELINE_RECORDS = 500;
10
-
11
- export default defineAction({
12
- description:
13
- "Return bounded, access-scoped pipeline totals grouped by opportunity stage. This is the CRM-owned read source for the Pipeline dashboard data program.",
14
- schema: z.object({}),
15
- http: { method: "GET" },
16
- readOnly: true,
17
- run: async (_args, ctx?: ActionRunContext) => {
18
- const access = requireDashboardAccess(ctx);
19
- const records = await getDb()
20
- .select({
21
- stage: schema.crmRecords.stage,
22
- amount: schema.crmRecords.amount,
23
- })
24
- .from(schema.crmRecords)
25
- .where(
26
- and(
27
- eq(schema.crmRecords.kind, "opportunity"),
28
- eq(schema.crmRecords.tombstone, false),
29
- accessFilter(schema.crmRecords, schema.crmRecordShares, access),
30
- ),
31
- )
32
- .orderBy(asc(schema.crmRecords.stage))
33
- .limit(MAX_PIPELINE_RECORDS);
34
-
35
- const stages = new Map<
36
- string,
37
- { stage: string; pipelineValue: number; opportunities: number }
38
- >();
39
- for (const record of records) {
40
- const stage = record.stage?.trim() || "Unstaged";
41
- const total = stages.get(stage) ?? {
42
- stage,
43
- pipelineValue: 0,
44
- opportunities: 0,
45
- };
46
- total.pipelineValue += Number.isFinite(record.amount)
47
- ? record.amount!
48
- : 0;
49
- total.opportunities += 1;
50
- stages.set(stage, total);
51
- }
52
- const rows = [...stages.values()].sort((a, b) =>
53
- a.stage.localeCompare(b.stage),
54
- );
55
- return {
56
- rows,
57
- truncated: records.length === MAX_PIPELINE_RECORDS,
58
- sourceRecordLimit: MAX_PIPELINE_RECORDS,
59
- };
60
- },
61
- });
@@ -1,75 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import {
5
- createConnectedCrmAdapter,
6
- isConnectedCrmProvider,
7
- } from "../server/crm/adapter.js";
8
- import { createNativeCrmAdapter } from "../server/crm/native-adapter.js";
9
- import { loadVerifiedReadThroughRecord } from "../server/crm/read-through.js";
10
- import {
11
- getCrmRecord,
12
- getCrmRecordReadContext,
13
- getReadThroughRelationshipSummaries,
14
- } from "../server/db/crm-store.js";
15
-
16
- export default defineAction({
17
- description:
18
- "Return one access-scoped CRM record with bounded mirrored fields, recent interaction metadata, call-evidence references, and tasks. It never returns raw provider payloads, media, or transcripts.",
19
- schema: z.object({
20
- recordId: z.string().min(1).describe("Local CRM record ID."),
21
- }),
22
- http: { method: "GET" },
23
- readOnly: true,
24
- run: async ({ recordId }, ctx?: ActionRunContext) => {
25
- const context = await getCrmRecordReadContext(recordId);
26
- if (!context) {
27
- const error = new Error("CRM record not found") as Error & {
28
- statusCode?: number;
29
- };
30
- error.statusCode = 404;
31
- throw error;
32
- }
33
- const adapter =
34
- context.provider === "native"
35
- ? await createNativeCrmAdapter({
36
- connectionId: context.connectionId,
37
- accessTier: "viewer",
38
- })
39
- : isConnectedCrmProvider(context.provider) &&
40
- context.workspaceConnectionId
41
- ? await createConnectedCrmAdapter({
42
- provider: context.provider,
43
- connectionId: context.workspaceConnectionId,
44
- ...(ctx?.userEmail ? { userEmail: ctx.userEmail } : {}),
45
- ...(ctx?.orgId !== undefined ? { orgId: ctx.orgId } : {}),
46
- })
47
- : null;
48
- if (!adapter) {
49
- throw new Error("CRM access cannot be verified for this record.");
50
- }
51
- const readThrough = await loadVerifiedReadThroughRecord({
52
- adapter,
53
- context,
54
- });
55
- const relatedRecords = await getReadThroughRelationshipSummaries({
56
- context,
57
- relationships: readThrough.relationships,
58
- currentScopes: readThrough.currentScopes,
59
- });
60
- const record = await getCrmRecord(recordId, {
61
- displayName: readThrough.remote.displayName,
62
- fields: readThrough.remote.fields,
63
- remoteRevision: readThrough.remote.remoteRevision,
64
- remoteUpdatedAt: readThrough.remote.remoteUpdatedAt,
65
- relatedRecords,
66
- accessScope: readThrough.currentScope,
67
- });
68
- if (record) return record;
69
- const error = new Error("CRM record not found") as Error & {
70
- statusCode?: number;
71
- };
72
- error.statusCode = 404;
73
- throw error;
74
- },
75
- });
@@ -1,81 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { upsertDataProgram } from "@agent-native/core/data-programs";
3
- import { z } from "zod";
4
-
5
- import { crmDashboardStore } from "../server/db/index.js";
6
- import { CRM_APP_ID } from "../server/lib/provider-api.js";
7
- import {
8
- createPipelineDashboardConfig,
9
- crmPipelineDashboardId,
10
- CRM_PIPELINE_PROGRAM_CODE,
11
- CRM_PIPELINE_PROGRAM_COLUMNS,
12
- CRM_PIPELINE_PROGRAM_NAME,
13
- CRM_PIPELINE_PROGRAM_TITLE,
14
- CRM_PIPELINE_REFRESH_TTL_MS,
15
- CRM_PIPELINE_DASHBOARD_TITLE,
16
- requireDashboardAccess,
17
- } from "./_crm-dashboard.js";
18
- import getCrmPipelineData from "./get-crm-pipeline-data.js";
19
-
20
- export default defineAction({
21
- description:
22
- "Install or update your CRM Pipeline dashboard and its owned data program. Safe to rerun: it verifies the access-scoped source first, upserts the program by owner and name, then revision-writes the dashboard.",
23
- schema: z.object({}),
24
- run: async (_args, ctx?: ActionRunContext) => {
25
- const access = requireDashboardAccess(ctx);
26
- const preview = await getCrmPipelineData.run({}, ctx);
27
-
28
- const program = await upsertDataProgram({
29
- appId: CRM_APP_ID,
30
- name: CRM_PIPELINE_PROGRAM_NAME,
31
- title: CRM_PIPELINE_PROGRAM_TITLE,
32
- description:
33
- "Access-scoped opportunity totals by stage for the CRM Pipeline dashboard.",
34
- code: CRM_PIPELINE_PROGRAM_CODE,
35
- outputColumns: JSON.stringify(CRM_PIPELINE_PROGRAM_COLUMNS),
36
- refreshMode: "ttl",
37
- refreshTtlMs: CRM_PIPELINE_REFRESH_TTL_MS,
38
- background: false,
39
- ownerEmail: access.userEmail,
40
- orgId: access.orgId ?? null,
41
- });
42
- if (
43
- program.appId !== CRM_APP_ID ||
44
- program.name !== CRM_PIPELINE_PROGRAM_NAME
45
- ) {
46
- throw new Error(
47
- "CRM Pipeline data program could not be verified after saving.",
48
- );
49
- }
50
-
51
- const dashboardId = crmPipelineDashboardId(access);
52
- const existing = await crmDashboardStore.get(dashboardId, access);
53
- const dashboard = await crmDashboardStore.write(
54
- {
55
- id: dashboardId,
56
- kind: "pipeline",
57
- title: CRM_PIPELINE_DASHBOARD_TITLE,
58
- config: createPipelineDashboardConfig(program.id),
59
- ...(existing ? { expectedUpdatedAt: existing.updatedAt } : {}),
60
- },
61
- access,
62
- );
63
- if (dashboard.config.panels.length !== 3) {
64
- throw new Error(
65
- "CRM Pipeline dashboard could not be verified after saving.",
66
- );
67
- }
68
-
69
- return {
70
- dashboard,
71
- dashboardId: dashboard.id,
72
- programId: program.id,
73
- created: !existing,
74
- programPreview: {
75
- rowCount: preview.rows.length,
76
- columns: CRM_PIPELINE_PROGRAM_COLUMNS,
77
- truncated: preview.truncated,
78
- },
79
- };
80
- },
81
- });
@@ -1,15 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { crmDashboardStore } from "../server/db/index.js";
5
- import { requireDashboardAccess } from "./_crm-dashboard.js";
6
-
7
- export default defineAction({
8
- description:
9
- "List the bounded revision history for one access-scoped CRM dashboard.",
10
- schema: z.object({ id: z.string().trim().min(1).max(200) }),
11
- http: { method: "GET" },
12
- readOnly: true,
13
- run: ({ id }, ctx?: ActionRunContext) =>
14
- crmDashboardStore.listRevisions(id, requireDashboardAccess(ctx)),
15
- });
@@ -1,15 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { crmDashboardStore } from "../server/db/index.js";
5
- import { requireDashboardAccess } from "./_crm-dashboard.js";
6
-
7
- export default defineAction({
8
- description:
9
- "List up to 50 active CRM dashboards the current user can access.",
10
- schema: z.object({}),
11
- http: { method: "GET" },
12
- readOnly: true,
13
- run: async (_args, ctx?: ActionRunContext) =>
14
- (await crmDashboardStore.list(requireDashboardAccess(ctx))).slice(0, 50),
15
- });
@@ -1,31 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { listCrmProposals } from "../server/db/crm-store.js";
5
-
6
- export default defineAction({
7
- description:
8
- "List bounded, access-scoped CRM mutation proposals and their review status. Proposal payloads are intentionally omitted from this list surface.",
9
- schema: z.object({
10
- recordId: z.string().min(1).optional(),
11
- status: z
12
- .enum([
13
- "pending",
14
- "approved",
15
- "applied",
16
- "rejected",
17
- "conflict",
18
- "failed",
19
- ])
20
- .optional(),
21
- limit: z.coerce.number().int().min(1).max(100).default(50),
22
- cursor: z
23
- .string()
24
- .regex(/^\d+$/)
25
- .optional()
26
- .describe("Cursor returned by a previous page."),
27
- }),
28
- http: { method: "GET" },
29
- readOnly: true,
30
- run: (input) => listCrmProposals(input),
31
- });
@@ -1,79 +0,0 @@
1
- import { defineAction, type ActionRunContext } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import {
5
- createConnectedCrmAdapter,
6
- isConnectedCrmProvider,
7
- } from "../server/crm/adapter.js";
8
- import { resolveNativeCrmAccessScope } from "../server/crm/native-adapter.js";
9
- import { listCrmRecords } from "../server/db/crm-store.js";
10
-
11
- const kinds = [
12
- "account",
13
- "person",
14
- "opportunity",
15
- "activity",
16
- "task",
17
- "custom",
18
- ] as const;
19
-
20
- export default defineAction({
21
- description:
22
- "List a bounded, access-scoped page of thinly mirrored CRM records. Use kind, connectionId, or a short display-name query to narrow the scope; remote-only and redacted fields are excluded.",
23
- schema: z.object({
24
- kind: z
25
- .enum(kinds)
26
- .optional()
27
- .describe("Optional canonical CRM record kind."),
28
- connectionId: z
29
- .string()
30
- .min(1)
31
- .optional()
32
- .describe("Optional CRM connection ID."),
33
- viewId: z
34
- .string()
35
- .min(1)
36
- .max(128)
37
- .optional()
38
- .describe("Optional access-scoped saved CRM view ID."),
39
- query: z
40
- .string()
41
- .trim()
42
- .min(1)
43
- .max(120)
44
- .optional()
45
- .describe("Optional display-name search."),
46
- limit: z.coerce.number().int().min(1).max(100).default(50),
47
- cursor: z
48
- .string()
49
- .regex(/^\d+$/)
50
- .optional()
51
- .describe("Cursor returned by a previous page."),
52
- }),
53
- http: { method: "GET" },
54
- readOnly: true,
55
- run: (input, ctx?: ActionRunContext) =>
56
- listCrmRecords(input, {
57
- resolveScope: async (target) => {
58
- if (target.provider === "native") {
59
- return resolveNativeCrmAccessScope({
60
- connectionId: target.connectionId,
61
- objectType: target.objectType,
62
- });
63
- }
64
- if (
65
- !isConnectedCrmProvider(target.provider) ||
66
- !target.workspaceConnectionId
67
- ) {
68
- return null;
69
- }
70
- const adapter = await createConnectedCrmAdapter({
71
- provider: target.provider,
72
- connectionId: target.workspaceConnectionId,
73
- ...(ctx?.userEmail ? { userEmail: ctx.userEmail } : {}),
74
- ...(ctx?.orgId !== undefined ? { orgId: ctx.orgId } : {}),
75
- });
76
- return adapter.getAccessScope(target.objectType);
77
- },
78
- }),
79
- });
@@ -1,15 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { listCrmSavedViews } from "../server/db/crm-store.js";
5
-
6
- export default defineAction({
7
- description:
8
- "List access-scoped saved CRM views, including their optional linked data-program IDs.",
9
- schema: z.object({
10
- limit: z.coerce.number().int().min(1).max(100).default(50),
11
- }),
12
- http: { method: "GET" },
13
- readOnly: true,
14
- run: (input) => listCrmSavedViews(input),
15
- });
@@ -1,43 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { accessFilter } from "@agent-native/core/sharing";
3
- import { and, desc, eq, like, or } from "drizzle-orm";
4
- import { z } from "zod";
5
-
6
- import { getDb, schema } from "../server/db/index.js";
7
-
8
- export default defineAction({
9
- description:
10
- "List bounded, access-scoped CRM signals. Results contain evidence references and short excerpts, never transcripts or media.",
11
- schema: z.object({
12
- recordId: z.string().trim().min(1).max(128).optional(),
13
- reviewStatus: z.enum(["unreviewed", "confirmed", "dismissed"]).optional(),
14
- query: z.string().trim().max(120).optional(),
15
- limit: z.coerce.number().int().min(1).max(100).default(50),
16
- }),
17
- http: { method: "GET" },
18
- readOnly: true,
19
- run: async (args) => {
20
- const filters = [accessFilter(schema.crmSignals, schema.crmSignalShares)];
21
- if (args.recordId)
22
- filters.push(eq(schema.crmSignals.recordId, args.recordId));
23
- if (args.reviewStatus)
24
- filters.push(eq(schema.crmSignals.reviewStatus, args.reviewStatus));
25
- if (args.query) {
26
- const escaped = args.query.replace(/[\\%_]/g, "\\$&");
27
- filters.push(
28
- or(
29
- like(schema.crmSignals.label, `%${escaped}%`),
30
- like(schema.crmSignals.quote, `%${escaped}%`),
31
- like(schema.crmSignals.summary, `%${escaped}%`),
32
- )!,
33
- );
34
- }
35
- const signals = await getDb()
36
- .select()
37
- .from(schema.crmSignals)
38
- .where(and(...filters))
39
- .orderBy(desc(schema.crmSignals.createdAt))
40
- .limit(args.limit);
41
- return { signals };
42
- },
43
- });
@@ -1,32 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { accessFilter } from "@agent-native/core/sharing";
3
- import { asc } from "drizzle-orm";
4
- import { z } from "zod";
5
-
6
- import { getDb, schema } from "../server/db/index.js";
7
- import { DEFAULT_CRM_DETECTORS } from "../server/lib/intelligence/default-detectors.js";
8
-
9
- export default defineAction({
10
- description:
11
- "List access-scoped CRM signal detectors and the safe default pack when none are configured.",
12
- schema: z.object({}),
13
- http: { method: "GET" },
14
- readOnly: true,
15
- run: async () => {
16
- const rows = await getDb()
17
- .select()
18
- .from(schema.crmSignalTrackers)
19
- .where(
20
- accessFilter(schema.crmSignalTrackers, schema.crmSignalTrackerShares),
21
- )
22
- .orderBy(asc(schema.crmSignalTrackers.name));
23
- return {
24
- trackers: rows.map((row) => ({
25
- ...row,
26
- keywords: JSON.parse(row.keywordsJson) as string[],
27
- keywordsJson: undefined,
28
- })),
29
- suggestedDefaults: rows.length ? [] : DEFAULT_CRM_DETECTORS,
30
- };
31
- },
32
- });
@@ -1,22 +0,0 @@
1
- import { defineAction } from "@agent-native/core/action";
2
- import { z } from "zod";
3
-
4
- import { listCrmTasks } from "../server/db/crm-store.js";
5
-
6
- export default defineAction({
7
- description:
8
- "List a bounded, access-scoped page of CRM follow-up tasks. Filter by the linked record or task status when needed.",
9
- schema: z.object({
10
- recordId: z.string().min(1).optional(),
11
- status: z.enum(["open", "done", "cancelled"]).optional(),
12
- limit: z.coerce.number().int().min(1).max(100).default(50),
13
- cursor: z
14
- .string()
15
- .regex(/^\d+$/)
16
- .optional()
17
- .describe("Cursor returned by a previous page."),
18
- }),
19
- http: { method: "GET" },
20
- readOnly: true,
21
- run: (input) => listCrmTasks(input),
22
- });
@@ -1,14 +0,0 @@
1
- import { createListStagedDatasetsAction } from "@agent-native/core/provider-api/actions/staged-datasets";
2
- import { getCredentialContext } from "@agent-native/core/server/request-context";
3
- import { z } from "zod";
4
-
5
- import { CRM_APP_ID } from "../server/lib/provider-api.js";
6
-
7
- export default createListStagedDatasetsAction({
8
- description:
9
- "List caller-scoped staged CRM provider datasets created by provider-api-request. Use a dataset id with query-staged-dataset to reduce a result, or delete-staged-dataset after analysis.",
10
- schema: z.object({}),
11
- appId: CRM_APP_ID,
12
- getOwnerEmail: () => getCredentialContext()?.userEmail ?? null,
13
- http: { method: "GET" },
14
- });