@agent-native/core 0.118.0 → 0.119.0

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 (480) hide show
  1. package/corpus/README.md +2 -2
  2. package/corpus/core/CHANGELOG.md +32 -0
  3. package/corpus/core/docs/content/a2a-protocol.mdx +15 -0
  4. package/corpus/core/docs/content/template-chat.mdx +1 -1
  5. package/corpus/core/docs/content/template-plan.mdx +3 -3
  6. package/corpus/core/package.json +1 -1
  7. package/corpus/core/src/a2a/activity.ts +371 -0
  8. package/corpus/core/src/a2a/client.ts +35 -11
  9. package/corpus/core/src/a2a/index.ts +21 -0
  10. package/corpus/core/src/a2a/types.ts +8 -0
  11. package/corpus/core/src/agent/model-config.ts +19 -23
  12. package/corpus/core/src/agent/production-agent.ts +167 -100
  13. package/corpus/core/src/agent/types.ts +16 -1
  14. package/corpus/core/src/cli/index.ts +18 -10
  15. package/corpus/core/src/cli/multi-frontier-runs.ts +5 -3
  16. package/corpus/core/src/cli/templates-meta.ts +0 -12
  17. package/corpus/core/src/cli/workspace-dev.ts +1 -1
  18. package/corpus/core/src/client/AgentPanel.tsx +9 -1
  19. package/corpus/core/src/client/RunStuckBanner.tsx +39 -47
  20. package/corpus/core/src/client/chat/action-chat-ui-surface.tsx +32 -0
  21. package/corpus/core/src/client/chat/message-components.tsx +53 -8
  22. package/corpus/core/src/client/chat/tool-call-display.tsx +214 -44
  23. package/corpus/core/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  24. package/corpus/core/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  25. package/corpus/core/src/client/chat-model-groups.ts +67 -27
  26. package/corpus/core/src/client/conversation/AgentConversation.tsx +12 -1
  27. package/corpus/core/src/client/error-capture.ts +2 -6
  28. package/corpus/core/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  29. package/corpus/core/src/client/resources/ResourcesPanel.tsx +5 -1
  30. package/corpus/core/src/client/resources/mcp-integration-catalog.ts +7 -17
  31. package/corpus/core/src/client/resources/mcp-integration-logos.ts +2 -2
  32. package/corpus/core/src/client/route-chunk-recovery.ts +5 -3
  33. package/corpus/core/src/client/session-replay.ts +3 -3
  34. package/corpus/core/src/client/settings/SettingsPanel.tsx +15 -6
  35. package/corpus/core/src/client/sharing/ShareButton.tsx +1 -27
  36. package/corpus/core/src/client/sharing/ShareDialog.tsx +0 -16
  37. package/corpus/core/src/client/sharing/useShareButtonController.ts +0 -7
  38. package/corpus/core/src/client/sharing/useShareDialogController.ts +0 -2
  39. package/corpus/core/src/client/sse-event-processor.ts +85 -1
  40. package/corpus/core/src/client/transcription/use-live-transcription.ts +64 -45
  41. package/corpus/core/src/deploy/build.ts +2 -1
  42. package/corpus/core/src/guards/db-tool-scoping.ts +1 -1
  43. package/corpus/core/src/integrations/adapters/slack.ts +84 -5
  44. package/corpus/core/src/integrations/index.ts +5 -1
  45. package/corpus/core/src/localization/default-messages.ts +7 -1
  46. package/corpus/core/src/mcp-client/oauth-routes.ts +45 -12
  47. package/corpus/core/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  48. package/corpus/core/src/scripts/call-agent.ts +49 -6
  49. package/corpus/core/src/server/agent-chat-plugin.ts +50 -10
  50. package/corpus/core/src/server/realtime-voice.ts +4 -1
  51. package/corpus/core/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  52. package/corpus/core/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  53. package/corpus/core/src/terminal/cli-registry.ts +1 -1
  54. package/corpus/core/src/vite/client.ts +166 -1
  55. package/corpus/templates/analytics/app/hooks/use-dashboard-views.ts +13 -1
  56. package/corpus/templates/analytics/app/pages/adhoc/sql-dashboard/ViewsMenu.tsx +10 -0
  57. package/corpus/templates/analytics/changelog/2026-07-22-show-a-useful-error-when-saving-a-dashboard-view-fails.md +6 -0
  58. package/corpus/templates/brain/app/routes/sources.tsx +181 -114
  59. package/corpus/templates/clips/AGENTS.md +8 -6
  60. package/corpus/templates/clips/actions/request-transcript.ts +90 -420
  61. package/corpus/templates/clips/actions/save-browser-transcript.ts +11 -28
  62. package/corpus/templates/clips/app/components/capture-install-options.tsx +5 -3
  63. package/corpus/templates/clips/app/components/player/transcript-panel.tsx +3 -136
  64. package/corpus/templates/clips/app/lib/capture-install-options.ts +15 -4
  65. package/corpus/templates/clips/app/routes/download.tsx +3 -2
  66. package/corpus/templates/clips/changelog/2026-07-22-fixed-an-intermittent-hydration-error-on-the-download-page.md +6 -0
  67. package/corpus/templates/clips/changelog/2026-07-22-fixed-transcript-generation-when-native-speech-capture-retur.md +6 -0
  68. package/corpus/templates/clips/changelog/2026-07-22-transcript-generation-now-retries-with-backup-speech-recogni.md +6 -0
  69. package/corpus/templates/clips/changelog/2026-07-23-fixed-recordings-failing-to-save-with-a-cancelled-or-cleanup.md +6 -0
  70. package/corpus/templates/clips/server/lib/public-agent-context.ts +2 -2
  71. package/corpus/templates/clips/server/plugins/db.ts +9 -1
  72. package/corpus/templates/clips/server/register-secrets.ts +7 -6
  73. package/corpus/templates/content/app/components/editor/SlashCommandMenu.tsx +16 -84
  74. package/corpus/templates/content/app/components/editor/VisualEditor.tsx +13 -7
  75. package/corpus/templates/content/app/components/editor/extensions/ImageBlock.tsx +2 -2
  76. package/corpus/templates/content/app/i18n-data.ts +10 -0
  77. package/corpus/templates/design/server/lib/fig-file-decoder.ts +1 -0
  78. package/corpus/templates/plan/app/entry.client.tsx +3 -0
  79. package/corpus/templates/plan/changelog/2026-07-22-recover-stale-pages-after-a-deployment-refresh-automatically.md +6 -0
  80. package/corpus/templates/slides/app/hooks/use-agent-generating.ts +10 -3
  81. package/corpus/templates/slides/app/pages/Index.tsx +1 -0
  82. package/corpus/templates/slides/changelog/2026-07-22-new-deck-prompts-now-open-in-their-own-visible-chat-thread.md +6 -0
  83. package/corpus/toolkit/CHANGELOG.md +9 -0
  84. package/corpus/toolkit/package.json +1 -1
  85. package/corpus/toolkit/src/composer/PromptComposer.tsx +5 -1
  86. package/corpus/toolkit/src/composer/RealtimeVoiceMode.tsx +119 -31
  87. package/corpus/toolkit/src/composer/useRealtimeVoiceMode.tsx +30 -0
  88. package/corpus/toolkit/src/conformance/runner.tsx +153 -1
  89. package/corpus/toolkit/src/editor/SharedRichEditor.tsx +13 -2
  90. package/corpus/toolkit/src/editor/SlashCommandMenu.tsx +20 -0
  91. package/corpus/toolkit/src/editor/index.ts +2 -0
  92. package/corpus/toolkit/src/styles.css +52 -23
  93. package/dist/a2a/activity.d.ts +50 -0
  94. package/dist/a2a/activity.d.ts.map +1 -0
  95. package/dist/a2a/activity.js +236 -0
  96. package/dist/a2a/activity.js.map +1 -0
  97. package/dist/a2a/client.d.ts +5 -1
  98. package/dist/a2a/client.d.ts.map +1 -1
  99. package/dist/a2a/client.js +18 -13
  100. package/dist/a2a/client.js.map +1 -1
  101. package/dist/a2a/index.d.ts +2 -1
  102. package/dist/a2a/index.d.ts.map +1 -1
  103. package/dist/a2a/index.js +1 -0
  104. package/dist/a2a/index.js.map +1 -1
  105. package/dist/a2a/types.d.ts +1 -0
  106. package/dist/a2a/types.d.ts.map +1 -1
  107. package/dist/a2a/types.js.map +1 -1
  108. package/dist/agent/engine/anthropic-engine.d.ts +1 -1
  109. package/dist/agent/engine/builder-engine.d.ts +2 -2
  110. package/dist/agent/engine/builder-engine.d.ts.map +1 -1
  111. package/dist/agent/model-config.d.ts +16 -16
  112. package/dist/agent/model-config.d.ts.map +1 -1
  113. package/dist/agent/model-config.js +19 -23
  114. package/dist/agent/model-config.js.map +1 -1
  115. package/dist/agent/production-agent.d.ts +26 -0
  116. package/dist/agent/production-agent.d.ts.map +1 -1
  117. package/dist/agent/production-agent.js +137 -80
  118. package/dist/agent/production-agent.js.map +1 -1
  119. package/dist/agent/types.d.ts +10 -0
  120. package/dist/agent/types.d.ts.map +1 -1
  121. package/dist/agent/types.js.map +1 -1
  122. package/dist/cli/index.js +18 -8
  123. package/dist/cli/index.js.map +1 -1
  124. package/dist/cli/multi-frontier-runs.js +3 -3
  125. package/dist/cli/multi-frontier-runs.js.map +1 -1
  126. package/dist/cli/templates-meta.d.ts.map +1 -1
  127. package/dist/cli/templates-meta.js +0 -12
  128. package/dist/cli/templates-meta.js.map +1 -1
  129. package/dist/cli/workspace-dev.js +1 -1
  130. package/dist/cli/workspace-dev.js.map +1 -1
  131. package/dist/client/AgentPanel.d.ts.map +1 -1
  132. package/dist/client/AgentPanel.js +4 -1
  133. package/dist/client/AgentPanel.js.map +1 -1
  134. package/dist/client/RunStuckBanner.d.ts +3 -5
  135. package/dist/client/RunStuckBanner.d.ts.map +1 -1
  136. package/dist/client/RunStuckBanner.js +17 -18
  137. package/dist/client/RunStuckBanner.js.map +1 -1
  138. package/dist/client/chat/action-chat-ui-surface.d.ts +8 -0
  139. package/dist/client/chat/action-chat-ui-surface.d.ts.map +1 -0
  140. package/dist/client/chat/action-chat-ui-surface.js +10 -0
  141. package/dist/client/chat/action-chat-ui-surface.js.map +1 -0
  142. package/dist/client/chat/message-components.d.ts +3 -0
  143. package/dist/client/chat/message-components.d.ts.map +1 -1
  144. package/dist/client/chat/message-components.js +40 -7
  145. package/dist/client/chat/message-components.js.map +1 -1
  146. package/dist/client/chat/tool-call-display.d.ts +3 -1
  147. package/dist/client/chat/tool-call-display.d.ts.map +1 -1
  148. package/dist/client/chat/tool-call-display.js +76 -23
  149. package/dist/client/chat/tool-call-display.js.map +1 -1
  150. package/dist/client/chat/widgets/InlineExtensionWidget.d.ts.map +1 -1
  151. package/dist/client/chat/widgets/InlineExtensionWidget.js +1 -1
  152. package/dist/client/chat/widgets/InlineExtensionWidget.js.map +1 -1
  153. package/dist/client/chat/widgets/builtin-tool-renderers.d.ts.map +1 -1
  154. package/dist/client/chat/widgets/builtin-tool-renderers.js +5 -3
  155. package/dist/client/chat/widgets/builtin-tool-renderers.js.map +1 -1
  156. package/dist/client/chat-model-groups.d.ts.map +1 -1
  157. package/dist/client/chat-model-groups.js +44 -21
  158. package/dist/client/chat-model-groups.js.map +1 -1
  159. package/dist/client/conversation/AgentConversation.d.ts.map +1 -1
  160. package/dist/client/conversation/AgentConversation.js +3 -2
  161. package/dist/client/conversation/AgentConversation.js.map +1 -1
  162. package/dist/client/error-capture.d.ts.map +1 -1
  163. package/dist/client/error-capture.js +2 -2
  164. package/dist/client/error-capture.js.map +1 -1
  165. package/dist/client/resources/McpConnectionSuggestion.d.ts +1 -0
  166. package/dist/client/resources/McpConnectionSuggestion.d.ts.map +1 -1
  167. package/dist/client/resources/McpConnectionSuggestion.js +9 -8
  168. package/dist/client/resources/McpConnectionSuggestion.js.map +1 -1
  169. package/dist/client/resources/ResourcesPanel.d.ts.map +1 -1
  170. package/dist/client/resources/ResourcesPanel.js +3 -1
  171. package/dist/client/resources/ResourcesPanel.js.map +1 -1
  172. package/dist/client/resources/mcp-integration-catalog.d.ts +1 -0
  173. package/dist/client/resources/mcp-integration-catalog.d.ts.map +1 -1
  174. package/dist/client/resources/mcp-integration-catalog.js +4 -17
  175. package/dist/client/resources/mcp-integration-catalog.js.map +1 -1
  176. package/dist/client/resources/mcp-integration-logos.js +2 -2
  177. package/dist/client/resources/mcp-integration-logos.js.map +1 -1
  178. package/dist/client/route-chunk-recovery.d.ts.map +1 -1
  179. package/dist/client/route-chunk-recovery.js +5 -3
  180. package/dist/client/route-chunk-recovery.js.map +1 -1
  181. package/dist/client/session-replay.js +3 -3
  182. package/dist/client/session-replay.js.map +1 -1
  183. package/dist/client/settings/SettingsPanel.d.ts.map +1 -1
  184. package/dist/client/settings/SettingsPanel.js +2 -2
  185. package/dist/client/settings/SettingsPanel.js.map +1 -1
  186. package/dist/client/sharing/ShareButton.d.ts +1 -1
  187. package/dist/client/sharing/ShareButton.d.ts.map +1 -1
  188. package/dist/client/sharing/ShareButton.js +3 -4
  189. package/dist/client/sharing/ShareButton.js.map +1 -1
  190. package/dist/client/sharing/ShareDialog.d.ts.map +1 -1
  191. package/dist/client/sharing/ShareDialog.js +1 -2
  192. package/dist/client/sharing/ShareDialog.js.map +1 -1
  193. package/dist/client/sharing/useShareButtonController.d.ts +0 -1
  194. package/dist/client/sharing/useShareButtonController.d.ts.map +1 -1
  195. package/dist/client/sharing/useShareButtonController.js +0 -6
  196. package/dist/client/sharing/useShareButtonController.js.map +1 -1
  197. package/dist/client/sharing/useShareDialogController.d.ts +0 -1
  198. package/dist/client/sharing/useShareDialogController.d.ts.map +1 -1
  199. package/dist/client/sharing/useShareDialogController.js +0 -1
  200. package/dist/client/sharing/useShareDialogController.js.map +1 -1
  201. package/dist/client/sse-event-processor.d.ts +12 -0
  202. package/dist/client/sse-event-processor.d.ts.map +1 -1
  203. package/dist/client/sse-event-processor.js +63 -1
  204. package/dist/client/sse-event-processor.js.map +1 -1
  205. package/dist/client/transcription/use-live-transcription.d.ts +3 -3
  206. package/dist/client/transcription/use-live-transcription.d.ts.map +1 -1
  207. package/dist/client/transcription/use-live-transcription.js +22 -11
  208. package/dist/client/transcription/use-live-transcription.js.map +1 -1
  209. package/dist/collab/awareness.d.ts +2 -2
  210. package/dist/collab/awareness.d.ts.map +1 -1
  211. package/dist/deploy/build.d.ts.map +1 -1
  212. package/dist/deploy/build.js +1 -1
  213. package/dist/deploy/build.js.map +1 -1
  214. package/dist/guards/db-tool-scoping.js +1 -1
  215. package/dist/guards/db-tool-scoping.js.map +1 -1
  216. package/dist/integrations/adapters/slack.d.ts +1 -0
  217. package/dist/integrations/adapters/slack.d.ts.map +1 -1
  218. package/dist/integrations/adapters/slack.js +61 -5
  219. package/dist/integrations/adapters/slack.js.map +1 -1
  220. package/dist/integrations/index.d.ts +1 -1
  221. package/dist/integrations/index.d.ts.map +1 -1
  222. package/dist/integrations/index.js +1 -1
  223. package/dist/integrations/index.js.map +1 -1
  224. package/dist/localization/default-messages.d.ts +6 -0
  225. package/dist/localization/default-messages.d.ts.map +1 -1
  226. package/dist/localization/default-messages.js +7 -1
  227. package/dist/localization/default-messages.js.map +1 -1
  228. package/dist/mcp-client/oauth-routes.d.ts +3 -0
  229. package/dist/mcp-client/oauth-routes.d.ts.map +1 -1
  230. package/dist/mcp-client/oauth-routes.js +41 -12
  231. package/dist/mcp-client/oauth-routes.js.map +1 -1
  232. package/dist/observability/routes.d.ts +3 -3
  233. package/dist/provider-api/actions/custom-provider-registration.d.ts +8 -8
  234. package/dist/provider-api/actions/provider-api.d.ts +11 -11
  235. package/dist/scripts/agent-engines/list-agent-engines.d.ts.map +1 -1
  236. package/dist/scripts/agent-engines/list-agent-engines.js +1 -18
  237. package/dist/scripts/agent-engines/list-agent-engines.js.map +1 -1
  238. package/dist/scripts/call-agent.d.ts.map +1 -1
  239. package/dist/scripts/call-agent.js +49 -6
  240. package/dist/scripts/call-agent.js.map +1 -1
  241. package/dist/secrets/routes.d.ts +6 -6
  242. package/dist/server/agent-chat-plugin.d.ts.map +1 -1
  243. package/dist/server/agent-chat-plugin.js +38 -10
  244. package/dist/server/agent-chat-plugin.js.map +1 -1
  245. package/dist/server/agent-engine-api-key-route.d.ts +1 -1
  246. package/dist/server/realtime-voice.d.ts.map +1 -1
  247. package/dist/server/realtime-voice.js +1 -1
  248. package/dist/server/realtime-voice.js.map +1 -1
  249. package/dist/server/transcribe-voice.d.ts +1 -1
  250. package/dist/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  251. package/dist/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  252. package/dist/terminal/cli-registry.js +1 -1
  253. package/dist/terminal/cli-registry.js.map +1 -1
  254. package/dist/vite/client.d.ts +8 -1
  255. package/dist/vite/client.d.ts.map +1 -1
  256. package/dist/vite/client.js +113 -2
  257. package/dist/vite/client.js.map +1 -1
  258. package/docs/content/a2a-protocol.mdx +15 -0
  259. package/docs/content/template-chat.mdx +1 -1
  260. package/docs/content/template-plan.mdx +3 -3
  261. package/package.json +2 -2
  262. package/src/a2a/activity.ts +371 -0
  263. package/src/a2a/client.ts +35 -11
  264. package/src/a2a/index.ts +21 -0
  265. package/src/a2a/types.ts +8 -0
  266. package/src/agent/model-config.ts +19 -23
  267. package/src/agent/production-agent.ts +167 -100
  268. package/src/agent/types.ts +16 -1
  269. package/src/cli/index.ts +18 -10
  270. package/src/cli/multi-frontier-runs.ts +5 -3
  271. package/src/cli/templates-meta.ts +0 -12
  272. package/src/cli/workspace-dev.ts +1 -1
  273. package/src/client/AgentPanel.tsx +9 -1
  274. package/src/client/RunStuckBanner.tsx +39 -47
  275. package/src/client/chat/action-chat-ui-surface.tsx +32 -0
  276. package/src/client/chat/message-components.tsx +53 -8
  277. package/src/client/chat/tool-call-display.tsx +214 -44
  278. package/src/client/chat/widgets/InlineExtensionWidget.tsx +0 -1
  279. package/src/client/chat/widgets/builtin-tool-renderers.tsx +7 -3
  280. package/src/client/chat-model-groups.ts +67 -27
  281. package/src/client/conversation/AgentConversation.tsx +12 -1
  282. package/src/client/error-capture.ts +2 -6
  283. package/src/client/resources/McpConnectionSuggestion.tsx +20 -14
  284. package/src/client/resources/ResourcesPanel.tsx +5 -1
  285. package/src/client/resources/mcp-integration-catalog.ts +7 -17
  286. package/src/client/resources/mcp-integration-logos.ts +2 -2
  287. package/src/client/route-chunk-recovery.ts +5 -3
  288. package/src/client/session-replay.ts +3 -3
  289. package/src/client/settings/SettingsPanel.tsx +15 -6
  290. package/src/client/sharing/ShareButton.tsx +1 -27
  291. package/src/client/sharing/ShareDialog.tsx +0 -16
  292. package/src/client/sharing/useShareButtonController.ts +0 -7
  293. package/src/client/sharing/useShareDialogController.ts +0 -2
  294. package/src/client/sse-event-processor.ts +85 -1
  295. package/src/client/transcription/use-live-transcription.ts +64 -45
  296. package/src/deploy/build.ts +2 -1
  297. package/src/guards/db-tool-scoping.ts +1 -1
  298. package/src/integrations/adapters/slack.ts +84 -5
  299. package/src/integrations/index.ts +5 -1
  300. package/src/localization/default-messages.ts +7 -1
  301. package/src/mcp-client/oauth-routes.ts +45 -12
  302. package/src/scripts/agent-engines/list-agent-engines.ts +1 -18
  303. package/src/scripts/call-agent.ts +49 -6
  304. package/src/server/agent-chat-plugin.ts +50 -10
  305. package/src/server/realtime-voice.ts +4 -1
  306. package/src/templates/workspace-core/.agents/skills/a2a-protocol/SKILL.md +16 -0
  307. package/src/templates/workspace-core/.agents/skills/voice-transcription/SKILL.md +7 -5
  308. package/src/terminal/cli-registry.ts +1 -1
  309. package/src/vite/client.ts +166 -1
  310. package/corpus/core/src/observability/hosted-model-experiment.ts +0 -118
  311. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +0 -115
  312. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +0 -177
  313. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +0 -128
  314. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +0 -220
  315. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +0 -169
  316. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +0 -100
  317. package/corpus/templates/crm/.env.example +0 -5
  318. package/corpus/templates/crm/AGENTS.md +0 -120
  319. package/corpus/templates/crm/CHANGELOG.md +0 -1
  320. package/corpus/templates/crm/DEVELOPING.md +0 -66
  321. package/corpus/templates/crm/README.md +0 -106
  322. package/corpus/templates/crm/_gitignore +0 -12
  323. package/corpus/templates/crm/actions/_crm-action-utils.ts +0 -87
  324. package/corpus/templates/crm/actions/_crm-dashboard.ts +0 -69
  325. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +0 -15
  326. package/corpus/templates/crm/actions/_crm-signal-utils.ts +0 -79
  327. package/corpus/templates/crm/actions/apply-crm-proposals.ts +0 -203
  328. package/corpus/templates/crm/actions/attach-call-evidence.ts +0 -170
  329. package/corpus/templates/crm/actions/configure-crm-connection.ts +0 -126
  330. package/corpus/templates/crm/actions/configure-native-crm.ts +0 -44
  331. package/corpus/templates/crm/actions/create-crm-record.ts +0 -148
  332. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +0 -58
  333. package/corpus/templates/crm/actions/delete-staged-dataset.ts +0 -14
  334. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +0 -36
  335. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +0 -35
  336. package/corpus/templates/crm/actions/get-crm-dashboard.ts +0 -14
  337. package/corpus/templates/crm/actions/get-crm-overview.ts +0 -13
  338. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +0 -61
  339. package/corpus/templates/crm/actions/get-crm-record.ts +0 -75
  340. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +0 -81
  341. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +0 -15
  342. package/corpus/templates/crm/actions/list-crm-dashboards.ts +0 -15
  343. package/corpus/templates/crm/actions/list-crm-proposals.ts +0 -31
  344. package/corpus/templates/crm/actions/list-crm-records.ts +0 -79
  345. package/corpus/templates/crm/actions/list-crm-saved-views.ts +0 -15
  346. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +0 -43
  347. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +0 -32
  348. package/corpus/templates/crm/actions/list-crm-tasks.ts +0 -22
  349. package/corpus/templates/crm/actions/list-staged-datasets.ts +0 -14
  350. package/corpus/templates/crm/actions/list-workspace-connections.ts +0 -47
  351. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +0 -87
  352. package/corpus/templates/crm/actions/manage-crm-task.ts +0 -132
  353. package/corpus/templates/crm/actions/navigate.ts +0 -63
  354. package/corpus/templates/crm/actions/provider-api-catalog.ts +0 -22
  355. package/corpus/templates/crm/actions/provider-api-docs.ts +0 -54
  356. package/corpus/templates/crm/actions/provider-api-request.ts +0 -92
  357. package/corpus/templates/crm/actions/query-staged-dataset.ts +0 -44
  358. package/corpus/templates/crm/actions/record-crm-call-insight.ts +0 -160
  359. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +0 -150
  360. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +0 -23
  361. package/corpus/templates/crm/actions/review-crm-signal.ts +0 -31
  362. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +0 -103
  363. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +0 -275
  364. package/corpus/templates/crm/actions/run.ts +0 -7
  365. package/corpus/templates/crm/actions/save-crm-dashboard.ts +0 -51
  366. package/corpus/templates/crm/actions/save-crm-saved-view.ts +0 -119
  367. package/corpus/templates/crm/actions/sync-crm.ts +0 -146
  368. package/corpus/templates/crm/actions/update-crm-record.ts +0 -510
  369. package/corpus/templates/crm/actions/view-screen.ts +0 -218
  370. package/corpus/templates/crm/agent-native.app-skill.json +0 -58
  371. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +0 -158
  372. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +0 -78
  373. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +0 -226
  374. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +0 -414
  375. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +0 -510
  376. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +0 -134
  377. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +0 -362
  378. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +0 -93
  379. package/corpus/templates/crm/app/components/crm/Surface.tsx +0 -97
  380. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +0 -180
  381. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +0 -112
  382. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +0 -84
  383. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +0 -1
  384. package/corpus/templates/crm/app/components/ui/badge.tsx +0 -1
  385. package/corpus/templates/crm/app/components/ui/button.tsx +0 -1
  386. package/corpus/templates/crm/app/components/ui/card.tsx +0 -1
  387. package/corpus/templates/crm/app/components/ui/dialog.tsx +0 -1
  388. package/corpus/templates/crm/app/components/ui/input.tsx +0 -1
  389. package/corpus/templates/crm/app/components/ui/label.tsx +0 -1
  390. package/corpus/templates/crm/app/components/ui/select.tsx +0 -1
  391. package/corpus/templates/crm/app/components/ui/sheet.tsx +0 -1
  392. package/corpus/templates/crm/app/components/ui/skeleton.tsx +0 -1
  393. package/corpus/templates/crm/app/components/ui/switch.tsx +0 -1
  394. package/corpus/templates/crm/app/components/ui/table.tsx +0 -1
  395. package/corpus/templates/crm/app/components/ui/tabs.tsx +0 -1
  396. package/corpus/templates/crm/app/components/ui/textarea.tsx +0 -1
  397. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +0 -17
  398. package/corpus/templates/crm/app/design-system.ts +0 -3
  399. package/corpus/templates/crm/app/entry.client.tsx +0 -16
  400. package/corpus/templates/crm/app/entry.server.tsx +0 -10
  401. package/corpus/templates/crm/app/global.css +0 -167
  402. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +0 -60
  403. package/corpus/templates/crm/app/i18n/en-US.ts +0 -89
  404. package/corpus/templates/crm/app/i18n/index.ts +0 -34
  405. package/corpus/templates/crm/app/lib/dashboard.ts +0 -13
  406. package/corpus/templates/crm/app/lib/navigation.ts +0 -54
  407. package/corpus/templates/crm/app/lib/tab-id.ts +0 -1
  408. package/corpus/templates/crm/app/lib/types.ts +0 -172
  409. package/corpus/templates/crm/app/lib/utils.ts +0 -1
  410. package/corpus/templates/crm/app/root.tsx +0 -91
  411. package/corpus/templates/crm/app/routes/_index.tsx +0 -26
  412. package/corpus/templates/crm/app/routes/accounts.tsx +0 -41
  413. package/corpus/templates/crm/app/routes/agent.tsx +0 -5
  414. package/corpus/templates/crm/app/routes/ask.tsx +0 -53
  415. package/corpus/templates/crm/app/routes/dashboard.tsx +0 -118
  416. package/corpus/templates/crm/app/routes/opportunities.tsx +0 -41
  417. package/corpus/templates/crm/app/routes/people.tsx +0 -41
  418. package/corpus/templates/crm/app/routes/proposals.tsx +0 -266
  419. package/corpus/templates/crm/app/routes/records.$recordId.tsx +0 -35
  420. package/corpus/templates/crm/app/routes/settings.tsx +0 -63
  421. package/corpus/templates/crm/app/routes/setup.tsx +0 -308
  422. package/corpus/templates/crm/app/routes/tasks.tsx +0 -252
  423. package/corpus/templates/crm/app/routes/views.tsx +0 -333
  424. package/corpus/templates/crm/app/routes.ts +0 -17
  425. package/corpus/templates/crm/app/vite-env.d.ts +0 -6
  426. package/corpus/templates/crm/changelog/2026-07-21-agent-native-crm.md +0 -6
  427. package/corpus/templates/crm/changelog/2026-07-21-clips-call-evidence-review-recipe.md +0 -6
  428. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-find-and-review-evidence-grounded-call-signals-w.md +0 -6
  429. package/corpus/templates/crm/changelog/2026-07-21-crm-can-now-manage-keyword-and-smart-call-signal-trackers-fr.md +0 -6
  430. package/corpus/templates/crm/changelog/2026-07-21-delegated-local-crm-automation.md +0 -6
  431. package/corpus/templates/crm/changelog/2026-07-21-native-sql.md +0 -6
  432. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboard.md +0 -6
  433. package/corpus/templates/crm/changelog/2026-07-21-pipeline-dashboards-now-install-correctly-from-the-crm-actio.md +0 -6
  434. package/corpus/templates/crm/changelog/2026-07-21-salesforce-connection.md +0 -6
  435. package/corpus/templates/crm/changelog/2026-07-22-crm-field-validation-now-explains-which-fields-cannot-be-edi.md +0 -6
  436. package/corpus/templates/crm/changelog/2026-07-22-fixed-hubspot-contact-syncs-missing-records-updated-after-th.md +0 -6
  437. package/corpus/templates/crm/changelog/2026-07-22-fixed-pipeline-dashboard-panels-so-their-opportunity-data-lo.md +0 -6
  438. package/corpus/templates/crm/changelog/2026-07-22-full-page-chat-keeps-the-active-conversation-when-moving-to-.md +0 -6
  439. package/corpus/templates/crm/components.json +0 -20
  440. package/corpus/templates/crm/docs/architecture/crm-contract.md +0 -180
  441. package/corpus/templates/crm/learnings.defaults.md +0 -5
  442. package/corpus/templates/crm/package.json +0 -59
  443. package/corpus/templates/crm/public/favicon.svg +0 -1
  444. package/corpus/templates/crm/public/icon-180.svg +0 -1
  445. package/corpus/templates/crm/public/manifest.json +0 -11
  446. package/corpus/templates/crm/react-router.config.ts +0 -7
  447. package/corpus/templates/crm/server/crm/adapter.ts +0 -32
  448. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +0 -64
  449. package/corpus/templates/crm/server/crm/crm-mirror.ts +0 -711
  450. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +0 -1146
  451. package/corpus/templates/crm/server/crm/native-adapter.ts +0 -1715
  452. package/corpus/templates/crm/server/crm/read-through.ts +0 -207
  453. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +0 -1255
  454. package/corpus/templates/crm/server/db/crm-store.ts +0 -1170
  455. package/corpus/templates/crm/server/db/index.ts +0 -169
  456. package/corpus/templates/crm/server/db/schema.ts +0 -441
  457. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +0 -65
  458. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +0 -105
  459. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +0 -100
  460. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +0 -144
  461. package/corpus/templates/crm/server/lib/intelligence/summary.ts +0 -141
  462. package/corpus/templates/crm/server/lib/provider-api.ts +0 -64
  463. package/corpus/templates/crm/server/middleware/auth.ts +0 -4
  464. package/corpus/templates/crm/server/plugins/agent-chat.ts +0 -68
  465. package/corpus/templates/crm/server/plugins/auth.ts +0 -14
  466. package/corpus/templates/crm/server/plugins/core-routes.ts +0 -17
  467. package/corpus/templates/crm/server/plugins/db.ts +0 -454
  468. package/corpus/templates/crm/server/routes/[...page].get.ts +0 -5
  469. package/corpus/templates/crm/shared/crm-automation-recipes.ts +0 -132
  470. package/corpus/templates/crm/shared/crm-contract.ts +0 -254
  471. package/corpus/templates/crm/shared/crm-sales-config.ts +0 -63
  472. package/corpus/templates/crm/ssr-entry.ts +0 -11
  473. package/corpus/templates/crm/tsconfig.json +0 -24
  474. package/corpus/templates/crm/vite.config.ts +0 -15
  475. package/corpus/templates/crm/vitest.config.ts +0 -5
  476. package/dist/observability/hosted-model-experiment.d.ts +0 -39
  477. package/dist/observability/hosted-model-experiment.d.ts.map +0 -1
  478. package/dist/observability/hosted-model-experiment.js +0 -90
  479. package/dist/observability/hosted-model-experiment.js.map +0 -1
  480. package/src/observability/hosted-model-experiment.ts +0 -118
