@aglyn/plugins-crm 1.0.0-beta.143

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 (669) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +7 -0
  3. package/package.json +57 -0
  4. package/src/index.d.ts +21 -0
  5. package/src/index.js +29 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/components/activity-list.d.ts +98 -0
  8. package/src/lib/components/activity-list.js +321 -0
  9. package/src/lib/components/activity-list.js.map +1 -0
  10. package/src/lib/components/activity-queries.d.ts +117 -0
  11. package/src/lib/components/activity-queries.js +198 -0
  12. package/src/lib/components/activity-queries.js.map +1 -0
  13. package/src/lib/components/add-to-list-button.d.ts +25 -0
  14. package/src/lib/components/add-to-list-button.js +64 -0
  15. package/src/lib/components/add-to-list-button.js.map +1 -0
  16. package/src/lib/components/add-to-list-dialog.d.ts +24 -0
  17. package/src/lib/components/add-to-list-dialog.js +327 -0
  18. package/src/lib/components/add-to-list-dialog.js.map +1 -0
  19. package/src/lib/components/assignment-rule-drawer.d.ts +43 -0
  20. package/src/lib/components/assignment-rule-drawer.js +293 -0
  21. package/src/lib/components/assignment-rule-drawer.js.map +1 -0
  22. package/src/lib/components/companies-bulk-bar.d.ts +29 -0
  23. package/src/lib/components/companies-bulk-bar.js +274 -0
  24. package/src/lib/components/companies-bulk-bar.js.map +1 -0
  25. package/src/lib/components/companies-section.d.ts +54 -0
  26. package/src/lib/components/companies-section.js +522 -0
  27. package/src/lib/components/companies-section.js.map +1 -0
  28. package/src/lib/components/company-contacts-card.d.ts +49 -0
  29. package/src/lib/components/company-contacts-card.js +435 -0
  30. package/src/lib/components/company-contacts-card.js.map +1 -0
  31. package/src/lib/components/company-deals-card.d.ts +20 -0
  32. package/src/lib/components/company-deals-card.js +38 -0
  33. package/src/lib/components/company-deals-card.js.map +1 -0
  34. package/src/lib/components/company-detail-page.d.ts +20 -0
  35. package/src/lib/components/company-detail-page.js +165 -0
  36. package/src/lib/components/company-detail-page.js.map +1 -0
  37. package/src/lib/components/company-edit-drawer.d.ts +65 -0
  38. package/src/lib/components/company-edit-drawer.js +433 -0
  39. package/src/lib/components/company-edit-drawer.js.map +1 -0
  40. package/src/lib/components/company-import-drawer.d.ts +42 -0
  41. package/src/lib/components/company-import-drawer.js +99 -0
  42. package/src/lib/components/company-import-drawer.js.map +1 -0
  43. package/src/lib/components/company-picker.d.ts +127 -0
  44. package/src/lib/components/company-picker.js +323 -0
  45. package/src/lib/components/company-picker.js.map +1 -0
  46. package/src/lib/components/company-properties-card.d.ts +47 -0
  47. package/src/lib/components/company-properties-card.js +289 -0
  48. package/src/lib/components/company-properties-card.js.map +1 -0
  49. package/src/lib/components/contact-address-fields.d.ts +29 -0
  50. package/src/lib/components/contact-address-fields.js +149 -0
  51. package/src/lib/components/contact-address-fields.js.map +1 -0
  52. package/src/lib/components/contact-associations-card.d.ts +72 -0
  53. package/src/lib/components/contact-associations-card.js +296 -0
  54. package/src/lib/components/contact-associations-card.js.map +1 -0
  55. package/src/lib/components/contact-custom-columns.d.ts +38 -0
  56. package/src/lib/components/contact-custom-columns.js +102 -0
  57. package/src/lib/components/contact-custom-columns.js.map +1 -0
  58. package/src/lib/components/contact-custom-fields-card.d.ts +39 -0
  59. package/src/lib/components/contact-custom-fields-card.js +204 -0
  60. package/src/lib/components/contact-custom-fields-card.js.map +1 -0
  61. package/src/lib/components/contact-deals-card.d.ts +20 -0
  62. package/src/lib/components/contact-deals-card.js +38 -0
  63. package/src/lib/components/contact-deals-card.js.map +1 -0
  64. package/src/lib/components/contact-detail-page.d.ts +46 -0
  65. package/src/lib/components/contact-detail-page.js +535 -0
  66. package/src/lib/components/contact-detail-page.js.map +1 -0
  67. package/src/lib/components/contact-duplicates-card.d.ts +42 -0
  68. package/src/lib/components/contact-duplicates-card.js +167 -0
  69. package/src/lib/components/contact-duplicates-card.js.map +1 -0
  70. package/src/lib/components/contact-field-drawer.d.ts +64 -0
  71. package/src/lib/components/contact-field-drawer.js +251 -0
  72. package/src/lib/components/contact-field-drawer.js.map +1 -0
  73. package/src/lib/components/contact-import-drawer.d.ts +46 -0
  74. package/src/lib/components/contact-import-drawer.js +149 -0
  75. package/src/lib/components/contact-import-drawer.js.map +1 -0
  76. package/src/lib/components/contact-known-by-card.d.ts +39 -0
  77. package/src/lib/components/contact-known-by-card.js +142 -0
  78. package/src/lib/components/contact-known-by-card.js.map +1 -0
  79. package/src/lib/components/contact-list-columns.d.ts +53 -0
  80. package/src/lib/components/contact-list-columns.js +288 -0
  81. package/src/lib/components/contact-list-columns.js.map +1 -0
  82. package/src/lib/components/contact-merge-dialog.d.ts +79 -0
  83. package/src/lib/components/contact-merge-dialog.js +405 -0
  84. package/src/lib/components/contact-merge-dialog.js.map +1 -0
  85. package/src/lib/components/contact-properties-card.d.ts +89 -0
  86. package/src/lib/components/contact-properties-card.js +492 -0
  87. package/src/lib/components/contact-properties-card.js.map +1 -0
  88. package/src/lib/components/contact-timeline-card.d.ts +68 -0
  89. package/src/lib/components/contact-timeline-card.js +435 -0
  90. package/src/lib/components/contact-timeline-card.js.map +1 -0
  91. package/src/lib/components/contacts-bulk-bar.d.ts +91 -0
  92. package/src/lib/components/contacts-bulk-bar.js +493 -0
  93. package/src/lib/components/contacts-bulk-bar.js.map +1 -0
  94. package/src/lib/components/contacts-section.d.ts +26 -0
  95. package/src/lib/components/contacts-section.js +1025 -0
  96. package/src/lib/components/contacts-section.js.map +1 -0
  97. package/src/lib/components/copy-capture-address-button.d.ts +33 -0
  98. package/src/lib/components/copy-capture-address-button.js +60 -0
  99. package/src/lib/components/copy-capture-address-button.js.map +1 -0
  100. package/src/lib/components/crm-attribution-zone.d.ts +38 -0
  101. package/src/lib/components/crm-attribution-zone.js +36 -0
  102. package/src/lib/components/crm-attribution-zone.js.map +1 -0
  103. package/src/lib/components/crm-booking-zone.d.ts +61 -0
  104. package/src/lib/components/crm-booking-zone.js +50 -0
  105. package/src/lib/components/crm-booking-zone.js.map +1 -0
  106. package/src/lib/components/crm-bulk-bar-frame.d.ts +47 -0
  107. package/src/lib/components/crm-bulk-bar-frame.js +137 -0
  108. package/src/lib/components/crm-bulk-bar-frame.js.map +1 -0
  109. package/src/lib/components/crm-call-actions.d.ts +65 -0
  110. package/src/lib/components/crm-call-actions.js +110 -0
  111. package/src/lib/components/crm-call-actions.js.map +1 -0
  112. package/src/lib/components/crm-column-menu.d.ts +21 -0
  113. package/src/lib/components/crm-column-menu.js +103 -0
  114. package/src/lib/components/crm-column-menu.js.map +1 -0
  115. package/src/lib/components/crm-console-page.d.ts +19 -0
  116. package/src/lib/components/crm-console-page.js +151 -0
  117. package/src/lib/components/crm-console-page.js.map +1 -0
  118. package/src/lib/components/crm-console-sections.d.ts +52 -0
  119. package/src/lib/components/crm-console-sections.js +83 -0
  120. package/src/lib/components/crm-console-sections.js.map +1 -0
  121. package/src/lib/components/crm-custom-field-control.d.ts +26 -0
  122. package/src/lib/components/crm-custom-field-control.js +131 -0
  123. package/src/lib/components/crm-custom-field-control.js.map +1 -0
  124. package/src/lib/components/crm-email-template-tools.d.ts +69 -0
  125. package/src/lib/components/crm-email-template-tools.js +240 -0
  126. package/src/lib/components/crm-email-template-tools.js.map +1 -0
  127. package/src/lib/components/crm-export-all-button.d.ts +39 -0
  128. package/src/lib/components/crm-export-all-button.js +98 -0
  129. package/src/lib/components/crm-export-all-button.js.map +1 -0
  130. package/src/lib/components/crm-filter-bar.d.ts +53 -0
  131. package/src/lib/components/crm-filter-bar.js +294 -0
  132. package/src/lib/components/crm-filter-bar.js.map +1 -0
  133. package/src/lib/components/crm-glance-card.d.ts +54 -0
  134. package/src/lib/components/crm-glance-card.js +219 -0
  135. package/src/lib/components/crm-glance-card.js.map +1 -0
  136. package/src/lib/components/crm-next-activity-column.d.ts +35 -0
  137. package/src/lib/components/crm-next-activity-column.js +100 -0
  138. package/src/lib/components/crm-next-activity-column.js.map +1 -0
  139. package/src/lib/components/crm-record-header.d.ts +97 -0
  140. package/src/lib/components/crm-record-header.js +160 -0
  141. package/src/lib/components/crm-record-header.js.map +1 -0
  142. package/src/lib/components/crm-record-insights-zone.d.ts +50 -0
  143. package/src/lib/components/crm-record-insights-zone.js +169 -0
  144. package/src/lib/components/crm-record-insights-zone.js.map +1 -0
  145. package/src/lib/components/crm-record-picker.d.ts +42 -0
  146. package/src/lib/components/crm-record-picker.js +104 -0
  147. package/src/lib/components/crm-record-picker.js.map +1 -0
  148. package/src/lib/components/crm-send-email-button.d.ts +39 -0
  149. package/src/lib/components/crm-send-email-button.js +81 -0
  150. package/src/lib/components/crm-send-email-button.js.map +1 -0
  151. package/src/lib/components/crm-send-email-dialog.d.ts +61 -0
  152. package/src/lib/components/crm-send-email-dialog.js +851 -0
  153. package/src/lib/components/crm-send-email-dialog.js.map +1 -0
  154. package/src/lib/components/crm-site-picker.d.ts +61 -0
  155. package/src/lib/components/crm-site-picker.js +99 -0
  156. package/src/lib/components/crm-site-picker.js.map +1 -0
  157. package/src/lib/components/crm-suite-lock.d.ts +29 -0
  158. package/src/lib/components/crm-suite-lock.js +114 -0
  159. package/src/lib/components/crm-suite-lock.js.map +1 -0
  160. package/src/lib/components/crm-tasks-due-card.d.ts +42 -0
  161. package/src/lib/components/crm-tasks-due-card.js +225 -0
  162. package/src/lib/components/crm-tasks-due-card.js.map +1 -0
  163. package/src/lib/components/crm-views-control.d.ts +65 -0
  164. package/src/lib/components/crm-views-control.js +518 -0
  165. package/src/lib/components/crm-views-control.js.map +1 -0
  166. package/src/lib/components/csv-import-drawer.d.ts +132 -0
  167. package/src/lib/components/csv-import-drawer.js +746 -0
  168. package/src/lib/components/csv-import-drawer.js.map +1 -0
  169. package/src/lib/components/deal-board.d.ts +70 -0
  170. package/src/lib/components/deal-board.js +478 -0
  171. package/src/lib/components/deal-board.js.map +1 -0
  172. package/src/lib/components/deal-detail-page.d.ts +18 -0
  173. package/src/lib/components/deal-detail-page.js +323 -0
  174. package/src/lib/components/deal-detail-page.js.map +1 -0
  175. package/src/lib/components/deal-edit-drawer.d.ts +59 -0
  176. package/src/lib/components/deal-edit-drawer.js +640 -0
  177. package/src/lib/components/deal-edit-drawer.js.map +1 -0
  178. package/src/lib/components/deal-import-drawer.d.ts +24 -0
  179. package/src/lib/components/deal-import-drawer.js +83 -0
  180. package/src/lib/components/deal-import-drawer.js.map +1 -0
  181. package/src/lib/components/deal-products-card.d.ts +48 -0
  182. package/src/lib/components/deal-products-card.js +614 -0
  183. package/src/lib/components/deal-products-card.js.map +1 -0
  184. package/src/lib/components/deal-properties-card.d.ts +29 -0
  185. package/src/lib/components/deal-properties-card.js +144 -0
  186. package/src/lib/components/deal-properties-card.js.map +1 -0
  187. package/src/lib/components/deal-stage-card.d.ts +24 -0
  188. package/src/lib/components/deal-stage-card.js +199 -0
  189. package/src/lib/components/deal-stage-card.js.map +1 -0
  190. package/src/lib/components/deals-bulk-bar.d.ts +31 -0
  191. package/src/lib/components/deals-bulk-bar.js +340 -0
  192. package/src/lib/components/deals-bulk-bar.js.map +1 -0
  193. package/src/lib/components/deals-section.d.ts +49 -0
  194. package/src/lib/components/deals-section.js +767 -0
  195. package/src/lib/components/deals-section.js.map +1 -0
  196. package/src/lib/components/email-capture-card.d.ts +42 -0
  197. package/src/lib/components/email-capture-card.js +134 -0
  198. package/src/lib/components/email-capture-card.js.map +1 -0
  199. package/src/lib/components/email-template-drawer.d.ts +33 -0
  200. package/src/lib/components/email-template-drawer.js +209 -0
  201. package/src/lib/components/email-template-drawer.js.map +1 -0
  202. package/src/lib/components/email-templates-card.d.ts +33 -0
  203. package/src/lib/components/email-templates-card.js +370 -0
  204. package/src/lib/components/email-templates-card.js.map +1 -0
  205. package/src/lib/components/erase-person-action.d.ts +92 -0
  206. package/src/lib/components/erase-person-action.js +261 -0
  207. package/src/lib/components/erase-person-action.js.map +1 -0
  208. package/src/lib/components/fields-section.d.ts +37 -0
  209. package/src/lib/components/fields-section.js +641 -0
  210. package/src/lib/components/fields-section.js.map +1 -0
  211. package/src/lib/components/form-contact-fields-card.d.ts +46 -0
  212. package/src/lib/components/form-contact-fields-card.js +253 -0
  213. package/src/lib/components/form-contact-fields-card.js.map +1 -0
  214. package/src/lib/components/insert-link-at-caret.d.ts +28 -0
  215. package/src/lib/components/insert-link-at-caret.js +37 -0
  216. package/src/lib/components/insert-link-at-caret.js.map +1 -0
  217. package/src/lib/components/lead-convert-dialog.d.ts +32 -0
  218. package/src/lib/components/lead-convert-dialog.js +493 -0
  219. package/src/lib/components/lead-convert-dialog.js.map +1 -0
  220. package/src/lib/components/lead-detail-page.d.ts +16 -0
  221. package/src/lib/components/lead-detail-page.js +163 -0
  222. package/src/lib/components/lead-detail-page.js.map +1 -0
  223. package/src/lib/components/lead-history-card.d.ts +32 -0
  224. package/src/lib/components/lead-history-card.js +165 -0
  225. package/src/lib/components/lead-history-card.js.map +1 -0
  226. package/src/lib/components/lead-import-drawer.d.ts +24 -0
  227. package/src/lib/components/lead-import-drawer.js +95 -0
  228. package/src/lib/components/lead-import-drawer.js.map +1 -0
  229. package/src/lib/components/lead-owner-select.d.ts +35 -0
  230. package/src/lib/components/lead-owner-select.js +91 -0
  231. package/src/lib/components/lead-owner-select.js.map +1 -0
  232. package/src/lib/components/lead-properties-card.d.ts +61 -0
  233. package/src/lib/components/lead-properties-card.js +395 -0
  234. package/src/lib/components/lead-properties-card.js.map +1 -0
  235. package/src/lib/components/lead-status-chip.d.ts +12 -0
  236. package/src/lib/components/lead-status-chip.js +43 -0
  237. package/src/lib/components/lead-status-chip.js.map +1 -0
  238. package/src/lib/components/lead-surfaces-note.d.ts +126 -0
  239. package/src/lib/components/lead-surfaces-note.js +262 -0
  240. package/src/lib/components/lead-surfaces-note.js.map +1 -0
  241. package/src/lib/components/lead-unqualify-dialog.d.ts +24 -0
  242. package/src/lib/components/lead-unqualify-dialog.js +125 -0
  243. package/src/lib/components/lead-unqualify-dialog.js.map +1 -0
  244. package/src/lib/components/leads-bulk-bar.d.ts +58 -0
  245. package/src/lib/components/leads-bulk-bar.js +307 -0
  246. package/src/lib/components/leads-bulk-bar.js.map +1 -0
  247. package/src/lib/components/leads-section.d.ts +23 -0
  248. package/src/lib/components/leads-section.js +664 -0
  249. package/src/lib/components/leads-section.js.map +1 -0
  250. package/src/lib/components/linked-deals-card.d.ts +32 -0
  251. package/src/lib/components/linked-deals-card.js +163 -0
  252. package/src/lib/components/linked-deals-card.js.map +1 -0
  253. package/src/lib/components/log-activity-dialog.d.ts +60 -0
  254. package/src/lib/components/log-activity-dialog.js +368 -0
  255. package/src/lib/components/log-activity-dialog.js.map +1 -0
  256. package/src/lib/components/lost-reason-dialog.d.ts +26 -0
  257. package/src/lib/components/lost-reason-dialog.js +95 -0
  258. package/src/lib/components/lost-reason-dialog.js.map +1 -0
  259. package/src/lib/components/new-contact-drawer.d.ts +78 -0
  260. package/src/lib/components/new-contact-drawer.js +343 -0
  261. package/src/lib/components/new-contact-drawer.js.map +1 -0
  262. package/src/lib/components/org-lead-surfaces-note.d.ts +57 -0
  263. package/src/lib/components/org-lead-surfaces-note.js +172 -0
  264. package/src/lib/components/org-lead-surfaces-note.js.map +1 -0
  265. package/src/lib/components/owner-avatar.d.ts +18 -0
  266. package/src/lib/components/owner-avatar.js +61 -0
  267. package/src/lib/components/owner-avatar.js.map +1 -0
  268. package/src/lib/components/pipeline-stages-dialog.d.ts +43 -0
  269. package/src/lib/components/pipeline-stages-dialog.js +339 -0
  270. package/src/lib/components/pipeline-stages-dialog.js.map +1 -0
  271. package/src/lib/components/pipelines-dialog.d.ts +55 -0
  272. package/src/lib/components/pipelines-dialog.js +517 -0
  273. package/src/lib/components/pipelines-dialog.js.map +1 -0
  274. package/src/lib/components/recent-activity-feed.d.ts +39 -0
  275. package/src/lib/components/recent-activity-feed.js +103 -0
  276. package/src/lib/components/recent-activity-feed.js.map +1 -0
  277. package/src/lib/components/recipes-card.d.ts +39 -0
  278. package/src/lib/components/recipes-card.js +485 -0
  279. package/src/lib/components/recipes-card.js.map +1 -0
  280. package/src/lib/components/record-activity-card.d.ts +26 -0
  281. package/src/lib/components/record-activity-card.js +121 -0
  282. package/src/lib/components/record-activity-card.js.map +1 -0
  283. package/src/lib/components/record-files-card.d.ts +67 -0
  284. package/src/lib/components/record-files-card.js +290 -0
  285. package/src/lib/components/record-files-card.js.map +1 -0
  286. package/src/lib/components/record-tasks-card.d.ts +32 -0
  287. package/src/lib/components/record-tasks-card.js +306 -0
  288. package/src/lib/components/record-tasks-card.js.map +1 -0
  289. package/src/lib/components/reports/activity-card.d.ts +57 -0
  290. package/src/lib/components/reports/activity-card.js +281 -0
  291. package/src/lib/components/reports/activity-card.js.map +1 -0
  292. package/src/lib/components/reports/closed-deals-card.d.ts +20 -0
  293. package/src/lib/components/reports/closed-deals-card.js +194 -0
  294. package/src/lib/components/reports/closed-deals-card.js.map +1 -0
  295. package/src/lib/components/reports/contacts-mix-card.d.ts +27 -0
  296. package/src/lib/components/reports/contacts-mix-card.js +161 -0
  297. package/src/lib/components/reports/contacts-mix-card.js.map +1 -0
  298. package/src/lib/components/reports/contacts-trend-card.d.ts +31 -0
  299. package/src/lib/components/reports/contacts-trend-card.js +144 -0
  300. package/src/lib/components/reports/contacts-trend-card.js.map +1 -0
  301. package/src/lib/components/reports/forecast-card.d.ts +22 -0
  302. package/src/lib/components/reports/forecast-card.js +251 -0
  303. package/src/lib/components/reports/forecast-card.js.map +1 -0
  304. package/src/lib/components/reports/lead-counts.d.ts +32 -0
  305. package/src/lib/components/reports/lead-counts.js +44 -0
  306. package/src/lib/components/reports/lead-counts.js.map +1 -0
  307. package/src/lib/components/reports/lead-funnel-card.d.ts +38 -0
  308. package/src/lib/components/reports/lead-funnel-card.js +375 -0
  309. package/src/lib/components/reports/lead-funnel-card.js.map +1 -0
  310. package/src/lib/components/reports/pipeline-card.d.ts +19 -0
  311. package/src/lib/components/reports/pipeline-card.js +338 -0
  312. package/src/lib/components/reports/pipeline-card.js.map +1 -0
  313. package/src/lib/components/reports/report-bar-chart.d.ts +39 -0
  314. package/src/lib/components/reports/report-bar-chart.js +133 -0
  315. package/src/lib/components/reports/report-bar-chart.js.map +1 -0
  316. package/src/lib/components/reports/report-breakdown.d.ts +32 -0
  317. package/src/lib/components/reports/report-breakdown.js +105 -0
  318. package/src/lib/components/reports/report-breakdown.js.map +1 -0
  319. package/src/lib/components/reports/report-export.d.ts +37 -0
  320. package/src/lib/components/reports/report-export.js +66 -0
  321. package/src/lib/components/reports/report-export.js.map +1 -0
  322. package/src/lib/components/reports/report-format.d.ts +36 -0
  323. package/src/lib/components/reports/report-format.js +43 -0
  324. package/src/lib/components/reports/report-format.js.map +1 -0
  325. package/src/lib/components/reports/report-scope.d.ts +81 -0
  326. package/src/lib/components/reports/report-scope.js +58 -0
  327. package/src/lib/components/reports/report-scope.js.map +1 -0
  328. package/src/lib/components/reports/report-stat-tile.d.ts +47 -0
  329. package/src/lib/components/reports/report-stat-tile.js +96 -0
  330. package/src/lib/components/reports/report-stat-tile.js.map +1 -0
  331. package/src/lib/components/reports/source-conversion-card.d.ts +28 -0
  332. package/src/lib/components/reports/source-conversion-card.js +205 -0
  333. package/src/lib/components/reports/source-conversion-card.js.map +1 -0
  334. package/src/lib/components/reports/tasks-card.d.ts +26 -0
  335. package/src/lib/components/reports/tasks-card.js +279 -0
  336. package/src/lib/components/reports/tasks-card.js.map +1 -0
  337. package/src/lib/components/reports/use-aggregate-read.d.ts +99 -0
  338. package/src/lib/components/reports/use-aggregate-read.js +195 -0
  339. package/src/lib/components/reports/use-aggregate-read.js.map +1 -0
  340. package/src/lib/components/reports/won-lost-by-owner-card.d.ts +30 -0
  341. package/src/lib/components/reports/won-lost-by-owner-card.js +168 -0
  342. package/src/lib/components/reports/won-lost-by-owner-card.js.map +1 -0
  343. package/src/lib/components/reports-section.d.ts +42 -0
  344. package/src/lib/components/reports-section.js +308 -0
  345. package/src/lib/components/reports-section.js.map +1 -0
  346. package/src/lib/components/sending-addresses-card.d.ts +49 -0
  347. package/src/lib/components/sending-addresses-card.js +262 -0
  348. package/src/lib/components/sending-addresses-card.js.map +1 -0
  349. package/src/lib/components/settings-section.d.ts +151 -0
  350. package/src/lib/components/settings-section.js +783 -0
  351. package/src/lib/components/settings-section.js.map +1 -0
  352. package/src/lib/components/task-cells.d.ts +51 -0
  353. package/src/lib/components/task-cells.js +139 -0
  354. package/src/lib/components/task-cells.js.map +1 -0
  355. package/src/lib/components/task-edit-drawer.d.ts +53 -0
  356. package/src/lib/components/task-edit-drawer.js +483 -0
  357. package/src/lib/components/task-edit-drawer.js.map +1 -0
  358. package/src/lib/components/task-import-drawer.d.ts +24 -0
  359. package/src/lib/components/task-import-drawer.js +82 -0
  360. package/src/lib/components/task-import-drawer.js.map +1 -0
  361. package/src/lib/components/task-snooze-menu.d.ts +65 -0
  362. package/src/lib/components/task-snooze-menu.js +207 -0
  363. package/src/lib/components/task-snooze-menu.js.map +1 -0
  364. package/src/lib/components/tasks-bulk-bar.d.ts +25 -0
  365. package/src/lib/components/tasks-bulk-bar.js +348 -0
  366. package/src/lib/components/tasks-bulk-bar.js.map +1 -0
  367. package/src/lib/components/tasks-calendar.d.ts +38 -0
  368. package/src/lib/components/tasks-calendar.js +228 -0
  369. package/src/lib/components/tasks-calendar.js.map +1 -0
  370. package/src/lib/components/tasks-section.d.ts +27 -0
  371. package/src/lib/components/tasks-section.js +579 -0
  372. package/src/lib/components/tasks-section.js.map +1 -0
  373. package/src/lib/components/use-contact-campaign-emails.d.ts +32 -0
  374. package/src/lib/components/use-contact-campaign-emails.js +83 -0
  375. package/src/lib/components/use-contact-campaign-emails.js.map +1 -0
  376. package/src/lib/components/use-crm-api.d.ts +44 -0
  377. package/src/lib/components/use-crm-api.js +84 -0
  378. package/src/lib/components/use-crm-api.js.map +1 -0
  379. package/src/lib/components/use-crm-inbound-address.d.ts +60 -0
  380. package/src/lib/components/use-crm-inbound-address.js +124 -0
  381. package/src/lib/components/use-crm-inbound-address.js.map +1 -0
  382. package/src/lib/components/use-emails-hub-path.d.ts +24 -0
  383. package/src/lib/components/use-emails-hub-path.js +59 -0
  384. package/src/lib/components/use-emails-hub-path.js.map +1 -0
  385. package/src/lib/components/use-member-email-aliases.d.ts +54 -0
  386. package/src/lib/components/use-member-email-aliases.js +186 -0
  387. package/src/lib/components/use-member-email-aliases.js.map +1 -0
  388. package/src/lib/components/use-org-members.d.ts +40 -0
  389. package/src/lib/components/use-org-members.js +100 -0
  390. package/src/lib/components/use-org-members.js.map +1 -0
  391. package/src/lib/constants/api-routes.d.ts +109 -0
  392. package/src/lib/constants/api-routes.js +74 -0
  393. package/src/lib/constants/api-routes.js.map +1 -0
  394. package/src/lib/constants/bundle-common.d.ts +14 -0
  395. package/src/lib/constants/bundle-common.js +14 -0
  396. package/src/lib/constants/bundle-common.js.map +1 -0
  397. package/src/lib/constants/company-filters.d.ts +18 -0
  398. package/src/lib/constants/company-filters.js +51 -0
  399. package/src/lib/constants/company-filters.js.map +1 -0
  400. package/src/lib/constants/contact-filters.d.ts +38 -0
  401. package/src/lib/constants/contact-filters.js +294 -0
  402. package/src/lib/constants/contact-filters.js.map +1 -0
  403. package/src/lib/hooks/use-contact-field-definitions.d.ts +48 -0
  404. package/src/lib/hooks/use-contact-field-definitions.js +72 -0
  405. package/src/lib/hooks/use-contact-field-definitions.js.map +1 -0
  406. package/src/lib/hooks/use-contact-update.d.ts +25 -0
  407. package/src/lib/hooks/use-contact-update.js +80 -0
  408. package/src/lib/hooks/use-contact-update.js.map +1 -0
  409. package/src/lib/hooks/use-crm-activity-logger.d.ts +73 -0
  410. package/src/lib/hooks/use-crm-activity-logger.js +101 -0
  411. package/src/lib/hooks/use-crm-activity-logger.js.map +1 -0
  412. package/src/lib/hooks/use-crm-bulk-apply.d.ts +52 -0
  413. package/src/lib/hooks/use-crm-bulk-apply.js +112 -0
  414. package/src/lib/hooks/use-crm-bulk-apply.js.map +1 -0
  415. package/src/lib/hooks/use-crm-default-view.d.ts +24 -0
  416. package/src/lib/hooks/use-crm-default-view.js +64 -0
  417. package/src/lib/hooks/use-crm-default-view.js.map +1 -0
  418. package/src/lib/hooks/use-crm-email-templates.d.ts +59 -0
  419. package/src/lib/hooks/use-crm-email-templates.js +103 -0
  420. package/src/lib/hooks/use-crm-email-templates.js.map +1 -0
  421. package/src/lib/hooks/use-crm-hub-path.d.ts +29 -0
  422. package/src/lib/hooks/use-crm-hub-path.js +41 -0
  423. package/src/lib/hooks/use-crm-hub-path.js.map +1 -0
  424. package/src/lib/hooks/use-crm-org-mount.d.ts +97 -0
  425. package/src/lib/hooks/use-crm-org-mount.js +215 -0
  426. package/src/lib/hooks/use-crm-org-mount.js.map +1 -0
  427. package/src/lib/hooks/use-crm-record-names.d.ts +52 -0
  428. package/src/lib/hooks/use-crm-record-names.js +126 -0
  429. package/src/lib/hooks/use-crm-record-names.js.map +1 -0
  430. package/src/lib/hooks/use-crm-records-quota.d.ts +68 -0
  431. package/src/lib/hooks/use-crm-records-quota.js +118 -0
  432. package/src/lib/hooks/use-crm-records-quota.js.map +1 -0
  433. package/src/lib/hooks/use-crm-saved-view.d.ts +96 -0
  434. package/src/lib/hooks/use-crm-saved-view.js +329 -0
  435. package/src/lib/hooks/use-crm-saved-view.js.map +1 -0
  436. package/src/lib/hooks/use-crm-scope.d.ts +117 -0
  437. package/src/lib/hooks/use-crm-scope.js +147 -0
  438. package/src/lib/hooks/use-crm-scope.js.map +1 -0
  439. package/src/lib/hooks/use-crm-tasks.d.ts +85 -0
  440. package/src/lib/hooks/use-crm-tasks.js +153 -0
  441. package/src/lib/hooks/use-crm-tasks.js.map +1 -0
  442. package/src/lib/hooks/use-crm-view-grid.d.ts +55 -0
  443. package/src/lib/hooks/use-crm-view-grid.js +170 -0
  444. package/src/lib/hooks/use-crm-view-grid.js.map +1 -0
  445. package/src/lib/hooks/use-crm-views.d.ts +42 -0
  446. package/src/lib/hooks/use-crm-views.js +84 -0
  447. package/src/lib/hooks/use-crm-views.js.map +1 -0
  448. package/src/lib/hooks/use-deal-stage-api.d.ts +69 -0
  449. package/src/lib/hooks/use-deal-stage-api.js +78 -0
  450. package/src/lib/hooks/use-deal-stage-api.js.map +1 -0
  451. package/src/lib/hooks/use-deals.d.ts +47 -0
  452. package/src/lib/hooks/use-deals.js +105 -0
  453. package/src/lib/hooks/use-deals.js.map +1 -0
  454. package/src/lib/hooks/use-org-leads.d.ts +53 -0
  455. package/src/lib/hooks/use-org-leads.js +114 -0
  456. package/src/lib/hooks/use-org-leads.js.map +1 -0
  457. package/src/lib/hooks/use-org-member-directory.d.ts +36 -0
  458. package/src/lib/hooks/use-org-member-directory.js +116 -0
  459. package/src/lib/hooks/use-org-member-directory.js.map +1 -0
  460. package/src/lib/hooks/use-org-member-options.d.ts +38 -0
  461. package/src/lib/hooks/use-org-member-options.js +131 -0
  462. package/src/lib/hooks/use-org-member-options.js.map +1 -0
  463. package/src/lib/hooks/use-pipeline.d.ts +71 -0
  464. package/src/lib/hooks/use-pipeline.js +159 -0
  465. package/src/lib/hooks/use-pipeline.js.map +1 -0
  466. package/src/lib/model/companies-bulk-writes.d.ts +40 -0
  467. package/src/lib/model/companies-bulk-writes.js +103 -0
  468. package/src/lib/model/companies-bulk-writes.js.map +1 -0
  469. package/src/lib/model/companies-csv.d.ts +36 -0
  470. package/src/lib/model/companies-csv.js +38 -0
  471. package/src/lib/model/companies-csv.js.map +1 -0
  472. package/src/lib/model/companies.d.ts +99 -0
  473. package/src/lib/model/companies.js +168 -0
  474. package/src/lib/model/companies.js.map +1 -0
  475. package/src/lib/model/company-delete-route.d.ts +43 -0
  476. package/src/lib/model/company-delete-route.js +31 -0
  477. package/src/lib/model/company-delete-route.js.map +1 -0
  478. package/src/lib/model/company-delete.d.ts +42 -0
  479. package/src/lib/model/company-delete.js +52 -0
  480. package/src/lib/model/company-delete.js.map +1 -0
  481. package/src/lib/model/contact-duplicates.d.ts +58 -0
  482. package/src/lib/model/contact-duplicates.js +67 -0
  483. package/src/lib/model/contact-duplicates.js.map +1 -0
  484. package/src/lib/model/contact-record.d.ts +113 -0
  485. package/src/lib/model/contact-record.js +70 -0
  486. package/src/lib/model/contact-record.js.map +1 -0
  487. package/src/lib/model/contact-update.d.ts +93 -0
  488. package/src/lib/model/contact-update.js +50 -0
  489. package/src/lib/model/contact-update.js.map +1 -0
  490. package/src/lib/model/contacts-bulk-writes.d.ts +173 -0
  491. package/src/lib/model/contacts-bulk-writes.js +196 -0
  492. package/src/lib/model/contacts-bulk-writes.js.map +1 -0
  493. package/src/lib/model/contacts-csv.d.ts +54 -0
  494. package/src/lib/model/contacts-csv.js +67 -0
  495. package/src/lib/model/contacts-csv.js.map +1 -0
  496. package/src/lib/model/contacts-list-seed.d.ts +51 -0
  497. package/src/lib/model/contacts-list-seed.js +63 -0
  498. package/src/lib/model/contacts-list-seed.js.map +1 -0
  499. package/src/lib/model/crm-activity-report.d.ts +27 -0
  500. package/src/lib/model/crm-activity-report.js +56 -0
  501. package/src/lib/model/crm-activity-report.js.map +1 -0
  502. package/src/lib/model/crm-api.d.ts +49 -0
  503. package/src/lib/model/crm-api.js +47 -0
  504. package/src/lib/model/crm-api.js.map +1 -0
  505. package/src/lib/model/crm-bulk-writes.d.ts +147 -0
  506. package/src/lib/model/crm-bulk-writes.js +207 -0
  507. package/src/lib/model/crm-bulk-writes.js.map +1 -0
  508. package/src/lib/model/crm-company-import.d.ts +154 -0
  509. package/src/lib/model/crm-company-import.js +331 -0
  510. package/src/lib/model/crm-company-import.js.map +1 -0
  511. package/src/lib/model/crm-custom-draft.d.ts +62 -0
  512. package/src/lib/model/crm-custom-draft.js +67 -0
  513. package/src/lib/model/crm-custom-draft.js.map +1 -0
  514. package/src/lib/model/crm-deal-import.d.ts +112 -0
  515. package/src/lib/model/crm-deal-import.js +263 -0
  516. package/src/lib/model/crm-deal-import.js.map +1 -0
  517. package/src/lib/model/crm-import.d.ts +244 -0
  518. package/src/lib/model/crm-import.js +466 -0
  519. package/src/lib/model/crm-import.js.map +1 -0
  520. package/src/lib/model/crm-lead-import.d.ts +105 -0
  521. package/src/lib/model/crm-lead-import.js +255 -0
  522. package/src/lib/model/crm-lead-import.js.map +1 -0
  523. package/src/lib/model/crm-record-routes.d.ts +21 -0
  524. package/src/lib/model/crm-record-routes.js +70 -0
  525. package/src/lib/model/crm-record-routes.js.map +1 -0
  526. package/src/lib/model/crm-routes.d.ts +101 -0
  527. package/src/lib/model/crm-routes.js +92 -0
  528. package/src/lib/model/crm-routes.js.map +1 -0
  529. package/src/lib/model/crm-task-import.d.ts +94 -0
  530. package/src/lib/model/crm-task-import.js +275 -0
  531. package/src/lib/model/crm-task-import.js.map +1 -0
  532. package/src/lib/model/crm-view-param.d.ts +43 -0
  533. package/src/lib/model/crm-view-param.js +49 -0
  534. package/src/lib/model/crm-view-param.js.map +1 -0
  535. package/src/lib/model/deal-board-model.d.ts +241 -0
  536. package/src/lib/model/deal-board-model.js +439 -0
  537. package/src/lib/model/deal-board-model.js.map +1 -0
  538. package/src/lib/model/deal-form-model.d.ts +114 -0
  539. package/src/lib/model/deal-form-model.js +218 -0
  540. package/src/lib/model/deal-form-model.js.map +1 -0
  541. package/src/lib/model/deals-csv.d.ts +32 -0
  542. package/src/lib/model/deals-csv.js +37 -0
  543. package/src/lib/model/deals-csv.js.map +1 -0
  544. package/src/lib/model/import-column-shapes.d.ts +36 -0
  545. package/src/lib/model/import-column-shapes.js +76 -0
  546. package/src/lib/model/import-column-shapes.js.map +1 -0
  547. package/src/lib/model/lead-company-suggestion.d.ts +61 -0
  548. package/src/lib/model/lead-company-suggestion.js +65 -0
  549. package/src/lib/model/lead-company-suggestion.js.map +1 -0
  550. package/src/lib/model/lead-filters.d.ts +29 -0
  551. package/src/lib/model/lead-filters.js +39 -0
  552. package/src/lib/model/lead-filters.js.map +1 -0
  553. package/src/lib/model/lead-surfaces.d.ts +58 -0
  554. package/src/lib/model/lead-surfaces.js +67 -0
  555. package/src/lib/model/lead-surfaces.js.map +1 -0
  556. package/src/lib/model/leads-csv.d.ts +40 -0
  557. package/src/lib/model/leads-csv.js +40 -0
  558. package/src/lib/model/leads-csv.js.map +1 -0
  559. package/src/lib/model/next-activity-api.d.ts +31 -0
  560. package/src/lib/model/next-activity-api.js +57 -0
  561. package/src/lib/model/next-activity-api.js.map +1 -0
  562. package/src/lib/model/next-activity.d.ts +64 -0
  563. package/src/lib/model/next-activity.js +47 -0
  564. package/src/lib/model/next-activity.js.map +1 -0
  565. package/src/lib/model/person-key-web.d.ts +43 -0
  566. package/src/lib/model/person-key-web.js +52 -0
  567. package/src/lib/model/person-key-web.js.map +1 -0
  568. package/src/lib/model/record-facts.d.ts +282 -0
  569. package/src/lib/model/record-facts.js +434 -0
  570. package/src/lib/model/record-facts.js.map +1 -0
  571. package/src/lib/model/task-api.d.ts +28 -0
  572. package/src/lib/model/task-api.js +57 -0
  573. package/src/lib/model/task-api.js.map +1 -0
  574. package/src/lib/model/task-calendar.d.ts +108 -0
  575. package/src/lib/model/task-calendar.js +139 -0
  576. package/src/lib/model/task-calendar.js.map +1 -0
  577. package/src/lib/model/task-routes.d.ts +177 -0
  578. package/src/lib/model/task-routes.js +197 -0
  579. package/src/lib/model/task-routes.js.map +1 -0
  580. package/src/lib/model/task-scope.d.ts +45 -0
  581. package/src/lib/model/task-scope.js +51 -0
  582. package/src/lib/model/task-scope.js.map +1 -0
  583. package/src/lib/model/task-views.d.ts +149 -0
  584. package/src/lib/model/task-views.js +286 -0
  585. package/src/lib/model/task-views.js.map +1 -0
  586. package/src/lib/model/tasks-csv.d.ts +28 -0
  587. package/src/lib/model/tasks-csv.js +28 -0
  588. package/src/lib/model/tasks-csv.js.map +1 -0
  589. package/src/lib/plugin.d.ts +32 -0
  590. package/src/lib/plugin.js +208 -0
  591. package/src/lib/plugin.js.map +1 -0
  592. package/src/lib/server/companies-import.d.ts +57 -0
  593. package/src/lib/server/companies-import.js +242 -0
  594. package/src/lib/server/companies-import.js.map +1 -0
  595. package/src/lib/server/company-delete.d.ts +59 -0
  596. package/src/lib/server/company-delete.js +146 -0
  597. package/src/lib/server/company-delete.js.map +1 -0
  598. package/src/lib/server/contact-email-history.d.ts +82 -0
  599. package/src/lib/server/contact-email-history.js +264 -0
  600. package/src/lib/server/contact-email-history.js.map +1 -0
  601. package/src/lib/server/contact-profile.d.ts +41 -0
  602. package/src/lib/server/contact-profile.js +45 -0
  603. package/src/lib/server/contact-profile.js.map +1 -0
  604. package/src/lib/server/contact-update.d.ts +92 -0
  605. package/src/lib/server/contact-update.js +512 -0
  606. package/src/lib/server/contact-update.js.map +1 -0
  607. package/src/lib/server/contacts-import.d.ts +73 -0
  608. package/src/lib/server/contacts-import.js +263 -0
  609. package/src/lib/server/contacts-import.js.map +1 -0
  610. package/src/lib/server/contacts-merge.d.ts +86 -0
  611. package/src/lib/server/contacts-merge.js +206 -0
  612. package/src/lib/server/contacts-merge.js.map +1 -0
  613. package/src/lib/server/deals-import.d.ts +76 -0
  614. package/src/lib/server/deals-import.js +246 -0
  615. package/src/lib/server/deals-import.js.map +1 -0
  616. package/src/lib/server/email-send.d.ts +119 -0
  617. package/src/lib/server/email-send.js +667 -0
  618. package/src/lib/server/email-send.js.map +1 -0
  619. package/src/lib/server/email-template-duplicate.d.ts +19 -0
  620. package/src/lib/server/email-template-duplicate.js +206 -0
  621. package/src/lib/server/email-template-duplicate.js.map +1 -0
  622. package/src/lib/server/erase-person.d.ts +108 -0
  623. package/src/lib/server/erase-person.js +309 -0
  624. package/src/lib/server/erase-person.js.map +1 -0
  625. package/src/lib/server/import-context.d.ts +85 -0
  626. package/src/lib/server/import-context.js +181 -0
  627. package/src/lib/server/import-context.js.map +1 -0
  628. package/src/lib/server/inbound-address.d.ts +61 -0
  629. package/src/lib/server/inbound-address.js +188 -0
  630. package/src/lib/server/inbound-address.js.map +1 -0
  631. package/src/lib/server/lead-convert.d.ts +78 -0
  632. package/src/lib/server/lead-convert.js +250 -0
  633. package/src/lib/server/lead-convert.js.map +1 -0
  634. package/src/lib/server/leads-import.d.ts +84 -0
  635. package/src/lib/server/leads-import.js +261 -0
  636. package/src/lib/server/leads-import.js.map +1 -0
  637. package/src/lib/server/next-activity-routes.d.ts +33 -0
  638. package/src/lib/server/next-activity-routes.js +110 -0
  639. package/src/lib/server/next-activity-routes.js.map +1 -0
  640. package/src/lib/server/org-activity.d.ts +61 -0
  641. package/src/lib/server/org-activity.js +120 -0
  642. package/src/lib/server/org-activity.js.map +1 -0
  643. package/src/lib/server/org-caller.d.ts +110 -0
  644. package/src/lib/server/org-caller.js +154 -0
  645. package/src/lib/server/org-caller.js.map +1 -0
  646. package/src/lib/server/recipe-routes.d.ts +75 -0
  647. package/src/lib/server/recipe-routes.js +442 -0
  648. package/src/lib/server/recipe-routes.js.map +1 -0
  649. package/src/lib/server/record-facts.d.ts +65 -0
  650. package/src/lib/server/record-facts.js +337 -0
  651. package/src/lib/server/record-facts.js.map +1 -0
  652. package/src/lib/server/record-timeline.d.ts +51 -0
  653. package/src/lib/server/record-timeline.js +215 -0
  654. package/src/lib/server/record-timeline.js.map +1 -0
  655. package/src/lib/server/suite-gate.d.ts +42 -0
  656. package/src/lib/server/suite-gate.js +87 -0
  657. package/src/lib/server/suite-gate.js.map +1 -0
  658. package/src/lib/server/task-routes.d.ts +132 -0
  659. package/src/lib/server/task-routes.js +699 -0
  660. package/src/lib/server/task-routes.js.map +1 -0
  661. package/src/lib/server/tasks-import.d.ts +54 -0
  662. package/src/lib/server/tasks-import.js +157 -0
  663. package/src/lib/server/tasks-import.js.map +1 -0
  664. package/src/lib/server-deal-stage.d.ts +88 -0
  665. package/src/lib/server-deal-stage.js +316 -0
  666. package/src/lib/server-deal-stage.js.map +1 -0
  667. package/src/lib/server.d.ts +149 -0
  668. package/src/lib/server.js +615 -0
  669. package/src/lib/server.js.map +1 -0
