@agent-native/core 0.123.0 → 0.123.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 (263) hide show
  1. package/corpus/README.md +1 -1
  2. package/corpus/core/CHANGELOG.md +16 -0
  3. package/corpus/core/package.json +1 -1
  4. package/corpus/core/src/cli/templates-meta.ts +12 -0
  5. package/corpus/templates/crm/.agents/skills/agent-native-docs/SKILL.md +115 -0
  6. package/corpus/templates/crm/.agents/skills/agent-native-toolkit/SKILL.md +177 -0
  7. package/corpus/templates/crm/.agents/skills/crm/SKILL.md +205 -0
  8. package/corpus/templates/crm/.agents/skills/customizing-agent-native/SKILL.md +220 -0
  9. package/corpus/templates/crm/.agents/skills/feature-flags/SKILL.md +169 -0
  10. package/corpus/templates/crm/.agents/skills/sharing/SKILL.md +228 -0
  11. package/corpus/templates/crm/.agents/skills/storing-data/SKILL.md +178 -0
  12. package/corpus/templates/crm/.agents/skills/upgrade-agent-native/SKILL.md +122 -0
  13. package/corpus/templates/crm/.env.example +5 -0
  14. package/corpus/templates/crm/AGENTS.md +82 -0
  15. package/corpus/templates/crm/CHANGELOG.md +25 -0
  16. package/corpus/templates/crm/DEVELOPING.md +66 -0
  17. package/corpus/templates/crm/README.md +122 -0
  18. package/corpus/templates/crm/_gitignore +12 -0
  19. package/corpus/templates/crm/actions/_crm-action-utils.ts +98 -0
  20. package/corpus/templates/crm/actions/_crm-attribute-utils.ts +219 -0
  21. package/corpus/templates/crm/actions/_crm-dashboard.ts +69 -0
  22. package/corpus/templates/crm/actions/_crm-data-program-actions.ts +15 -0
  23. package/corpus/templates/crm/actions/_crm-list-utils.ts +775 -0
  24. package/corpus/templates/crm/actions/_crm-signal-utils.ts +79 -0
  25. package/corpus/templates/crm/actions/add-crm-record-to-list.ts +164 -0
  26. package/corpus/templates/crm/actions/apply-crm-proposals.ts +291 -0
  27. package/corpus/templates/crm/actions/archive-crm-attribute.ts +69 -0
  28. package/corpus/templates/crm/actions/attach-call-evidence.ts +170 -0
  29. package/corpus/templates/crm/actions/configure-crm-connection.ts +126 -0
  30. package/corpus/templates/crm/actions/configure-native-crm.ts +44 -0
  31. package/corpus/templates/crm/actions/create-crm-attribute.ts +350 -0
  32. package/corpus/templates/crm/actions/create-crm-list.ts +194 -0
  33. package/corpus/templates/crm/actions/create-crm-record.ts +148 -0
  34. package/corpus/templates/crm/actions/create-crm-signal-tracker.ts +58 -0
  35. package/corpus/templates/crm/actions/delete-crm-saved-view.ts +68 -0
  36. package/corpus/templates/crm/actions/delete-staged-dataset.ts +14 -0
  37. package/corpus/templates/crm/actions/estimate-crm-enrichment.ts +229 -0
  38. package/corpus/templates/crm/actions/find-crm-duplicates.ts +87 -0
  39. package/corpus/templates/crm/actions/get-crm-automation-recipe.ts +36 -0
  40. package/corpus/templates/crm/actions/get-crm-dashboard-panel.ts +35 -0
  41. package/corpus/templates/crm/actions/get-crm-dashboard.ts +14 -0
  42. package/corpus/templates/crm/actions/get-crm-overview.ts +13 -0
  43. package/corpus/templates/crm/actions/get-crm-pipeline-data.ts +61 -0
  44. package/corpus/templates/crm/actions/get-crm-record-page.ts +287 -0
  45. package/corpus/templates/crm/actions/get-crm-record.ts +75 -0
  46. package/corpus/templates/crm/actions/get-crm-workspace.ts +364 -0
  47. package/corpus/templates/crm/actions/install-crm-pipeline-dashboard.ts +81 -0
  48. package/corpus/templates/crm/actions/list-crm-attributes.ts +71 -0
  49. package/corpus/templates/crm/actions/list-crm-connections.ts +68 -0
  50. package/corpus/templates/crm/actions/list-crm-dashboard-revisions.ts +15 -0
  51. package/corpus/templates/crm/actions/list-crm-dashboards.ts +15 -0
  52. package/corpus/templates/crm/actions/list-crm-enrichment-slots.ts +28 -0
  53. package/corpus/templates/crm/actions/list-crm-list-entries.ts +192 -0
  54. package/corpus/templates/crm/actions/list-crm-lists.ts +80 -0
  55. package/corpus/templates/crm/actions/list-crm-proposals.ts +55 -0
  56. package/corpus/templates/crm/actions/list-crm-record-field-history.ts +201 -0
  57. package/corpus/templates/crm/actions/list-crm-record-values.ts +200 -0
  58. package/corpus/templates/crm/actions/list-crm-records.ts +103 -0
  59. package/corpus/templates/crm/actions/list-crm-saved-views.ts +66 -0
  60. package/corpus/templates/crm/actions/list-crm-signal-hits.ts +43 -0
  61. package/corpus/templates/crm/actions/list-crm-signal-trackers.ts +32 -0
  62. package/corpus/templates/crm/actions/list-crm-tasks.ts +22 -0
  63. package/corpus/templates/crm/actions/list-staged-datasets.ts +14 -0
  64. package/corpus/templates/crm/actions/list-workspace-connections.ts +47 -0
  65. package/corpus/templates/crm/actions/manage-crm-attribute-option.ts +272 -0
  66. package/corpus/templates/crm/actions/manage-crm-signal-tracker.ts +87 -0
  67. package/corpus/templates/crm/actions/manage-crm-task.ts +132 -0
  68. package/corpus/templates/crm/actions/merge-crm-records.ts +691 -0
  69. package/corpus/templates/crm/actions/navigate.ts +54 -0
  70. package/corpus/templates/crm/actions/provider-api-catalog.ts +22 -0
  71. package/corpus/templates/crm/actions/provider-api-docs.ts +54 -0
  72. package/corpus/templates/crm/actions/provider-api-request.ts +92 -0
  73. package/corpus/templates/crm/actions/query-staged-dataset.ts +44 -0
  74. package/corpus/templates/crm/actions/record-crm-call-insight.ts +160 -0
  75. package/corpus/templates/crm/actions/record-crm-smart-signal.ts +150 -0
  76. package/corpus/templates/crm/actions/remove-crm-list-entry.ts +79 -0
  77. package/corpus/templates/crm/actions/restore-crm-dashboard-revision.ts +23 -0
  78. package/corpus/templates/crm/actions/review-crm-signal.ts +31 -0
  79. package/corpus/templates/crm/actions/run-crm-attribute-fill.ts +443 -0
  80. package/corpus/templates/crm/actions/run-crm-enrichment.ts +647 -0
  81. package/corpus/templates/crm/actions/run-crm-saved-view-program.ts +103 -0
  82. package/corpus/templates/crm/actions/run-crm-signal-trackers.ts +265 -0
  83. package/corpus/templates/crm/actions/run.ts +7 -0
  84. package/corpus/templates/crm/actions/save-crm-dashboard.ts +51 -0
  85. package/corpus/templates/crm/actions/save-crm-saved-view.ts +296 -0
  86. package/corpus/templates/crm/actions/sync-crm.ts +146 -0
  87. package/corpus/templates/crm/actions/update-crm-attribute.ts +111 -0
  88. package/corpus/templates/crm/actions/update-crm-list-entry.ts +102 -0
  89. package/corpus/templates/crm/actions/update-crm-list.ts +97 -0
  90. package/corpus/templates/crm/actions/update-crm-record.ts +543 -0
  91. package/corpus/templates/crm/actions/view-screen.ts +324 -0
  92. package/corpus/templates/crm/agent-native.app-skill.json +69 -0
  93. package/corpus/templates/crm/app/components/crm/CreateCrmRecordDialog.tsx +158 -0
  94. package/corpus/templates/crm/app/components/crm/CrmDashboardPanel.tsx +78 -0
  95. package/corpus/templates/crm/app/components/crm/CrmSignalsPanel.tsx +220 -0
  96. package/corpus/templates/crm/app/components/crm/IntelligenceSettings.tsx +414 -0
  97. package/corpus/templates/crm/app/components/crm/RecordActions.tsx +648 -0
  98. package/corpus/templates/crm/app/components/crm/RecordGrid.tsx +488 -0
  99. package/corpus/templates/crm/app/components/crm/RecordWorkspace.tsx +232 -0
  100. package/corpus/templates/crm/app/components/crm/SavedViewDataProgram.tsx +93 -0
  101. package/corpus/templates/crm/app/components/crm/Surface.tsx +97 -0
  102. package/corpus/templates/crm/app/components/crm/WorkOverview.tsx +180 -0
  103. package/corpus/templates/crm/app/components/crm/board/CrmBoard.tsx +988 -0
  104. package/corpus/templates/crm/app/components/crm/board/board-model.ts +399 -0
  105. package/corpus/templates/crm/app/components/crm/board/entry-filter.ts +150 -0
  106. package/corpus/templates/crm/app/components/crm/board/view-draft.ts +227 -0
  107. package/corpus/templates/crm/app/components/crm/grid/CrmGrid.tsx +1033 -0
  108. package/corpus/templates/crm/app/components/crm/grid/GridCell.tsx +620 -0
  109. package/corpus/templates/crm/app/components/crm/grid/clipboard.ts +84 -0
  110. package/corpus/templates/crm/app/components/crm/grid/model.ts +304 -0
  111. package/corpus/templates/crm/app/components/crm/grid/navigation.ts +220 -0
  112. package/corpus/templates/crm/app/components/crm/grid/query.ts +214 -0
  113. package/corpus/templates/crm/app/components/crm/record/AttributePanel.tsx +192 -0
  114. package/corpus/templates/crm/app/components/crm/record/FieldHistory.tsx +179 -0
  115. package/corpus/templates/crm/app/components/crm/record/RecordHeader.tsx +103 -0
  116. package/corpus/templates/crm/app/components/crm/record/RecordLists.tsx +235 -0
  117. package/corpus/templates/crm/app/components/crm/record/RecordTabs.tsx +206 -0
  118. package/corpus/templates/crm/app/components/crm/record/field-editors.tsx +245 -0
  119. package/corpus/templates/crm/app/components/crm/record/record-data.ts +603 -0
  120. package/corpus/templates/crm/app/components/crm/settings/AdvancedSettings.tsx +49 -0
  121. package/corpus/templates/crm/app/components/crm/settings/AttributeOptionsEditor.tsx +441 -0
  122. package/corpus/templates/crm/app/components/crm/settings/ConnectionSettings.tsx +169 -0
  123. package/corpus/templates/crm/app/components/crm/settings/FieldsSettings.tsx +935 -0
  124. package/corpus/templates/crm/app/components/crm/settings/ListsSettings.tsx +339 -0
  125. package/corpus/templates/crm/app/components/crm/settings/settings-admin.ts +377 -0
  126. package/corpus/templates/crm/app/components/crm/shared/AttributeValueParts.tsx +69 -0
  127. package/corpus/templates/crm/app/components/crm/shared/attribute-value.ts +591 -0
  128. package/corpus/templates/crm/app/components/layout/CrmCommandMenu.tsx +556 -0
  129. package/corpus/templates/crm/app/components/layout/CrmLayout.tsx +130 -0
  130. package/corpus/templates/crm/app/components/layout/CrmSidebar.tsx +407 -0
  131. package/corpus/templates/crm/app/components/layout/command-palette-search.ts +126 -0
  132. package/corpus/templates/crm/app/components/layout/crm-ui-intents.ts +41 -0
  133. package/corpus/templates/crm/app/components/layout/sidebar-collapse.ts +40 -0
  134. package/corpus/templates/crm/app/components/layout/sidebar-lists.ts +109 -0
  135. package/corpus/templates/crm/app/components/ui/alert-dialog.tsx +1 -0
  136. package/corpus/templates/crm/app/components/ui/badge.tsx +1 -0
  137. package/corpus/templates/crm/app/components/ui/button.tsx +1 -0
  138. package/corpus/templates/crm/app/components/ui/card.tsx +1 -0
  139. package/corpus/templates/crm/app/components/ui/checkbox.tsx +1 -0
  140. package/corpus/templates/crm/app/components/ui/dialog.tsx +1 -0
  141. package/corpus/templates/crm/app/components/ui/dropdown-menu.tsx +1 -0
  142. package/corpus/templates/crm/app/components/ui/hover-card.tsx +1 -0
  143. package/corpus/templates/crm/app/components/ui/input.tsx +1 -0
  144. package/corpus/templates/crm/app/components/ui/label.tsx +1 -0
  145. package/corpus/templates/crm/app/components/ui/popover.tsx +1 -0
  146. package/corpus/templates/crm/app/components/ui/select.tsx +1 -0
  147. package/corpus/templates/crm/app/components/ui/sheet.tsx +1 -0
  148. package/corpus/templates/crm/app/components/ui/skeleton.tsx +1 -0
  149. package/corpus/templates/crm/app/components/ui/switch.tsx +1 -0
  150. package/corpus/templates/crm/app/components/ui/table.tsx +1 -0
  151. package/corpus/templates/crm/app/components/ui/tabs.tsx +1 -0
  152. package/corpus/templates/crm/app/components/ui/textarea.tsx +1 -0
  153. package/corpus/templates/crm/app/components/ui/toolkit-provider.tsx +17 -0
  154. package/corpus/templates/crm/app/components/ui/tooltip.tsx +1 -0
  155. package/corpus/templates/crm/app/design-system.ts +3 -0
  156. package/corpus/templates/crm/app/entry.client.tsx +19 -0
  157. package/corpus/templates/crm/app/entry.server.tsx +10 -0
  158. package/corpus/templates/crm/app/global.css +167 -0
  159. package/corpus/templates/crm/app/hooks/use-keyboard-shortcuts.ts +206 -0
  160. package/corpus/templates/crm/app/hooks/use-navigation-state.ts +48 -0
  161. package/corpus/templates/crm/app/i18n/en-US.ts +684 -0
  162. package/corpus/templates/crm/app/i18n/index.ts +34 -0
  163. package/corpus/templates/crm/app/lib/dashboard.ts +13 -0
  164. package/corpus/templates/crm/app/lib/navigation.ts +17 -0
  165. package/corpus/templates/crm/app/lib/tab-id.ts +1 -0
  166. package/corpus/templates/crm/app/lib/types.ts +172 -0
  167. package/corpus/templates/crm/app/lib/utils.ts +1 -0
  168. package/corpus/templates/crm/app/root.tsx +93 -0
  169. package/corpus/templates/crm/app/routes/_index.tsx +26 -0
  170. package/corpus/templates/crm/app/routes/accounts.tsx +41 -0
  171. package/corpus/templates/crm/app/routes/agent.tsx +5 -0
  172. package/corpus/templates/crm/app/routes/ask.tsx +53 -0
  173. package/corpus/templates/crm/app/routes/dashboard.tsx +118 -0
  174. package/corpus/templates/crm/app/routes/lists.tsx +228 -0
  175. package/corpus/templates/crm/app/routes/opportunities.tsx +41 -0
  176. package/corpus/templates/crm/app/routes/people.tsx +41 -0
  177. package/corpus/templates/crm/app/routes/proposals.tsx +388 -0
  178. package/corpus/templates/crm/app/routes/records.$recordId.tsx +53 -0
  179. package/corpus/templates/crm/app/routes/records.tsx +64 -0
  180. package/corpus/templates/crm/app/routes/settings.tsx +118 -0
  181. package/corpus/templates/crm/app/routes/setup.tsx +308 -0
  182. package/corpus/templates/crm/app/routes/tasks.tsx +252 -0
  183. package/corpus/templates/crm/app/routes/views.tsx +683 -0
  184. package/corpus/templates/crm/app/routes.ts +19 -0
  185. package/corpus/templates/crm/app/vite-env.d.ts +6 -0
  186. package/corpus/templates/crm/changelog/2026-07-26-any-list-or-view-can-be-shown-as-a-board-grouped-by-stage-so.md +6 -0
  187. package/corpus/templates/crm/changelog/2026-07-26-crm-now-finds-likely-duplicate-records-and-tells-you-exactly.md +6 -0
  188. package/corpus/templates/crm/changelog/2026-07-26-enrichment-now-shows-what-a-run-will-cost-before-it-starts-g.md +6 -0
  189. package/corpus/templates/crm/changelog/2026-07-26-lists-turn-any-set-of-records-into-a-pipeline-with-its-own-s.md +6 -0
  190. package/corpus/templates/crm/changelog/2026-07-26-moving-a-record-or-list-entry-into-a-stage-that-was-retired-.md +6 -0
  191. package/corpus/templates/crm/changelog/2026-07-26-opening-a-record-now-shows-one-page-with-its-fields-the-list.md +6 -0
  192. package/corpus/templates/crm/changelog/2026-07-26-press-cmd-k-to-jump-to-any-record-list-view-or-setting-and-u.md +6 -0
  193. package/corpus/templates/crm/changelog/2026-07-26-provider-record-edits-now-show-an-exact-before-after-diff-an.md +6 -0
  194. package/corpus/templates/crm/changelog/2026-07-26-record-page-attribute-labels-now-read-in-full-instead-of-bei.md +6 -0
  195. package/corpus/templates/crm/changelog/2026-07-26-records-now-use-typed-fields-currency-dates-ratings-status-s.md +6 -0
  196. package/corpus/templates/crm/changelog/2026-07-26-retyping-a-value-on-the-record-page-now-replaces-it-instead-.md +6 -0
  197. package/corpus/templates/crm/changelog/2026-07-26-settings-now-has-fields-and-lists-tabs-for-adding-fields-edi.md +6 -0
  198. package/corpus/templates/crm/changelog/2026-07-26-the-proposal-review-now-shows-the-field-that-actually-change.md +6 -0
  199. package/corpus/templates/crm/changelog/2026-07-26-the-record-grid-is-now-a-real-spreadsheet-filter-sort-and-pa.md +6 -0
  200. package/corpus/templates/crm/components.json +20 -0
  201. package/corpus/templates/crm/docs/architecture/crm-contract.md +214 -0
  202. package/corpus/templates/crm/docs/features/README.md +55 -0
  203. package/corpus/templates/crm/docs/features/f1-records-and-fields.mdx +52 -0
  204. package/corpus/templates/crm/docs/features/f2-lists-pipelines-and-views.mdx +48 -0
  205. package/corpus/templates/crm/docs/features/f3-work-and-record-quality.mdx +40 -0
  206. package/corpus/templates/crm/docs/features/f4-evidence-and-chat.mdx +47 -0
  207. package/corpus/templates/crm/learnings.defaults.md +5 -0
  208. package/corpus/templates/crm/netlify.toml +11 -0
  209. package/corpus/templates/crm/package.json +61 -0
  210. package/corpus/templates/crm/public/favicon.svg +1 -0
  211. package/corpus/templates/crm/public/icon-180.svg +1 -0
  212. package/corpus/templates/crm/public/manifest.json +11 -0
  213. package/corpus/templates/crm/react-router.config.ts +7 -0
  214. package/corpus/templates/crm/server/crm/adapter.ts +32 -0
  215. package/corpus/templates/crm/server/crm/crm-field-firewall.ts +64 -0
  216. package/corpus/templates/crm/server/crm/crm-mirror.ts +721 -0
  217. package/corpus/templates/crm/server/crm/field-policy-attributes.ts +48 -0
  218. package/corpus/templates/crm/server/crm/hubspot-adapter.ts +1146 -0
  219. package/corpus/templates/crm/server/crm/native-adapter.ts +1810 -0
  220. package/corpus/templates/crm/server/crm/provider-record-link.ts +264 -0
  221. package/corpus/templates/crm/server/crm/read-through.ts +207 -0
  222. package/corpus/templates/crm/server/crm/salesforce-adapter.ts +1255 -0
  223. package/corpus/templates/crm/server/db/crm-store.ts +1112 -0
  224. package/corpus/templates/crm/server/db/index.ts +191 -0
  225. package/corpus/templates/crm/server/db/schema.ts +647 -0
  226. package/corpus/templates/crm/server/lib/crm-query.ts +1558 -0
  227. package/corpus/templates/crm/server/lib/dedupe.ts +714 -0
  228. package/corpus/templates/crm/server/lib/enrichment-cost.ts +381 -0
  229. package/corpus/templates/crm/server/lib/enrichment-slots.ts +519 -0
  230. package/corpus/templates/crm/server/lib/intelligence/default-detectors.ts +65 -0
  231. package/corpus/templates/crm/server/lib/intelligence/evidence.ts +105 -0
  232. package/corpus/templates/crm/server/lib/intelligence/keyword-detector.ts +94 -0
  233. package/corpus/templates/crm/server/lib/intelligence/smart-detector.ts +39 -0
  234. package/corpus/templates/crm/server/lib/intelligence/summary.ts +19 -0
  235. package/corpus/templates/crm/server/lib/lifecycle.ts +634 -0
  236. package/corpus/templates/crm/server/lib/provider-api.ts +64 -0
  237. package/corpus/templates/crm/server/middleware/auth.ts +4 -0
  238. package/corpus/templates/crm/server/plugins/agent-chat.ts +65 -0
  239. package/corpus/templates/crm/server/plugins/auth.ts +14 -0
  240. package/corpus/templates/crm/server/plugins/core-routes.ts +17 -0
  241. package/corpus/templates/crm/server/plugins/db.ts +738 -0
  242. package/corpus/templates/crm/server/routes/[...page].get.ts +5 -0
  243. package/corpus/templates/crm/shared/crm-attributes.ts +469 -0
  244. package/corpus/templates/crm/shared/crm-automation-recipes.ts +132 -0
  245. package/corpus/templates/crm/shared/crm-contract.ts +417 -0
  246. package/corpus/templates/crm/shared/crm-navigation.ts +190 -0
  247. package/corpus/templates/crm/shared/crm-sales-config.ts +63 -0
  248. package/corpus/templates/crm/ssr-entry.ts +11 -0
  249. package/corpus/templates/crm/tsconfig.json +24 -0
  250. package/corpus/templates/crm/vite.config.ts +15 -0
  251. package/corpus/templates/crm/vitest.config.ts +5 -0
  252. package/corpus/templates/design/app/i18n-data.ts +12 -12
  253. package/corpus/templates/design/changelog/2026-07-26-apply-design-updates-from-a-centered-top-toolbar-without-cov.md +6 -0
  254. package/dist/cli/templates-meta.d.ts.map +1 -1
  255. package/dist/cli/templates-meta.js +12 -0
  256. package/dist/cli/templates-meta.js.map +1 -1
  257. package/dist/collab/routes.d.ts +1 -1
  258. package/dist/observability/routes.d.ts +3 -3
  259. package/dist/resources/handlers.d.ts +1 -1
  260. package/dist/server/realtime-token.d.ts +1 -1
  261. package/dist/server/transcribe-voice.d.ts +1 -1
  262. package/package.json +1 -1
  263. package/src/cli/templates-meta.ts +12 -0
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Any list or view can be shown as a board grouped by stage, so a pipeline can be dragged through its stages instead of edited row by row.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ CRM now finds likely duplicate records and tells you exactly why each pair matched, then merges them into the record you choose without losing anything from either side.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Enrichment now shows what a run will cost before it starts, gathers free evidence first, and only spends on the records you approved.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Lists turn any set of records into a pipeline with its own stage and fields, and they stay yours even when the records come from HubSpot or Salesforce.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Moving a record or list entry into a stage that was retired or never declared is now refused with the reason and the stages you can pick, and a stage somebody else moved in the meantime is reported instead of being overwritten
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Opening a record now shows one page with its fields, the lists it belongs to, its activity and evidence, and the full change history of any single value.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Press Cmd+K to jump to any record, list, view or setting, and use keyboard shortcuts to move through the grid without reaching for the mouse.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Provider record edits now show an exact before/after diff and open the record in HubSpot or Salesforce to finish the change, instead of reporting a failure
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: improved
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Record page attribute labels now read in full instead of being cut off, and the Highlights panel starts from a curated set per record type.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Records now use typed fields — currency, dates, ratings, status, select, references and more — and every field remembers who changed it, when, and what it was before.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Retyping a value on the record page now replaces it instead of merging with the old text.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ Settings now has Fields and Lists tabs for adding fields, editing their allowed options and stage targets, and archiving what you no longer use.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: fixed
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ The proposal review now shows the field that actually changed instead of reading "Empty" on both sides.
@@ -0,0 +1,6 @@
1
+ ---
2
+ type: added
3
+ date: 2026-07-26
4
+ ---
5
+
6
+ The record grid is now a real spreadsheet: filter, sort and page over the full data set, edit in place, and copy or paste ranges straight to a spreadsheet.
@@ -0,0 +1,20 @@
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
+ }
@@ -0,0 +1,214 @@
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
+ It is the _design_ record: identity, field policy, access scope, the write
8
+ matrix, and the provider-model validation behind them. The operating rules an
9
+ agent follows every turn live in [`AGENTS.md`](../../AGENTS.md), and the
10
+ workflows behind them in the [`crm` skill](../../.agents/skills/crm/SKILL.md).
11
+ Those two are the single source; this document explains _why_ they say what they
12
+ say and must not restate them differently.
13
+
14
+ ## Canonical vocabulary
15
+
16
+ - **Connection**: an authorized workspace integration grant and provider
17
+ account. Tokens remain in workspace connections; CRM stores only the
18
+ connection id and non-secret account metadata. Native SQL uses a CRM-owned
19
+ native connection identity and never has an integration token.
20
+ - **Object definition**: a provider or CRM-owned schema for one object type,
21
+ including field types and effective capabilities for its authority.
22
+ - **Attribute**: one typed field definition on an object type or a list. Its
23
+ type comes from the registry in `shared/crm-attributes.ts`; its `apiSlug` and
24
+ type are immutable once assigned, because every stored value row is keyed and
25
+ typed by them. Authority is `provider`, `derived-local`, or
26
+ `local-authoritative` per attribute — this, not the connection mode, is what
27
+ decides who may write a field.
28
+ - **Attribute option**: a managed allowed value for a `status` or `select`
29
+ attribute, optionally carrying a stage SLA (`targetDays`). Options are never
30
+ auto-created by a value write; an unknown value is a typed 422.
31
+ - **Field value**: bitemporal. A change closes the current row (`activeUntil`)
32
+ and opens a new one (`activeFrom`) with its actor and provenance, so value
33
+ history and stage history are the same thing. An equal write is suppressed
34
+ entirely. `historyTracked = false` opts a churny mirror field out of history
35
+ by updating in place; that is not the same as "never changed".
36
+ - **Record**: one provider or native object instance. Canonical kinds are
37
+ `account`, `person`, `opportunity`, `activity`, `task`, and `custom`.
38
+ - **List**: a workflow overlay over exactly one object type, with its own entry
39
+ attributes. **List entry**: one record's membership in a list, holding that
40
+ list's attribute values. Lists and entries are local-authoritative on every
41
+ backend including HubSpot and Salesforce, so a pipeline never requires a
42
+ provider write. There is deliberately no unique constraint on
43
+ `(list_id, record_id)`: two open deals for one company are two entries.
44
+ - **Saved view**: stored filter, ordered sort, columns, audience, and a `table`
45
+ or `board` presentation (a board groups by a status attribute). A filter
46
+ condition value may be the literal `"@currentUser"`, resolved server-side
47
+ against the calling actor.
48
+ - **Relationship**: a directed edge between records. It preserves a provider
49
+ relationship id or source reference field and optional directional labels.
50
+ - **Interaction**: a bounded relationship event such as a meeting, call,
51
+ email, or note. Rich media remains in its source app/provider.
52
+ - **Evidence**: a URL/id plus bounded quote, timestamp, speaker, and source
53
+ metadata supporting a CRM claim. Evidence is not a transcript or media blob.
54
+ - **Signal**: a first-class, reviewable moment, call summary, or next step with
55
+ a bounded quote/summary, timestamp, confidence, detector/model metadata, and
56
+ an evidence reference. Signals never contain transcript bodies.
57
+ - **Cadence**: desired contact interval, last meaningful interaction, and next
58
+ contact date for an account or person.
59
+ - **Mirror**: a scoped local projection for fast lists, monitoring, joins, and
60
+ agent context. It is not a second ungoverned copy of the upstream CRM.
61
+ - **Local field**: a derived or user-authored field whose authority is CRM.
62
+ - **Mutation**: a typed create/update/delete/association request with an
63
+ idempotency key and optional expected remote revision.
64
+ - **Proposal**: a mutation awaiting review or an agent-generated preview.
65
+
66
+ The TypeScript source of truth is
67
+ [`shared/crm-contract.ts`](../../shared/crm-contract.ts).
68
+
69
+ ## Identity and provenance
70
+
71
+ Connected-provider identity is the tuple:
72
+
73
+ `connection_id + provider + object_type + remote_id`
74
+
75
+ Native SQL record ids are opaque CRM-local identifiers with `provider: native`;
76
+ they are never sent upstream. Email and domain are matching
77
+ signals, not identity keys. Every mirrored field keeps field-level provenance:
78
+ provider, connection, object type, remote id, optional field name, observed
79
+ revision/time, and optional evidence reference.
80
+
81
+ Relationships preserve direction because HubSpot association type ids and
82
+ Salesforce reference fields are directional. Identity resolution may link two
83
+ records, but never merges provider identities or silently overwrites one
84
+ provider with another.
85
+
86
+ ## Thin mirror and authority
87
+
88
+ The mirror contains only configured cohorts: selected pipelines, active
89
+ accounts, their linked people, explicitly linked records, recent interaction
90
+ metadata, and local-owned objects. List and monitoring views read from it;
91
+ record detail performs a read-through refresh; long-tail or exhaustive work
92
+ uses provider API requests and staged data programs.
93
+
94
+ Every mirrored record stores the remote revision, sync cursor/time, tombstone,
95
+ connection identity, and access-scope key. Upstream is authoritative for every
96
+ attribute whose authority is `provider`; CRM is authoritative for
97
+ `derived-local` and `local-authoritative` attributes, and for all lists, list
98
+ entries, and entry values regardless of backend. In Native SQL mode CRM is
99
+ authoritative for the record and all its fields; no remote revision, provider
100
+ token, or sync cursor is invented.
101
+
102
+ Authority is per attribute, which is what the `hybrid` connection mode was for.
103
+ That mode is deprecated: the enum value stays for rows already carrying it
104
+ (schema changes are additive), it is no longer offered or documented, and it
105
+ must be read as `mirrored`.
106
+
107
+ No raw provider response, audio, video, transcript, screenshot, base64 body, or
108
+ file payload is stored in CRM SQL.
109
+
110
+ ## Call intelligence boundary
111
+
112
+ CRM may link one Clips artifact to several CRM records through separate scoped
113
+ evidence rows. Deterministic keyword detectors operate only on the bounded
114
+ stored excerpts. Smart detectors and summaries are delegated to agent chat;
115
+ server actions do not call a model. Delegated results are accepted only when
116
+ the run, record, tracker, and evidence scopes agree and every quote/timestamp
117
+ is grounded to the stored evidence excerpt. Clips retains recording,
118
+ transcript, consent, recovery, and media ownership.
119
+
120
+ The default-off Clips review recipe is scoped to one explicitly selected CRM
121
+ record, and its trigger is installed in Clips because that is where
122
+ `clip.created` is registered. The contract's requirement is only that CRM
123
+ receives an opaque id and a durable page reference — never media, a transcript,
124
+ a temporary grant, an inferred record, or a provider write — so both CRM record
125
+ ACLs and Clips page access hold without duplicating source media. The exact
126
+ activation sequence is in the `crm` skill.
127
+
128
+ ## Field storage policy
129
+
130
+ Unknown fields are **not mirrored**. A field value enters the mirror only when
131
+ it is on the configured allow-list.
132
+
133
+ | Policy | Stored locally | Read behavior | Write authority |
134
+ | --------------------- | ----------------------------------------- | --------------------------------- | ------------------------------ |
135
+ | `mirrored` | Bounded typed value | Mirror, then read-through refresh | Provider |
136
+ | `remote-only` | Metadata, never the value | Fetch ephemerally from provider | Provider |
137
+ | `redacted` | Neither metadata value nor value | Do not fetch or expose | None |
138
+ | `derived-local` | Typed value plus provenance/evidence refs | Local | CRM computation |
139
+ | `local-authoritative` | Typed value | Local | Human or approved CRM workflow |
140
+
141
+ Sensitive fields default to `redacted`; other newly discovered fields default
142
+ to `remote-only`. An admin must explicitly allow-list a field as `mirrored`.
143
+
144
+ ## Access-scope semantics
145
+
146
+ `ownableColumns()` and framework access checks provide the local privacy
147
+ boundary. Provider access remains a second, non-substitutable boundary.
148
+
149
+ Connected records and field projections carry the connection actor, grant id,
150
+ record-visibility mode, object CRUD capabilities, and hashes/fingerprints for
151
+ effective field and sharing access. A service-account mirror must not be shown
152
+ as though it inherited a human user's Salesforce sharing or field-level
153
+ permissions. Reads fail closed when the current access scope cannot be proven
154
+ compatible. Scope changes invalidate or quarantine affected mirror rows until
155
+ they are refreshed. Native SQL uses its CRM ownership/share scope and does not
156
+ claim or emulate an upstream provider permission.
157
+
158
+ ## Write policy matrix
159
+
160
+ | Initiator and operation | Default decision | Required behavior |
161
+ | ------------------------------------------------------------------- | --------------------- | --------------------------------------------------------- |
162
+ | Human, direct scoped edit | Execute | Optimistic UI, conflict check, undo where possible, audit |
163
+ | Agent, local and reversible | Execute | Must pass access and stored policy; audit |
164
+ | Agent, provider and reversible | Propose | Preview first; execute only with delegated authority |
165
+ | Agent, bulk/destructive/ownership/amount/stage/external side effect | Require approval | Preview exact scope and changed fields; fail closed |
166
+ | Automation with stored policy | Execute inside policy | No per-run prompt; stop and propose/deny outside policy |
167
+
168
+ Named high-risk classes remain approval-gated even when routine provider writes
169
+ have delegated authority. A later policy version may add field-specific
170
+ delegation without weakening the destructive/bulk boundary. A human `execute`
171
+ decision assumes the initiating UI has already collected any required
172
+ destructive confirmation; the policy layer does not add a second prompt.
173
+
174
+ All mutations are idempotent, access-checked, audited, and record the actor,
175
+ policy decision, before/after field summary, provider response status, and
176
+ remote revision. Provider conflicts never overwrite silently.
177
+
178
+ `applyMutation` represents one logical record mutation, not one HTTP request.
179
+ Adapters may use provider batch endpoints internally. A future bulk action can
180
+ add an `applyMutations` adapter method without changing the single-mutation
181
+ contract.
182
+
183
+ ## Provider-model validation
184
+
185
+ | Contract concern | Native SQL | HubSpot | Salesforce | Contract consequence |
186
+ | ----------------------------- | ----------------------------------------------- | --------------------------------------------- | ----------------------------------------------------------- | ------------------------------------------------------------- |
187
+ | 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 |
188
+ | Record ids | CRM-local opaque id | String ids | 15/18-character string ids | Record refs preserve provider and opaque identity |
189
+ | Schema discovery | CRM-owned canonical schema | Properties and CRM schemas APIs | sObject/Object Info describe | Adapter returns object and field capabilities |
190
+ | Accounts/people/opportunities | Account/person/opportunity | Companies/contacts/deals | Account/Contact/Opportunity | Canonical kind is separate from provider object type |
191
+ | Relationships | CRM-directed edge | Directional association type ids and labels | Reference fields and child relationships | Directed edge preserves type, label, and source field |
192
+ | Custom objects | Generic display/link/write, no object authoring | Schema-discovered | `__c` and describe-discovered | V1 generic discover/search/display/link/write support |
193
+ | Remote revision | Local mutation version | `updatedAt` | `LastModifiedDate` or `SystemModstamp` | Revision is opaque; Native never claims a remote revision |
194
+ | Deletion | CRM tombstone/archive policy | Archived records | Deleted records/query-all semantics | Tombstone is first-class and sync-capability gated |
195
+ | 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 |
196
+ | Conditional write | Local version check | Provider-specific conflict strategy | `If-Unmodified-Since`/revision-aware update where available | Adapter reports capability and never invents success |
197
+
198
+ Reference checks used for this validation:
199
+
200
+ - [HubSpot CRM objects and associations](https://developers.hubspot.com/docs/api-reference/latest/crm/understanding-the-crm)
201
+ - [HubSpot association definitions and labels](https://developers.hubspot.com/docs/api-reference/latest/crm/associations/associations-schema/guide)
202
+ - [Salesforce object metadata](https://developer.salesforce.com/docs/platform/graphql/guide/query-objectinfo.html)
203
+ - [Salesforce record queries and effective permissions](https://developer.salesforce.com/docs/platform/graphql/guide/query-record-objects.html)
204
+ - [Salesforce revision-aware record updates](https://developer.salesforce.com/docs/platform/lwc/guide/reference-update-record.html)
205
+
206
+ ## Initial-scope boundary
207
+
208
+ This scope is Native SQL plus a HubSpot and Salesforce companion. Native SQL is
209
+ the portable, local-authoritative replacement path; it does not depend on or
210
+ synchronize to HubSpot or Salesforce. Provider migration, a full
211
+ object-authoring engine, and a page builder remain out of scope. Provider writes
212
+ stay proposal-first until an adapter can prove the required revision,
213
+ access-scope, and approval guarantees — a proposal handed off for completion
214
+ upstream is the finished state of that flow, not a degraded one.
@@ -0,0 +1,55 @@
1
+ # CRM — Features
2
+
3
+ This folder explains what CRM is for and what users can do in the product. It
4
+ describes the shipped user experience; the [CRM contract](../architecture/crm-contract.md)
5
+ and the [agent guide](../../AGENTS.md) cover implementation and operating rules.
6
+
7
+ ## Shipped core
8
+
9
+ CRM gives teams one place to work with customer records, pipeline context, and
10
+ follow-up work:
11
+
12
+ - **Records and fields (F1)** — spreadsheet-style records with typed
13
+ attributes, filtering, sorting, pagination, keyboard navigation, and value
14
+ history.
15
+ - **Lists, pipelines, and views (F2)** — local workflow lists with entry
16
+ fields, saved table views, and status-based boards.
17
+ - **Work and record quality (F3)** — follow-up tasks, pipeline dashboards,
18
+ duplicate detection and merge, and approval-gated enrichment.
19
+ - **Evidence and chat (F4)** — bounded call evidence, reviewable signals, and
20
+ agent actions that use the same product rules as the UI.
21
+
22
+ ## Modes
23
+
24
+ CRM can start as a standalone system of record or as a scoped companion to a
25
+ connected CRM:
26
+
27
+ - **Native SQL** — CRM owns accounts, people, opportunities, lists, views,
28
+ tasks, and local fields. No provider account is required.
29
+ - **HubSpot or Salesforce** — the connected provider remains authoritative for
30
+ its own fields. CRM adds scoped record work, local lists and pipelines,
31
+ saved views, tasks, evidence, and analysis.
32
+
33
+ In either mode, lists and their entry values remain local to CRM. Provider edits
34
+ are prepared as reviewable proposals with an exact before/after diff; the final
35
+ change is completed in the provider.
36
+
37
+ ## Features
38
+
39
+ | Feature | Status | What it covers |
40
+ | ---------------------------------------------------------------------- | ------ | --------------------------------------------------------- |
41
+ | [F1 — Records and fields](./f1-records-and-fields.mdx) | done | Records, typed attributes, grid, record page, and history |
42
+ | [F2 — Lists, pipelines, and views](./f2-lists-pipelines-and-views.mdx) | done | Workflow lists, boards, saved views, and stage history |
43
+ | [F3 — Work and record quality](./f3-work-and-record-quality.mdx) | done | Tasks, dashboards, dedupe, merge, and enrichment |
44
+ | [F4 — Evidence and chat](./f4-evidence-and-chat.mdx) | done | Call evidence, signals, agent parity, and useful prompts |
45
+
46
+ ## First steps
47
+
48
+ 1. Open **Set up CRM** and choose **Start with Native SQL**, or authorize and
49
+ grant a HubSpot or Salesforce connection from shared Settings.
50
+ 2. Add records or sync a small, recent provider cohort.
51
+ 3. Create a list for the workflow you want to manage, then add records to it.
52
+ 4. Save a table or board view for the way you want to return to that work.
53
+
54
+ The command menu (**⌘K**) can open records, lists, views, settings, and work
55
+ without requiring a particular navigation path.
@@ -0,0 +1,52 @@
1
+ ---
2
+ id: F1
3
+ title: Records and fields
4
+ status: done
5
+ order: 1
6
+ ---
7
+
8
+ # F1 — Records and fields
9
+
10
+ ## What it is
11
+
12
+ A **record** is a customer, company, opportunity, activity, task, or custom
13
+ object that CRM can find and work with. Records are displayed in a spreadsheet-
14
+ style grid and can be opened in a detail page without losing the surrounding
15
+ list context.
16
+
17
+ ## What users can do
18
+
19
+ <!-- status: done -->
20
+
21
+ - Add native records for accounts, people, opportunities, activities, tasks,
22
+ and custom objects.
23
+ - Search, filter, sort by multiple columns, and move through paginated results.
24
+ - Move through cells with the keyboard and copy or paste tab-separated values.
25
+ - Open a record to see its fields, lists, interactions, evidence, and history.
26
+ - Create and manage typed attributes from **Settings → Fields**.
27
+ - Find likely duplicates, inspect the matching reasons, and merge records with
28
+ an explicit survivor choice.
29
+
30
+ ## Typed fields
31
+
32
+ Fields can be text, numbers, checkboxes, currency, dates, timestamps, ratings,
33
+ statuses, selects, record or actor references, locations, domains, email
34
+ addresses, and phone numbers. Status and select fields use managed options, so
35
+ an accidental value cannot create an untracked stage.
36
+
37
+ ## History and authority
38
+
39
+ Each meaningful field change records who changed it and when. A record's stage
40
+ history is therefore part of its value history. Repeating the same value does
41
+ not create another history entry.
42
+
43
+ In Native SQL mode, CRM owns the record and its local fields. In connected mode,
44
+ the provider owns provider fields while CRM owns local fields and workflow
45
+ data. CRM does not silently overwrite provider data.
46
+
47
+ ## Connected records
48
+
49
+ Connect HubSpot or Salesforce from shared Settings and grant the connection to
50
+ CRM. Start with a small, recent cohort and an explicit object scope. CRM keeps
51
+ the configured mirror bounded; unknown or sensitive provider fields are not
52
+ automatically copied into CRM.
@@ -0,0 +1,48 @@
1
+ ---
2
+ id: F2
3
+ title: Lists, pipelines, and views
4
+ status: done
5
+ order: 2
6
+ ---
7
+
8
+ # F2 — Lists, pipelines, and views
9
+
10
+ ## What it is
11
+
12
+ A **list** is a local workflow overlay for one record type. It can represent a
13
+ sales pipeline, account segment, onboarding queue, or any other process without
14
+ requiring a write to HubSpot or Salesforce. A record's membership is a list
15
+ entry, and each entry can have its own fields.
16
+
17
+ ## What users can do
18
+
19
+ <!-- status: done -->
20
+
21
+ - Create a list for accounts, people, opportunities, or another object type.
22
+ - Add and remove records from a list.
23
+ - Add list-specific fields such as stage, owner, priority, or next step.
24
+ - Move an entry between stages and review the time spent in each stage.
25
+ - Save filters, ordered sorts, columns, and audience settings as a view.
26
+ - Open a saved view as a table or as a board grouped by a status field.
27
+
28
+ ## How it behaves
29
+
30
+ - Lists, entries, and entry values are local-authoritative in Native SQL and
31
+ connected modes.
32
+ - One record may have multiple entries when the workflow needs them, such as
33
+ two opportunities for the same company.
34
+ - A board groups by a managed status attribute; it is another presentation of
35
+ the same saved view, not a separate copy of the pipeline.
36
+ - A view using `@currentUser` resolves that filter for the person viewing it,
37
+ so one shared view can show each teammate their own work.
38
+
39
+ ## A typical pipeline
40
+
41
+ 1. Create an **Opportunities** list.
42
+ 2. Add a status field with stages such as New, Qualified, Proposal, and Won.
43
+ 3. Add records to the list and fill in entry-specific amount, owner, and next
44
+ step fields.
45
+ 4. Save a table view for detailed work and a board view for stage review.
46
+
47
+ The same workflow works over native records or records mirrored from a
48
+ connected provider.
@@ -0,0 +1,40 @@
1
+ ---
2
+ id: F3
3
+ title: Work and record quality
4
+ status: done
5
+ order: 3
6
+ ---
7
+
8
+ # F3 — Work and record quality
9
+
10
+ ## What it is
11
+
12
+ CRM keeps follow-up work beside the record context that explains it. Tasks,
13
+ pipeline dashboards, duplicate review, and enrichment are separate workflows
14
+ so a cleanup or spend decision does not get hidden inside a record edit.
15
+
16
+ ## What users can do
17
+
18
+ <!-- status: done -->
19
+
20
+ - Create and manage local follow-up tasks from a record or the Work view.
21
+ - Review pipeline value and stage distribution in the dashboard.
22
+ - Ask CRM to find likely duplicates and show the email, domain, or name signal
23
+ behind each match.
24
+ - Choose the surviving record before merging. CRM promotes values the survivor
25
+ lacks, moves related workflow data, and keeps the losing record linked as a
26
+ tombstone rather than silently deleting it.
27
+ - Run a free enrichment verification pass, review the evidence and estimated
28
+ line-item cost, then approve the exact records for the paid pass.
29
+
30
+ ## Spend and approval gates
31
+
32
+ The enrichment flow has two phases:
33
+
34
+ 1. **Verify** gathers evidence and estimates what the paid run would cost.
35
+ 2. **Approve** selects the exact records and fields that may be enriched.
36
+ 3. **Run** performs the paid work only for the approved input set.
37
+
38
+ A failed provider slot is reported as a failure, not as an empty result. Bulk,
39
+ destructive, ownership, amount, stage, and external-effect changes require an
40
+ exact preview and approval.
@@ -0,0 +1,47 @@
1
+ ---
2
+ id: F4
3
+ title: Evidence and chat
4
+ status: done
5
+ order: 4
6
+ ---
7
+
8
+ # F4 — Evidence and chat
9
+
10
+ ## What it is
11
+
12
+ CRM can connect a bounded piece of call evidence to a record and turn it into a
13
+ reviewable signal. The agent is the conversational interface to the same CRM
14
+ actions the UI uses, so work stays visible, permission-scoped, and reversible
15
+ where possible.
16
+
17
+ ## Call evidence and signals
18
+
19
+ <!-- status: done -->
20
+
21
+ - Attach a source URL or id, a bounded quote, speaker, timestamp, and summary
22
+ to a CRM record.
23
+ - Run deterministic keyword trackers over the stored excerpt.
24
+ - Delegate smart moments and summaries through agent chat.
25
+ - Review each signal and confirm or dismiss it before it becomes part of the
26
+ record's working context.
27
+
28
+ CRM stores references and bounded excerpts, not recordings, transcripts, or
29
+ other raw media. The source app keeps ownership of the original call artifact.
30
+
31
+ ## Chat parity
32
+
33
+ The agent can use the same actions as the UI: list records, create a list, save
34
+ a view, add a task, inspect a record, prepare a provider proposal, and navigate
35
+ to the relevant screen. It reads the current CRM screen when that context
36
+ matters and keeps the UI synchronized after a change.
37
+
38
+ Useful prompts include:
39
+
40
+ - “Show me open opportunities in the Proposal stage.”
41
+ - “Create a board view for this list grouped by stage.”
42
+ - “Add a follow-up task for this account next Tuesday.”
43
+ - “Find likely duplicates for this company and explain each match.”
44
+ - “Prepare the provider change, but do not apply it.”
45
+
46
+ Provider changes remain proposal-first: CRM shows the exact diff and hands the
47
+ final upstream action back to HubSpot or Salesforce.
@@ -0,0 +1,5 @@
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. -->
@@ -0,0 +1,11 @@
1
+ [build]
2
+ ignore = "node ./scripts/netlify-ignore-build.mjs crm"
3
+ command = "export DATABASE_URL=${NETLIFY_DATABASE_URL:-$DATABASE_URL} && pnpm install && NITRO_PRESET=netlify pnpm --filter crm build"
4
+ publish = "templates/crm/dist"
5
+ functions = "templates/crm/.netlify/functions-internal"
6
+
7
+ [build.environment]
8
+ GA_MEASUREMENT_ID = "G-ESF7FYXGN9"
9
+ GTM_CONTAINER_ID = "GTM-N3WSTXZ"
10
+ NITRO_PRESET = "netlify"
11
+ NPM_CONFIG_PRODUCTION = "false"