@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
@@ -4,7 +4,7 @@ import { createSearchService } from './service.ts'
4
4
  import { registerSearchTools } from './tools.ts'
5
5
 
6
6
  /**
7
- * One box across nine collections.
7
+ * One box across ten collections.
8
8
  *
9
9
  * It contributes no tables and calls no `context.schema`. The `search_vector`
10
10
  * column each searchable table carries belongs to that table's own module, which
@@ -30,6 +30,7 @@ export function createSearchModule(): KelpieModule {
30
30
  'positions',
31
31
  'companies',
32
32
  'deals',
33
+ 'enquiries',
33
34
  'opportunities',
34
35
  'partnerships',
35
36
  'raises',
@@ -8,6 +8,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
10
  import { decisions } from '../decisions/schema.ts'
11
+ import { enquiries } from '../enquiries/schema.ts'
11
12
  import { handbookPages } from '../handbook/schema.ts'
12
13
  import { roles } from '../hiring/schema.ts'
13
14
  import { opportunities } from '../opportunities/schema.ts'
@@ -210,7 +211,7 @@ function byPlanItem(
210
211
  db: Queryable,
211
212
  workspaceId: string,
212
213
  query: SQL,
213
- targetType: 'deal' | 'opportunity' | 'raise',
214
+ targetType: 'deal' | 'opportunity' | 'raise' | 'enquiry',
214
215
  ) {
215
216
  return db
216
217
  .select({ id: planItems.targetId, rank: relatedRank(planItems.searchVector, query).as('rank') })
@@ -224,6 +225,37 @@ function byPlanItem(
224
225
  )
225
226
  }
226
227
 
228
+ export async function searchEnquiries(
229
+ db: Queryable,
230
+ workspaceId: string,
231
+ query: SQL,
232
+ limit: number,
233
+ ): Promise<CollectionHits> {
234
+ const own = db
235
+ .select({ id: enquiries.id, rank: rank(enquiries.searchVector, query).as('rank') })
236
+ .from(enquiries)
237
+ .where(and(eq(enquiries.workspaceId, workspaceId), matches(enquiries.searchVector, query)))
238
+
239
+ const hits = unionAll(own, byPlanItem(db, workspaceId, query, 'enquiry')).as('hits')
240
+
241
+ const rows = await db
242
+ .select({
243
+ id: enquiries.id,
244
+ title: enquiries.name,
245
+ subtitle: pipelineStages.label,
246
+ snippetSource: enquiries.summary,
247
+ total,
248
+ })
249
+ .from(hits)
250
+ .innerJoin(enquiries, eq(enquiries.id, hits.id))
251
+ .innerJoin(pipelineStages, eq(pipelineStages.id, enquiries.stageId))
252
+ .groupBy(enquiries.id, pipelineStages.label)
253
+ .orderBy(desc(bestRank(hits.rank)), asc(enquiries.id))
254
+ .limit(limit)
255
+
256
+ return collect('enquiry', rows)
257
+ }
258
+
227
259
  export async function searchDeals(
228
260
  db: Queryable,
229
261
  workspaceId: string,
@@ -10,6 +10,7 @@ import {
10
10
  searchCompanies,
11
11
  searchDeals,
12
12
  searchDecisions,
13
+ searchEnquiries,
13
14
  searchHandbookPages,
14
15
  searchOpportunities,
15
16
  searchPartnerships,
@@ -20,7 +21,7 @@ import {
20
21
  import type { CollectionHits } from './repository.ts'
21
22
 
22
23
  /**
23
- * One box across nine collections, ranked per collection rather than merged.
24
+ * One box across ten collections, ranked per collection rather than merged.
24
25
  *
25
26
  * A single merged ranking would need `ts_rank` values from different tables to
26
27
  * mean the same thing, and they do not: a handbook page is a thousand words and a
@@ -49,7 +50,7 @@ export interface SearchResults {
49
50
  readonly limit: number
50
51
  /** Across every group. The number a "12 results" heading is built from. */
51
52
  readonly total: number
