@aglyn/plugins-crm 1.0.0-beta.220 → 1.0.0-beta.222

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 (514) hide show
  1. package/README.md +2 -1
  2. package/package.json +13 -13
  3. package/src/lib/components/activity-list.js +12 -5
  4. package/src/lib/components/activity-list.js.map +1 -1
  5. package/src/lib/components/companies-bulk-bar.d.ts +1 -4
  6. package/src/lib/components/companies-bulk-bar.js +7 -20
  7. package/src/lib/components/companies-bulk-bar.js.map +1 -1
  8. package/src/lib/components/companies-section.d.ts +3 -3
  9. package/src/lib/components/companies-section.js +149 -46
  10. package/src/lib/components/companies-section.js.map +1 -1
  11. package/src/lib/components/company-edit-drawer.js +281 -20
  12. package/src/lib/components/company-edit-drawer.js.map +1 -1
  13. package/src/lib/components/company-properties-card.js +99 -8
  14. package/src/lib/components/company-properties-card.js.map +1 -1
  15. package/src/lib/components/contact-detail-page.js +3 -1
  16. package/src/lib/components/contact-detail-page.js.map +1 -1
  17. package/src/lib/components/contact-merge-dialog.js +33 -10
  18. package/src/lib/components/contact-merge-dialog.js.map +1 -1
  19. package/src/lib/components/contact-properties-card.d.ts +0 -69
  20. package/src/lib/components/contact-properties-card.js +350 -60
  21. package/src/lib/components/contact-properties-card.js.map +1 -1
  22. package/src/lib/components/contact-reports-to-field.d.ts +46 -0
  23. package/src/lib/components/contact-reports-to-field.js +67 -0
  24. package/src/lib/components/contact-reports-to-field.js.map +1 -0
  25. package/src/lib/components/contacts-bulk-bar.d.ts +1 -8
  26. package/src/lib/components/contacts-bulk-bar.js +7 -19
  27. package/src/lib/components/contacts-bulk-bar.js.map +1 -1
  28. package/src/lib/components/contacts-section.js +46 -33
  29. package/src/lib/components/contacts-section.js.map +1 -1
  30. package/src/lib/components/crm-call-actions.d.ts +10 -0
  31. package/src/lib/components/crm-call-actions.js +26 -9
  32. package/src/lib/components/crm-call-actions.js.map +1 -1
  33. package/src/lib/components/crm-record-picker.d.ts +15 -0
  34. package/src/lib/components/crm-record-picker.js +16 -10
  35. package/src/lib/components/crm-record-picker.js.map +1 -1
  36. package/src/lib/components/crm-transfer-buttons.d.ts +54 -0
  37. package/src/lib/components/crm-transfer-buttons.js +167 -0
  38. package/src/lib/components/crm-transfer-buttons.js.map +1 -0
  39. package/src/lib/components/deal-contact-roles-card.d.ts +46 -0
  40. package/src/lib/components/deal-contact-roles-card.js +368 -0
  41. package/src/lib/components/deal-contact-roles-card.js.map +1 -0
  42. package/src/lib/components/deal-detail-page.d.ts +3 -2
  43. package/src/lib/components/deal-detail-page.js +25 -6
  44. package/src/lib/components/deal-detail-page.js.map +1 -1
  45. package/src/lib/components/deal-edit-drawer.d.ts +10 -0
  46. package/src/lib/components/deal-edit-drawer.js +219 -10
  47. package/src/lib/components/deal-edit-drawer.js.map +1 -1
  48. package/src/lib/components/deal-properties-card.d.ts +7 -0
  49. package/src/lib/components/deal-properties-card.js +34 -3
  50. package/src/lib/components/deal-properties-card.js.map +1 -1
  51. package/src/lib/components/deal-stage-card.d.ts +4 -0
  52. package/src/lib/components/deal-stage-card.js +10 -2
  53. package/src/lib/components/deal-stage-card.js.map +1 -1
  54. package/src/lib/components/deals-bulk-bar.d.ts +0 -3
  55. package/src/lib/components/deals-bulk-bar.js +7 -20
  56. package/src/lib/components/deals-bulk-bar.js.map +1 -1
  57. package/src/lib/components/deals-section.d.ts +3 -3
  58. package/src/lib/components/deals-section.js +123 -63
  59. package/src/lib/components/deals-section.js.map +1 -1
  60. package/src/lib/components/fields-section.js +31 -17
  61. package/src/lib/components/fields-section.js.map +1 -1
  62. package/src/lib/components/lead-convert-dialog.d.ts +4 -0
  63. package/src/lib/components/lead-convert-dialog.js +23 -1
  64. package/src/lib/components/lead-convert-dialog.js.map +1 -1
  65. package/src/lib/components/lead-detail-page.js +8 -2
  66. package/src/lib/components/lead-detail-page.js.map +1 -1
  67. package/src/lib/components/lead-profile-fields.d.ts +71 -0
  68. package/src/lib/components/lead-profile-fields.js +386 -0
  69. package/src/lib/components/lead-profile-fields.js.map +1 -0
  70. package/src/lib/components/lead-properties-card.d.ts +2 -1
  71. package/src/lib/components/lead-properties-card.js +85 -176
  72. package/src/lib/components/lead-properties-card.js.map +1 -1
  73. package/src/lib/components/lead-source-select.d.ts +4 -23
  74. package/src/lib/components/lead-source-select.js +9 -73
  75. package/src/lib/components/lead-source-select.js.map +1 -1
  76. package/src/lib/components/lead-status-chip.d.ts +9 -3
  77. package/src/lib/components/lead-status-chip.js +8 -4
  78. package/src/lib/components/lead-status-chip.js.map +1 -1
  79. package/src/lib/components/lead-status-options.d.ts +20 -0
  80. package/src/lib/components/lead-status-options.js +51 -0
  81. package/src/lib/components/lead-status-options.js.map +1 -0
  82. package/src/lib/components/lead-unqualify-dialog.d.ts +5 -0
  83. package/src/lib/components/lead-unqualify-dialog.js +50 -18
  84. package/src/lib/components/lead-unqualify-dialog.js.map +1 -1
  85. package/src/lib/components/leads-bulk-bar.d.ts +0 -3
  86. package/src/lib/components/leads-bulk-bar.js +29 -29
  87. package/src/lib/components/leads-bulk-bar.js.map +1 -1
  88. package/src/lib/components/leads-section.js +120 -68
  89. package/src/lib/components/leads-section.js.map +1 -1
  90. package/src/lib/components/linked-deals-card.d.ts +4 -0
  91. package/src/lib/components/linked-deals-card.js +47 -3
  92. package/src/lib/components/linked-deals-card.js.map +1 -1
  93. package/src/lib/components/log-activity-dialog.js +43 -3
  94. package/src/lib/components/log-activity-dialog.js.map +1 -1
  95. package/src/lib/components/new-contact-drawer.d.ts +8 -0
  96. package/src/lib/components/new-contact-drawer.js +108 -6
  97. package/src/lib/components/new-contact-drawer.js.map +1 -1
  98. package/src/lib/components/new-lead-drawer.d.ts +9 -2
  99. package/src/lib/components/new-lead-drawer.js +88 -121
  100. package/src/lib/components/new-lead-drawer.js.map +1 -1
  101. package/src/lib/components/picklist-select.d.ts +36 -0
  102. package/src/lib/components/picklist-select.js +114 -0
  103. package/src/lib/components/picklist-select.js.map +1 -0
  104. package/src/lib/components/picklist-values-card.d.ts +34 -0
  105. package/src/lib/components/{lead-source-values-card.js → picklist-values-card.js} +241 -58
  106. package/src/lib/components/picklist-values-card.js.map +1 -0
  107. package/src/lib/components/pipeline-stages-dialog.d.ts +7 -0
  108. package/src/lib/components/pipeline-stages-dialog.js +26 -4
  109. package/src/lib/components/pipeline-stages-dialog.js.map +1 -1
  110. package/src/lib/components/pipelines-dialog.js +15 -6
  111. package/src/lib/components/pipelines-dialog.js.map +1 -1
  112. package/src/lib/components/recent-activity-feed.js +20 -5
  113. package/src/lib/components/recent-activity-feed.js.map +1 -1
  114. package/src/lib/components/recipes-card.js +4 -2
  115. package/src/lib/components/recipes-card.js.map +1 -1
  116. package/src/lib/components/record-tasks-card.js +15 -8
  117. package/src/lib/components/record-tasks-card.js.map +1 -1
  118. package/src/lib/components/reports/forecast-card.d.ts +6 -0
  119. package/src/lib/components/reports/forecast-card.js +101 -3
  120. package/src/lib/components/reports/forecast-card.js.map +1 -1
  121. package/src/lib/components/reports/lead-funnel-card.d.ts +12 -0
  122. package/src/lib/components/reports/lead-funnel-card.js +9 -5
  123. package/src/lib/components/reports/lead-funnel-card.js.map +1 -1
  124. package/src/lib/components/reports/lead-source-card.d.ts +23 -0
  125. package/src/lib/components/reports/lead-source-card.js +318 -0
  126. package/src/lib/components/reports/lead-source-card.js.map +1 -0
  127. package/src/lib/components/reports/report-export.js +1 -1
  128. package/src/lib/components/reports/report-export.js.map +1 -1
  129. package/src/lib/components/reports-section.js +8 -0
  130. package/src/lib/components/reports-section.js.map +1 -1
  131. package/src/lib/components/sharing-rule-drawer.d.ts +5 -0
  132. package/src/lib/components/sharing-rule-drawer.js +108 -19
  133. package/src/lib/components/sharing-rule-drawer.js.map +1 -1
  134. package/src/lib/components/sharing-rules-card.js +11 -3
  135. package/src/lib/components/sharing-rules-card.js.map +1 -1
  136. package/src/lib/components/task-cells.d.ts +9 -1
  137. package/src/lib/components/task-cells.js +9 -4
  138. package/src/lib/components/task-cells.js.map +1 -1
  139. package/src/lib/components/task-edit-drawer.js +111 -43
  140. package/src/lib/components/task-edit-drawer.js.map +1 -1
  141. package/src/lib/components/tasks-bulk-bar.d.ts +0 -3
  142. package/src/lib/components/tasks-bulk-bar.js +7 -20
  143. package/src/lib/components/tasks-bulk-bar.js.map +1 -1
  144. package/src/lib/components/tasks-calendar.d.ts +3 -0
  145. package/src/lib/components/tasks-calendar.js +8 -1
  146. package/src/lib/components/tasks-calendar.js.map +1 -1
  147. package/src/lib/components/tasks-section.d.ts +3 -3
  148. package/src/lib/components/tasks-section.js +58 -43
  149. package/src/lib/components/tasks-section.js.map +1 -1
  150. package/src/lib/constants/api-routes.d.ts +2 -9
  151. package/src/lib/constants/api-routes.js +1 -7
  152. package/src/lib/constants/api-routes.js.map +1 -1
  153. package/src/lib/constants/bundle-common.d.ts +6 -0
  154. package/src/lib/constants/bundle-common.js +11 -0
  155. package/src/lib/constants/bundle-common.js.map +1 -1
  156. package/src/lib/constants/company-filters.d.ts +14 -0
  157. package/src/lib/constants/company-filters.js +51 -1
  158. package/src/lib/constants/company-filters.js.map +1 -1
  159. package/src/lib/constants/contact-filters.d.ts +2 -0
  160. package/src/lib/constants/contact-filters.js +18 -1
  161. package/src/lib/constants/contact-filters.js.map +1 -1
  162. package/src/lib/constants/deal-filters.d.ts +22 -1
  163. package/src/lib/constants/deal-filters.js +67 -4
  164. package/src/lib/constants/deal-filters.js.map +1 -1
  165. package/src/lib/declarations.console-server.d.ts +3 -0
  166. package/src/lib/declarations.console-server.js +35 -0
  167. package/src/lib/declarations.console-server.js.map +1 -1
  168. package/src/lib/declarations.d.ts +26 -0
  169. package/src/lib/declarations.js +35 -0
  170. package/src/lib/declarations.js.map +1 -0
  171. package/src/lib/declarations.server.d.ts +11 -0
  172. package/src/lib/declarations.server.js +92 -1
  173. package/src/lib/declarations.server.js.map +1 -1
  174. package/src/lib/hooks/use-company-picklists.d.ts +15 -0
  175. package/src/lib/hooks/use-company-picklists.js +55 -0
  176. package/src/lib/hooks/use-company-picklists.js.map +1 -0
  177. package/src/lib/hooks/use-crm-picklist.d.ts +25 -0
  178. package/src/lib/hooks/use-crm-picklist.js +53 -0
  179. package/src/lib/hooks/use-crm-picklist.js.map +1 -0
  180. package/src/lib/hooks/use-crm-record-names.d.ts +16 -0
  181. package/src/lib/hooks/use-crm-record-names.js +45 -19
  182. package/src/lib/hooks/use-crm-record-names.js.map +1 -1
  183. package/src/lib/hooks/use-crm-task-picklists.d.ts +11 -0
  184. package/src/lib/hooks/use-crm-task-picklists.js +45 -0
  185. package/src/lib/hooks/use-crm-task-picklists.js.map +1 -0
  186. package/src/lib/hooks/use-deals.d.ts +14 -0
  187. package/src/lib/hooks/use-deals.js +29 -0
  188. package/src/lib/hooks/use-deals.js.map +1 -1
  189. package/src/lib/hooks/use-lead-picklists.d.ts +14 -0
  190. package/src/lib/hooks/use-lead-picklists.js +46 -0
  191. package/src/lib/hooks/use-lead-picklists.js.map +1 -0
  192. package/src/lib/hooks/use-lead-source-picklist.d.ts +5 -19
  193. package/src/lib/hooks/use-lead-source-picklist.js +12 -22
  194. package/src/lib/hooks/use-lead-source-picklist.js.map +1 -1
  195. package/src/lib/hooks/use-lead-status-picklist.d.ts +9 -0
  196. package/src/lib/hooks/use-lead-status-picklist.js +40 -0
  197. package/src/lib/hooks/use-lead-status-picklist.js.map +1 -0
  198. package/src/lib/model/companies.d.ts +32 -3
  199. package/src/lib/model/companies.js +133 -16
  200. package/src/lib/model/companies.js.map +1 -1
  201. package/src/lib/model/contact-merge.d.ts +27 -3
  202. package/src/lib/model/contact-merge.js +81 -7
  203. package/src/lib/model/contact-merge.js.map +1 -1
  204. package/src/lib/model/contact-record.d.ts +17 -0
  205. package/src/lib/model/contact-record.js +15 -1
  206. package/src/lib/model/contact-record.js.map +1 -1
  207. package/src/lib/model/contact-update.d.ts +31 -2
  208. package/src/lib/model/contact-update.js +14 -0
  209. package/src/lib/model/contact-update.js.map +1 -1
  210. package/src/lib/model/crm-list-query.d.ts +5 -0
  211. package/src/lib/model/crm-list-query.js +8 -0
  212. package/src/lib/model/crm-list-query.js.map +1 -1
  213. package/src/lib/model/crm-recipes.d.ts +40 -0
  214. package/src/lib/model/crm-recipes.js +244 -0
  215. package/src/lib/model/crm-recipes.js.map +1 -0
  216. package/src/lib/model/crm-record-counts.d.ts +36 -0
  217. package/src/lib/model/crm-record-counts.js +54 -0
  218. package/src/lib/model/crm-record-counts.js.map +1 -0
  219. package/src/lib/model/crm-record-lists.d.ts +23 -0
  220. package/src/lib/model/crm-record-lists.js +161 -0
  221. package/src/lib/model/crm-record-lists.js.map +1 -0
  222. package/src/lib/model/crm-reports.d.ts +73 -3
  223. package/src/lib/model/crm-reports.js +120 -1
  224. package/src/lib/model/crm-reports.js.map +1 -1
  225. package/src/lib/model/crm-sharing.d.ts +21 -3
  226. package/src/lib/model/crm-sharing.js +27 -6
  227. package/src/lib/model/crm-sharing.js.map +1 -1
  228. package/src/lib/model/deal-board-model.d.ts +8 -2
  229. package/src/lib/model/deal-board-model.js +15 -2
  230. package/src/lib/model/deal-board-model.js.map +1 -1
  231. package/src/lib/model/deal-contact-roles.d.ts +45 -0
  232. package/src/lib/model/deal-contact-roles.js +73 -0
  233. package/src/lib/model/deal-contact-roles.js.map +1 -0
  234. package/src/lib/model/deal-form-model.d.ts +56 -0
  235. package/src/lib/model/deal-form-model.js +79 -7
  236. package/src/lib/model/deal-form-model.js.map +1 -1
  237. package/src/lib/model/download-text-file.d.ts +23 -0
  238. package/src/lib/model/download-text-file.js +34 -0
  239. package/src/lib/model/download-text-file.js.map +1 -0
  240. package/src/lib/model/lead-filters.d.ts +36 -2
  241. package/src/lib/model/lead-filters.js +123 -2
  242. package/src/lib/model/lead-filters.js.map +1 -1
  243. package/src/lib/model/lead-source-direction.d.ts +38 -0
  244. package/src/lib/model/lead-source-direction.js +52 -0
  245. package/src/lib/model/lead-source-direction.js.map +1 -0
  246. package/src/lib/model/picklist-values.d.ts +119 -0
  247. package/src/lib/model/picklist-values.js +256 -0
  248. package/src/lib/model/picklist-values.js.map +1 -0
  249. package/src/lib/model/record-facts-disclosed.d.ts +81 -0
  250. package/src/lib/model/record-facts-disclosed.js +281 -0
  251. package/src/lib/model/record-facts-disclosed.js.map +1 -0
  252. package/src/lib/model/record-facts.d.ts +215 -34
  253. package/src/lib/model/record-facts.js +307 -128
  254. package/src/lib/model/record-facts.js.map +1 -1
  255. package/src/lib/model/task-picklists.d.ts +52 -0
  256. package/src/lib/model/task-picklists.js +83 -0
  257. package/src/lib/model/task-picklists.js.map +1 -0
  258. package/src/lib/model/task-routes.d.ts +13 -0
  259. package/src/lib/model/task-routes.js +23 -4
  260. package/src/lib/model/task-routes.js.map +1 -1
  261. package/src/lib/plan-entitlements.js +6 -4
  262. package/src/lib/plan-entitlements.js.map +1 -1
  263. package/src/lib/plugin.js +17 -0
  264. package/src/lib/plugin.js.map +1 -1
  265. package/src/lib/server/api-v1/contacts.js +220 -14
  266. package/src/lib/server/api-v1/contacts.js.map +1 -1
  267. package/src/lib/server/api-v1/crm-activities.js +14 -1
  268. package/src/lib/server/api-v1/crm-activities.js.map +1 -1
  269. package/src/lib/server/api-v1/crm-companies.js +123 -14
  270. package/src/lib/server/api-v1/crm-companies.js.map +1 -1
  271. package/src/lib/server/api-v1/crm-deals.js +291 -26
  272. package/src/lib/server/api-v1/crm-deals.js.map +1 -1
  273. package/src/lib/server/api-v1/crm-leads.js +144 -38
  274. package/src/lib/server/api-v1/crm-leads.js.map +1 -1
  275. package/src/lib/server/api-v1/crm-pipelines.d.ts +6 -0
  276. package/src/lib/server/api-v1/crm-pipelines.js +8 -2
  277. package/src/lib/server/api-v1/crm-pipelines.js.map +1 -1
  278. package/src/lib/server/api-v1/crm-tasks.js +75 -33
  279. package/src/lib/server/api-v1/crm-tasks.js.map +1 -1
  280. package/src/lib/server/api-v1/openapi.d.ts +0 -11
  281. package/src/lib/server/api-v1/openapi.js +171 -16
  282. package/src/lib/server/api-v1/openapi.js.map +1 -1
  283. package/src/lib/server/assign-contact-owner.d.ts +162 -0
  284. package/src/lib/server/assign-contact-owner.js +340 -0
  285. package/src/lib/server/assign-contact-owner.js.map +1 -0
  286. package/src/lib/server/associate-company-by-domain.d.ts +70 -0
  287. package/src/lib/server/associate-company-by-domain.js +153 -0
  288. package/src/lib/server/associate-company-by-domain.js.map +1 -0
  289. package/src/lib/server/automation-steps.d.ts +139 -0
  290. package/src/lib/server/automation-steps.js +472 -0
  291. package/src/lib/server/automation-steps.js.map +1 -0
  292. package/src/lib/server/capture-contact.js +69 -22
  293. package/src/lib/server/capture-contact.js.map +1 -1
  294. package/src/lib/server/capture-host-contact.d.ts +104 -0
  295. package/src/lib/server/capture-host-contact.js +151 -0
  296. package/src/lib/server/capture-host-contact.js.map +1 -0
  297. package/src/lib/server/company-children.d.ts +25 -0
  298. package/src/lib/server/company-children.js +42 -0
  299. package/src/lib/server/company-children.js.map +1 -0
  300. package/src/lib/server/company-delete.d.ts +18 -0
  301. package/src/lib/server/company-delete.js +44 -21
  302. package/src/lib/server/company-delete.js.map +1 -1
  303. package/src/lib/server/contact-email-history.js +21 -19
  304. package/src/lib/server/contact-email-history.js.map +1 -1
  305. package/src/lib/server/contact-remove.js +27 -2
  306. package/src/lib/server/contact-remove.js.map +1 -1
  307. package/src/lib/server/contact-reports-to.d.ts +61 -0
  308. package/src/lib/server/contact-reports-to.js +114 -0
  309. package/src/lib/server/contact-reports-to.js.map +1 -0
  310. package/src/lib/server/contact-update.d.ts +42 -1
  311. package/src/lib/server/contact-update.js +204 -23
  312. package/src/lib/server/contact-update.js.map +1 -1
  313. package/src/lib/server/convert-host-lead.d.ts +46 -1
  314. package/src/lib/server/convert-host-lead.js +173 -15
  315. package/src/lib/server/convert-host-lead.js.map +1 -1
  316. package/src/lib/server/convert-open-lead.js +12 -5
  317. package/src/lib/server/convert-open-lead.js.map +1 -1
  318. package/src/lib/server/crm-record-indexes.d.ts +45 -0
  319. package/src/lib/server/crm-record-indexes.js +78 -0
  320. package/src/lib/server/crm-record-indexes.js.map +1 -0
  321. package/src/lib/server/crm-sharing.d.ts +9 -1
  322. package/src/lib/server/crm-sharing.js +23 -3
  323. package/src/lib/server/crm-sharing.js.map +1 -1
  324. package/src/lib/server/deal-contact-roles.d.ts +27 -0
  325. package/src/lib/server/deal-contact-roles.js +89 -0
  326. package/src/lib/server/deal-contact-roles.js.map +1 -0
  327. package/src/lib/server/lead-convert.d.ts +5 -0
  328. package/src/lib/server/lead-convert.js +19 -3
  329. package/src/lib/server/lead-convert.js.map +1 -1
  330. package/src/lib/server/lead-create.d.ts +17 -2
  331. package/src/lib/server/lead-create.js +46 -14
  332. package/src/lib/server/lead-create.js.map +1 -1
  333. package/src/lib/server/lead-nurturing.d.ts +6 -0
  334. package/src/lib/server/lead-nurturing.js +57 -20
  335. package/src/lib/server/lead-nurturing.js.map +1 -1
  336. package/src/lib/server/lead-picklists.d.ts +35 -0
  337. package/src/lib/server/lead-picklists.js +52 -0
  338. package/src/lib/server/lead-picklists.js.map +1 -0
  339. package/src/lib/server/lead-source-picklist.d.ts +1 -13
  340. package/src/lib/server/lead-source-picklist.js +6 -33
  341. package/src/lib/server/lead-source-picklist.js.map +1 -1
  342. package/src/lib/server/merge-contacts.js +22 -4
  343. package/src/lib/server/merge-contacts.js.map +1 -1
  344. package/src/lib/server/person-eraser.d.ts +53 -0
  345. package/src/lib/server/person-eraser.js +149 -0
  346. package/src/lib/server/person-eraser.js.map +1 -0
  347. package/src/lib/server/person-records.d.ts +69 -0
  348. package/src/lib/server/person-records.js +317 -0
  349. package/src/lib/server/person-records.js.map +1 -0
  350. package/src/lib/server/person-refund.d.ts +97 -0
  351. package/src/lib/server/person-refund.js +221 -0
  352. package/src/lib/server/person-refund.js.map +1 -0
  353. package/src/lib/server/picklist-values.d.ts +21 -0
  354. package/src/lib/server/picklist-values.js +308 -0
  355. package/src/lib/server/picklist-values.js.map +1 -0
  356. package/src/lib/server/read-picklist.d.ts +44 -0
  357. package/src/lib/server/read-picklist.js +65 -0
  358. package/src/lib/server/read-picklist.js.map +1 -0
  359. package/src/lib/server/recipe-routes.js +15 -7
  360. package/src/lib/server/recipe-routes.js.map +1 -1
  361. package/src/lib/server/record-email-state.js +7 -1
  362. package/src/lib/server/record-email-state.js.map +1 -1
  363. package/src/lib/server/record-facts.d.ts +3 -0
  364. package/src/lib/server/record-facts.js +233 -31
  365. package/src/lib/server/record-facts.js.map +1 -1
  366. package/src/lib/server/record-origin.d.ts +27 -0
  367. package/src/lib/server/record-origin.js +104 -0
  368. package/src/lib/server/record-origin.js.map +1 -0
  369. package/src/lib/server/record-timeline.js +15 -2
  370. package/src/lib/server/record-timeline.js.map +1 -1
  371. package/src/lib/server/suite-gate.js +4 -3
  372. package/src/lib/server/suite-gate.js.map +1 -1
  373. package/src/lib/server/task-routes.js +30 -16
  374. package/src/lib/server/task-routes.js.map +1 -1
  375. package/src/lib/server-deal-stage.d.ts +5 -1
  376. package/src/lib/server-deal-stage.js +10 -5
  377. package/src/lib/server-deal-stage.js.map +1 -1
  378. package/src/lib/server.d.ts +8 -3
  379. package/src/lib/server.js +47 -43
  380. package/src/lib/server.js.map +1 -1
  381. package/src/lib/testing/memory-firestore.d.ts +55 -0
  382. package/src/lib/testing/memory-firestore.js +335 -0
  383. package/src/lib/testing/memory-firestore.js.map +1 -0
  384. package/src/lib/testing/stand-in-email-send-index.d.ts +25 -0
  385. package/src/lib/testing/stand-in-email-send-index.js +49 -0
  386. package/src/lib/testing/stand-in-email-send-index.js.map +1 -0
  387. package/src/lib/transfer/activities.d.ts +30 -0
  388. package/src/lib/transfer/activities.js +132 -0
  389. package/src/lib/transfer/activities.js.map +1 -0
  390. package/src/lib/transfer/aliases.d.ts +22 -0
  391. package/src/lib/transfer/aliases.js +1342 -0
  392. package/src/lib/transfer/aliases.js.map +1 -0
  393. package/src/lib/transfer/common.d.ts +222 -0
  394. package/src/lib/transfer/common.js +832 -0
  395. package/src/lib/transfer/common.js.map +1 -0
  396. package/src/lib/transfer/companies.d.ts +43 -0
  397. package/src/lib/transfer/companies.js +549 -0
  398. package/src/lib/transfer/companies.js.map +1 -0
  399. package/src/lib/transfer/contacts.d.ts +31 -0
  400. package/src/lib/transfer/contacts.js +727 -0
  401. package/src/lib/transfer/contacts.js.map +1 -0
  402. package/src/lib/transfer/deals.d.ts +66 -0
  403. package/src/lib/transfer/deals.js +698 -0
  404. package/src/lib/transfer/deals.js.map +1 -0
  405. package/src/lib/transfer/email-templates-package.d.ts +40 -0
  406. package/src/lib/transfer/email-templates-package.js +76 -0
  407. package/src/lib/transfer/email-templates-package.js.map +1 -0
  408. package/src/lib/transfer/email-templates-package.server.d.ts +32 -0
  409. package/src/lib/transfer/email-templates-package.server.js +176 -0
  410. package/src/lib/transfer/email-templates-package.server.js.map +1 -0
  411. package/src/lib/transfer/fields.d.ts +102 -0
  412. package/src/lib/transfer/fields.js +1755 -0
  413. package/src/lib/transfer/fields.js.map +1 -0
  414. package/src/lib/transfer/leads.d.ts +30 -0
  415. package/src/lib/transfer/leads.js +582 -0
  416. package/src/lib/transfer/leads.js.map +1 -0
  417. package/src/lib/transfer/pipelines.d.ts +21 -0
  418. package/src/lib/transfer/pipelines.js +172 -0
  419. package/src/lib/transfer/pipelines.js.map +1 -0
  420. package/src/lib/transfer/register.d.ts +47 -0
  421. package/src/lib/transfer/register.js +277 -0
  422. package/src/lib/transfer/register.js.map +1 -0
  423. package/src/lib/transfer/tasks.d.ts +30 -0
  424. package/src/lib/transfer/tasks.js +418 -0
  425. package/src/lib/transfer/tasks.js.map +1 -0
  426. package/src/lib/transfer/ui.d.ts +20 -0
  427. package/src/lib/transfer/ui.js +42 -0
  428. package/src/lib/transfer/ui.js.map +1 -0
  429. package/src/lib/components/company-import-drawer.d.ts +0 -42
  430. package/src/lib/components/company-import-drawer.js +0 -99
  431. package/src/lib/components/company-import-drawer.js.map +0 -1
  432. package/src/lib/components/contact-import-drawer.d.ts +0 -46
  433. package/src/lib/components/contact-import-drawer.js +0 -149
  434. package/src/lib/components/contact-import-drawer.js.map +0 -1
  435. package/src/lib/components/crm-export-all-button.d.ts +0 -39
  436. package/src/lib/components/crm-export-all-button.js +0 -98
  437. package/src/lib/components/crm-export-all-button.js.map +0 -1
  438. package/src/lib/components/csv-import-drawer.d.ts +0 -139
  439. package/src/lib/components/csv-import-drawer.js +0 -757
  440. package/src/lib/components/csv-import-drawer.js.map +0 -1
  441. package/src/lib/components/deal-import-drawer.d.ts +0 -24
  442. package/src/lib/components/deal-import-drawer.js +0 -83
  443. package/src/lib/components/deal-import-drawer.js.map +0 -1
  444. package/src/lib/components/lead-import-drawer.d.ts +0 -27
  445. package/src/lib/components/lead-import-drawer.js +0 -118
  446. package/src/lib/components/lead-import-drawer.js.map +0 -1
  447. package/src/lib/components/lead-source-values-card.d.ts +0 -27
  448. package/src/lib/components/lead-source-values-card.js.map +0 -1
  449. package/src/lib/components/task-import-drawer.d.ts +0 -24
  450. package/src/lib/components/task-import-drawer.js +0 -82
  451. package/src/lib/components/task-import-drawer.js.map +0 -1
  452. package/src/lib/model/companies-csv.d.ts +0 -36
  453. package/src/lib/model/companies-csv.js +0 -38
  454. package/src/lib/model/companies-csv.js.map +0 -1
  455. package/src/lib/model/contacts-csv.d.ts +0 -54
  456. package/src/lib/model/contacts-csv.js +0 -67
  457. package/src/lib/model/contacts-csv.js.map +0 -1
  458. package/src/lib/model/crm-company-import.d.ts +0 -154
  459. package/src/lib/model/crm-company-import.js +0 -331
  460. package/src/lib/model/crm-company-import.js.map +0 -1
  461. package/src/lib/model/crm-csv.d.ts +0 -239
  462. package/src/lib/model/crm-csv.js +0 -467
  463. package/src/lib/model/crm-csv.js.map +0 -1
  464. package/src/lib/model/crm-deal-import.d.ts +0 -112
  465. package/src/lib/model/crm-deal-import.js +0 -263
  466. package/src/lib/model/crm-deal-import.js.map +0 -1
  467. package/src/lib/model/crm-import.d.ts +0 -250
  468. package/src/lib/model/crm-import.js +0 -467
  469. package/src/lib/model/crm-import.js.map +0 -1
  470. package/src/lib/model/crm-lead-import.d.ts +0 -138
  471. package/src/lib/model/crm-lead-import.js +0 -446
  472. package/src/lib/model/crm-lead-import.js.map +0 -1
  473. package/src/lib/model/crm-task-import.d.ts +0 -94
  474. package/src/lib/model/crm-task-import.js +0 -275
  475. package/src/lib/model/crm-task-import.js.map +0 -1
  476. package/src/lib/model/deals-csv.d.ts +0 -32
  477. package/src/lib/model/deals-csv.js +0 -36
  478. package/src/lib/model/deals-csv.js.map +0 -1
  479. package/src/lib/model/import-column-shapes.d.ts +0 -36
  480. package/src/lib/model/import-column-shapes.js +0 -76
  481. package/src/lib/model/import-column-shapes.js.map +0 -1
  482. package/src/lib/model/lead-source-values.d.ts +0 -82
  483. package/src/lib/model/lead-source-values.js +0 -149
  484. package/src/lib/model/lead-source-values.js.map +0 -1
  485. package/src/lib/model/leads-csv.d.ts +0 -40
  486. package/src/lib/model/leads-csv.js +0 -40
  487. package/src/lib/model/leads-csv.js.map +0 -1
  488. package/src/lib/model/tasks-csv.d.ts +0 -28
  489. package/src/lib/model/tasks-csv.js +0 -28
  490. package/src/lib/model/tasks-csv.js.map +0 -1
  491. package/src/lib/server/companies-import.d.ts +0 -57
  492. package/src/lib/server/companies-import.js +0 -242
  493. package/src/lib/server/companies-import.js.map +0 -1
  494. package/src/lib/server/contacts-import.d.ts +0 -109
  495. package/src/lib/server/contacts-import.js +0 -393
  496. package/src/lib/server/contacts-import.js.map +0 -1
  497. package/src/lib/server/deals-import.d.ts +0 -76
  498. package/src/lib/server/deals-import.js +0 -248
  499. package/src/lib/server/deals-import.js.map +0 -1
  500. package/src/lib/server/export-route.d.ts +0 -60
  501. package/src/lib/server/export-route.js +0 -447
  502. package/src/lib/server/export-route.js.map +0 -1
  503. package/src/lib/server/import-context.d.ts +0 -87
  504. package/src/lib/server/import-context.js +0 -182
  505. package/src/lib/server/import-context.js.map +0 -1
  506. package/src/lib/server/lead-source-values.d.ts +0 -50
  507. package/src/lib/server/lead-source-values.js +0 -191
  508. package/src/lib/server/lead-source-values.js.map +0 -1
  509. package/src/lib/server/leads-import.d.ts +0 -84
  510. package/src/lib/server/leads-import.js +0 -367
  511. package/src/lib/server/leads-import.js.map +0 -1
  512. package/src/lib/server/tasks-import.d.ts +0 -54
  513. package/src/lib/server/tasks-import.js +0 -160
  514. package/src/lib/server/tasks-import.js.map +0 -1
