@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
@@ -17,11 +17,13 @@ import type {
17
17
  export const createBody = z.strictObject({
18
18
  person_id: z.string().min(1),
19
19
  company_id: z.string().min(1),
20
- title: z.string().min(1),
20
+ // An empty title records the link without a job title — a person known to be
21
+ // at the company, with the role not yet captured.
22
+ title: z.string(),
21
23
  })
22
24
 
23
25
  /** Only the title. Moving a link to a different person or company is a delete and a create. */
24
- export const updateBody = z.strictObject({ title: z.string().min(1) }).partial()
26
+ export const updateBody = z.strictObject({ title: z.string() }).partial()
25
27
 
26
28
  export interface PositionsRoutesDependencies extends CredentialDependencies {
27
29
  readonly service: PositionsService
@@ -1,5 +1,6 @@
1
1
  import type { KelpieModule } from '../../runtime/module.ts'
2
2
  import { createActivityRecorder } from '../activities/index.ts'
3
+ import { createCustomFieldValues } from '../custom-fields/index.ts'
3
4
  import { raisesEvents } from './events.ts'
4
5
  import { mountRaisesRoutes } from './routes.ts'
5
6
  import * as schema from './schema.ts'
@@ -17,7 +18,7 @@ import { registerRaisesTools } from './tools.ts'
17
18
  export function createRaisesModule(migrationsDirectory: string): KelpieModule {
18
19
  return {
19
20
  id: 'raises',
20
- requires: ['companies', 'people', 'pipelines', 'activities'],
21
+ requires: ['companies', 'people', 'pipelines', 'activities', 'custom-fields'],
21
22
  events: raisesEvents,
22
23
 
23
24
  register(context) {
@@ -30,6 +31,7 @@ export function createRaisesModule(migrationsDirectory: string): KelpieModule {
30
31
  createId: context.createId,
31
32
  now: context.now,
32
33
  }),
34
+ customFields: createCustomFieldValues({ db: context.db }),
33
35
  })
34
36
 
35
37
  context.schema(schema, migrationsDirectory)
@@ -1,4 +1,4 @@
1
- import { and, asc, eq, ilike, inArray, or, sql } from 'drizzle-orm'
1
+ import { and, eq, ilike, inArray, or, sql } from 'drizzle-orm'
2
2
  import type { SQL } from 'drizzle-orm'
3
3
 
4
4
  import { keysetCondition, orderByWindow, textSort, timestampSort } from '../../lib/pagination.ts'
@@ -6,9 +6,9 @@ import type { ListWindow, SortableFields } from '../../lib/pagination.ts'
6
6
  import { arrayContainsPattern, containsPattern } from '../../lib/search.ts'
7
7
  import type { Queryable } from '../../runtime/transaction.ts'
8
8
  import { companies } from '../companies/schema.ts'
9
- import { people } from '../people/schema.ts'
9
+ import { anyPersonLinked } from '../personLinks.ts'
10
10
  import { workspaceMembers } from '../workspace/schema.ts'
11
- import { raisePeople, raises } from './schema.ts'
11
+ import { raises } from './schema.ts'
12
12
 
13
13
  export type RaiseRecord = typeof raises.$inferSelect
14
14
 
@@ -52,15 +52,6 @@ function companyNameMatches(pattern: string): SQL {
52
52
  )`
53
53
  }
54
54
 
55
- function hasAnyOfPeople(personIds: readonly string[]): SQL {
56
- return sql`exists (
57
- select 1
58
- from ${raisePeople}
59
- where ${raisePeople.raiseId} = ${raises.id}
60
- and ${inArray(raisePeople.personId, personIds)}
61
- )`
62
- }
63
-
64
55
  function matchesTerm(term: string): SQL | undefined {
65
56
  const pattern = containsPattern(term)
66
57
 
@@ -78,7 +69,9 @@ function conditionsFor(workspaceId: string, filters: RaiseFilters): (SQL | undef
78
69
  filters.term === undefined ? undefined : matchesTerm(filters.term),
79
70
  filters.companyIds === undefined ? undefined : inArray(raises.companyId, filters.companyIds),
80
71
  filters.stageIds === undefined ? undefined : inArray(raises.stageId, filters.stageIds),
81
- filters.personIds === undefined ? undefined : hasAnyOfPeople(filters.personIds),
72
+ filters.personIds === undefined
73
+ ? undefined
74
+ : anyPersonLinked('raise', raises.id, raises.workspaceId, filters.personIds),
82
75
  ]
83
76
  }
84
77
 
@@ -145,100 +138,6 @@ export async function deleteRaise(db: Queryable, workspaceId: string, id: string
145
138
  return deleted.length
146
139
  }
147
140
 
148
- /** The key people on one raise. Ordered by id so a response is stable across reads. */
149
- export async function listPersonIds(db: Queryable, raiseId: string): Promise<string[]> {
150
- const rows = await db
151
- .select({ personId: raisePeople.personId })
152
- .from(raisePeople)
153
- .where(eq(raisePeople.raiseId, raiseId))
154
- .orderBy(asc(raisePeople.personId))
155
-
156
- return rows.map((row) => row.personId)
157
- }
158
-
159
- /**
160
- * The key people on each of a page of raises, in one query rather than one per
161
- * row.
162
- *
163
- * @returns Ids missing from the map have no people.
164
- */
165
- export async function listPersonIdsFor(
166
- db: Queryable,
167
- raiseIds: readonly string[],
168
- ): Promise<ReadonlyMap<string, readonly string[]>> {
169
- if (raiseIds.length === 0) {
170
- return new Map()
171
- }
172
-
173
- const rows = await db
174
- .select({ raiseId: raisePeople.raiseId, personId: raisePeople.personId })
175
- .from(raisePeople)
176
- .where(inArray(raisePeople.raiseId, raiseIds))
177
- .orderBy(asc(raisePeople.personId))
178
-
179
- const byRaise = new Map<string, string[]>()
180
-
181
- for (const row of rows) {
182
- const existing = byRaise.get(row.raiseId)
183
-
184
- if (existing === undefined) {
185
- byRaise.set(row.raiseId, [row.personId])
186
- } else {
187
- existing.push(row.personId)
188
- }
189
- }
190
-
191
- return byRaise
192
- }
193
-
194
- export async function insertRaisePeople(
195
- db: Queryable,
196
- raiseId: string,
197
- personIds: readonly string[],
198
- ): Promise<void> {
199
- if (personIds.length === 0) {
200
- return
201
- }
202
-
203
- await db.insert(raisePeople).values(personIds.map((personId) => ({ raiseId, personId })))
204
- }
205
-
206
- export async function deleteRaisePeople(
207
- db: Queryable,
208
- raiseId: string,
209
- personIds: readonly string[],
210
- ): Promise<void> {
211
- if (personIds.length === 0) {
212
- return
213
- }
214
-
215
- await db
216
- .delete(raisePeople)
217
- .where(and(eq(raisePeople.raiseId, raiseId), inArray(raisePeople.personId, personIds)))
218
- }
219
-
220
- /**
221
- * The names of these people in this workspace, keyed by id. An id missing from
222
- * the map does not exist here, which is how `person_ids` is validated. Reads the
223
- * `people` *table*, per the cross-relation rule in `architecture.md`.
224
- */
225
- export async function findPeopleNamed(
226
- db: Queryable,
227
- workspaceId: string,
228
- personIds: readonly string[],
229
- ): Promise<ReadonlyMap<string, string>> {
230
- if (personIds.length === 0) {
231
- return new Map()
232
- }
233
-
234
- const rows = await db
235
- .select({ id: people.id, name: people.name })
236
- .from(people)
237
- .where(and(eq(people.workspaceId, workspaceId), inArray(people.id, personIds)))
238
-
239
- return new Map(rows.map((row) => [row.id, row.name]))
240
- }
241
-
242
141
  /** Whether a member belongs to this workspace, for validating `owner_id`. */
243
142
  export async function memberExists(
244
143
  db: Queryable,
@@ -1,3 +1,4 @@
1
+ import { customFieldsPatchShape } from '@kelpie/schemas'
1
2
  import type { Context, Hono } from 'hono'
2
3
  import { z } from 'zod'
3
4
 
@@ -6,6 +7,7 @@ import { pageBody, readIdFilter, readJsonBody, readListParameters } from '../../
6
7
  import type { Actor } from '../auth/actor.ts'
7
8
  import { resolveActorFrom } from '../auth/credentials.ts'
8
9
  import type { CredentialDependencies } from '../auth/credentials.ts'
10
+ import { renderCustomFieldsForWire } from '../custom-fields/wire.ts'
9
11
  import type { CreateRaiseInput, RaiseView, RaisesService, UpdateRaiseInput } from './service.ts'
10
12
 
11
13
  /** Wire shapes for `/v1/raises`. Bodies are strict; an unknown field is a 422, per `api.md`. */
@@ -26,6 +28,7 @@ const raiseShape = {
26
28
  person_ids: z.array(z.string().min(1)),
27
29
  summary: z.string(),
28
30
  tags: z.array(z.string().min(1)),
31
+ custom_fields: customFieldsPatchShape,
29
32
  }
30
33
 
31
34
  /**
@@ -48,6 +51,7 @@ export const createBody = z.strictObject({
48
51
  person_ids: raiseShape.person_ids.default([]),
49
52
  summary: raiseShape.summary.default(''),
50
53
  tags: raiseShape.tags.default([]),
54
+ custom_fields: raiseShape.custom_fields.default({}),
51
55
  })
52
56
 
53
57
  export const updateBody = z.strictObject(raiseShape).partial()
@@ -70,6 +74,7 @@ export function toCreateInput(body: z.infer<typeof createBody>): CreateRaiseInpu
70
74
  personIds: body.person_ids,
71
75
  summary: body.summary,
72
76
  tags: body.tags,
77
+ customFields: body.custom_fields,
73
78
  }
74
79
  }
75
80
 
@@ -87,6 +92,7 @@ export function toUpdateInput(body: z.infer<typeof updateBody>): UpdateRaiseInpu
87
92
  ...(body.person_ids === undefined ? {} : { personIds: body.person_ids }),
88
93
  ...(body.summary === undefined ? {} : { summary: body.summary }),
89
94
  ...(body.tags === undefined ? {} : { tags: body.tags }),
95
+ ...(body.custom_fields === undefined ? {} : { customFields: body.custom_fields }),
90
96
  }
91
97
  }
92
98
 
@@ -105,6 +111,7 @@ export function raiseResponse(raise: RaiseView): Record<string, unknown> {
105
111
  person_ids: raise.personIds,
106
112
  summary: raise.summary,
107
113
  tags: raise.tags,
114
+ custom_fields: renderCustomFieldsForWire(raise.customFields),
108
115
  created_at: raise.createdAt.toISOString(),
109
116
  updated_at: raise.updatedAt.toISOString(),
110
117
  }
@@ -1,9 +1,9 @@
1
- import { bigint, date, index, pgTable, primaryKey, text } from 'drizzle-orm/pg-core'
1
+ import type { CustomFieldValue } from '@kelpie/schemas'
2
+ import { bigint, date, index, jsonb, pgTable, text } from 'drizzle-orm/pg-core'
2
3
 
3
4
  import { createdAt, primaryId, searchVector, updatedAt } from '../../lib/columns.ts'
4
5
  import type { SearchVectorPart } from '../../lib/columns.ts'
5
6
  import { companies } from '../companies/schema.ts'
6
- import { people } from '../people/schema.ts'
7
7
  import { pipelineStages } from '../pipelines/schema.ts'
8
8
  import { workspaceMembers, workspaces } from '../workspace/schema.ts'
9
9
 
@@ -34,6 +34,11 @@ export const raises = pgTable(
34
34
  expectedClose: date('expected_close'),
35
35
  summary: text('summary').notNull().default(''),
36
36
  tags: text('tags').array().notNull().default([]),
37
+ // Workspace-defined fields, keyed by definition key. See people/schema.ts.
38
+ customFields: jsonb('custom_fields')
39
+ .$type<Readonly<Record<string, CustomFieldValue>>>()
40
+ .notNull()
41
+ .default({}),
37
42
  createdAt: createdAt(),
38
43
  updatedAt: updatedAt(),
39
44
  searchVector: searchVector((): readonly SearchVectorPart[] => [
@@ -52,15 +57,3 @@ export const raises = pgTable(
52
57
  ],
53
58
  )
54
59
 
55
- export const raisePeople = pgTable(
56
- 'raise_people',
57
- {
58
- raiseId: text('raise_id')
59
- .notNull()
60
- .references(() => raises.id, { onDelete: 'cascade' }),
61
- personId: text('person_id')
62
- .notNull()
63
- .references(() => people.id, { onDelete: 'restrict' }),
64
- },
65
- (table) => [primaryKey({ columns: [table.raiseId, table.personId] })],
66
- )
@@ -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'
@@ -31,7 +35,7 @@ import type { RaiseFilters, RaiseRecord } from './repository.ts'
31
35
  * passed. The firm is `company_id`; the ongoing relationship with that firm
32
36
  * stays a Partnership (`brief.md`).
33
37
  *
34
- * Key people attach through `raise_people` and appear as `person_ids` on the
38
+ * Key people attach through `person_links` and appear as `person_ids` on the
35
39
  * wire, and the check size is integer cents plus an ISO 4217 code, both the
36
40
  * Deals mechanics. A stage move is an ordinary PATCH of `stage_id`, and it is
37
41
  * the one change that files a `stage_changed` activity and a `stage.changed`
@@ -44,6 +48,7 @@ export interface RaisesDependencies {
44
48
  readonly createId: IdFactory
45
49
  readonly now: () => Date
46
50
  readonly recordActivity: ActivityRecorder
51
+ readonly customFields: CustomFieldValuesValidator
47
52
  }
48
53
 
49
54
  /** What a changed column is called on a timeline. The mockup says Firm and Target close, not Company and Expected close. */
@@ -89,6 +94,8 @@ export interface CreateRaiseInput {
89
94
  readonly personIds: readonly string[]
90
95
  readonly summary: string
91
96
  readonly tags: readonly string[]
97
+ /** Wire shape for a create body: `null` values are ignored, non-null are validated. */
98
+ readonly customFields: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
92
99
  }
93
100
 
94
101
  /** PATCH semantics: an absent field is left alone, and null clears a nullable one. */
@@ -106,6 +113,11 @@ export interface UpdateRaiseInput {
106
113
  readonly personIds?: readonly string[] | undefined
107
114
  readonly summary?: string | undefined
108
115
  readonly tags?: readonly string[] | undefined
116
+ /**
117
+ * Partial merge patch (wire shape): sent keys change, `null` clears a key,
118
+ * absent keys are left alone. Unknown keys are `422`.
119
+ */
120
+ readonly customFields?: Readonly<Record<string, CustomFieldWireValue | null>> | undefined
109
121
  }
110
122
 
111
123
  export interface RaisesService {
@@ -207,7 +219,7 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
207
219
  workspaceId: string,
208
220
  personIds: readonly string[],
209
221
  ): Promise<ReadonlyMap<string, string>> {
210
- const named = await repository.findPeopleNamed(dependencies.db, workspaceId, personIds)
222
+ const named = await personLinks.findPeopleNamed(dependencies.db, workspaceId, personIds)
211
223
  const missing = personIds.filter((id) => !named.has(id))
212
224
 
213
225
  if (missing.length > 0) {
@@ -222,9 +234,14 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
222
234
  }
223
235
 
224
236
  /** @returns The page's views, with every raise's people fetched in one query. */
225
- async function toViews(records: readonly RaiseRecord[]): Promise<RaiseView[]> {
226
- const peopleByRaise = await repository.listPersonIdsFor(
237
+ async function toViews(
238
+ workspaceId: string,
239
+ records: readonly RaiseRecord[],
240
+ ): Promise<RaiseView[]> {
241
+ const peopleByRaise = await personLinks.listPersonIdsFor(
227
242
  dependencies.db,
243
+ workspaceId,
244
+ 'raise',
228
245
  records.map((record) => record.id),
229
246
  )
230
247
 
@@ -238,14 +255,20 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
238
255
  const rows = await repository.listRaises(dependencies.db, workspaceId, filters, window)
239
256
  const page = toPage(rows, window, (raise) => raise.id)
240
257
 
241
- return { items: await toViews(page.items), nextCursor: page.nextCursor }
258
+ return { items: await toViews(workspaceId, page.items), nextCursor: page.nextCursor }
242
259
  },
243
260
 
244
261
  async get(actor, id) {
245
262
  const workspaceId = requireWorkspaceId(actor)
246
263
  const raise = await require(workspaceId, id)
247
264
 
248
- return toView(raise, await repository.listPersonIds(dependencies.db, id))
265
+ return toView(
266
+ raise,
267
+ await personLinks.listPersonIds(dependencies.db, workspaceId, {
268
+ targetType: 'raise',
269
+ targetId: id,
270
+ }),
271
+ )
249
272
  },
250
273
 
251
274
  async create(actor, input) {
@@ -268,6 +291,12 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
268
291
  const id = dependencies.createId('raise')
269
292
 
270
293
  return dependencies.transaction(async ({ tx, events }) => {
294
+ const customFields = await dependencies.customFields.forCreate(
295
+ tx,
296
+ workspaceId,
297
+ 'raise',
298
+ input.customFields,
299
+ )
271
300
  const created = await repository.insertRaise(tx, {
272
301
  id,
273
302
  workspaceId,
@@ -282,9 +311,16 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
282
311
  expectedClose: input.expectedClose,
283
312
  summary: input.summary,
284
313
  tags: [...input.tags],
314
+ customFields,
285
315
  })
286
316
 
287
- await repository.insertRaisePeople(tx, id, personIds)
317
+ await personLinks.linkPeople(
318
+ tx,
319
+ dependencies.createId,
320
+ workspaceId,
321
+ { targetType: 'raise', targetId: id },
322
+ personIds,
323
+ )
288
324
 
289
325
  await dependencies.recordActivity(tx, workspaceId, actor, {
290
326
  targetType: 'raise',
@@ -329,7 +365,10 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
329
365
  await requireOwner(workspaceId, changes.ownerId)
330
366
  }
331
367
 
332
- const currentPeople = await repository.listPersonIds(dependencies.db, id)
368
+ const currentPeople = await personLinks.listPersonIds(dependencies.db, workspaceId, {
369
+ targetType: 'raise',
370
+ targetId: id,
371
+ })
333
372
  const nextPeople =
334
373
  changes.personIds === undefined ? undefined : [...new Set(changes.personIds)]
335
374
  const added =
@@ -343,16 +382,26 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
343
382
  const named = await requirePeople(workspaceId, [...added, ...removed])
344
383
 
345
384
  const columns = toStoredColumns(changes)
346
- const changed = changedKeys(existing, columns)
385
+ const scalarChanged = changedKeys(existing, columns)
347
386
  const linksChanged = added.length > 0 || removed.length > 0
348
387
 
349
- if (changed.length === 0 && !linksChanged) {
350
- return toView(existing, currentPeople)
351
- }
352
-
353
388
  return dependencies.transaction(async ({ tx, events }) => {
389
+ const cf = await dependencies.customFields.forUpdate(
390
+ tx,
391
+ workspaceId,
392
+ 'raise',
393
+ existing.customFields,
394
+ changes.customFields,
395
+ )
396
+ const customFieldsChanged = cf !== undefined && cf.changedPaths.length > 0
397
+
398
+ if (scalarChanged.length === 0 && !linksChanged && !customFieldsChanged) {
399
+ return toView(existing, currentPeople)
400
+ }
401
+
354
402
  const updated = await repository.updateRaise(tx, workspaceId, id, {
355
403
  ...columns,
404
+ ...(customFieldsChanged ? { customFields: cf.merged } : {}),
356
405
  updatedAt: dependencies.now(),
357
406
  })
358
407
 
@@ -360,8 +409,19 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
360
409
  throw AppError.notFound('Raise not found')
361
410
  }
362
411
 
363
- await repository.insertRaisePeople(tx, id, added)
364
- await repository.deleteRaisePeople(tx, id, removed)
412
+ await personLinks.linkPeople(
413
+ tx,
414
+ dependencies.createId,
415
+ workspaceId,
416
+ { targetType: 'raise', targetId: id },
417
+ added,
418
+ )
419
+ await personLinks.unlinkPeople(
420
+ tx,
421
+ workspaceId,
422
+ { targetType: 'raise', targetId: id },
423
+ removed,
424
+ )
365
425
 
366
426
  if (stageMove !== undefined) {
367
427
  await dependencies.recordActivity(tx, workspaceId, actor, {
@@ -372,14 +432,19 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
372
432
  })
373
433
  }
374
434
 
375
- const otherChanged = changed.filter((field) => field !== 'stageId')
435
+ const otherChanged = scalarChanged.filter((field) => field !== 'stageId')
436
+ const customFieldPaths = cf?.changedPaths ?? []
437
+ const activityChanged = [...otherChanged, ...customFieldPaths]
376
438
 
377
- if (otherChanged.length > 0) {
439
+ if (activityChanged.length > 0) {
440
+ const labels: Record<string, string> = { ...RAISE_FIELD_LABELS, ...cf?.labels }
441
+ const before: Record<string, unknown> = { ...existing, ...cf?.flatBefore }
442
+ const after: Record<string, unknown> = { ...columns, ...cf?.flatAfter }
378
443
  await dependencies.recordActivity(tx, workspaceId, actor, {
379
444
  targetType: 'raise',
380
445
  targetId: id,
381
446
  kind: 'updated',
382
- ...describeUpdate(otherChanged, RAISE_FIELD_LABELS, existing, columns),
447
+ ...describeUpdate(activityChanged, labels, before, after),
383
448
  })
384
449
  }
385
450
 
@@ -407,7 +472,13 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
407
472
  events.emit(
408
473
  'raises.raise.updated',
409
474
  { type: 'raise', id },
410
- { changed: linksChanged ? [...changed, 'personIds'] : changed },
475
+ {
476
+ changed: [
477
+ ...scalarChanged,
478
+ ...(linksChanged ? ['personIds'] : []),
479
+ ...customFieldPaths,
480
+ ],
481
+ },
411
482
  )
412
483
 
413
484
  if (stageMove !== undefined) {
@@ -428,7 +499,7 @@ export function createRaisesService(dependencies: RaisesDependencies): RaisesSer
428
499
  await dependencies.transaction(async ({ tx, events }) => {
429
500
  await require(workspaceId, id)
430
501
 
431
- // `raise_people` dies with the raise through its foreign key; notes,
502
+ // Notes, activities, decisions, plan items, and person_links have no key back to the raise;
432
503
  // activities, decisions and plan items have no key, so they are removed
433
504
  // here, in the same transaction.
434
505
  await deleteRecordsAttachedTo(tx, workspaceId, 'raise', id)
@@ -4,6 +4,7 @@ import type { PgColumn, PgTable } from 'drizzle-orm/pg-core'
4
4
  import type { Queryable } from '../runtime/transaction.ts'
5
5
  import { companies } from './companies/schema.ts'
6
6
  import { deals } from './deals/schema.ts'
7
+ import { enquiries } from './enquiries/schema.ts'
7
8
  import { candidates } from './hiring/schema.ts'
8
9
  import { RECORD_TARGET_TYPES } from './notes/schema.ts'
9
10
  import { opportunities } from './opportunities/schema.ts'
@@ -64,6 +65,7 @@ const TABLES: Readonly<Record<RecordTargetType, TargetTable>> = {
64
65
  partnerships.name,
65
66
  ),
66
67
  raise: targetTable(raises, raises.id, raises.workspaceId, raises.name),
68
+ enquiry: targetTable(enquiries, enquiries.id, enquiries.workspaceId, enquiries.name),
67
69
  candidate: targetTable(candidates, candidates.id, candidates.workspaceId),
68
70
  }
69
71
 
@@ -1,3 +1,6 @@
1
+ import type { PipelineKind } from '@kelpie/schemas'
2
+ import { PIPELINE_KINDS } from '@kelpie/schemas'
3
+
1
4
  import { referenceViolationTable } from '../lib/database.ts'
2
5
  import { AppError } from '../lib/errors.ts'
3
6
 
@@ -10,21 +13,30 @@ import { AppError } from '../lib/errors.ts'
10
13
  * insert, and would need updating every time a table gains a foreign key.
11
14
  */
12
15
 
13
- /** Referencing tables, as the domain names a user of the API would recognise. */
16
+ /**
17
+ * Referencing tables, as the domain names a user of the API would recognise.
18
+ *
19
+ * `person_links` is deliberately absent: its `target_type` is one of four
20
+ * pipeline kinds and the row itself names which, so a caller reads
21
+ * `referencedByPipelineRecords` for that path instead of losing detail to a
22
+ * generic "person link" label.
23
+ */
14
24
  const REFERENCING_TYPE_BY_TABLE: Readonly<Record<string, string>> = {
15
25
  candidates: 'candidate',
16
- deal_people: 'deal',
17
26
  deals: 'deal',
27
+ enquiries: 'enquiry',
18
28
  form_submissions: 'form submission',
19
29
  forms: 'form',
20
30
  opportunities: 'opportunity',
21
- partnership_people: 'partnership',
22
31
  partnerships: 'partnership',
23
- raise_people: 'raise',
24
32
  raises: 'raise',
25
33
  workspace_members: 'team member',
26
34
  }
27
35
 
36
+ const PIPELINE_KIND_ORDER: ReadonlyMap<PipelineKind, number> = new Map(
37
+ PIPELINE_KINDS.map((kind, index) => [kind, index] as const),
38
+ )
39
+
28
40
  /**
29
41
  * @param subject The record being deleted, e.g. `person`. Appears in the message.
30
42
  * @returns A 409. The referencing type is omitted when the driver did not report
@@ -42,3 +54,30 @@ export function referencedElsewhere(error: unknown, subject: string): AppError {
42
54
  { field: 'id', message: `Referenced by ${type}` },
43
55
  ])
44
56
  }
57
+
58
+ /**
59
+ * The 409 for a person delete that `person_links` refused. The service queries
60
+ * the distinct target types still pointing at the person and passes them here,
61
+ * so the reply names one detail per pipeline the person is on (in
62
+ * `PIPELINE_KINDS` order, matching how the pipelines appear across the UI).
63
+ * Falls back to the generic wording only when the query came back empty, which
64
+ * is the delete-races-another-delete race — still a 409, just less specific.
65
+ */
66
+ export function referencedByPipelineRecords(
67
+ subject: string,
68
+ types: readonly PipelineKind[],
69
+ ): AppError {
70
+ if (types.length === 0) {
71
+ return AppError.conflict(`This ${subject} is still referenced by another record`)
72
+ }
73
+
74
+ const ordered = [...types].sort(
75
+ (left, right) => (PIPELINE_KIND_ORDER.get(left) ?? 0) - (PIPELINE_KIND_ORDER.get(right) ?? 0),
76
+ )
77
+ const [first] = ordered
78
+
79
+ return AppError.conflict(
80
+ `This ${subject} is still referenced by a ${first}`,
81
+ ordered.map((type) => ({ field: 'id', message: `Referenced by ${type}` })),
82
+ )
83
+ }