@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,615 @@
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
+ */ /**
18
+ * The Contacts plugin's SERVER half (AGL-2595).
19
+ *
20
+ * Contacts CRM v1 had none: every console write was client-direct against
21
+ * the Firestore rules, and the one server path that creates a contact —
22
+ * `upsertHostContact` — belongs to the capture doors, not to this plugin.
23
+ * v2 needs a server for the things a browser must not do alone: an import
24
+ * that dedupes forty thousand rows, a bulk action over a selection, an
25
+ * auto-association of contacts to companies by domain. Each of those lands
26
+ * as a `crm/<route>` handler registered here.
27
+ *
28
+ * `crm/ping` exists so the wiring is PROVEN rather than assumed:
29
+ * `plugins.config.json` names this module's register function and the
30
+ * `crm` API prefix, the generated server manifest loads this file, and the
31
+ * console's `/api/[...pluginApi]` dispatcher reaches the handler. A plugin
32
+ * whose first real route also had to be its first wiring test would have
33
+ * two things to debug at once.
34
+ *
35
+ * The real routes are the writes with a side effect outside the document:
36
+ * `crm/contact-stage` (AGL-2605) exists for the EVENT — `contactStageChanged`
37
+ * can only be emitted by a server path that performed the write, so a record
38
+ * page that moved the stage client-direct would move the person and tell no
39
+ * automation; the task routes (AGL-2599) carry an assignee's notification and
40
+ * the `taskCompleted` event; `crm/contacts-import` (AGL-2602) pushes one chunk
41
+ * of a file through the same capture door every other server door uses.
42
+ * `crm/deal-stage` (AGL-2598) is the one writer of a deal's stage, won and lost,
43
+ * because a stage change is what automations listen for (`server-deal-stage.ts`).
44
+ * `crm/contacts-create` (AGL-2596) is a person typed into the console by a
45
+ * member of the team — a server route because the dedupe against every
46
+ * holder's rows and the audience band are judgments the browser cannot make.
47
+ * `crm/contact-update` (AGL-2804) is every other write to a contact's facets:
48
+ * the rules cannot tell one field of a holder's facet from another, so they
49
+ * leave a client nothing there but letting a holder go, and the plan is
50
+ * asked here about the fields a save carries.
51
+ */ import { CONTACT_ERASED_MESSAGE, contactFacetPath, CRM_COLLECTIONS, crmReadTokens, isContactLifecycleStage, isOrgWideMember, normalizeAddress, normalizeContactEmail, normalizePhone, readContactFacet, registerPluginApiRoute, visibleToHost } from "@aglyn/aglyn/server";
52
+ import { consentGroupForSite, firebaseAdmin, getOrgForHost, logHostActivity, memberHasOrgPermission, orgDataCollectionForHost, resolveOrgMembership } from "@aglyn/tenant-data-admin";
53
+ import { isRefusedIdToken } from "@aglyn/tenant-data-admin/server/id-token-refusal";
54
+ import { captureHostContact, emitHostEvent } from "@aglyn/tenant-runtime";
55
+ import { FieldValue } from "firebase-admin/firestore";
56
+ import { CRM_API_ROUTES } from "./constants/api-routes.js";
57
+ import { BUNDLE_ID } from "./constants/bundle-common.js";
58
+ import { CRM_NEXT_ACTIVITY_ROUTE } from "./model/next-activity.js";
59
+ import { CRM_TASK_ROUTES } from "./model/task-routes.js";
60
+ import { crmNextActivityHandler } from "./server/next-activity-routes.js";
61
+ import { registerCrmRecordTimelineWriter } from "./server/record-timeline.js";
62
+ import { crmTaskCompleteHandler, crmTaskSaveHandler } from "./server/task-routes.js";
63
+ import { crmCompaniesImportHandler } from "./server/companies-import.js";
64
+ import { crmContactsImportHandler } from "./server/contacts-import.js";
65
+ import { crmDealsImportHandler } from "./server/deals-import.js";
66
+ import { crmLeadsImportHandler } from "./server/leads-import.js";
67
+ import { crmTasksImportHandler } from "./server/tasks-import.js";
68
+ import { crmDealStageHandler } from "./server-deal-stage.js";
69
+ import { crmEmailSendHandler } from "./server/email-send.js";
70
+ import { leadConvertHandler } from "./server/lead-convert.js";
71
+ import { CONTACT_EMAIL_HISTORY_ROUTE, contactEmailHistoryHandler } from "./server/contact-email-history.js";
72
+ import { CONTACTS_MERGE_ROUTE, contactsMergeHandler } from "./server/contacts-merge.js";
73
+ import { CRM_ERASE_PERSON_ROUTE, crmErasePersonHandler } from "./server/erase-person.js";
74
+ import { CRM_ORG_ACTIVITY_ROUTE, crmOrgActivityHandler } from "./server/org-activity.js";
75
+ import { CRM_INBOUND_ADDRESS_ROUTE, crmInboundAddressHandler } from "./server/inbound-address.js";
76
+ import { crmCompanyDeleteHandler } from "./server/company-delete.js";
77
+ import { CONTACT_PHONE_REFUSAL, normalizeTags, typed } from "./server/contact-profile.js";
78
+ import { crmContactUpdateHandler } from "./server/contact-update.js";
79
+ import { CRM_EMAIL_TEMPLATE_DUPLICATE_ROUTE, crmEmailTemplateDuplicateHandler } from "./server/email-template-duplicate.js";
80
+ import { registerCrmRecordFactsReaders } from "./server/record-facts.js";
81
+ import { crmSuiteRefusal } from "./server/suite-gate.js";
82
+ import { CRM_RECIPE_INSTALL_ROUTE, CRM_RECIPE_STATUS_ROUTE, crmRecipeInstallHandler, crmRecipeStatusHandler } from "./server/recipe-routes.js";
83
+ /**
84
+ * `GET /api/crm/ping` → `{ ok: true, plugin: 'crm' }`.
85
+ *
86
+ * No auth, no host, no data: it answers whether the plugin's server bundle
87
+ * was loaded and its routes registered, which is a fact about the process
88
+ * and not about any org. Anything that reads a document goes behind the
89
+ * same session and role checks the other plugins' console routes use.
90
+ */ export const crmPingHandler = (req, res)=>{
91
+ if (req.method !== 'GET') {
92
+ res.setHeader('Allow', 'GET');
93
+ res.status(405).json({
94
+ error: 'Method not allowed'
95
+ });
96
+ return;
97
+ }
98
+ res.status(200).json({
99
+ ok: true,
100
+ plugin: BUNDLE_ID
101
+ });
102
+ };
103
+ /**
104
+ * Who is calling, and whether they may edit this site's CRM.
105
+ *
106
+ * The same check the inbox, bookings and email console routes make: a
107
+ * bearer ID token, verified, and an `admin` or `editor` role on the host
108
+ * document. A contact is a site's business record, so the site's own role
109
+ * map is the right authority; org-wide reach is not required, because a
110
+ * site editor who can open the record in the console can already write
111
+ * every other field on it client-direct.
112
+ */ async function authorizeSiteEditor(req, hostId) {
113
+ var _req_headers_authorization, _hostSnapshot_get;
114
+ const authorization = String((_req_headers_authorization = req.headers.authorization) != null ? _req_headers_authorization : '');
115
+ const idToken = authorization.startsWith('Bearer ') ? authorization.slice('Bearer '.length) : undefined;
116
+ if (!idToken) return {
117
+ ok: false,
118
+ status: 401,
119
+ error: 'Unauthenticated'
120
+ };
121
+ let uid;
122
+ try {
123
+ uid = (await firebaseAdmin.app().auth().verifyIdToken(idToken)).uid;
124
+ } catch (error) {
125
+ // A refused credential is the caller's 401; a failure to check one is
126
+ // ours and keeps a 5xx (AGL-2852).
127
+ if (isRefusedIdToken(error)) return {
128
+ ok: false,
129
+ status: 401,
130
+ error: 'Unauthenticated'
131
+ };
132
+ console.error('[crm] the site editor could not be verified', error);
133
+ return {
134
+ ok: false,
135
+ status: 500,
136
+ error: 'The sign-in could not be checked. Try again.'
137
+ };
138
+ }
139
+ const hostSnapshot = await firebaseAdmin.app().firestore().collection('hosts').doc(hostId).get();
140
+ if (!hostSnapshot.exists) {
141
+ return {
142
+ ok: false,
143
+ status: 404,
144
+ error: 'Unknown site'
145
+ };
146
+ }
147
+ const memberRole = ((_hostSnapshot_get = hostSnapshot.get('memberRoles')) != null ? _hostSnapshot_get : {})[uid];
148
+ if (memberRole !== 'admin' && memberRole !== 'editor') {
149
+ return {
150
+ ok: false,
151
+ status: 403,
152
+ error: 'Not a site admin or editor'
153
+ };
154
+ }
155
+ return {
156
+ ok: true,
157
+ uid
158
+ };
159
+ }
160
+ /**
161
+ * `POST /api/crm/contact-stage` with `{ hostId, contactId, lifecycleStage }`.
162
+ *
163
+ * Writes the stage into THIS site's facet on the contact — a dotted
164
+ * `update()`, never a top-level field, because the row is shared by every
165
+ * site in the org and a stage is one holder's reading of the person — and
166
+ * then announces `contactStageChanged` with the stage it replaced.
167
+ *
168
+ * A stage set to what it already is writes nothing and announces nothing:
169
+ * the response says `changed: false`, and no automation listening for a
170
+ * change hears one that did not happen.
171
+ *
172
+ * `lifecycleStage: null` CLEARS the stage (AGL-2804). A facet is the
173
+ * server's to write, so "not placed yet" comes through the route that owns
174
+ * the stage rather than as a client-direct delete, and it is refused to a
175
+ * plan without the suite the way a move is. There is no event for "no
176
+ * stage", so a clear announces nothing; an empty string names no stage and
177
+ * is refused like any other the list does not have.
178
+ *
179
+ * The contact is looked up by id and then checked against `visibleTo`,
180
+ * because the Admin SDK evaluates no rules: a caller who can edit site A
181
+ * must not be able to restage a contact only site B holds by guessing its
182
+ * id, and the scoped query the list uses is not available to a `doc()` read.
183
+ */ export const contactStageHandler = async (req, res)=>{
184
+ var _ref, _ref1;
185
+ var _req_body, _req_body1, _req_body2;
186
+ if (req.method !== 'POST') {
187
+ res.setHeader('Allow', 'POST');
188
+ res.status(405).json({
189
+ error: 'Method not allowed'
190
+ });
191
+ return;
192
+ }
193
+ const hostId = String((_ref = (_req_body = req.body) == null ? void 0 : _req_body.hostId) != null ? _ref : '').trim();
194
+ const contactId = String((_ref1 = (_req_body1 = req.body) == null ? void 0 : _req_body1.contactId) != null ? _ref1 : '').trim();
195
+ const requested = (_req_body2 = req.body) == null ? void 0 : _req_body2.lifecycleStage;
196
+ if (!hostId || !contactId) {
197
+ res.status(400).json({
198
+ error: 'Missing hostId or contactId'
199
+ });
200
+ return;
201
+ }
202
+ // `null` clears the stage; anything else has to be one of the list's.
203
+ const clearing = requested === null;
204
+ const lifecycleStage = clearing ? '' : isContactLifecycleStage(requested) ? requested : null;
205
+ if (lifecycleStage === null) {
206
+ res.status(400).json({
207
+ error: 'Pick a lifecycle stage'
208
+ });
209
+ return;
210
+ }
211
+ const caller = await authorizeSiteEditor(req, hostId);
212
+ if (caller.ok === false) {
213
+ res.status(caller.status).json({
214
+ error: caller.error
215
+ });
216
+ return;
217
+ }
218
+ try {
219
+ var _facet_lifecycleStage;
220
+ // A lifecycle stage is the suite's (AGL-2787) — see `suite-gate.ts`.
221
+ const owner = await getOrgForHost(hostId);
222
+ if (!owner) {
223
+ res.status(404).json({
224
+ error: 'Unknown site'
225
+ });
226
+ return;
227
+ }
228
+ const suite = crmSuiteRefusal(owner.org, "Moving a contact's lifecycle stage");
229
+ if (suite) {
230
+ res.status(suite.status).json(suite.body);
231
+ return;
232
+ }
233
+ const contactsRef = await orgDataCollectionForHost(hostId, 'contacts');
234
+ const snapshot = await contactsRef.doc(contactId).get();
235
+ if (!snapshot.exists || !visibleToHost(snapshot.get('visibleTo'), hostId)) {
236
+ res.status(404).json({
237
+ error: 'Unknown contact'
238
+ });
239
+ return;
240
+ }
241
+ const group = await consentGroupForSite(hostId);
242
+ const facet = readContactFacet(snapshot.data(), group.groupId);
243
+ const previousStage = (_facet_lifecycleStage = facet.lifecycleStage) != null ? _facet_lifecycleStage : '';
244
+ if (previousStage === lifecycleStage) {
245
+ res.status(200).json({
246
+ ok: true,
247
+ changed: false,
248
+ lifecycleStage,
249
+ previousStage
250
+ });
251
+ return;
252
+ }
253
+ await snapshot.ref.update({
254
+ [contactFacetPath(group.groupId, 'lifecycleStage')]: clearing ? FieldValue.delete() : lifecycleStage,
255
+ updatedAt: FieldValue.serverTimestamp()
256
+ });
257
+ // Awaited, not floated: a serverless response ending cancels in-flight
258
+ // work, and the event is the reason this route exists. A clear has none.
259
+ if (!clearing) {
260
+ var _snapshot_get;
261
+ await emitHostEvent(hostId, 'contactStageChanged', {
262
+ contactId,
263
+ email: String((_snapshot_get = snapshot.get('email')) != null ? _snapshot_get : ''),
264
+ lifecycleStage,
265
+ previousStage
266
+ });
267
+ }
268
+ res.status(200).json({
269
+ ok: true,
270
+ changed: true,
271
+ lifecycleStage,
272
+ previousStage
273
+ });
274
+ } catch (error) {
275
+ console.error('[crm] contact-stage failed', hostId, contactId, error);
276
+ res.status(500).json({
277
+ error: 'The stage could not be changed'
278
+ });
279
+ }
280
+ };
281
+ /**
282
+ * What the create route says when the band refused (AGL-2596).
283
+ *
284
+ * The contacts list's own alert, in the past tense: the list says new
285
+ * visitors are "no longer captured", and this says the one contact the
286
+ * reader just tried to add was not. The remedy is the same sentence in both
287
+ * places, so a reader who sees one and then the other is told one thing.
288
+ */ export const CONTACT_BAND_FULL_MESSAGE = 'Contact limit reached — this contact was not added. Upgrade in Billing ' + 'to keep collecting.';
289
+ /**
290
+ * `POST /api/crm/contacts-create` — a person added by hand (AGL-2596).
291
+ *
292
+ * Body: `{ hostId, email, name?, phone?, jobTitle?, companyName?,
293
+ * companyId?, address?, ownerUid?, lifecycleStage?, tags?,
294
+ * marketingConsent? }`. Answers `{ contactId, created }`: `created` is
295
+ * false when the address already belonged to somebody, in which case what
296
+ * was typed MERGES into the existing row — the dedupe the shared address
297
+ * book exists for, and the reason a second "create" of one person is not
298
+ * an error.
299
+ *
300
+ * ## Who may call it
301
+ *
302
+ * The caller's ID token, then `data.manage` on the site's org — the same key
303
+ * the console surface itself is gated on, resolved through the same
304
+ * three-layer permission read the members route uses. A scoped member is
305
+ * admitted only for a site they reach: the rules would refuse a browser
306
+ * write outside their tokens, and a server route that admitted it would be
307
+ * a way round the rules rather than a service in front of them.
308
+ *
309
+ * ## What it refuses, and how
310
+ *
311
+ * A malformed email or phone number is a 400 with a sentence the drawer can
312
+ * show under the field. The band is a 409 carrying the list's own wording:
313
+ * it is not a bad request and not a server fault, it is the plan saying no,
314
+ * and the drawer relays the sentence rather than inventing one.
315
+ *
316
+ * ## The company (AGL-2613)
317
+ *
318
+ * `companyId` is the picker's choice, and it is checked before anything is
319
+ * written: the company has to exist and be visible to the capturing site's
320
+ * scope, or a caller could file a person under a record they cannot open —
321
+ * the same refusal the lead conversion makes. It reaches the upsert as
322
+ * `facet.companyId`, which is where the link is kept in step with its mirror
323
+ * and the company's contacts count; a merge onto somebody already at another
324
+ * company is a MOVE there, not a second link. The stored company's own name
325
+ * is what is echoed, over whatever the client sent, because the name on the
326
+ * record is the company's and not the form's.
327
+ *
328
+ * ## What it writes beyond the upsert
329
+ *
330
+ * `upsertHostContact` takes the profile — phone, title, address, owner,
331
+ * stage, company — and writes it into the capturing group's facet. The two
332
+ * things it does not take are written here by DOTTED path afterwards: the
333
+ * tags, which union into whatever the person already carried, and the
334
+ * company name — the picked company's, or free text for a person filed
335
+ * under a name no company record carries yet. Dotted paths because this is
336
+ * an `update()`, and only an update reads a dot as a path — a nested object
337
+ * here would replace the facet map and take every other holder's records
338
+ * with it.
339
+ */ export const crmContactsCreateHandler = async (req, res)=>{
340
+ var _req_body, _req_headers_authorization;
341
+ if (req.method !== 'POST') {
342
+ res.setHeader('Allow', 'POST');
343
+ res.status(405).json({
344
+ error: 'Method not allowed'
345
+ });
346
+ return;
347
+ }
348
+ const body = (_req_body = req.body) != null ? _req_body : {};
349
+ const hostId = typed(body['hostId'], 128);
350
+ if (!hostId) {
351
+ res.status(400).json({
352
+ error: 'Missing hostId'
353
+ });
354
+ return;
355
+ }
356
+ const email = normalizeContactEmail(body['email']);
357
+ if (!email) {
358
+ res.status(400).json({
359
+ error: 'Enter a valid email address.'
360
+ });
361
+ return;
362
+ }
363
+ const rawPhone = typed(body['phone'], 40);
364
+ const phone = rawPhone ? normalizePhone(rawPhone) : null;
365
+ if (rawPhone && !phone) {
366
+ res.status(400).json({
367
+ error: CONTACT_PHONE_REFUSAL
368
+ });
369
+ return;
370
+ }
371
+ const rawStage = typed(body['lifecycleStage'], 40);
372
+ if (rawStage && !isContactLifecycleStage(rawStage)) {
373
+ res.status(400).json({
374
+ error: 'Unknown lifecycle stage.'
375
+ });
376
+ return;
377
+ }
378
+ const name = typed(body['name'], 120);
379
+ const jobTitle = typed(body['jobTitle'], 120);
380
+ let companyName = typed(body['companyName'], 120);
381
+ const companyId = typed(body['companyId'], 128);
382
+ const ownerUid = typed(body['ownerUid'], 128);
383
+ const address = body['address'] && typeof body['address'] === 'object' ? normalizeAddress(body['address']) : null;
384
+ const tags = normalizeTags(body['tags']);
385
+ const marketingConsent = body['marketingConsent'] === true;
386
+ const authorization = String((_req_headers_authorization = req.headers.authorization) != null ? _req_headers_authorization : '');
387
+ const idToken = authorization.startsWith('Bearer ') ? authorization.slice('Bearer '.length) : undefined;
388
+ if (!idToken) {
389
+ res.status(401).json({
390
+ error: 'Unauthenticated'
391
+ });
392
+ return;
393
+ }
394
+ try {
395
+ var _decoded_email;
396
+ const decoded = await firebaseAdmin.app().auth().verifyIdToken(idToken);
397
+ const resolved = await getOrgForHost(hostId);
398
+ if (!resolved) {
399
+ res.status(404).json({
400
+ error: 'Unknown site'
401
+ });
402
+ return;
403
+ }
404
+ const isStaff = decoded['staff'] === true;
405
+ if (!isStaff) {
406
+ var _ref;
407
+ var _member_hostAccess;
408
+ const membership = await resolveOrgMembership(decoded.uid, resolved.orgId);
409
+ const member = (_ref = membership == null ? void 0 : membership.member) != null ? _ref : null;
410
+ const reaches = isOrgWideMember(member) || Boolean(member == null ? void 0 : (_member_hostAccess = member.hostAccess) == null ? void 0 : _member_hostAccess[hostId]);
411
+ const allowed = member && reaches && await memberHasOrgPermission(resolved.orgId, member, 'data.manage');
412
+ if (!allowed) {
413
+ res.status(403).json({
414
+ error: 'Adding contacts requires the data.manage permission on this site'
415
+ });
416
+ return;
417
+ }
418
+ }
419
+ // A person typed in by the team is the suite's; the capture doors that
420
+ // fill a Free workspace's contacts do not come through here (AGL-2787).
421
+ const suite = crmSuiteRefusal(resolved.org, 'Adding a contact by hand');
422
+ if (suite) {
423
+ res.status(suite.status).json(suite.body);
424
+ return;
425
+ }
426
+ if (companyId) {
427
+ const group = await consentGroupForSite(hostId, resolved.org);
428
+ const readable = new Set(crmReadTokens(group));
429
+ const companySnapshot = await firebaseAdmin.app().firestore().collection('orgs').doc(resolved.orgId).collection(CRM_COLLECTIONS.companies).doc(companyId).get();
430
+ const tokens = companySnapshot.exists ? companySnapshot.get('visibleTo') : undefined;
431
+ const visible = Array.isArray(tokens) && tokens.some((token)=>readable.has(String(token)));
432
+ if (!visible) {
433
+ res.status(404).json({
434
+ error: 'Unknown company'
435
+ });
436
+ return;
437
+ }
438
+ companyName = typed(companySnapshot.get('name'), 120) || companyName;
439
+ }
440
+ const result = await captureHostContact(_extends({
441
+ hostId,
442
+ email
443
+ }, name ? {
444
+ name
445
+ } : {}, {
446
+ source: 'manual',
447
+ interaction: {
448
+ summary: 'Added by hand'
449
+ },
450
+ marketingConsent,
451
+ facet: _extends({}, phone ? {
452
+ phone
453
+ } : {}, jobTitle ? {
454
+ jobTitle
455
+ } : {}, companyId ? {
456
+ companyId
457
+ } : {}, address ? {
458
+ address
459
+ } : {}, ownerUid ? {
460
+ ownerUid
461
+ } : {}, rawStage && isContactLifecycleStage(rawStage) ? {
462
+ lifecycleStage: rawStage
463
+ } : {})
464
+ }));
465
+ if ('refused' in result) {
466
+ if (result.refused === 'band') {
467
+ res.status(409).json({
468
+ error: CONTACT_BAND_FULL_MESSAGE,
469
+ reason: 'band'
470
+ });
471
+ return;
472
+ }
473
+ if (result.refused === 'invalid-email') {
474
+ res.status(400).json({
475
+ error: 'Enter a valid email address.'
476
+ });
477
+ return;
478
+ }
479
+ // The person was erased from this workspace (AGL-2623). A conflict,
480
+ // like the band: the request was well-formed and the answer is a
481
+ // standing fact about the address, not a fault in the call.
482
+ if (result.refused === 'erased') {
483
+ res.status(409).json({
484
+ error: CONTACT_ERASED_MESSAGE,
485
+ reason: 'erased'
486
+ });
487
+ return;
488
+ }
489
+ res.status(500).json({
490
+ error: 'The contact could not be saved.'
491
+ });
492
+ return;
493
+ }
494
+ if (tags.length || companyName) {
495
+ const group = await consentGroupForSite(hostId, resolved.org);
496
+ const contacts = await orgDataCollectionForHost(hostId, 'contacts');
497
+ await contacts.doc(result.contactId).update(_extends({}, tags.length ? {
498
+ [contactFacetPath(group.groupId, 'tags')]: FieldValue.arrayUnion(...tags)
499
+ } : {}, companyName ? {
500
+ [contactFacetPath(group.groupId, 'companyName')]: companyName,
501
+ // The search echo — see `HostContact.companyName`.
502
+ companyName
503
+ } : {}, {
504
+ updatedAt: FieldValue.serverTimestamp()
505
+ }));
506
+ }
507
+ /*
508
+ * The audit line, written HERE rather than by the console (AGL-2622):
509
+ * a route that verified the caller and performed the write is the one
510
+ * writer that cannot record an act that did not happen, which is the
511
+ * reason `check-activity-coverage.mjs` counts this file. A merge into
512
+ * a person the org already held is said to be one — the row was
513
+ * updated, not added — so the feed cannot claim two people for one.
514
+ */ await logHostActivity(hostId, {
515
+ uid: decoded.uid,
516
+ email: (_decoded_email = decoded.email) != null ? _decoded_email : null
517
+ }, result.created ? 'Added contact' : 'Updated contact', {
518
+ type: 'contact',
519
+ id: result.contactId,
520
+ name: name || email
521
+ });
522
+ res.status(result.created ? 201 : 200).json({
523
+ contactId: result.contactId,
524
+ created: result.created
525
+ });
526
+ } catch (error) {
527
+ console.error('[crm] contact create failed', error);
528
+ res.status(500).json({
529
+ error: 'The contact could not be saved.'
530
+ });
531
+ }
532
+ };
533
+ /** Console API registration, named in `plugins.config.json` as `consoleApi`. */ export function registerCrmConsoleApi() {
534
+ registerPluginApiRoute(CRM_API_ROUTES.ping, crmPingHandler);
535
+ registerPluginApiRoute(CRM_API_ROUTES.contactStage, contactStageHandler);
536
+ // Every other console write to a contact's facets (AGL-2804): the rules
537
+ // cannot tell one facet field from another, so the plan is asked here.
538
+ registerPluginApiRoute(CRM_API_ROUTES.contactUpdate, crmContactUpdateHandler);
539
+ // A company's contacts unlinked, then the company (AGL-2804): the unlink
540
+ // clears a facet, which is the server's to write.
541
+ registerPluginApiRoute(CRM_API_ROUTES.companyDelete, crmCompanyDeleteHandler);
542
+ // Tasks (AGL-2599): the two writes with a side effect outside the document
543
+ // — an assignee's notification, and the `taskCompleted` host event.
544
+ registerPluginApiRoute(CRM_TASK_ROUTES.save, crmTaskSaveHandler);
545
+ registerPluginApiRoute(CRM_TASK_ROUTES.complete, crmTaskCompleteHandler);
546
+ // A client-direct task write's door to `nextTaskAtMs` (AGL-2661).
547
+ registerPluginApiRoute(CRM_NEXT_ACTIVITY_ROUTE, crmNextActivityHandler);
548
+ // One chunk of a contact file (AGL-2602), judged and written through the
549
+ // same door every capture uses.
550
+ registerPluginApiRoute('crm/contacts-import', crmContactsImportHandler);
551
+ // One chunk of a companies file (AGL-2621), matched by domain then name
552
+ // and written with the stamp every CRM creator writes.
553
+ registerPluginApiRoute('crm/companies-import', crmCompaniesImportHandler);
554
+ // One chunk of a deals file and one of a tasks file (AGL-2662): the
555
+ // pipeline, the stage and the assignee resolved by name, a row refused
556
+ // when the org has no such name.
557
+ registerPluginApiRoute('crm/deals-import', crmDealsImportHandler);
558
+ registerPluginApiRoute('crm/tasks-import', crmTasksImportHandler);
559
+ // One chunk of a leads file (AGL-2701), written through `addHostLead` —
560
+ // the same door a sign-up, a booking and a form submission file a lead
561
+ // through, so an imported row is keyed, bounded and unconsented exactly
562
+ // as a captured one is.
563
+ registerPluginApiRoute('crm/leads-import', crmLeadsImportHandler);
564
+ // The one writer of a deal's stage, won and lost (AGL-2598): the browser
565
+ // could write the field, but only a server can emit the event an
566
+ // automation listens for.
567
+ registerPluginApiRoute('crm/deal-stage', crmDealStageHandler);
568
+ // A person typed into the console (AGL-2596): the capture doors' own
569
+ // function behind a session check, so the dedupe and the band are judged
570
+ // where every other door judges them.
571
+ registerPluginApiRoute('crm/contacts-create', crmContactsCreateHandler);
572
+ // A lead becomes a contact, a company and a deal (AGL-2608) — the one CRM
573
+ // write a browser cannot make alone, because only the server may create a
574
+ // contact through the dedupe-and-meter door.
575
+ registerPluginApiRoute('crm/lead-convert', leadConvertHandler);
576
+ // The one READ behind a route (AGL-2616): the per-recipient delivery log
577
+ // is closed to clients, so a contact's campaign mail is projected here.
578
+ registerPluginApiRoute(CONTACT_EMAIL_HISTORY_ROUTE, contactEmailHistoryHandler);
579
+ // One email to one person from their record (AGL-2615): the recipient is
580
+ // read off the record, the daily cap and both suppression lists are
581
+ // judged, and the message leaves on the site's sending identity.
582
+ registerPluginApiRoute(CRM_API_ROUTES.emailSend, crmEmailSendHandler);
583
+ // Two records for one person become one (AGL-2625): the repoint of every
584
+ // row naming the merged record and the transaction over both documents
585
+ // are the server's, and the address index it writes is closed to clients.
586
+ registerPluginApiRoute(CONTACTS_MERGE_ROUTE, contactsMergeHandler);
587
+ // Files a person's privacy erasure for the daily job (AGL-2623);
588
+ // workspace admins only.
589
+ registerPluginApiRoute(CRM_ERASE_PERSON_ROUTE, crmErasePersonHandler);
590
+ // One line in the organization's activity feed for an act the org-level
591
+ // hub performed client-direct (AGL-2634): the feed is closed to clients,
592
+ // so the bulk bars' lines come through here.
593
+ registerPluginApiRoute(CRM_ORG_ACTIVITY_ROUTE, crmOrgActivityHandler);
594
+ // A recipe's action written into one site's automations from the org
595
+ // hub (AGL-2639), stamped and deduplicated by the server, and the stamps
596
+ // read back per site so the hub can say which sites carry which recipe.
597
+ registerPluginApiRoute(CRM_RECIPE_INSTALL_ROUTE, crmRecipeInstallHandler);
598
+ registerPluginApiRoute(CRM_RECIPE_STATUS_ROUTE, crmRecipeStatusHandler);
599
+ // The workspace's email capture address (AGL-2657): the token is minted
600
+ // and rotated here, behind the CRM's own gate, and the org document that
601
+ // carries it is closed to every client.
602
+ registerPluginApiRoute(CRM_INBOUND_ADDRESS_ROUTE, crmInboundAddressHandler);
603
+ registerPluginApiRoute(CRM_EMAIL_TEMPLATE_DUPLICATE_ROUTE, crmEmailTemplateDuplicateHandler);
604
+ // The facts of a contact, company, deal or lead, and an import's field
605
+ // catalog, for another plugin in this process (AGL-2917): read on the core's
606
+ // record-facts seam under the rules every CRM door applies, and written
607
+ // nowhere.
608
+ registerCrmRecordFactsReaders();
609
+ // The CRM as the workspace's record system on the core's record-timeline
610
+ // seam (AGL-2981): another plugin files an email, a reply or a task on a
611
+ // record through it, under the CRM's own scope, dedupe and ceiling.
612
+ registerCrmRecordTimelineWriter();
613
+ }
614
+
615
+ //# sourceMappingURL=server.js.map