@kelpie/server 0.8.0 → 0.10.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 (594) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/ids.d.ts +11 -0
  6. package/dist/lib/ids.d.ts.map +1 -1
  7. package/dist/lib/ids.js +11 -0
  8. package/dist/lib/ids.js.map +1 -1
  9. package/dist/modules/activities/repository.d.ts.map +1 -1
  10. package/dist/modules/activities/repository.js +19 -20
  11. package/dist/modules/activities/repository.js.map +1 -1
  12. package/dist/modules/activities/wording.d.ts +12 -0
  13. package/dist/modules/activities/wording.d.ts.map +1 -1
  14. package/dist/modules/activities/wording.js +16 -0
  15. package/dist/modules/activities/wording.js.map +1 -1
  16. package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
  17. package/dist/modules/agent-tasks/catalog.js +62 -0
  18. package/dist/modules/agent-tasks/catalog.js.map +1 -1
  19. package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
  20. package/dist/modules/agent-tasks/resolve.js +42 -9
  21. package/dist/modules/agent-tasks/resolve.js.map +1 -1
  22. package/dist/modules/agent-tasks/routes.d.ts +2 -0
  23. package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
  24. package/dist/modules/attachedRecords.d.ts +6 -1
  25. package/dist/modules/attachedRecords.d.ts.map +1 -1
  26. package/dist/modules/attachedRecords.js +15 -1
  27. package/dist/modules/attachedRecords.js.map +1 -1
  28. package/dist/modules/companies/index.d.ts.map +1 -1
  29. package/dist/modules/companies/index.js +3 -1
  30. package/dist/modules/companies/index.js.map +1 -1
  31. package/dist/modules/companies/routes.d.ts +14 -0
  32. package/dist/modules/companies/routes.d.ts.map +1 -1
  33. package/dist/modules/companies/routes.js +7 -0
  34. package/dist/modules/companies/routes.js.map +1 -1
  35. package/dist/modules/companies/schema.d.ts +20 -0
  36. package/dist/modules/companies/schema.d.ts.map +1 -1
  37. package/dist/modules/companies/schema.js +6 -1
  38. package/dist/modules/companies/schema.js.map +1 -1
  39. package/dist/modules/companies/service.d.ts +5 -0
  40. package/dist/modules/companies/service.d.ts.map +1 -1
  41. package/dist/modules/companies/service.js +24 -12
  42. package/dist/modules/companies/service.js.map +1 -1
  43. package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
  44. package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
  45. package/dist/modules/consent-purposes/capabilities.js +10 -0
  46. package/dist/modules/consent-purposes/capabilities.js.map +1 -0
  47. package/dist/modules/consent-purposes/events.d.ts +38 -0
  48. package/dist/modules/consent-purposes/events.d.ts.map +1 -0
  49. package/dist/modules/consent-purposes/events.js +17 -0
  50. package/dist/modules/consent-purposes/events.js.map +1 -0
  51. package/dist/modules/consent-purposes/index.d.ts +13 -0
  52. package/dist/modules/consent-purposes/index.d.ts.map +1 -0
  53. package/dist/modules/consent-purposes/index.js +41 -0
  54. package/dist/modules/consent-purposes/index.js.map +1 -0
  55. package/dist/modules/consent-purposes/repository.d.ts +21 -0
  56. package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
  57. package/dist/modules/consent-purposes/repository.js +98 -0
  58. package/dist/modules/consent-purposes/repository.js.map +1 -0
  59. package/dist/modules/consent-purposes/routes.d.ts +39 -0
  60. package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
  61. package/dist/modules/consent-purposes/routes.js +79 -0
  62. package/dist/modules/consent-purposes/routes.js.map +1 -0
  63. package/dist/modules/consent-purposes/schema.d.ts +175 -0
  64. package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
  65. package/dist/modules/consent-purposes/schema.js +35 -0
  66. package/dist/modules/consent-purposes/schema.js.map +1 -0
  67. package/dist/modules/consent-purposes/service.d.ts +50 -0
  68. package/dist/modules/consent-purposes/service.d.ts.map +1 -0
  69. package/dist/modules/consent-purposes/service.js +263 -0
  70. package/dist/modules/consent-purposes/service.js.map +1 -0
  71. package/dist/modules/consent-purposes/starters.d.ts +17 -0
  72. package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
  73. package/dist/modules/consent-purposes/starters.js +15 -0
  74. package/dist/modules/consent-purposes/starters.js.map +1 -0
  75. package/dist/modules/consent-purposes/tools.d.ts +4 -0
  76. package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
  77. package/dist/modules/consent-purposes/tools.js +29 -0
  78. package/dist/modules/consent-purposes/tools.js.map +1 -0
  79. package/dist/modules/core.d.ts.map +1 -1
  80. package/dist/modules/core.js +10 -0
  81. package/dist/modules/core.js.map +1 -1
  82. package/dist/modules/custom-fields/capabilities.d.ts +12 -0
  83. package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
  84. package/dist/modules/custom-fields/capabilities.js +15 -0
  85. package/dist/modules/custom-fields/capabilities.js.map +1 -0
  86. package/dist/modules/custom-fields/events.d.ts +49 -0
  87. package/dist/modules/custom-fields/events.d.ts.map +1 -0
  88. package/dist/modules/custom-fields/events.js +25 -0
  89. package/dist/modules/custom-fields/events.js.map +1 -0
  90. package/dist/modules/custom-fields/index.d.ts +19 -0
  91. package/dist/modules/custom-fields/index.d.ts.map +1 -0
  92. package/dist/modules/custom-fields/index.js +46 -0
  93. package/dist/modules/custom-fields/index.js.map +1 -0
  94. package/dist/modules/custom-fields/repository.d.ts +37 -0
  95. package/dist/modules/custom-fields/repository.d.ts.map +1 -0
  96. package/dist/modules/custom-fields/repository.js +144 -0
  97. package/dist/modules/custom-fields/repository.js.map +1 -0
  98. package/dist/modules/custom-fields/routes.d.ts +44 -0
  99. package/dist/modules/custom-fields/routes.d.ts.map +1 -0
  100. package/dist/modules/custom-fields/routes.js +103 -0
  101. package/dist/modules/custom-fields/routes.js.map +1 -0
  102. package/dist/modules/custom-fields/schema.d.ts +215 -0
  103. package/dist/modules/custom-fields/schema.d.ts.map +1 -0
  104. package/dist/modules/custom-fields/schema.js +43 -0
  105. package/dist/modules/custom-fields/schema.js.map +1 -0
  106. package/dist/modules/custom-fields/service.d.ts +57 -0
  107. package/dist/modules/custom-fields/service.d.ts.map +1 -0
  108. package/dist/modules/custom-fields/service.js +273 -0
  109. package/dist/modules/custom-fields/service.js.map +1 -0
  110. package/dist/modules/custom-fields/tools.d.ts +4 -0
  111. package/dist/modules/custom-fields/tools.d.ts.map +1 -0
  112. package/dist/modules/custom-fields/tools.js +38 -0
  113. package/dist/modules/custom-fields/tools.js.map +1 -0
  114. package/dist/modules/custom-fields/values.d.ts +49 -0
  115. package/dist/modules/custom-fields/values.d.ts.map +1 -0
  116. package/dist/modules/custom-fields/values.js +249 -0
  117. package/dist/modules/custom-fields/values.js.map +1 -0
  118. package/dist/modules/custom-fields/wire.d.ts +12 -0
  119. package/dist/modules/custom-fields/wire.d.ts.map +1 -0
  120. package/dist/modules/custom-fields/wire.js +30 -0
  121. package/dist/modules/custom-fields/wire.js.map +1 -0
  122. package/dist/modules/dashboard/repository.d.ts.map +1 -1
  123. package/dist/modules/dashboard/repository.js +4 -3
  124. package/dist/modules/dashboard/repository.js.map +1 -1
  125. package/dist/modules/deals/index.d.ts +2 -1
  126. package/dist/modules/deals/index.d.ts.map +1 -1
  127. package/dist/modules/deals/index.js +5 -2
  128. package/dist/modules/deals/index.js.map +1 -1
  129. package/dist/modules/deals/repository.d.ts +0 -16
  130. package/dist/modules/deals/repository.d.ts.map +1 -1
  131. package/dist/modules/deals/repository.js +6 -76
  132. package/dist/modules/deals/repository.js.map +1 -1
  133. package/dist/modules/deals/routes.d.ts +14 -0
  134. package/dist/modules/deals/routes.d.ts.map +1 -1
  135. package/dist/modules/deals/routes.js +7 -0
  136. package/dist/modules/deals/routes.js.map +1 -1
  137. package/dist/modules/deals/schema.d.ts +20 -42
  138. package/dist/modules/deals/schema.d.ts.map +1 -1
  139. package/dist/modules/deals/schema.js +6 -11
  140. package/dist/modules/deals/schema.js.map +1 -1
  141. package/dist/modules/deals/service.d.ts +13 -2
  142. package/dist/modules/deals/service.d.ts.map +1 -1
  143. package/dist/modules/deals/service.js +43 -20
  144. package/dist/modules/deals/service.js.map +1 -1
  145. package/dist/modules/decisions/repository.d.ts.map +1 -1
  146. package/dist/modules/decisions/repository.js +2 -0
  147. package/dist/modules/decisions/repository.js.map +1 -1
  148. package/dist/modules/decisions/routes.d.ts +1 -0
  149. package/dist/modules/decisions/routes.d.ts.map +1 -1
  150. package/dist/modules/enquiries/events.d.ts +44 -0
  151. package/dist/modules/enquiries/events.d.ts.map +1 -0
  152. package/dist/modules/enquiries/events.js +19 -0
  153. package/dist/modules/enquiries/events.js.map +1 -0
  154. package/dist/modules/enquiries/index.d.ts +13 -0
  155. package/dist/modules/enquiries/index.d.ts.map +1 -0
  156. package/dist/modules/enquiries/index.js +44 -0
  157. package/dist/modules/enquiries/index.js.map +1 -0
  158. package/dist/modules/enquiries/repository.d.ts +30 -0
  159. package/dist/modules/enquiries/repository.d.ts.map +1 -0
  160. package/dist/modules/enquiries/repository.js +94 -0
  161. package/dist/modules/enquiries/repository.js.map +1 -0
  162. package/dist/modules/enquiries/routes.d.ts +52 -0
  163. package/dist/modules/enquiries/routes.d.ts.map +1 -0
  164. package/dist/modules/enquiries/routes.js +127 -0
  165. package/dist/modules/enquiries/routes.js.map +1 -0
  166. package/dist/modules/enquiries/schema.d.ts +290 -0
  167. package/dist/modules/enquiries/schema.d.ts.map +1 -0
  168. package/dist/modules/enquiries/schema.js +52 -0
  169. package/dist/modules/enquiries/schema.js.map +1 -0
  170. package/dist/modules/enquiries/service.d.ts +85 -0
  171. package/dist/modules/enquiries/service.d.ts.map +1 -0
  172. package/dist/modules/enquiries/service.js +370 -0
  173. package/dist/modules/enquiries/service.js.map +1 -0
  174. package/dist/modules/enquiries/tools.d.ts +4 -0
  175. package/dist/modules/enquiries/tools.d.ts.map +1 -0
  176. package/dist/modules/enquiries/tools.js +50 -0
  177. package/dist/modules/enquiries/tools.js.map +1 -0
  178. package/dist/modules/eventCatalogs.d.ts +3 -0
  179. package/dist/modules/eventCatalogs.d.ts.map +1 -1
  180. package/dist/modules/eventCatalogs.js +3 -0
  181. package/dist/modules/eventCatalogs.js.map +1 -1
  182. package/dist/modules/forms/embed.d.ts +20 -6
  183. package/dist/modules/forms/embed.d.ts.map +1 -1
  184. package/dist/modules/forms/embed.js +359 -43
  185. package/dist/modules/forms/embed.js.map +1 -1
  186. package/dist/modules/forms/events.d.ts +20 -7
  187. package/dist/modules/forms/events.d.ts.map +1 -1
  188. package/dist/modules/forms/events.js +20 -2
  189. package/dist/modules/forms/events.js.map +1 -1
  190. package/dist/modules/forms/fields.d.ts +14 -1
  191. package/dist/modules/forms/fields.d.ts.map +1 -1
  192. package/dist/modules/forms/fields.js +87 -3
  193. package/dist/modules/forms/fields.js.map +1 -1
  194. package/dist/modules/forms/index.d.ts.map +1 -1
  195. package/dist/modules/forms/index.js +12 -1
  196. package/dist/modules/forms/index.js.map +1 -1
  197. package/dist/modules/forms/mapping.d.ts +62 -5
  198. package/dist/modules/forms/mapping.d.ts.map +1 -1
  199. package/dist/modules/forms/mapping.js +139 -5
  200. package/dist/modules/forms/mapping.js.map +1 -1
  201. package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
  202. package/dist/modules/forms/publicRoutes.js +29 -1
  203. package/dist/modules/forms/publicRoutes.js.map +1 -1
  204. package/dist/modules/forms/repository.d.ts +31 -0
  205. package/dist/modules/forms/repository.d.ts.map +1 -1
  206. package/dist/modules/forms/repository.js +90 -1
  207. package/dist/modules/forms/repository.js.map +1 -1
  208. package/dist/modules/forms/routes.d.ts +83 -1
  209. package/dist/modules/forms/routes.d.ts.map +1 -1
  210. package/dist/modules/forms/routes.js +185 -2
  211. package/dist/modules/forms/routes.js.map +1 -1
  212. package/dist/modules/forms/schema.d.ts +672 -1
  213. package/dist/modules/forms/schema.d.ts.map +1 -1
  214. package/dist/modules/forms/schema.js +146 -3
  215. package/dist/modules/forms/schema.js.map +1 -1
  216. package/dist/modules/forms/service.d.ts +54 -1
  217. package/dist/modules/forms/service.d.ts.map +1 -1
  218. package/dist/modules/forms/service.js +338 -28
  219. package/dist/modules/forms/service.js.map +1 -1
  220. package/dist/modules/forms/submission.d.ts +15 -0
  221. package/dist/modules/forms/submission.d.ts.map +1 -1
  222. package/dist/modules/forms/submission.js +418 -40
  223. package/dist/modules/forms/submission.js.map +1 -1
  224. package/dist/modules/import-export/drafts.d.ts +10 -0
  225. package/dist/modules/import-export/drafts.d.ts.map +1 -1
  226. package/dist/modules/import-export/drafts.js +16 -2
  227. package/dist/modules/import-export/drafts.js.map +1 -1
  228. package/dist/modules/import-export/exportRows.d.ts +7 -4
  229. package/dist/modules/import-export/exportRows.d.ts.map +1 -1
  230. package/dist/modules/import-export/exportRows.js +20 -5
  231. package/dist/modules/import-export/exportRows.js.map +1 -1
  232. package/dist/modules/import-export/plan.d.ts +12 -1
  233. package/dist/modules/import-export/plan.d.ts.map +1 -1
  234. package/dist/modules/import-export/plan.js +29 -2
  235. package/dist/modules/import-export/plan.js.map +1 -1
  236. package/dist/modules/import-export/presets.d.ts.map +1 -1
  237. package/dist/modules/import-export/presets.js +10 -0
  238. package/dist/modules/import-export/presets.js.map +1 -1
  239. package/dist/modules/import-export/repository.d.ts +11 -1
  240. package/dist/modules/import-export/repository.d.ts.map +1 -1
  241. package/dist/modules/import-export/repository.js +42 -9
  242. package/dist/modules/import-export/repository.js.map +1 -1
  243. package/dist/modules/import-export/routes.d.ts.map +1 -1
  244. package/dist/modules/import-export/routes.js +4 -0
  245. package/dist/modules/import-export/routes.js.map +1 -1
  246. package/dist/modules/import-export/schema.d.ts +17 -0
  247. package/dist/modules/import-export/schema.d.ts.map +1 -1
  248. package/dist/modules/import-export/schema.js +11 -0
  249. package/dist/modules/import-export/schema.js.map +1 -1
  250. package/dist/modules/import-export/service.d.ts +6 -0
  251. package/dist/modules/import-export/service.d.ts.map +1 -1
  252. package/dist/modules/import-export/service.js +14 -2
  253. package/dist/modules/import-export/service.js.map +1 -1
  254. package/dist/modules/import-export/streams.d.ts.map +1 -1
  255. package/dist/modules/import-export/streams.js +3 -3
  256. package/dist/modules/import-export/streams.js.map +1 -1
  257. package/dist/modules/import-export/tools.d.ts.map +1 -1
  258. package/dist/modules/import-export/tools.js +8 -0
  259. package/dist/modules/import-export/tools.js.map +1 -1
  260. package/dist/modules/import-export/validation.d.ts.map +1 -1
  261. package/dist/modules/import-export/validation.js +22 -1
  262. package/dist/modules/import-export/validation.js.map +1 -1
  263. package/dist/modules/import-export/writes.d.ts.map +1 -1
  264. package/dist/modules/import-export/writes.js +37 -4
  265. package/dist/modules/import-export/writes.js.map +1 -1
  266. package/dist/modules/lists/index.d.ts +38 -0
  267. package/dist/modules/lists/index.d.ts.map +1 -1
  268. package/dist/modules/lists/index.js +27 -0
  269. package/dist/modules/lists/index.js.map +1 -1
  270. package/dist/modules/lists/repository.d.ts +26 -0
  271. package/dist/modules/lists/repository.d.ts.map +1 -1
  272. package/dist/modules/lists/repository.js +32 -0
  273. package/dist/modules/lists/repository.js.map +1 -1
  274. package/dist/modules/lists/routes.d.ts +4 -0
  275. package/dist/modules/lists/routes.d.ts.map +1 -1
  276. package/dist/modules/lists/routes.js +8 -0
  277. package/dist/modules/lists/routes.js.map +1 -1
  278. package/dist/modules/lists/schema.d.ts +17 -0
  279. package/dist/modules/lists/schema.d.ts.map +1 -1
  280. package/dist/modules/lists/schema.js +10 -0
  281. package/dist/modules/lists/schema.js.map +1 -1
  282. package/dist/modules/lists/service.d.ts +14 -2
  283. package/dist/modules/lists/service.d.ts.map +1 -1
  284. package/dist/modules/lists/service.js +55 -7
  285. package/dist/modules/lists/service.js.map +1 -1
  286. package/dist/modules/mcp/index.d.ts.map +1 -1
  287. package/dist/modules/mcp/index.js +5 -0
  288. package/dist/modules/mcp/index.js.map +1 -1
  289. package/dist/modules/notes/routes.d.ts +1 -0
  290. package/dist/modules/notes/routes.d.ts.map +1 -1
  291. package/dist/modules/opportunities/index.d.ts.map +1 -1
  292. package/dist/modules/opportunities/index.js +3 -1
  293. package/dist/modules/opportunities/index.js.map +1 -1
  294. package/dist/modules/opportunities/repository.d.ts +2 -0
  295. package/dist/modules/opportunities/repository.d.ts.map +1 -1
  296. package/dist/modules/opportunities/repository.js +4 -0
  297. package/dist/modules/opportunities/repository.js.map +1 -1
  298. package/dist/modules/opportunities/routes.d.ts +16 -0
  299. package/dist/modules/opportunities/routes.d.ts.map +1 -1
  300. package/dist/modules/opportunities/routes.js +13 -0
  301. package/dist/modules/opportunities/routes.js.map +1 -1
  302. package/dist/modules/opportunities/schema.d.ts +20 -0
  303. package/dist/modules/opportunities/schema.d.ts.map +1 -1
  304. package/dist/modules/opportunities/schema.js +6 -1
  305. package/dist/modules/opportunities/schema.js.map +1 -1
  306. package/dist/modules/opportunities/service.d.ts +20 -3
  307. package/dist/modules/opportunities/service.d.ts.map +1 -1
  308. package/dist/modules/opportunities/service.js +99 -18
  309. package/dist/modules/opportunities/service.js.map +1 -1
  310. package/dist/modules/opportunities/tools.d.ts.map +1 -1
  311. package/dist/modules/opportunities/tools.js +2 -0
  312. package/dist/modules/opportunities/tools.js.map +1 -1
  313. package/dist/modules/partnerships/index.d.ts.map +1 -1
  314. package/dist/modules/partnerships/index.js +3 -1
  315. package/dist/modules/partnerships/index.js.map +1 -1
  316. package/dist/modules/partnerships/repository.d.ts +0 -17
  317. package/dist/modules/partnerships/repository.d.ts.map +1 -1
  318. package/dist/modules/partnerships/repository.js +6 -82
  319. package/dist/modules/partnerships/repository.js.map +1 -1
  320. package/dist/modules/partnerships/routes.d.ts +14 -0
  321. package/dist/modules/partnerships/routes.d.ts.map +1 -1
  322. package/dist/modules/partnerships/routes.js +7 -0
  323. package/dist/modules/partnerships/routes.js.map +1 -1
  324. package/dist/modules/partnerships/schema.d.ts +20 -41
  325. package/dist/modules/partnerships/schema.d.ts.map +1 -1
  326. package/dist/modules/partnerships/schema.js +6 -10
  327. package/dist/modules/partnerships/schema.js.map +1 -1
  328. package/dist/modules/partnerships/service.d.ts +11 -1
  329. package/dist/modules/partnerships/service.d.ts.map +1 -1
  330. package/dist/modules/partnerships/service.js +43 -20
  331. package/dist/modules/partnerships/service.js.map +1 -1
  332. package/dist/modules/people/consentHydration.d.ts +26 -0
  333. package/dist/modules/people/consentHydration.d.ts.map +1 -0
  334. package/dist/modules/people/consentHydration.js +100 -0
  335. package/dist/modules/people/consentHydration.js.map +1 -0
  336. package/dist/modules/people/index.d.ts.map +1 -1
  337. package/dist/modules/people/index.js +3 -1
  338. package/dist/modules/people/index.js.map +1 -1
  339. package/dist/modules/people/personConsentWrites.d.ts +40 -0
  340. package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
  341. package/dist/modules/people/personConsentWrites.js +98 -0
  342. package/dist/modules/people/personConsentWrites.js.map +1 -0
  343. package/dist/modules/people/repository.d.ts.map +1 -1
  344. package/dist/modules/people/repository.js +5 -1
  345. package/dist/modules/people/repository.js.map +1 -1
  346. package/dist/modules/people/routes.d.ts +57 -4
  347. package/dist/modules/people/routes.d.ts.map +1 -1
  348. package/dist/modules/people/routes.js +104 -5
  349. package/dist/modules/people/routes.js.map +1 -1
  350. package/dist/modules/people/schema.d.ts +366 -1
  351. package/dist/modules/people/schema.d.ts.map +1 -1
  352. package/dist/modules/people/schema.js +92 -2
  353. package/dist/modules/people/schema.js.map +1 -1
  354. package/dist/modules/people/service.d.ts +30 -1
  355. package/dist/modules/people/service.d.ts.map +1 -1
  356. package/dist/modules/people/service.js +115 -38
  357. package/dist/modules/people/service.js.map +1 -1
  358. package/dist/modules/people/tools.d.ts.map +1 -1
  359. package/dist/modules/people/tools.js +4 -1
  360. package/dist/modules/people/tools.js.map +1 -1
  361. package/dist/modules/personLinks.d.ts +79 -0
  362. package/dist/modules/personLinks.d.ts.map +1 -0
  363. package/dist/modules/personLinks.js +155 -0
  364. package/dist/modules/personLinks.js.map +1 -0
  365. package/dist/modules/pipelines/routes.d.ts +1 -0
  366. package/dist/modules/pipelines/routes.d.ts.map +1 -1
  367. package/dist/modules/plans/routes.d.ts +1 -0
  368. package/dist/modules/plans/routes.d.ts.map +1 -1
  369. package/dist/modules/raises/index.d.ts.map +1 -1
  370. package/dist/modules/raises/index.js +3 -1
  371. package/dist/modules/raises/index.js.map +1 -1
  372. package/dist/modules/raises/repository.d.ts +0 -17
  373. package/dist/modules/raises/repository.d.ts.map +1 -1
  374. package/dist/modules/raises/repository.js +6 -77
  375. package/dist/modules/raises/repository.js.map +1 -1
  376. package/dist/modules/raises/routes.d.ts +14 -0
  377. package/dist/modules/raises/routes.d.ts.map +1 -1
  378. package/dist/modules/raises/routes.js +7 -0
  379. package/dist/modules/raises/routes.js.map +1 -1
  380. package/dist/modules/raises/schema.d.ts +20 -41
  381. package/dist/modules/raises/schema.d.ts.map +1 -1
  382. package/dist/modules/raises/schema.js +6 -10
  383. package/dist/modules/raises/schema.js.map +1 -1
  384. package/dist/modules/raises/service.d.ts +11 -1
  385. package/dist/modules/raises/service.d.ts.map +1 -1
  386. package/dist/modules/raises/service.js +41 -18
  387. package/dist/modules/raises/service.js.map +1 -1
  388. package/dist/modules/recordTargets.d.ts.map +1 -1
  389. package/dist/modules/recordTargets.js +2 -0
  390. package/dist/modules/recordTargets.js.map +1 -1
  391. package/dist/modules/references.d.ts +10 -0
  392. package/dist/modules/references.d.ts.map +1 -1
  393. package/dist/modules/references.js +27 -4
  394. package/dist/modules/references.js.map +1 -1
  395. package/dist/modules/sample-data/fixture.d.ts +21 -0
  396. package/dist/modules/sample-data/fixture.d.ts.map +1 -1
  397. package/dist/modules/sample-data/fixture.js +40 -0
  398. package/dist/modules/sample-data/fixture.js.map +1 -1
  399. package/dist/modules/sample-data/index.d.ts.map +1 -1
  400. package/dist/modules/sample-data/index.js +1 -0
  401. package/dist/modules/sample-data/index.js.map +1 -1
  402. package/dist/modules/sample-data/routes.d.ts.map +1 -1
  403. package/dist/modules/sample-data/routes.js +1 -0
  404. package/dist/modules/sample-data/routes.js.map +1 -1
  405. package/dist/modules/sample-data/service.d.ts +1 -0
  406. package/dist/modules/sample-data/service.d.ts.map +1 -1
  407. package/dist/modules/sample-data/service.js +77 -8
  408. package/dist/modules/sample-data/service.js.map +1 -1
  409. package/dist/modules/search/index.d.ts +1 -1
  410. package/dist/modules/search/index.d.ts.map +1 -1
  411. package/dist/modules/search/index.js +2 -1
  412. package/dist/modules/search/index.js.map +1 -1
  413. package/dist/modules/search/repository.d.ts +1 -0
  414. package/dist/modules/search/repository.d.ts.map +1 -1
  415. package/dist/modules/search/repository.js +23 -0
  416. package/dist/modules/search/repository.js.map +1 -1
  417. package/dist/modules/search/service.d.ts +3 -3
  418. package/dist/modules/search/service.d.ts.map +1 -1
  419. package/dist/modules/search/service.js +5 -4
  420. package/dist/modules/search/service.js.map +1 -1
  421. package/dist/modules/stagedRecords.d.ts +3 -3
  422. package/dist/modules/stagedRecords.d.ts.map +1 -1
  423. package/dist/modules/stagedRecords.js +9 -0
  424. package/dist/modules/stagedRecords.js.map +1 -1
  425. package/dist/modules/webhooks/payloads.d.ts.map +1 -1
  426. package/dist/modules/webhooks/payloads.js +15 -2
  427. package/dist/modules/webhooks/payloads.js.map +1 -1
  428. package/dist/modules/workspace/repository.d.ts +2 -0
  429. package/dist/modules/workspace/repository.d.ts.map +1 -1
  430. package/dist/modules/workspace/repository.js +7 -0
  431. package/dist/modules/workspace/repository.js.map +1 -1
  432. package/dist/modules/workspace/service.d.ts.map +1 -1
  433. package/dist/modules/workspace/service.js +10 -0
  434. package/dist/modules/workspace/service.js.map +1 -1
  435. package/dist/modules/workspace/starters.d.ts.map +1 -1
  436. package/dist/modules/workspace/starters.js +5 -0
  437. package/dist/modules/workspace/starters.js.map +1 -1
  438. package/dist/runtime/events.d.ts +1 -1
  439. package/dist/runtime/events.d.ts.map +1 -1
  440. package/dist/runtime/events.js +1 -0
  441. package/dist/runtime/events.js.map +1 -1
  442. package/dist/schema/index.d.ts +3 -0
  443. package/dist/schema/index.d.ts.map +1 -1
  444. package/dist/schema/index.js +3 -0
  445. package/dist/schema/index.js.map +1 -1
  446. package/dist/testing/database.d.ts +5 -1
  447. package/dist/testing/database.d.ts.map +1 -1
  448. package/dist/testing/database.js +81 -10
  449. package/dist/testing/database.js.map +1 -1
  450. package/migrations/0024_third_king_cobra.sql +46 -0
  451. package/migrations/0025_worthless_chimera.sql +3 -0
  452. package/migrations/0026_late_aqueduct.sql +46 -0
  453. package/migrations/0027_brainy_silver_sable.sql +3 -0
  454. package/migrations/0028_freezing_scrambler.sql +19 -0
  455. package/migrations/0029_custom_fields.sql +26 -0
  456. package/migrations/0030_enquiries.sql +79 -0
  457. package/migrations/0031_consent.sql +45 -0
  458. package/migrations/0032_form_field_statement.sql +1 -0
  459. package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
  460. package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
  461. package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
  462. package/migrations/0036_form_field_notice_type.sql +2 -0
  463. package/migrations/meta/0024_snapshot.json +5516 -0
  464. package/migrations/meta/0025_snapshot.json +5336 -0
  465. package/migrations/meta/0026_snapshot.json +5710 -0
  466. package/migrations/meta/0027_snapshot.json +5716 -0
  467. package/migrations/meta/0028_snapshot.json +5740 -0
  468. package/migrations/meta/0029_snapshot.json +5935 -0
  469. package/migrations/meta/0030_snapshot.json +6245 -0
  470. package/migrations/meta/0031_snapshot.json +6572 -0
  471. package/migrations/meta/0032_snapshot.json +6578 -0
  472. package/migrations/meta/0033_snapshot.json +6572 -0
  473. package/migrations/meta/0034_snapshot.json +6566 -0
  474. package/migrations/meta/0035_snapshot.json +6573 -0
  475. package/migrations/meta/0036_snapshot.json +6573 -0
  476. package/migrations/meta/_journal.json +91 -0
  477. package/package.json +2 -2
  478. package/src/index.ts +6 -0
  479. package/src/lib/ids.ts +11 -0
  480. package/src/modules/activities/repository.ts +22 -23
  481. package/src/modules/activities/wording.ts +18 -0
  482. package/src/modules/agent-tasks/catalog.ts +63 -0
  483. package/src/modules/agent-tasks/resolve.ts +64 -24
  484. package/src/modules/attachedRecords.ts +29 -2
  485. package/src/modules/companies/index.ts +3 -1
  486. package/src/modules/companies/routes.ts +7 -0
  487. package/src/modules/companies/schema.ts +7 -1
  488. package/src/modules/companies/service.ts +48 -13
  489. package/src/modules/consent-purposes/capabilities.ts +12 -0
  490. package/src/modules/consent-purposes/events.ts +38 -0
  491. package/src/modules/consent-purposes/index.ts +48 -0
  492. package/src/modules/consent-purposes/repository.ts +163 -0
  493. package/src/modules/consent-purposes/routes.ts +122 -0
  494. package/src/modules/consent-purposes/schema.ts +46 -0
  495. package/src/modules/consent-purposes/service.ts +423 -0
  496. package/src/modules/consent-purposes/starters.ts +32 -0
  497. package/src/modules/consent-purposes/tools.ts +44 -0
  498. package/src/modules/core.ts +10 -0
  499. package/src/modules/custom-fields/capabilities.ts +17 -0
  500. package/src/modules/custom-fields/events.ts +51 -0
  501. package/src/modules/custom-fields/index.ts +61 -0
  502. package/src/modules/custom-fields/repository.ts +225 -0
  503. package/src/modules/custom-fields/routes.ts +155 -0
  504. package/src/modules/custom-fields/schema.ts +61 -0
  505. package/src/modules/custom-fields/service.ts +439 -0
  506. package/src/modules/custom-fields/tools.ts +53 -0
  507. package/src/modules/custom-fields/values.ts +352 -0
  508. package/src/modules/custom-fields/wire.ts +32 -0
  509. package/src/modules/dashboard/repository.ts +4 -3
  510. package/src/modules/deals/index.ts +5 -2
  511. package/src/modules/deals/repository.ts +6 -106
  512. package/src/modules/deals/routes.ts +7 -0
  513. package/src/modules/deals/schema.ts +7 -15
  514. package/src/modules/deals/service.ts +92 -23
  515. package/src/modules/decisions/repository.ts +2 -0
  516. package/src/modules/enquiries/events.ts +45 -0
  517. package/src/modules/enquiries/index.ts +50 -0
  518. package/src/modules/enquiries/repository.ts +164 -0
  519. package/src/modules/enquiries/routes.ts +172 -0
  520. package/src/modules/enquiries/schema.ts +59 -0
  521. package/src/modules/enquiries/service.ts +644 -0
  522. package/src/modules/enquiries/tools.ts +66 -0
  523. package/src/modules/eventCatalogs.ts +3 -0
  524. package/src/modules/forms/embed.ts +391 -44
  525. package/src/modules/forms/events.ts +30 -2
  526. package/src/modules/forms/fields.ts +102 -2
  527. package/src/modules/forms/index.ts +12 -1
  528. package/src/modules/forms/mapping.ts +183 -6
  529. package/src/modules/forms/publicRoutes.ts +43 -1
  530. package/src/modules/forms/repository.ts +162 -1
  531. package/src/modules/forms/routes.ts +212 -2
  532. package/src/modules/forms/schema.ts +166 -4
  533. package/src/modules/forms/service.ts +565 -41
  534. package/src/modules/forms/submission.ts +718 -44
  535. package/src/modules/import-export/drafts.ts +20 -1
  536. package/src/modules/import-export/exportRows.ts +21 -5
  537. package/src/modules/import-export/plan.ts +47 -2
  538. package/src/modules/import-export/presets.ts +10 -0
  539. package/src/modules/import-export/repository.ts +73 -8
  540. package/src/modules/import-export/routes.ts +4 -0
  541. package/src/modules/import-export/schema.ts +11 -0
  542. package/src/modules/import-export/service.ts +28 -2
  543. package/src/modules/import-export/streams.ts +3 -1
  544. package/src/modules/import-export/tools.ts +10 -0
  545. package/src/modules/import-export/validation.ts +28 -0
  546. package/src/modules/import-export/writes.ts +70 -5
  547. package/src/modules/lists/index.ts +71 -0
  548. package/src/modules/lists/repository.ts +64 -0
  549. package/src/modules/lists/routes.ts +8 -0
  550. package/src/modules/lists/schema.ts +10 -0
  551. package/src/modules/lists/service.ts +110 -9
  552. package/src/modules/mcp/index.ts +5 -0
  553. package/src/modules/opportunities/index.ts +3 -1
  554. package/src/modules/opportunities/repository.ts +11 -0
  555. package/src/modules/opportunities/routes.ts +13 -0
  556. package/src/modules/opportunities/schema.ts +7 -1
  557. package/src/modules/opportunities/service.ts +188 -22
  558. package/src/modules/opportunities/tools.ts +2 -0
  559. package/src/modules/partnerships/index.ts +3 -1
  560. package/src/modules/partnerships/repository.ts +6 -117
  561. package/src/modules/partnerships/routes.ts +7 -0
  562. package/src/modules/partnerships/schema.ts +7 -14
  563. package/src/modules/partnerships/service.ts +93 -22
  564. package/src/modules/people/consentHydration.ts +167 -0
  565. package/src/modules/people/index.ts +3 -1
  566. package/src/modules/people/personConsentWrites.ts +177 -0
  567. package/src/modules/people/repository.ts +5 -0
  568. package/src/modules/people/routes.ts +127 -18
  569. package/src/modules/people/schema.ts +109 -3
  570. package/src/modules/people/service.ts +186 -40
  571. package/src/modules/people/tools.ts +5 -1
  572. package/src/modules/personLinks.ts +278 -0
  573. package/src/modules/raises/index.ts +3 -1
  574. package/src/modules/raises/repository.ts +6 -107
  575. package/src/modules/raises/routes.ts +7 -0
  576. package/src/modules/raises/schema.ts +7 -14
  577. package/src/modules/raises/service.ts +91 -20
  578. package/src/modules/recordTargets.ts +2 -0
  579. package/src/modules/references.ts +43 -4
  580. package/src/modules/sample-data/fixture.ts +63 -0
  581. package/src/modules/sample-data/index.ts +1 -0
  582. package/src/modules/sample-data/routes.ts +1 -0
  583. package/src/modules/sample-data/service.ts +97 -8
  584. package/src/modules/search/index.ts +2 -1
  585. package/src/modules/search/repository.ts +33 -1
  586. package/src/modules/search/service.ts +7 -5
  587. package/src/modules/stagedRecords.ts +18 -3
  588. package/src/modules/webhooks/payloads.ts +20 -2
  589. package/src/modules/workspace/repository.ts +12 -0
  590. package/src/modules/workspace/service.ts +14 -0
  591. package/src/modules/workspace/starters.ts +5 -0
  592. package/src/runtime/events.ts +1 -0
  593. package/src/schema/index.ts +3 -0
  594. 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,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