@@ -0,0 +1,281 @@
1
+ import { _ as _extends } from "@swc/helpers/_/_extends";
2
+ /**
3
+ * @license
4
+ * Copyright 2026 Aglyn LLC
5
+ *
6
+ * Licensed under the Apache License, Version 2.0 (the "License");
7
+ * you may not use this file except in compliance with the License.
8
+ * You may obtain a copy of the License at
9
+ *
10
+ * http://www.apache.org/licenses/LICENSE-2.0
11
+ *
12
+ * Unless required by applicable law or agreed to in writing, software
13
+ * distributed under the License is distributed on an "AS IS" BASIS,
14
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15
+ * See the License for the specific language governing permissions and
16
+ * limitations under the License.
17
+ */ import { CONTACT_LIFECYCLE_STAGE_LABELS, CONTACT_SOURCE_LABELS, CRM_ACTIVITY_KIND_LABELS, CRM_EMAIL_DELIVERY_STATE_LABELS, CRM_FORECAST_CATEGORY_LABELS, CRM_TASK_KIND_LABELS, contactDisplayName, crmActivityDirection, crmLeadStatusLabel, DEAL_NEXT_STEP_MAX, dealContactRolesOf, dealForecastCategory, dealProbability, dealStageById, dealStageForecastCategory, interactionsForGroup, isContactLifecycleStage, isCrmEmailDeliveryState, readContactFacet } from "@aglyn/aglyn/server";
18
+ import { CRM_FACTS_CONTACT_ROLES_MAX, CRM_FACTS_DEALS_MAX, CRM_FACTS_LABEL_MAX, CRM_FACTS_NOTES_MAX, CRM_FACTS_TAGS_MAX, CRM_FACTS_TASKS_MAX, CRM_FACTS_TEXT_MAX, crmFactDay, crmFactMillis, crmFactMoney, crmFactText, crmTimelineFacts, leadSourceFact } from "./record-facts.js";
19
+ /** An email address written inside free text. */ const EMAIL_IN_PROSE = /[\w.+-]+@[\w-]+(?:\.[\w-]+)+/g;
20
+ /** A run of digits and the separators a phone number is written with. */ const DIGIT_RUN_IN_PROSE = /\+?\(?\d[\d\s().-]{7,}\d/g;
21
+ /** Calendar days, which a run of digits may be and a phone number is not. */ const DAYS_ONLY = /^\d{4}-\d{2}-\d{2}(?:\s+\d{4}-\d{2}-\d{2})*$/;
22
+ export const CRM_FACTS_EMAIL_PLACEHOLDER = '[email address]';
23
+ export const CRM_FACTS_PHONE_PLACEHOLDER = '[phone number]';
24
+ const DAY_MS = 86400000;
25
+ /**
26
+ * Free text the team wrote, as {@link crmFactText} reports it, with every
27
+ * email address, and every run of ten digits or more that is not a list of
28
+ * days, replaced by a placeholder. The fields that hold an address or a number
29
+ * are never reported, and this keeps one typed into a note from leaving
30
+ * either. Replaced before the cut, so a cut never halves an address into
31
+ * something unrecognized.
32
+ */ export function crmFactProse(value, max) {
33
+ if (typeof value !== 'string') return '';
34
+ const scrubbed = value.replace(EMAIL_IN_PROSE, CRM_FACTS_EMAIL_PLACEHOLDER).replace(DIGIT_RUN_IN_PROSE, (run)=>DAYS_ONLY.test(run.trim()) || run.replace(/\D/g, '').length < 10 ? run : CRM_FACTS_PHONE_PLACEHOLDER);
35
+ return crmFactText(scrubbed, max);
36
+ }
37
+ function tagsOf(value) {
38
+ return Array.isArray(value) ? value.map((tag)=>crmFactProse(tag, 40)).filter(Boolean).slice(0, CRM_FACTS_TAGS_MAX) : [];
39
+ }
40
+ /** A logged activity as a timeline entry: never the address it went to or came from. */ export function crmDisclosedActivityFact(activity) {
41
+ var _activity_subject;
42
+ const on = crmFactDay(activity.atMs);
43
+ if (!on) return null;
44
+ const kind = activity.kind && CRM_ACTIVITY_KIND_LABELS[activity.kind] ? activity.kind : 'other';
45
+ const fact = {
46
+ on,
47
+ kind: CRM_ACTIVITY_KIND_LABELS[kind]
48
+ };
49
+ const direction = crmActivityDirection(kind, activity.direction);
50
+ if (direction) fact.direction = direction;
51
+ const subject = crmFactProse((_activity_subject = activity.subject) != null ? _activity_subject : activity.threadSubject, CRM_FACTS_LABEL_MAX);
52
+ if (subject) fact.subject = subject;
53
+ const text = crmFactProse(activity.body, CRM_FACTS_TEXT_MAX);
54
+ if (text) fact.text = text;
55
+ const outcome = crmFactProse(activity.outcome, CRM_FACTS_LABEL_MAX);
56
+ if (outcome) fact.outcome = outcome;
57
+ if (kind === 'email' && isCrmEmailDeliveryState(activity.deliveryState)) {
58
+ fact.delivery = CRM_EMAIL_DELIVERY_STATE_LABELS[activity.deliveryState];
59
+ }
60
+ return fact;
61
+ }
62
+ /** A capture the platform recorded on a contact, as a timeline entry. */ export function crmDisclosedInteractionFact(interaction) {
63
+ const on = crmFactDay(interaction.atMs);
64
+ if (!on) return null;
65
+ const kind = interaction.type && CONTACT_SOURCE_LABELS[interaction.type] ? CONTACT_SOURCE_LABELS[interaction.type] : 'Capture';
66
+ const text = crmFactProse(interaction.summary, CRM_FACTS_TEXT_MAX);
67
+ return text ? {
68
+ on,
69
+ kind,
70
+ text
71
+ } : {
72
+ on,
73
+ kind
74
+ };
75
+ }
76
+ /** The open tasks among `tasks`, soonest due first, undated last: never who holds one, nor its notes. */ export function crmDisclosedOpenTaskFacts(tasks, nowMs) {
77
+ return tasks.filter((task)=>task.status !== 'done' && crmFactText(task.title, CRM_FACTS_LABEL_MAX)).map((task, index)=>({
78
+ task,
79
+ index,
80
+ due: crmFactMillis(task.dueAtMs)
81
+ })).sort((a, b)=>{
82
+ var _a_due, _b_due;
83
+ return ((_a_due = a.due) != null ? _a_due : Number.POSITIVE_INFINITY) - ((_b_due = b.due) != null ? _b_due : Number.POSITIVE_INFINITY) || a.index - b.index;
84
+ }).slice(0, CRM_FACTS_TASKS_MAX).map(({ task, due })=>_extends({
85
+ title: crmFactProse(task.title, CRM_FACTS_LABEL_MAX),
86
+ kind: crmFactProse(task.typeLabel, CRM_FACTS_LABEL_MAX) || (task.kind && CRM_TASK_KIND_LABELS[task.kind] ? CRM_TASK_KIND_LABELS[task.kind] : 'To-do'),
87
+ priority: task.priority === 'high' || task.priority === 'low' ? task.priority : 'normal'
88
+ }, crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX) ? {
89
+ status: crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX)
90
+ } : {}, {
91
+ due: due === null ? null : crmFactDay(due),
92
+ // Overdue by the UTC day: a task due today is not overdue until tomorrow.
93
+ overdue: due !== null && Math.floor(due / DAY_MS) < Math.floor(nowMs / DAY_MS)
94
+ }));
95
+ }
96
+ /** One deal, with its stage named by the pipeline it is in. */ function disclosedDealSummary(deal, pipeline) {
97
+ var _deal_stageId;
98
+ const stage = dealStageById(pipeline != null ? pipeline : undefined, String((_deal_stageId = deal.stageId) != null ? _deal_stageId : ''));
99
+ return {
100
+ title: crmFactProse(deal.title, CRM_FACTS_LABEL_MAX),
101
+ stage: crmFactText(stage == null ? void 0 : stage.name, CRM_FACTS_LABEL_MAX),
102
+ status: deal.status === 'won' || deal.status === 'lost' ? deal.status : 'open',
103
+ amount: crmFactMoney(deal.amountCents, deal.currency),
104
+ expectedClose: crmFactDay(deal.expectedCloseAtMs)
105
+ };
106
+ }
107
+ /** Deals, open ones first, then most recently updated. */ function disclosedDealSummaries(deals, pipelines) {
108
+ return deals.map((deal, index)=>{
109
+ var _crmFactMillis;
110
+ return {
111
+ deal,
112
+ index,
113
+ updated: (_crmFactMillis = crmFactMillis(deal.updatedAt)) != null ? _crmFactMillis : 0
114
+ };
115
+ }).sort((a, b)=>Number(a.deal.status !== 'open') - Number(b.deal.status !== 'open') || b.updated - a.updated || a.index - b.index).slice(0, CRM_FACTS_DEALS_MAX).map(({ deal })=>{
116
+ var _deal_pipelineId;
117
+ return disclosedDealSummary(deal, pipelines.get(String((_deal_pipelineId = deal.pipelineId) != null ? _deal_pipelineId : '')));
118
+ });
119
+ }
120
+ export function disclosedContactFacts(input) {
121
+ var _facet_sources;
122
+ const { row, group } = input;
123
+ const facet = readContactFacet(row, group.groupId);
124
+ const sources = Object.entries((_facet_sources = facet.sources) != null ? _facet_sources : {}).filter(([, on])=>on === true).map(([source])=>{
125
+ var _CONTACT_SOURCE_LABELS_source;
126
+ return (_CONTACT_SOURCE_LABELS_source = CONTACT_SOURCE_LABELS[source]) != null ? _CONTACT_SOURCE_LABELS_source : '';
127
+ }).filter(Boolean);
128
+ const interactions = interactionsForGroup(facet.interactions, group.hostIds);
129
+ return {
130
+ record: 'contact',
131
+ name: crmFactProse(contactDisplayName(row, group.groupId), CRM_FACTS_LABEL_MAX),
132
+ salutation: crmFactProse(facet.salutation, CRM_FACTS_LABEL_MAX),
133
+ jobTitle: crmFactProse(facet.jobTitle, CRM_FACTS_LABEL_MAX),
134
+ department: crmFactProse(facet.department, CRM_FACTS_LABEL_MAX),
135
+ doNotCall: facet.doNotCall === true,
136
+ company: crmFactProse(facet.companyName, CRM_FACTS_LABEL_MAX),
137
+ lifecycleStage: isContactLifecycleStage(facet.lifecycleStage) ? CONTACT_LIFECYCLE_STAGE_LABELS[facet.lifecycleStage] : '',
138
+ tags: tagsOf(facet.tags),
139
+ sources: [
140
+ ...new Set(sources)
141
+ ].sort(),
142
+ orders: typeof facet.ordersCount === 'number' && facet.ordersCount > 0 ? Math.floor(facet.ordersCount) : 0,
143
+ lastPurchase: crmFactDay(facet.lastPurchaseAtMs),
144
+ since: crmFactDay(row['createdAt']),
145
+ lastEmailEngagement: crmFactDay(facet.lastEmailEngagementAtMs),
146
+ notes: crmFactProse(facet.notes, CRM_FACTS_NOTES_MAX),
147
+ timeline: crmTimelineFacts([
148
+ ...input.activities.map((activity)=>({
149
+ atMs: activity.atMs,
150
+ fact: crmDisclosedActivityFact(activity)
151
+ })),
152
+ ...interactions.map((interaction)=>({
153
+ atMs: interaction.atMs,
154
+ fact: crmDisclosedInteractionFact(interaction)
155
+ }))
156
+ ]),
157
+ openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),
158
+ deals: disclosedDealSummaries(input.deals, input.pipelines)
159
+ };
160
+ }
161
+ export function disclosedCompanyFacts(input) {
162
+ const { company } = input;
163
+ return {
164
+ record: 'company',
165
+ name: crmFactProse(company.name, CRM_FACTS_LABEL_MAX),
166
+ domain: crmFactText(company.domain, CRM_FACTS_LABEL_MAX),
167
+ industry: crmFactProse(company.industry, CRM_FACTS_LABEL_MAX),
168
+ type: crmFactProse(company.type, CRM_FACTS_LABEL_MAX),
169
+ rating: crmFactProse(company.rating, CRM_FACTS_LABEL_MAX),
170
+ ownership: crmFactProse(company.ownership, CRM_FACTS_LABEL_MAX),
171
+ accountSource: crmFactProse(company.accountSource, CRM_FACTS_LABEL_MAX),
172
+ employees: typeof company.numberOfEmployees === 'number' && company.numberOfEmployees >= 0 ? Math.floor(company.numberOfEmployees) : null,
173
+ annualRevenue: crmFactMoney(company.annualRevenueCents, company.currency),
174
+ tags: tagsOf(company.tags),
175
+ people: typeof company.contactsCount === 'number' && company.contactsCount > 0 ? Math.floor(company.contactsCount) : 0,
176
+ since: crmFactDay(company.createdAt),
177
+ notes: crmFactProse(company.notes, CRM_FACTS_NOTES_MAX),
178
+ timeline: crmTimelineFacts(input.activities.map((activity)=>({
179
+ atMs: activity.atMs,
180
+ fact: crmDisclosedActivityFact(activity)
181
+ }))),
182
+ openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),
183
+ deals: disclosedDealSummaries(input.deals, input.pipelines)
184
+ };
185
+ }
186
+ /**
187
+ * Every contact on a deal and the part each plays (AGL-3521), the Primary
188
+ * first and at most {@link CRM_FACTS_CONTACT_ROLES_MAX}: each named as the
189
+ * reader resolved them, with an address or a number in a name replaced. A
190
+ * contact the reader could not see is left out rather than named by id.
191
+ */ function disclosedContactRoleFacts(deal, names = new Map()) {
192
+ return dealContactRolesOf(deal).sort((a, b)=>Number(b.primary) - Number(a.primary)).filter((row)=>names.has(row.contactId)).slice(0, CRM_FACTS_CONTACT_ROLES_MAX).map((row)=>({
193
+ name: crmFactProse(names.get(row.contactId), CRM_FACTS_LABEL_MAX),
194
+ role: crmFactText(row.role, CRM_FACTS_LABEL_MAX),
195
+ primary: row.primary
196
+ }));
197
+ }
198
+ export function disclosedDealFacts(input) {
199
+ var _ref, _deal_stageId, _deal_stageId1;
200
+ const { deal, pipeline } = input;
201
+ const summary = disclosedDealSummary(deal, pipeline);
202
+ const stages = [
203
+ ...(_ref = pipeline == null ? void 0 : pipeline.stages) != null ? _ref : []
204
+ ].sort((a, b)=>{
205
+ var _a_order, _b_order;
206
+ return Number((_a_order = a.order) != null ? _a_order : 0) - Number((_b_order = b.order) != null ? _b_order : 0);
207
+ }).map((stage)=>({
208
+ id: String(stage.id),
209
+ name: crmFactText(stage.name, CRM_FACTS_LABEL_MAX),
210
+ kind: stage.kind === 'won' || stage.kind === 'lost' ? stage.kind : 'open',
211
+ probability: Math.min(100, Math.max(0, Number(stage.probability) || 0)),
212
+ forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealStageForecastCategory(stage)]
213
+ }));
214
+ const stage = dealStageById(pipeline != null ? pipeline : undefined, String((_deal_stageId = deal.stageId) != null ? _deal_stageId : ''));
215
+ return {
216
+ record: 'deal',
217
+ title: summary.title,
218
+ pipeline: crmFactText(pipeline == null ? void 0 : pipeline.name, CRM_FACTS_LABEL_MAX),
219
+ stages,
220
+ stageId: String((_deal_stageId1 = deal.stageId) != null ? _deal_stageId1 : ''),
221
+ stage: summary.stage,
222
+ status: summary.status,
223
+ amount: summary.amount,
224
+ expectedClose: summary.expectedClose,
225
+ inStageSince: crmFactDay(deal.stageChangedAtMs),
226
+ lostReason: crmFactProse(deal.lostReason, CRM_FACTS_LABEL_MAX),
227
+ type: crmFactText(deal.type, CRM_FACTS_LABEL_MAX),
228
+ leadSource: crmFactText(deal.leadSource, CRM_FACTS_LABEL_MAX),
229
+ nextStep: crmFactProse(deal.nextStep, DEAL_NEXT_STEP_MAX),
230
+ probability: dealProbability(deal, stage),
231
+ forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealForecastCategory(deal, stage)],
232
+ contact: crmFactProse(deal.contactName, CRM_FACTS_LABEL_MAX),
233
+ contactRoles: disclosedContactRoleFacts(deal, input.contactNames),
234
+ company: crmFactProse(deal.companyName, CRM_FACTS_LABEL_MAX),
235
+ products: Array.isArray(deal.lineItems) ? deal.lineItems.length : 0,
236
+ since: crmFactDay(deal.createdAt),
237
+ notes: crmFactProse(deal.notes, CRM_FACTS_NOTES_MAX),
238
+ timeline: crmTimelineFacts(input.activities.map((activity)=>({
239
+ atMs: activity.atMs,
240
+ fact: crmDisclosedActivityFact(activity)
241
+ }))),
242
+ openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs)
243
+ };
244
+ }
245
+ export function disclosedLeadFacts(input) {
246
+ const { lead, leadStatuses } = input;
247
+ const rawSources = Array.isArray(lead['sources']) ? lead['sources'] : typeof lead['source'] === 'string' ? [
248
+ lead['source']
249
+ ] : [];
250
+ const captures = Number(lead['submissionCount']);
251
+ return {
252
+ record: 'lead',
253
+ name: crmFactProse(lead['name'], CRM_FACTS_LABEL_MAX),
254
+ salutation: crmFactProse(lead['salutation'], CRM_FACTS_LABEL_MAX),
255
+ company: crmFactProse(lead['company'], CRM_FACTS_LABEL_MAX),
256
+ jobTitle: crmFactProse(lead['jobTitle'], CRM_FACTS_LABEL_MAX),
257
+ leadSource: crmFactText(lead['leadSource'], CRM_FACTS_LABEL_MAX),
258
+ industry: crmFactText(lead['industry'], CRM_FACTS_LABEL_MAX),
259
+ rating: crmFactText(lead['rating'], CRM_FACTS_LABEL_MAX),
260
+ employees: typeof lead['numberOfEmployees'] === 'number' && lead['numberOfEmployees'] >= 0 ? Math.floor(lead['numberOfEmployees']) : null,
261
+ annualRevenue: crmFactMoney(lead['annualRevenueCents'], lead['currency']),
262
+ doNotCall: lead['doNotCall'] === true,
263
+ status: crmLeadStatusLabel(lead, leadStatuses),
264
+ sources: [
265
+ ...new Set(rawSources.map((source)=>leadSourceFact(String(source))))
266
+ ].sort(),
267
+ captures: Number.isFinite(captures) && captures > 0 ? Math.floor(captures) : 0,
268
+ firstSeen: crmFactDay(lead['firstSeenAtMs']),
269
+ lastSeen: crmFactDay(lead['lastSeenAtMs']),
270
+ assigned: typeof lead['ownerUid'] === 'string' && lead['ownerUid'] !== '',
271
+ converted: typeof lead['convertedContactId'] === 'string' && lead['convertedContactId'] !== '',
272
+ unqualifiedReason: crmFactProse(lead['unqualifiedReason'], CRM_FACTS_LABEL_MAX),
273
+ notes: crmFactProse(lead['notes'], CRM_FACTS_NOTES_MAX),
274
+ timeline: crmTimelineFacts(input.activities.map((activity)=>({
275
+ atMs: activity.atMs,
276
+ fact: crmDisclosedActivityFact(activity)
277
+ })))
278
+ };
279
+ }
280
+
281
+ //# sourceMappingURL=record-facts-disclosed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/model/record-facts-disclosed.ts"],"sourcesContent":["/**\n * @license\n * Copyright 2026 Aglyn LLC\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\nimport {\n CONTACT_LIFECYCLE_STAGE_LABELS,\n CONTACT_SOURCE_LABELS,\n CRM_ACTIVITY_KIND_LABELS,\n CRM_EMAIL_DELIVERY_STATE_LABELS,\n CRM_FORECAST_CATEGORY_LABELS,\n CRM_TASK_KIND_LABELS,\n contactDisplayName,\n crmActivityDirection,\n crmLeadStatusLabel,\n DEAL_NEXT_STEP_MAX,\n dealContactRolesOf,\n dealForecastCategory,\n dealProbability,\n dealStageById,\n dealStageForecastCategory,\n interactionsForGroup,\n isContactLifecycleStage,\n isCrmEmailDeliveryState,\n readContactFacet,\n type ContactInteraction,\n type CrmActivity,\n type CrmDeal,\n type CrmPipeline,\n type CrmTask,\n} from '@aglyn/aglyn/server'\nimport {\n CRM_FACTS_CONTACT_ROLES_MAX,\n CRM_FACTS_DEALS_MAX,\n CRM_FACTS_LABEL_MAX,\n CRM_FACTS_NOTES_MAX,\n CRM_FACTS_TAGS_MAX,\n CRM_FACTS_TASKS_MAX,\n CRM_FACTS_TEXT_MAX,\n crmFactDay,\n crmFactMillis,\n crmFactMoney,\n crmFactText,\n crmTimelineFacts,\n leadSourceFact,\n type CompanyFactsInput,\n type ContactFactsInput,\n type CrmCompanyFacts,\n type CrmContactFacts,\n type CrmContactRoleFact,\n type CrmDealFact,\n type CrmDealFacts,\n type CrmLeadFacts,\n type CrmTaskFact,\n type CrmTimelineFact,\n type DealFactsInput,\n type LeadFactsInput,\n} from './record-facts'\n\n/**\n * THE DISCLOSED FACTS: what CRM assistance sends while\n * `release_crm_assist_whole_record` is off.\n *\n * The published Privacy Policy (section 2) and the Anthropic row on\n * `/legal/subprocessors` promise that CRM assistance sends a record's name\n * and, by kind, its job title, company, lifecycle stage, tags, capture\n * history and counts, domain, industry, headcount, pipeline stages, status,\n * amount, dates, lost reason, parties and lead status, with its notes,\n * newest timeline entries and open tasks and deals — and never an email,\n * phone or postal field, marketing consent, custom field value, team member\n * or record id. These builders report exactly that, so production keeps the\n * promise until those pages are republished and the flag is turned on;\n * `record-facts.ts` builds the whole record for the flag's on side.\n *\n * ## What never leaves\n *\n * No email address, phone number or postal address of anyone; no birthdate;\n * no assistant and no reports-to; no marketing consent; no custom field\n * VALUE; no team member's name or id; no document id of any record; no\n * file; no order or payment detail beyond a count. A logged email carries its\n * subject and a cut of its body, never the address it went to or came from.\n *\n * Every text a person wrote into a record — a name, a job title, a tag, notes,\n * a logged activity, a capture's summary, a task's or a deal's title, a\n * reason — is reported as written, except that an email address or a phone\n * number inside it is replaced by a placeholder first ({@link crmFactProse}):\n * an import that put an address in the name column leaves no address behind.\n * What the workspace configured — pipeline, stage and field names — and a\n * company's domain are reported as they are. A postal address typed into a\n * note is not recognized and leaves as typed.\n *\n * The bytes are as stable as the whole record's: one key order, UTC days,\n * money as a code and a fixed-point amount.\n */\n\nexport type CrmDisclosedContactFacts = Pick<\n CrmContactFacts,\n | 'record'\n | 'name'\n | 'salutation'\n | 'jobTitle'\n | 'department'\n | 'doNotCall'\n | 'company'\n | 'lifecycleStage'\n | 'tags'\n | 'sources'\n | 'orders'\n | 'lastPurchase'\n | 'since'\n | 'lastEmailEngagement'\n | 'notes'\n | 'timeline'\n | 'openTasks'\n | 'deals'\n>\n\nexport type CrmDisclosedCompanyFacts = Pick<\n CrmCompanyFacts,\n | 'record'\n | 'name'\n | 'domain'\n | 'industry'\n | 'type'\n | 'rating'\n | 'ownership'\n | 'accountSource'\n | 'employees'\n | 'annualRevenue'\n | 'tags'\n | 'people'\n | 'since'\n | 'notes'\n | 'timeline'\n | 'openTasks'\n | 'deals'\n>\n\nexport type CrmDisclosedDealFacts = Pick<\n CrmDealFacts,\n | 'record'\n | 'title'\n | 'pipeline'\n | 'stages'\n | 'stageId'\n | 'stage'\n | 'status'\n | 'amount'\n | 'expectedClose'\n | 'inStageSince'\n | 'lostReason'\n | 'type'\n | 'leadSource'\n | 'nextStep'\n | 'probability'\n | 'forecastCategory'\n | 'contact'\n | 'contactRoles'\n | 'company'\n | 'since'\n | 'notes'\n | 'timeline'\n | 'openTasks'\n> & {\n /** How many products the deal holds — a count, never their names or prices. */\n products: number\n}\n\nexport type CrmDisclosedLeadFacts = Pick<\n CrmLeadFacts,\n | 'record'\n | 'name'\n | 'salutation'\n | 'company'\n | 'jobTitle'\n | 'leadSource'\n | 'industry'\n | 'rating'\n | 'employees'\n | 'annualRevenue'\n | 'doNotCall'\n | 'status'\n | 'sources'\n | 'captures'\n | 'firstSeen'\n | 'lastSeen'\n | 'assigned'\n | 'converted'\n | 'unqualifiedReason'\n | 'notes'\n | 'timeline'\n>\n\n/** An email address written inside free text. */\nconst EMAIL_IN_PROSE = /[\\w.+-]+@[\\w-]+(?:\\.[\\w-]+)+/g\n/** A run of digits and the separators a phone number is written with. */\nconst DIGIT_RUN_IN_PROSE = /\\+?\\(?\\d[\\d\\s().-]{7,}\\d/g\n/** Calendar days, which a run of digits may be and a phone number is not. */\nconst DAYS_ONLY = /^\\d{4}-\\d{2}-\\d{2}(?:\\s+\\d{4}-\\d{2}-\\d{2})*$/\n\nexport const CRM_FACTS_EMAIL_PLACEHOLDER = '[email address]'\nexport const CRM_FACTS_PHONE_PLACEHOLDER = '[phone number]'\n\nconst DAY_MS = 86_400_000\n\n/**\n * Free text the team wrote, as {@link crmFactText} reports it, with every\n * email address, and every run of ten digits or more that is not a list of\n * days, replaced by a placeholder. The fields that hold an address or a number\n * are never reported, and this keeps one typed into a note from leaving\n * either. Replaced before the cut, so a cut never halves an address into\n * something unrecognized.\n */\nexport function crmFactProse(value: unknown, max: number): string {\n if (typeof value !== 'string') return ''\n const scrubbed = value\n .replace(EMAIL_IN_PROSE, CRM_FACTS_EMAIL_PLACEHOLDER)\n .replace(DIGIT_RUN_IN_PROSE, (run) =>\n DAYS_ONLY.test(run.trim()) || run.replace(/\\D/g, '').length < 10 ? run : CRM_FACTS_PHONE_PLACEHOLDER,\n )\n return crmFactText(scrubbed, max)\n}\n\nfunction tagsOf(value: unknown): string[] {\n return Array.isArray(value)\n ? value\n .map((tag) => crmFactProse(tag, 40))\n .filter(Boolean)\n .slice(0, CRM_FACTS_TAGS_MAX)\n : []\n}\n\n/** A logged activity as a timeline entry: never the address it went to or came from. */\nexport function crmDisclosedActivityFact(activity: Partial<CrmActivity>): CrmTimelineFact | null {\n const on = crmFactDay(activity.atMs)\n if (!on) return null\n const kind = activity.kind && CRM_ACTIVITY_KIND_LABELS[activity.kind] ? activity.kind : 'other'\n const fact: CrmTimelineFact = { on, kind: CRM_ACTIVITY_KIND_LABELS[kind] }\n const direction = crmActivityDirection(kind, activity.direction)\n if (direction) fact.direction = direction\n const subject = crmFactProse(activity.subject ?? activity.threadSubject, CRM_FACTS_LABEL_MAX)\n if (subject) fact.subject = subject\n const text = crmFactProse(activity.body, CRM_FACTS_TEXT_MAX)\n if (text) fact.text = text\n const outcome = crmFactProse(activity.outcome, CRM_FACTS_LABEL_MAX)\n if (outcome) fact.outcome = outcome\n if (kind === 'email' && isCrmEmailDeliveryState(activity.deliveryState)) {\n fact.delivery = CRM_EMAIL_DELIVERY_STATE_LABELS[activity.deliveryState]\n }\n return fact\n}\n\n/** A capture the platform recorded on a contact, as a timeline entry. */\nexport function crmDisclosedInteractionFact(interaction: Partial<ContactInteraction>): CrmTimelineFact | null {\n const on = crmFactDay(interaction.atMs)\n if (!on) return null\n const kind =\n interaction.type && CONTACT_SOURCE_LABELS[interaction.type] ? CONTACT_SOURCE_LABELS[interaction.type] : 'Capture'\n const text = crmFactProse(interaction.summary, CRM_FACTS_TEXT_MAX)\n return text ? { on, kind, text } : { on, kind }\n}\n\n/** The open tasks among `tasks`, soonest due first, undated last: never who holds one, nor its notes. */\nexport function crmDisclosedOpenTaskFacts(tasks: ReadonlyArray<Partial<CrmTask>>, nowMs: number): CrmTaskFact[] {\n return tasks\n .filter((task) => task.status !== 'done' && crmFactText(task.title, CRM_FACTS_LABEL_MAX))\n .map((task, index) => ({ task, index, due: crmFactMillis(task.dueAtMs) }))\n .sort((a, b) => (a.due ?? Number.POSITIVE_INFINITY) - (b.due ?? Number.POSITIVE_INFINITY) || a.index - b.index)\n .slice(0, CRM_FACTS_TASKS_MAX)\n .map(({ task, due }) => ({\n title: crmFactProse(task.title, CRM_FACTS_LABEL_MAX),\n kind:\n crmFactProse(task.typeLabel, CRM_FACTS_LABEL_MAX) ||\n (task.kind && CRM_TASK_KIND_LABELS[task.kind] ? CRM_TASK_KIND_LABELS[task.kind] : 'To-do'),\n priority: task.priority === 'high' || task.priority === 'low' ? task.priority : 'normal',\n ...(crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX)\n ? { status: crmFactProse(task.statusLabel, CRM_FACTS_LABEL_MAX) }\n : {}),\n due: due === null ? null : crmFactDay(due),\n // Overdue by the UTC day: a task due today is not overdue until tomorrow.\n overdue: due !== null && Math.floor(due / DAY_MS) < Math.floor(nowMs / DAY_MS),\n }))\n}\n\n/** One deal, with its stage named by the pipeline it is in. */\nfunction disclosedDealSummary(deal: Partial<CrmDeal>, pipeline: CrmPipeline | null | undefined): CrmDealFact {\n const stage = dealStageById(pipeline ?? undefined, String(deal.stageId ?? ''))\n return {\n title: crmFactProse(deal.title, CRM_FACTS_LABEL_MAX),\n stage: crmFactText(stage?.name, CRM_FACTS_LABEL_MAX),\n status: deal.status === 'won' || deal.status === 'lost' ? deal.status : 'open',\n amount: crmFactMoney(deal.amountCents, deal.currency),\n expectedClose: crmFactDay(deal.expectedCloseAtMs),\n }\n}\n\n/** Deals, open ones first, then most recently updated. */\nfunction disclosedDealSummaries(\n deals: ReadonlyArray<Partial<CrmDeal>>,\n pipelines: ReadonlyMap<string, CrmPipeline>,\n): CrmDealFact[] {\n return deals\n .map((deal, index) => ({ deal, index, updated: crmFactMillis(deal.updatedAt) ?? 0 }))\n .sort(\n (a, b) =>\n Number(a.deal.status !== 'open') - Number(b.deal.status !== 'open') ||\n b.updated - a.updated ||\n a.index - b.index,\n )\n .slice(0, CRM_FACTS_DEALS_MAX)\n .map(({ deal }) => disclosedDealSummary(deal, pipelines.get(String(deal.pipelineId ?? ''))))\n}\n\nexport function disclosedContactFacts(input: ContactFactsInput): CrmDisclosedContactFacts {\n const { row, group } = input\n const facet = readContactFacet(row, group.groupId)\n const sources = Object.entries(facet.sources ?? {})\n .filter(([, on]) => on === true)\n .map(([source]) => CONTACT_SOURCE_LABELS[source as keyof typeof CONTACT_SOURCE_LABELS] ?? '')\n .filter(Boolean)\n const interactions = interactionsForGroup(facet.interactions, group.hostIds)\n return {\n record: 'contact',\n name: crmFactProse(contactDisplayName(row, group.groupId), CRM_FACTS_LABEL_MAX),\n salutation: crmFactProse(facet.salutation, CRM_FACTS_LABEL_MAX),\n jobTitle: crmFactProse(facet.jobTitle, CRM_FACTS_LABEL_MAX),\n department: crmFactProse(facet.department, CRM_FACTS_LABEL_MAX),\n doNotCall: facet.doNotCall === true,\n company: crmFactProse(facet.companyName, CRM_FACTS_LABEL_MAX),\n lifecycleStage: isContactLifecycleStage(facet.lifecycleStage)\n ? CONTACT_LIFECYCLE_STAGE_LABELS[facet.lifecycleStage]\n : '',\n tags: tagsOf(facet.tags),\n sources: [...new Set(sources)].sort(),\n orders: typeof facet.ordersCount === 'number' && facet.ordersCount > 0 ? Math.floor(facet.ordersCount) : 0,\n lastPurchase: crmFactDay(facet.lastPurchaseAtMs),\n since: crmFactDay(row['createdAt']),\n lastEmailEngagement: crmFactDay(facet.lastEmailEngagementAtMs),\n notes: crmFactProse(facet.notes, CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts([\n ...input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ...interactions.map((interaction) => ({ atMs: interaction.atMs, fact: crmDisclosedInteractionFact(interaction) })),\n ]),\n openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),\n deals: disclosedDealSummaries(input.deals, input.pipelines),\n }\n}\n\nexport function disclosedCompanyFacts(input: CompanyFactsInput): CrmDisclosedCompanyFacts {\n const { company } = input\n return {\n record: 'company',\n name: crmFactProse(company.name, CRM_FACTS_LABEL_MAX),\n domain: crmFactText(company.domain, CRM_FACTS_LABEL_MAX),\n industry: crmFactProse(company.industry, CRM_FACTS_LABEL_MAX),\n type: crmFactProse(company.type, CRM_FACTS_LABEL_MAX),\n rating: crmFactProse(company.rating, CRM_FACTS_LABEL_MAX),\n ownership: crmFactProse(company.ownership, CRM_FACTS_LABEL_MAX),\n accountSource: crmFactProse(company.accountSource, CRM_FACTS_LABEL_MAX),\n employees:\n typeof company.numberOfEmployees === 'number' && company.numberOfEmployees >= 0\n ? Math.floor(company.numberOfEmployees)\n : null,\n annualRevenue: crmFactMoney(company.annualRevenueCents, company.currency),\n tags: tagsOf(company.tags),\n people:\n typeof company.contactsCount === 'number' && company.contactsCount > 0\n ? Math.floor(company.contactsCount)\n : 0,\n since: crmFactDay(company.createdAt),\n notes: crmFactProse(company.notes, CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts(\n input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ),\n openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),\n deals: disclosedDealSummaries(input.deals, input.pipelines),\n }\n}\n\n/**\n * Every contact on a deal and the part each plays (AGL-3521), the Primary\n * first and at most {@link CRM_FACTS_CONTACT_ROLES_MAX}: each named as the\n * reader resolved them, with an address or a number in a name replaced. A\n * contact the reader could not see is left out rather than named by id.\n */\nfunction disclosedContactRoleFacts(\n deal: { contactId?: unknown; contactRoles?: unknown },\n names: ReadonlyMap<string, string> = new Map(),\n): CrmContactRoleFact[] {\n return dealContactRolesOf(deal)\n .sort((a, b) => Number(b.primary) - Number(a.primary))\n .filter((row) => names.has(row.contactId))\n .slice(0, CRM_FACTS_CONTACT_ROLES_MAX)\n .map((row) => ({\n name: crmFactProse(names.get(row.contactId), CRM_FACTS_LABEL_MAX),\n role: crmFactText(row.role, CRM_FACTS_LABEL_MAX),\n primary: row.primary,\n }))\n}\n\nexport function disclosedDealFacts(input: DealFactsInput): CrmDisclosedDealFacts {\n const { deal, pipeline } = input\n const summary = disclosedDealSummary(deal, pipeline)\n const stages = [...(pipeline?.stages ?? [])]\n .sort((a, b) => Number(a.order ?? 0) - Number(b.order ?? 0))\n .map((stage) => ({\n id: String(stage.id),\n name: crmFactText(stage.name, CRM_FACTS_LABEL_MAX),\n kind: stage.kind === 'won' || stage.kind === 'lost' ? stage.kind : ('open' as const),\n probability: Math.min(100, Math.max(0, Number(stage.probability) || 0)),\n forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealStageForecastCategory(stage)],\n }))\n const stage = dealStageById(pipeline ?? undefined, String(deal.stageId ?? ''))\n return {\n record: 'deal',\n title: summary.title,\n pipeline: crmFactText(pipeline?.name, CRM_FACTS_LABEL_MAX),\n stages,\n stageId: String(deal.stageId ?? ''),\n stage: summary.stage,\n status: summary.status,\n amount: summary.amount,\n expectedClose: summary.expectedClose,\n inStageSince: crmFactDay(deal.stageChangedAtMs),\n lostReason: crmFactProse(deal.lostReason, CRM_FACTS_LABEL_MAX),\n type: crmFactText(deal.type, CRM_FACTS_LABEL_MAX),\n leadSource: crmFactText(deal.leadSource, CRM_FACTS_LABEL_MAX),\n nextStep: crmFactProse(deal.nextStep, DEAL_NEXT_STEP_MAX),\n probability: dealProbability(deal, stage),\n forecastCategory: CRM_FORECAST_CATEGORY_LABELS[dealForecastCategory(deal, stage)],\n contact: crmFactProse(deal.contactName, CRM_FACTS_LABEL_MAX),\n contactRoles: disclosedContactRoleFacts(deal, input.contactNames),\n company: crmFactProse(deal.companyName, CRM_FACTS_LABEL_MAX),\n products: Array.isArray(deal.lineItems) ? deal.lineItems.length : 0,\n since: crmFactDay(deal.createdAt),\n notes: crmFactProse(deal.notes, CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts(\n input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ),\n openTasks: crmDisclosedOpenTaskFacts(input.tasks, input.nowMs),\n }\n}\n\nexport function disclosedLeadFacts(input: LeadFactsInput): CrmDisclosedLeadFacts {\n const { lead, leadStatuses } = input\n const rawSources = Array.isArray(lead['sources'])\n ? lead['sources']\n : typeof lead['source'] === 'string'\n ? [lead['source']]\n : []\n const captures = Number(lead['submissionCount'])\n return {\n record: 'lead',\n name: crmFactProse(lead['name'], CRM_FACTS_LABEL_MAX),\n salutation: crmFactProse(lead['salutation'], CRM_FACTS_LABEL_MAX),\n company: crmFactProse(lead['company'], CRM_FACTS_LABEL_MAX),\n jobTitle: crmFactProse(lead['jobTitle'], CRM_FACTS_LABEL_MAX),\n leadSource: crmFactText(lead['leadSource'], CRM_FACTS_LABEL_MAX),\n industry: crmFactText(lead['industry'], CRM_FACTS_LABEL_MAX),\n rating: crmFactText(lead['rating'], CRM_FACTS_LABEL_MAX),\n employees:\n typeof lead['numberOfEmployees'] === 'number' && lead['numberOfEmployees'] >= 0\n ? Math.floor(lead['numberOfEmployees'])\n : null,\n annualRevenue: crmFactMoney(lead['annualRevenueCents'], lead['currency']),\n doNotCall: lead['doNotCall'] === true,\n status: crmLeadStatusLabel(lead as { status?: never; statusLabel?: string }, leadStatuses),\n sources: [...new Set(rawSources.map((source) => leadSourceFact(String(source))))].sort(),\n captures: Number.isFinite(captures) && captures > 0 ? Math.floor(captures) : 0,\n firstSeen: crmFactDay(lead['firstSeenAtMs']),\n lastSeen: crmFactDay(lead['lastSeenAtMs']),\n assigned: typeof lead['ownerUid'] === 'string' && lead['ownerUid'] !== '',\n converted: typeof lead['convertedContactId'] === 'string' && lead['convertedContactId'] !== '',\n unqualifiedReason: crmFactProse(lead['unqualifiedReason'], CRM_FACTS_LABEL_MAX),\n notes: crmFactProse(lead['notes'], CRM_FACTS_NOTES_MAX),\n timeline: crmTimelineFacts(\n input.activities.map((activity) => ({ atMs: activity.atMs, fact: crmDisclosedActivityFact(activity) })),\n ),\n }\n}\n"],"names":["CONTACT_LIFECYCLE_STAGE_LABELS","CONTACT_SOURCE_LABELS","CRM_ACTIVITY_KIND_LABELS","CRM_EMAIL_DELIVERY_STATE_LABELS","CRM_FORECAST_CATEGORY_LABELS","CRM_TASK_KIND_LABELS","contactDisplayName","crmActivityDirection","crmLeadStatusLabel","DEAL_NEXT_STEP_MAX","dealContactRolesOf","dealForecastCategory","dealProbability","dealStageById","dealStageForecastCategory","interactionsForGroup","isContactLifecycleStage","isCrmEmailDeliveryState","readContactFacet","CRM_FACTS_CONTACT_ROLES_MAX","CRM_FACTS_DEALS_MAX","CRM_FACTS_LABEL_MAX","CRM_FACTS_NOTES_MAX","CRM_FACTS_TAGS_MAX","CRM_FACTS_TASKS_MAX","CRM_FACTS_TEXT_MAX","crmFactDay","crmFactMillis","crmFactMoney","crmFactText","crmTimelineFacts","leadSourceFact","EMAIL_IN_PROSE","DIGIT_RUN_IN_PROSE","DAYS_ONLY","CRM_FACTS_EMAIL_PLACEHOLDER","CRM_FACTS_PHONE_PLACEHOLDER","DAY_MS","crmFactProse","value","max","scrubbed","replace","run","test","trim","length","tagsOf","Array","isArray","map","tag","filter","Boolean","slice","crmDisclosedActivityFact","activity","on","atMs","kind","fact","direction","subject","threadSubject","text","body","outcome","deliveryState","delivery","crmDisclosedInteractionFact","interaction","type","summary","crmDisclosedOpenTaskFacts","tasks","nowMs","task","status","title","index","due","dueAtMs","sort","a","b","Number","POSITIVE_INFINITY","typeLabel","priority","statusLabel","overdue","Math","floor","disclosedDealSummary","deal","pipeline","stage","undefined","String","stageId","name","amount","amountCents","currency","expectedClose","expectedCloseAtMs","disclosedDealSummaries","deals","pipelines","updated","updatedAt","get","pipelineId","disclosedContactFacts","input","facet","row","group","groupId","sources","Object","entries","source","interactions","hostIds","record","salutation","jobTitle","department","doNotCall","company","companyName","lifecycleStage","tags","Set","orders","ordersCount","lastPurchase","lastPurchaseAtMs","since","lastEmailEngagement","lastEmailEngagementAtMs","notes","timeline","activities","openTasks","disclosedCompanyFacts","domain","industry","rating","ownership","accountSource","employees","numberOfEmployees","annualRevenue","annualRevenueCents","people","contactsCount","createdAt","disclosedContactRoleFacts","names","Map","primary","has","contactId","role","disclosedDealFacts","stages","order","id","probability","min","forecastCategory","inStageSince","stageChangedAtMs","lostReason","leadSource","nextStep","contact","contactName","contactRoles","contactNames","products","lineItems","disclosedLeadFacts","lead","leadStatuses","rawSources","captures","isFinite","firstSeen","lastSeen","assigned","converted","unqualifiedReason"],"mappings":"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"}