@kelpie/server 0.7.0 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (679) hide show
  1. package/dist/lib/consumerEmailDomains.d.ts +2 -0
  2. package/dist/lib/consumerEmailDomains.d.ts.map +1 -0
  3. package/dist/lib/consumerEmailDomains.js +62 -0
  4. package/dist/lib/consumerEmailDomains.js.map +1 -0
  5. package/dist/lib/email.d.ts +7 -0
  6. package/dist/lib/email.d.ts.map +1 -1
  7. package/dist/lib/email.js.map +1 -1
  8. package/dist/lib/emailContent.d.ts +33 -0
  9. package/dist/lib/emailContent.d.ts.map +1 -0
  10. package/dist/lib/emailContent.js +54 -0
  11. package/dist/lib/emailContent.js.map +1 -0
  12. package/dist/lib/emailDomainAutoLink.d.ts +27 -0
  13. package/dist/lib/emailDomainAutoLink.d.ts.map +1 -0
  14. package/dist/lib/emailDomainAutoLink.js +119 -0
  15. package/dist/lib/emailDomainAutoLink.js.map +1 -0
  16. package/dist/lib/ids.d.ts +13 -0
  17. package/dist/lib/ids.d.ts.map +1 -1
  18. package/dist/lib/ids.js +13 -0
  19. package/dist/lib/ids.js.map +1 -1
  20. package/dist/modules/activities/repository.d.ts.map +1 -1
  21. package/dist/modules/activities/repository.js +19 -20
  22. package/dist/modules/activities/repository.js.map +1 -1
  23. package/dist/modules/activities/wording.d.ts +12 -0
  24. package/dist/modules/activities/wording.d.ts.map +1 -1
  25. package/dist/modules/activities/wording.js +16 -0
  26. package/dist/modules/activities/wording.js.map +1 -1
  27. package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
  28. package/dist/modules/agent-tasks/catalog.js +62 -0
  29. package/dist/modules/agent-tasks/catalog.js.map +1 -1
  30. package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
  31. package/dist/modules/agent-tasks/resolve.js +42 -9
  32. package/dist/modules/agent-tasks/resolve.js.map +1 -1
  33. package/dist/modules/agent-tasks/routes.d.ts +2 -0
  34. package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
  35. package/dist/modules/attachedRecords.d.ts +6 -1
  36. package/dist/modules/attachedRecords.d.ts.map +1 -1
  37. package/dist/modules/attachedRecords.js +18 -2
  38. package/dist/modules/attachedRecords.js.map +1 -1
  39. package/dist/modules/auth/preferences.d.ts +11 -1
  40. package/dist/modules/auth/preferences.d.ts.map +1 -1
  41. package/dist/modules/auth/preferences.js +11 -0
  42. package/dist/modules/auth/preferences.js.map +1 -1
  43. package/dist/modules/auth/routes.d.ts.map +1 -1
  44. package/dist/modules/auth/routes.js +18 -0
  45. package/dist/modules/auth/routes.js.map +1 -1
  46. package/dist/modules/auth/schema.d.ts +20 -0
  47. package/dist/modules/auth/schema.d.ts.map +1 -1
  48. package/dist/modules/auth/schema.js +11 -1
  49. package/dist/modules/auth/schema.js.map +1 -1
  50. package/dist/modules/auth/service.d.ts.map +1 -1
  51. package/dist/modules/auth/service.js +27 -3
  52. package/dist/modules/auth/service.js.map +1 -1
  53. package/dist/modules/companies/index.d.ts.map +1 -1
  54. package/dist/modules/companies/index.js +3 -1
  55. package/dist/modules/companies/index.js.map +1 -1
  56. package/dist/modules/companies/repository.d.ts +2 -0
  57. package/dist/modules/companies/repository.d.ts.map +1 -1
  58. package/dist/modules/companies/repository.js +1 -0
  59. package/dist/modules/companies/repository.js.map +1 -1
  60. package/dist/modules/companies/routes.d.ts +16 -0
  61. package/dist/modules/companies/routes.d.ts.map +1 -1
  62. package/dist/modules/companies/routes.js +18 -0
  63. package/dist/modules/companies/routes.js.map +1 -1
  64. package/dist/modules/companies/schema.d.ts +37 -0
  65. package/dist/modules/companies/schema.d.ts.map +1 -1
  66. package/dist/modules/companies/schema.js +10 -1
  67. package/dist/modules/companies/schema.js.map +1 -1
  68. package/dist/modules/companies/service.d.ts +6 -0
  69. package/dist/modules/companies/service.d.ts.map +1 -1
  70. package/dist/modules/companies/service.js +45 -11
  71. package/dist/modules/companies/service.js.map +1 -1
  72. package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
  73. package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
  74. package/dist/modules/consent-purposes/capabilities.js +10 -0
  75. package/dist/modules/consent-purposes/capabilities.js.map +1 -0
  76. package/dist/modules/consent-purposes/events.d.ts +38 -0
  77. package/dist/modules/consent-purposes/events.d.ts.map +1 -0
  78. package/dist/modules/consent-purposes/events.js +17 -0
  79. package/dist/modules/consent-purposes/events.js.map +1 -0
  80. package/dist/modules/consent-purposes/index.d.ts +13 -0
  81. package/dist/modules/consent-purposes/index.d.ts.map +1 -0
  82. package/dist/modules/consent-purposes/index.js +41 -0
  83. package/dist/modules/consent-purposes/index.js.map +1 -0
  84. package/dist/modules/consent-purposes/repository.d.ts +21 -0
  85. package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
  86. package/dist/modules/consent-purposes/repository.js +98 -0
  87. package/dist/modules/consent-purposes/repository.js.map +1 -0
  88. package/dist/modules/consent-purposes/routes.d.ts +39 -0
  89. package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
  90. package/dist/modules/consent-purposes/routes.js +79 -0
  91. package/dist/modules/consent-purposes/routes.js.map +1 -0
  92. package/dist/modules/consent-purposes/schema.d.ts +175 -0
  93. package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
  94. package/dist/modules/consent-purposes/schema.js +35 -0
  95. package/dist/modules/consent-purposes/schema.js.map +1 -0
  96. package/dist/modules/consent-purposes/service.d.ts +50 -0
  97. package/dist/modules/consent-purposes/service.d.ts.map +1 -0
  98. package/dist/modules/consent-purposes/service.js +263 -0
  99. package/dist/modules/consent-purposes/service.js.map +1 -0
  100. package/dist/modules/consent-purposes/starters.d.ts +17 -0
  101. package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
  102. package/dist/modules/consent-purposes/starters.js +15 -0
  103. package/dist/modules/consent-purposes/starters.js.map +1 -0
  104. package/dist/modules/consent-purposes/tools.d.ts +4 -0
  105. package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
  106. package/dist/modules/consent-purposes/tools.js +29 -0
  107. package/dist/modules/consent-purposes/tools.js.map +1 -0
  108. package/dist/modules/core.d.ts.map +1 -1
  109. package/dist/modules/core.js +21 -0
  110. package/dist/modules/core.js.map +1 -1
  111. package/dist/modules/custom-fields/capabilities.d.ts +12 -0
  112. package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
  113. package/dist/modules/custom-fields/capabilities.js +15 -0
  114. package/dist/modules/custom-fields/capabilities.js.map +1 -0
  115. package/dist/modules/custom-fields/events.d.ts +49 -0
  116. package/dist/modules/custom-fields/events.d.ts.map +1 -0
  117. package/dist/modules/custom-fields/events.js +25 -0
  118. package/dist/modules/custom-fields/events.js.map +1 -0
  119. package/dist/modules/custom-fields/index.d.ts +19 -0
  120. package/dist/modules/custom-fields/index.d.ts.map +1 -0
  121. package/dist/modules/custom-fields/index.js +46 -0
  122. package/dist/modules/custom-fields/index.js.map +1 -0
  123. package/dist/modules/custom-fields/repository.d.ts +37 -0
  124. package/dist/modules/custom-fields/repository.d.ts.map +1 -0
  125. package/dist/modules/custom-fields/repository.js +144 -0
  126. package/dist/modules/custom-fields/repository.js.map +1 -0
  127. package/dist/modules/custom-fields/routes.d.ts +44 -0
  128. package/dist/modules/custom-fields/routes.d.ts.map +1 -0
  129. package/dist/modules/custom-fields/routes.js +103 -0
  130. package/dist/modules/custom-fields/routes.js.map +1 -0
  131. package/dist/modules/custom-fields/schema.d.ts +215 -0
  132. package/dist/modules/custom-fields/schema.d.ts.map +1 -0
  133. package/dist/modules/custom-fields/schema.js +43 -0
  134. package/dist/modules/custom-fields/schema.js.map +1 -0
  135. package/dist/modules/custom-fields/service.d.ts +57 -0
  136. package/dist/modules/custom-fields/service.d.ts.map +1 -0
  137. package/dist/modules/custom-fields/service.js +273 -0
  138. package/dist/modules/custom-fields/service.js.map +1 -0
  139. package/dist/modules/custom-fields/tools.d.ts +4 -0
  140. package/dist/modules/custom-fields/tools.d.ts.map +1 -0
  141. package/dist/modules/custom-fields/tools.js +38 -0
  142. package/dist/modules/custom-fields/tools.js.map +1 -0
  143. package/dist/modules/custom-fields/values.d.ts +49 -0
  144. package/dist/modules/custom-fields/values.d.ts.map +1 -0
  145. package/dist/modules/custom-fields/values.js +249 -0
  146. package/dist/modules/custom-fields/values.js.map +1 -0
  147. package/dist/modules/custom-fields/wire.d.ts +12 -0
  148. package/dist/modules/custom-fields/wire.d.ts.map +1 -0
  149. package/dist/modules/custom-fields/wire.js +30 -0
  150. package/dist/modules/custom-fields/wire.js.map +1 -0
  151. package/dist/modules/dashboard/repository.d.ts.map +1 -1
  152. package/dist/modules/dashboard/repository.js +4 -3
  153. package/dist/modules/dashboard/repository.js.map +1 -1
  154. package/dist/modules/deals/index.d.ts +2 -1
  155. package/dist/modules/deals/index.d.ts.map +1 -1
  156. package/dist/modules/deals/index.js +5 -2
  157. package/dist/modules/deals/index.js.map +1 -1
  158. package/dist/modules/deals/repository.d.ts +0 -16
  159. package/dist/modules/deals/repository.d.ts.map +1 -1
  160. package/dist/modules/deals/repository.js +6 -76
  161. package/dist/modules/deals/repository.js.map +1 -1
  162. package/dist/modules/deals/routes.d.ts +14 -0
  163. package/dist/modules/deals/routes.d.ts.map +1 -1
  164. package/dist/modules/deals/routes.js +7 -0
  165. package/dist/modules/deals/routes.js.map +1 -1
  166. package/dist/modules/deals/schema.d.ts +20 -42
  167. package/dist/modules/deals/schema.d.ts.map +1 -1
  168. package/dist/modules/deals/schema.js +6 -11
  169. package/dist/modules/deals/schema.js.map +1 -1
  170. package/dist/modules/deals/service.d.ts +13 -2
  171. package/dist/modules/deals/service.d.ts.map +1 -1
  172. package/dist/modules/deals/service.js +43 -20
  173. package/dist/modules/deals/service.js.map +1 -1
  174. package/dist/modules/decisions/repository.d.ts.map +1 -1
  175. package/dist/modules/decisions/repository.js +2 -0
  176. package/dist/modules/decisions/repository.js.map +1 -1
  177. package/dist/modules/decisions/routes.d.ts +1 -0
  178. package/dist/modules/decisions/routes.d.ts.map +1 -1
  179. package/dist/modules/email-domain-linker/index.d.ts +12 -0
  180. package/dist/modules/email-domain-linker/index.d.ts.map +1 -0
  181. package/dist/modules/email-domain-linker/index.js +34 -0
  182. package/dist/modules/email-domain-linker/index.js.map +1 -0
  183. package/dist/modules/email-domain-linker/routes.d.ts +14 -0
  184. package/dist/modules/email-domain-linker/routes.d.ts.map +1 -0
  185. package/dist/modules/email-domain-linker/routes.js +15 -0
  186. package/dist/modules/email-domain-linker/routes.js.map +1 -0
  187. package/dist/modules/email-domain-linker/service.d.ts +37 -0
  188. package/dist/modules/email-domain-linker/service.d.ts.map +1 -0
  189. package/dist/modules/email-domain-linker/service.js +63 -0
  190. package/dist/modules/email-domain-linker/service.js.map +1 -0
  191. package/dist/modules/enquiries/events.d.ts +44 -0
  192. package/dist/modules/enquiries/events.d.ts.map +1 -0
  193. package/dist/modules/enquiries/events.js +19 -0
  194. package/dist/modules/enquiries/events.js.map +1 -0
  195. package/dist/modules/enquiries/index.d.ts +13 -0
  196. package/dist/modules/enquiries/index.d.ts.map +1 -0
  197. package/dist/modules/enquiries/index.js +44 -0
  198. package/dist/modules/enquiries/index.js.map +1 -0
  199. package/dist/modules/enquiries/repository.d.ts +30 -0
  200. package/dist/modules/enquiries/repository.d.ts.map +1 -0
  201. package/dist/modules/enquiries/repository.js +94 -0
  202. package/dist/modules/enquiries/repository.js.map +1 -0
  203. package/dist/modules/enquiries/routes.d.ts +52 -0
  204. package/dist/modules/enquiries/routes.d.ts.map +1 -0
  205. package/dist/modules/enquiries/routes.js +127 -0
  206. package/dist/modules/enquiries/routes.js.map +1 -0
  207. package/dist/modules/enquiries/schema.d.ts +290 -0
  208. package/dist/modules/enquiries/schema.d.ts.map +1 -0
  209. package/dist/modules/enquiries/schema.js +52 -0
  210. package/dist/modules/enquiries/schema.js.map +1 -0
  211. package/dist/modules/enquiries/service.d.ts +85 -0
  212. package/dist/modules/enquiries/service.d.ts.map +1 -0
  213. package/dist/modules/enquiries/service.js +370 -0
  214. package/dist/modules/enquiries/service.js.map +1 -0
  215. package/dist/modules/enquiries/tools.d.ts +4 -0
  216. package/dist/modules/enquiries/tools.d.ts.map +1 -0
  217. package/dist/modules/enquiries/tools.js +50 -0
  218. package/dist/modules/enquiries/tools.js.map +1 -0
  219. package/dist/modules/eventCatalogs.d.ts +4 -0
  220. package/dist/modules/eventCatalogs.d.ts.map +1 -1
  221. package/dist/modules/eventCatalogs.js +4 -0
  222. package/dist/modules/eventCatalogs.js.map +1 -1
  223. package/dist/modules/forms/embed.d.ts +20 -6
  224. package/dist/modules/forms/embed.d.ts.map +1 -1
  225. package/dist/modules/forms/embed.js +359 -43
  226. package/dist/modules/forms/embed.js.map +1 -1
  227. package/dist/modules/forms/events.d.ts +20 -7
  228. package/dist/modules/forms/events.d.ts.map +1 -1
  229. package/dist/modules/forms/events.js +20 -2
  230. package/dist/modules/forms/events.js.map +1 -1
  231. package/dist/modules/forms/fields.d.ts +14 -1
  232. package/dist/modules/forms/fields.d.ts.map +1 -1
  233. package/dist/modules/forms/fields.js +87 -3
  234. package/dist/modules/forms/fields.js.map +1 -1
  235. package/dist/modules/forms/index.d.ts.map +1 -1
  236. package/dist/modules/forms/index.js +12 -1
  237. package/dist/modules/forms/index.js.map +1 -1
  238. package/dist/modules/forms/mapping.d.ts +62 -5
  239. package/dist/modules/forms/mapping.d.ts.map +1 -1
  240. package/dist/modules/forms/mapping.js +139 -5
  241. package/dist/modules/forms/mapping.js.map +1 -1
  242. package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
  243. package/dist/modules/forms/publicRoutes.js +29 -1
  244. package/dist/modules/forms/publicRoutes.js.map +1 -1
  245. package/dist/modules/forms/repository.d.ts +31 -0
  246. package/dist/modules/forms/repository.d.ts.map +1 -1
  247. package/dist/modules/forms/repository.js +90 -1
  248. package/dist/modules/forms/repository.js.map +1 -1
  249. package/dist/modules/forms/routes.d.ts +83 -1
  250. package/dist/modules/forms/routes.d.ts.map +1 -1
  251. package/dist/modules/forms/routes.js +185 -2
  252. package/dist/modules/forms/routes.js.map +1 -1
  253. package/dist/modules/forms/schema.d.ts +672 -1
  254. package/dist/modules/forms/schema.d.ts.map +1 -1
  255. package/dist/modules/forms/schema.js +146 -3
  256. package/dist/modules/forms/schema.js.map +1 -1
  257. package/dist/modules/forms/service.d.ts +54 -1
  258. package/dist/modules/forms/service.d.ts.map +1 -1
  259. package/dist/modules/forms/service.js +338 -28
  260. package/dist/modules/forms/service.js.map +1 -1
  261. package/dist/modules/forms/submission.d.ts +15 -0
  262. package/dist/modules/forms/submission.d.ts.map +1 -1
  263. package/dist/modules/forms/submission.js +418 -40
  264. package/dist/modules/forms/submission.js.map +1 -1
  265. package/dist/modules/import-export/drafts.d.ts +10 -0
  266. package/dist/modules/import-export/drafts.d.ts.map +1 -1
  267. package/dist/modules/import-export/drafts.js +16 -2
  268. package/dist/modules/import-export/drafts.js.map +1 -1
  269. package/dist/modules/import-export/exportRows.d.ts +7 -4
  270. package/dist/modules/import-export/exportRows.d.ts.map +1 -1
  271. package/dist/modules/import-export/exportRows.js +20 -5
  272. package/dist/modules/import-export/exportRows.js.map +1 -1
  273. package/dist/modules/import-export/plan.d.ts +12 -1
  274. package/dist/modules/import-export/plan.d.ts.map +1 -1
  275. package/dist/modules/import-export/plan.js +29 -2
  276. package/dist/modules/import-export/plan.js.map +1 -1
  277. package/dist/modules/import-export/presets.d.ts.map +1 -1
  278. package/dist/modules/import-export/presets.js +10 -0
  279. package/dist/modules/import-export/presets.js.map +1 -1
  280. package/dist/modules/import-export/repository.d.ts +11 -1
  281. package/dist/modules/import-export/repository.d.ts.map +1 -1
  282. package/dist/modules/import-export/repository.js +42 -9
  283. package/dist/modules/import-export/repository.js.map +1 -1
  284. package/dist/modules/import-export/routes.d.ts.map +1 -1
  285. package/dist/modules/import-export/routes.js +4 -0
  286. package/dist/modules/import-export/routes.js.map +1 -1
  287. package/dist/modules/import-export/schema.d.ts +17 -0
  288. package/dist/modules/import-export/schema.d.ts.map +1 -1
  289. package/dist/modules/import-export/schema.js +11 -0
  290. package/dist/modules/import-export/schema.js.map +1 -1
  291. package/dist/modules/import-export/service.d.ts +6 -0
  292. package/dist/modules/import-export/service.d.ts.map +1 -1
  293. package/dist/modules/import-export/service.js +14 -2
  294. package/dist/modules/import-export/service.js.map +1 -1
  295. package/dist/modules/import-export/streams.d.ts.map +1 -1
  296. package/dist/modules/import-export/streams.js +3 -3
  297. package/dist/modules/import-export/streams.js.map +1 -1
  298. package/dist/modules/import-export/tools.d.ts.map +1 -1
  299. package/dist/modules/import-export/tools.js +8 -0
  300. package/dist/modules/import-export/tools.js.map +1 -1
  301. package/dist/modules/import-export/validation.d.ts.map +1 -1
  302. package/dist/modules/import-export/validation.js +22 -1
  303. package/dist/modules/import-export/validation.js.map +1 -1
  304. package/dist/modules/import-export/writes.d.ts.map +1 -1
  305. package/dist/modules/import-export/writes.js +37 -4
  306. package/dist/modules/import-export/writes.js.map +1 -1
  307. package/dist/modules/lists/events.d.ts +42 -0
  308. package/dist/modules/lists/events.d.ts.map +1 -0
  309. package/dist/modules/lists/events.js +16 -0
  310. package/dist/modules/lists/events.js.map +1 -0
  311. package/dist/modules/lists/index.d.ts +10 -0
  312. package/dist/modules/lists/index.d.ts.map +1 -0
  313. package/dist/modules/lists/index.js +35 -0
  314. package/dist/modules/lists/index.js.map +1 -0
  315. package/dist/modules/lists/repository.d.ts +80 -0
  316. package/dist/modules/lists/repository.d.ts.map +1 -0
  317. package/dist/modules/lists/repository.js +178 -0
  318. package/dist/modules/lists/repository.js.map +1 -0
  319. package/dist/modules/lists/routes.d.ts +55 -0
  320. package/dist/modules/lists/routes.d.ts.map +1 -0
  321. package/dist/modules/lists/routes.js +168 -0
  322. package/dist/modules/lists/routes.js.map +1 -0
  323. package/dist/modules/lists/schema.d.ts +281 -0
  324. package/dist/modules/lists/schema.d.ts.map +1 -0
  325. package/dist/modules/lists/schema.js +83 -0
  326. package/dist/modules/lists/schema.js.map +1 -0
  327. package/dist/modules/lists/service.d.ts +82 -0
  328. package/dist/modules/lists/service.d.ts.map +1 -0
  329. package/dist/modules/lists/service.js +262 -0
  330. package/dist/modules/lists/service.js.map +1 -0
  331. package/dist/modules/lists/tools.d.ts +4 -0
  332. package/dist/modules/lists/tools.d.ts.map +1 -0
  333. package/dist/modules/lists/tools.js +86 -0
  334. package/dist/modules/lists/tools.js.map +1 -0
  335. package/dist/modules/mcp/index.d.ts.map +1 -1
  336. package/dist/modules/mcp/index.js +5 -0
  337. package/dist/modules/mcp/index.js.map +1 -1
  338. package/dist/modules/notes/routes.d.ts +1 -0
  339. package/dist/modules/notes/routes.d.ts.map +1 -1
  340. package/dist/modules/opportunities/index.d.ts.map +1 -1
  341. package/dist/modules/opportunities/index.js +3 -1
  342. package/dist/modules/opportunities/index.js.map +1 -1
  343. package/dist/modules/opportunities/repository.d.ts +2 -0
  344. package/dist/modules/opportunities/repository.d.ts.map +1 -1
  345. package/dist/modules/opportunities/repository.js +4 -0
  346. package/dist/modules/opportunities/repository.js.map +1 -1
  347. package/dist/modules/opportunities/routes.d.ts +16 -0
  348. package/dist/modules/opportunities/routes.d.ts.map +1 -1
  349. package/dist/modules/opportunities/routes.js +13 -0
  350. package/dist/modules/opportunities/routes.js.map +1 -1
  351. package/dist/modules/opportunities/schema.d.ts +20 -0
  352. package/dist/modules/opportunities/schema.d.ts.map +1 -1
  353. package/dist/modules/opportunities/schema.js +6 -1
  354. package/dist/modules/opportunities/schema.js.map +1 -1
  355. package/dist/modules/opportunities/service.d.ts +20 -3
  356. package/dist/modules/opportunities/service.d.ts.map +1 -1
  357. package/dist/modules/opportunities/service.js +99 -18
  358. package/dist/modules/opportunities/service.js.map +1 -1
  359. package/dist/modules/opportunities/tools.d.ts.map +1 -1
  360. package/dist/modules/opportunities/tools.js +2 -0
  361. package/dist/modules/opportunities/tools.js.map +1 -1
  362. package/dist/modules/partnerships/index.d.ts.map +1 -1
  363. package/dist/modules/partnerships/index.js +3 -1
  364. package/dist/modules/partnerships/index.js.map +1 -1
  365. package/dist/modules/partnerships/repository.d.ts +0 -17
  366. package/dist/modules/partnerships/repository.d.ts.map +1 -1
  367. package/dist/modules/partnerships/repository.js +6 -82
  368. package/dist/modules/partnerships/repository.js.map +1 -1
  369. package/dist/modules/partnerships/routes.d.ts +14 -0
  370. package/dist/modules/partnerships/routes.d.ts.map +1 -1
  371. package/dist/modules/partnerships/routes.js +7 -0
  372. package/dist/modules/partnerships/routes.js.map +1 -1
  373. package/dist/modules/partnerships/schema.d.ts +20 -41
  374. package/dist/modules/partnerships/schema.d.ts.map +1 -1
  375. package/dist/modules/partnerships/schema.js +6 -10
  376. package/dist/modules/partnerships/schema.js.map +1 -1
  377. package/dist/modules/partnerships/service.d.ts +11 -1
  378. package/dist/modules/partnerships/service.d.ts.map +1 -1
  379. package/dist/modules/partnerships/service.js +43 -20
  380. package/dist/modules/partnerships/service.js.map +1 -1
  381. package/dist/modules/people/consentHydration.d.ts +26 -0
  382. package/dist/modules/people/consentHydration.d.ts.map +1 -0
  383. package/dist/modules/people/consentHydration.js +100 -0
  384. package/dist/modules/people/consentHydration.js.map +1 -0
  385. package/dist/modules/people/index.d.ts.map +1 -1
  386. package/dist/modules/people/index.js +3 -1
  387. package/dist/modules/people/index.js.map +1 -1
  388. package/dist/modules/people/personConsentWrites.d.ts +40 -0
  389. package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
  390. package/dist/modules/people/personConsentWrites.js +98 -0
  391. package/dist/modules/people/personConsentWrites.js.map +1 -0
  392. package/dist/modules/people/repository.d.ts +11 -0
  393. package/dist/modules/people/repository.d.ts.map +1 -1
  394. package/dist/modules/people/repository.js +21 -1
  395. package/dist/modules/people/repository.js.map +1 -1
  396. package/dist/modules/people/routes.d.ts +57 -4
  397. package/dist/modules/people/routes.d.ts.map +1 -1
  398. package/dist/modules/people/routes.js +104 -5
  399. package/dist/modules/people/routes.js.map +1 -1
  400. package/dist/modules/people/schema.d.ts +366 -1
  401. package/dist/modules/people/schema.d.ts.map +1 -1
  402. package/dist/modules/people/schema.js +92 -2
  403. package/dist/modules/people/schema.js.map +1 -1
  404. package/dist/modules/people/service.d.ts +30 -1
  405. package/dist/modules/people/service.d.ts.map +1 -1
  406. package/dist/modules/people/service.js +131 -36
  407. package/dist/modules/people/service.js.map +1 -1
  408. package/dist/modules/people/tools.d.ts.map +1 -1
  409. package/dist/modules/people/tools.js +4 -1
  410. package/dist/modules/people/tools.js.map +1 -1
  411. package/dist/modules/personLinks.d.ts +79 -0
  412. package/dist/modules/personLinks.d.ts.map +1 -0
  413. package/dist/modules/personLinks.js +155 -0
  414. package/dist/modules/personLinks.js.map +1 -0
  415. package/dist/modules/pipelines/routes.d.ts +1 -0
  416. package/dist/modules/pipelines/routes.d.ts.map +1 -1
  417. package/dist/modules/plans/routes.d.ts +1 -0
  418. package/dist/modules/plans/routes.d.ts.map +1 -1
  419. package/dist/modules/positions/routes.d.ts.map +1 -1
  420. package/dist/modules/positions/routes.js +4 -2
  421. package/dist/modules/positions/routes.js.map +1 -1
  422. package/dist/modules/raises/index.d.ts.map +1 -1
  423. package/dist/modules/raises/index.js +3 -1
  424. package/dist/modules/raises/index.js.map +1 -1
  425. package/dist/modules/raises/repository.d.ts +0 -17
  426. package/dist/modules/raises/repository.d.ts.map +1 -1
  427. package/dist/modules/raises/repository.js +6 -77
  428. package/dist/modules/raises/repository.js.map +1 -1
  429. package/dist/modules/raises/routes.d.ts +14 -0
  430. package/dist/modules/raises/routes.d.ts.map +1 -1
  431. package/dist/modules/raises/routes.js +7 -0
  432. package/dist/modules/raises/routes.js.map +1 -1
  433. package/dist/modules/raises/schema.d.ts +20 -41
  434. package/dist/modules/raises/schema.d.ts.map +1 -1
  435. package/dist/modules/raises/schema.js +6 -10
  436. package/dist/modules/raises/schema.js.map +1 -1
  437. package/dist/modules/raises/service.d.ts +11 -1
  438. package/dist/modules/raises/service.d.ts.map +1 -1
  439. package/dist/modules/raises/service.js +41 -18
  440. package/dist/modules/raises/service.js.map +1 -1
  441. package/dist/modules/recordTargets.d.ts.map +1 -1
  442. package/dist/modules/recordTargets.js +2 -0
  443. package/dist/modules/recordTargets.js.map +1 -1
  444. package/dist/modules/references.d.ts +10 -0
  445. package/dist/modules/references.d.ts.map +1 -1
  446. package/dist/modules/references.js +27 -4
  447. package/dist/modules/references.js.map +1 -1
  448. package/dist/modules/sample-data/fixture.d.ts +160 -0
  449. package/dist/modules/sample-data/fixture.d.ts.map +1 -0
  450. package/dist/modules/sample-data/fixture.js +501 -0
  451. package/dist/modules/sample-data/fixture.js.map +1 -0
  452. package/dist/modules/sample-data/index.d.ts +11 -0
  453. package/dist/modules/sample-data/index.d.ts.map +1 -0
  454. package/dist/modules/sample-data/index.js +44 -0
  455. package/dist/modules/sample-data/index.js.map +1 -0
  456. package/dist/modules/sample-data/routes.d.ts +15 -0
  457. package/dist/modules/sample-data/routes.d.ts.map +1 -0
  458. package/dist/modules/sample-data/routes.js +25 -0
  459. package/dist/modules/sample-data/routes.js.map +1 -0
  460. package/dist/modules/sample-data/service.d.ts +39 -0
  461. package/dist/modules/sample-data/service.d.ts.map +1 -0
  462. package/dist/modules/sample-data/service.js +481 -0
  463. package/dist/modules/sample-data/service.js.map +1 -0
  464. package/dist/modules/sample-data/tools.d.ts +4 -0
  465. package/dist/modules/sample-data/tools.d.ts.map +1 -0
  466. package/dist/modules/sample-data/tools.js +22 -0
  467. package/dist/modules/sample-data/tools.js.map +1 -0
  468. package/dist/modules/search/index.d.ts +1 -1
  469. package/dist/modules/search/index.d.ts.map +1 -1
  470. package/dist/modules/search/index.js +2 -1
  471. package/dist/modules/search/index.js.map +1 -1
  472. package/dist/modules/search/repository.d.ts +1 -0
  473. package/dist/modules/search/repository.d.ts.map +1 -1
  474. package/dist/modules/search/repository.js +23 -0
  475. package/dist/modules/search/repository.js.map +1 -1
  476. package/dist/modules/search/service.d.ts +3 -3
  477. package/dist/modules/search/service.d.ts.map +1 -1
  478. package/dist/modules/search/service.js +5 -4
  479. package/dist/modules/search/service.js.map +1 -1
  480. package/dist/modules/smtp-email/index.d.ts +1 -0
  481. package/dist/modules/smtp-email/index.d.ts.map +1 -1
  482. package/dist/modules/smtp-email/index.js +1 -0
  483. package/dist/modules/smtp-email/index.js.map +1 -1
  484. package/dist/modules/stagedRecords.d.ts +3 -3
  485. package/dist/modules/stagedRecords.d.ts.map +1 -1
  486. package/dist/modules/stagedRecords.js +9 -0
  487. package/dist/modules/stagedRecords.js.map +1 -1
  488. package/dist/modules/webhooks/payloads.d.ts.map +1 -1
  489. package/dist/modules/webhooks/payloads.js +15 -2
  490. package/dist/modules/webhooks/payloads.js.map +1 -1
  491. package/dist/modules/workspace/repository.d.ts +2 -0
  492. package/dist/modules/workspace/repository.d.ts.map +1 -1
  493. package/dist/modules/workspace/repository.js +7 -0
  494. package/dist/modules/workspace/repository.js.map +1 -1
  495. package/dist/modules/workspace/service.d.ts.map +1 -1
  496. package/dist/modules/workspace/service.js +20 -1
  497. package/dist/modules/workspace/service.js.map +1 -1
  498. package/dist/modules/workspace/starters.d.ts.map +1 -1
  499. package/dist/modules/workspace/starters.js +5 -0
  500. package/dist/modules/workspace/starters.js.map +1 -1
  501. package/dist/runtime/events.d.ts +1 -1
  502. package/dist/runtime/events.d.ts.map +1 -1
  503. package/dist/runtime/events.js +1 -0
  504. package/dist/runtime/events.js.map +1 -1
  505. package/dist/schema/index.d.ts +4 -0
  506. package/dist/schema/index.d.ts.map +1 -1
  507. package/dist/schema/index.js +4 -0
  508. package/dist/schema/index.js.map +1 -1
  509. package/dist/testing/database.d.ts +5 -1
  510. package/dist/testing/database.d.ts.map +1 -1
  511. package/dist/testing/database.js +81 -10
  512. package/dist/testing/database.js.map +1 -1
  513. package/migrations/0021_certain_maggott.sql +30 -0
  514. package/migrations/0022_stormy_manta.sql +1 -0
  515. package/migrations/0023_funny_maddog.sql +1 -0
  516. package/migrations/0024_third_king_cobra.sql +46 -0
  517. package/migrations/0025_worthless_chimera.sql +3 -0
  518. package/migrations/0026_late_aqueduct.sql +46 -0
  519. package/migrations/0027_brainy_silver_sable.sql +3 -0
  520. package/migrations/0028_freezing_scrambler.sql +19 -0
  521. package/migrations/0029_custom_fields.sql +26 -0
  522. package/migrations/0030_enquiries.sql +79 -0
  523. package/migrations/0031_consent.sql +45 -0
  524. package/migrations/0032_form_field_statement.sql +1 -0
  525. package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
  526. package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
  527. package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
  528. package/migrations/0036_form_field_notice_type.sql +2 -0
  529. package/migrations/meta/0021_snapshot.json +5389 -0
  530. package/migrations/meta/0022_snapshot.json +5396 -0
  531. package/migrations/meta/0023_snapshot.json +5403 -0
  532. package/migrations/meta/0024_snapshot.json +5516 -0
  533. package/migrations/meta/0025_snapshot.json +5336 -0
  534. package/migrations/meta/0026_snapshot.json +5710 -0
  535. package/migrations/meta/0027_snapshot.json +5716 -0
  536. package/migrations/meta/0028_snapshot.json +5740 -0
  537. package/migrations/meta/0029_snapshot.json +5935 -0
  538. package/migrations/meta/0030_snapshot.json +6245 -0
  539. package/migrations/meta/0031_snapshot.json +6572 -0
  540. package/migrations/meta/0032_snapshot.json +6578 -0
  541. package/migrations/meta/0033_snapshot.json +6572 -0
  542. package/migrations/meta/0034_snapshot.json +6566 -0
  543. package/migrations/meta/0035_snapshot.json +6573 -0
  544. package/migrations/meta/0036_snapshot.json +6573 -0
  545. package/migrations/meta/_journal.json +112 -0
  546. package/package.json +3 -2
  547. package/src/lib/consumerEmailDomains.ts +62 -0
  548. package/src/lib/email.ts +7 -0
  549. package/src/lib/emailContent.ts +91 -0
  550. package/src/lib/emailDomainAutoLink.ts +165 -0
  551. package/src/lib/ids.ts +13 -0
  552. package/src/modules/activities/repository.ts +22 -23
  553. package/src/modules/activities/wording.ts +18 -0
  554. package/src/modules/agent-tasks/catalog.ts +63 -0
  555. package/src/modules/agent-tasks/resolve.ts +64 -24
  556. package/src/modules/attachedRecords.ts +37 -3
  557. package/src/modules/auth/preferences.ts +13 -1
  558. package/src/modules/auth/routes.ts +22 -0
  559. package/src/modules/auth/schema.ts +12 -2
  560. package/src/modules/auth/service.ts +37 -3
  561. package/src/modules/companies/index.ts +3 -1
  562. package/src/modules/companies/repository.ts +3 -0
  563. package/src/modules/companies/routes.ts +20 -0
  564. package/src/modules/companies/schema.ts +11 -1
  565. package/src/modules/companies/service.ts +72 -12
  566. package/src/modules/consent-purposes/capabilities.ts +12 -0
  567. package/src/modules/consent-purposes/events.ts +38 -0
  568. package/src/modules/consent-purposes/index.ts +48 -0
  569. package/src/modules/consent-purposes/repository.ts +163 -0
  570. package/src/modules/consent-purposes/routes.ts +122 -0
  571. package/src/modules/consent-purposes/schema.ts +46 -0
  572. package/src/modules/consent-purposes/service.ts +423 -0
  573. package/src/modules/consent-purposes/starters.ts +32 -0
  574. package/src/modules/consent-purposes/tools.ts +44 -0
  575. package/src/modules/core.ts +21 -0
  576. package/src/modules/custom-fields/capabilities.ts +17 -0
  577. package/src/modules/custom-fields/events.ts +51 -0
  578. package/src/modules/custom-fields/index.ts +61 -0
  579. package/src/modules/custom-fields/repository.ts +225 -0
  580. package/src/modules/custom-fields/routes.ts +155 -0
  581. package/src/modules/custom-fields/schema.ts +61 -0
  582. package/src/modules/custom-fields/service.ts +439 -0
  583. package/src/modules/custom-fields/tools.ts +53 -0
  584. package/src/modules/custom-fields/values.ts +352 -0
  585. package/src/modules/custom-fields/wire.ts +32 -0
  586. package/src/modules/dashboard/repository.ts +4 -3
  587. package/src/modules/deals/index.ts +5 -2
  588. package/src/modules/deals/repository.ts +6 -106
  589. package/src/modules/deals/routes.ts +7 -0
  590. package/src/modules/deals/schema.ts +7 -15
  591. package/src/modules/deals/service.ts +92 -23
  592. package/src/modules/decisions/repository.ts +2 -0
  593. package/src/modules/email-domain-linker/index.ts +40 -0
  594. package/src/modules/email-domain-linker/routes.ts +40 -0
  595. package/src/modules/email-domain-linker/service.ts +122 -0
  596. package/src/modules/enquiries/events.ts +45 -0
  597. package/src/modules/enquiries/index.ts +50 -0
  598. package/src/modules/enquiries/repository.ts +164 -0
  599. package/src/modules/enquiries/routes.ts +172 -0
  600. package/src/modules/enquiries/schema.ts +59 -0
  601. package/src/modules/enquiries/service.ts +644 -0
  602. package/src/modules/enquiries/tools.ts +66 -0
  603. package/src/modules/eventCatalogs.ts +4 -0
  604. package/src/modules/forms/embed.ts +391 -44
  605. package/src/modules/forms/events.ts +30 -2
  606. package/src/modules/forms/fields.ts +102 -2
  607. package/src/modules/forms/index.ts +12 -1
  608. package/src/modules/forms/mapping.ts +183 -6
  609. package/src/modules/forms/publicRoutes.ts +43 -1
  610. package/src/modules/forms/repository.ts +162 -1
  611. package/src/modules/forms/routes.ts +212 -2
  612. package/src/modules/forms/schema.ts +166 -4
  613. package/src/modules/forms/service.ts +565 -41
  614. package/src/modules/forms/submission.ts +718 -44
  615. package/src/modules/import-export/drafts.ts +20 -1
  616. package/src/modules/import-export/exportRows.ts +21 -5
  617. package/src/modules/import-export/plan.ts +47 -2
  618. package/src/modules/import-export/presets.ts +10 -0
  619. package/src/modules/import-export/repository.ts +73 -8
  620. package/src/modules/import-export/routes.ts +4 -0
  621. package/src/modules/import-export/schema.ts +11 -0
  622. package/src/modules/import-export/service.ts +28 -2
  623. package/src/modules/import-export/streams.ts +3 -1
  624. package/src/modules/import-export/tools.ts +10 -0
  625. package/src/modules/import-export/validation.ts +28 -0
  626. package/src/modules/import-export/writes.ts +70 -5
  627. package/src/modules/lists/events.ts +41 -0
  628. package/src/modules/lists/index.ts +41 -0
  629. package/src/modules/lists/repository.ts +343 -0
  630. package/src/modules/lists/routes.ts +255 -0
  631. package/src/modules/lists/schema.ts +95 -0
  632. package/src/modules/lists/service.ts +505 -0
  633. package/src/modules/lists/tools.ts +128 -0
  634. package/src/modules/mcp/index.ts +5 -0
  635. package/src/modules/opportunities/index.ts +3 -1
  636. package/src/modules/opportunities/repository.ts +11 -0
  637. package/src/modules/opportunities/routes.ts +13 -0
  638. package/src/modules/opportunities/schema.ts +7 -1
  639. package/src/modules/opportunities/service.ts +188 -22
  640. package/src/modules/opportunities/tools.ts +2 -0
  641. package/src/modules/partnerships/index.ts +3 -1
  642. package/src/modules/partnerships/repository.ts +6 -117
  643. package/src/modules/partnerships/routes.ts +7 -0
  644. package/src/modules/partnerships/schema.ts +7 -14
  645. package/src/modules/partnerships/service.ts +93 -22
  646. package/src/modules/people/consentHydration.ts +167 -0
  647. package/src/modules/people/index.ts +3 -1
  648. package/src/modules/people/personConsentWrites.ts +177 -0
  649. package/src/modules/people/repository.ts +31 -0
  650. package/src/modules/people/routes.ts +127 -18
  651. package/src/modules/people/schema.ts +109 -3
  652. package/src/modules/people/service.ts +205 -39
  653. package/src/modules/people/tools.ts +5 -1
  654. package/src/modules/personLinks.ts +278 -0
  655. package/src/modules/positions/routes.ts +4 -2
  656. package/src/modules/raises/index.ts +3 -1
  657. package/src/modules/raises/repository.ts +6 -107
  658. package/src/modules/raises/routes.ts +7 -0
  659. package/src/modules/raises/schema.ts +7 -14
  660. package/src/modules/raises/service.ts +91 -20
  661. package/src/modules/recordTargets.ts +2 -0
  662. package/src/modules/references.ts +43 -4
  663. package/src/modules/sample-data/fixture.ts +690 -0
  664. package/src/modules/sample-data/index.ts +51 -0
  665. package/src/modules/sample-data/routes.ts +50 -0
  666. package/src/modules/sample-data/service.ts +679 -0
  667. package/src/modules/sample-data/tools.ts +32 -0
  668. package/src/modules/search/index.ts +2 -1
  669. package/src/modules/search/repository.ts +33 -1
  670. package/src/modules/search/service.ts +7 -5
  671. package/src/modules/smtp-email/index.ts +8 -1
  672. package/src/modules/stagedRecords.ts +18 -3
  673. package/src/modules/webhooks/payloads.ts +20 -2
  674. package/src/modules/workspace/repository.ts +12 -0
  675. package/src/modules/workspace/service.ts +27 -1
  676. package/src/modules/workspace/starters.ts +5 -0
  677. package/src/runtime/events.ts +1 -0
  678. package/src/schema/index.ts +4 -0
  679. package/src/testing/database.ts +97 -11
