@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
@@ -1,3 +1,5 @@
1
+ import type { CustomFieldWireValue } from '@kelpie/schemas'
2
+
1
3
  import { changedKeys } from '../../lib/changes.ts'
2
4
  import type { Database } from '../../lib/database.ts'
3
5
  import { AppError } from '../../lib/errors.ts'
@@ -20,6 +22,8 @@ import { actorMemberId, requireWorkspaceId } from '../auth/actor.ts'
20
22
  import './events.ts'
21
23
  import { deleteRecordsAttachedTo } from '../attachedRecords.ts'
22
24
  import * as companyRepository from '../companies/repository.ts'
25
+ import type { CustomFieldValuesValidator } from '../custom-fields/values.ts'
26
+ import * as personLinks from '../personLinks.ts'
23
27
  import * as pipelineRepository from '../pipelines/repository.ts'
24
28
  import type { PipelineStageRecord } from '../pipelines/repository.ts'
25
29
  import * as repository from './repository.ts'
@@ -29,8 +33,8 @@ import type { DealFilters, DealRecord } from './repository.ts'
29
33
  /**
30
34
  * Deals: the sales pipeline, and the first of the four staged objects.
31
35
  *
32
- * People attach through `deal_people` and appear as `person_ids` on the wire;
33
- * the join table is a storage detail. A stage move is an ordinary PATCH of
36
+ * People attach through `person_links` and appear as `person_ids` on the wire;
37
+ * the polymorphic link table is a storage detail. A stage move is an ordinary PATCH of
34
38
  * `stage_id`, and it is the one change that files a `stage_changed` activity and
35
39
  * a `stage.changed` event instead of the generic update pair.
36
40
  */
@@ -41,6 +45,7 @@ export interface DealsDependencies {
41
45
  readonly createId: IdFactory
42
46
  readonly now: () => Date
43
47
  readonly recordActivity: ActivityRecorder
48
+ readonly customFields: CustomFieldValuesValidator
44
49
  }
45
50
 
46
51
  /** What a changed column is called on a timeline. `whyWin` is why these are written out. */
@@ -79,6 +84,8 @@ export interface CreateDealInput {
79
84
  readonly summary: string
80
85
  readonly tags: readonly string[]
81
86
  readonly externalId: string | null
87
+ /** Wire shape for a create body: `null` values are ignored, non-null are validated. */
88
+ readonly customFields: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
82
89
  }
83
90
 
84
91
  /** PATCH semantics: an absent field is left alone, and null clears a nullable one. */
@@ -98,6 +105,12 @@ export interface UpdateDealInput {
98
105
  readonly summary?: string | undefined
99
106
  readonly tags?: readonly string[] | undefined
100
107
  readonly externalId?: string | null | undefined
108
+ /**
109
+ * Partial merge patch (wire shape): sent keys change, `null` clears a key,
110
+ * absent keys are left alone. The whole object is undefined when the caller
111
+ * sent nothing at all. Unknown keys are `422`.
112
+ */
113
+ readonly customFields?: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
101
114
  }
102
115
 
