@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
@@ -148,6 +148,118 @@
148
148
  "when": 1787447911296,
149
149
  "tag": "0020_early_nemesis",
150
150
  "breakpoints": true
151
+ },
152
+ {
153
+ "idx": 21,
154
+ "version": "7",
155
+ "when": 1787527717966,
156
+ "tag": "0021_certain_maggott",
157
+ "breakpoints": true
158
+ },
159
+ {
160
+ "idx": 22,
161
+ "version": "7",
162
+ "when": 1787626585359,
163
+ "tag": "0022_stormy_manta",
164
+ "breakpoints": true
165
+ },
166
+ {
167
+ "idx": 23,
168
+ "version": "7",
169
+ "when": 1787651539093,
170
+ "tag": "0023_funny_maddog",
171
+ "breakpoints": true
172
+ },
173
+ {
174
+ "idx": 24,
175
+ "version": "7",
176
+ "when": 1787978002874,
177
+ "tag": "0024_third_king_cobra",
178
+ "breakpoints": true
179
+ },
180
+ {
181
+ "idx": 25,
182
+ "version": "7",
183
+ "when": 1787979321712,
184
+ "tag": "0025_worthless_chimera",
185
+ "breakpoints": true
186
+ },
187
+ {
188
+ "idx": 26,
189
+ "version": "7",
190
+ "when": 1787981859874,
191
+ "tag": "0026_late_aqueduct",
192
+ "breakpoints": true
193
+ },
194
+ {
195
+ "idx": 27,
196
+ "version": "7",
197
+ "when": 1788007470077,
198
+ "tag": "0027_brainy_silver_sable",
199
+ "breakpoints": true
200
+ },
201
+ {
202
+ "idx": 28,
203
+ "version": "7",
204
+ "when": 1788045423814,
205
+ "tag": "0028_freezing_scrambler",
206
+ "breakpoints": true
207
+ },
208
+ {
209
+ "idx": 29,
210
+ "version": "7",
211
+ "when": 1788067713235,
212
+ "tag": "0029_custom_fields",
213
+ "breakpoints": true
214
+ },
215
+ {
216
+ "idx": 30,
217
+ "version": "7",
218
+ "when": 1788089808149,
219
+ "tag": "0030_enquiries",
220
+ "breakpoints": true
221
+ },
222
+ {
223
+ "idx": 31,
224
+ "version": "7",
225
+ "when": 1788128702292,
226
+ "tag": "0031_consent",
227
+ "breakpoints": true
228
+ },
229
+ {
230
+ "idx": 32,
231
+ "version": "7",
232
+ "when": 1788133056653,
233
+ "tag": "0032_form_field_statement",
234
+ "breakpoints": true
235
+ },
236
+ {
237
+ "idx": 33,
238
+ "version": "7",
239
+ "when": 1788134204561,
240
+ "tag": "0033_form_field_consent_purpose_ids",
241
+ "breakpoints": true
242
+ },
243
+ {
244
+ "idx": 34,
245
+ "version": "7",
246
+ "when": 1788134239537,
247
+ "tag": "0034_drop_form_field_consent_purpose_id",
248
+ "breakpoints": true
249
+ },
250
+ {
251
+ "idx": 35,
252
+ "version": "7",
253
+ "when": 1788146179776,
254
+ "tag": "0035_form_field_consent_purpose_labels",
255
+ "breakpoints": true
256
+ },
257
+ {
258
+ "idx": 36,
259
+ "version": "7",
260
+ "when": 1788146891073,
261
+ "tag": "0036_form_field_notice_type",
262
+ "breakpoints": true
151
263
  }
152
264
  ]
153
265
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kelpie/server",
3
- "version": "0.7.0",
3
+ "version": "0.9.0",
4
4
  "description": "The Kelpie service as a library: module runtime, core CRM modules, REST API, MCP surface, and the shared migration pipeline.",