@@ -1,333 +0,0 @@
1
- import {
2
- useActionMutation,
3
- useActionQuery,
4
- } from "@agent-native/core/client/hooks";
5
- import { IconBookmark, IconPlus } from "@tabler/icons-react";
6
- import { useState } from "react";
7
- import { Link, useNavigate } 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 {
29
- Select,
30
- SelectContent,
31
- SelectItem,
32
- SelectTrigger,
33
- SelectValue,
34
- } from "@/components/ui/select";
35
- import { asText, type CrmKind, type CrmSavedView } from "@/lib/types";
36
-
37
- export default function SavedViewsRoute() {
38
- const viewsQuery = useActionQuery<unknown>(
39
- "list-crm-saved-views" as never,
40
- {} as never,
41
- );
42
- const views = normalizeSavedViews(viewsQuery.data);
43
- return (
44
- <>
45
- <PageHeader
46
- eyebrow="CRM"
47
- title="Saved views"
48
- description="Executable, permission-aware slices with optional data-program context."
49
- actions={<CreateSavedViewDialog />}
50
- />
51
- {viewsQuery.isLoading ? (
52
- <LoadingRows rows={5} />
53
- ) : views.length ? (
54
- <div className="grid gap-2 p-5 sm:grid-cols-2 sm:p-7 xl:grid-cols-3">
55
- {views.map((view) => (
56
- <Link
57
- key={view.id}
58
- to={`/${kindRoute(view.kind)}?view=${encodeURIComponent(view.id)}`}
59
- className="group rounded-lg border border-border/70 bg-card p-4 transition-colors hover:bg-muted/50"
60
- >
61
- <div className="flex items-start gap-3">
62
- <IconBookmark className="mt-0.5 size-4 text-muted-foreground" />
63
- <div className="min-w-0">
64
- <p className="truncate text-sm font-medium">{view.name}</p>
65
- <p className="mt-1 line-clamp-2 text-sm text-muted-foreground">
66
- {view.description || view.query || "Saved CRM view"}
67
- </p>
68
- <div className="mt-3 flex flex-wrap gap-2">
69
- {view.kind ? (
70
- <Badge
71
- variant="secondary"
72
- className="capitalize font-normal"
73
- >
74
- {view.kind}s
75
- </Badge>
76
- ) : null}
77
- {view.dataProgramId ? (
78
- <Badge variant="outline" className="font-normal">
79
- Data program
80
- </Badge>
81
- ) : null}
82
- </div>
83
- </div>
84
- </div>
85
- </Link>
86
- ))}
87
- </div>
88
- ) : (
89
- <SetupEmptyState
90
- title="No saved views yet"
91
- description="Create a focused view with a record type, search, field filters, and optional data-program context."
92
- />
93
- )}
94
- </>
95
- );
96
- }
97
-
98
- function CreateSavedViewDialog() {
99
- const navigate = useNavigate();
100
- const [open, setOpen] = useState(false);
101
- const [name, setName] = useState("");
102
- const [description, setDescription] = useState("");
103
- const [kind, setKind] = useState<CrmKind>("account");
104
- const [query, setQuery] = useState("");
105
- const [field, setField] = useState("");
106
- const [value, setValue] = useState("");
107
- const [dataProgramId, setDataProgramId] = useState("");
108
- const save = useActionMutation<
109
- { id: string },
110
- {
111
- name: string;
112
- description?: string;
113
- kind: CrmKind;
114
- filters?: Record<string, unknown>;
115
- columns: string[];
116
- sort: Array<{ field: string; direction: "desc" }>;
117
- dataProgramId?: string;
118
- }
119
- >("save-crm-saved-view" as never);
120
-
121
- async function saveView() {
122
- const filters: Record<string, unknown> = {};
123
- if (query.trim()) filters.query = query.trim();
124
- if (field.trim() && value.trim()) {
125
- filters.fieldEquals = { [field.trim()]: value.trim() };
126
- }
127
- try {
128
- const saved = await save.mutateAsync({
129
- name: name.trim(),
130
- description: description.trim() || undefined,
131
- kind,
132
- filters: Object.keys(filters).length ? filters : undefined,
133
- columns: [
134
- "displayName",
135
- "domain",
136
- "primaryEmail",
137
- "ownerName",
138
- "stage",
139
- "nextContactAt",
140
- "remoteUpdatedAt",
141
- ],
142
- sort: [{ field: "updatedAt", direction: "desc" }],
143
- dataProgramId: dataProgramId.trim() || undefined,
144
- });
145
- setOpen(false);
146
- toast.success("Saved view created.");
147
- navigate(`/${kindRoute(kind)}?view=${encodeURIComponent(saved.id)}`);
148
- } catch (error) {
149
- toast.error(
150
- error instanceof Error ? error.message : "View could not be saved.",
151
- );
152
- }
153
- }
154
-
155
- return (
156
- <Dialog open={open} onOpenChange={setOpen}>
157
- <DialogTrigger asChild>
158
- <Button size="sm" className="gap-2">
159
- <IconPlus className="size-4" /> New view
160
- </Button>
161
- </DialogTrigger>
162
- <DialogContent className="sm:max-w-lg">
163
- <DialogHeader>
164
- <DialogTitle>Create saved view</DialogTitle>
165
- <DialogDescription>
166
- Views store bounded filters and presentation settings, not provider
167
- rows.
168
- </DialogDescription>
169
- </DialogHeader>
170
- <div className="grid gap-4 py-2 sm:grid-cols-2">
171
- <Field label="Name" htmlFor="view-name" className="sm:col-span-2">
172
- <Input
173
- id="view-name"
174
- value={name}
175
- maxLength={120}
176
- onChange={(event) => setName(event.target.value)}
177
- />
178
- </Field>
179
- <Field
180
- label="Description"
181
- htmlFor="view-description"
182
- className="sm:col-span-2"
183
- >
184
- <Input
185
- id="view-description"
186
- value={description}
187
- maxLength={500}
188
- onChange={(event) => setDescription(event.target.value)}
189
- />
190
- </Field>
191
- <Field label="Record type" htmlFor="view-kind">
192
- <Select
193
- value={kind}
194
- onValueChange={(next) => setKind(next as CrmKind)}
195
- >
196
- <SelectTrigger id="view-kind">
197
- <SelectValue />
198
- </SelectTrigger>
199
- <SelectContent>
200
- <SelectItem value="account">Accounts</SelectItem>
201
- <SelectItem value="person">People</SelectItem>
202
- <SelectItem value="opportunity">Opportunities</SelectItem>
203
- </SelectContent>
204
- </Select>
205
- </Field>
206
- <Field label="Search" htmlFor="view-query">
207
- <Input
208
- id="view-query"
209
- value={query}
210
- maxLength={120}
211
- placeholder="Name contains…"
212
- onChange={(event) => setQuery(event.target.value)}
213
- />
214
- </Field>
215
- <Field label="Field" htmlFor="view-field">
216
- <Input
217
- id="view-field"
218
- value={field}
219
- maxLength={120}
220
- placeholder="stage"
221
- onChange={(event) => setField(event.target.value)}
222
- />
223
- </Field>
224
- <Field label="Equals" htmlFor="view-value">
225
- <Input
226
- id="view-value"
227
- value={value}
228
- maxLength={240}
229
- placeholder="Qualified"
230
- onChange={(event) => setValue(event.target.value)}
231
- />
232
- </Field>
233
- <Field
234
- label="Data program ID"
235
- htmlFor="view-program"
236
- className="sm:col-span-2"
237
- >
238
- <Input
239
- id="view-program"
240
- value={dataProgramId}
241
- maxLength={128}
242
- placeholder="Optional saved cross-source program"
243
- onChange={(event) => setDataProgramId(event.target.value)}
244
- />
245
- </Field>
246
- </div>
247
- <DialogFooter>
248
- <Button
249
- disabled={!name.trim() || save.isPending}
250
- onClick={() => void saveView()}
251
- >
252
- Save and open
253
- </Button>
254
- </DialogFooter>
255
- </DialogContent>
256
- </Dialog>
257
- );
258
- }
259
-
260
- function Field({
261
- label,
262
- htmlFor,
263
- className,
264
- children,
265
- }: {
266
- label: string;
267
- htmlFor: string;
268
- className?: string;
269
- children: React.ReactNode;
270
- }) {
271
- return (
272
- <div className={`grid gap-2 ${className ?? ""}`}>
273
- <Label htmlFor={htmlFor}>{label}</Label>
274
- {children}
275
- </div>
276
- );
277
- }
278
-
279
- function normalizeSavedViews(data: unknown): CrmSavedView[] {
280
- const entries =
281
- data &&
282
- typeof data === "object" &&
283
- Array.isArray((data as { views?: unknown[] }).views)
284
- ? (data as { views: unknown[] }).views
285
- : [];
286
- return entries.flatMap((entry) => {
287
- if (!entry || typeof entry !== "object") return [];
288
- const item = entry as Record<string, unknown>;
289
- const id = asText(item.id);
290
- const name = asText(item.name);
291
- if (!id || !name) return [];
292
- return [
293
- {
294
- id,
295
- name,
296
- description: asText(item.description),
297
- kind: asKind(item.kind),
298
- query: readableFilters(item.filters ?? item.query),
299
- dataProgramId: asText(item.dataProgramId),
300
- },
301
- ];
302
- });
303
- }
304
-
305
- function readableFilters(value: unknown) {
306
- if (typeof value === "string") {
307
- try {
308
- return readableFilters(JSON.parse(value) as unknown);
309
- } catch {
310
- return value;
311
- }
312
- }
313
- if (!value || typeof value !== "object" || Array.isArray(value))
314
- return undefined;
315
- return Object.entries(value)
316
- .slice(0, 4)
317
- .map(([key, entry]) => `${key}: ${String(entry)}`)
318
- .join(" · ");
319
- }
320
-
321
- function asKind(value: unknown): CrmKind | undefined {
322
- return value === "account" || value === "person" || value === "opportunity"
323
- ? value
324
- : undefined;
325
- }
326
-
327
- function kindRoute(kind: CrmKind | undefined) {
328
- return kind === "person"
329
- ? "people"
330
- : kind === "opportunity"
331
- ? "opportunities"
332
- : "accounts";
333
- }
@@ -1,17 +0,0 @@
1
- import { type RouteConfig, index, route } from "@react-router/dev/routes";
2
-
3
- export default [
4
- index("./routes/_index.tsx"),
5
- route("accounts", "./routes/accounts.tsx"),
6
- route("people", "./routes/people.tsx"),
7
- route("opportunities", "./routes/opportunities.tsx"),
8
- route("records/:recordId", "./routes/records.$recordId.tsx"),
9
- route("tasks", "./routes/tasks.tsx"),
10
- route("proposals", "./routes/proposals.tsx"),
11
- route("views", "./routes/views.tsx"),
12
- route("dashboard", "./routes/dashboard.tsx"),
13
- route("ask", "./routes/ask.tsx"),
14
- route("setup", "./routes/setup.tsx"),
15
- route("settings/*", "./routes/settings.tsx"),
16
- route("agent", "./routes/agent.tsx"),
17
- ] satisfies RouteConfig;
@@ -1,6 +0,0 @@
1
- /// <reference types="vite/client" />
2
-
3
- declare module "react-dom/server.browser" {
4
- export * from "react-dom/server";
5
- export { default } from "react-dom/server";
6
- }
@@ -1,6 +0,0 @@
1
- ---
2
- type: added
3
- date: 2026-07-21
4
- ---
5
-
6
- CRM connects to HubSpot for scoped account intelligence, saved views, follow-up tasks, evidence, and approval-gated write proposals.
@@ -1,6 +0,0 @@
1
- ---
2
- type: added
3
- date: 2026-07-21
4
- ---
5
-
6
- CRM can prepare a record-scoped, default-off Clips review recipe while keeping media and transcripts in Clips.
@@ -1,6 +0,0 @@
1
- ---
2
- type: added
3
- date: 2026-07-21
4
- ---
5
-
6
- CRM can now find and review evidence-grounded call signals without storing transcripts or media.
@@ -1,6 +0,0 @@
1
- ---
2
- type: improved
3
- date: 2026-07-21
4
- ---
5
-
6
- CRM can now manage keyword and smart call-signal trackers from Intelligence settings.
@@ -1,6 +0,0 @@
1
- ---
2
- type: added
3
- date: 2026-07-21
4
- ---
5
-
6
- Approved sales automations can now update routine local CRM fields while provider changes remain reviewable proposals.
@@ -1,6 +0,0 @@
1
- ---
2
- type: added
3
- date: 2026-07-21
4
- ---
5
-
6
- CRM can now run as a standalone Native SQL system for accounts, people, opportunities, views, tasks, and cadence without an external provider.
@@ -1,6 +0,0 @@
1
- ---
2
- type: added
3
- date: 2026-07-21
4
- ---
5
-
6
- Pipeline now gives each CRM user a live, permission-aware view of opportunity value by stage.
@@ -1,6 +0,0 @@
1
- ---
2
- type: fixed
3
- date: 2026-07-21
4
- ---
5
-
6
- Pipeline dashboards now install correctly from the CRM action CLI.
@@ -1,6 +0,0 @@
1
- ---
2
- type: added
3
- date: 2026-07-21
4
- ---
5
-
6
- CRM can now connect to Salesforce alongside HubSpot for scoped account intelligence and follow-up work.
@@ -1,6 +0,0 @@
1
- ---
2
- type: fixed
3
- date: 2026-07-22
4
- ---
5
-
6
- CRM field validation now explains which fields cannot be edited instead of showing a generic error.
@@ -1,6 +0,0 @@
1
- ---
2
- type: fixed
3
- date: 2026-07-22
4
- ---
5
-
6
- Fixed HubSpot contact syncs missing records updated after the sync cursor.
@@ -1,6 +0,0 @@
1
- ---
2
- type: fixed
3
- date: 2026-07-22
4
- ---
5
-
6
- Fixed Pipeline dashboard panels so their opportunity data loads reliably.
@@ -1,6 +0,0 @@
1
- ---
2
- type: fixed
3
- date: 2026-07-22
4
- ---
5
-
6
- Full-page chat keeps the active conversation when moving to and from the sidebar.
@@ -1,20 +0,0 @@
1
- {
2
- "$schema": "https://ui.shadcn.com/schema.json",
3
- "style": "default",
4
- "rsc": false,
5
- "tsx": true,
6
- "tailwind": {
7
- "config": "",
8
- "css": "app/global.css",
9
- "baseColor": "slate",
10
- "cssVariables": true,
11
- "prefix": ""
12
- },
13
- "aliases": {
14
- "components": "@/components",
15
- "utils": "@/lib/utils",
16
- "ui": "@/components/ui",
17
- "lib": "@/lib",
18
- "hooks": "@/hooks"
19
- }
20
- }
@@ -1,180 +0,0 @@
1
- # CRM kernel contract
2
-
3
- This contract is the boundary for the Native SQL CRM and the HubSpot and
4
- Salesforce companion implementations. It prevents either connected provider's
5
- object model or permission semantics from becoming the product model.
6
-
7
- ## Canonical vocabulary
8
-
9
- - **Connection**: an authorized workspace integration grant and provider
10
- account. Tokens remain in workspace connections; CRM stores only the
11
- connection id and non-secret account metadata. Native SQL uses a CRM-owned
12
- native connection identity and never has an integration token.
13
- - **Object definition**: a provider or CRM-owned schema for one object type,
14
- including field types and effective capabilities for its authority.
15
- - **Record**: one provider or native object instance. Canonical kinds are
16
- `account`, `person`, `opportunity`, `activity`, `task`, and `custom`.
17
- - **Relationship**: a directed edge between records. It preserves a provider
18
- relationship id or source reference field and optional directional labels.
19
- - **Interaction**: a bounded relationship event such as a meeting, call,
20
- email, or note. Rich media remains in its source app/provider.
21
- - **Evidence**: a URL/id plus bounded quote, timestamp, speaker, and source
22
- metadata supporting a CRM claim. Evidence is not a transcript or media blob.
23
- - **Signal**: a first-class, reviewable moment, call summary, or next step with
24
- a bounded quote/summary, timestamp, confidence, detector/model metadata, and
25
- an evidence reference. Signals never contain transcript bodies.
26
- - **Cadence**: desired contact interval, last meaningful interaction, and next
27
- contact date for an account or person.
28
- - **Mirror**: a scoped local projection for fast lists, monitoring, joins, and
29
- agent context. It is not a second ungoverned copy of the upstream CRM.
30
- - **Local field**: a derived or user-authored field whose authority is CRM.
31
- - **Mutation**: a typed create/update/delete/association request with an
32
- idempotency key and optional expected remote revision.
33
- - **Proposal**: a mutation awaiting review or an agent-generated preview.
34
-
35
- The TypeScript source of truth is
36
- [`shared/crm-contract.ts`](../../shared/crm-contract.ts).
37
-
38
- ## Identity and provenance
39
-
40
- Connected-provider identity is the tuple:
41
-
42
- `connection_id + provider + object_type + remote_id`
43
-
44
- Native SQL record ids are opaque CRM-local identifiers with `provider: native`;
45
- they are never sent upstream. Email and domain are matching
46
- signals, not identity keys. Every mirrored field keeps field-level provenance:
47
- provider, connection, object type, remote id, optional field name, observed
48
- revision/time, and optional evidence reference.
49
-
50
- Relationships preserve direction because HubSpot association type ids and
51
- Salesforce reference fields are directional. Identity resolution may link two
52
- records, but never merges provider identities or silently overwrites one
53
- provider with another.
54
-
55
- ## Thin mirror and authority
56
-
57
- The mirror contains only configured cohorts: selected pipelines, active
58
- accounts, their linked people, explicitly linked records, recent interaction
59
- metadata, and local-owned objects. List and monitoring views read from it;
60
- record detail performs a read-through refresh; long-tail or exhaustive work
61
- uses provider API requests and staged data programs.
62
-
63
- Every mirrored record stores the remote revision, sync cursor/time, tombstone,
64
- connection identity, and access-scope key. Upstream is authoritative in
65
- Connected mode. In Hybrid mode, upstream remains authoritative for remote
66
- fields while CRM is authoritative for `derived-local` and
67
- `local-authoritative` fields. In Native SQL mode, CRM is authoritative for the
68
- record and all CRM-owned fields; no remote revision, provider token, or sync
69
- cursor is invented.
70
-
71
- No raw provider response, audio, video, transcript, screenshot, base64 body, or
72
- file payload is stored in CRM SQL.
73
-
74
- ## Call intelligence boundary
75
-
76
- CRM may link one Clips artifact to several CRM records through separate scoped
77
- evidence rows. Deterministic keyword detectors operate only on the bounded
78
- stored excerpts. Smart detectors and summaries are delegated to agent chat;
79
- server actions do not call a model. Delegated results are accepted only when
80
- the run, record, tracker, and evidence scopes agree and every quote/timestamp
81
- is grounded to the stored evidence excerpt. Clips retains recording,
82
- transcript, consent, recovery, and media ownership.
83
-
84
- The default-off Clips review recipe is scoped to one explicitly selected CRM
85
- record. It may react to `clip.created` only after a human approves the exact
86
- A2A activation call. The trigger is installed in Clips, where that event is
87
- registered. It ignores the event URL and calls the access-checked
88
- `prepare-crm-call-evidence` read action with the opaque clip id. CRM receives
89
- only the returned durable HTTPS `/r/<id>` page, id, and capture time, then links
90
- it to the selected record through `attach-call-evidence`. Media, transcripts,
91
- temporary grants, inferred records, tasks, field updates, and provider writes
92
- are outside this delegation. This preserves both CRM record ACLs and Clips page
93
- access without duplicating source media.
94
-
95
- ## Field storage policy
96
-
97
- Unknown fields are **not mirrored**. A field value enters the mirror only when
98
- it is on the configured allow-list.
99
-
100
- | Policy | Stored locally | Read behavior | Write authority |
101
- | --------------------- | ----------------------------------------- | --------------------------------- | ------------------------------ |
102
- | `mirrored` | Bounded typed value | Mirror, then read-through refresh | Provider |
103
- | `remote-only` | Metadata, never the value | Fetch ephemerally from provider | Provider |
104
- | `redacted` | Neither metadata value nor value | Do not fetch or expose | None |
105
- | `derived-local` | Typed value plus provenance/evidence refs | Local | CRM computation |
106
- | `local-authoritative` | Typed value | Local | Human or approved CRM workflow |
107
-
108
- Sensitive fields default to `redacted`; other newly discovered fields default
109
- to `remote-only`. An admin must explicitly allow-list a field as `mirrored`.
110
-
111
- ## Access-scope semantics
112
-
113
- `ownableColumns()` and framework access checks provide the local privacy
114
- boundary. Provider access remains a second, non-substitutable boundary.
115
-
116
- Connected records and field projections carry the connection actor, grant id,
117
- record-visibility mode, object CRUD capabilities, and hashes/fingerprints for
118
- effective field and sharing access. A service-account mirror must not be shown
119
- as though it inherited a human user's Salesforce sharing or field-level
120
- permissions. Reads fail closed when the current access scope cannot be proven
121
- compatible. Scope changes invalidate or quarantine affected mirror rows until
122
- they are refreshed. Native SQL uses its CRM ownership/share scope and does not
123
- claim or emulate an upstream provider permission.
124
-
125
- ## Write policy matrix
126
-
127
- | Initiator and operation | Default decision | Required behavior |
128
- | ------------------------------------------------------------------- | --------------------- | --------------------------------------------------------- |
129
- | Human, direct scoped edit | Execute | Optimistic UI, conflict check, undo where possible, audit |
130
- | Agent, local and reversible | Execute | Must pass access and stored policy; audit |
131
- | Agent, provider and reversible | Propose | Preview first; execute only with delegated authority |
132
- | Agent, bulk/destructive/ownership/amount/stage/external side effect | Require approval | Preview exact scope and changed fields; fail closed |
133
- | Automation with stored policy | Execute inside policy | No per-run prompt; stop and propose/deny outside policy |
134
-
135
- Named high-risk classes remain approval-gated even when routine provider writes
136
- have delegated authority. A later policy version may add field-specific
137
- delegation without weakening the destructive/bulk boundary. A human `execute`
138
- decision assumes the initiating UI has already collected any required
139
- destructive confirmation; the policy layer does not add a second prompt.
140
-
141
- All mutations are idempotent, access-checked, audited, and record the actor,
142
- policy decision, before/after field summary, provider response status, and
143
- remote revision. Provider conflicts never overwrite silently.
144
-
145
- `applyMutation` represents one logical record mutation, not one HTTP request.
146
- Adapters may use provider batch endpoints internally. A future bulk action can
147
- add an `applyMutations` adapter method without changing the single-mutation
148
- contract.
149
-
150
- ## Provider-model validation
151
-
152
- | Contract concern | Native SQL | HubSpot | Salesforce | Contract consequence |
153
- | ----------------------------- | ----------------------------------------------- | --------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------- |
154
- | Object names | Canonical CRM and generic custom object names | Built-ins plus numeric/custom object type ids | Standard and `__c` API names | `objectType` is an opaque case-preserving string |
155
- | Record ids | CRM-local opaque id | String ids | 15/18-character string ids | Record refs preserve provider and opaque identity |
156
- | Schema discovery | CRM-owned canonical schema | Properties and CRM schemas APIs | sObject/Object Info describe | Adapter returns object and field capabilities |
157
- | Accounts/people/opportunities | Account/person/opportunity | Companies/contacts/deals | Account/Contact/Opportunity | Canonical kind is separate from provider object type |
158
- | Relationships | CRM-directed edge | Directional association type ids and labels | Reference fields and child relationships | Directed edge preserves type, label, and source field |
159
- | Custom objects | Generic display/link/write, no object authoring | Schema-discovered | `__c` and describe-discovered | V1 generic discover/search/display/link/write support |
160
- | Remote revision | Local mutation version | `updatedAt` | `LastModifiedDate` or `SystemModstamp` | Revision is opaque; Native never claims a remote revision |
161
- | Deletion | CRM tombstone/archive policy | Archived records | Deleted records/query-all semantics | Tombstone is first-class and sync-capability gated |
162
- | Permissions | CRM ownership and sharing scope | OAuth scopes, object/property sensitivity | CRUD, FLS, record sharing | Access scope is stored and checked independently of local ACL |
163
- | Conditional write | Local version check | Provider-specific conflict strategy | `If-Unmodified-Since`/revision-aware update where available | Adapter reports capability and never invents success |
164
-
165
- Reference checks used for this validation:
166
-
167
- - [HubSpot CRM objects and associations](https://developers.hubspot.com/docs/api-reference/latest/crm/understanding-the-crm)
168
- - [HubSpot association definitions and labels](https://developers.hubspot.com/docs/api-reference/latest/crm/associations/associations-schema/guide)
169
- - [Salesforce object metadata](https://developer.salesforce.com/docs/platform/graphql/guide/query-objectinfo.html)
170
- - [Salesforce record queries and effective permissions](https://developer.salesforce.com/docs/platform/graphql/guide/query-record-objects.html)
171
- - [Salesforce revision-aware record updates](https://developer.salesforce.com/docs/platform/lwc/guide/reference-update-record.html)
172
-
173
- ## Initial-scope boundary
174
-
175
- This run builds Native SQL plus HubSpot and Salesforce Connected/Hybrid
176
- companion behavior. Native SQL is the portable, local-authoritative replacement
177
- path; it does not depend on or synchronize to HubSpot or Salesforce. Provider
178
- migration, a full object-authoring engine, and a page builder remain out of
179
- scope. Provider writes stay proposal-first until an adapter can prove the
180
- required revision, access-scope, and approval guarantees.
@@ -1,5 +0,0 @@
1
- # Learnings
2
-
3
- <!-- This file is your app's memory. The AI reads it at the start of every conversation and updates it when it learns something new. -->
4
- <!-- Your personal learnings.md is gitignored so preferences and private info stay local. -->
5
- <!-- This defaults file is what new checkouts start with. -->