103
116
  export interface DealsService {
@@ -201,7 +214,7 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
201
214
  workspaceId: string,
202
215
  personIds: readonly string[],
203
216
  ): Promise<ReadonlyMap<string, string>> {
204
- const named = await repository.findPeopleNamed(dependencies.db, workspaceId, personIds)
217
+ const named = await personLinks.findPeopleNamed(dependencies.db, workspaceId, personIds)
205
218
  const missing = personIds.filter((id) => !named.has(id))
206
219
 
207
220
  if (missing.length > 0) {
@@ -216,9 +229,11 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
216
229
  }
217
230
 
218
231
  /** @returns The page's views, with every deal's people fetched in one query. */
219
- async function toViews(records: readonly DealRecord[]): Promise<DealView[]> {
220
- const peopleByDeal = await repository.listPersonIdsFor(
232
+ async function toViews(workspaceId: string, records: readonly DealRecord[]): Promise<DealView[]> {
233
+ const peopleByDeal = await personLinks.listPersonIdsFor(
221
234
  dependencies.db,
235
+ workspaceId,
236
+ 'deal',
222
237
  records.map((record) => record.id),
223
238
  )
224
239
 
@@ -232,14 +247,20 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
232
247
  const rows = await repository.listDeals(dependencies.db, workspaceId, filters, window)
233
248
  const page = toPage(rows, window, (deal) => deal.id)
234
249
 
235
- return { items: await toViews(page.items), nextCursor: page.nextCursor }
250
+ return { items: await toViews(workspaceId, page.items), nextCursor: page.nextCursor }
236
251
  },
237
252
 
238
253
  async get(actor, id) {
239
254
  const workspaceId = requireWorkspaceId(actor)
240
255
  const deal = await require(workspaceId, id)
241
256
 
242
- return toView(deal, await repository.listPersonIds(dependencies.db, id))
257
+ return toView(
258
+ deal,
259
+ await personLinks.listPersonIds(dependencies.db, workspaceId, {
260
+ targetType: 'deal',
261
+ targetId: id,
262
+ }),
263
+ )
243
264
  },
244
265
 
245
266
  async create(actor, input) {
@@ -262,6 +283,12 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
262
283
  const id = dependencies.createId('deal')
263
284
 
264
285
  return dependencies.transaction(async ({ tx, events }) => {
286
+ const customFields = await dependencies.customFields.forCreate(
287
+ tx,
288
+ workspaceId,
289
+ 'deal',
290
+ input.customFields,
291
+ )
265
292
  const created = await repository.insertDeal(tx, {
266
293
  id,
267
294
  workspaceId,
@@ -278,9 +305,16 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
278
305
  summary: input.summary,
279
306
  tags: [...input.tags],
280
307
  externalId: input.externalId,
308
+ customFields,
281
309
  })
282
310
 
283
- await repository.insertDealPeople(tx, id, personIds)
311
+ await personLinks.linkPeople(
312
+ tx,
313
+ dependencies.createId,
314
+ workspaceId,
315
+ { targetType: 'deal', targetId: id },
316
+ personIds,
317
+ )
284
318
 
285
319
  await dependencies.recordActivity(tx, workspaceId, actor, {
286
320
  targetType: 'deal',
@@ -325,7 +359,10 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
325
359
  await requireOwner(workspaceId, changes.ownerId)
326
360
  }
327
361
 
328
- const currentPeople = await repository.listPersonIds(dependencies.db, id)
362
+ const currentPeople = await personLinks.listPersonIds(dependencies.db, workspaceId, {
363
+ targetType: 'deal',
364
+ targetId: id,
365
+ })
329
366
  const nextPeople = changes.personIds === undefined ? undefined : [...new Set(changes.personIds)]
330
367
  const added =
331
368
  nextPeople === undefined ? [] : nextPeople.filter((personId) => !currentPeople.includes(personId))
@@ -334,16 +371,26 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
334
371
  const named = await requirePeople(workspaceId, [...added, ...removed])
335
372
 
336
373
  const columns = toStoredColumns(changes)
337
- const changed = changedKeys(existing, columns)
374
+ const scalarChanged = changedKeys(existing, columns)
338
375
  const linksChanged = added.length > 0 || removed.length > 0
339
376
 
340
- if (changed.length === 0 && !linksChanged) {
341
- return toView(existing, currentPeople)
342
- }
343
-
344
377
  return dependencies.transaction(async ({ tx, events }) => {
378
+ const cf = await dependencies.customFields.forUpdate(
379
+ tx,
380
+ workspaceId,
381
+ 'deal',
382
+ existing.customFields,
383
+ changes.customFields,
384
+ )
385
+ const customFieldsChanged = cf !== undefined && cf.changedPaths.length > 0
386
+
387
+ if (scalarChanged.length === 0 && !linksChanged && !customFieldsChanged) {
388
+ return toView(existing, currentPeople)
389
+ }
390
+
345
391
  const updated = await repository.updateDeal(tx, workspaceId, id, {
346
392
  ...columns,
393
+ ...(customFieldsChanged ? { customFields: cf.merged } : {}),
347
394
  updatedAt: dependencies.now(),
348
395
  })
349
396
 
@@ -351,8 +398,19 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
351
398
  throw AppError.notFound('Deal not found')
352
399
  }
353
400
 
354
- await repository.insertDealPeople(tx, id, added)
355
- await repository.deleteDealPeople(tx, id, removed)
401
+ await personLinks.linkPeople(
402
+ tx,
403
+ dependencies.createId,
404
+ workspaceId,
405
+ { targetType: 'deal', targetId: id },
406
+ added,
407
+ )
408
+ await personLinks.unlinkPeople(
409
+ tx,
410
+ workspaceId,
411
+ { targetType: 'deal', targetId: id },
412
+ removed,
413
+ )
356
414
 
357
415
  if (stageMove !== undefined) {
358
416
  await dependencies.recordActivity(tx, workspaceId, actor, {
@@ -363,14 +421,19 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
363
421
  })
364
422
  }
365
423
 
366
- const otherChanged = changed.filter((field) => field !== 'stageId')
424
+ const otherChanged = scalarChanged.filter((field) => field !== 'stageId')
425
+ const customFieldPaths = cf?.changedPaths ?? []
426
+ const activityChanged = [...otherChanged, ...customFieldPaths]
367
427
 
368
- if (otherChanged.length > 0) {
428
+ if (activityChanged.length > 0) {
429
+ const labels: Record<string, string> = { ...DEAL_FIELD_LABELS, ...cf?.labels }
430
+ const before: Record<string, unknown> = { ...existing, ...cf?.flatBefore }
431
+ const after: Record<string, unknown> = { ...columns, ...cf?.flatAfter }
369
432
  await dependencies.recordActivity(tx, workspaceId, actor, {
370
433
  targetType: 'deal',
371
434
  targetId: id,
372
435
  kind: 'updated',
373
- ...describeUpdate(otherChanged, DEAL_FIELD_LABELS, existing, columns),
436
+ ...describeUpdate(activityChanged, labels, before, after),
374
437
  })
375
438
  }
376
439
 
@@ -398,7 +461,13 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
398
461
  events.emit(
399
462
  'deals.deal.updated',
400
463
  { type: 'deal', id },
401
- { changed: linksChanged ? [...changed, 'personIds'] : changed },
464
+ {
465
+ changed: [
466
+ ...scalarChanged,
467
+ ...(linksChanged ? ['personIds'] : []),
468
+ ...customFieldPaths,
469
+ ],
470
+ },
402
471
  )
403
472
 
404
473
  if (stageMove !== undefined) {
@@ -419,9 +488,9 @@ export function createDealsService(dependencies: DealsDependencies): DealsServic
419
488
  await dependencies.transaction(async ({ tx, events }) => {
420
489
  await require(workspaceId, id)
421
490
 
422
- // `deal_people` dies with the deal through its foreign key and form
423
- // submissions unlink themselves; notes, activities, decisions and plan
424
- // items have no key, so they are removed here, in the same transaction.
491
+ // Form submissions unlink themselves through `set null`; notes,
492
+ // activities, decisions, plan items, and person_links have no key back
493
+ // to the deal, so they are removed here, in the same transaction.
425
494
  await deleteRecordsAttachedTo(tx, workspaceId, 'deal', id)
426
495
  await repository.deleteDeal(tx, workspaceId, id)
427
496
 
@@ -7,6 +7,7 @@ import { containsPattern } from '../../lib/search.ts'
7
7
  import type { Queryable } from '../../runtime/transaction.ts'
8
8
  import { companies } from '../companies/schema.ts'
9
9
  import { deals } from '../deals/schema.ts'
10
+ import { enquiries } from '../enquiries/schema.ts'
10
11
  import { opportunities } from '../opportunities/schema.ts'
11
12
  import { partnerships } from '../partnerships/schema.ts'
12
13
  import { people } from '../people/schema.ts'
@@ -55,6 +56,7 @@ const NAMED_TARGET_TABLES = [
55
56
  { table: opportunities, id: opportunities.id, workspaceId: opportunities.workspaceId, name: opportunities.name },
56
57
  { table: partnerships, id: partnerships.id, workspaceId: partnerships.workspaceId, name: partnerships.name },
57
58
  { table: raises, id: raises.id, workspaceId: raises.workspaceId, name: raises.name },
59
+ { table: enquiries, id: enquiries.id, workspaceId: enquiries.workspaceId, name: enquiries.name },
58
60
  ]
59
61
 
60
62
  /**
@@ -0,0 +1,40 @@
1
+ import type { KelpieModule } from '../../runtime/module.ts'
2
+ import { createActivityRecorder } from '../activities/index.ts'
3
+ import { mountEmailDomainLinkerRoutes } from './routes.ts'
4
+ import { createEmailDomainLinkerService } from './service.ts'
5
+
6
+ /**
7
+ * Rebuild every email-domain link across the workspace.
8
+ *
9
+ * Owns no tables. Requires the modules whose data the sweep reads and writes.
10
+ * The sweep is the same one the companies service runs on a domain change,
11
+ * applied to every workspace Company at once — used to backfill links for
12
+ * data that predates the auto-linker, or after a bulk import.
13
+ */
14
+ export function createEmailDomainLinkerModule(): KelpieModule {
15
+ return {
16
+ id: 'email-domain-linker',
17
+ requires: ['workspace', 'companies', 'people', 'positions', 'activities'],
18
+
19
+ register(context) {
20
+ const service = createEmailDomainLinkerService({
21
+ db: context.db,
22
+ transaction: context.transaction,
23
+ createId: context.createId,
24
+ now: context.now,
25
+ recordActivity: createActivityRecorder({
26
+ createId: context.createId,
27
+ now: context.now,
28
+ }),
29
+ })
30
+
31
+ context.routes((router) => {
32
+ mountEmailDomainLinkerRoutes(router, { db: context.db, now: context.now, service })
33
+ })
34
+
35
+ return Promise.resolve()
36
+ },
37
+ }
38
+ }
39
+
40
+ export type { EmailDomainLinkerService, RelinkCounts } from './service.ts'
@@ -0,0 +1,40 @@
1
+ import type { Context, Hono } from 'hono'
2
+
3
+ import type { Actor } from '../auth/actor.ts'
4
+ import { resolveActorFrom } from '../auth/credentials.ts'
5
+ import type { CredentialDependencies } from '../auth/credentials.ts'
6
+ import type { EmailDomainLinkerService, RelinkCounts } from './service.ts'
7
+
8
+ /**
9
+ * Wire shape for `POST /v1/workspaces/:id/relink-email-domains`.
10
+ *
11
+ * No request body. The response counts what the sweep did.
12
+ */
13
+
14
+ export interface EmailDomainLinkerRoutesDependencies extends CredentialDependencies {
15
+ readonly service: EmailDomainLinkerService
16
+ }
17
+
18
+ export function relinkResponse(counts: RelinkCounts): Record<string, unknown> {
19
+ return {
20
+ companies_scanned: counts.companiesScanned,
21
+ positions_created: counts.positionsCreated,
22
+ }
23
+ }
24
+
25
+ export function mountEmailDomainLinkerRoutes(
26
+ router: Hono,
27
+ dependencies: EmailDomainLinkerRoutesDependencies,
28
+ ): void {
29
+ const requireActor = (context: Context): Promise<Actor> =>
30
+ resolveActorFrom(dependencies, context)
31
+
32
+ router.post('/workspaces/:id/relink-email-domains', async (context) => {
33
+ const counts = await dependencies.service.relink(
34
+ await requireActor(context),
35
+ context.req.param('id'),
36
+ )
37
+
38
+ return context.json(relinkResponse(counts))
39
+ })
40
+ }
@@ -0,0 +1,122 @@
1
+ import { and, eq, isNotNull } from 'drizzle-orm'
2
+
3
+ import { toEventActor } from '../../lib/actor.ts'
4
+ import type { Database } from '../../lib/database.ts'
5
+ import { autoLinkCompanyByDomain } from '../../lib/emailDomainAutoLink.ts'
6
+ import { AppError } from '../../lib/errors.ts'
7
+ import type { IdFactory } from '../../lib/ids.ts'
8
+ import type { TransactionScope } from '../../runtime/transaction.ts'
9
+ import type { ActivityRecorder } from '../activities/recorder.ts'
10
+ import type { Actor } from '../auth/actor.ts'
11
+ import { requireWorkspaceId } from '../auth/actor.ts'
12
+ import * as authRepository from '../auth/repository.ts'
13
+ import { companies } from '../companies/schema.ts'
14
+ import { parseMemberRole, roleAllows } from '../workspace/roles.ts'
15
+
16
+ /**
17
+ * Rebuild every email-domain link across the workspace.
18
+ *
19
+ * Iterates each Company that carries a domain and runs the same sweep the
20
+ * companies service runs on a domain change — every workspace Person whose
21
+ * email is at that domain gets a titleless Position where none exists yet.
22
+ *
23
+ * Idempotent: a follow-up run adds nothing. Add-only, consumer-host-skipping,
24
+ * and workspace-scoped, same as the inline auto-linker.
25
+ *
26
+ * One transaction per Company, not one for the whole sweep. A workspace can
27
+ * carry thousands of Companies, and a single transaction that long would
28
+ * hold row-share locks against every write elsewhere for the whole run.
29
+ */
30
+
31
+ export interface EmailDomainLinkerDependencies {
32
+ readonly db: Database
33
+ readonly transaction: TransactionScope
34
+ readonly createId: IdFactory
35
+ readonly now: () => Date
36
+ readonly recordActivity: ActivityRecorder
37
+ }
38
+
39
+ export interface RelinkCounts {
40
+ /** Companies with a non-null domain that were considered. Consumer hosts are counted but skipped. */
41
+ readonly companiesScanned: number
42
+ /** New Positions the sweep inserted this run. */
43
+ readonly positionsCreated: number
44
+ }
45
+
46
+ export interface EmailDomainLinkerService {
47
+ relink(actor: Actor, workspaceId: string): Promise<RelinkCounts>
48
+ }
49
+
50
+ export function createEmailDomainLinkerService(
51
+ dependencies: EmailDomainLinkerDependencies,
52
+ ): EmailDomainLinkerService {
53
+ async function requireAdmin(actor: Actor, workspaceId: string): Promise<void> {
54
+ if (actor.workspaceId !== workspaceId) {
55
+ throw AppError.notFound('Workspace not found')
56
+ }
57
+
58
+ if (actor.kind === 'api_key' && actor.userId === null) {
59
+ if (!roleAllows(actor.role, 'admin')) {
60
+ throw new AppError('forbidden', 'This action needs the admin role')
61
+ }
62
+ return
63
+ }
64
+
65
+ const userId = actor.userId
66
+
67
+ if (userId === null) {
68
+ throw AppError.notFound('Workspace not found')
69
+ }
70
+
71
+ const membership = await authRepository.findMembership(dependencies.db, workspaceId, userId)
72
+
73
+ if (membership === undefined) {
74
+ throw AppError.notFound('Workspace not found')
75
+ }
76
+
77
+ const role = parseMemberRole(membership.role)
78
+
79
+ if (role === undefined) {
80
+ throw new Error(`workspace_members.role holds "${membership.role}", which its check forbids`)
81
+ }
82
+
83
+ if (!roleAllows(role, 'admin')) {
84
+ throw new AppError('forbidden', 'This action needs the admin role')
85
+ }
86
+ }
87
+
88
+ return {
89
+ async relink(actor, workspaceId) {
90
+ requireWorkspaceId(actor)
91
+ await requireAdmin(actor, workspaceId)
92
+
93
+ // Every workspace Company that carries a domain — the ones the sweep
94
+ // can match against. Pooled read outside the per-company transactions:
95
+ // the work-list is one query, each write opens its own scope.
96
+ const rows = await dependencies.db
97
+ .select()
98
+ .from(companies)
99
+ .where(and(eq(companies.workspaceId, workspaceId), isNotNull(companies.domain)))
100
+
101
+ let created = 0
102
+
103
+ // One transaction per Company, not one for the whole sweep. A workspace
104
+ // can carry thousands of Companies; a single transaction that long would
105
+ // hold row-share locks against every write elsewhere for the whole run.
106
+ for (const company of rows) {
107
+ const inserted = await dependencies.transaction(
108
+ async ({ tx, events }) =>
109
+ autoLinkCompanyByDomain(tx, events, workspaceId, company, {
110
+ createId: dependencies.createId,
111
+ now: dependencies.now,
112
+ recordActivity: dependencies.recordActivity,
113
+ }),
114
+ { workspaceId, actor: toEventActor(actor) },
115
+ )
116
+ created += inserted.length
117
+ }
118
+
119
+ return { companiesScanned: rows.length, positionsCreated: created }
120
+ },
121
+ }
122
+ }
@@ -0,0 +1,45 @@
1
+ import { z } from 'zod'
2
+
3
+ import type { ModuleEventCatalog } from '../../runtime/module.ts'
4
+
5
+ /** Domain events published by the enquiries module. */
6
+
7
+ export const enquiriesEvents = {
8
+ 'enquiries.enquiry.created': z.object({}).strict(),
9
+ 'enquiries.enquiry.updated': z.object({ changed: z.array(z.string()).readonly() }),
10
+ 'enquiries.enquiry.deleted': z.object({}).strict(),
11
+ 'enquiries.enquiry.stage_changed': z.object({
12
+ fromStageId: z.string().nullable(),
13
+ toStageId: z.string(),
14
+ }),
15
+ /**
16
+ * The enquiry has been converted to a Deal. Fires from
17
+ * `POST /v1/enquiries/:id/convert`. Not deliverable as a webhook: consumers
18
+ * outside Kelpie subscribe to `record.created` on the deal instead. Kept for
19
+ * internal listeners that want the semantic signal.
20
+ */
21
+ 'enquiries.enquiry.converted': z.object({ dealId: z.string() }),
22
+ } satisfies ModuleEventCatalog
23
+
24
+ export type EnquiryCreatedData = Record<string, never>
25
+ export interface EnquiryUpdatedData {
26
+ readonly changed: readonly string[]
27
+ }
28
+ export type EnquiryDeletedData = Record<string, never>
29
+ export interface EnquiryStageChangedData {
30
+ readonly fromStageId: string | null
31
+ readonly toStageId: string
32
+ }
33
+ export interface EnquiryConvertedData {
34
+ readonly dealId: string
35
+ }
36
+
37
+ declare module '../../runtime/events.ts' {
38
+ interface KelpieEventMap {
39
+ 'enquiries.enquiry.created': EnquiryCreatedData
40
+ 'enquiries.enquiry.updated': EnquiryUpdatedData
41
+ 'enquiries.enquiry.deleted': EnquiryDeletedData
42
+ 'enquiries.enquiry.stage_changed': EnquiryStageChangedData
43
+ 'enquiries.enquiry.converted': EnquiryConvertedData
44
+ }
45
+ }
@@ -0,0 +1,50 @@
1
+ import type { KelpieModule } from '../../runtime/module.ts'
2
+ import { createActivityRecorder } from '../activities/index.ts'
3
+ import { createCustomFieldValues } from '../custom-fields/index.ts'
4
+ import { enquiriesEvents } from './events.ts'
5
+ import { mountEnquiriesRoutes } from './routes.ts'
6
+ import * as schema from './schema.ts'
7
+ import { createEnquiriesService } from './service.ts'
8
+ import { registerEnquiriesTools } from './tools.ts'
9
+
10
+ /**
11
+ * Enquiries: the top-of-funnel pipeline.
12
+ *
13
+ * Requires its relations because creating one checks that the company, stage,
14
+ * and owner are all in the caller's workspace before linking them, and
15
+ * `activities` because every write leaves its timeline entry in the same
16
+ * transaction. `deals` is required for `convertToDeal`, which inserts into
17
+ * the deals table directly (the standard cross-module write pattern, per
18
+ * `architecture.md`).
19
+ */
20
+ export function createEnquiriesModule(migrationsDirectory: string): KelpieModule {
21
+ return {
22
+ id: 'enquiries',
23
+ requires: ['companies', 'pipelines', 'activities', 'custom-fields', 'deals'],
24
+ events: enquiriesEvents,
25
+
26
+ register(context) {
27
+ const service = createEnquiriesService({
28
+ db: context.db,
29
+ transaction: context.transaction,
30
+ createId: context.createId,
31
+ now: context.now,
32
+ recordActivity: createActivityRecorder({
33
+ createId: context.createId,
34
+ now: context.now,
35
+ }),
36
+ customFields: createCustomFieldValues({ db: context.db }),
37
+ })
38
+
39
+ context.schema(schema, migrationsDirectory)
40
+
41
+ context.routes((router) => {
42
+ mountEnquiriesRoutes(router, { db: context.db, now: context.now, service })
43
+ })
44
+
45
+ registerEnquiriesTools(context.mcp, service)
46
+
47
+ return Promise.resolve()
48
+ },
49
+ }
50
+ }