@kelpie/server 0.8.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 (584) hide show
  1. package/dist/lib/ids.d.ts +11 -0
  2. package/dist/lib/ids.d.ts.map +1 -1
  3. package/dist/lib/ids.js +11 -0
  4. package/dist/lib/ids.js.map +1 -1
  5. package/dist/modules/activities/repository.d.ts.map +1 -1
  6. package/dist/modules/activities/repository.js +19 -20
  7. package/dist/modules/activities/repository.js.map +1 -1
  8. package/dist/modules/activities/wording.d.ts +12 -0
  9. package/dist/modules/activities/wording.d.ts.map +1 -1
  10. package/dist/modules/activities/wording.js +16 -0
  11. package/dist/modules/activities/wording.js.map +1 -1
  12. package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
  13. package/dist/modules/agent-tasks/catalog.js +62 -0
  14. package/dist/modules/agent-tasks/catalog.js.map +1 -1
  15. package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
  16. package/dist/modules/agent-tasks/resolve.js +42 -9
  17. package/dist/modules/agent-tasks/resolve.js.map +1 -1
  18. package/dist/modules/agent-tasks/routes.d.ts +2 -0
  19. package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
  20. package/dist/modules/attachedRecords.d.ts +6 -1
  21. package/dist/modules/attachedRecords.d.ts.map +1 -1
  22. package/dist/modules/attachedRecords.js +15 -1
  23. package/dist/modules/attachedRecords.js.map +1 -1
  24. package/dist/modules/companies/index.d.ts.map +1 -1
  25. package/dist/modules/companies/index.js +3 -1
  26. package/dist/modules/companies/index.js.map +1 -1
  27. package/dist/modules/companies/routes.d.ts +14 -0
  28. package/dist/modules/companies/routes.d.ts.map +1 -1
  29. package/dist/modules/companies/routes.js +7 -0
  30. package/dist/modules/companies/routes.js.map +1 -1
  31. package/dist/modules/companies/schema.d.ts +20 -0
  32. package/dist/modules/companies/schema.d.ts.map +1 -1
  33. package/dist/modules/companies/schema.js +6 -1
  34. package/dist/modules/companies/schema.js.map +1 -1
  35. package/dist/modules/companies/service.d.ts +5 -0
  36. package/dist/modules/companies/service.d.ts.map +1 -1
  37. package/dist/modules/companies/service.js +24 -12
  38. package/dist/modules/companies/service.js.map +1 -1
  39. package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
  40. package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
  41. package/dist/modules/consent-purposes/capabilities.js +10 -0
  42. package/dist/modules/consent-purposes/capabilities.js.map +1 -0
  43. package/dist/modules/consent-purposes/events.d.ts +38 -0
  44. package/dist/modules/consent-purposes/events.d.ts.map +1 -0
  45. package/dist/modules/consent-purposes/events.js +17 -0
  46. package/dist/modules/consent-purposes/events.js.map +1 -0
  47. package/dist/modules/consent-purposes/index.d.ts +13 -0
  48. package/dist/modules/consent-purposes/index.d.ts.map +1 -0
  49. package/dist/modules/consent-purposes/index.js +41 -0
  50. package/dist/modules/consent-purposes/index.js.map +1 -0
  51. package/dist/modules/consent-purposes/repository.d.ts +21 -0
  52. package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
  53. package/dist/modules/consent-purposes/repository.js +98 -0
  54. package/dist/modules/consent-purposes/repository.js.map +1 -0
  55. package/dist/modules/consent-purposes/routes.d.ts +39 -0
  56. package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
  57. package/dist/modules/consent-purposes/routes.js +79 -0
  58. package/dist/modules/consent-purposes/routes.js.map +1 -0
  59. package/dist/modules/consent-purposes/schema.d.ts +175 -0
  60. package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
  61. package/dist/modules/consent-purposes/schema.js +35 -0
  62. package/dist/modules/consent-purposes/schema.js.map +1 -0
  63. package/dist/modules/consent-purposes/service.d.ts +50 -0
  64. package/dist/modules/consent-purposes/service.d.ts.map +1 -0
  65. package/dist/modules/consent-purposes/service.js +263 -0
  66. package/dist/modules/consent-purposes/service.js.map +1 -0
  67. package/dist/modules/consent-purposes/starters.d.ts +17 -0
  68. package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
  69. package/dist/modules/consent-purposes/starters.js +15 -0
  70. package/dist/modules/consent-purposes/starters.js.map +1 -0
  71. package/dist/modules/consent-purposes/tools.d.ts +4 -0
  72. package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
  73. package/dist/modules/consent-purposes/tools.js +29 -0
  74. package/dist/modules/consent-purposes/tools.js.map +1 -0
  75. package/dist/modules/core.d.ts.map +1 -1
  76. package/dist/modules/core.js +10 -0
  77. package/dist/modules/core.js.map +1 -1
  78. package/dist/modules/custom-fields/capabilities.d.ts +12 -0
  79. package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
  80. package/dist/modules/custom-fields/capabilities.js +15 -0
  81. package/dist/modules/custom-fields/capabilities.js.map +1 -0
  82. package/dist/modules/custom-fields/events.d.ts +49 -0
  83. package/dist/modules/custom-fields/events.d.ts.map +1 -0
  84. package/dist/modules/custom-fields/events.js +25 -0
  85. package/dist/modules/custom-fields/events.js.map +1 -0
  86. package/dist/modules/custom-fields/index.d.ts +19 -0
  87. package/dist/modules/custom-fields/index.d.ts.map +1 -0
  88. package/dist/modules/custom-fields/index.js +46 -0
  89. package/dist/modules/custom-fields/index.js.map +1 -0
  90. package/dist/modules/custom-fields/repository.d.ts +37 -0
  91. package/dist/modules/custom-fields/repository.d.ts.map +1 -0
  92. package/dist/modules/custom-fields/repository.js +144 -0
  93. package/dist/modules/custom-fields/repository.js.map +1 -0
  94. package/dist/modules/custom-fields/routes.d.ts +44 -0
  95. package/dist/modules/custom-fields/routes.d.ts.map +1 -0
  96. package/dist/modules/custom-fields/routes.js +103 -0
  97. package/dist/modules/custom-fields/routes.js.map +1 -0
  98. package/dist/modules/custom-fields/schema.d.ts +215 -0
  99. package/dist/modules/custom-fields/schema.d.ts.map +1 -0
  100. package/dist/modules/custom-fields/schema.js +43 -0
  101. package/dist/modules/custom-fields/schema.js.map +1 -0
  102. package/dist/modules/custom-fields/service.d.ts +57 -0
  103. package/dist/modules/custom-fields/service.d.ts.map +1 -0
  104. package/dist/modules/custom-fields/service.js +273 -0
  105. package/dist/modules/custom-fields/service.js.map +1 -0
  106. package/dist/modules/custom-fields/tools.d.ts +4 -0
  107. package/dist/modules/custom-fields/tools.d.ts.map +1 -0
  108. package/dist/modules/custom-fields/tools.js +38 -0
  109. package/dist/modules/custom-fields/tools.js.map +1 -0
  110. package/dist/modules/custom-fields/values.d.ts +49 -0
  111. package/dist/modules/custom-fields/values.d.ts.map +1 -0
  112. package/dist/modules/custom-fields/values.js +249 -0
  113. package/dist/modules/custom-fields/values.js.map +1 -0
  114. package/dist/modules/custom-fields/wire.d.ts +12 -0
  115. package/dist/modules/custom-fields/wire.d.ts.map +1 -0
  116. package/dist/modules/custom-fields/wire.js +30 -0
  117. package/dist/modules/custom-fields/wire.js.map +1 -0
  118. package/dist/modules/dashboard/repository.d.ts.map +1 -1
  119. package/dist/modules/dashboard/repository.js +4 -3
  120. package/dist/modules/dashboard/repository.js.map +1 -1
  121. package/dist/modules/deals/index.d.ts +2 -1
  122. package/dist/modules/deals/index.d.ts.map +1 -1
  123. package/dist/modules/deals/index.js +5 -2
  124. package/dist/modules/deals/index.js.map +1 -1
  125. package/dist/modules/deals/repository.d.ts +0 -16
  126. package/dist/modules/deals/repository.d.ts.map +1 -1
  127. package/dist/modules/deals/repository.js +6 -76
  128. package/dist/modules/deals/repository.js.map +1 -1
  129. package/dist/modules/deals/routes.d.ts +14 -0
  130. package/dist/modules/deals/routes.d.ts.map +1 -1
  131. package/dist/modules/deals/routes.js +7 -0
  132. package/dist/modules/deals/routes.js.map +1 -1
  133. package/dist/modules/deals/schema.d.ts +20 -42
  134. package/dist/modules/deals/schema.d.ts.map +1 -1
  135. package/dist/modules/deals/schema.js +6 -11
  136. package/dist/modules/deals/schema.js.map +1 -1
  137. package/dist/modules/deals/service.d.ts +13 -2
  138. package/dist/modules/deals/service.d.ts.map +1 -1
  139. package/dist/modules/deals/service.js +43 -20
  140. package/dist/modules/deals/service.js.map +1 -1
  141. package/dist/modules/decisions/repository.d.ts.map +1 -1
  142. package/dist/modules/decisions/repository.js +2 -0
  143. package/dist/modules/decisions/repository.js.map +1 -1
  144. package/dist/modules/decisions/routes.d.ts +1 -0
  145. package/dist/modules/decisions/routes.d.ts.map +1 -1
  146. package/dist/modules/enquiries/events.d.ts +44 -0
  147. package/dist/modules/enquiries/events.d.ts.map +1 -0
  148. package/dist/modules/enquiries/events.js +19 -0
  149. package/dist/modules/enquiries/events.js.map +1 -0
  150. package/dist/modules/enquiries/index.d.ts +13 -0
  151. package/dist/modules/enquiries/index.d.ts.map +1 -0
  152. package/dist/modules/enquiries/index.js +44 -0
  153. package/dist/modules/enquiries/index.js.map +1 -0
  154. package/dist/modules/enquiries/repository.d.ts +30 -0
  155. package/dist/modules/enquiries/repository.d.ts.map +1 -0
  156. package/dist/modules/enquiries/repository.js +94 -0
  157. package/dist/modules/enquiries/repository.js.map +1 -0
  158. package/dist/modules/enquiries/routes.d.ts +52 -0
  159. package/dist/modules/enquiries/routes.d.ts.map +1 -0
  160. package/dist/modules/enquiries/routes.js +127 -0
  161. package/dist/modules/enquiries/routes.js.map +1 -0
  162. package/dist/modules/enquiries/schema.d.ts +290 -0
  163. package/dist/modules/enquiries/schema.d.ts.map +1 -0
  164. package/dist/modules/enquiries/schema.js +52 -0
  165. package/dist/modules/enquiries/schema.js.map +1 -0
  166. package/dist/modules/enquiries/service.d.ts +85 -0
  167. package/dist/modules/enquiries/service.d.ts.map +1 -0
  168. package/dist/modules/enquiries/service.js +370 -0
  169. package/dist/modules/enquiries/service.js.map +1 -0
  170. package/dist/modules/enquiries/tools.d.ts +4 -0
  171. package/dist/modules/enquiries/tools.d.ts.map +1 -0
  172. package/dist/modules/enquiries/tools.js +50 -0
  173. package/dist/modules/enquiries/tools.js.map +1 -0
  174. package/dist/modules/eventCatalogs.d.ts +3 -0
  175. package/dist/modules/eventCatalogs.d.ts.map +1 -1
  176. package/dist/modules/eventCatalogs.js +3 -0
  177. package/dist/modules/eventCatalogs.js.map +1 -1
  178. package/dist/modules/forms/embed.d.ts +20 -6
  179. package/dist/modules/forms/embed.d.ts.map +1 -1
  180. package/dist/modules/forms/embed.js +359 -43
  181. package/dist/modules/forms/embed.js.map +1 -1
  182. package/dist/modules/forms/events.d.ts +20 -7
  183. package/dist/modules/forms/events.d.ts.map +1 -1
  184. package/dist/modules/forms/events.js +20 -2
  185. package/dist/modules/forms/events.js.map +1 -1
  186. package/dist/modules/forms/fields.d.ts +14 -1
  187. package/dist/modules/forms/fields.d.ts.map +1 -1
  188. package/dist/modules/forms/fields.js +87 -3
  189. package/dist/modules/forms/fields.js.map +1 -1
  190. package/dist/modules/forms/index.d.ts.map +1 -1
  191. package/dist/modules/forms/index.js +12 -1
  192. package/dist/modules/forms/index.js.map +1 -1
  193. package/dist/modules/forms/mapping.d.ts +62 -5
  194. package/dist/modules/forms/mapping.d.ts.map +1 -1
  195. package/dist/modules/forms/mapping.js +139 -5
  196. package/dist/modules/forms/mapping.js.map +1 -1
  197. package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
  198. package/dist/modules/forms/publicRoutes.js +29 -1
  199. package/dist/modules/forms/publicRoutes.js.map +1 -1
  200. package/dist/modules/forms/repository.d.ts +31 -0
  201. package/dist/modules/forms/repository.d.ts.map +1 -1
  202. package/dist/modules/forms/repository.js +90 -1
  203. package/dist/modules/forms/repository.js.map +1 -1
  204. package/dist/modules/forms/routes.d.ts +83 -1
  205. package/dist/modules/forms/routes.d.ts.map +1 -1
  206. package/dist/modules/forms/routes.js +185 -2
  207. package/dist/modules/forms/routes.js.map +1 -1
  208. package/dist/modules/forms/schema.d.ts +672 -1
  209. package/dist/modules/forms/schema.d.ts.map +1 -1
  210. package/dist/modules/forms/schema.js +146 -3
  211. package/dist/modules/forms/schema.js.map +1 -1
  212. package/dist/modules/forms/service.d.ts +54 -1
  213. package/dist/modules/forms/service.d.ts.map +1 -1
  214. package/dist/modules/forms/service.js +338 -28
  215. package/dist/modules/forms/service.js.map +1 -1
  216. package/dist/modules/forms/submission.d.ts +15 -0
  217. package/dist/modules/forms/submission.d.ts.map +1 -1
  218. package/dist/modules/forms/submission.js +418 -40
  219. package/dist/modules/forms/submission.js.map +1 -1
  220. package/dist/modules/import-export/drafts.d.ts +10 -0
  221. package/dist/modules/import-export/drafts.d.ts.map +1 -1
  222. package/dist/modules/import-export/drafts.js +16 -2
  223. package/dist/modules/import-export/drafts.js.map +1 -1
  224. package/dist/modules/import-export/exportRows.d.ts +7 -4
  225. package/dist/modules/import-export/exportRows.d.ts.map +1 -1
  226. package/dist/modules/import-export/exportRows.js +20 -5
  227. package/dist/modules/import-export/exportRows.js.map +1 -1
  228. package/dist/modules/import-export/plan.d.ts +12 -1
  229. package/dist/modules/import-export/plan.d.ts.map +1 -1
  230. package/dist/modules/import-export/plan.js +29 -2
  231. package/dist/modules/import-export/plan.js.map +1 -1
  232. package/dist/modules/import-export/presets.d.ts.map +1 -1
  233. package/dist/modules/import-export/presets.js +10 -0
  234. package/dist/modules/import-export/presets.js.map +1 -1
  235. package/dist/modules/import-export/repository.d.ts +11 -1
  236. package/dist/modules/import-export/repository.d.ts.map +1 -1
  237. package/dist/modules/import-export/repository.js +42 -9
  238. package/dist/modules/import-export/repository.js.map +1 -1
  239. package/dist/modules/import-export/routes.d.ts.map +1 -1
  240. package/dist/modules/import-export/routes.js +4 -0
  241. package/dist/modules/import-export/routes.js.map +1 -1
  242. package/dist/modules/import-export/schema.d.ts +17 -0
  243. package/dist/modules/import-export/schema.d.ts.map +1 -1
  244. package/dist/modules/import-export/schema.js +11 -0
  245. package/dist/modules/import-export/schema.js.map +1 -1
  246. package/dist/modules/import-export/service.d.ts +6 -0
  247. package/dist/modules/import-export/service.d.ts.map +1 -1
  248. package/dist/modules/import-export/service.js +14 -2
  249. package/dist/modules/import-export/service.js.map +1 -1
  250. package/dist/modules/import-export/streams.d.ts.map +1 -1
  251. package/dist/modules/import-export/streams.js +3 -3
  252. package/dist/modules/import-export/streams.js.map +1 -1
  253. package/dist/modules/import-export/tools.d.ts.map +1 -1
  254. package/dist/modules/import-export/tools.js +8 -0
  255. package/dist/modules/import-export/tools.js.map +1 -1
  256. package/dist/modules/import-export/validation.d.ts.map +1 -1
  257. package/dist/modules/import-export/validation.js +22 -1
  258. package/dist/modules/import-export/validation.js.map +1 -1
  259. package/dist/modules/import-export/writes.d.ts.map +1 -1
  260. package/dist/modules/import-export/writes.js +37 -4
  261. package/dist/modules/import-export/writes.js.map +1 -1
  262. package/dist/modules/lists/repository.d.ts +11 -0
  263. package/dist/modules/lists/repository.d.ts.map +1 -1
  264. package/dist/modules/lists/repository.js +13 -0
  265. package/dist/modules/lists/repository.js.map +1 -1
  266. package/dist/modules/lists/routes.d.ts +4 -0
  267. package/dist/modules/lists/routes.d.ts.map +1 -1
  268. package/dist/modules/lists/routes.js +8 -0
  269. package/dist/modules/lists/routes.js.map +1 -1
  270. package/dist/modules/lists/schema.d.ts +17 -0
  271. package/dist/modules/lists/schema.d.ts.map +1 -1
  272. package/dist/modules/lists/schema.js +10 -0
  273. package/dist/modules/lists/schema.js.map +1 -1
  274. package/dist/modules/lists/service.d.ts +14 -2
  275. package/dist/modules/lists/service.d.ts.map +1 -1
  276. package/dist/modules/lists/service.js +55 -7
  277. package/dist/modules/lists/service.js.map +1 -1
  278. package/dist/modules/mcp/index.d.ts.map +1 -1
  279. package/dist/modules/mcp/index.js +5 -0
  280. package/dist/modules/mcp/index.js.map +1 -1
  281. package/dist/modules/notes/routes.d.ts +1 -0
  282. package/dist/modules/notes/routes.d.ts.map +1 -1
  283. package/dist/modules/opportunities/index.d.ts.map +1 -1
  284. package/dist/modules/opportunities/index.js +3 -1
  285. package/dist/modules/opportunities/index.js.map +1 -1
  286. package/dist/modules/opportunities/repository.d.ts +2 -0
  287. package/dist/modules/opportunities/repository.d.ts.map +1 -1
  288. package/dist/modules/opportunities/repository.js +4 -0
  289. package/dist/modules/opportunities/repository.js.map +1 -1
  290. package/dist/modules/opportunities/routes.d.ts +16 -0
  291. package/dist/modules/opportunities/routes.d.ts.map +1 -1
  292. package/dist/modules/opportunities/routes.js +13 -0
  293. package/dist/modules/opportunities/routes.js.map +1 -1
  294. package/dist/modules/opportunities/schema.d.ts +20 -0
  295. package/dist/modules/opportunities/schema.d.ts.map +1 -1
  296. package/dist/modules/opportunities/schema.js +6 -1
  297. package/dist/modules/opportunities/schema.js.map +1 -1
  298. package/dist/modules/opportunities/service.d.ts +20 -3
  299. package/dist/modules/opportunities/service.d.ts.map +1 -1
  300. package/dist/modules/opportunities/service.js +99 -18
  301. package/dist/modules/opportunities/service.js.map +1 -1
  302. package/dist/modules/opportunities/tools.d.ts.map +1 -1
  303. package/dist/modules/opportunities/tools.js +2 -0
  304. package/dist/modules/opportunities/tools.js.map +1 -1
  305. package/dist/modules/partnerships/index.d.ts.map +1 -1
  306. package/dist/modules/partnerships/index.js +3 -1
  307. package/dist/modules/partnerships/index.js.map +1 -1
  308. package/dist/modules/partnerships/repository.d.ts +0 -17
  309. package/dist/modules/partnerships/repository.d.ts.map +1 -1
  310. package/dist/modules/partnerships/repository.js +6 -82
  311. package/dist/modules/partnerships/repository.js.map +1 -1
  312. package/dist/modules/partnerships/routes.d.ts +14 -0
  313. package/dist/modules/partnerships/routes.d.ts.map +1 -1
  314. package/dist/modules/partnerships/routes.js +7 -0
  315. package/dist/modules/partnerships/routes.js.map +1 -1
  316. package/dist/modules/partnerships/schema.d.ts +20 -41
  317. package/dist/modules/partnerships/schema.d.ts.map +1 -1
  318. package/dist/modules/partnerships/schema.js +6 -10
  319. package/dist/modules/partnerships/schema.js.map +1 -1
  320. package/dist/modules/partnerships/service.d.ts +11 -1
  321. package/dist/modules/partnerships/service.d.ts.map +1 -1
  322. package/dist/modules/partnerships/service.js +43 -20
  323. package/dist/modules/partnerships/service.js.map +1 -1
  324. package/dist/modules/people/consentHydration.d.ts +26 -0
  325. package/dist/modules/people/consentHydration.d.ts.map +1 -0
  326. package/dist/modules/people/consentHydration.js +100 -0
  327. package/dist/modules/people/consentHydration.js.map +1 -0
  328. package/dist/modules/people/index.d.ts.map +1 -1
  329. package/dist/modules/people/index.js +3 -1
  330. package/dist/modules/people/index.js.map +1 -1
  331. package/dist/modules/people/personConsentWrites.d.ts +40 -0
  332. package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
  333. package/dist/modules/people/personConsentWrites.js +98 -0
  334. package/dist/modules/people/personConsentWrites.js.map +1 -0
  335. package/dist/modules/people/repository.d.ts.map +1 -1
  336. package/dist/modules/people/repository.js +5 -1
  337. package/dist/modules/people/repository.js.map +1 -1
  338. package/dist/modules/people/routes.d.ts +57 -4
  339. package/dist/modules/people/routes.d.ts.map +1 -1
  340. package/dist/modules/people/routes.js +104 -5
  341. package/dist/modules/people/routes.js.map +1 -1
  342. package/dist/modules/people/schema.d.ts +366 -1
  343. package/dist/modules/people/schema.d.ts.map +1 -1
  344. package/dist/modules/people/schema.js +92 -2
  345. package/dist/modules/people/schema.js.map +1 -1
  346. package/dist/modules/people/service.d.ts +30 -1
  347. package/dist/modules/people/service.d.ts.map +1 -1
  348. package/dist/modules/people/service.js +115 -38
  349. package/dist/modules/people/service.js.map +1 -1
  350. package/dist/modules/people/tools.d.ts.map +1 -1
  351. package/dist/modules/people/tools.js +4 -1
  352. package/dist/modules/people/tools.js.map +1 -1
  353. package/dist/modules/personLinks.d.ts +79 -0
  354. package/dist/modules/personLinks.d.ts.map +1 -0
  355. package/dist/modules/personLinks.js +155 -0
  356. package/dist/modules/personLinks.js.map +1 -0
  357. package/dist/modules/pipelines/routes.d.ts +1 -0
  358. package/dist/modules/pipelines/routes.d.ts.map +1 -1
  359. package/dist/modules/plans/routes.d.ts +1 -0
  360. package/dist/modules/plans/routes.d.ts.map +1 -1
  361. package/dist/modules/raises/index.d.ts.map +1 -1
  362. package/dist/modules/raises/index.js +3 -1
  363. package/dist/modules/raises/index.js.map +1 -1
  364. package/dist/modules/raises/repository.d.ts +0 -17
  365. package/dist/modules/raises/repository.d.ts.map +1 -1
  366. package/dist/modules/raises/repository.js +6 -77
  367. package/dist/modules/raises/repository.js.map +1 -1
  368. package/dist/modules/raises/routes.d.ts +14 -0
  369. package/dist/modules/raises/routes.d.ts.map +1 -1
  370. package/dist/modules/raises/routes.js +7 -0
  371. package/dist/modules/raises/routes.js.map +1 -1
  372. package/dist/modules/raises/schema.d.ts +20 -41
  373. package/dist/modules/raises/schema.d.ts.map +1 -1
  374. package/dist/modules/raises/schema.js +6 -10
  375. package/dist/modules/raises/schema.js.map +1 -1
  376. package/dist/modules/raises/service.d.ts +11 -1
  377. package/dist/modules/raises/service.d.ts.map +1 -1
  378. package/dist/modules/raises/service.js +41 -18
  379. package/dist/modules/raises/service.js.map +1 -1
  380. package/dist/modules/recordTargets.d.ts.map +1 -1
  381. package/dist/modules/recordTargets.js +2 -0
  382. package/dist/modules/recordTargets.js.map +1 -1
  383. package/dist/modules/references.d.ts +10 -0
  384. package/dist/modules/references.d.ts.map +1 -1
  385. package/dist/modules/references.js +27 -4
  386. package/dist/modules/references.js.map +1 -1
  387. package/dist/modules/sample-data/fixture.d.ts +21 -0
  388. package/dist/modules/sample-data/fixture.d.ts.map +1 -1
  389. package/dist/modules/sample-data/fixture.js +40 -0
  390. package/dist/modules/sample-data/fixture.js.map +1 -1
  391. package/dist/modules/sample-data/index.d.ts.map +1 -1
  392. package/dist/modules/sample-data/index.js +1 -0
  393. package/dist/modules/sample-data/index.js.map +1 -1
  394. package/dist/modules/sample-data/routes.d.ts.map +1 -1
  395. package/dist/modules/sample-data/routes.js +1 -0
  396. package/dist/modules/sample-data/routes.js.map +1 -1
  397. package/dist/modules/sample-data/service.d.ts +1 -0
  398. package/dist/modules/sample-data/service.d.ts.map +1 -1
  399. package/dist/modules/sample-data/service.js +77 -8
  400. package/dist/modules/sample-data/service.js.map +1 -1
  401. package/dist/modules/search/index.d.ts +1 -1
  402. package/dist/modules/search/index.d.ts.map +1 -1
  403. package/dist/modules/search/index.js +2 -1
  404. package/dist/modules/search/index.js.map +1 -1
  405. package/dist/modules/search/repository.d.ts +1 -0
  406. package/dist/modules/search/repository.d.ts.map +1 -1
  407. package/dist/modules/search/repository.js +23 -0
  408. package/dist/modules/search/repository.js.map +1 -1
  409. package/dist/modules/search/service.d.ts +3 -3
  410. package/dist/modules/search/service.d.ts.map +1 -1
  411. package/dist/modules/search/service.js +5 -4
  412. package/dist/modules/search/service.js.map +1 -1
  413. package/dist/modules/stagedRecords.d.ts +3 -3
  414. package/dist/modules/stagedRecords.d.ts.map +1 -1
  415. package/dist/modules/stagedRecords.js +9 -0
  416. package/dist/modules/stagedRecords.js.map +1 -1
  417. package/dist/modules/webhooks/payloads.d.ts.map +1 -1
  418. package/dist/modules/webhooks/payloads.js +15 -2
  419. package/dist/modules/webhooks/payloads.js.map +1 -1
  420. package/dist/modules/workspace/repository.d.ts +2 -0
  421. package/dist/modules/workspace/repository.d.ts.map +1 -1
  422. package/dist/modules/workspace/repository.js +7 -0
  423. package/dist/modules/workspace/repository.js.map +1 -1
  424. package/dist/modules/workspace/service.d.ts.map +1 -1
  425. package/dist/modules/workspace/service.js +10 -0
  426. package/dist/modules/workspace/service.js.map +1 -1
  427. package/dist/modules/workspace/starters.d.ts.map +1 -1
  428. package/dist/modules/workspace/starters.js +5 -0
  429. package/dist/modules/workspace/starters.js.map +1 -1
  430. package/dist/runtime/events.d.ts +1 -1
  431. package/dist/runtime/events.d.ts.map +1 -1
  432. package/dist/runtime/events.js +1 -0
  433. package/dist/runtime/events.js.map +1 -1
  434. package/dist/schema/index.d.ts +3 -0
  435. package/dist/schema/index.d.ts.map +1 -1
  436. package/dist/schema/index.js +3 -0
  437. package/dist/schema/index.js.map +1 -1
  438. package/dist/testing/database.d.ts +5 -1
  439. package/dist/testing/database.d.ts.map +1 -1
  440. package/dist/testing/database.js +81 -10
  441. package/dist/testing/database.js.map +1 -1
  442. package/migrations/0024_third_king_cobra.sql +46 -0
  443. package/migrations/0025_worthless_chimera.sql +3 -0
  444. package/migrations/0026_late_aqueduct.sql +46 -0
  445. package/migrations/0027_brainy_silver_sable.sql +3 -0
  446. package/migrations/0028_freezing_scrambler.sql +19 -0
  447. package/migrations/0029_custom_fields.sql +26 -0
  448. package/migrations/0030_enquiries.sql +79 -0
  449. package/migrations/0031_consent.sql +45 -0
  450. package/migrations/0032_form_field_statement.sql +1 -0
  451. package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
  452. package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
  453. package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
  454. package/migrations/0036_form_field_notice_type.sql +2 -0
  455. package/migrations/meta/0024_snapshot.json +5516 -0
  456. package/migrations/meta/0025_snapshot.json +5336 -0
  457. package/migrations/meta/0026_snapshot.json +5710 -0
  458. package/migrations/meta/0027_snapshot.json +5716 -0
  459. package/migrations/meta/0028_snapshot.json +5740 -0
  460. package/migrations/meta/0029_snapshot.json +5935 -0
  461. package/migrations/meta/0030_snapshot.json +6245 -0
  462. package/migrations/meta/0031_snapshot.json +6572 -0
  463. package/migrations/meta/0032_snapshot.json +6578 -0
  464. package/migrations/meta/0033_snapshot.json +6572 -0
  465. package/migrations/meta/0034_snapshot.json +6566 -0
  466. package/migrations/meta/0035_snapshot.json +6573 -0
  467. package/migrations/meta/0036_snapshot.json +6573 -0
  468. package/migrations/meta/_journal.json +91 -0
  469. package/package.json +2 -2
  470. package/src/lib/ids.ts +11 -0
  471. package/src/modules/activities/repository.ts +22 -23
  472. package/src/modules/activities/wording.ts +18 -0
  473. package/src/modules/agent-tasks/catalog.ts +63 -0
  474. package/src/modules/agent-tasks/resolve.ts +64 -24
  475. package/src/modules/attachedRecords.ts +29 -2
  476. package/src/modules/companies/index.ts +3 -1
  477. package/src/modules/companies/routes.ts +7 -0
  478. package/src/modules/companies/schema.ts +7 -1
  479. package/src/modules/companies/service.ts +48 -13
  480. package/src/modules/consent-purposes/capabilities.ts +12 -0
  481. package/src/modules/consent-purposes/events.ts +38 -0
  482. package/src/modules/consent-purposes/index.ts +48 -0
  483. package/src/modules/consent-purposes/repository.ts +163 -0
  484. package/src/modules/consent-purposes/routes.ts +122 -0
  485. package/src/modules/consent-purposes/schema.ts +46 -0
  486. package/src/modules/consent-purposes/service.ts +423 -0
  487. package/src/modules/consent-purposes/starters.ts +32 -0
  488. package/src/modules/consent-purposes/tools.ts +44 -0
  489. package/src/modules/core.ts +10 -0
  490. package/src/modules/custom-fields/capabilities.ts +17 -0
  491. package/src/modules/custom-fields/events.ts +51 -0
  492. package/src/modules/custom-fields/index.ts +61 -0
  493. package/src/modules/custom-fields/repository.ts +225 -0
  494. package/src/modules/custom-fields/routes.ts +155 -0
  495. package/src/modules/custom-fields/schema.ts +61 -0
  496. package/src/modules/custom-fields/service.ts +439 -0
  497. package/src/modules/custom-fields/tools.ts +53 -0
  498. package/src/modules/custom-fields/values.ts +352 -0
  499. package/src/modules/custom-fields/wire.ts +32 -0
  500. package/src/modules/dashboard/repository.ts +4 -3
  501. package/src/modules/deals/index.ts +5 -2
  502. package/src/modules/deals/repository.ts +6 -106
  503. package/src/modules/deals/routes.ts +7 -0
  504. package/src/modules/deals/schema.ts +7 -15
  505. package/src/modules/deals/service.ts +92 -23
  506. package/src/modules/decisions/repository.ts +2 -0
  507. package/src/modules/enquiries/events.ts +45 -0
  508. package/src/modules/enquiries/index.ts +50 -0
  509. package/src/modules/enquiries/repository.ts +164 -0
  510. package/src/modules/enquiries/routes.ts +172 -0
  511. package/src/modules/enquiries/schema.ts +59 -0
  512. package/src/modules/enquiries/service.ts +644 -0
  513. package/src/modules/enquiries/tools.ts +66 -0
  514. package/src/modules/eventCatalogs.ts +3 -0
  515. package/src/modules/forms/embed.ts +391 -44
  516. package/src/modules/forms/events.ts +30 -2
  517. package/src/modules/forms/fields.ts +102 -2
  518. package/src/modules/forms/index.ts +12 -1
  519. package/src/modules/forms/mapping.ts +183 -6
  520. package/src/modules/forms/publicRoutes.ts +43 -1
  521. package/src/modules/forms/repository.ts +162 -1
  522. package/src/modules/forms/routes.ts +212 -2
  523. package/src/modules/forms/schema.ts +166 -4
  524. package/src/modules/forms/service.ts +565 -41
  525. package/src/modules/forms/submission.ts +718 -44
  526. package/src/modules/import-export/drafts.ts +20 -1
  527. package/src/modules/import-export/exportRows.ts +21 -5
  528. package/src/modules/import-export/plan.ts +47 -2
  529. package/src/modules/import-export/presets.ts +10 -0
  530. package/src/modules/import-export/repository.ts +73 -8
  531. package/src/modules/import-export/routes.ts +4 -0
  532. package/src/modules/import-export/schema.ts +11 -0
  533. package/src/modules/import-export/service.ts +28 -2
  534. package/src/modules/import-export/streams.ts +3 -1
  535. package/src/modules/import-export/tools.ts +10 -0
  536. package/src/modules/import-export/validation.ts +28 -0
  537. package/src/modules/import-export/writes.ts +70 -5
  538. package/src/modules/lists/repository.ts +30 -0
  539. package/src/modules/lists/routes.ts +8 -0
  540. package/src/modules/lists/schema.ts +10 -0
  541. package/src/modules/lists/service.ts +110 -9
  542. package/src/modules/mcp/index.ts +5 -0
  543. package/src/modules/opportunities/index.ts +3 -1
  544. package/src/modules/opportunities/repository.ts +11 -0
  545. package/src/modules/opportunities/routes.ts +13 -0
  546. package/src/modules/opportunities/schema.ts +7 -1
  547. package/src/modules/opportunities/service.ts +188 -22
  548. package/src/modules/opportunities/tools.ts +2 -0
  549. package/src/modules/partnerships/index.ts +3 -1
  550. package/src/modules/partnerships/repository.ts +6 -117
  551. package/src/modules/partnerships/routes.ts +7 -0
  552. package/src/modules/partnerships/schema.ts +7 -14
  553. package/src/modules/partnerships/service.ts +93 -22
  554. package/src/modules/people/consentHydration.ts +167 -0
  555. package/src/modules/people/index.ts +3 -1
  556. package/src/modules/people/personConsentWrites.ts +177 -0
  557. package/src/modules/people/repository.ts +5 -0
  558. package/src/modules/people/routes.ts +127 -18
  559. package/src/modules/people/schema.ts +109 -3
  560. package/src/modules/people/service.ts +186 -40
  561. package/src/modules/people/tools.ts +5 -1
  562. package/src/modules/personLinks.ts +278 -0
  563. package/src/modules/raises/index.ts +3 -1
  564. package/src/modules/raises/repository.ts +6 -107
  565. package/src/modules/raises/routes.ts +7 -0
  566. package/src/modules/raises/schema.ts +7 -14
  567. package/src/modules/raises/service.ts +91 -20
  568. package/src/modules/recordTargets.ts +2 -0
  569. package/src/modules/references.ts +43 -4
  570. package/src/modules/sample-data/fixture.ts +63 -0
  571. package/src/modules/sample-data/index.ts +1 -0
  572. package/src/modules/sample-data/routes.ts +1 -0
  573. package/src/modules/sample-data/service.ts +97 -8
  574. package/src/modules/search/index.ts +2 -1
  575. package/src/modules/search/repository.ts +33 -1
  576. package/src/modules/search/service.ts +7 -5
  577. package/src/modules/stagedRecords.ts +18 -3
  578. package/src/modules/webhooks/payloads.ts +20 -2
  579. package/src/modules/workspace/repository.ts +12 -0
  580. package/src/modules/workspace/service.ts +14 -0
  581. package/src/modules/workspace/starters.ts +5 -0
  582. package/src/runtime/events.ts +1 -0
  583. package/src/schema/index.ts +3 -0
  584. package/src/testing/database.ts +97 -11