+ }
@@ -0,0 +1,164 @@
1
+ import { and, eq, ilike, inArray, or, sql } from 'drizzle-orm'
2
+ import type { SQL } from 'drizzle-orm'
3
+
4
+ import { keysetCondition, orderByWindow, textSort, timestampSort } from '../../lib/pagination.ts'
5
+ import type { ListWindow, SortableFields } from '../../lib/pagination.ts'
6
+ import { arrayContainsPattern, containsPattern } from '../../lib/search.ts'
7
+ import type { Queryable } from '../../runtime/transaction.ts'
8
+ import { companies } from '../companies/schema.ts'
9
+ import { anyPersonLinked } from '../personLinks.ts'
10
+ import { workspaceMembers } from '../workspace/schema.ts'
11
+ import { enquiries } from './schema.ts'
12
+
13
+ export type EnquiryRecord = typeof enquiries.$inferSelect
14
+
15
+ /** The writable column shape. Services build one of these; nothing else knows the column names. */
16
+ export type EnquiryColumns = typeof enquiries.$inferInsert
17
+
18
+ /** The sort fields `?sort=` documents. */
19
+ export const ENQUIRY_SORTS: SortableFields<EnquiryRecord> = {
20
+ name: textSort(enquiries.name, (enquiry) => enquiry.name),
21
+ created_at: timestampSort(enquiries.createdAt, (enquiry) => enquiry.createdAt),
22
+ updated_at: timestampSort(enquiries.updatedAt, (enquiry) => enquiry.updatedAt),
23
+ }
24
+
25
+ export const DEFAULT_ENQUIRY_SORT = '-created_at'
26
+
27
+ export interface EnquiryFilters {
28
+ /** `?q=`: name, source, summary, tags, or the company's name. */
29
+ readonly term?: string | undefined
30
+ /** `?source=`, repeatable: sources are free text, so a match is exact, not fuzzy. */
31
+ readonly sources?: readonly string[] | undefined
32
+ /** `?company_id=`, repeatable. */
33
+ readonly companyIds?: readonly string[] | undefined
34
+ /** `?stage_id=`, repeatable: the board fetches one column with one of these. */
35
+ readonly stageIds?: readonly string[] | undefined
36
+ /** `?person_id=`, repeatable: enquiries any of these people are on. */
37
+ readonly personIds?: readonly string[] | undefined
38
+ }
39
+
40
+ /**
41
+ * The company half of `?q=`. Reads the `companies` *table*, never its
42
+ * repository, the rule set for a filter spanning a relation (`architecture.md`).
43
+ */
44
+ function companyNameMatches(pattern: string): SQL {
45
+ return sql`exists (
46
+ select 1
47
+ from ${companies}
48
+ where ${companies.id} = ${enquiries.companyId}
49
+ and ${companies.workspaceId} = ${enquiries.workspaceId}
50
+ and ${companies.name} ilike ${pattern}
51
+ )`
52
+ }
53
+
54
+ function matchesTerm(term: string): SQL | undefined {
55
+ const pattern = containsPattern(term)
56
+
57
+ return or(
58
+ ilike(enquiries.name, pattern),
59
+ ilike(enquiries.source, pattern),
60
+ ilike(enquiries.summary, pattern),
61
+ arrayContainsPattern(enquiries.tags, pattern),
62
+ companyNameMatches(pattern),
63
+ )
64
+ }
65
+
66
+ function conditionsFor(workspaceId: string, filters: EnquiryFilters): (SQL | undefined)[] {
67
+ return [
68
+ eq(enquiries.workspaceId, workspaceId),
69
+ filters.term === undefined ? undefined : matchesTerm(filters.term),
70
+ filters.sources === undefined ? undefined : inArray(enquiries.source, filters.sources),
71
+ filters.companyIds === undefined
72
+ ? undefined
73
+ : inArray(enquiries.companyId, filters.companyIds),
74
+ filters.stageIds === undefined ? undefined : inArray(enquiries.stageId, filters.stageIds),
75
+ filters.personIds === undefined
76
+ ? undefined
77
+ : anyPersonLinked('enquiry', enquiries.id, enquiries.workspaceId, filters.personIds),
78
+ ]
79
+ }
80
+
81
+ /** @returns Up to `window.fetchLimit` rows: one more than the page, so the caller can tell there is a next one. */
82
+ export function listEnquiries(
83
+ db: Queryable,
84
+ workspaceId: string,
85
+ filters: EnquiryFilters,
86
+ window: ListWindow<EnquiryRecord>,
87
+ ): Promise<EnquiryRecord[]> {
88
+ return db
89
+ .select()
90
+ .from(enquiries)
91
+ .where(and(...conditionsFor(workspaceId, filters), keysetCondition(window, enquiries.id)))
92
+ .orderBy(...orderByWindow(window, enquiries.id))
93
+ .limit(window.fetchLimit)
94
+ }
95
+
96
+ export async function findEnquiry(
97
+ db: Queryable,
98
+ workspaceId: string,
99
+ id: string,
100
+ ): Promise<EnquiryRecord | undefined> {
101
+ const [found] = await db
102
+ .select()
103
+ .from(enquiries)
104
+ .where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.id, id)))
105
+ .limit(1)
106
+
107
+ return found
108
+ }
109
+
110
+ export async function insertEnquiry(
111
+ db: Queryable,
112
+ values: EnquiryColumns,
113
+ ): Promise<EnquiryRecord> {
114
+ const [created] = await db.insert(enquiries).values(values).returning()
115
+
116
+ if (created === undefined) {
117
+ throw new Error(`Inserting enquiry ${values.id} returned no row`)
118
+ }
119
+
120
+ return created
121
+ }
122
+
123
+ export async function updateEnquiry(
124
+ db: Queryable,
125
+ workspaceId: string,
126
+ id: string,
127
+ changes: Partial<EnquiryColumns>,
128
+ ): Promise<EnquiryRecord | undefined> {
129
+ const [updated] = await db
130
+ .update(enquiries)
131
+ .set(changes)
132
+ .where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.id, id)))
133
+ .returning()
134
+
135
+ return updated
136
+ }
137
+
138
+ export async function deleteEnquiry(
139
+ db: Queryable,
140
+ workspaceId: string,
141
+ id: string,
142
+ ): Promise<number> {
143
+ const deleted = await db
144
+ .delete(enquiries)
145
+ .where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.id, id)))
146
+ .returning({ id: enquiries.id })
147
+
148
+ return deleted.length
149
+ }
150
+
151
+ /** Whether a member belongs to this workspace, for validating `owner_id`. */
152
+ export async function memberExists(
153
+ db: Queryable,
154
+ workspaceId: string,
155
+ memberId: string,
156
+ ): Promise<boolean> {
157
+ const [found] = await db
158
+ .select({ id: workspaceMembers.id })
159
+ .from(workspaceMembers)
160
+ .where(and(eq(workspaceMembers.workspaceId, workspaceId), eq(workspaceMembers.id, memberId)))
161
+ .limit(1)
162
+
163
+ return found !== undefined
164
+ }