52
- /** Always all nine, in `SEARCH_COLLECTIONS` order, empty ones included. */
53
+ /** Always all ten, in `SEARCH_COLLECTIONS` order, empty ones included. */
53
54
  readonly groups: readonly SearchGroup[]
54
55
  }
55
56
 
@@ -71,7 +72,7 @@ export interface SearchServiceDependencies {
71
72
  /**
72
73
  * How many rows a group carries when the caller does not say.
73
74
  *
74
- * Small on purpose: nine groups on one page, and a reader scanning them wants the
75
+ * Small on purpose: ten groups on one page, and a reader scanning them wants the
75
76
  * best few of each rather than a page of People they have to scroll past to reach
76
77
  * the handbook. The exact total sits beside each group regardless.
77
78
  */
@@ -89,6 +90,7 @@ const SEARCHES: Readonly<Record<SearchCollection, CollectionSearch>> = {
89
90
  person: searchPeople,
90
91
  role: searchRoles,
91
92
  company: searchCompanies,
93
+ enquiry: searchEnquiries,
92
94
  deal: searchDeals,
93
95
  opportunity: searchOpportunities,
94
96
  raise: searchRaises,
@@ -134,8 +136,8 @@ export function createSearchService(dependencies: SearchServiceDependencies): Se
134
136
  const query = compileQuery(tsQuery)
135
137
  const words = searchWords(request.term)
136
138
 
137
- // Nine independent reads with nothing to share but the compiled query. Run
138
- // in sequence they would be nine round trips deep rather than wide.
139
+ // Ten independent reads with nothing to share but the compiled query. Run
140
+ // in sequence they would be ten round trips deep rather than wide.
139
141
  const groups = await Promise.all(
140
142
  wanted.map(async (collection) =>
141
143
  toGroup(await SEARCHES[collection](dependencies.db, workspaceId, query, limit), words),
@@ -44,7 +44,13 @@ export type SmtpEmailConfig = z.infer<typeof smtpEmailConfigSchema>
44
44
  * sender is verifiable without a container running a real SMTP conversation.
45
45
  */
46
46
  export interface SmtpTransport {
47
- sendMail(message: { from: string; to: string; subject: string; text: string }): Promise<unknown>
47
+ sendMail(message: {
48
+ from: string
49
+ to: string
50
+ subject: string
51
+ text: string
52
+ html?: string
53
+ }): Promise<unknown>
48
54
  }
49
55
 
50
56
  function createNodemailerTransport(config: SmtpEmailConfig): SmtpTransport {
@@ -70,6 +76,7 @@ export function createSmtpEmailSender(
70
76
  to: message.to,
71
77
  subject: message.subject,
72
78
  text: message.body,
79
+ ...(message.html === undefined ? {} : { html: message.html }),
73
80
  })
74
81
  } catch (cause) {
75
82
  const reason = describeThrown(cause)
@@ -2,20 +2,21 @@ import { and, eq } from 'drizzle-orm'
2
2
 
3
3
  import type { Queryable } from '../runtime/transaction.ts'
4
4
  import { deals } from './deals/schema.ts'
5
+ import { enquiries } from './enquiries/schema.ts'
5
6
  import { opportunities } from './opportunities/schema.ts'
6
7
  import { partnerships } from './partnerships/schema.ts'
7
8
  import type { PipelineKind } from './pipelines/schema.ts'
8
9
  import { raises } from './raises/schema.ts'
9
10
 
10
11
  /**
11
- * The four tables whose rows sit in a pipeline stage, for the one operation that
12
+ * The five tables whose rows sit in a pipeline stage, for the one operation that
12
13
  * spans them all: removing a stage moves whatever still references it.
13
14
  *
14
- * Touching four modules' tables here rather than composing four services follows
15
+ * Touching five modules' tables here rather than composing five services follows
15
16
  * `attachedRecords.ts`: the alternative is a stage removal that imports every
16
17
  * staged service to ask each for a bulk move it exists for nowhere else.
17
18
  *
18
- * Four written-out branches rather than a table-of-tables, because Drizzle's
19
+ * Five written-out branches rather than a table-of-tables, because Drizzle's
19
20
  * `update().set()` needs the concrete table type to check the column names.
20
21
  */
21
22
 
@@ -87,5 +88,19 @@ export async function reassignStagedRecords(
87
88
 
88
89
  return moved.map((row) => row.id)
89
90
  }
91
+ case 'enquiry': {
92
+ const moved = await db
93
+ .update(enquiries)
94
+ .set(changes)
95
+ .where(
96
+ and(
97
+ eq(enquiries.workspaceId, move.workspaceId),
98
+ eq(enquiries.stageId, move.fromStageId),
99
+ ),
100
+ )
101
+ .returning({ id: enquiries.id })
102
+
103
+ return moved.map((row) => row.id)
104
+ }
90
105
  }
91
106
  }
@@ -41,6 +41,10 @@ interface RecordUpdatedData {
41
41
  interface FormSubmittedData {
42
42
  readonly formId?: string
43
43
  readonly submissionId?: string
44
+ readonly opportunityId?: string | null
45
+ readonly partnershipId?: string | null
46
+ readonly enquiryId?: string | null
47
+ readonly actions?: readonly { readonly action: string; readonly status: string }[]
44
48
  }
45
49
 
46
50
  /**
@@ -90,7 +94,11 @@ export function translateEnvelopeEvent(
90
94
 
91
95
  if (suffix === 'submitted') {
92
96
  // Form submission is the only `.submitted` wire event today. The forms
93
- // module emits its envelope with `formId` and `submissionId` in `data`.
97
+ // module emits its envelope with `formId` and `submissionId` in `data`,
98
+ // plus (per forms.md §Webhooks) the opportunity/partnership ids the
99
+ // post-submit runner created and one status per configured action. The
100
+ // per-action `detail` string is deliberately omitted — the authenticated
101
+ // Submissions read carries it in full, the webhook only says what ran.
94
102
  const data = event.data as FormSubmittedData
95
103
  if (data.formId === undefined || data.submissionId === undefined) {
96
104
  return undefined
@@ -99,7 +107,17 @@ export function translateEnvelopeEvent(
99
107
  return {
100
108
  workspaceId: event.workspaceId,
101
109
  event: 'form.submitted',
102
- data: { form_id: data.formId, submission_id: data.submissionId },
110
+ data: {
111
+ form_id: data.formId,
112
+ submission_id: data.submissionId,
113
+ opportunity_id: data.opportunityId ?? null,
114
+ partnership_id: data.partnershipId ?? null,
115
+ enquiry_id: data.enquiryId ?? null,
116
+ actions:
117
+ data.actions === undefined
118
+ ? []
119
+ : data.actions.map((entry) => ({ action: entry.action, status: entry.status })),
120
+ },
103
121
  }
104
122
  }
105
123
 
@@ -3,6 +3,7 @@ import { and, asc, count, eq, gt } from 'drizzle-orm'
3
3
  import type { Database } from '../../lib/database.ts'
4
4
  import type { Transaction } from '../../runtime/transaction.ts'
5
5
  import { users } from '../auth/schema.ts'
6
+ import { consentPurposes } from '../consent-purposes/schema.ts'
6
7
  import { deals } from '../deals/schema.ts'
7
8
  import { decisions } from '../decisions/schema.ts'
8
9
  import { handbookPages } from '../handbook/schema.ts'
@@ -387,6 +388,17 @@ export async function insertPipelineStages(
387
388
  await db.insert(pipelineStages).values([...values])
388
389
  }
389
390
 
391
+ export async function insertConsentPurposes(
392
+ db: Queryable,
393
+ values: readonly (typeof consentPurposes.$inferInsert)[],
394
+ ): Promise<void> {
395
+ if (values.length === 0) {
396
+ return
397
+ }
398
+
399
+ await db.insert(consentPurposes).values([...values])
400
+ }
401
+
390
402
  export type ModuleSettingRecord = typeof workspaceModuleSettings.$inferSelect
391
403
 
392
404
  export async function listModuleSettings(db: Queryable, workspaceId: string): Promise<ModuleSettingRecord[]> {
@@ -2,6 +2,7 @@ import { APP_LINK_PATHS, buildAppLink } from '../../lib/appUrl.ts'
2
2
  import { UNIQUE_VIOLATION, isReferenceViolation, postgresErrorCode } from '../../lib/database.ts'
3
3
  import type { Database } from '../../lib/database.ts'
4
4
  import type { EmailSender } from '../../lib/email.ts'
5
+ import { renderEmail } from '../../lib/emailContent.ts'
5
6
  import { AppError } from '../../lib/errors.ts'
6
7
  import type { IdFactory } from '../../lib/ids.ts'
7
8
  import { generateToken, hashToken } from '../../lib/tokens.ts'
@@ -14,6 +15,7 @@ import type { Actor, SessionActor } from '../auth/actor.ts'
14
15
  import './events.ts'
15
16
  import * as authRepository from '../auth/repository.ts'
16
17
  import { SEATS_LIMIT } from './capabilities.ts'
18
+ import { STARTER_CONSENT_PURPOSES } from '../consent-purposes/starters.ts'
17
19
  import * as repository from './repository.ts'
18
20
  import { parseInvitableRole, parseMemberRole, roleAllows } from './roles.ts'
19
21
  import type { InvitableRole, InviteStatus, MemberRole } from './roles.ts'
@@ -336,11 +338,22 @@ export function createWorkspaceService(dependencies: WorkspaceDependencies): Wor
336
338
 
337
339
  function sendInviteEmail(to: string, token: string): Promise<void> {
338
340
  const link = buildAppLink(dependencies.appBaseUrl, APP_LINK_PATHS.inviteAccept, token)
341
+ const { text, html } = renderEmail(
342
+ {
343
+ action: {
344
+ instructions: 'Accept the invitation within seven days:',
345
+ buttonText: 'Accept invitation',
346
+ link,
347
+ },
348
+ },
349
+ dependencies.appBaseUrl,
350
+ )
339
351
 
340
352
  return dependencies.email.send({
341
353
  to,
342
354
  subject: 'You have been invited to a Kelpie workspace',
343
- body: `Accept the invitation within seven days:\n\n${link}`,
355
+ body: text,
356
+ html,
344
357
  })
345
358
  }
346
359
 
@@ -459,6 +472,19 @@ export function createWorkspaceService(dependencies: WorkspaceDependencies): Wor
459
472
  ),
460
473
  )
461
474
 
475
+ await repository.insertConsentPurposes(
476
+ tx,
477
+ STARTER_CONSENT_PURPOSES.map((purpose, index) => ({
478
+ id: dependencies.createId('consentPurpose'),
479
+ workspaceId,
480
+ slug: purpose.slug,
481
+ label: purpose.label,
482
+ description: purpose.description,
483
+ defaultStatus: purpose.defaultStatus,
484
+ sortOrder: index,
485
+ })),
486
+ )
487
+
462
488
  // The session that created the workspace should land in it.
463
489
  await authRepository.setActiveWorkspace(tx, actor.sessionId, workspaceId)
464
490
 
@@ -37,6 +37,11 @@ export interface StarterStage {
37
37
 
38
38
  /** `open: false` hides a stage from the Open scope filter; it is not a delete. */
39
39
  export const STARTER_PIPELINE_STAGES: Readonly<Record<string, readonly StarterStage[]>> = {
40
+ enquiry: [
41
+ { slug: 'new', label: 'New', open: true },
42
+ { slug: 'in_progress', label: 'In progress', open: true },
43
+ { slug: 'closed', label: 'Closed', open: false },
44
+ ],
40
45
  deal: [
41
46
  { slug: 'qualifying', label: 'Qualifying', open: true },
42
47
  { slug: 'proposal', label: 'Proposal', open: true },
@@ -29,6 +29,7 @@ export const RECORD_OBJECT_TYPES = [
29
29
  'company',
30
30
  'position',
31
31
  'deal',
32
+ 'enquiry',
32
33
  'opportunity',
33
34
  'partnership',
34
35
  'raise',
@@ -9,11 +9,13 @@
9
9
  export * from '../modules/auth/schema.ts'
10
10
  export * from '../modules/workspace/schema.ts'
11
11
  export * from '../modules/api-keys/schema.ts'
12
+ export * from '../modules/consent-purposes/schema.ts'
12
13
  export * from '../modules/people/schema.ts'
13
14
  export * from '../modules/companies/schema.ts'
14
15
  export * from '../modules/positions/schema.ts'
15
16
  export * from '../modules/pipelines/schema.ts'
16
17
  export * from '../modules/deals/schema.ts'
18
+ export * from '../modules/enquiries/schema.ts'
17
19
  export * from '../modules/opportunities/schema.ts'
18
20
  export * from '../modules/partnerships/schema.ts'
19
21
  export * from '../modules/raises/schema.ts'
@@ -21,7 +23,9 @@ export * from '../modules/hiring/schema.ts'
21
23
  export * from '../modules/plans/schema.ts'
22
24
  export * from '../modules/decisions/schema.ts'
23
25
  export * from '../modules/notes/schema.ts'
26
+ export * from '../modules/lists/schema.ts'
24
27
  export * from '../modules/activities/schema.ts'
28
+ export * from '../modules/custom-fields/schema.ts'
25
29
  export * from '../modules/handbook/schema.ts'
26
30
  export * from '../modules/forms/schema.ts'
27
31
  export * from '../modules/import-export/schema.ts'
@@ -15,24 +15,42 @@ import { TEST_EMAIL_FROM, TEST_EMAIL_PROVIDER, createTestServices } from './serv
15
15
  * A migrated database for integration tests.
16
16
  *
17
17
  * Tests connect to the same local Postgres the dev server uses, on a database
18
- * named by `TEST_DATABASE_URL`. Migrations run once per process; between tests
19
- * `truncateAll` empties the tables rather than re-migrating, which is an order of
20
- * magnitude faster and just as isolated.
18
+ * named by `TEST_DATABASE_URL` suffixed per Vitest worker, so test files can
19
+ * run in parallel without sharing tables. Migrations run once per process;
20
+ * between tests `truncateAll` empties the tables rather than re-migrating.
21
+ *
22
+ * The reset deletes rather than truncates. TRUNCATE rebuilds every relation
23
+ * file and syncs it to disk, which measured 590-830ms per call against
24
+ * Dockerised Postgres; DELETE across the same mostly-empty tables is under a
25
+ * millisecond. Deletes run children-first so no foreign key is ever violated.
21
26
  */
22
27
 
23
28
  const silentLogger = createLogger({ level: 'error', transports: [] })
24
29
 
25
30
  export interface TestDatabase extends DatabaseConnection {
26
- /** Empties every table. Cheaper than re-running migrations between tests. */
31
+ /** Empties every table. Cheaper than truncating or re-migrating between tests. */
27
32
  readonly truncateAll: () => Promise<void>
28
33
  }
29
34
 
30
35
  /**
31
36
  * Reads the test database location. Integration tests are skipped rather than
32
37
  * failed when it is absent, so `npm test` still works without Postgres running.
38
+ *
39
+ * Inside a Vitest worker the configured name gains the worker's pool id, so
40
+ * every worker owns its own database and test files can run in parallel.
41
+ * `connectTestDatabase` creates and migrates a missing database on first use.
33
42
  */
34
43
  export function testDatabaseUrl(environment: Environment): string | undefined {
35
- return environment.TEST_DATABASE_URL
44
+ const configured = environment.TEST_DATABASE_URL
45
+ const poolId = environment.VITEST_POOL_ID
46
+
47
+ if (configured === undefined || poolId === undefined) {
48
+ return configured
49
+ }
50
+
51
+ const url = new URL(configured)
52
+ url.pathname = `${url.pathname}_${poolId}`
53
+ return url.toString()
36
54
  }
37
55
 
38
56
  /**
@@ -85,10 +103,18 @@ export async function connectTestDatabase(connectionString: string): Promise<Tes
85
103
 
86
104
  await runMigrations(connection.db, contributions.schemas, silentLogger)
87
105
 
88
- async function truncateAll(): Promise<void> {
106
+ let cachedReset: string | undefined
107
+
108
+ /**
109
+ * Builds one `DO` block that deletes from every table, each table after
110
+ * every table that references it, so a plain DELETE never trips a foreign
111
+ * key. Built once per connection: the table set only changes with the
112
+ * migrations, which already ran.
113
+ */
114
+ async function buildResetStatement(): Promise<string | undefined> {
89
115
  // Names come from the catalog, not from user input, and every migrations
90
- // table is excluded so truncation does not undo the migration record.
91
- const rows = await connection.db.execute<{ table_name: string }>(sql`
116
+ // table is excluded so the reset does not undo the migration record.
117
+ const tables = await connection.db.execute<{ table_name: string }>(sql`
92
118
  select table_name
93
119
  from information_schema.tables
94
120
  where table_schema = 'public'
@@ -96,13 +122,73 @@ export async function connectTestDatabase(connectionString: string): Promise<Tes
96
122
  and table_name not like '\\_\\_drizzle\\_%'
97
123
  `)
98
124
 
99
- const names = [...rows].map((row) => `"${row.table_name}"`)
125
+ const names = [...tables].map((row) => row.table_name)
100
126
 
101
127
  if (names.length === 0) {
102
- return
128
+ return undefined
129
+ }
130
+
131
+ // Distinct pairs, so two foreign keys between the same tables do not
132
+ // count twice. Self-references are dropped: deleting every row of a table
133
+ // in one statement satisfies its own constraint.
134
+ const references = await connection.db.execute<{ child: string; parent: string }>(sql`
135
+ select distinct child.relname as child, parent.relname as parent
136
+ from pg_constraint con
137
+ join pg_class child on child.oid = con.conrelid
138
+ join pg_class parent on parent.oid = con.confrelid
139
+ where con.contype = 'f'
140
+ and con.connamespace = 'public'::regnamespace
141
+ and con.conrelid <> con.confrelid
142
+ `)
143
+
144
+ const included = new Set(names)
145
+ const parentsOf = new Map<string, string[]>()
146
+ const inboundReferences = new Map<string, number>(names.map((name) => [name, 0]))
147
+
148
+ for (const { child, parent } of references) {
149
+ if (!included.has(child) || !included.has(parent)) {
150
+ continue
151
+ }
152
+
153
+ parentsOf.set(child, [...(parentsOf.get(child) ?? []), parent])
154
+ inboundReferences.set(parent, (inboundReferences.get(parent) ?? 0) + 1)
103
155
  }
104
156
 
105
- await connection.db.execute(sql.raw(`truncate table ${names.join(', ')} restart identity cascade`))
157
+ // Kahn's algorithm. A table joins the order once every table referencing
158
+ // it is already in it, which is exactly when deleting from it is safe.
159
+ const ordered = names.filter((name) => inboundReferences.get(name) === 0)
160
+
161
+ for (let index = 0; index < ordered.length; index += 1) {
162
+ const table = ordered[index]
163
+
164
+ if (table === undefined) {
165
+ continue
166
+ }
167
+
168
+ for (const parent of parentsOf.get(table) ?? []) {
169
+ const remaining = (inboundReferences.get(parent) ?? 0) - 1
170
+ inboundReferences.set(parent, remaining)
171
+
172
+ if (remaining === 0) {
173
+ ordered.push(parent)
174
+ }
175
+ }
176
+ }
177
+
178
+ if (ordered.length !== names.length) {
179
+ throw new Error('cannot order the table deletes: the foreign keys form a cycle')
180
+ }
181
+
182
+ const deletes = ordered.map((name) => `delete from "${name.replace(/"/gu, '""')}";`).join(' ')
183
+ return `do $reset$ begin ${deletes} end $reset$;`
184
+ }
185
+
186
+ async function truncateAll(): Promise<void> {
187
+ cachedReset ??= await buildResetStatement()
188
+
189
+ if (cachedReset !== undefined) {
190
+ await connection.db.execute(sql.raw(cachedReset))
191
+ }
106
192
  }
107
193
 
108
194
  return { ...connection, truncateAll }