@@ -169,6 +169,97 @@
169
169
  "when": 1787651539093,
170
170
  "tag": "0023_funny_maddog",
171
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
172
263
  }
173
264
  ]
174
265
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kelpie/server",
3
- "version": "0.8.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,7 +52,7 @@
52
52
  },
53
53
  "dependencies": {
54
54
  "@hono/node-server": "^2.0.12",
55
- "@kelpie/schemas": "^0.8.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",
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',
@@ -30,7 +31,17 @@ export const idPrefixes = {
30
31
  activity: 'act',
31
32
  list: 'list',
32
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',
33
42
  handbookPage: 'hb',
43
+ customFieldDefinition: 'fld',
44
+ consentPurpose: 'cnp',
34
45
  form: 'form',
35
46
  formField: 'ff',
36
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',
@@ -6,18 +6,19 @@ import type { PgColumn, PgTable } from 'drizzle-orm/pg-core'
6
6
 
7
7
  import type { Queryable } from '../../runtime/transaction.ts'
8
8
  import { companies } from '../companies/schema.ts'
9
- import { dealPeople, deals } from '../deals/schema.ts'
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 { candidates, roles } from '../hiring/schema.ts'
13
14
  import { notes } from '../notes/schema.ts'
14
15
  import { opportunities } from '../opportunities/schema.ts'
15
- import { partnershipPeople, partnerships } from '../partnerships/schema.ts'
16
- import { people } from '../people/schema.ts'
16
+ import { partnerships } from '../partnerships/schema.ts'
17
+ import { people, personLinks } from '../people/schema.ts'
17
18
  import { pipelineStages } from '../pipelines/schema.ts'
18
19
  import { planItems } from '../plans/schema.ts'
19
20
  import { positions } from '../positions/schema.ts'
20
- import { raisePeople, raises } from '../raises/schema.ts'
21
+ import { raises } from '../raises/schema.ts'
21
22
  import { isRecordTargetType, resolveTargetNames, targetKey } from '../recordTargets.ts'
22
23
  import { workspaces } from '../workspace/schema.ts'
23
24
  import type { HandbookPageReference, PromptInputs, RelatedIdList, WorkspaceSignal } from './prompt.ts'
@@ -47,6 +48,7 @@ const DEEP_LINKS: Readonly<Partial<Record<AgentTaskTargetType, string>>> = {
47
48
  person: '/people',
48
49
  company: '/companies',
49
50
  deal: '/deals',
51
+ enquiry: '/enquiries',
50
52
  opportunity: '/opportunities',
51
53
  partnership: '/partnerships',
52
54
  raise: '/fundraising',
@@ -253,6 +255,33 @@ async function relatedFrom(
253
255
  return limitedIds(rows.map((row) => row.id))
254
256
  }
255
257
 
258
+ /**
259
+ * The people on one pipeline record, capped and truncation-aware. Uses
260
+ * `person_links` directly rather than the shared helper because it needs the
261
+ * limit + 1 semantics of `relatedFrom`.
262
+ */
263
+ async function personLinkIds(
264
+ db: Queryable,
265
+ workspaceId: string,
266
+ targetType: 'deal' | 'enquiry' | 'opportunity' | 'partnership' | 'raise',
267
+ targetId: string,
268
+ ): Promise<RelatedIdList> {
269
+ const rows = await db
270
+ .select({ id: personLinks.personId })
271
+ .from(personLinks)
272
+ .where(
273
+ and(
274
+ eq(personLinks.workspaceId, workspaceId),
275
+ eq(personLinks.targetType, targetType),
276
+ eq(personLinks.targetId, targetId),
277
+ ),
278
+ )
279
+ .orderBy(asc(personLinks.personId))
280
+ .limit(RELATED_ID_LIMIT + 1)
281
+
282
+ return limitedIds(rows.map((row) => row.id))
283
+ }
284
+
256
285
  /**
257
286
  * The related record ids `agent-tasks.md`'s context recipe names, per target
258
287
  * type: positions for a person, people on a deal, the company behind a raise,
@@ -297,6 +326,12 @@ async function collectRelated(
297
326
  deals.id,
298
327
  workspaceScoped(deals.workspaceId, deals.companyId),
299
328
  ),
329
+ enquiry_ids: await relatedFrom(
330
+ db,
331
+ enquiries,
332
+ enquiries.id,
333
+ workspaceScoped(enquiries.workspaceId, enquiries.companyId),
334
+ ),
300
335
  opportunity_ids: await relatedFrom(
301
336
  db,
302
337
  opportunities,
@@ -326,14 +361,7 @@ async function collectRelated(
326
361
 
327
362
  return {
328
363
  company_ids: wholeList(deal === undefined ? [] : [deal.companyId]),
329
- // The link table has no workspace column; the parent deal was already
330
- // resolved inside this workspace, which is what scopes the join.
331
- person_ids: await relatedFrom(
332
- db,
333
- dealPeople,
334
- dealPeople.personId,
335
- eq(dealPeople.dealId, targetId),
336
- ),
364
+ person_ids: await personLinkIds(db, workspaceId, 'deal', targetId),
337
365
  }
338
366
  }
339
367
 
@@ -349,6 +377,21 @@ async function collectRelated(
349
377
  ? []
350
378
  : [opportunity.companyId],
351
379
  ),
380
+ person_ids: await personLinkIds(db, workspaceId, 'opportunity', targetId),
381
+ }
382
+ }
383
+
384
+ case 'enquiry': {
385
+ const [enquiry] = await db
386
+ .select({ companyId: enquiries.companyId })
387
+ .from(enquiries)
388
+ .where(and(eq(enquiries.workspaceId, workspaceId), eq(enquiries.id, targetId)))
389
+
390
+ return {
391
+ company_ids: wholeList(
392
+ enquiry?.companyId === null || enquiry === undefined ? [] : [enquiry.companyId],
393
+ ),
394
+ person_ids: await personLinkIds(db, workspaceId, 'enquiry', targetId),
352
395
  }
353
396
  }
354
397
 
@@ -360,12 +403,7 @@ async function collectRelated(
360
403
 
361
404
  return {
362
405
  company_ids: wholeList(partnership === undefined ? [] : [partnership.companyId]),
363
- person_ids: await relatedFrom(
364
- db,
365
- partnershipPeople,
366
- partnershipPeople.personId,
367
- eq(partnershipPeople.partnershipId, targetId),
368
- ),
406
+ person_ids: await personLinkIds(db, workspaceId, 'partnership', targetId),
369
407
  }
370
408
  }
371
409
 
@@ -377,12 +415,7 @@ async function collectRelated(
377
415
 
378
416
  return {
379
417
  company_ids: wholeList(raise === undefined ? [] : [raise.companyId]),
380
- person_ids: await relatedFrom(
381
- db,
382
- raisePeople,
383
- raisePeople.personId,
384
- eq(raisePeople.raiseId, targetId),
385
- ),
418
+ person_ids: await personLinkIds(db, workspaceId, 'raise', targetId),
386
419
  }
387
420
  }
388
421
 
@@ -433,6 +466,13 @@ const SWEEP_TABLES = {
433
466
  stageId: deals.stageId,
434
467
  summary: deals.summary,
435
468
  },
469
+ enquiry: {
470
+ table: enquiries,
471
+ id: enquiries.id,
472
+ workspaceId: enquiries.workspaceId,
473
+ stageId: enquiries.stageId,
474
+ summary: enquiries.summary,
475
+ },
436
476
  opportunity: {
437
477
  table: opportunities,
438
478
  id: opportunities.id,
@@ -5,9 +5,11 @@ import { and, eq } from 'drizzle-orm'
5
5
  import type { Queryable } from '../runtime/transaction.ts'
6
6
  import * as activityRepository from './activities/repository.ts'
7
7
  import * as decisionRepository from './decisions/repository.ts'
8
+ import { formAttachTargets } from './forms/schema.ts'
8
9
  import { candidates } from './hiring/schema.ts'
9
10
  import * as listRepository from './lists/repository.ts'
10
11
  import * as noteRepository from './notes/repository.ts'
12
+ import * as personLinks from './personLinks.ts'
11
13
  import * as planRepository from './plans/repository.ts'
12
14
 
13
15
  /**
@@ -19,7 +21,12 @@ import * as planRepository from './plans/repository.ts'
19
21
  * record they described and reappear the day an id is reused.
20
22
  *
21
23
  * `plan_items` attach the same way but their check constraint allows only the
22
- * four pipeline types, so they are removed only for those targets.
24
+ * four pipeline types, so they are removed only for those targets. `person_links`
25
+ * follows the same rule: it holds a person's involvement in a pipeline record
26
+ * and its check constraint allows only the four pipeline types, so a deleted
27
+ * deal/opportunity/raise/partnership sheds its people here. `form_attach_targets`
28
+ * is the same shape: forms pinning submitters into a pre-existing pipeline
29
+ * record shed the mapping when the target goes.
23
30
  */
24
31
 
25
32
  /** Target types that can own attached records here. */
@@ -46,6 +53,26 @@ export async function deleteRecordsAttachedTo(
46
53
  const plans = PLAN_TARGET_TYPES.has(targetType)
47
54
  ? await planRepository.deleteForTarget(db, workspaceId, targetType, targetId)
48
55
  : 0
56
+ const links = PLAN_TARGET_TYPES.has(targetType)
57
+ ? await personLinks.deleteLinksForTarget(db, workspaceId, {
58
+ targetType: targetType as PipelineKind,
59
+ targetId,
60
+ })
61
+ : 0
62
+ const attachTargets = PLAN_TARGET_TYPES.has(targetType)
63
+ ? (
64
+ await db
65
+ .delete(formAttachTargets)
66
+ .where(
67
+ and(
68
+ eq(formAttachTargets.workspaceId, workspaceId),
69
+ eq(formAttachTargets.targetType, targetType),
70
+ eq(formAttachTargets.targetId, targetId),
71
+ ),
72
+ )
73
+ .returning({ formId: formAttachTargets.formId })
74
+ ).length
75
+ : 0
49
76
  const memberships = await listRepository.deleteMembershipsForTarget(
50
77
  db,
51
78
  workspaceId,
@@ -53,7 +80,7 @@ export async function deleteRecordsAttachedTo(
53
80
  targetId,
54
81
  )
55
82
 
56
- return notes + activities + decisions + plans + memberships
83
+ return notes + activities + decisions + plans + links + attachTargets + memberships
57
84
  }
58
85
 
59
86
  /**
@@ -1,5 +1,6 @@
1
1
  import type { KelpieModule } from '../../runtime/module.ts'
2
2
  import { createActivityRecorder } from '../activities/index.ts'
3
+ import { createCustomFieldValues } from '../custom-fields/index.ts'
3
4
  import { companiesEvents } from './events.ts'
4
5
  import { mountCompaniesRoutes } from './routes.ts'
5
6
  import * as schema from './schema.ts'
@@ -15,7 +16,7 @@ import { registerCompaniesTools } from './tools.ts'
15
16
  export function createCompaniesModule(migrationsDirectory: string): KelpieModule {
16
17
  return {
17
18
  id: 'companies',
18
- requires: ['workspace', 'activities'],
19
+ requires: ['workspace', 'activities', 'custom-fields'],
19
20
  structural: true,
20
21
  events: companiesEvents,
21
22
 
@@ -29,6 +30,7 @@ export function createCompaniesModule(migrationsDirectory: string): KelpieModule
29
30
  createId: context.createId,
30
31
  now: context.now,
31
32
  }),
33
+ customFields: createCustomFieldValues({ db: context.db }),
32
34
  })
33
35
 
34
36
  context.schema(schema, migrationsDirectory)
@@ -1,3 +1,4 @@
1
+ import { customFieldsPatchShape } from '@kelpie/schemas'
1
2
  import type { Context, Hono } from 'hono'
2
3
  import { z } from 'zod'
3
4
 
@@ -5,6 +6,7 @@ import { pageBody, readIdFilter, readJsonBody, readListParameters } from '../../
5
6
  import type { Actor } from '../auth/actor.ts'
6
7
  import { resolveActorFrom } from '../auth/credentials.ts'
7
8
  import type { CredentialDependencies } from '../auth/credentials.ts'
9
+ import { renderCustomFieldsForWire } from '../custom-fields/wire.ts'
8
10
  import { ACCOUNT_TYPES, COMPANY_STAGES, ICP_FITS, SIZE_BANDS } from './schema.ts'
9
11
  import type {
10
12
  CompaniesService,
@@ -31,6 +33,7 @@ const companyShape = {
31
33
  summary: z.string(),
32
34
  tags: z.array(z.string().min(1)),
33
35
  is_own: z.boolean(),
36
+ custom_fields: customFieldsPatchShape,
34
37
  }
35
38
 
36
39
  /**
@@ -53,6 +56,7 @@ export const createBody = z.strictObject({
53
56
  summary: companyShape.summary.default(''),
54
57
  tags: companyShape.tags.default([]),
55
58
  is_own: companyShape.is_own.default(false),
59
+ custom_fields: companyShape.custom_fields.default({}),
56
60
  })
57
61
 
58
62
  export const updateBody = z.strictObject(companyShape).partial()
@@ -77,6 +81,7 @@ export function toCreateInput(body: z.infer<typeof createBody>): CreateCompanyIn
77
81
  summary: body.summary,
78
82
  tags: body.tags,
79
83
  isOwn: body.is_own,
84
+ customFields: body.custom_fields,
80
85
  }
81
86
  }
82
87
 
@@ -96,6 +101,7 @@ export function toUpdateInput(body: z.infer<typeof updateBody>): UpdateCompanyIn
96
101
  ...(body.summary === undefined ? {} : { summary: body.summary }),
97
102
  ...(body.tags === undefined ? {} : { tags: body.tags }),
98
103
  ...(body.is_own === undefined ? {} : { isOwn: body.is_own }),
104
+ ...(body.custom_fields === undefined ? {} : { customFields: body.custom_fields }),
99
105
  }
100
106
  }
101
107
 
@@ -116,6 +122,7 @@ export function companyResponse(company: CompanyView): Record<string, unknown> {
116
122
  summary: company.summary,
117
123
  tags: company.tags,
118
124
  is_own: company.isOwn,
125
+ custom_fields: renderCustomFieldsForWire(company.customFields),
119
126
  created_at: company.createdAt.toISOString(),
120
127
  updated_at: company.updatedAt.toISOString(),
121
128
  }
@@ -1,5 +1,6 @@
1
1
  import { ACCOUNT_TYPES, COMPANY_STAGES, ICP_FITS, SIZE_BANDS } from '@kelpie/schemas'
2
- import { boolean, index, pgTable, text, unique } from 'drizzle-orm/pg-core'
2
+ import type { CustomFieldValue } from '@kelpie/schemas'
3
+ import { boolean, index, jsonb, pgTable, text, unique } from 'drizzle-orm/pg-core'
3
4
 
4
5
  import {
5
6
  checkOneOf,
@@ -46,6 +47,11 @@ export const companies = pgTable(
46
47
  // and subsidiary) so downstream views can distinguish self from prospects.
47
48
  // Loose semantics on purpose — zero or many rows may carry it.
48
49
  isOwn: boolean('is_own').notNull().default(false),
50
+ // Workspace-defined fields, keyed by definition key. See people/schema.ts.
51
+ customFields: jsonb('custom_fields')
52
+ .$type<Readonly<Record<string, CustomFieldValue>>>()
53
+ .notNull()
54
+ .default({}),
49
55
  createdAt: createdAt(),
50
56
  updatedAt: updatedAt(),
51
57
  searchVector: searchVector((): readonly SearchVectorPart[] => [