5
5
  "keywords": [
6
6
  "kelpie",
@@ -52,11 +52,12 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@hono/node-server": "^2.0.12",
55
- "@kelpie/schemas": "^0.7.0",
55
+ "@kelpie/schemas": "^0.9.0",
56
56
  "@node-rs/argon2": "^2.0.2",
57
57
  "drizzle-orm": "^0.45.2",
58
58
  "emittery": "^2.0.0",
59
59
  "hono": "^4.12.32",
60
+ "mailgen": "^2.0.36",
60
61
  "nodemailer": "^9.0.5",
61
62
  "postgres": "^3.4.9",
62
63
  "ulid": "^3.0.2",
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Consumer email hosts, checked case-insensitively.
3
+ *
4
+ * The email-domain listener refuses to auto-link a Person to a Company on any
5
+ * domain in this list. A consumer address belongs to no one company, and a
6
+ * Company row entered by mistake against, say, `gmail.com` would otherwise
7
+ * auto-attach every consumer address after.
8
+ *
9
+ * A starter list of the common providers. Add locale variants and less common
10
+ * hosts as the need arrives.
11
+ */
12
+ const CONSUMER_EMAIL_DOMAINS: ReadonlySet<string> = new Set([
13
+ 'gmail.com',
14
+ 'googlemail.com',
15
+ 'yahoo.com',
16
+ 'yahoo.co.uk',
17
+ 'yahoo.co.jp',
18
+ 'yahoo.fr',
19
+ 'yahoo.de',
20
+ 'yahoo.ca',
21
+ 'yahoo.com.au',
22
+ 'ymail.com',
23
+ 'rocketmail.com',
24
+ 'hotmail.com',
25
+ 'hotmail.co.uk',
26
+ 'hotmail.fr',
27
+ 'hotmail.de',
28
+ 'hotmail.it',
29
+ 'hotmail.es',
30
+ 'outlook.com',
31
+ 'outlook.co.uk',
32
+ 'live.com',
33
+ 'live.co.uk',
34
+ 'msn.com',
35
+ 'aol.com',
36
+ 'aim.com',
37
+ 'icloud.com',
38
+ 'me.com',
39
+ 'mac.com',
40
+ 'protonmail.com',
41
+ 'proton.me',
42
+ 'pm.me',
43
+ 'gmx.com',
44
+ 'gmx.net',
45
+ 'gmx.de',
46
+ 'mail.com',
47
+ 'fastmail.com',
48
+ 'fastmail.fm',
49
+ 'zoho.com',
50
+ 'yandex.com',
51
+ 'yandex.ru',
52
+ 'tutanota.com',
53
+ 'tuta.io',
54
+ 'qq.com',
55
+ '163.com',
56
+ '126.com',
57
+ 'naver.com',
58
+ ])
59
+
60
+ export function isConsumerEmailDomain(domain: string): boolean {
61
+ return CONSUMER_EMAIL_DOMAINS.has(domain.trim().toLowerCase())
62
+ }
package/src/lib/email.ts CHANGED
@@ -21,7 +21,14 @@ import type { Logger } from './logger.ts'
21
21
  export interface EmailMessage {
22
22
  readonly to: string
23
23
  readonly subject: string
24
+ /** The plaintext part. Always present: text-only clients and logs read it. */
24
25
  readonly body: string
26
+ /**
27
+ * The HTML alternative, rendered by `lib/emailContent.ts`. Optional so
28
+ * provider modules written against the older port keep compiling and a
29
+ * plain-text message stays expressible.
30
+ */
31
+ readonly html?: string
25
32
  }
26
33
 
27
34
  export interface EmailSender {
@@ -0,0 +1,91 @@
1
+ import Mailgen from 'mailgen'
2
+
3
+ /**
4
+ * Renders transactional mail bodies: a plaintext part and an HTML part from
5
+ * one description of the message.
6
+ *
7
+ * Email clients need table-based, inline-styled HTML; mailgen owns that
8
+ * problem so Kelpie does not. The plaintext part is built here by hand rather
9
+ * than by mailgen's plaintext generator, because that generator pads lines
10
+ * with trailing whitespace and the plaintext body is the part tests and
11
+ * text-only clients read token links out of. The wording of the two parts
12
+ * comes from the same fields, so they cannot drift.
13
+ */
14
+
15
+ /** A link the message asks the reader to follow, rendered as a button in HTML. */
16
+ export interface EmailAction {
17
+ readonly instructions: string
18
+ readonly buttonText: string
19
+ readonly link: string
20
+ }
21
+
22
+ export interface EmailContent {
23
+ readonly intro?: string
24
+ readonly action?: EmailAction
25
+ readonly outro?: string
26
+ }
27
+
28
+ export interface RenderedEmail {
29
+ readonly text: string
30
+ readonly html: string
31
+ }
32
+
33
+ /**
34
+ * Fixed so rendering is deterministic. Mailgen's default footer stamps the
35
+ * current year, which the sender has no claim to: the workspace, not Kelpie,
36
+ * owns the relationship with the recipient.
37
+ */
38
+ const FOOTER_LINE = 'Sent by Kelpie.'
39
+
40
+ /**
41
+ * Renders one transactional message. `appBaseUrl` becomes the link on the
42
+ * product name in the header and footer, so every part of the mail points at
43
+ * the deployment that sent it.
44
+ */
45
+ export function renderEmail(content: EmailContent, appBaseUrl: string): RenderedEmail {
46
+ const generator = new Mailgen({
47
+ theme: 'default',
48
+ product: {
49
+ name: 'Kelpie',
50
+ link: appBaseUrl,
51
+ copyright: FOOTER_LINE,
52
+ },
53
+ })
54
+
55
+ const html: string = generator.generate({
56
+ body: {
57
+ greeting: false,
58
+ signature: false,
59
+ ...(content.intro === undefined ? {} : { intro: content.intro }),
60
+ ...(content.action === undefined
61
+ ? {}
62
+ : {
63
+ action: {
64
+ instructions: content.action.instructions,
65
+ button: {
66
+ text: content.action.buttonText,
67
+ link: content.action.link,
68
+ fallback: true,
69
+ },
70
+ },
71
+ }),
72
+ ...(content.outro === undefined ? {} : { outro: content.outro }),
73
+ },
74
+ })
75
+
76
+ const paragraphs: string[] = []
77
+
78
+ if (content.intro !== undefined) {
79
+ paragraphs.push(content.intro)
80
+ }
81
+
82
+ if (content.action !== undefined) {
83
+ paragraphs.push(`${content.action.instructions}\n\n${content.action.link}`)
84
+ }
85
+
86
+ if (content.outro !== undefined) {
87
+ paragraphs.push(content.outro)
88
+ }
89
+
90
+ return { text: paragraphs.join('\n\n'), html }
91
+ }
@@ -0,0 +1,165 @@
1
+ import { UNIQUE_VIOLATION, postgresErrorCode } from './database.ts'
2
+ import type { IdFactory } from './ids.ts'
3
+ import { isConsumerEmailDomain } from './consumerEmailDomains.ts'
4
+ import type { BufferedEvents, Transaction } from '../runtime/transaction.ts'
5
+ import type { ActivityRecorder, SystemActor } from '../modules/activities/recorder.ts'
6
+ import { describeLink } from '../modules/activities/wording.ts'
7
+ import * as companyRepository from '../modules/companies/repository.ts'
8
+ import type { CompanyRecord } from '../modules/companies/repository.ts'
9
+ import * as peopleRepository from '../modules/people/repository.ts'
10
+ import type { PersonRecord } from '../modules/people/repository.ts'
11
+ import '../modules/positions/events.ts'
12
+ import * as positionRepository from '../modules/positions/repository.ts'
13
+
14
+ /**
15
+ * Auto-link a Person to a workspace Company whose domain matches the person's
16
+ * email. Runs inside the caller's transaction, so the new Position is present
17
+ * in the response the API returns for the same request.
18
+ *
19
+ * Skips: no email, consumer email host (`isConsumerEmailDomain`), no Company
20
+ * on that domain in the workspace, or a Position already linking the two. A
21
+ * unique-key race with a concurrent linker is absorbed.
22
+ *
23
+ * The created Position carries an empty title. `positions.title` is `NOT NULL`,
24
+ * and empty reads honestly as "the domain matched; no title yet".
25
+ *
26
+ * Split from the people service so the layering (people below positions) is
27
+ * carried by imports only: this helper depends on both repositories, and the
28
+ * people service depends on this helper. The `positions` module still owns the
29
+ * event catalogue for the emitted event.
30
+ */
31
+
32
+ /** What the timeline calls this side effect. */
33
+ const LINKER_ACTOR: SystemActor = { kind: 'system', label: 'Email domain match' }
34
+
35
+ export interface AutoLinkDependencies {
36
+ readonly createId: IdFactory
37
+ readonly now: () => Date
38
+ readonly recordActivity: ActivityRecorder
39
+ }
40
+
41
+ /**
42
+ * Considers `person` for a matching Company in `workspaceId` and inserts a
43
+ * titleless Position if none links them yet.
44
+ *
45
+ * @returns The new Position's id, or `undefined` if nothing was written.
46
+ */
47
+ export async function autoLinkPersonByEmailDomain(
48
+ tx: Transaction,
49
+ events: BufferedEvents,
50
+ workspaceId: string,
51
+ person: PersonRecord,
52
+ dependencies: AutoLinkDependencies,
53
+ ): Promise<string | undefined> {
54
+ if (person.email === null) {
55
+ return undefined
56
+ }
57
+
58
+ const at = person.email.indexOf('@')
59
+ if (at < 0) {
60
+ return undefined
61
+ }
62
+
63
+ const domain = person.email.slice(at + 1)
64
+ if (domain.length === 0 || isConsumerEmailDomain(domain)) {
65
+ return undefined
66
+ }
67
+
68
+ const company = await companyRepository.findCompanyByDomain(tx, workspaceId, domain)
69
+ if (company === undefined) {
70
+ return undefined
71
+ }
72
+
73
+ const held = await positionRepository.listPositionsAt(tx, workspaceId, person.id, company.id)
74
+ if (held.length > 0) {
75
+ return undefined
76
+ }
77
+
78
+ return insertStubPosition(tx, events, workspaceId, person, company, dependencies)
79
+ }
80
+
81
+ /**
82
+ * Sweeps every Person in `workspaceId` whose email domain matches `company`'s
83
+ * domain and stubs a Position where none exists yet. Called when a Company is
84
+ * created or its domain is set.
85
+ *
86
+ * @returns The ids of every Position this call inserted.
87
+ */
88
+ export async function autoLinkCompanyByDomain(
89
+ tx: Transaction,
90
+ events: BufferedEvents,
91
+ workspaceId: string,
92
+ company: CompanyRecord,
93
+ dependencies: AutoLinkDependencies,
94
+ ): Promise<readonly string[]> {
95
+ if (company.domain === null || company.domain.length === 0) {
96
+ return []
97
+ }
98
+
99
+ if (isConsumerEmailDomain(company.domain)) {
100
+ return []
101
+ }
102
+
103
+ const matches = await peopleRepository.findPeopleByEmailDomain(tx, workspaceId, company.domain)
104
+ const created: string[] = []
105
+
106
+ for (const person of matches) {
107
+ const held = await positionRepository.listPositionsAt(tx, workspaceId, person.id, company.id)
108
+ if (held.length > 0) {
109
+ continue
110
+ }
111
+
112
+ const id = await insertStubPosition(tx, events, workspaceId, person, company, dependencies)
113
+ if (id !== undefined) {
114
+ created.push(id)
115
+ }
116
+ }
117
+
118
+ return created
119
+ }
120
+
121
+ /**
122
+ * The write half. Wraps the unique-constraint race the two entry points share:
123
+ * a concurrent linker that beat us to `(personId, companyId, '')` is treated
124
+ * as success (the link is there, either way).
125
+ */
126
+ async function insertStubPosition(
127
+ tx: Transaction,
128
+ events: BufferedEvents,
129
+ workspaceId: string,
130
+ person: PersonRecord,
131
+ company: CompanyRecord,
132
+ dependencies: AutoLinkDependencies,
133
+ ): Promise<string | undefined> {
134
+ try {
135
+ const created = await positionRepository.insertPosition(tx, {
136
+ id: dependencies.createId('position'),
137
+ workspaceId,
138
+ personId: person.id,
139
+ companyId: company.id,
140
+ title: '',
141
+ })
142
+
143
+ await dependencies.recordActivity(tx, workspaceId, LINKER_ACTOR, {
144
+ targetType: 'person',
145
+ targetId: person.id,
146
+ kind: 'linked',
147
+ ...describeLink('company', company.name),
148
+ })
149
+ await dependencies.recordActivity(tx, workspaceId, LINKER_ACTOR, {
150
+ targetType: 'company',
151
+ targetId: company.id,
152
+ kind: 'linked',
153
+ ...describeLink('person', person.name),
154
+ })
155
+
156
+ events.emit('positions.position.created', { type: 'position', id: created.id }, {})
157
+
158
+ return created.id
159
+ } catch (error: unknown) {
160
+ if (postgresErrorCode(error) === UNIQUE_VIOLATION) {
161
+ return undefined
162
+ }
163
+ throw error
164
+ }
165
+ }
package/src/lib/ids.ts CHANGED
@@ -19,6 +19,7 @@ export const idPrefixes = {
19
19
  position: 'pos',
20
20
  pipelineStage: 'stage',
21
21
  deal: 'deal',
22
+ enquiry: 'enq',
22
23
  opportunity: 'opp',
23
24
  partnership: 'prt',
24
25
  raise: 'rse',
@@ -28,7 +29,19 @@ export const idPrefixes = {
28
29
  decision: 'dec',
29
30
  note: 'note',
30
31
  activity: 'act',
32
+ list: 'list',
33
+ listMember: 'lmem',
34
+ /**
35
+ * Never returns over the wire either: `person_links` has no routes of its
36
+ * own — the link surfaces as a `person_ids` array on each pipeline record —
37
+ * so the prefix is not in `api.md`'s public prefix table, matching `idem`
38
+ * and `rl`. It still comes from this factory rather than a bare ULID call,
39
+ * so every id in the database is generated the same, injectable way.
40
+ */
41
+ personLink: 'plink',
31
42
  handbookPage: 'hb',
43
+ customFieldDefinition: 'fld',
44
+ consentPurpose: 'cnp',
32
45
  form: 'form',
33
46
  formField: 'ff',
34
47
  formSubmission: 'sub',
@@ -1,12 +1,16 @@
1
1
  import { and, eq, inArray, or, sql } from 'drizzle-orm'
2
2
  import type { SQL } from 'drizzle-orm'
3
3
 
4
+ import type { PipelineKind } from '@kelpie/schemas'
5
+
4
6
  import { keysetCondition, orderByWindow, timestampSort } from '../../lib/pagination.ts'
5
7
  import type { ListWindow, SortableFields } from '../../lib/pagination.ts'
6
8
  import type { Queryable } from '../../runtime/transaction.ts'
7
- import { dealPeople, deals } from '../deals/schema.ts'
9
+ import { deals } from '../deals/schema.ts'
10
+ import { enquiries } from '../enquiries/schema.ts'
8
11
  import { opportunities } from '../opportunities/schema.ts'
9
- import { partnershipPeople, partnerships } from '../partnerships/schema.ts'
12
+ import { partnerships } from '../partnerships/schema.ts'
13
+ import * as personLinks from '../personLinks.ts'
10
14
  import type { RecordTargetType } from '../recordTargets.ts'
11
15
  import { activities } from './schema.ts'
12
16
 
@@ -66,7 +70,7 @@ export async function listRolledUpTargets(
66
70
  targetId: string,
67
71
  ): Promise<ActivityTarget[]> {
68
72
  if (targetType === 'company') {
69
- const [dealRows, opportunityRows, partnershipRows] = await Promise.all([
73
+ const [dealRows, opportunityRows, partnershipRows, enquiryRows] = await Promise.all([
70
74
  db
71
75
  .select({ id: deals.id })
72
76
  .from(deals)
@@ -81,36 +85,31 @@ export async function listRolledUpTargets(
81
85
  .select({ id: partnerships.id })
82
86
  .from(partnerships)
83
87
  .where(and(eq(partnerships.workspaceId, workspaceId), eq(partnerships.companyId, targetId))),
88
+ db
89
+ .select({ id: enquiries.id })
90
+ .from(enquiries)
91
+ .where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.companyId, targetId))),
84
92
  ])
85
93
 
86
94
  return [
87
95
  ...dealRows.map((row) => ({ targetType: 'deal' as const, targetId: row.id })),
88
96
  ...opportunityRows.map((row) => ({ targetType: 'opportunity' as const, targetId: row.id })),
89
97
  ...partnershipRows.map((row) => ({ targetType: 'partnership' as const, targetId: row.id })),
98
+ ...enquiryRows.map((row) => ({ targetType: 'enquiry' as const, targetId: row.id })),
90
99
  ]
91
100
  }
92
101
 
93
102
  if (targetType === 'person') {
94
- // An opportunity has no people, so a person rolls up two relations, not three.
95
- const [dealRows, partnershipRows] = await Promise.all([
96
- db
97
- .select({ id: deals.id })
98
- .from(deals)
99
- .innerJoin(dealPeople, eq(dealPeople.dealId, deals.id))
100
- .where(and(eq(deals.workspaceId, workspaceId), eq(dealPeople.personId, targetId))),
101
- db
102
- .select({ id: partnerships.id })
103
- .from(partnerships)
104
- .innerJoin(partnershipPeople, eq(partnershipPeople.partnershipId, partnerships.id))
105
- .where(
106
- and(eq(partnerships.workspaceId, workspaceId), eq(partnershipPeople.personId, targetId)),
107
- ),
108
- ])
109
-
110
- return [
111
- ...dealRows.map((row) => ({ targetType: 'deal' as const, targetId: row.id })),
112
- ...partnershipRows.map((row) => ({ targetType: 'partnership' as const, targetId: row.id })),
113
- ]
103
+ // person_links carries all four pipeline kinds in one table, so a person's
104
+ // roll-up is one read regardless of how many pipelines they touch. The
105
+ // shared helper's `PipelineKind` narrows to the check-constraint set, which
106
+ // is exactly what an ActivityTarget expects to receive.
107
+ const links = await personLinks.listTargetsOfPerson(db, workspaceId, targetId)
108
+
109
+ return links.map((link) => ({
110
+ targetType: link.targetType satisfies PipelineKind as RecordTargetType,
111
+ targetId: link.targetId,
112
+ }))
114
113
  }
115
114
 
116
115
  return []
@@ -147,6 +147,24 @@ export function describeStageChange(fromStage: string, toStage: string): Activit
147
147
  return { action: `moved to ${toStage}`, detail: `${fromStage} → ${toStage}` }
148
148
  }
149
149
 
150
+ /**
151
+ * `converted to Deal`, with the deal's name beneath it. Files on the enquiry;
152
+ * the deal's own timeline gets `created Deal from Enquiry` via
153
+ * `describeCreationFrom`.
154
+ */
155
+ export function describeConversion(objectLabel: string, name: string): ActivityWording {
156
+ return { action: `converted to ${objectLabel}`, detail: name }
157
+ }
158
+
159
+ /**
160
+ * `created Deal from Enquiry`, with the source record's name beneath it. Mirror
161
+ * of `describeCreationVia` but the source is another CRM record rather than a
162
+ * form or import file.
163
+ */
164
+ export function describeCreationFrom(objectLabel: string, sourceLabel: string, sourceName: string): ActivityWording {
165
+ return { action: `created ${objectLabel} from ${sourceLabel}`, detail: sourceName }
166
+ }
167
+
150
168
  /** How much of a note's body the timeline repeats before trailing off. */
151
169
  const NOTE_EXCERPT_LENGTH = 120
152
170
 
@@ -305,6 +305,69 @@ Optionally save as a Note.`,
305
305
  Append a Note, propose Plan items, update summary/whyWin/risks only with clear evidence, extract Decisions.`,
306
306
  }),
307
307
 
308
+ // Enquiry
309
+ task({
310
+ id: 'enquiry.triage',
311
+ label: 'Triage enquiry',
312
+ description: 'Recommend pursue, nurture, or close.',
313
+ targetTypes: ['enquiry'],
314
+ placement: 'primary',
315
+ handbookSlugs: ['ideal-customer-profile', 'product', 'agent-faq'],
316
+ instructions: `Assess this Enquiry against Ideal customer profile and Product. Recommend one of:
317
+ - pursue (convert to Deal)
318
+ - nurture (keep in In progress, add a follow-up Plan item)
319
+ - close (move to Closed, note the reason).
320
+ Save the recommendation and rationale as a Note. Do not change the stage or convert without human confirmation.`,
321
+ }),
322
+ task({
323
+ id: 'enquiry.propose_plan',
324
+ label: 'Propose Plan',
325
+ description: 'Dated follow-up items.',
326
+ targetTypes: ['enquiry'],
327
+ placement: 'primary',
328
+ handbookSlugs: ['agent-faq'],
329
+ instructions: `Propose dated Plan items for this Enquiry (a first response, a follow-up, a review).
330
+ Prefer concrete actions over vague reminders.`,
331
+ }),
332
+ task({
333
+ id: 'enquiry.refresh_summary',
334
+ label: 'Refresh enquiry summary',
335
+ description: 'Rewrite summary from evidence.',
336
+ targetTypes: ['enquiry'],
337
+ placement: 'primary',
338
+ handbookSlugs: ['agent-faq'],
339
+ instructions: `Rewrite the Enquiry summary from source, stage, notes, and linked Company.`,
340
+ }),
341
+ task({
342
+ id: 'enquiry.draft_reply',
343
+ label: 'Draft reply',
344
+ description: 'First-response email in Voice.',
345
+ targetTypes: ['enquiry'],
346
+ placement: 'primary',
347
+ handbookSlugs: ['voice-and-tone', 'product', 'agent-faq'],
348
+ instructions: `Draft a first response to this Enquiry in Voice. Reference the Product handbook only where the
349
+ Enquiry's summary or notes signal a match. Save the draft as a Note. Do not send.`,
350
+ }),
351
+ task({
352
+ id: 'enquiry.capture_decision',
353
+ label: 'Capture decision',
354
+ description: 'Log what was decided about this enquiry.',
355
+ targetTypes: ['enquiry'],
356
+ placement: 'overflow',
357
+ handbookSlugs: ['agent-faq'],
358
+ instructions: `Create a Decision linked to this Enquiry from recent commitments or the human's instruction.`,
359
+ }),
360
+ task({
361
+ id: 'enquiry.log_transcript',
362
+ label: 'Log transcript',
363
+ description: 'Parse call notes into CRM updates.',
364
+ targetTypes: ['enquiry'],
365
+ placement: 'overflow',
366
+ handbookSlugs: ['agent-faq'],
367
+ instructions: `The human will paste a call or chat transcript after this prompt.
368
+ Append a Note, propose Plan items, update the summary only with clear evidence, extract Decisions.`,
369
+ }),
370
+
308
371
  // Opportunity
309
372
  task({
310
373
  id: 'opportunity.propose_plan',