@kelpie/server 0.10.0 → 0.12.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 (485) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +2 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/index.d.ts +3 -3
  5. package/dist/index.d.ts.map +1 -1
  6. package/dist/index.js +1 -1
  7. package/dist/index.js.map +1 -1
  8. package/dist/lib/actor.d.ts +3 -1
  9. package/dist/lib/actor.d.ts.map +1 -1
  10. package/dist/lib/actor.js.map +1 -1
  11. package/dist/lib/apiKeyScopes.d.ts +8 -0
  12. package/dist/lib/apiKeyScopes.d.ts.map +1 -0
  13. package/dist/lib/apiKeyScopes.js +166 -0
  14. package/dist/lib/apiKeyScopes.js.map +1 -0
  15. package/dist/lib/errors.d.ts +18 -0
  16. package/dist/lib/errors.d.ts.map +1 -1
  17. package/dist/lib/errors.js +17 -0
  18. package/dist/lib/errors.js.map +1 -1
  19. package/dist/modules/activities/repository.d.ts +2 -0
  20. package/dist/modules/activities/repository.d.ts.map +1 -1
  21. package/dist/modules/activities/repository.js +9 -0
  22. package/dist/modules/activities/repository.js.map +1 -1
  23. package/dist/modules/agent-tasks/repository.d.ts +2 -0
  24. package/dist/modules/agent-tasks/repository.d.ts.map +1 -1
  25. package/dist/modules/agent-tasks/repository.js +9 -0
  26. package/dist/modules/agent-tasks/repository.js.map +1 -1
  27. package/dist/modules/api-keys/routes.d.ts.map +1 -1
  28. package/dist/modules/api-keys/routes.js +4 -1
  29. package/dist/modules/api-keys/routes.js.map +1 -1
  30. package/dist/modules/api-keys/schema.d.ts +43 -0
  31. package/dist/modules/api-keys/schema.d.ts.map +1 -1
  32. package/dist/modules/api-keys/schema.js +2 -0
  33. package/dist/modules/api-keys/schema.js.map +1 -1
  34. package/dist/modules/api-keys/scopeMiddleware.d.ts +8 -0
  35. package/dist/modules/api-keys/scopeMiddleware.d.ts.map +1 -0
  36. package/dist/modules/api-keys/scopeMiddleware.js +21 -0
  37. package/dist/modules/api-keys/scopeMiddleware.js.map +1 -0
  38. package/dist/modules/api-keys/service.d.ts +3 -1
  39. package/dist/modules/api-keys/service.d.ts.map +1 -1
  40. package/dist/modules/api-keys/service.js +26 -1
  41. package/dist/modules/api-keys/service.js.map +1 -1
  42. package/dist/modules/auth/credentials.d.ts.map +1 -1
  43. package/dist/modules/auth/credentials.js +2 -0
  44. package/dist/modules/auth/credentials.js.map +1 -1
  45. package/dist/modules/auth/index.d.ts.map +1 -1
  46. package/dist/modules/auth/index.js +21 -4
  47. package/dist/modules/auth/index.js.map +1 -1
  48. package/dist/modules/auth/repository.d.ts +2 -1
  49. package/dist/modules/auth/repository.d.ts.map +1 -1
  50. package/dist/modules/auth/repository.js +1 -0
  51. package/dist/modules/auth/repository.js.map +1 -1
  52. package/dist/modules/auth/routes.d.ts.map +1 -1
  53. package/dist/modules/auth/routes.js +2 -6
  54. package/dist/modules/auth/routes.js.map +1 -1
  55. package/dist/modules/auth/schema.d.ts +18 -1
  56. package/dist/modules/auth/schema.d.ts.map +1 -1
  57. package/dist/modules/auth/schema.js +12 -1
  58. package/dist/modules/auth/schema.js.map +1 -1
  59. package/dist/modules/auth/service.d.ts +18 -0
  60. package/dist/modules/auth/service.d.ts.map +1 -1
  61. package/dist/modules/auth/service.js +95 -6
  62. package/dist/modules/auth/service.js.map +1 -1
  63. package/dist/modules/auth/session.d.ts +12 -0
  64. package/dist/modules/auth/session.d.ts.map +1 -1
  65. package/dist/modules/auth/session.js +12 -0
  66. package/dist/modules/auth/session.js.map +1 -1
  67. package/dist/modules/consent-purposes/index.d.ts +1 -1
  68. package/dist/modules/consent-purposes/index.js +1 -1
  69. package/dist/modules/consent-purposes/schema.d.ts +3 -3
  70. package/dist/modules/consent-purposes/schema.js +3 -3
  71. package/dist/modules/consent-purposes/service.d.ts +1 -1
  72. package/dist/modules/consent-purposes/service.d.ts.map +1 -1
  73. package/dist/modules/consent-purposes/service.js +7 -16
  74. package/dist/modules/consent-purposes/service.js.map +1 -1
  75. package/dist/modules/consent-purposes/starters.d.ts +1 -1
  76. package/dist/modules/consent-purposes/tools.js +1 -1
  77. package/dist/modules/consent-purposes/tools.js.map +1 -1
  78. package/dist/modules/conversions/clearPointers.d.ts +10 -0
  79. package/dist/modules/conversions/clearPointers.d.ts.map +1 -0
  80. package/dist/modules/conversions/clearPointers.js +40 -0
  81. package/dist/modules/conversions/clearPointers.js.map +1 -0
  82. package/dist/modules/conversions/factory.d.ts +5 -0
  83. package/dist/modules/conversions/factory.d.ts.map +1 -0
  84. package/dist/modules/conversions/factory.js +18 -0
  85. package/dist/modules/conversions/factory.js.map +1 -0
  86. package/dist/modules/conversions/fieldMap.d.ts +55 -0
  87. package/dist/modules/conversions/fieldMap.d.ts.map +1 -0
  88. package/dist/modules/conversions/fieldMap.js +398 -0
  89. package/dist/modules/conversions/fieldMap.js.map +1 -0
  90. package/dist/modules/conversions/index.d.ts +7 -0
  91. package/dist/modules/conversions/index.d.ts.map +1 -0
  92. package/dist/modules/conversions/index.js +6 -0
  93. package/dist/modules/conversions/index.js.map +1 -0
  94. package/dist/modules/conversions/mcp.d.ts +7 -0
  95. package/dist/modules/conversions/mcp.d.ts.map +1 -0
  96. package/dist/modules/conversions/mcp.js +47 -0
  97. package/dist/modules/conversions/mcp.js.map +1 -0
  98. package/dist/modules/conversions/repoint.d.ts +19 -0
  99. package/dist/modules/conversions/repoint.d.ts.map +1 -0
  100. package/dist/modules/conversions/repoint.js +51 -0
  101. package/dist/modules/conversions/repoint.js.map +1 -0
  102. package/dist/modules/conversions/routes.d.ts +26 -0
  103. package/dist/modules/conversions/routes.d.ts.map +1 -0
  104. package/dist/modules/conversions/routes.js +23 -0
  105. package/dist/modules/conversions/routes.js.map +1 -0
  106. package/dist/modules/conversions/service.d.ts +28 -0
  107. package/dist/modules/conversions/service.d.ts.map +1 -0
  108. package/dist/modules/conversions/service.js +170 -0
  109. package/dist/modules/conversions/service.js.map +1 -0
  110. package/dist/modules/conversions/wire.d.ts +4 -0
  111. package/dist/modules/conversions/wire.d.ts.map +1 -0
  112. package/dist/modules/conversions/wire.js +28 -0
  113. package/dist/modules/conversions/wire.js.map +1 -0
  114. package/dist/modules/deals/events.d.ts +9 -0
  115. package/dist/modules/deals/events.d.ts.map +1 -1
  116. package/dist/modules/deals/events.js +4 -0
  117. package/dist/modules/deals/events.js.map +1 -1
  118. package/dist/modules/deals/index.d.ts.map +1 -1
  119. package/dist/modules/deals/index.js +4 -2
  120. package/dist/modules/deals/index.js.map +1 -1
  121. package/dist/modules/deals/routes.d.ts +2 -0
  122. package/dist/modules/deals/routes.d.ts.map +1 -1
  123. package/dist/modules/deals/routes.js +8 -1
  124. package/dist/modules/deals/routes.js.map +1 -1
  125. package/dist/modules/deals/schema.d.ts +34 -0
  126. package/dist/modules/deals/schema.d.ts.map +1 -1
  127. package/dist/modules/deals/schema.js +7 -2
  128. package/dist/modules/deals/schema.js.map +1 -1
  129. package/dist/modules/deals/service.d.ts.map +1 -1
  130. package/dist/modules/deals/service.js +2 -0
  131. package/dist/modules/deals/service.js.map +1 -1
  132. package/dist/modules/deals/tools.d.ts +2 -1
  133. package/dist/modules/deals/tools.d.ts.map +1 -1
  134. package/dist/modules/deals/tools.js +3 -1
  135. package/dist/modules/deals/tools.js.map +1 -1
  136. package/dist/modules/decisions/repository.d.ts +2 -1
  137. package/dist/modules/decisions/repository.d.ts.map +1 -1
  138. package/dist/modules/decisions/repository.js +9 -1
  139. package/dist/modules/decisions/repository.js.map +1 -1
  140. package/dist/modules/enquiries/events.d.ts +6 -2
  141. package/dist/modules/enquiries/events.d.ts.map +1 -1
  142. package/dist/modules/enquiries/events.js +5 -1
  143. package/dist/modules/enquiries/events.js.map +1 -1
  144. package/dist/modules/enquiries/index.d.ts.map +1 -1
  145. package/dist/modules/enquiries/index.js +4 -2
  146. package/dist/modules/enquiries/index.js.map +1 -1
  147. package/dist/modules/enquiries/routes.d.ts +2 -0
  148. package/dist/modules/enquiries/routes.d.ts.map +1 -1
  149. package/dist/modules/enquiries/routes.js +9 -9
  150. package/dist/modules/enquiries/routes.js.map +1 -1
  151. package/dist/modules/enquiries/schema.d.ts +36 -1
  152. package/dist/modules/enquiries/schema.d.ts.map +1 -1
  153. package/dist/modules/enquiries/schema.js +9 -3
  154. package/dist/modules/enquiries/schema.js.map +1 -1
  155. package/dist/modules/enquiries/service.d.ts +0 -8
  156. package/dist/modules/enquiries/service.d.ts.map +1 -1
  157. package/dist/modules/enquiries/service.js +3 -95
  158. package/dist/modules/enquiries/service.js.map +1 -1
  159. package/dist/modules/enquiries/tools.d.ts +2 -1
  160. package/dist/modules/enquiries/tools.d.ts.map +1 -1
  161. package/dist/modules/enquiries/tools.js +4 -16
  162. package/dist/modules/enquiries/tools.js.map +1 -1
  163. package/dist/modules/forms/applyMappedFields.d.ts +20 -0
  164. package/dist/modules/forms/applyMappedFields.d.ts.map +1 -0
  165. package/dist/modules/forms/applyMappedFields.js +169 -0
  166. package/dist/modules/forms/applyMappedFields.js.map +1 -0
  167. package/dist/modules/forms/applySubmissionFields.d.ts +18 -0
  168. package/dist/modules/forms/applySubmissionFields.d.ts.map +1 -0
  169. package/dist/modules/forms/applySubmissionFields.js +230 -0
  170. package/dist/modules/forms/applySubmissionFields.js.map +1 -0
  171. package/dist/modules/forms/fields.d.ts +7 -2
  172. package/dist/modules/forms/fields.d.ts.map +1 -1
  173. package/dist/modules/forms/fields.js +17 -6
  174. package/dist/modules/forms/fields.js.map +1 -1
  175. package/dist/modules/forms/mapping.d.ts +8 -2
  176. package/dist/modules/forms/mapping.d.ts.map +1 -1
  177. package/dist/modules/forms/mapping.js +11 -0
  178. package/dist/modules/forms/mapping.js.map +1 -1
  179. package/dist/modules/forms/repository.d.ts +0 -5
  180. package/dist/modules/forms/repository.d.ts.map +1 -1
  181. package/dist/modules/forms/repository.js +0 -2
  182. package/dist/modules/forms/repository.js.map +1 -1
  183. package/dist/modules/forms/routes.d.ts +2 -30
  184. package/dist/modules/forms/routes.d.ts.map +1 -1
  185. package/dist/modules/forms/routes.js +2 -2
  186. package/dist/modules/forms/routes.js.map +1 -1
  187. package/dist/modules/forms/schema.d.ts.map +1 -1
  188. package/dist/modules/forms/schema.js +1 -2
  189. package/dist/modules/forms/schema.js.map +1 -1
  190. package/dist/modules/forms/service.d.ts.map +1 -1
  191. package/dist/modules/forms/service.js +18 -3
  192. package/dist/modules/forms/service.js.map +1 -1
  193. package/dist/modules/forms/starters.d.ts +31 -0
  194. package/dist/modules/forms/starters.d.ts.map +1 -0
  195. package/dist/modules/forms/starters.js +94 -0
  196. package/dist/modules/forms/starters.js.map +1 -0
  197. package/dist/modules/forms/submission.d.ts +1 -0
  198. package/dist/modules/forms/submission.d.ts.map +1 -1
  199. package/dist/modules/forms/submission.js +58 -37
  200. package/dist/modules/forms/submission.js.map +1 -1
  201. package/dist/modules/import-export/customFieldCsv.d.ts +9 -0
  202. package/dist/modules/import-export/customFieldCsv.d.ts.map +1 -0
  203. package/dist/modules/import-export/customFieldCsv.js +39 -0
  204. package/dist/modules/import-export/customFieldCsv.js.map +1 -0
  205. package/dist/modules/import-export/customFieldImport.d.ts +19 -0
  206. package/dist/modules/import-export/customFieldImport.d.ts.map +1 -0
  207. package/dist/modules/import-export/customFieldImport.js +76 -0
  208. package/dist/modules/import-export/customFieldImport.js.map +1 -0
  209. package/dist/modules/import-export/drafts.d.ts +57 -3
  210. package/dist/modules/import-export/drafts.d.ts.map +1 -1
  211. package/dist/modules/import-export/drafts.js +65 -3
  212. package/dist/modules/import-export/drafts.js.map +1 -1
  213. package/dist/modules/import-export/exportRows.d.ts +15 -13
  214. package/dist/modules/import-export/exportRows.d.ts.map +1 -1
  215. package/dist/modules/import-export/exportRows.js +99 -26
  216. package/dist/modules/import-export/exportRows.js.map +1 -1
  217. package/dist/modules/import-export/plan.d.ts +42 -11
  218. package/dist/modules/import-export/plan.d.ts.map +1 -1
  219. package/dist/modules/import-export/plan.js +198 -56
  220. package/dist/modules/import-export/plan.js.map +1 -1
  221. package/dist/modules/import-export/repository.d.ts +58 -2
  222. package/dist/modules/import-export/repository.d.ts.map +1 -1
  223. package/dist/modules/import-export/repository.js +201 -12
  224. package/dist/modules/import-export/repository.js.map +1 -1
  225. package/dist/modules/import-export/routes.d.ts.map +1 -1
  226. package/dist/modules/import-export/routes.js +5 -5
  227. package/dist/modules/import-export/routes.js.map +1 -1
  228. package/dist/modules/import-export/service.d.ts +8 -3
  229. package/dist/modules/import-export/service.d.ts.map +1 -1
  230. package/dist/modules/import-export/service.js +133 -40
  231. package/dist/modules/import-export/service.js.map +1 -1
  232. package/dist/modules/import-export/streams.d.ts +2 -2
  233. package/dist/modules/import-export/streams.d.ts.map +1 -1
  234. package/dist/modules/import-export/streams.js +50 -9
  235. package/dist/modules/import-export/streams.js.map +1 -1
  236. package/dist/modules/import-export/tools.d.ts.map +1 -1
  237. package/dist/modules/import-export/tools.js +13 -7
  238. package/dist/modules/import-export/tools.js.map +1 -1
  239. package/dist/modules/import-export/validation.d.ts +5 -1
  240. package/dist/modules/import-export/validation.d.ts.map +1 -1
  241. package/dist/modules/import-export/validation.js +89 -2
  242. package/dist/modules/import-export/validation.js.map +1 -1
  243. package/dist/modules/import-export/writes.d.ts +2 -1
  244. package/dist/modules/import-export/writes.d.ts.map +1 -1
  245. package/dist/modules/import-export/writes.js +358 -25
  246. package/dist/modules/import-export/writes.js.map +1 -1
  247. package/dist/modules/lists/repository.d.ts +0 -1
  248. package/dist/modules/lists/repository.d.ts.map +1 -1
  249. package/dist/modules/lists/repository.js +0 -1
  250. package/dist/modules/lists/repository.js.map +1 -1
  251. package/dist/modules/lists/routes.d.ts +0 -2
  252. package/dist/modules/lists/routes.d.ts.map +1 -1
  253. package/dist/modules/lists/routes.js +0 -8
  254. package/dist/modules/lists/routes.js.map +1 -1
  255. package/dist/modules/lists/schema.d.ts +0 -17
  256. package/dist/modules/lists/schema.d.ts.map +1 -1
  257. package/dist/modules/lists/schema.js +0 -10
  258. package/dist/modules/lists/schema.js.map +1 -1
  259. package/dist/modules/lists/service.d.ts +2 -14
  260. package/dist/modules/lists/service.d.ts.map +1 -1
  261. package/dist/modules/lists/service.js +7 -53
  262. package/dist/modules/lists/service.js.map +1 -1
  263. package/dist/modules/lists/starters.d.ts +12 -0
  264. package/dist/modules/lists/starters.d.ts.map +1 -0
  265. package/dist/modules/lists/starters.js +4 -0
  266. package/dist/modules/lists/starters.js.map +1 -0
  267. package/dist/modules/mcp/protocol.d.ts.map +1 -1
  268. package/dist/modules/mcp/protocol.js +13 -0
  269. package/dist/modules/mcp/protocol.js.map +1 -1
  270. package/dist/modules/notes/repository.d.ts +2 -0
  271. package/dist/modules/notes/repository.d.ts.map +1 -1
  272. package/dist/modules/notes/repository.js +9 -0
  273. package/dist/modules/notes/repository.js.map +1 -1
  274. package/dist/modules/opportunities/events.d.ts +9 -0
  275. package/dist/modules/opportunities/events.d.ts.map +1 -1
  276. package/dist/modules/opportunities/events.js +4 -0
  277. package/dist/modules/opportunities/events.js.map +1 -1
  278. package/dist/modules/opportunities/index.d.ts.map +1 -1
  279. package/dist/modules/opportunities/index.js +4 -2
  280. package/dist/modules/opportunities/index.js.map +1 -1
  281. package/dist/modules/opportunities/routes.d.ts +2 -0
  282. package/dist/modules/opportunities/routes.d.ts.map +1 -1
  283. package/dist/modules/opportunities/routes.js +8 -1
  284. package/dist/modules/opportunities/routes.js.map +1 -1
  285. package/dist/modules/opportunities/schema.d.ts +34 -0
  286. package/dist/modules/opportunities/schema.d.ts.map +1 -1
  287. package/dist/modules/opportunities/schema.js +7 -2
  288. package/dist/modules/opportunities/schema.js.map +1 -1
  289. package/dist/modules/opportunities/service.d.ts.map +1 -1
  290. package/dist/modules/opportunities/service.js +2 -0
  291. package/dist/modules/opportunities/service.js.map +1 -1
  292. package/dist/modules/opportunities/tools.d.ts +2 -1
  293. package/dist/modules/opportunities/tools.d.ts.map +1 -1
  294. package/dist/modules/opportunities/tools.js +3 -1
  295. package/dist/modules/opportunities/tools.js.map +1 -1
  296. package/dist/modules/partnerships/events.d.ts +9 -0
  297. package/dist/modules/partnerships/events.d.ts.map +1 -1
  298. package/dist/modules/partnerships/events.js +4 -0
  299. package/dist/modules/partnerships/events.js.map +1 -1
  300. package/dist/modules/partnerships/index.d.ts.map +1 -1
  301. package/dist/modules/partnerships/index.js +4 -2
  302. package/dist/modules/partnerships/index.js.map +1 -1
  303. package/dist/modules/partnerships/routes.d.ts +2 -0
  304. package/dist/modules/partnerships/routes.d.ts.map +1 -1
  305. package/dist/modules/partnerships/routes.js +8 -1
  306. package/dist/modules/partnerships/routes.js.map +1 -1
  307. package/dist/modules/partnerships/schema.d.ts +34 -0
  308. package/dist/modules/partnerships/schema.d.ts.map +1 -1
  309. package/dist/modules/partnerships/schema.js +7 -2
  310. package/dist/modules/partnerships/schema.js.map +1 -1
  311. package/dist/modules/partnerships/service.d.ts.map +1 -1
  312. package/dist/modules/partnerships/service.js +2 -0
  313. package/dist/modules/partnerships/service.js.map +1 -1
  314. package/dist/modules/partnerships/tools.d.ts +2 -1
  315. package/dist/modules/partnerships/tools.d.ts.map +1 -1
  316. package/dist/modules/partnerships/tools.js +3 -1
  317. package/dist/modules/partnerships/tools.js.map +1 -1
  318. package/dist/modules/people/personConsentWrites.d.ts +1 -1
  319. package/dist/modules/people/schema.js +1 -1
  320. package/dist/modules/people/schema.js.map +1 -1
  321. package/dist/modules/plans/repository.d.ts +2 -0
  322. package/dist/modules/plans/repository.d.ts.map +1 -1
  323. package/dist/modules/plans/repository.js +9 -0
  324. package/dist/modules/plans/repository.js.map +1 -1
  325. package/dist/modules/raises/events.d.ts +9 -0
  326. package/dist/modules/raises/events.d.ts.map +1 -1
  327. package/dist/modules/raises/events.js +4 -0
  328. package/dist/modules/raises/events.js.map +1 -1
  329. package/dist/modules/raises/index.d.ts.map +1 -1
  330. package/dist/modules/raises/index.js +4 -2
  331. package/dist/modules/raises/index.js.map +1 -1
  332. package/dist/modules/raises/routes.d.ts +2 -0
  333. package/dist/modules/raises/routes.d.ts.map +1 -1
  334. package/dist/modules/raises/routes.js +8 -1
  335. package/dist/modules/raises/routes.js.map +1 -1
  336. package/dist/modules/raises/schema.d.ts +34 -0
  337. package/dist/modules/raises/schema.d.ts.map +1 -1
  338. package/dist/modules/raises/schema.js +7 -2
  339. package/dist/modules/raises/schema.js.map +1 -1
  340. package/dist/modules/raises/service.d.ts.map +1 -1
  341. package/dist/modules/raises/service.js +2 -0
  342. package/dist/modules/raises/service.js.map +1 -1
  343. package/dist/modules/raises/tools.d.ts +2 -1
  344. package/dist/modules/raises/tools.d.ts.map +1 -1
  345. package/dist/modules/raises/tools.js +3 -1
  346. package/dist/modules/raises/tools.js.map +1 -1
  347. package/dist/modules/workspace/routes.d.ts +0 -2
  348. package/dist/modules/workspace/routes.d.ts.map +1 -1
  349. package/dist/modules/workspace/routes.js +0 -6
  350. package/dist/modules/workspace/routes.js.map +1 -1
  351. package/dist/modules/workspace/schema.d.ts +0 -34
  352. package/dist/modules/workspace/schema.d.ts.map +1 -1
  353. package/dist/modules/workspace/schema.js +0 -2
  354. package/dist/modules/workspace/schema.js.map +1 -1
  355. package/dist/modules/workspace/seedStarterForms.d.ts +17 -0
  356. package/dist/modules/workspace/seedStarterForms.d.ts.map +1 -0
  357. package/dist/modules/workspace/seedStarterForms.js +71 -0
  358. package/dist/modules/workspace/seedStarterForms.js.map +1 -0
  359. package/dist/modules/workspace/service.d.ts +0 -4
  360. package/dist/modules/workspace/service.d.ts.map +1 -1
  361. package/dist/modules/workspace/service.js +20 -10
  362. package/dist/modules/workspace/service.js.map +1 -1
  363. package/dist/modules/workspace/tools.js +1 -1
  364. package/dist/modules/workspace/tools.js.map +1 -1
  365. package/dist/runtime/module.d.ts +63 -1
  366. package/dist/runtime/module.d.ts.map +1 -1
  367. package/dist/runtime/registry.d.ts.map +1 -1
  368. package/dist/runtime/registry.js +40 -2
  369. package/dist/runtime/registry.js.map +1 -1
  370. package/dist/testing/fixtures.d.ts.map +1 -1
  371. package/dist/testing/fixtures.js +1 -0
  372. package/dist/testing/fixtures.js.map +1 -1
  373. package/migrations/0037_drop_lists_consent_purpose_id.sql +2 -0
  374. package/migrations/0038_smart_white_queen.sql +2 -0
  375. package/migrations/0039_form_map_to_open.sql +1 -0
  376. package/migrations/0040_pipeline_converted_to.sql +20 -0
  377. package/migrations/0041_api_key_scopes.sql +1 -0
  378. package/migrations/0042_drop_workspace_identity.sql +2 -0
  379. package/migrations/0043_external_sign_in.sql +2 -0
  380. package/migrations/meta/0038_snapshot.json +6554 -0
  381. package/migrations/meta/_journal.json +49 -0
  382. package/package.json +2 -2
  383. package/src/app.ts +3 -0
  384. package/src/index.ts +13 -1
  385. package/src/lib/actor.ts +3 -1
  386. package/src/lib/apiKeyScopes.ts +213 -0
  387. package/src/lib/errors.ts +30 -0
  388. package/src/modules/activities/repository.ts +24 -0
  389. package/src/modules/agent-tasks/repository.ts +24 -0
  390. package/src/modules/api-keys/routes.ts +5 -0
  391. package/src/modules/api-keys/schema.ts +2 -0
  392. package/src/modules/api-keys/scopeMiddleware.ts +30 -0
  393. package/src/modules/api-keys/service.ts +36 -2
  394. package/src/modules/auth/credentials.ts +4 -0
  395. package/src/modules/auth/index.ts +25 -4
  396. package/src/modules/auth/repository.ts +2 -1
  397. package/src/modules/auth/routes.ts +2 -8
  398. package/src/modules/auth/schema.ts +12 -1
  399. package/src/modules/auth/service.ts +143 -6
  400. package/src/modules/auth/session.ts +14 -0
  401. package/src/modules/consent-purposes/index.ts +1 -1
  402. package/src/modules/consent-purposes/schema.ts +3 -3
  403. package/src/modules/consent-purposes/service.ts +7 -16
  404. package/src/modules/consent-purposes/starters.ts +1 -1
  405. package/src/modules/consent-purposes/tools.ts +1 -1
  406. package/src/modules/conversions/clearPointers.ts +81 -0
  407. package/src/modules/conversions/factory.ts +20 -0
  408. package/src/modules/conversions/fieldMap.ts +548 -0
  409. package/src/modules/conversions/index.ts +6 -0
  410. package/src/modules/conversions/mcp.ts +71 -0
  411. package/src/modules/conversions/repoint.ts +146 -0
  412. package/src/modules/conversions/routes.ts +68 -0
  413. package/src/modules/conversions/service.ts +310 -0
  414. package/src/modules/conversions/wire.ts +42 -0
  415. package/src/modules/deals/events.ts +9 -0
  416. package/src/modules/deals/index.ts +4 -2
  417. package/src/modules/deals/routes.ts +11 -1
  418. package/src/modules/deals/schema.ts +10 -2
  419. package/src/modules/deals/service.ts +3 -0
  420. package/src/modules/deals/tools.ts +9 -1
  421. package/src/modules/decisions/repository.ts +23 -1
  422. package/src/modules/enquiries/events.ts +8 -2
  423. package/src/modules/enquiries/index.ts +4 -2
  424. package/src/modules/enquiries/routes.ts +11 -13
  425. package/src/modules/enquiries/schema.ts +12 -3
  426. package/src/modules/enquiries/service.ts +3 -150
  427. package/src/modules/enquiries/tools.ts +9 -18
  428. package/src/modules/forms/applyMappedFields.ts +248 -0
  429. package/src/modules/forms/applySubmissionFields.ts +435 -0
  430. package/src/modules/forms/fields.ts +31 -7
  431. package/src/modules/forms/mapping.ts +20 -3
  432. package/src/modules/forms/repository.ts +0 -7
  433. package/src/modules/forms/routes.ts +1 -2
  434. package/src/modules/forms/schema.ts +0 -2
  435. package/src/modules/forms/service.ts +31 -4
  436. package/src/modules/forms/starters.ts +129 -0
  437. package/src/modules/forms/submission.ts +135 -69
  438. package/src/modules/import-export/customFieldCsv.ts +55 -0
  439. package/src/modules/import-export/customFieldImport.ts +111 -0
  440. package/src/modules/import-export/drafts.ts +151 -3
  441. package/src/modules/import-export/exportRows.ts +222 -68
  442. package/src/modules/import-export/plan.ts +321 -67
  443. package/src/modules/import-export/repository.ts +356 -14
  444. package/src/modules/import-export/routes.ts +8 -8
  445. package/src/modules/import-export/service.ts +208 -45
  446. package/src/modules/import-export/streams.ts +95 -13
  447. package/src/modules/import-export/tools.ts +14 -6
  448. package/src/modules/import-export/validation.ts +128 -0
  449. package/src/modules/import-export/writes.ts +559 -27
  450. package/src/modules/lists/repository.ts +0 -2
  451. package/src/modules/lists/routes.ts +0 -8
  452. package/src/modules/lists/schema.ts +0 -10
  453. package/src/modules/lists/service.ts +9 -107
  454. package/src/modules/lists/starters.ts +16 -0
  455. package/src/modules/mcp/protocol.ts +18 -0
  456. package/src/modules/notes/repository.ts +24 -0
  457. package/src/modules/opportunities/events.ts +9 -0
  458. package/src/modules/opportunities/index.ts +4 -2
  459. package/src/modules/opportunities/routes.ts +11 -1
  460. package/src/modules/opportunities/schema.ts +10 -2
  461. package/src/modules/opportunities/service.ts +3 -0
  462. package/src/modules/opportunities/tools.ts +9 -1
  463. package/src/modules/partnerships/events.ts +9 -0
  464. package/src/modules/partnerships/index.ts +4 -2
  465. package/src/modules/partnerships/routes.ts +11 -1
  466. package/src/modules/partnerships/schema.ts +10 -2
  467. package/src/modules/partnerships/service.ts +3 -0
  468. package/src/modules/partnerships/tools.ts +9 -1
  469. package/src/modules/people/personConsentWrites.ts +1 -1
  470. package/src/modules/people/schema.ts +1 -1
  471. package/src/modules/plans/repository.ts +24 -0
  472. package/src/modules/raises/events.ts +9 -0
  473. package/src/modules/raises/index.ts +4 -2
  474. package/src/modules/raises/routes.ts +11 -1
  475. package/src/modules/raises/schema.ts +10 -2
  476. package/src/modules/raises/service.ts +3 -0
  477. package/src/modules/raises/tools.ts +9 -1
  478. package/src/modules/workspace/routes.ts +0 -6
  479. package/src/modules/workspace/schema.ts +0 -2
  480. package/src/modules/workspace/seedStarterForms.ts +98 -0
  481. package/src/modules/workspace/service.ts +23 -15
  482. package/src/modules/workspace/tools.ts +1 -1
  483. package/src/runtime/module.ts +70 -1
  484. package/src/runtime/registry.ts +54 -0
  485. package/src/testing/fixtures.ts +1 -0