@@ -7,11 +7,14 @@ import type { ActivityRecorder } from '../activities/recorder.ts'
7
7
  import { describeCreationVia, describeLink, describeUpdateVia } from '../activities/wording.ts'
8
8
  import type { Actor } from '../auth/actor.ts'
9
9
  import * as companyRepository from '../companies/repository.ts'
10
+ import * as consentPurposesRepository from '../consent-purposes/repository.ts'
10
11
  import * as dealRepository from '../deals/repository.ts'
11
12
  import * as peopleRepository from '../people/repository.ts'
13
+ import { upsertPersonConsent } from '../people/personConsentWrites.ts'
14
+ import * as personLinks from '../personLinks.ts'
12
15
  import * as positionRepository from '../positions/repository.ts'
13
16
  import { IMPORT_DEAL_CURRENCY, NEW_COMPANY_DEFAULTS, NEW_PERSON_DEFAULTS } from './drafts.ts'
14
- import type { ImportWrite, PlannedAffiliation, RowPlan } from './plan.ts'
17
+ import type { ImportConsentGrant, ImportWrite, PlannedAffiliation, RowPlan } from './plan.ts'
15
18
 
16
19
  /**
17
20
  * Applying one planned row: the insert or update, and the timeline entry that
@@ -220,6 +223,9 @@ async function writePerson(
220
223
  tags: write.draft.tags === undefined ? undefined : [...write.draft.tags],
221
224
  id: dependencies.createId('person'),
222
225
  workspaceId,
226
+ // `name` is not a required column any more; the People row check is what
227
+ // guarantees one, from the row's own `name` or composed from its first and
228
+ // last name cells. A row reaching here without one never passed validation.
223
229
  name: write.draft.name ?? '',
224
230
  })
225
231
 
@@ -228,6 +234,10 @@ async function writePerson(
228
234
  ? []
229
235
  : await applyAffiliation(dependencies, created.id, write.affiliation)
230
236
 
237
+ if (write.consent !== undefined) {
238
+ await applyImportConsent(dependencies, created.id, write.consent)
239
+ }
240
+
231
241
  return { recordId: created.id, objectType: 'person', changedFields: [], sideRecords }
232
242
  }
233
243
 
@@ -257,9 +267,51 @@ async function writePerson(
257
267
  ? []
258
268
  : await applyAffiliation(dependencies, id, write.affiliation)
259
269
 
270
+ if (write.consent !== undefined) {
271
+ await applyImportConsent(dependencies, id, write.consent)
272
+ }
273
+
260
274
  return { recordId: id, objectType: 'person', changedFields, sideRecords }
261
275
  }
262
276
 
277
+ /**
278
+ * Applies the row's consent grant against the job's purpose. The purpose is
279
+ * looked up once per call rather than cached across rows — a commit runs one
280
+ * transaction and one row at a time — so the round trip is small and stays
281
+ * consistent with the current transaction's view.
282
+ */
283
+ async function applyImportConsent(
284
+ dependencies: WriteDependencies,
285
+ personId: string,
286
+ consent: ImportConsentGrant,
287
+ ): Promise<void> {
288
+ const [purpose] = await consentPurposesRepository.listPurposesByIds(
289
+ dependencies.tx,
290
+ dependencies.workspaceId,
291
+ [consent.purposeId],
292
+ )
293
+ if (purpose === undefined) return
294
+ const notedAt = consent.notedAt === null ? dependencies.now : new Date(`${consent.notedAt}T00:00:00Z`)
295
+ await upsertPersonConsent(
296
+ dependencies.tx,
297
+ dependencies.workspaceId,
298
+ personId,
299
+ consent.purposeId,
300
+ purpose.slug,
301
+ purpose.label,
302
+ consent.status,
303
+ 'import',
304
+ notedAt,
305
+ )
306
+ await dependencies.recordActivity(dependencies.tx, dependencies.workspaceId, dependencies.actor, {
307
+ targetType: 'person',
308
+ targetId: personId,
309
+ kind: 'updated',
310
+ action: `${consent.status === 'granted' ? 'granted' : 'withdrew'} ${purpose.label} consent via ${dependencies.sourceName}`,
311
+ detail: null,
312
+ })
313
+ }
314
+
263
315
  /**
264
316
  * A Position's only writable field is its title, so an update is a rename.
265
317
  *
@@ -318,12 +370,19 @@ async function reconcileDealPeople(
318
370
  dealId: string,
319
371
  personIds: readonly string[],
320
372
  ): Promise<boolean> {
321
- const current = await dealRepository.listPersonIds(dependencies.tx, dealId)
373
+ const target = { targetType: 'deal' as const, targetId: dealId }
374
+ const current = await personLinks.listPersonIds(dependencies.tx, dependencies.workspaceId, target)
322
375
  const added = personIds.filter((personId) => !current.includes(personId))
323
376
  const removed = current.filter((personId) => !personIds.includes(personId))
324
377
 
325
- await dealRepository.insertDealPeople(dependencies.tx, dealId, added)
326
- await dealRepository.deleteDealPeople(dependencies.tx, dealId, removed)
378
+ await personLinks.linkPeople(
379
+ dependencies.tx,
380
+ dependencies.createId,
381
+ dependencies.workspaceId,
382
+ target,
383
+ added,
384
+ )
385
+ await personLinks.unlinkPeople(dependencies.tx, dependencies.workspaceId, target, removed)
327
386
 
328
387
  return added.length > 0 || removed.length > 0
329
388
  }
@@ -352,7 +411,13 @@ async function writeDeal(
352
411
  // the same way, and no CSV column carries one.
353
412
  currency: IMPORT_DEAL_CURRENCY,
354
413
  })
355
- await dealRepository.insertDealPeople(tx, id, write.personIds)
414
+ await personLinks.linkPeople(
415
+ tx,
416
+ dependencies.createId,
417
+ workspaceId,
418
+ { targetType: 'deal', targetId: id },
419
+ write.personIds,
420
+ )
356
421
 
357
422
  return { recordId: id, objectType: 'deal', changedFields: [] }
358
423
  }
@@ -0,0 +1,41 @@
1
+ import { z } from 'zod'
2
+
3
+ import type { ModuleEventCatalog } from '../../runtime/module.ts'
4
+
5
+ /**
6
+ * Domain events published by the lists module.
7
+ *
8
+ * `target` on a `lists.list.*` event is the list itself. `lists.member.*` events
9
+ * name the record that changed membership, so a consumer watching records hears
10
+ * about a list touching it without a second lookup.
11
+ */
12
+
13
+ export const listsEvents = {
14
+ 'lists.list.created': z.object({}).strict(),
15
+ 'lists.list.updated': z.object({ changed: z.array(z.string()).readonly() }),
16
+ 'lists.list.deleted': z.object({}).strict(),
17
+ 'lists.member.added': z.object({ listId: z.string() }),
18
+ 'lists.member.removed': z.object({ listId: z.string() }),
19
+ } satisfies ModuleEventCatalog
20
+
21
+ export type ListCreatedData = Record<string, never>
22
+ export interface ListUpdatedData {
23
+ readonly changed: readonly string[]
24
+ }
25
+ export type ListDeletedData = Record<string, never>
26
+ export interface ListMemberAddedData {
27
+ readonly listId: string
28
+ }
29
+ export interface ListMemberRemovedData {
30
+ readonly listId: string
31
+ }
32
+
33
+ declare module '../../runtime/events.ts' {
34
+ interface KelpieEventMap {
35
+ 'lists.list.created': ListCreatedData
36
+ 'lists.list.updated': ListUpdatedData
37
+ 'lists.list.deleted': ListDeletedData
38
+ 'lists.member.added': ListMemberAddedData
39
+ 'lists.member.removed': ListMemberRemovedData
40
+ }
41
+ }
@@ -0,0 +1,41 @@
1
+ import type { KelpieModule } from '../../runtime/module.ts'
2
+ import { listsEvents } from './events.ts'
3
+ import { mountListsRoutes } from './routes.ts'
4
+ import * as schema from './schema.ts'
5
+ import { createListsService } from './service.ts'
6
+ import { registerListsTools } from './tools.ts'
7
+
8
+ /**
9
+ * Lists: named collections of records of one type.
10
+ *
11
+ * Requires `workspace` for the tenancy column. Every other record type is
12
+ * addressed polymorphically through `target_type` + `target_id`, so this module
13
+ * does not depend on the modules whose records it references.
14
+ */
15
+ export function createListsModule(migrationsDirectory: string): KelpieModule {
16
+ return {
17
+ id: 'lists',
18
+ requires: ['workspace'],
19
+ structural: true,
20
+ events: listsEvents,
21
+
22
+ register(context) {
23
+ const service = createListsService({
24
+ db: context.db,
25
+ transaction: context.transaction,
26
+ createId: context.createId,
27
+ now: context.now,
28
+ })
29
+
30
+ context.schema(schema, migrationsDirectory)
31
+
32
+ context.routes((router) => {
33
+ mountListsRoutes(router, { db: context.db, now: context.now, service })
34
+ })
35
+
36
+ registerListsTools(context.mcp, service)
37
+
38
+ return Promise.resolve()
39
+ },
40
+ }
41
+ }
@@ -0,0 +1,343 @@
1
+ import { and, eq, ilike, inArray, sql } from 'drizzle-orm'
2
+ import type { SQL } from 'drizzle-orm'
3
+
4
+ import { keysetCondition, orderByWindow, textSort, timestampSort } from '../../lib/pagination.ts'
5
+ import type { ListWindow, SortableFields } from '../../lib/pagination.ts'
6
+ import { containsPattern } from '../../lib/search.ts'
7
+ import type { Queryable } from '../../runtime/transaction.ts'
8
+ import type { RecordTargetType } from '../recordTargets.ts'
9
+ import { listMembers, lists } from './schema.ts'
10
+
11
+ export type ListRecord = typeof lists.$inferSelect
12
+ export type ListColumns = typeof lists.$inferInsert
13
+
14
+ export type ListMemberRecord = typeof listMembers.$inferSelect
15
+ export type ListMemberColumns = typeof listMembers.$inferInsert
16
+
17
+ /**
18
+ * The stored row with the rollup a UI index page needs. `member_count` is
19
+ * computed at read time rather than maintained on write so an unrelated bug
20
+ * cannot leave the count out of step with the actual rows.
21
+ */
22
+ export type ListWithCount = ListRecord & { readonly memberCount: number }
23
+
24
+ export const LIST_SORTS: SortableFields<ListWithCount> = {
25
+ name: textSort(lists.name, (list) => list.name),
26
+ created_at: timestampSort(lists.createdAt, (list) => list.createdAt),
27
+ updated_at: timestampSort(lists.updatedAt, (list) => list.updatedAt),
28
+ }
29
+
30
+ export const DEFAULT_LIST_SORT = '-updated_at'
31
+
32
+ export interface ListFilters {
33
+ readonly term?: string | undefined
34
+ readonly targetType?: RecordTargetType | undefined
35
+ }
36
+
37
+ function conditionsFor(workspaceId: string, filters: ListFilters): (SQL | undefined)[] {
38
+ const term = filters.term
39
+ const targetType = filters.targetType
40
+
41
+ return [
42
+ eq(lists.workspaceId, workspaceId),
43
+ term === undefined ? undefined : ilike(lists.name, containsPattern(term)),
44
+ targetType === undefined ? undefined : eq(lists.targetType, targetType),
45
+ ]
46
+ }
47
+
48
+ /**
49
+ * @returns Up to `window.fetchLimit` rows: one more than the page, so the
50
+ * caller can tell there is a next one. Each row carries the count of members
51
+ * attached to it.
52
+ */
53
+ export async function listLists(
54
+ db: Queryable,
55
+ workspaceId: string,
56
+ filters: ListFilters,
57
+ window: ListWindow<ListWithCount>,
58
+ ): Promise<ListWithCount[]> {
59
+ const rows = await db
60
+ .select()
61
+ .from(lists)
62
+ .where(and(...conditionsFor(workspaceId, filters), keysetCondition(window, lists.id)))
63
+ .orderBy(...orderByWindow(window, lists.id))
64
+ .limit(window.fetchLimit)
65
+
66
+ const counts = await countMembersFor(db, rows.map((row) => row.id))
67
+
68
+ return rows.map((row) => ({ ...row, memberCount: counts.get(row.id) ?? 0 }))
69
+ }
70
+
71
+ async function countMembersFor(
72
+ db: Queryable,
73
+ listIds: readonly string[],
74
+ ): Promise<ReadonlyMap<string, number>> {
75
+ if (listIds.length === 0) {
76
+ return new Map()
77
+ }
78
+
79
+ const rows = await db
80
+ .select({ listId: listMembers.listId, count: sql<number>`count(*)::int` })
81
+ .from(listMembers)
82
+ .where(inArray(listMembers.listId, [...listIds]))
83
+ .groupBy(listMembers.listId)
84
+
85
+ return new Map(rows.map((row) => [row.listId, Number(row.count)]))
86
+ }
87
+
88
+ export async function findList(
89
+ db: Queryable,
90
+ workspaceId: string,
91
+ id: string,
92
+ ): Promise<ListWithCount | undefined> {
93
+ const [found] = await db
94
+ .select()
95
+ .from(lists)
96
+ .where(and(eq(lists.workspaceId, workspaceId), eq(lists.id, id)))
97
+ .limit(1)
98
+
99
+ if (found === undefined) {
100
+ return undefined
101
+ }
102
+
103
+ return { ...found, memberCount: await countMembers(db, id) }
104
+ }
105
+
106
+ /**
107
+ * Bare list rows for a bulk existence + target-type check, without the
108
+ * member-count round trip `findList` pays for. Used by the forms service to
109
+ * validate `list_ids` at write time in one query rather than N.
110
+ */
111
+ export interface ListIdRow {
112
+ readonly id: string
113
+ readonly targetType: string
114
+ readonly consentPurposeId: string | null
115
+ }
116
+
117
+ export async function listListsById(
118
+ db: Queryable,
119
+ workspaceId: string,
120
+ ids: readonly string[],
121
+ ): Promise<ListIdRow[]> {
122
+ if (ids.length === 0) {
123
+ return []
124
+ }
125
+
126
+ return db
127
+ .select({
128
+ id: lists.id,
129
+ targetType: lists.targetType,
130
+ consentPurposeId: lists.consentPurposeId,
131
+ })
132
+ .from(lists)
133
+ .where(and(eq(lists.workspaceId, workspaceId), inArray(lists.id, ids)))
134
+ }
135
+
136
+ async function countMembers(db: Queryable, listId: string): Promise<number> {
137
+ const [row] = await db
138
+ .select({ count: sql<number>`count(*)::int` })
139
+ .from(listMembers)
140
+ .where(eq(listMembers.listId, listId))
141
+
142
+ return Number(row?.count ?? 0)
143
+ }
144
+
145
+ export async function insertList(db: Queryable, values: ListColumns): Promise<ListRecord> {
146
+ const [created] = await db.insert(lists).values(values).returning()
147
+
148
+ if (created === undefined) {
149
+ throw new Error(`Inserting list ${values.id} returned no row`)
150
+ }
151
+
152
+ return created
153
+ }
154
+
155
+ export async function updateList(
156
+ db: Queryable,
157
+ workspaceId: string,
158
+ id: string,
159
+ changes: Partial<ListColumns>,
160
+ ): Promise<ListRecord | undefined> {
161
+ const [updated] = await db
162
+ .update(lists)
163
+ .set(changes)
164
+ .where(and(eq(lists.workspaceId, workspaceId), eq(lists.id, id)))
165
+ .returning()
166
+
167
+ return updated
168
+ }
169
+
170
+ export async function deleteList(db: Queryable, workspaceId: string, id: string): Promise<number> {
171
+ const deleted = await db
172
+ .delete(lists)
173
+ .where(and(eq(lists.workspaceId, workspaceId), eq(lists.id, id)))
174
+ .returning({ id: lists.id })
175
+
176
+ return deleted.length
177
+ }
178
+
179
+ /** Members: no cursor pagination yet. A list's members render on one page today. */
180
+
181
+ export const LIST_MEMBER_SORTS: SortableFields<ListMemberRecord> = {
182
+ added_at: timestampSort(listMembers.addedAt, (row) => row.addedAt),
183
+ }
184
+
185
+ export const DEFAULT_LIST_MEMBER_SORT = '-added_at'
186
+
187
+ export interface ListMemberFilters {
188
+ readonly listId: string
189
+ readonly targetType?: RecordTargetType | undefined
190
+ }
191
+
192
+ function memberConditionsFor(
193
+ workspaceId: string,
194
+ filters: ListMemberFilters,
195
+ ): (SQL | undefined)[] {
196
+ const targetType = filters.targetType
197
+
198
+ return [
199
+ eq(listMembers.workspaceId, workspaceId),
200
+ eq(listMembers.listId, filters.listId),
201
+ targetType === undefined ? undefined : eq(listMembers.targetType, targetType),
202
+ ]
203
+ }
204
+
205
+ export function listListMembers(
206
+ db: Queryable,
207
+ workspaceId: string,
208
+ filters: ListMemberFilters,
209
+ window: ListWindow<ListMemberRecord>,
210
+ ): Promise<ListMemberRecord[]> {
211
+ return db
212
+ .select()
213
+ .from(listMembers)
214
+ .where(and(...memberConditionsFor(workspaceId, filters), keysetCondition(window, listMembers.id)))
215
+ .orderBy(...orderByWindow(window, listMembers.id))
216
+ .limit(window.fetchLimit)
217
+ }
218
+
219
+ export async function findListMember(
220
+ db: Queryable,
221
+ workspaceId: string,
222
+ listId: string,
223
+ id: string,
224
+ ): Promise<ListMemberRecord | undefined> {
225
+ const [found] = await db
226
+ .select()
227
+ .from(listMembers)
228
+ .where(
229
+ and(
230
+ eq(listMembers.workspaceId, workspaceId),
231
+ eq(listMembers.listId, listId),
232
+ eq(listMembers.id, id),
233
+ ),
234
+ )
235
+ .limit(1)
236
+
237
+ return found
238
+ }
239
+
240
+ export async function insertListMember(
241
+ db: Queryable,
242
+ values: ListMemberColumns,
243
+ ): Promise<ListMemberRecord> {
244
+ const [created] = await db.insert(listMembers).values(values).returning()
245
+
246
+ if (created === undefined) {
247
+ throw new Error(`Inserting list_member ${values.id} returned no row`)
248
+ }
249
+
250
+ return created
251
+ }
252
+
253
+ export async function deleteListMember(
254
+ db: Queryable,
255
+ workspaceId: string,
256
+ listId: string,
257
+ id: string,
258
+ ): Promise<number> {
259
+ const deleted = await db
260
+ .delete(listMembers)
261
+ .where(
262
+ and(
263
+ eq(listMembers.workspaceId, workspaceId),
264
+ eq(listMembers.listId, listId),
265
+ eq(listMembers.id, id),
266
+ ),
267
+ )
268
+ .returning({ id: listMembers.id })
269
+
270
+ return deleted.length
271
+ }
272
+
273
+ /** A membership row enriched with the list it points at. */
274
+ export interface MembershipWithList {
275
+ readonly id: string
276
+ readonly listId: string
277
+ readonly listName: string
278
+ readonly listTargetType: string
279
+ readonly targetType: string
280
+ readonly targetId: string
281
+ readonly addedAt: Date
282
+ }
283
+
284
+ /**
285
+ * "Which lists is this record on?"
286
+ *
287
+ * Ordered by list name so a record's Lists tab reads alphabetically and the
288
+ * order does not shift as memberships are added.
289
+ */
290
+ export async function listMembershipsForTarget(
291
+ db: Queryable,
292
+ workspaceId: string,
293
+ targetType: string,
294
+ targetId: string,
295
+ ): Promise<MembershipWithList[]> {
296
+ return db
297
+ .select({
298
+ id: listMembers.id,
299
+ listId: listMembers.listId,
300
+ listName: lists.name,
301
+ listTargetType: lists.targetType,
302
+ targetType: listMembers.targetType,
303
+ targetId: listMembers.targetId,
304
+ addedAt: listMembers.addedAt,
305
+ })
306
+ .from(listMembers)
307
+ .innerJoin(lists, eq(listMembers.listId, lists.id))
308
+ .where(
309
+ and(
310
+ eq(listMembers.workspaceId, workspaceId),
311
+ eq(listMembers.targetType, targetType),
312
+ eq(listMembers.targetId, targetId),
313
+ ),
314
+ )
315
+ .orderBy(lists.name)
316
+ }
317
+
318
+ /**
319
+ * Removes every list membership for one target.
320
+ *
321
+ * The target is polymorphic and carries no foreign key of its own, so nothing
322
+ * in the database deletes these when the target goes. The service that deletes
323
+ * the target calls this inside the same transaction.
324
+ */
325
+ export async function deleteMembershipsForTarget(
326
+ db: Queryable,
327
+ workspaceId: string,
328
+ targetType: string,
329
+ targetId: string,
330
+ ): Promise<number> {
331
+ const deleted = await db
332
+ .delete(listMembers)
333
+ .where(
334
+ and(
335
+ eq(listMembers.workspaceId, workspaceId),
336
+ eq(listMembers.targetType, targetType),
337
+ eq(listMembers.targetId, targetId),
338
+ ),
339
+ )
340
+ .returning({ id: listMembers.id })
341
+
342
+ return deleted.length
343
+ }