@@ -0,0 +1,337 @@
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 { registerPluginRecordFactsReader } from "@aglyn/aglyn/plugin-manager/plugin-record-facts";
18
+ import { CRM_COLLECTIONS, contactPrimaryGroup, crmReadTokens, isOrgWideMember } from "@aglyn/aglyn/server";
19
+ import { consentGroupForSite, firebaseAdmin, getOrgDoc, memberHasOrgPermission, resolveOrgIdForHost, resolveOrgMembership } from "@aglyn/tenant-data-admin";
20
+ import { BUNDLE_ID } from "../constants/bundle-common.js";
21
+ import { CRM_IMPORT_FACTS_RESOURCE, CRM_RECORD_FACTS_RESOURCES, companyFacts, contactFacts, dealFacts, importFacts, isCrmImportFactsCollection, leadFacts } from "../model/record-facts.js";
22
+ import { crmSuiteRefusal } from "./suite-gate.js";
23
+ /** The org collection a contact lives in, beside the CRM's own. */ const CONTACTS_COLLECTION = 'contacts';
24
+ /** Logged activities read per record before visibility and the timeline cut. */ export const CRM_FACTS_ACTIVITIES_READ = 40;
25
+ /** Tasks read per record, the record page's own window. */ export const CRM_FACTS_TASKS_READ = 50;
26
+ /** Deals read per contact or company. */ export const CRM_FACTS_DEALS_READ = 20;
27
+ /** Custom field definitions an import catalog reads. */ export const CRM_FACTS_FIELD_DEFINITIONS_READ = 100;
28
+ export const CRM_FACTS_UNKNOWN_SITE = 'Unknown site';
29
+ export const CRM_FACTS_NOT_A_MEMBER = 'You are not a member of that organization';
30
+ export const CRM_FACTS_SITE_REFUSAL = 'Reading CRM records requires the data.manage permission on this site';
31
+ export const CRM_FACTS_ORG_REFUSAL = 'Reading CRM records across the organization requires the data.manage permission for the whole organization';
32
+ export const CRM_FACTS_LEAD_NEEDS_SITE = 'A lead is read on the site that captured it';
33
+ const NOT_FOUND = {
34
+ contact: 'This contact could not be found. It may have been deleted.',
35
+ company: 'This company could not be found. It may have been deleted.',
36
+ deal: 'This deal could not be found. It may have been deleted.',
37
+ lead: 'This lead could not be found. It may have been removed.',
38
+ import: 'There is no such import.'
39
+ };
40
+ function firestore() {
41
+ return firebaseAdmin.app().firestore();
42
+ }
43
+ /**
44
+ * Rules 1 to 3: the site, the member and the plan. A refusal names what the
45
+ * member lacks in the words the console's own CRM doors use.
46
+ */ export async function crmFactsScope(request) {
47
+ var _request_orgId, _request_org;
48
+ const orgId = String((_request_orgId = request.orgId) != null ? _request_orgId : '').trim();
49
+ const hostId = request.hostId ? String(request.hostId).trim() : null;
50
+ if (!orgId) return {
51
+ ok: false,
52
+ status: 400,
53
+ error: 'Open a workspace first'
54
+ };
55
+ if (hostId && await resolveOrgIdForHost(hostId) !== orgId) {
56
+ return {
57
+ ok: false,
58
+ status: 404,
59
+ error: CRM_FACTS_UNKNOWN_SITE
60
+ };
61
+ }
62
+ if (!request.staff) {
63
+ var _member_hostAccess;
64
+ const membership = await resolveOrgMembership(request.uid, orgId).catch(()=>null);
65
+ const member = (membership == null ? void 0 : membership.orgId) === orgId ? membership.member : null;
66
+ if (!member) return {
67
+ ok: false,
68
+ status: 403,
69
+ error: CRM_FACTS_NOT_A_MEMBER
70
+ };
71
+ const reaches = hostId ? isOrgWideMember(member) || Boolean((_member_hostAccess = member.hostAccess) == null ? void 0 : _member_hostAccess[hostId]) : isOrgWideMember(member);
72
+ const allowed = reaches && await memberHasOrgPermission(orgId, member, 'data.manage');
73
+ if (!allowed) {
74
+ return {
75
+ ok: false,
76
+ status: 403,
77
+ error: hostId ? CRM_FACTS_SITE_REFUSAL : CRM_FACTS_ORG_REFUSAL
78
+ };
79
+ }
80
+ }
81
+ const org = ((_request_org = request.org) != null ? _request_org : await getOrgDoc(orgId)) || null;
82
+ if (!org) return {
83
+ ok: false,
84
+ status: 404,
85
+ error: 'Unknown organization'
86
+ };
87
+ const suite = crmSuiteRefusal(org, 'Reading a CRM record');
88
+ if (suite) return {
89
+ ok: false,
90
+ status: 403,
91
+ error: suite.body.error
92
+ };
93
+ if (!hostId) return {
94
+ orgId,
95
+ hostId: null,
96
+ org,
97
+ group: null,
98
+ visible: ()=>true
99
+ };
100
+ const group = await consentGroupForSite(hostId, org);
101
+ const readable = new Set(crmReadTokens(group));
102
+ return {
103
+ orgId,
104
+ hostId,
105
+ org,
106
+ group,
107
+ visible: (visibleTo)=>Array.isArray(visibleTo) && visibleTo.some((token)=>readable.has(String(token)))
108
+ };
109
+ }
110
+ const orgCollection = (orgId, name)=>firestore().collection('orgs').doc(orgId).collection(name);
111
+ /** Rows of an org collection naming one record, held to the scope's visibility. */ async function rowsNaming(scope, input) {
112
+ const snapshot = await orgCollection(scope.orgId, input.collection).where(input.field, '==', input.id).orderBy(input.orderBy, input.direction).limit(input.limit).get();
113
+ return snapshot.docs.map((doc)=>{
114
+ var _doc_data;
115
+ return (_doc_data = doc.data()) != null ? _doc_data : {};
116
+ }).filter((row)=>scope.visible(row['visibleTo']));
117
+ }
118
+ /** The pipelines some deals name, by id, read once each. */ async function pipelinesFor(scope, deals) {
119
+ const ids = [
120
+ ...new Set(deals.map((deal)=>{
121
+ var _deal_pipelineId;
122
+ return String((_deal_pipelineId = deal.pipelineId) != null ? _deal_pipelineId : '');
123
+ }).filter(Boolean))
124
+ ];
125
+ const snapshots = await Promise.all(ids.map((id)=>orgCollection(scope.orgId, CRM_COLLECTIONS.pipelines).doc(id).get()));
126
+ return new Map(snapshots.filter((snapshot)=>snapshot.exists).map((snapshot)=>{
127
+ var _snapshot_data;
128
+ return [
129
+ snapshot.id,
130
+ (_snapshot_data = snapshot.data()) != null ? _snapshot_data : {}
131
+ ];
132
+ }));
133
+ }
134
+ /** A record document the scope may read, or `null`. */ async function visibleDoc(scope, collection, id) {
135
+ var _snapshot_data;
136
+ if (!id) return null;
137
+ const snapshot = await orgCollection(scope.orgId, collection).doc(id).get();
138
+ const data = snapshot.exists ? (_snapshot_data = snapshot.data()) != null ? _snapshot_data : {} : null;
139
+ return data && scope.visible(data['visibleTo']) ? data : null;
140
+ }
141
+ const refused = (kind, status = 404)=>({
142
+ ok: false,
143
+ status,
144
+ error: NOT_FOUND[kind]
145
+ });
146
+ /** A reader that admits the caller, then reads the record. */ function reader(read) {
147
+ return {
148
+ read: async (request)=>{
149
+ const scope = await crmFactsScope(request);
150
+ if ('ok' in scope) return scope;
151
+ return read(scope, request);
152
+ }
153
+ };
154
+ }
155
+ export const crmContactFactsReader = reader(async (scope, request)=>{
156
+ var _request_id, _scope_group;
157
+ const id = String((_request_id = request.id) != null ? _request_id : '').trim();
158
+ const row = await visibleDoc(scope, CONTACTS_COLLECTION, id);
159
+ if (!row) return refused('contact');
160
+ const group = (_scope_group = scope.group) != null ? _scope_group : contactPrimaryGroup(row, scope.org);
161
+ const naming = {
162
+ field: 'contactId',
163
+ id
164
+ };
165
+ const [activities, tasks, deals] = await Promise.all([
166
+ rowsNaming(scope, _extends({}, naming, {
167
+ collection: CRM_COLLECTIONS.activities,
168
+ orderBy: 'atMs',
169
+ direction: 'desc',
170
+ limit: CRM_FACTS_ACTIVITIES_READ
171
+ })),
172
+ rowsNaming(scope, _extends({}, naming, {
173
+ collection: CRM_COLLECTIONS.tasks,
174
+ orderBy: 'dueAtMs',
175
+ direction: 'asc',
176
+ limit: CRM_FACTS_TASKS_READ
177
+ })),
178
+ rowsNaming(scope, _extends({}, naming, {
179
+ collection: CRM_COLLECTIONS.deals,
180
+ orderBy: 'updatedAt',
181
+ direction: 'desc',
182
+ limit: CRM_FACTS_DEALS_READ
183
+ }))
184
+ ]);
185
+ const pipelines = await pipelinesFor(scope, deals);
186
+ return {
187
+ ok: true,
188
+ facts: _extends({}, contactFacts({
189
+ row,
190
+ group,
191
+ activities,
192
+ tasks,
193
+ deals,
194
+ pipelines,
195
+ nowMs: request.now.getTime()
196
+ }))
197
+ };
198
+ });
199
+ export const crmCompanyFactsReader = reader(async (scope, request)=>{
200
+ var _request_id;
201
+ const id = String((_request_id = request.id) != null ? _request_id : '').trim();
202
+ const company = await visibleDoc(scope, CRM_COLLECTIONS.companies, id);
203
+ if (!company) return refused('company');
204
+ const naming = {
205
+ field: 'companyId',
206
+ id
207
+ };
208
+ const [activities, tasks, deals] = await Promise.all([
209
+ rowsNaming(scope, _extends({}, naming, {
210
+ collection: CRM_COLLECTIONS.activities,
211
+ orderBy: 'atMs',
212
+ direction: 'desc',
213
+ limit: CRM_FACTS_ACTIVITIES_READ
214
+ })),
215
+ rowsNaming(scope, _extends({}, naming, {
216
+ collection: CRM_COLLECTIONS.tasks,
217
+ orderBy: 'dueAtMs',
218
+ direction: 'asc',
219
+ limit: CRM_FACTS_TASKS_READ
220
+ })),
221
+ rowsNaming(scope, _extends({}, naming, {
222
+ collection: CRM_COLLECTIONS.deals,
223
+ orderBy: 'updatedAt',
224
+ direction: 'desc',
225
+ limit: CRM_FACTS_DEALS_READ
226
+ }))
227
+ ]);
228
+ const pipelines = await pipelinesFor(scope, deals);
229
+ return {
230
+ ok: true,
231
+ facts: _extends({}, companyFacts({
232
+ company: company,
233
+ activities,
234
+ tasks,
235
+ deals,
236
+ pipelines,
237
+ nowMs: request.now.getTime()
238
+ }))
239
+ };
240
+ });
241
+ export const crmDealFactsReader = reader(async (scope, request)=>{
242
+ var _request_id, _pipelines_get, _deal_pipelineId;
243
+ const id = String((_request_id = request.id) != null ? _request_id : '').trim();
244
+ const deal = await visibleDoc(scope, CRM_COLLECTIONS.deals, id);
245
+ if (!deal) return refused('deal');
246
+ const naming = {
247
+ field: 'dealId',
248
+ id
249
+ };
250
+ const [activities, tasks, pipelines] = await Promise.all([
251
+ rowsNaming(scope, _extends({}, naming, {
252
+ collection: CRM_COLLECTIONS.activities,
253
+ orderBy: 'atMs',
254
+ direction: 'desc',
255
+ limit: CRM_FACTS_ACTIVITIES_READ
256
+ })),
257
+ rowsNaming(scope, _extends({}, naming, {
258
+ collection: CRM_COLLECTIONS.tasks,
259
+ orderBy: 'dueAtMs',
260
+ direction: 'asc',
261
+ limit: CRM_FACTS_TASKS_READ
262
+ })),
263
+ pipelinesFor(scope, [
264
+ deal
265
+ ])
266
+ ]);
267
+ return {
268
+ ok: true,
269
+ facts: _extends({}, dealFacts({
270
+ deal,
271
+ pipeline: (_pipelines_get = pipelines.get(String((_deal_pipelineId = deal.pipelineId) != null ? _deal_pipelineId : ''))) != null ? _pipelines_get : null,
272
+ activities,
273
+ tasks,
274
+ nowMs: request.now.getTime()
275
+ }))
276
+ };
277
+ });
278
+ export const crmLeadFactsReader = reader(async (scope, request)=>{
279
+ var _request_id, _snapshot_data;
280
+ if (!scope.hostId) return {
281
+ ok: false,
282
+ status: 400,
283
+ error: CRM_FACTS_LEAD_NEEDS_SITE
284
+ };
285
+ const id = String((_request_id = request.id) != null ? _request_id : '').trim();
286
+ if (!id) return refused('lead');
287
+ const snapshot = await firestore().collection('hosts').doc(scope.hostId).collection('leads').doc(id).get();
288
+ if (!snapshot.exists) return refused('lead');
289
+ const activities = await rowsNaming(scope, {
290
+ field: 'leadId',
291
+ id,
292
+ collection: CRM_COLLECTIONS.activities,
293
+ orderBy: 'atMs',
294
+ direction: 'desc',
295
+ limit: CRM_FACTS_ACTIVITIES_READ
296
+ });
297
+ return {
298
+ ok: true,
299
+ facts: _extends({}, leadFacts({
300
+ lead: (_snapshot_data = snapshot.data()) != null ? _snapshot_data : {},
301
+ activities
302
+ }))
303
+ };
304
+ });
305
+ export const crmImportFactsReader = reader(async (scope, request)=>{
306
+ var _request_id;
307
+ const collection = String((_request_id = request.id) != null ? _request_id : '').trim();
308
+ if (!isCrmImportFactsCollection(collection)) return refused('import', 400);
309
+ const snapshot = await orgCollection(scope.orgId, CRM_COLLECTIONS.contactFields).limit(CRM_FACTS_FIELD_DEFINITIONS_READ).get();
310
+ const definitions = snapshot.docs.map((doc)=>{
311
+ var _doc_data;
312
+ return (_doc_data = doc.data()) != null ? _doc_data : {};
313
+ }).filter((definition)=>scope.visible(definition['visibleTo']));
314
+ return {
315
+ ok: true,
316
+ facts: _extends({}, importFacts(collection, definitions))
317
+ };
318
+ });
319
+ /** Every reader this plugin registers, by resource name. */ export const CRM_FACTS_READERS = {
320
+ [CRM_RECORD_FACTS_RESOURCES.contact]: crmContactFactsReader,
321
+ [CRM_RECORD_FACTS_RESOURCES.company]: crmCompanyFactsReader,
322
+ [CRM_RECORD_FACTS_RESOURCES.deal]: crmDealFactsReader,
323
+ [CRM_RECORD_FACTS_RESOURCES.lead]: crmLeadFactsReader,
324
+ [CRM_IMPORT_FACTS_RESOURCE]: crmImportFactsReader
325
+ };
326
+ /**
327
+ * Registers the readers; the console surface calls it, the one process that
328
+ * runs AI jobs (AGL-3026). Idempotent: a second call replaces the first.
329
+ */ export function registerCrmRecordFactsReaders() {
330
+ for (const [resource, factsReader] of Object.entries(CRM_FACTS_READERS)){
331
+ registerPluginRecordFactsReader(resource, factsReader, {
332
+ pluginId: BUNDLE_ID
333
+ });
334
+ }
335
+ }
336
+
337
+ //# sourceMappingURL=record-facts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../../../libs/plugins/crm/src/lib/server/record-facts.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 */\n\nimport {\n registerPluginRecordFactsReader,\n type PluginRecordFactsRead,\n type PluginRecordFactsReader,\n type PluginRecordFactsRequest,\n} from '@aglyn/aglyn/plugin-manager/plugin-record-facts'\nimport {\n CRM_COLLECTIONS,\n contactPrimaryGroup,\n crmReadTokens,\n isOrgWideMember,\n type ConsentGroup,\n type ContactFieldDefinition,\n type CrmActivity,\n type CrmCompany,\n type CrmDeal,\n type CrmPipeline,\n type CrmTask,\n} from '@aglyn/aglyn/server'\nimport {\n consentGroupForSite,\n firebaseAdmin,\n getOrgDoc,\n memberHasOrgPermission,\n resolveOrgIdForHost,\n resolveOrgMembership,\n} from '@aglyn/tenant-data-admin'\nimport { BUNDLE_ID } from '../constants/bundle-common'\nimport {\n CRM_IMPORT_FACTS_RESOURCE,\n CRM_RECORD_FACTS_RESOURCES,\n companyFacts,\n contactFacts,\n dealFacts,\n importFacts,\n isCrmImportFactsCollection,\n leadFacts,\n type CrmRecordFactsKind,\n} from '../model/record-facts'\nimport { crmSuiteRefusal } from './suite-gate'\n\n/**\n * THE CRM'S READERS ON THE CORE'S RECORD-FACTS SEAM (AGL-2917).\n *\n * Another plugin asks for a contact, a company, a deal, a lead or an import's\n * field catalog by resource name, and gets the facts `model/record-facts.ts`\n * reports — read here with the rules every other CRM door applies, for the\n * member the caller names:\n *\n * 1. the site belongs to the organization;\n * 2. the member reaches it — an org-wide member at the organization level, a\n * member of that site under it — and holds `data.manage`, the key the\n * whole CRM is gated on. A verified staff caller passes, as at every CRM\n * route;\n * 3. the organization's plan carries the CRM, asked after the caller is\n * known, the order `suite-gate.ts` gives;\n * 4. the record exists and is visible where it is read: under a site, its\n * `visibleTo` meets the site's read tokens, as the console's listeners\n * filter; at the organization level every row is the member's;\n * 5. what hangs off it — its logged activity, its tasks, its deals — is held\n * to the same visibility, row by row.\n *\n * A caller in the same process skips the plugin API dispatcher, and with it\n * the dispatcher's per-site enablement, release flag, lockdown and rate\n * limit; those are the caller's to establish before it asks (the AI plugin's\n * CRM admission does). Nothing here writes.\n */\n\ntype Firestore = FirebaseFirestore.Firestore\ntype Data = Record<string, unknown>\ntype Refusal = { ok: false; status: 400 | 403 | 404; error: string }\n\n/** The org collection a contact lives in, beside the CRM's own. */\nconst CONTACTS_COLLECTION = 'contacts'\n\n/** Logged activities read per record before visibility and the timeline cut. */\nexport const CRM_FACTS_ACTIVITIES_READ = 40\n/** Tasks read per record, the record page's own window. */\nexport const CRM_FACTS_TASKS_READ = 50\n/** Deals read per contact or company. */\nexport const CRM_FACTS_DEALS_READ = 20\n/** Custom field definitions an import catalog reads. */\nexport const CRM_FACTS_FIELD_DEFINITIONS_READ = 100\n\nexport const CRM_FACTS_UNKNOWN_SITE = 'Unknown site'\nexport const CRM_FACTS_NOT_A_MEMBER = 'You are not a member of that organization'\nexport const CRM_FACTS_SITE_REFUSAL = 'Reading CRM records requires the data.manage permission on this site'\nexport const CRM_FACTS_ORG_REFUSAL =\n 'Reading CRM records across the organization requires the data.manage permission for the whole organization'\nexport const CRM_FACTS_LEAD_NEEDS_SITE = 'A lead is read on the site that captured it'\n\nconst NOT_FOUND: Record<CrmRecordFactsKind | 'import', string> = {\n contact: 'This contact could not be found. It may have been deleted.',\n company: 'This company could not be found. It may have been deleted.',\n deal: 'This deal could not be found. It may have been deleted.',\n lead: 'This lead could not be found. It may have been removed.',\n import: 'There is no such import.',\n}\n\n/** Where a read runs, once the caller has been admitted. */\ninterface CrmFactsScope {\n orgId: string\n hostId: string | null\n org: Data\n /** The site's consent group under a site; `null` at the organization level. */\n group: ConsentGroup | null\n /** Whether a row's `visibleTo` is readable here. */\n visible: (visibleTo: unknown) => boolean\n}\n\nfunction firestore(): Firestore {\n return firebaseAdmin.app().firestore()\n}\n\n/**\n * Rules 1 to 3: the site, the member and the plan. A refusal names what the\n * member lacks in the words the console's own CRM doors use.\n */\nexport async function crmFactsScope(request: PluginRecordFactsRequest): Promise<CrmFactsScope | Refusal> {\n const orgId = String(request.orgId ?? '').trim()\n const hostId = request.hostId ? String(request.hostId).trim() : null\n if (!orgId) return { ok: false, status: 400, error: 'Open a workspace first' }\n if (hostId && (await resolveOrgIdForHost(hostId)) !== orgId) {\n return { ok: false, status: 404, error: CRM_FACTS_UNKNOWN_SITE }\n }\n if (!request.staff) {\n const membership = await resolveOrgMembership(request.uid, orgId).catch(() => null)\n const member = membership?.orgId === orgId ? membership.member : null\n if (!member) return { ok: false, status: 403, error: CRM_FACTS_NOT_A_MEMBER }\n const reaches = hostId\n ? isOrgWideMember(member) || Boolean(member.hostAccess?.[hostId])\n : isOrgWideMember(member)\n const allowed = reaches && (await memberHasOrgPermission(orgId, member, 'data.manage'))\n if (!allowed) {\n return { ok: false, status: 403, error: hostId ? CRM_FACTS_SITE_REFUSAL : CRM_FACTS_ORG_REFUSAL }\n }\n }\n const org = ((request.org as Data | null) ?? ((await getOrgDoc(orgId)) as Data | null)) || null\n if (!org) return { ok: false, status: 404, error: 'Unknown organization' }\n const suite = crmSuiteRefusal(org, 'Reading a CRM record')\n if (suite) return { ok: false, status: 403, error: suite.body.error }\n if (!hostId) return { orgId, hostId: null, org, group: null, visible: () => true }\n const group = await consentGroupForSite(hostId, org)\n const readable = new Set<string>(crmReadTokens(group))\n return {\n orgId,\n hostId,\n org,\n group,\n visible: (visibleTo) =>\n Array.isArray(visibleTo) && visibleTo.some((token) => readable.has(String(token))),\n }\n}\n\nconst orgCollection = (orgId: string, name: string) =>\n firestore().collection('orgs').doc(orgId).collection(name)\n\n/** Rows of an org collection naming one record, held to the scope's visibility. */\nasync function rowsNaming<T>(\n scope: CrmFactsScope,\n input: { collection: string; field: string; id: string; orderBy: string; direction: 'asc' | 'desc'; limit: number },\n): Promise<T[]> {\n const snapshot = await orgCollection(scope.orgId, input.collection)\n .where(input.field, '==', input.id)\n .orderBy(input.orderBy, input.direction)\n .limit(input.limit)\n .get()\n return snapshot.docs\n .map((doc) => (doc.data() ?? {}) as Data)\n .filter((row) => scope.visible(row['visibleTo'])) as T[]\n}\n\n/** The pipelines some deals name, by id, read once each. */\nasync function pipelinesFor(scope: CrmFactsScope, deals: ReadonlyArray<Partial<CrmDeal>>): Promise<Map<string, CrmPipeline>> {\n const ids = [...new Set(deals.map((deal) => String(deal.pipelineId ?? '')).filter(Boolean))]\n const snapshots = await Promise.all(ids.map((id) => orgCollection(scope.orgId, CRM_COLLECTIONS.pipelines).doc(id).get()))\n return new Map(\n snapshots\n .filter((snapshot) => snapshot.exists)\n .map((snapshot) => [snapshot.id, (snapshot.data() ?? {}) as CrmPipeline]),\n )\n}\n\n/** A record document the scope may read, or `null`. */\nasync function visibleDoc(scope: CrmFactsScope, collection: string, id: string): Promise<Data | null> {\n if (!id) return null\n const snapshot = await orgCollection(scope.orgId, collection).doc(id).get()\n const data = snapshot.exists ? ((snapshot.data() ?? {}) as Data) : null\n return data && scope.visible(data['visibleTo']) ? data : null\n}\n\nconst refused = (kind: CrmRecordFactsKind | 'import', status: 400 | 404 = 404): Refusal => ({\n ok: false,\n status,\n error: NOT_FOUND[kind],\n})\n\n/** A reader that admits the caller, then reads the record. */\nfunction reader(read: (scope: CrmFactsScope, request: PluginRecordFactsRequest) => Promise<PluginRecordFactsRead>): PluginRecordFactsReader {\n return {\n read: async (request) => {\n const scope = await crmFactsScope(request)\n if ('ok' in scope) return scope\n return read(scope, request)\n },\n }\n}\n\nexport const crmContactFactsReader = reader(async (scope, request) => {\n const id = String(request.id ?? '').trim()\n const row = await visibleDoc(scope, CONTACTS_COLLECTION, id)\n if (!row) return refused('contact')\n const group = scope.group ?? contactPrimaryGroup(row, scope.org)\n const naming = { field: 'contactId', id }\n const [activities, tasks, deals] = await Promise.all([\n rowsNaming<CrmActivity>(scope, { ...naming, collection: CRM_COLLECTIONS.activities, orderBy: 'atMs', direction: 'desc', limit: CRM_FACTS_ACTIVITIES_READ }),\n rowsNaming<CrmTask>(scope, { ...naming, collection: CRM_COLLECTIONS.tasks, orderBy: 'dueAtMs', direction: 'asc', limit: CRM_FACTS_TASKS_READ }),\n rowsNaming<CrmDeal>(scope, { ...naming, collection: CRM_COLLECTIONS.deals, orderBy: 'updatedAt', direction: 'desc', limit: CRM_FACTS_DEALS_READ }),\n ])\n const pipelines = await pipelinesFor(scope, deals)\n return {\n ok: true,\n facts: { ...contactFacts({ row, group, activities, tasks, deals, pipelines, nowMs: request.now.getTime() }) },\n }\n})\n\nexport const crmCompanyFactsReader = reader(async (scope, request) => {\n const id = String(request.id ?? '').trim()\n const company = await visibleDoc(scope, CRM_COLLECTIONS.companies, id)\n if (!company) return refused('company')\n const naming = { field: 'companyId', id }\n const [activities, tasks, deals] = await Promise.all([\n rowsNaming<CrmActivity>(scope, { ...naming, collection: CRM_COLLECTIONS.activities, orderBy: 'atMs', direction: 'desc', limit: CRM_FACTS_ACTIVITIES_READ }),\n rowsNaming<CrmTask>(scope, { ...naming, collection: CRM_COLLECTIONS.tasks, orderBy: 'dueAtMs', direction: 'asc', limit: CRM_FACTS_TASKS_READ }),\n rowsNaming<CrmDeal>(scope, { ...naming, collection: CRM_COLLECTIONS.deals, orderBy: 'updatedAt', direction: 'desc', limit: CRM_FACTS_DEALS_READ }),\n ])\n const pipelines = await pipelinesFor(scope, deals)\n return {\n ok: true,\n facts: {\n ...companyFacts({ company: company as Partial<CrmCompany>, activities, tasks, deals, pipelines, nowMs: request.now.getTime() }),\n },\n }\n})\n\nexport const crmDealFactsReader = reader(async (scope, request) => {\n const id = String(request.id ?? '').trim()\n const deal = (await visibleDoc(scope, CRM_COLLECTIONS.deals, id)) as (Partial<CrmDeal> & Data) | null\n if (!deal) return refused('deal')\n const naming = { field: 'dealId', id }\n const [activities, tasks, pipelines] = await Promise.all([\n rowsNaming<CrmActivity>(scope, { ...naming, collection: CRM_COLLECTIONS.activities, orderBy: 'atMs', direction: 'desc', limit: CRM_FACTS_ACTIVITIES_READ }),\n rowsNaming<CrmTask>(scope, { ...naming, collection: CRM_COLLECTIONS.tasks, orderBy: 'dueAtMs', direction: 'asc', limit: CRM_FACTS_TASKS_READ }),\n pipelinesFor(scope, [deal]),\n ])\n return {\n ok: true,\n facts: {\n ...dealFacts({\n deal,\n pipeline: pipelines.get(String(deal.pipelineId ?? '')) ?? null,\n activities,\n tasks,\n nowMs: request.now.getTime(),\n }),\n },\n }\n})\n\nexport const crmLeadFactsReader = reader(async (scope, request) => {\n if (!scope.hostId) return { ok: false, status: 400, error: CRM_FACTS_LEAD_NEEDS_SITE }\n const id = String(request.id ?? '').trim()\n if (!id) return refused('lead')\n const snapshot = await firestore().collection('hosts').doc(scope.hostId).collection('leads').doc(id).get()\n if (!snapshot.exists) return refused('lead')\n const activities = await rowsNaming<CrmActivity>(scope, {\n field: 'leadId',\n id,\n collection: CRM_COLLECTIONS.activities,\n orderBy: 'atMs',\n direction: 'desc',\n limit: CRM_FACTS_ACTIVITIES_READ,\n })\n return { ok: true, facts: { ...leadFacts({ lead: (snapshot.data() ?? {}) as Data, activities }) } }\n})\n\nexport const crmImportFactsReader = reader(async (scope, request) => {\n const collection = String(request.id ?? '').trim()\n if (!isCrmImportFactsCollection(collection)) return refused('import', 400)\n const snapshot = await orgCollection(scope.orgId, CRM_COLLECTIONS.contactFields)\n .limit(CRM_FACTS_FIELD_DEFINITIONS_READ)\n .get()\n const definitions = snapshot.docs\n .map((doc) => (doc.data() ?? {}) as Partial<ContactFieldDefinition> & Data)\n .filter((definition) => scope.visible(definition['visibleTo']))\n return { ok: true, facts: { ...importFacts(collection, definitions) } }\n})\n\n/** Every reader this plugin registers, by resource name. */\nexport const CRM_FACTS_READERS: Readonly<Record<string, PluginRecordFactsReader>> = {\n [CRM_RECORD_FACTS_RESOURCES.contact]: crmContactFactsReader,\n [CRM_RECORD_FACTS_RESOURCES.company]: crmCompanyFactsReader,\n [CRM_RECORD_FACTS_RESOURCES.deal]: crmDealFactsReader,\n [CRM_RECORD_FACTS_RESOURCES.lead]: crmLeadFactsReader,\n [CRM_IMPORT_FACTS_RESOURCE]: crmImportFactsReader,\n}\n\n/**\n * Registers the readers; the console surface calls it, the one process that\n * runs AI jobs (AGL-3026). Idempotent: a second call replaces the first.\n */\nexport function registerCrmRecordFactsReaders(): void {\n for (const [resource, factsReader] of Object.entries(CRM_FACTS_READERS)) {\n registerPluginRecordFactsReader(resource, factsReader, { pluginId: BUNDLE_ID })\n }\n}\n"],"names":["registerPluginRecordFactsReader","CRM_COLLECTIONS","contactPrimaryGroup","crmReadTokens","isOrgWideMember","consentGroupForSite","firebaseAdmin","getOrgDoc","memberHasOrgPermission","resolveOrgIdForHost","resolveOrgMembership","BUNDLE_ID","CRM_IMPORT_FACTS_RESOURCE","CRM_RECORD_FACTS_RESOURCES","companyFacts","contactFacts","dealFacts","importFacts","isCrmImportFactsCollection","leadFacts","crmSuiteRefusal","CONTACTS_COLLECTION","CRM_FACTS_ACTIVITIES_READ","CRM_FACTS_TASKS_READ","CRM_FACTS_DEALS_READ","CRM_FACTS_FIELD_DEFINITIONS_READ","CRM_FACTS_UNKNOWN_SITE","CRM_FACTS_NOT_A_MEMBER","CRM_FACTS_SITE_REFUSAL","CRM_FACTS_ORG_REFUSAL","CRM_FACTS_LEAD_NEEDS_SITE","NOT_FOUND","contact","company","deal","lead","import","firestore","app","crmFactsScope","request","orgId","String","trim","hostId","ok","status","error","staff","member","membership","uid","catch","reaches","Boolean","hostAccess","allowed","org","suite","body","group","visible","readable","Set","visibleTo","Array","isArray","some","token","has","orgCollection","name","collection","doc","rowsNaming","scope","input","snapshot","where","field","id","orderBy","direction","limit","get","docs","map","data","filter","row","pipelinesFor","deals","ids","pipelineId","snapshots","Promise","all","pipelines","Map","exists","visibleDoc","refused","kind","reader","read","crmContactFactsReader","naming","activities","tasks","facts","nowMs","now","getTime","crmCompanyFactsReader","companies","crmDealFactsReader","pipeline","crmLeadFactsReader","crmImportFactsReader","contactFields","definitions","definition","CRM_FACTS_READERS","registerCrmRecordFactsReaders","resource","factsReader","Object","entries","pluginId"],"mappings":"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"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * @license
3
+ * Copyright 2026 Aglyn LLC
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+ import { type PluginRecordTimelineWriter } from '@aglyn/aglyn/plugin-manager/plugin-record-timeline';
18
+ /**
19
+ * THE CRM'S WRITER ON THE CORE'S RECORD-TIMELINE SEAM (AGL-2981).
20
+ *
21
+ * Another plugin files an activity or a task on a contact, company or deal —
22
+ * an email a sequence sent, the reply it read, the call it asks for — and
23
+ * this writes it as the CRM writes its own:
24
+ *
25
+ * 1. the workspace's plan carries the CRM (`features.crm`), as at every
26
+ * CRM door; a Free workspace keeps no records to file on;
27
+ * 2. the entry carries the scope a record made on that site carries
28
+ * (`crmScopeTokens`), so exactly the people who see the record see it;
29
+ * 3. an EMAIL is filed under the id the capture address files a copy of the
30
+ * same message by (`cap_` + the digest of its `Message-ID`), and written
31
+ * with `create()`: the send, a copy the rep forwarded to the capture
32
+ * address, and a second run of the caller are one row;
33
+ * 4. anything else — a note, a task — is filed under the caller's own key,
34
+ * hashed with the caller's plugin id, and written once the same way;
35
+ * 5. a record at its activity ceiling is refused with the sentence every
36
+ * CRM writer answers with, before anything is written.
37
+ *
38
+ * Each entry names the plugin that filed it (`sourcePluginId`), and a task's
39
+ * `nextTaskAtMs` is recomputed on the records it names, as every server
40
+ * writer of a task does.
41
+ */
42
+ type Firestore = FirebaseFirestore.Firestore;
43
+ export interface CrmRecordTimelineDeps {
44
+ firestore(): Firestore;
45
+ }
46
+ export declare function createCrmRecordTimelineWriter(deps: CrmRecordTimelineDeps): PluginRecordTimelineWriter;
47
+ /** The platform's own dependencies. Specs build their own. */
48
+ export declare function defaultCrmRecordTimelineDeps(): CrmRecordTimelineDeps;
49
+ /** Registers the CRM as the workspace's record system on the timeline seam. */
50
+ export declare function registerCrmRecordTimelineWriter(deps?: CrmRecordTimelineDeps): void;
51
+ export {};
@@ -0,0 +1,215 @@
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 { registerPluginRecordTimelineWriter } from "@aglyn/aglyn/plugin-manager/plugin-record-timeline";
18
+ import { buildCrmCapturedEmailActivity, checkEntitlement, consentGroupForHost, CRM_ACTIVITY_LOG_FULL_MESSAGE, CRM_COLLECTIONS, crmActivityLogHasRoom, crmCapturedEmailKey, crmScopeTokens, crmTaskReminderAfterEdit, isCrmActivityKind, isCrmTaskKind } from "@aglyn/aglyn/server";
19
+ import { countCrmActivitiesForRecord, createCrmEmailActivity, crmActivityRef, crmCapturedEmailActivityRef, firebaseAdmin, recomputeCrmNextTaskAt } from "@aglyn/tenant-data-admin";
20
+ import { createHash } from "crypto";
21
+ import { FieldValue } from "firebase-admin/firestore";
22
+ import { BUNDLE_ID } from "../constants/bundle-common.js";
23
+ import { CRM_SUITE_FEATURE } from "./suite-gate.js";
24
+ /** gRPC `ALREADY_EXISTS`, which `create()` rejects with when the document is there. */ const ALREADY_EXISTS = 6;
25
+ /** The longest task title the CRM keeps, as its own forms do. */ const TASK_TITLE_MAX = 200;
26
+ /** The longest note body or task note an entry filed here keeps. */ const NOTE_MAX = 2000;
27
+ const refuse = (status, error)=>({
28
+ ok: false,
29
+ status,
30
+ error
31
+ });
32
+ /** The record fields of a link, only the ones it names. */ function linkFields(link) {
33
+ return _extends({}, (link == null ? void 0 : link.contactId) ? {
34
+ contactId: String(link.contactId)
35
+ } : {}, (link == null ? void 0 : link.companyId) ? {
36
+ companyId: String(link.companyId)
37
+ } : {}, (link == null ? void 0 : link.dealId) ? {
38
+ dealId: String(link.dealId)
39
+ } : {});
40
+ }
41
+ /** The document id a caller's key files under: its own namespace, never a raw key. */ function keyedId(sourcePluginId, key) {
42
+ return `plg_${createHash('sha256').update(`${sourcePluginId}:${key}`).digest('hex').slice(0, 28)}`;
43
+ }
44
+ export function createCrmRecordTimelineWriter(deps) {
45
+ /** The org, its plan, the link and the scope an entry is stamped with. */ async function admit(context) {
46
+ var _context_orgId, _context_hostId, _context_sourcePluginId, _snapshot_data;
47
+ const orgId = String((_context_orgId = context.orgId) != null ? _context_orgId : '').trim();
48
+ const hostId = String((_context_hostId = context.hostId) != null ? _context_hostId : '').trim();
49
+ const link = linkFields(context.link);
50
+ if (!orgId || !hostId || !String((_context_sourcePluginId = context.sourcePluginId) != null ? _context_sourcePluginId : '').trim()) {
51
+ return refuse(400, 'An entry names its organization, its site and the plugin filing it.');
52
+ }
53
+ if (!link.contactId && !link.companyId && !link.dealId) {
54
+ return refuse(400, 'An entry is filed on a contact, a company or a deal.');
55
+ }
56
+ const firestore = deps.firestore();
57
+ const orgRef = firestore.collection('orgs').doc(orgId);
58
+ const snapshot = await orgRef.get();
59
+ if (!snapshot.exists) return refuse(404, 'That organization no longer exists.');
60
+ const org = (_snapshot_data = snapshot.data()) != null ? _snapshot_data : {};
61
+ if (!checkEntitlement(org, CRM_SUITE_FEATURE)) {
62
+ return refuse(403, "This workspace's plan doesn't include the CRM.");
63
+ }
64
+ return {
65
+ firestore,
66
+ orgRef,
67
+ link,
68
+ visibleTo: crmScopeTokens(org, consentGroupForHost(org, hostId))
69
+ };
70
+ }
71
+ /** Creates a keyed entry once: `created: false` for one already filed. */ async function createOnce(ref, data) {
72
+ try {
73
+ await ref.create(_extends({}, data, {
74
+ createdAt: FieldValue.serverTimestamp(),
75
+ updatedAt: FieldValue.serverTimestamp()
76
+ }));
77
+ return true;
78
+ } catch (error) {
79
+ if ((error == null ? void 0 : error.code) === ALREADY_EXISTS) return false;
80
+ throw error;
81
+ }
82
+ }
83
+ return {
84
+ async logActivity (request) {
85
+ if (!isCrmActivityKind(request.kind)) return refuse(400, `"${String(request.kind)}" isn't an activity.`);
86
+ const admitted = await admit(request);
87
+ if ('ok' in admitted) return admitted;
88
+ const { firestore, orgRef, link, visibleTo } = admitted;
89
+ const orgId = orgRef.id;
90
+ let ref;
91
+ let activity;
92
+ if (request.kind === 'email') {
93
+ var _email_inReplyTo, _request_byUid, _request_byName;
94
+ const email = request.email;
95
+ const key = email ? crmCapturedEmailKey(email.messageId, null) : null;
96
+ if (!email || !key) return refuse(400, 'An email is filed by its Message-ID.');
97
+ ref = crmCapturedEmailActivityRef(firestore, orgId, key);
98
+ activity = buildCrmCapturedEmailActivity({
99
+ direction: email.direction === 'inbound' ? 'inbound' : 'outbound',
100
+ subject: email.subject,
101
+ excerpt: request.body,
102
+ from: email.from,
103
+ to: email.to,
104
+ messageId: email.messageId,
105
+ inReplyTo: (_email_inReplyTo = email.inReplyTo) != null ? _email_inReplyTo : null,
106
+ atMs: request.atMs,
107
+ byUid: String((_request_byUid = request.byUid) != null ? _request_byUid : ''),
108
+ byName: (_request_byName = request.byName) != null ? _request_byName : null,
109
+ link,
110
+ hostId: request.hostId,
111
+ visibleTo
112
+ });
113
+ } else {
114
+ var _request_dedupeKey, _request_byName1, _request_body, _request_byUid1;
115
+ const key = String((_request_dedupeKey = request.dedupeKey) != null ? _request_dedupeKey : '').trim();
116
+ if (!key) return refuse(400, 'An entry that is not an email names its own key.');
117
+ ref = crmActivityRef(firestore, orgId, keyedId(request.sourcePluginId, key));
118
+ const byName = String((_request_byName1 = request.byName) != null ? _request_byName1 : '').trim();
119
+ activity = _extends({
120
+ kind: request.kind,
121
+ body: String((_request_body = request.body) != null ? _request_body : '').slice(0, NOTE_MAX),
122
+ atMs: request.atMs,
123
+ byUid: String((_request_byUid1 = request.byUid) != null ? _request_byUid1 : '')
124
+ }, byName ? {
125
+ byName
126
+ } : {}, link, {
127
+ hostId: request.hostId,
128
+ visibleTo
129
+ });
130
+ }
131
+ // Filed before: answered off the one read, ahead of the ceiling's count.
132
+ if ((await ref.get()).exists) return {
133
+ ok: true,
134
+ id: ref.id,
135
+ created: false
136
+ };
137
+ if (!crmActivityLogHasRoom(await countCrmActivitiesForRecord(orgRef, link))) {
138
+ return refuse(409, CRM_ACTIVITY_LOG_FULL_MESSAGE);
139
+ }
140
+ const stamped = _extends({}, activity, {
141
+ sourcePluginId: request.sourcePluginId
142
+ });
143
+ const created = request.kind === 'email' ? await createCrmEmailActivity(ref, stamped) === 'created' : await createOnce(ref, stamped);
144
+ return {
145
+ ok: true,
146
+ id: ref.id,
147
+ created
148
+ };
149
+ },
150
+ async createTask (request) {
151
+ var _request_title, _request_dedupeKey, _request_notes, _request_assigneeUid, _request_createdByUid;
152
+ const title = String((_request_title = request.title) != null ? _request_title : '').replace(/\s+/g, ' ').trim().slice(0, TASK_TITLE_MAX);
153
+ const key = String((_request_dedupeKey = request.dedupeKey) != null ? _request_dedupeKey : '').trim();
154
+ if (!title || !key) return refuse(400, 'A task has a title and the caller’s own key.');
155
+ if (!isCrmTaskKind(request.kind)) return refuse(400, `"${String(request.kind)}" isn't a task.`);
156
+ if (!Number.isFinite(request.dueAtMs)) return refuse(400, 'A task has a due time.');
157
+ const admitted = await admit(request);
158
+ if ('ok' in admitted) return admitted;
159
+ const { firestore, orgRef, link, visibleTo } = admitted;
160
+ const ref = orgRef.collection(CRM_COLLECTIONS.tasks).doc(keyedId(request.sourcePluginId, key));
161
+ const notes = String((_request_notes = request.notes) != null ? _request_notes : '').trim().slice(0, NOTE_MAX);
162
+ const assigneeUid = String((_request_assigneeUid = request.assigneeUid) != null ? _request_assigneeUid : '').trim();
163
+ const task = _extends({
164
+ title
165
+ }, notes ? {
166
+ notes
167
+ } : {}, {
168
+ kind: request.kind,
169
+ priority: 'normal',
170
+ status: 'open',
171
+ dueAtMs: request.dueAtMs,
172
+ // The reminder a person's task gets (AGL-2659): the due time.
173
+ remindAtMs: crmTaskReminderAfterEdit({
174
+ dueAtMs: request.dueAtMs,
175
+ previous: null
176
+ })
177
+ }, assigneeUid ? {
178
+ assigneeUid
179
+ } : {}, {
180
+ createdByUid: String((_request_createdByUid = request.createdByUid) != null ? _request_createdByUid : ''),
181
+ sourcePluginId: request.sourcePluginId
182
+ }, link, {
183
+ hostId: request.hostId,
184
+ visibleTo
185
+ });
186
+ const created = await createOnce(ref, task);
187
+ if (created) {
188
+ // The records the task names carry `nextTaskAtMs` (AGL-2661); a figure
189
+ // that could not move is the Fields section's recompute's.
190
+ await recomputeCrmNextTaskAt(firestore, orgRef.id, [
191
+ link
192
+ ]).catch((error)=>{
193
+ console.error('[crm] next activity could not be recomputed', orgRef.id, error);
194
+ });
195
+ }
196
+ return {
197
+ ok: true,
198
+ id: ref.id,
199
+ created
200
+ };
201
+ }
202
+ };
203
+ }
204
+ /** The platform's own dependencies. Specs build their own. */ export function defaultCrmRecordTimelineDeps() {
205
+ return {
206
+ firestore: ()=>firebaseAdmin.app().firestore()
207
+ };
208
+ }
209
+ /** Registers the CRM as the workspace's record system on the timeline seam. */ export function registerCrmRecordTimelineWriter(deps = defaultCrmRecordTimelineDeps()) {
210
+ registerPluginRecordTimelineWriter(createCrmRecordTimelineWriter(deps), {
211
+ pluginId: BUNDLE_ID
212
+ });
213
+ }
214
+
215
+ //# sourceMappingURL=record-timeline.js.map