@@ -0,0 +1,548 @@
1
+ import type { CustomFieldValue, CustomFieldWireValue, PipelineKind } from '@kelpie/schemas'
2
+ import { PIPELINE_KIND_LABELS } from '@kelpie/schemas'
3
+ import type { ConvertPipelineRecordInput } from '@kelpie/schemas'
4
+
5
+ import { AppError } from '../../lib/errors.ts'
6
+ import type { CustomFieldValuesValidator } from '../custom-fields/values.ts'
7
+ import * as dealRepository from '../deals/repository.ts'
8
+ import type { DealRecord } from '../deals/repository.ts'
9
+ import * as enquiryRepository from '../enquiries/repository.ts'
10
+ import type { EnquiryRecord } from '../enquiries/repository.ts'
11
+ import * as opportunityRepository from '../opportunities/repository.ts'
12
+ import type { OpportunityRecord } from '../opportunities/repository.ts'
13
+ import * as partnershipRepository from '../partnerships/repository.ts'
14
+ import type { PartnershipRecord } from '../partnerships/repository.ts'
15
+ import * as raiseRepository from '../raises/repository.ts'
16
+ import type { RaiseRecord } from '../raises/repository.ts'
17
+ import { definitionsForObject } from '../custom-fields/repository.ts'
18
+
19
+ /** Shared scalar fields every pipeline record carries. */
20
+ export interface PipelineSnapshot {
21
+ readonly kind: PipelineKind
22
+ readonly id: string
23
+ readonly name: string
24
+ readonly companyId: string | null
25
+ readonly ownerId: string | null
26
+ readonly summary: string
27
+ readonly tags: readonly string[]
28
+ readonly customFields: Readonly<Record<string, CustomFieldValue>>
29
+ readonly stageId: string
30
+ readonly convertedTargetType: string | null
31
+ readonly convertedTargetId: string | null
32
+ readonly convertedDealId: string | null
33
+ readonly source: string | null
34
+ readonly kindField: string | null
35
+ readonly expectedClose: string | null
36
+ readonly nextTouchpoint: string | null
37
+ readonly valueCents: number | null
38
+ readonly currency: string | null
39
+ readonly checkSizeCents: number | null
40
+ }
41
+
42
+ const COMPANY_REQUIRED_TARGETS = new Set<PipelineKind>(['deal', 'raise', 'partnership'])
43
+
44
+ export function objectLabelFor(kind: PipelineKind): string {
45
+ return PIPELINE_KIND_LABELS[kind]
46
+ }
47
+
48
+ export async function loadPipelineSnapshot(
49
+ db: Parameters<CustomFieldValuesValidator['forCreate']>[0],
50
+ workspaceId: string,
51
+ kind: PipelineKind,
52
+ id: string,
53
+ ): Promise<PipelineSnapshot | undefined> {
54
+ switch (kind) {
55
+ case 'enquiry': {
56
+ const row = await enquiryRepository.findEnquiry(db, workspaceId, id)
57
+
58
+ if (row === undefined) {
59
+ return undefined
60
+ }
61
+
62
+ return snapshotFromEnquiry(row)
63
+ }
64
+ case 'deal': {
65
+ const row = await dealRepository.findDeal(db, workspaceId, id)
66
+
67
+ if (row === undefined) {
68
+ return undefined
69
+ }
70
+
71
+ return snapshotFromDeal(row)
72
+ }
73
+ case 'opportunity': {
74
+ const row = await opportunityRepository.findOpportunity(db, workspaceId, id)
75
+
76
+ if (row === undefined) {
77
+ return undefined
78
+ }
79
+
80
+ return snapshotFromOpportunity(row)
81
+ }
82
+ case 'raise': {
83
+ const row = await raiseRepository.findRaise(db, workspaceId, id)
84
+
85
+ if (row === undefined) {
86
+ return undefined
87
+ }
88
+
89
+ return snapshotFromRaise(row)
90
+ }
91
+ case 'partnership': {
92
+ const row = await partnershipRepository.findPartnership(db, workspaceId, id)
93
+
94
+ if (row === undefined) {
95
+ return undefined
96
+ }
97
+
98
+ return snapshotFromPartnership(row)
99
+ }
100
+ }
101
+ }
102
+
103
+ function snapshotFromEnquiry(row: EnquiryRecord): PipelineSnapshot {
104
+ return {
105
+ kind: 'enquiry',
106
+ id: row.id,
107
+ name: row.name,
108
+ companyId: row.companyId,
109
+ ownerId: row.ownerId,
110
+ summary: row.summary,
111
+ tags: row.tags,
112
+ customFields: row.customFields,
113
+ stageId: row.stageId,
114
+ convertedTargetType: row.convertedTargetType,
115
+ convertedTargetId: row.convertedTargetId,
116
+ convertedDealId: row.convertedDealId,
117
+ source: row.source,
118
+ kindField: null,
119
+ expectedClose: null,
120
+ nextTouchpoint: null,
121
+ valueCents: null,
122
+ currency: null,
123
+ checkSizeCents: null,
124
+ }
125
+ }
126
+
127
+ function snapshotFromDeal(row: DealRecord): PipelineSnapshot {
128
+ return {
129
+ kind: 'deal',
130
+ id: row.id,
131
+ name: row.name,
132
+ companyId: row.companyId,
133
+ ownerId: row.ownerId,
134
+ summary: row.summary,
135
+ tags: row.tags,
136
+ customFields: row.customFields,
137
+ stageId: row.stageId,
138
+ convertedTargetType: row.convertedTargetType,
139
+ convertedTargetId: row.convertedTargetId,
140
+ convertedDealId: null,
141
+ source: null,
142
+ kindField: null,
143
+ expectedClose: row.expectedClose,
144
+ nextTouchpoint: null,
145
+ valueCents: row.valueCents,
146
+ currency: row.currency,
147
+ checkSizeCents: null,
148
+ }
149
+ }
150
+
151
+ function snapshotFromOpportunity(row: OpportunityRecord): PipelineSnapshot {
152
+ return {
153
+ kind: 'opportunity',
154
+ id: row.id,
155
+ name: row.name,
156
+ companyId: row.companyId,
157
+ ownerId: row.ownerId,
158
+ summary: row.summary,
159
+ tags: row.tags,
160
+ customFields: row.customFields,
161
+ stageId: row.stageId,
162
+ convertedTargetType: row.convertedTargetType,
163
+ convertedTargetId: row.convertedTargetId,
164
+ convertedDealId: null,
165
+ source: null,
166
+ kindField: row.kind,
167
+ expectedClose: row.expectedClose,
168
+ nextTouchpoint: null,
169
+ valueCents: null,
170
+ currency: null,
171
+ checkSizeCents: null,
172
+ }
173
+ }
174
+
175
+ function snapshotFromRaise(row: RaiseRecord): PipelineSnapshot {
176
+ return {
177
+ kind: 'raise',
178
+ id: row.id,
179
+ name: row.name,
180
+ companyId: row.companyId,
181
+ ownerId: row.ownerId,
182
+ summary: row.summary,
183
+ tags: row.tags,
184
+ customFields: row.customFields,
185
+ stageId: row.stageId,
186
+ convertedTargetType: row.convertedTargetType,
187
+ convertedTargetId: row.convertedTargetId,
188
+ convertedDealId: null,
189
+ source: null,
190
+ kindField: null,
191
+ expectedClose: row.expectedClose,
192
+ nextTouchpoint: null,
193
+ valueCents: null,
194
+ currency: row.currency,
195
+ checkSizeCents: row.checkSizeCents,
196
+ }
197
+ }
198
+
199
+ function snapshotFromPartnership(row: PartnershipRecord): PipelineSnapshot {
200
+ return {
201
+ kind: 'partnership',
202
+ id: row.id,
203
+ name: row.name,
204
+ companyId: row.companyId,
205
+ ownerId: row.ownerId,
206
+ summary: row.summary,
207
+ tags: row.tags,
208
+ customFields: row.customFields,
209
+ stageId: row.stageId,
210
+ convertedTargetType: row.convertedTargetType,
211
+ convertedTargetId: row.convertedTargetId,
212
+ convertedDealId: null,
213
+ source: null,
214
+ kindField: row.kind,
215
+ expectedClose: null,
216
+ nextTouchpoint: row.nextTouchpoint,
217
+ valueCents: null,
218
+ currency: null,
219
+ checkSizeCents: null,
220
+ }
221
+ }
222
+
223
+ export function assertNotAlreadyConverted(source: PipelineSnapshot): void {
224
+ if (source.convertedTargetId !== null || source.convertedDealId !== null) {
225
+ const existingId = source.convertedTargetId ?? source.convertedDealId
226
+
227
+ throw new AppError(
228
+ 'conflict',
229
+ 'This record has already been converted',
230
+ [{ field: 'converted_to', message: existingId ?? 'unknown' }],
231
+ )
232
+ }
233
+ }
234
+
235
+ export function resolveCompanyId(
236
+ source: PipelineSnapshot,
237
+ targetKind: PipelineKind,
238
+ override: string | undefined,
239
+ ): string | null {
240
+ const companyId = override ?? source.companyId
241
+
242
+ if (COMPANY_REQUIRED_TARGETS.has(targetKind) && companyId === null) {
243
+ throw AppError.validationFailed(
244
+ `A ${objectLabelFor(targetKind).toLowerCase()} needs a company before conversion`,
245
+ [{ field: 'company_id', message: 'Link a company to the record first, or send company_id' }],
246
+ )
247
+ }
248
+
249
+ return companyId
250
+ }
251
+
252
+ export async function intersectCustomFields(
253
+ tx: Parameters<CustomFieldValuesValidator['forCreate']>[0],
254
+ workspaceId: string,
255
+ targetKind: PipelineKind,
256
+ sourceCustomFields: Readonly<Record<string, CustomFieldValue>>,
257
+ customFields: CustomFieldValuesValidator,
258
+ ): Promise<Readonly<Record<string, CustomFieldValue>>> {
259
+ const targetDefinitions = await definitionsForObject(tx, workspaceId, targetKind)
260
+ const targetKeys = new Set(targetDefinitions.map((definition) => definition.key))
261
+ const raw: Record<string, CustomFieldWireValue> = {}
262
+
263
+ for (const [key, value] of Object.entries(sourceCustomFields)) {
264
+ if (targetKeys.has(key)) {
265
+ raw[key] = value as CustomFieldWireValue
266
+ }
267
+ }
268
+
269
+ return customFields.forCreate(tx, workspaceId, targetKind, raw)
270
+ }
271
+
272
+ export interface TargetInsertPayload {
273
+ readonly name: string
274
+ readonly companyId: string | null
275
+ readonly ownerId: string | null
276
+ readonly summary: string
277
+ readonly tags: readonly string[]
278
+ readonly customFields: Readonly<Record<string, CustomFieldValue>>
279
+ readonly stageId: string
280
+ readonly kindField: string
281
+ readonly expectedClose: string | null
282
+ readonly nextTouchpoint: string | null
283
+ readonly valueCents: number | null
284
+ readonly currency: string | null
285
+ readonly checkSizeCents: number | null
286
+ }
287
+
288
+ export function buildTargetInsertPayload(
289
+ source: PipelineSnapshot,
290
+ targetKind: PipelineKind,
291
+ body: ConvertPipelineRecordInput,
292
+ targetStageId: string,
293
+ ): TargetInsertPayload {
294
+ const companyId = resolveCompanyId(source, targetKind, body.companyId)
295
+ const name = body.name ?? source.name
296
+ const kindField =
297
+ body.kind ??
298
+ (source.kindField !== null && (targetKind === 'opportunity' || targetKind === 'partnership')
299
+ ? source.kindField
300
+ : '')
301
+
302
+ let expectedClose = source.expectedClose
303
+ let nextTouchpoint = source.nextTouchpoint
304
+ let valueCents = source.valueCents
305
+ let currency = source.currency
306
+ let checkSizeCents = source.checkSizeCents
307
+
308
+ if (targetKind === 'partnership') {
309
+ expectedClose = null
310
+ nextTouchpoint = source.expectedClose ?? source.nextTouchpoint
311
+ valueCents = null
312
+ checkSizeCents = null
313
+ } else if (targetKind === 'deal') {
314
+ nextTouchpoint = null
315
+ if (source.kind === 'raise') {
316
+ valueCents = source.checkSizeCents
317
+ checkSizeCents = null
318
+ }
319
+ } else if (targetKind === 'raise') {
320
+ nextTouchpoint = null
321
+ if (source.kind === 'deal') {
322
+ checkSizeCents = source.valueCents
323
+ valueCents = null
324
+ }
325
+ } else if (targetKind === 'opportunity' || targetKind === 'enquiry') {
326
+ nextTouchpoint = null
327
+ valueCents = null
328
+ checkSizeCents = null
329
+ }
330
+
331
+ if (targetKind !== 'deal' && targetKind !== 'opportunity' && targetKind !== 'raise') {
332
+ expectedClose = null
333
+ }
334
+
335
+ if (targetKind !== 'partnership') {
336
+ nextTouchpoint = null
337
+ }
338
+
339
+ return {
340
+ name,
341
+ companyId,
342
+ ownerId: source.ownerId,
343
+ summary: source.summary,
344
+ tags: source.tags,
345
+ customFields: {},
346
+ stageId: body.stageId ?? targetStageId,
347
+ kindField,
348
+ expectedClose,
349
+ nextTouchpoint,
350
+ valueCents,
351
+ currency: currency ?? (targetKind === 'deal' || targetKind === 'raise' ? 'USD' : null),
352
+ checkSizeCents,
353
+ }
354
+ }
355
+
356
+ export type ConvertedTargetRecord =
357
+ | DealRecord
358
+ | EnquiryRecord
359
+ | OpportunityRecord
360
+ | RaiseRecord
361
+ | PartnershipRecord
362
+
363
+ export async function insertConvertedTarget(
364
+ tx: Parameters<CustomFieldValuesValidator['forCreate']>[0],
365
+ workspaceId: string,
366
+ targetKind: PipelineKind,
367
+ targetId: string,
368
+ payload: TargetInsertPayload,
369
+ customFields: Readonly<Record<string, CustomFieldValue>>,
370
+ now: Date,
371
+ ): Promise<ConvertedTargetRecord> {
372
+ switch (targetKind) {
373
+ case 'enquiry':
374
+ return enquiryRepository.insertEnquiry(tx, {
375
+ id: targetId,
376
+ workspaceId,
377
+ name: payload.name,
378
+ source: '',
379
+ stageId: payload.stageId,
380
+ companyId: payload.companyId,
381
+ ownerId: payload.ownerId,
382
+ convertedDealId: null,
383
+ convertedTargetType: null,
384
+ convertedTargetId: null,
385
+ summary: payload.summary,
386
+ tags: [...payload.tags],
387
+ customFields,
388
+ createdAt: now,
389
+ updatedAt: now,
390
+ })
391
+ case 'deal':
392
+ return dealRepository.insertDeal(tx, {
393
+ id: targetId,
394
+ workspaceId,
395
+ name: payload.name,
396
+ companyId: payload.companyId as string,
397
+ stageId: payload.stageId,
398
+ valueCents: payload.valueCents,
399
+ currency: payload.currency,
400
+ ownerId: payload.ownerId,
401
+ expectedClose: payload.expectedClose,
402
+ competitors: [],
403
+ risks: '',
404
+ whyWin: '',
405
+ summary: payload.summary,
406
+ tags: [...payload.tags],
407
+ externalId: null,
408
+ convertedTargetType: null,
409
+ convertedTargetId: null,
410
+ customFields,
411
+ })
412
+ case 'opportunity':
413
+ return opportunityRepository.insertOpportunity(tx, {
414
+ id: targetId,
415
+ workspaceId,
416
+ name: payload.name,
417
+ kind: payload.kindField,
418
+ stageId: payload.stageId,
419
+ companyId: payload.companyId,
420
+ ownerId: payload.ownerId,
421
+ expectedClose: payload.expectedClose,
422
+ summary: payload.summary,
423
+ tags: [...payload.tags],
424
+ convertedTargetType: null,
425
+ convertedTargetId: null,
426
+ customFields,
427
+ createdAt: now,
428
+ updatedAt: now,
429
+ })
430
+ case 'raise':
431
+ return raiseRepository.insertRaise(tx, {
432
+ id: targetId,
433
+ workspaceId,
434
+ name: payload.name,
435
+ companyId: payload.companyId as string,
436
+ stageId: payload.stageId,
437
+ checkSizeCents: payload.checkSizeCents,
438
+ currency: payload.currency,
439
+ thesisFit: '',
440
+ passReason: null,
441
+ ownerId: payload.ownerId,
442
+ expectedClose: payload.expectedClose,
443
+ summary: payload.summary,
444
+ tags: [...payload.tags],
445
+ convertedTargetType: null,
446
+ convertedTargetId: null,
447
+ customFields,
448
+ createdAt: now,
449
+ updatedAt: now,
450
+ })
451
+ case 'partnership':
452
+ return partnershipRepository.insertPartnership(tx, {
453
+ id: targetId,
454
+ workspaceId,
455
+ name: payload.name,
456
+ companyId: payload.companyId as string,
457
+ stageId: payload.stageId,
458
+ kind: payload.kindField,
459
+ nextTouchpoint: payload.nextTouchpoint,
460
+ ownerId: payload.ownerId,
461
+ goals: '',
462
+ successLooksLike: '',
463
+ summary: payload.summary,
464
+ tags: [...payload.tags],
465
+ convertedTargetType: null,
466
+ convertedTargetId: null,
467
+ customFields,
468
+ createdAt: now,
469
+ updatedAt: now,
470
+ })
471
+ }
472
+ }
473
+
474
+ export async function markSourceConverted(
475
+ tx: Parameters<CustomFieldValuesValidator['forCreate']>[0],
476
+ workspaceId: string,
477
+ source: PipelineSnapshot,
478
+ targetKind: PipelineKind,
479
+ targetId: string,
480
+ closedStageId: string | undefined,
481
+ now: Date,
482
+ ): Promise<void> {
483
+ const convertedChanges = {
484
+ convertedTargetType: targetKind,
485
+ convertedTargetId: targetId,
486
+ updatedAt: now,
487
+ ...(source.kind === 'enquiry' && targetKind === 'deal' ? { convertedDealId: targetId } : {}),
488
+ ...(closedStageId === undefined ? {} : { stageId: closedStageId }),
489
+ }
490
+
491
+ switch (source.kind) {
492
+ case 'enquiry': {
493
+ const updated = await enquiryRepository.updateEnquiry(tx, workspaceId, source.id, convertedChanges)
494
+
495
+ if (updated === undefined) {
496
+ throw AppError.notFound('Enquiry not found')
497
+ }
498
+
499
+ return
500
+ }
501
+ case 'deal': {
502
+ const updated = await dealRepository.updateDeal(tx, workspaceId, source.id, convertedChanges)
503
+
504
+ if (updated === undefined) {
505
+ throw AppError.notFound('Deal not found')
506
+ }
507
+
508
+ return
509
+ }
510
+ case 'opportunity': {
511
+ const updated = await opportunityRepository.updateOpportunity(
512
+ tx,
513
+ workspaceId,
514
+ source.id,
515
+ convertedChanges,
516
+ )
517
+
518
+ if (updated === undefined) {
519
+ throw AppError.notFound('Opportunity not found')
520
+ }
521
+
522
+ return
523
+ }
524
+ case 'raise': {
525
+ const updated = await raiseRepository.updateRaise(tx, workspaceId, source.id, convertedChanges)
526
+
527
+ if (updated === undefined) {
528
+ throw AppError.notFound('Raise not found')
529
+ }
530
+
531
+ return
532
+ }
533
+ case 'partnership': {
534
+ const updated = await partnershipRepository.updatePartnership(
535
+ tx,
536
+ workspaceId,
537
+ source.id,
538
+ convertedChanges,
539
+ )
540
+
541
+ if (updated === undefined) {
542
+ throw AppError.notFound('Partnership not found')
543
+ }
544
+
545
+ return
546
+ }
547
+ }
548
+ }
@@ -0,0 +1,6 @@
1
+ export { createConversionsFromContext } from './factory.ts'
2
+ export { createConversionsService, createSharedConversionsService } from './service.ts'
3
+ export type { ConversionsDependencies, ConversionsService, ConvertPipelineRecordResult } from './service.ts'
4
+ export { repointRecordsAttachedTo } from './repoint.ts'
5
+ export { clearConversionPointersToTarget } from './clearPointers.ts'
6
+ export { objectLabelFor } from './fieldMap.ts'
@@ -0,0 +1,71 @@
1
+ import { convertEnquiryBody, convertPipelineRecordBody, PIPELINE_KINDS } from '@kelpie/schemas'
2
+ import type { PipelineKind } from '@kelpie/schemas'
3
+ import { z } from 'zod'
4
+
5
+ import type { McpToolRegistry } from '../../runtime/module.ts'
6
+ import { idArg } from '../crudTools.ts'
7
+ import type { ConversionsService } from './service.ts'
8
+ import { objectLabelFor } from './fieldMap.ts'
9
+ import { toConvertInput } from './routes.ts'
10
+ import { renderConvertedPipelineRecord } from './wire.ts'
11
+
12
+ const CONVERT_TOOL_RESOURCES: Readonly<Record<PipelineKind, string>> = {
13
+ enquiry: 'enquiries',
14
+ deal: 'deals',
15
+ opportunity: 'opportunities',
16
+ raise: 'raises',
17
+ partnership: 'partnerships',
18
+ }
19
+
20
+ export function registerPipelineConvertTool(
21
+ mcp: McpToolRegistry,
22
+ conversions: ConversionsService,
23
+ sourceKind: PipelineKind,
24
+ ): void {
25
+ const bodySchema =
26
+ sourceKind === 'enquiry'
27
+ ? convertEnquiryBody
28
+ : convertPipelineRecordBody
29
+
30
+ mcp.tool({
31
+ name: `${CONVERT_TOOL_RESOURCES[sourceKind]}_convert`,
32
+ description:
33
+ `Convert a ${objectLabelFor(sourceKind)} to another pipeline record type. ` +
34
+ 'Creates a new record, moves notes/activities/decisions/plans to it, copies ' +
35
+ 'linked people, and leaves the source in place with a conversion link. ' +
36
+ `Target types: ${PIPELINE_KINDS.join(', ')}. 409 if already converted.`,
37
+ inputSchema: bodySchema.and(z.strictObject({ id: idArg })),
38
+ invoke: async (args, actor) => {
39
+ const { id, ...body } = args
40
+ const { targetKind, target, personIds } = await conversions.convert(
41
+ actor,
42
+ sourceKind,
43
+ id,
44
+ toConvertInput(body),
45
+ )
46
+
47
+ return renderConvertedPipelineRecord(targetKind, target, personIds)
48
+ },
49
+ })
50
+ }
51
+
52
+ /** Backward-compatible alias for agents that still call enquiries_convert_to_deal. */
53
+ export function registerEnquiryConvertToDealTool(
54
+ mcp: McpToolRegistry,
55
+ conversions: ConversionsService,
56
+ ): void {
57
+ mcp.tool({
58
+ name: 'enquiries_convert_to_deal',
59
+ description:
60
+ 'Convert an enquiry to a Deal. Same as enquiries_convert with target_type deal. ' +
61
+ 'Mirrors POST /v1/enquiries/{id}/convert.',
62
+ inputSchema: z.strictObject({ id: idArg }),
63
+ invoke: async ({ id }, actor) => {
64
+ const { targetKind, target, personIds } = await conversions.convert(actor, 'enquiry', id, {
65
+ targetType: 'deal',
66
+ })
67
+
68
+ return renderConvertedPipelineRecord(targetKind, target, personIds)
69
+ },
70
+ })
71
+ }