@kelpie/server 0.8.0 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (594) hide show
  1. package/dist/index.d.ts +2 -0
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +1 -0
  4. package/dist/index.js.map +1 -1
  5. package/dist/lib/ids.d.ts +11 -0
  6. package/dist/lib/ids.d.ts.map +1 -1
  7. package/dist/lib/ids.js +11 -0
  8. package/dist/lib/ids.js.map +1 -1
  9. package/dist/modules/activities/repository.d.ts.map +1 -1
  10. package/dist/modules/activities/repository.js +19 -20
  11. package/dist/modules/activities/repository.js.map +1 -1
  12. package/dist/modules/activities/wording.d.ts +12 -0
  13. package/dist/modules/activities/wording.d.ts.map +1 -1
  14. package/dist/modules/activities/wording.js +16 -0
  15. package/dist/modules/activities/wording.js.map +1 -1
  16. package/dist/modules/agent-tasks/catalog.d.ts.map +1 -1
  17. package/dist/modules/agent-tasks/catalog.js +62 -0
  18. package/dist/modules/agent-tasks/catalog.js.map +1 -1
  19. package/dist/modules/agent-tasks/resolve.d.ts.map +1 -1
  20. package/dist/modules/agent-tasks/resolve.js +42 -9
  21. package/dist/modules/agent-tasks/resolve.js.map +1 -1
  22. package/dist/modules/agent-tasks/routes.d.ts +2 -0
  23. package/dist/modules/agent-tasks/routes.d.ts.map +1 -1
  24. package/dist/modules/attachedRecords.d.ts +6 -1
  25. package/dist/modules/attachedRecords.d.ts.map +1 -1
  26. package/dist/modules/attachedRecords.js +15 -1
  27. package/dist/modules/attachedRecords.js.map +1 -1
  28. package/dist/modules/companies/index.d.ts.map +1 -1
  29. package/dist/modules/companies/index.js +3 -1
  30. package/dist/modules/companies/index.js.map +1 -1
  31. package/dist/modules/companies/routes.d.ts +14 -0
  32. package/dist/modules/companies/routes.d.ts.map +1 -1
  33. package/dist/modules/companies/routes.js +7 -0
  34. package/dist/modules/companies/routes.js.map +1 -1
  35. package/dist/modules/companies/schema.d.ts +20 -0
  36. package/dist/modules/companies/schema.d.ts.map +1 -1
  37. package/dist/modules/companies/schema.js +6 -1
  38. package/dist/modules/companies/schema.js.map +1 -1
  39. package/dist/modules/companies/service.d.ts +5 -0
  40. package/dist/modules/companies/service.d.ts.map +1 -1
  41. package/dist/modules/companies/service.js +24 -12
  42. package/dist/modules/companies/service.js.map +1 -1
  43. package/dist/modules/consent-purposes/capabilities.d.ts +7 -0
  44. package/dist/modules/consent-purposes/capabilities.d.ts.map +1 -0
  45. package/dist/modules/consent-purposes/capabilities.js +10 -0
  46. package/dist/modules/consent-purposes/capabilities.js.map +1 -0
  47. package/dist/modules/consent-purposes/events.d.ts +38 -0
  48. package/dist/modules/consent-purposes/events.d.ts.map +1 -0
  49. package/dist/modules/consent-purposes/events.js +17 -0
  50. package/dist/modules/consent-purposes/events.js.map +1 -0
  51. package/dist/modules/consent-purposes/index.d.ts +13 -0
  52. package/dist/modules/consent-purposes/index.d.ts.map +1 -0
  53. package/dist/modules/consent-purposes/index.js +41 -0
  54. package/dist/modules/consent-purposes/index.js.map +1 -0
  55. package/dist/modules/consent-purposes/repository.d.ts +21 -0
  56. package/dist/modules/consent-purposes/repository.d.ts.map +1 -0
  57. package/dist/modules/consent-purposes/repository.js +98 -0
  58. package/dist/modules/consent-purposes/repository.js.map +1 -0
  59. package/dist/modules/consent-purposes/routes.d.ts +39 -0
  60. package/dist/modules/consent-purposes/routes.d.ts.map +1 -0
  61. package/dist/modules/consent-purposes/routes.js +79 -0
  62. package/dist/modules/consent-purposes/routes.js.map +1 -0
  63. package/dist/modules/consent-purposes/schema.d.ts +175 -0
  64. package/dist/modules/consent-purposes/schema.d.ts.map +1 -0
  65. package/dist/modules/consent-purposes/schema.js +35 -0
  66. package/dist/modules/consent-purposes/schema.js.map +1 -0
  67. package/dist/modules/consent-purposes/service.d.ts +50 -0
  68. package/dist/modules/consent-purposes/service.d.ts.map +1 -0
  69. package/dist/modules/consent-purposes/service.js +263 -0
  70. package/dist/modules/consent-purposes/service.js.map +1 -0
  71. package/dist/modules/consent-purposes/starters.d.ts +17 -0
  72. package/dist/modules/consent-purposes/starters.d.ts.map +1 -0
  73. package/dist/modules/consent-purposes/starters.js +15 -0
  74. package/dist/modules/consent-purposes/starters.js.map +1 -0
  75. package/dist/modules/consent-purposes/tools.d.ts +4 -0
  76. package/dist/modules/consent-purposes/tools.d.ts.map +1 -0
  77. package/dist/modules/consent-purposes/tools.js +29 -0
  78. package/dist/modules/consent-purposes/tools.js.map +1 -0
  79. package/dist/modules/core.d.ts.map +1 -1
  80. package/dist/modules/core.js +10 -0
  81. package/dist/modules/core.js.map +1 -1
  82. package/dist/modules/custom-fields/capabilities.d.ts +12 -0
  83. package/dist/modules/custom-fields/capabilities.d.ts.map +1 -0
  84. package/dist/modules/custom-fields/capabilities.js +15 -0
  85. package/dist/modules/custom-fields/capabilities.js.map +1 -0
  86. package/dist/modules/custom-fields/events.d.ts +49 -0
  87. package/dist/modules/custom-fields/events.d.ts.map +1 -0
  88. package/dist/modules/custom-fields/events.js +25 -0
  89. package/dist/modules/custom-fields/events.js.map +1 -0
  90. package/dist/modules/custom-fields/index.d.ts +19 -0
  91. package/dist/modules/custom-fields/index.d.ts.map +1 -0
  92. package/dist/modules/custom-fields/index.js +46 -0
  93. package/dist/modules/custom-fields/index.js.map +1 -0
  94. package/dist/modules/custom-fields/repository.d.ts +37 -0
  95. package/dist/modules/custom-fields/repository.d.ts.map +1 -0
  96. package/dist/modules/custom-fields/repository.js +144 -0
  97. package/dist/modules/custom-fields/repository.js.map +1 -0
  98. package/dist/modules/custom-fields/routes.d.ts +44 -0
  99. package/dist/modules/custom-fields/routes.d.ts.map +1 -0
  100. package/dist/modules/custom-fields/routes.js +103 -0
  101. package/dist/modules/custom-fields/routes.js.map +1 -0
  102. package/dist/modules/custom-fields/schema.d.ts +215 -0
  103. package/dist/modules/custom-fields/schema.d.ts.map +1 -0
  104. package/dist/modules/custom-fields/schema.js +43 -0
  105. package/dist/modules/custom-fields/schema.js.map +1 -0
  106. package/dist/modules/custom-fields/service.d.ts +57 -0
  107. package/dist/modules/custom-fields/service.d.ts.map +1 -0
  108. package/dist/modules/custom-fields/service.js +273 -0
  109. package/dist/modules/custom-fields/service.js.map +1 -0
  110. package/dist/modules/custom-fields/tools.d.ts +4 -0
  111. package/dist/modules/custom-fields/tools.d.ts.map +1 -0
  112. package/dist/modules/custom-fields/tools.js +38 -0
  113. package/dist/modules/custom-fields/tools.js.map +1 -0
  114. package/dist/modules/custom-fields/values.d.ts +49 -0
  115. package/dist/modules/custom-fields/values.d.ts.map +1 -0
  116. package/dist/modules/custom-fields/values.js +249 -0
  117. package/dist/modules/custom-fields/values.js.map +1 -0
  118. package/dist/modules/custom-fields/wire.d.ts +12 -0
  119. package/dist/modules/custom-fields/wire.d.ts.map +1 -0
  120. package/dist/modules/custom-fields/wire.js +30 -0
  121. package/dist/modules/custom-fields/wire.js.map +1 -0
  122. package/dist/modules/dashboard/repository.d.ts.map +1 -1
  123. package/dist/modules/dashboard/repository.js +4 -3
  124. package/dist/modules/dashboard/repository.js.map +1 -1
  125. package/dist/modules/deals/index.d.ts +2 -1
  126. package/dist/modules/deals/index.d.ts.map +1 -1
  127. package/dist/modules/deals/index.js +5 -2
  128. package/dist/modules/deals/index.js.map +1 -1
  129. package/dist/modules/deals/repository.d.ts +0 -16
  130. package/dist/modules/deals/repository.d.ts.map +1 -1
  131. package/dist/modules/deals/repository.js +6 -76
  132. package/dist/modules/deals/repository.js.map +1 -1
  133. package/dist/modules/deals/routes.d.ts +14 -0
  134. package/dist/modules/deals/routes.d.ts.map +1 -1
  135. package/dist/modules/deals/routes.js +7 -0
  136. package/dist/modules/deals/routes.js.map +1 -1
  137. package/dist/modules/deals/schema.d.ts +20 -42
  138. package/dist/modules/deals/schema.d.ts.map +1 -1
  139. package/dist/modules/deals/schema.js +6 -11
  140. package/dist/modules/deals/schema.js.map +1 -1
  141. package/dist/modules/deals/service.d.ts +13 -2
  142. package/dist/modules/deals/service.d.ts.map +1 -1
  143. package/dist/modules/deals/service.js +43 -20
  144. package/dist/modules/deals/service.js.map +1 -1
  145. package/dist/modules/decisions/repository.d.ts.map +1 -1
  146. package/dist/modules/decisions/repository.js +2 -0
  147. package/dist/modules/decisions/repository.js.map +1 -1
  148. package/dist/modules/decisions/routes.d.ts +1 -0
  149. package/dist/modules/decisions/routes.d.ts.map +1 -1
  150. package/dist/modules/enquiries/events.d.ts +44 -0
  151. package/dist/modules/enquiries/events.d.ts.map +1 -0
  152. package/dist/modules/enquiries/events.js +19 -0
  153. package/dist/modules/enquiries/events.js.map +1 -0
  154. package/dist/modules/enquiries/index.d.ts +13 -0
  155. package/dist/modules/enquiries/index.d.ts.map +1 -0
  156. package/dist/modules/enquiries/index.js +44 -0
  157. package/dist/modules/enquiries/index.js.map +1 -0
  158. package/dist/modules/enquiries/repository.d.ts +30 -0
  159. package/dist/modules/enquiries/repository.d.ts.map +1 -0
  160. package/dist/modules/enquiries/repository.js +94 -0
  161. package/dist/modules/enquiries/repository.js.map +1 -0
  162. package/dist/modules/enquiries/routes.d.ts +52 -0
  163. package/dist/modules/enquiries/routes.d.ts.map +1 -0
  164. package/dist/modules/enquiries/routes.js +127 -0
  165. package/dist/modules/enquiries/routes.js.map +1 -0
  166. package/dist/modules/enquiries/schema.d.ts +290 -0
  167. package/dist/modules/enquiries/schema.d.ts.map +1 -0
  168. package/dist/modules/enquiries/schema.js +52 -0
  169. package/dist/modules/enquiries/schema.js.map +1 -0
  170. package/dist/modules/enquiries/service.d.ts +85 -0
  171. package/dist/modules/enquiries/service.d.ts.map +1 -0
  172. package/dist/modules/enquiries/service.js +370 -0
  173. package/dist/modules/enquiries/service.js.map +1 -0
  174. package/dist/modules/enquiries/tools.d.ts +4 -0
  175. package/dist/modules/enquiries/tools.d.ts.map +1 -0
  176. package/dist/modules/enquiries/tools.js +50 -0
  177. package/dist/modules/enquiries/tools.js.map +1 -0
  178. package/dist/modules/eventCatalogs.d.ts +3 -0
  179. package/dist/modules/eventCatalogs.d.ts.map +1 -1
  180. package/dist/modules/eventCatalogs.js +3 -0
  181. package/dist/modules/eventCatalogs.js.map +1 -1
  182. package/dist/modules/forms/embed.d.ts +20 -6
  183. package/dist/modules/forms/embed.d.ts.map +1 -1
  184. package/dist/modules/forms/embed.js +359 -43
  185. package/dist/modules/forms/embed.js.map +1 -1
  186. package/dist/modules/forms/events.d.ts +20 -7
  187. package/dist/modules/forms/events.d.ts.map +1 -1
  188. package/dist/modules/forms/events.js +20 -2
  189. package/dist/modules/forms/events.js.map +1 -1
  190. package/dist/modules/forms/fields.d.ts +14 -1
  191. package/dist/modules/forms/fields.d.ts.map +1 -1
  192. package/dist/modules/forms/fields.js +87 -3
  193. package/dist/modules/forms/fields.js.map +1 -1
  194. package/dist/modules/forms/index.d.ts.map +1 -1
  195. package/dist/modules/forms/index.js +12 -1
  196. package/dist/modules/forms/index.js.map +1 -1
  197. package/dist/modules/forms/mapping.d.ts +62 -5
  198. package/dist/modules/forms/mapping.d.ts.map +1 -1
  199. package/dist/modules/forms/mapping.js +139 -5
  200. package/dist/modules/forms/mapping.js.map +1 -1
  201. package/dist/modules/forms/publicRoutes.d.ts.map +1 -1
  202. package/dist/modules/forms/publicRoutes.js +29 -1
  203. package/dist/modules/forms/publicRoutes.js.map +1 -1
  204. package/dist/modules/forms/repository.d.ts +31 -0
  205. package/dist/modules/forms/repository.d.ts.map +1 -1
  206. package/dist/modules/forms/repository.js +90 -1
  207. package/dist/modules/forms/repository.js.map +1 -1
  208. package/dist/modules/forms/routes.d.ts +83 -1
  209. package/dist/modules/forms/routes.d.ts.map +1 -1
  210. package/dist/modules/forms/routes.js +185 -2
  211. package/dist/modules/forms/routes.js.map +1 -1
  212. package/dist/modules/forms/schema.d.ts +672 -1
  213. package/dist/modules/forms/schema.d.ts.map +1 -1
  214. package/dist/modules/forms/schema.js +146 -3
  215. package/dist/modules/forms/schema.js.map +1 -1
  216. package/dist/modules/forms/service.d.ts +54 -1
  217. package/dist/modules/forms/service.d.ts.map +1 -1
  218. package/dist/modules/forms/service.js +338 -28
  219. package/dist/modules/forms/service.js.map +1 -1
  220. package/dist/modules/forms/submission.d.ts +15 -0
  221. package/dist/modules/forms/submission.d.ts.map +1 -1
  222. package/dist/modules/forms/submission.js +418 -40
  223. package/dist/modules/forms/submission.js.map +1 -1
  224. package/dist/modules/import-export/drafts.d.ts +10 -0
  225. package/dist/modules/import-export/drafts.d.ts.map +1 -1
  226. package/dist/modules/import-export/drafts.js +16 -2
  227. package/dist/modules/import-export/drafts.js.map +1 -1
  228. package/dist/modules/import-export/exportRows.d.ts +7 -4
  229. package/dist/modules/import-export/exportRows.d.ts.map +1 -1
  230. package/dist/modules/import-export/exportRows.js +20 -5
  231. package/dist/modules/import-export/exportRows.js.map +1 -1
  232. package/dist/modules/import-export/plan.d.ts +12 -1
  233. package/dist/modules/import-export/plan.d.ts.map +1 -1
  234. package/dist/modules/import-export/plan.js +29 -2
  235. package/dist/modules/import-export/plan.js.map +1 -1
  236. package/dist/modules/import-export/presets.d.ts.map +1 -1
  237. package/dist/modules/import-export/presets.js +10 -0
  238. package/dist/modules/import-export/presets.js.map +1 -1
  239. package/dist/modules/import-export/repository.d.ts +11 -1
  240. package/dist/modules/import-export/repository.d.ts.map +1 -1
  241. package/dist/modules/import-export/repository.js +42 -9
  242. package/dist/modules/import-export/repository.js.map +1 -1
  243. package/dist/modules/import-export/routes.d.ts.map +1 -1
  244. package/dist/modules/import-export/routes.js +4 -0
  245. package/dist/modules/import-export/routes.js.map +1 -1
  246. package/dist/modules/import-export/schema.d.ts +17 -0
  247. package/dist/modules/import-export/schema.d.ts.map +1 -1
  248. package/dist/modules/import-export/schema.js +11 -0
  249. package/dist/modules/import-export/schema.js.map +1 -1
  250. package/dist/modules/import-export/service.d.ts +6 -0
  251. package/dist/modules/import-export/service.d.ts.map +1 -1
  252. package/dist/modules/import-export/service.js +14 -2
  253. package/dist/modules/import-export/service.js.map +1 -1
  254. package/dist/modules/import-export/streams.d.ts.map +1 -1
  255. package/dist/modules/import-export/streams.js +3 -3
  256. package/dist/modules/import-export/streams.js.map +1 -1
  257. package/dist/modules/import-export/tools.d.ts.map +1 -1
  258. package/dist/modules/import-export/tools.js +8 -0
  259. package/dist/modules/import-export/tools.js.map +1 -1
  260. package/dist/modules/import-export/validation.d.ts.map +1 -1
  261. package/dist/modules/import-export/validation.js +22 -1
  262. package/dist/modules/import-export/validation.js.map +1 -1
  263. package/dist/modules/import-export/writes.d.ts.map +1 -1
  264. package/dist/modules/import-export/writes.js +37 -4
  265. package/dist/modules/import-export/writes.js.map +1 -1
  266. package/dist/modules/lists/index.d.ts +38 -0
  267. package/dist/modules/lists/index.d.ts.map +1 -1
  268. package/dist/modules/lists/index.js +27 -0
  269. package/dist/modules/lists/index.js.map +1 -1
  270. package/dist/modules/lists/repository.d.ts +26 -0
  271. package/dist/modules/lists/repository.d.ts.map +1 -1
  272. package/dist/modules/lists/repository.js +32 -0
  273. package/dist/modules/lists/repository.js.map +1 -1
  274. package/dist/modules/lists/routes.d.ts +4 -0
  275. package/dist/modules/lists/routes.d.ts.map +1 -1
  276. package/dist/modules/lists/routes.js +8 -0
  277. package/dist/modules/lists/routes.js.map +1 -1
  278. package/dist/modules/lists/schema.d.ts +17 -0
  279. package/dist/modules/lists/schema.d.ts.map +1 -1
  280. package/dist/modules/lists/schema.js +10 -0
  281. package/dist/modules/lists/schema.js.map +1 -1
  282. package/dist/modules/lists/service.d.ts +14 -2
  283. package/dist/modules/lists/service.d.ts.map +1 -1
  284. package/dist/modules/lists/service.js +55 -7
  285. package/dist/modules/lists/service.js.map +1 -1
  286. package/dist/modules/mcp/index.d.ts.map +1 -1
  287. package/dist/modules/mcp/index.js +5 -0
  288. package/dist/modules/mcp/index.js.map +1 -1
  289. package/dist/modules/notes/routes.d.ts +1 -0
  290. package/dist/modules/notes/routes.d.ts.map +1 -1
  291. package/dist/modules/opportunities/index.d.ts.map +1 -1
  292. package/dist/modules/opportunities/index.js +3 -1
  293. package/dist/modules/opportunities/index.js.map +1 -1
  294. package/dist/modules/opportunities/repository.d.ts +2 -0
  295. package/dist/modules/opportunities/repository.d.ts.map +1 -1
  296. package/dist/modules/opportunities/repository.js +4 -0
  297. package/dist/modules/opportunities/repository.js.map +1 -1
  298. package/dist/modules/opportunities/routes.d.ts +16 -0
  299. package/dist/modules/opportunities/routes.d.ts.map +1 -1
  300. package/dist/modules/opportunities/routes.js +13 -0
  301. package/dist/modules/opportunities/routes.js.map +1 -1
  302. package/dist/modules/opportunities/schema.d.ts +20 -0
  303. package/dist/modules/opportunities/schema.d.ts.map +1 -1
  304. package/dist/modules/opportunities/schema.js +6 -1
  305. package/dist/modules/opportunities/schema.js.map +1 -1
  306. package/dist/modules/opportunities/service.d.ts +20 -3
  307. package/dist/modules/opportunities/service.d.ts.map +1 -1
  308. package/dist/modules/opportunities/service.js +99 -18
  309. package/dist/modules/opportunities/service.js.map +1 -1
  310. package/dist/modules/opportunities/tools.d.ts.map +1 -1
  311. package/dist/modules/opportunities/tools.js +2 -0
  312. package/dist/modules/opportunities/tools.js.map +1 -1
  313. package/dist/modules/partnerships/index.d.ts.map +1 -1
  314. package/dist/modules/partnerships/index.js +3 -1
  315. package/dist/modules/partnerships/index.js.map +1 -1
  316. package/dist/modules/partnerships/repository.d.ts +0 -17
  317. package/dist/modules/partnerships/repository.d.ts.map +1 -1
  318. package/dist/modules/partnerships/repository.js +6 -82
  319. package/dist/modules/partnerships/repository.js.map +1 -1
  320. package/dist/modules/partnerships/routes.d.ts +14 -0
  321. package/dist/modules/partnerships/routes.d.ts.map +1 -1
  322. package/dist/modules/partnerships/routes.js +7 -0
  323. package/dist/modules/partnerships/routes.js.map +1 -1
  324. package/dist/modules/partnerships/schema.d.ts +20 -41
  325. package/dist/modules/partnerships/schema.d.ts.map +1 -1
  326. package/dist/modules/partnerships/schema.js +6 -10
  327. package/dist/modules/partnerships/schema.js.map +1 -1
  328. package/dist/modules/partnerships/service.d.ts +11 -1
  329. package/dist/modules/partnerships/service.d.ts.map +1 -1
  330. package/dist/modules/partnerships/service.js +43 -20
  331. package/dist/modules/partnerships/service.js.map +1 -1
  332. package/dist/modules/people/consentHydration.d.ts +26 -0
  333. package/dist/modules/people/consentHydration.d.ts.map +1 -0
  334. package/dist/modules/people/consentHydration.js +100 -0
  335. package/dist/modules/people/consentHydration.js.map +1 -0
  336. package/dist/modules/people/index.d.ts.map +1 -1
  337. package/dist/modules/people/index.js +3 -1
  338. package/dist/modules/people/index.js.map +1 -1
  339. package/dist/modules/people/personConsentWrites.d.ts +40 -0
  340. package/dist/modules/people/personConsentWrites.d.ts.map +1 -0
  341. package/dist/modules/people/personConsentWrites.js +98 -0
  342. package/dist/modules/people/personConsentWrites.js.map +1 -0
  343. package/dist/modules/people/repository.d.ts.map +1 -1
  344. package/dist/modules/people/repository.js +5 -1
  345. package/dist/modules/people/repository.js.map +1 -1
  346. package/dist/modules/people/routes.d.ts +57 -4
  347. package/dist/modules/people/routes.d.ts.map +1 -1
  348. package/dist/modules/people/routes.js +104 -5
  349. package/dist/modules/people/routes.js.map +1 -1
  350. package/dist/modules/people/schema.d.ts +366 -1
  351. package/dist/modules/people/schema.d.ts.map +1 -1
  352. package/dist/modules/people/schema.js +92 -2
  353. package/dist/modules/people/schema.js.map +1 -1
  354. package/dist/modules/people/service.d.ts +30 -1
  355. package/dist/modules/people/service.d.ts.map +1 -1
  356. package/dist/modules/people/service.js +115 -38
  357. package/dist/modules/people/service.js.map +1 -1
  358. package/dist/modules/people/tools.d.ts.map +1 -1
  359. package/dist/modules/people/tools.js +4 -1
  360. package/dist/modules/people/tools.js.map +1 -1
  361. package/dist/modules/personLinks.d.ts +79 -0
  362. package/dist/modules/personLinks.d.ts.map +1 -0
  363. package/dist/modules/personLinks.js +155 -0
  364. package/dist/modules/personLinks.js.map +1 -0
  365. package/dist/modules/pipelines/routes.d.ts +1 -0
  366. package/dist/modules/pipelines/routes.d.ts.map +1 -1
  367. package/dist/modules/plans/routes.d.ts +1 -0
  368. package/dist/modules/plans/routes.d.ts.map +1 -1
  369. package/dist/modules/raises/index.d.ts.map +1 -1
  370. package/dist/modules/raises/index.js +3 -1
  371. package/dist/modules/raises/index.js.map +1 -1
  372. package/dist/modules/raises/repository.d.ts +0 -17
  373. package/dist/modules/raises/repository.d.ts.map +1 -1
  374. package/dist/modules/raises/repository.js +6 -77
  375. package/dist/modules/raises/repository.js.map +1 -1
  376. package/dist/modules/raises/routes.d.ts +14 -0
  377. package/dist/modules/raises/routes.d.ts.map +1 -1
  378. package/dist/modules/raises/routes.js +7 -0
  379. package/dist/modules/raises/routes.js.map +1 -1
  380. package/dist/modules/raises/schema.d.ts +20 -41
  381. package/dist/modules/raises/schema.d.ts.map +1 -1
  382. package/dist/modules/raises/schema.js +6 -10
  383. package/dist/modules/raises/schema.js.map +1 -1
  384. package/dist/modules/raises/service.d.ts +11 -1
  385. package/dist/modules/raises/service.d.ts.map +1 -1
  386. package/dist/modules/raises/service.js +41 -18
  387. package/dist/modules/raises/service.js.map +1 -1
  388. package/dist/modules/recordTargets.d.ts.map +1 -1
  389. package/dist/modules/recordTargets.js +2 -0
  390. package/dist/modules/recordTargets.js.map +1 -1
  391. package/dist/modules/references.d.ts +10 -0
  392. package/dist/modules/references.d.ts.map +1 -1
  393. package/dist/modules/references.js +27 -4
  394. package/dist/modules/references.js.map +1 -1
  395. package/dist/modules/sample-data/fixture.d.ts +21 -0
  396. package/dist/modules/sample-data/fixture.d.ts.map +1 -1
  397. package/dist/modules/sample-data/fixture.js +40 -0
  398. package/dist/modules/sample-data/fixture.js.map +1 -1
  399. package/dist/modules/sample-data/index.d.ts.map +1 -1
  400. package/dist/modules/sample-data/index.js +1 -0
  401. package/dist/modules/sample-data/index.js.map +1 -1
  402. package/dist/modules/sample-data/routes.d.ts.map +1 -1
  403. package/dist/modules/sample-data/routes.js +1 -0
  404. package/dist/modules/sample-data/routes.js.map +1 -1
  405. package/dist/modules/sample-data/service.d.ts +1 -0
  406. package/dist/modules/sample-data/service.d.ts.map +1 -1
  407. package/dist/modules/sample-data/service.js +77 -8
  408. package/dist/modules/sample-data/service.js.map +1 -1
  409. package/dist/modules/search/index.d.ts +1 -1
  410. package/dist/modules/search/index.d.ts.map +1 -1
  411. package/dist/modules/search/index.js +2 -1
  412. package/dist/modules/search/index.js.map +1 -1
  413. package/dist/modules/search/repository.d.ts +1 -0
  414. package/dist/modules/search/repository.d.ts.map +1 -1
  415. package/dist/modules/search/repository.js +23 -0
  416. package/dist/modules/search/repository.js.map +1 -1
  417. package/dist/modules/search/service.d.ts +3 -3
  418. package/dist/modules/search/service.d.ts.map +1 -1
  419. package/dist/modules/search/service.js +5 -4
  420. package/dist/modules/search/service.js.map +1 -1
  421. package/dist/modules/stagedRecords.d.ts +3 -3
  422. package/dist/modules/stagedRecords.d.ts.map +1 -1
  423. package/dist/modules/stagedRecords.js +9 -0
  424. package/dist/modules/stagedRecords.js.map +1 -1
  425. package/dist/modules/webhooks/payloads.d.ts.map +1 -1
  426. package/dist/modules/webhooks/payloads.js +15 -2
  427. package/dist/modules/webhooks/payloads.js.map +1 -1
  428. package/dist/modules/workspace/repository.d.ts +2 -0
  429. package/dist/modules/workspace/repository.d.ts.map +1 -1
  430. package/dist/modules/workspace/repository.js +7 -0
  431. package/dist/modules/workspace/repository.js.map +1 -1
  432. package/dist/modules/workspace/service.d.ts.map +1 -1
  433. package/dist/modules/workspace/service.js +10 -0
  434. package/dist/modules/workspace/service.js.map +1 -1
  435. package/dist/modules/workspace/starters.d.ts.map +1 -1
  436. package/dist/modules/workspace/starters.js +5 -0
  437. package/dist/modules/workspace/starters.js.map +1 -1
  438. package/dist/runtime/events.d.ts +1 -1
  439. package/dist/runtime/events.d.ts.map +1 -1
  440. package/dist/runtime/events.js +1 -0
  441. package/dist/runtime/events.js.map +1 -1
  442. package/dist/schema/index.d.ts +3 -0
  443. package/dist/schema/index.d.ts.map +1 -1
  444. package/dist/schema/index.js +3 -0
  445. package/dist/schema/index.js.map +1 -1
  446. package/dist/testing/database.d.ts +5 -1
  447. package/dist/testing/database.d.ts.map +1 -1
  448. package/dist/testing/database.js +81 -10
  449. package/dist/testing/database.js.map +1 -1
  450. package/migrations/0024_third_king_cobra.sql +46 -0
  451. package/migrations/0025_worthless_chimera.sql +3 -0
  452. package/migrations/0026_late_aqueduct.sql +46 -0
  453. package/migrations/0027_brainy_silver_sable.sql +3 -0
  454. package/migrations/0028_freezing_scrambler.sql +19 -0
  455. package/migrations/0029_custom_fields.sql +26 -0
  456. package/migrations/0030_enquiries.sql +79 -0
  457. package/migrations/0031_consent.sql +45 -0
  458. package/migrations/0032_form_field_statement.sql +1 -0
  459. package/migrations/0033_form_field_consent_purpose_ids.sql +5 -0
  460. package/migrations/0034_drop_form_field_consent_purpose_id.sql +1 -0
  461. package/migrations/0035_form_field_consent_purpose_labels.sql +1 -0
  462. package/migrations/0036_form_field_notice_type.sql +2 -0
  463. package/migrations/meta/0024_snapshot.json +5516 -0
  464. package/migrations/meta/0025_snapshot.json +5336 -0
  465. package/migrations/meta/0026_snapshot.json +5710 -0
  466. package/migrations/meta/0027_snapshot.json +5716 -0
  467. package/migrations/meta/0028_snapshot.json +5740 -0
  468. package/migrations/meta/0029_snapshot.json +5935 -0
  469. package/migrations/meta/0030_snapshot.json +6245 -0
  470. package/migrations/meta/0031_snapshot.json +6572 -0
  471. package/migrations/meta/0032_snapshot.json +6578 -0
  472. package/migrations/meta/0033_snapshot.json +6572 -0
  473. package/migrations/meta/0034_snapshot.json +6566 -0
  474. package/migrations/meta/0035_snapshot.json +6573 -0
  475. package/migrations/meta/0036_snapshot.json +6573 -0
  476. package/migrations/meta/_journal.json +91 -0
  477. package/package.json +2 -2
  478. package/src/index.ts +6 -0
  479. package/src/lib/ids.ts +11 -0
  480. package/src/modules/activities/repository.ts +22 -23
  481. package/src/modules/activities/wording.ts +18 -0
  482. package/src/modules/agent-tasks/catalog.ts +63 -0
  483. package/src/modules/agent-tasks/resolve.ts +64 -24
  484. package/src/modules/attachedRecords.ts +29 -2
  485. package/src/modules/companies/index.ts +3 -1
  486. package/src/modules/companies/routes.ts +7 -0
  487. package/src/modules/companies/schema.ts +7 -1
  488. package/src/modules/companies/service.ts +48 -13
  489. package/src/modules/consent-purposes/capabilities.ts +12 -0
  490. package/src/modules/consent-purposes/events.ts +38 -0
  491. package/src/modules/consent-purposes/index.ts +48 -0
  492. package/src/modules/consent-purposes/repository.ts +163 -0
  493. package/src/modules/consent-purposes/routes.ts +122 -0
  494. package/src/modules/consent-purposes/schema.ts +46 -0
  495. package/src/modules/consent-purposes/service.ts +423 -0
  496. package/src/modules/consent-purposes/starters.ts +32 -0
  497. package/src/modules/consent-purposes/tools.ts +44 -0
  498. package/src/modules/core.ts +10 -0
  499. package/src/modules/custom-fields/capabilities.ts +17 -0
  500. package/src/modules/custom-fields/events.ts +51 -0
  501. package/src/modules/custom-fields/index.ts +61 -0
  502. package/src/modules/custom-fields/repository.ts +225 -0
  503. package/src/modules/custom-fields/routes.ts +155 -0
  504. package/src/modules/custom-fields/schema.ts +61 -0
  505. package/src/modules/custom-fields/service.ts +439 -0
  506. package/src/modules/custom-fields/tools.ts +53 -0
  507. package/src/modules/custom-fields/values.ts +352 -0
  508. package/src/modules/custom-fields/wire.ts +32 -0
  509. package/src/modules/dashboard/repository.ts +4 -3
  510. package/src/modules/deals/index.ts +5 -2
  511. package/src/modules/deals/repository.ts +6 -106
  512. package/src/modules/deals/routes.ts +7 -0
  513. package/src/modules/deals/schema.ts +7 -15
  514. package/src/modules/deals/service.ts +92 -23
  515. package/src/modules/decisions/repository.ts +2 -0
  516. package/src/modules/enquiries/events.ts +45 -0
  517. package/src/modules/enquiries/index.ts +50 -0
  518. package/src/modules/enquiries/repository.ts +164 -0
  519. package/src/modules/enquiries/routes.ts +172 -0
  520. package/src/modules/enquiries/schema.ts +59 -0
  521. package/src/modules/enquiries/service.ts +644 -0
  522. package/src/modules/enquiries/tools.ts +66 -0
  523. package/src/modules/eventCatalogs.ts +3 -0
  524. package/src/modules/forms/embed.ts +391 -44
  525. package/src/modules/forms/events.ts +30 -2
  526. package/src/modules/forms/fields.ts +102 -2
  527. package/src/modules/forms/index.ts +12 -1
  528. package/src/modules/forms/mapping.ts +183 -6
  529. package/src/modules/forms/publicRoutes.ts +43 -1
  530. package/src/modules/forms/repository.ts +162 -1
  531. package/src/modules/forms/routes.ts +212 -2
  532. package/src/modules/forms/schema.ts +166 -4
  533. package/src/modules/forms/service.ts +565 -41
  534. package/src/modules/forms/submission.ts +718 -44
  535. package/src/modules/import-export/drafts.ts +20 -1
  536. package/src/modules/import-export/exportRows.ts +21 -5
  537. package/src/modules/import-export/plan.ts +47 -2
  538. package/src/modules/import-export/presets.ts +10 -0
  539. package/src/modules/import-export/repository.ts +73 -8
  540. package/src/modules/import-export/routes.ts +4 -0
  541. package/src/modules/import-export/schema.ts +11 -0
  542. package/src/modules/import-export/service.ts +28 -2
  543. package/src/modules/import-export/streams.ts +3 -1
  544. package/src/modules/import-export/tools.ts +10 -0
  545. package/src/modules/import-export/validation.ts +28 -0
  546. package/src/modules/import-export/writes.ts +70 -5
  547. package/src/modules/lists/index.ts +71 -0
  548. package/src/modules/lists/repository.ts +64 -0
  549. package/src/modules/lists/routes.ts +8 -0
  550. package/src/modules/lists/schema.ts +10 -0
  551. package/src/modules/lists/service.ts +110 -9
  552. package/src/modules/mcp/index.ts +5 -0
  553. package/src/modules/opportunities/index.ts +3 -1
  554. package/src/modules/opportunities/repository.ts +11 -0
  555. package/src/modules/opportunities/routes.ts +13 -0
  556. package/src/modules/opportunities/schema.ts +7 -1
  557. package/src/modules/opportunities/service.ts +188 -22
  558. package/src/modules/opportunities/tools.ts +2 -0
  559. package/src/modules/partnerships/index.ts +3 -1
  560. package/src/modules/partnerships/repository.ts +6 -117
  561. package/src/modules/partnerships/routes.ts +7 -0
  562. package/src/modules/partnerships/schema.ts +7 -14
  563. package/src/modules/partnerships/service.ts +93 -22
  564. package/src/modules/people/consentHydration.ts +167 -0
  565. package/src/modules/people/index.ts +3 -1
  566. package/src/modules/people/personConsentWrites.ts +177 -0
  567. package/src/modules/people/repository.ts +5 -0
  568. package/src/modules/people/routes.ts +127 -18
  569. package/src/modules/people/schema.ts +109 -3
  570. package/src/modules/people/service.ts +186 -40
  571. package/src/modules/people/tools.ts +5 -1
  572. package/src/modules/personLinks.ts +278 -0
  573. package/src/modules/raises/index.ts +3 -1
  574. package/src/modules/raises/repository.ts +6 -107
  575. package/src/modules/raises/routes.ts +7 -0
  576. package/src/modules/raises/schema.ts +7 -14
  577. package/src/modules/raises/service.ts +91 -20
  578. package/src/modules/recordTargets.ts +2 -0
  579. package/src/modules/references.ts +43 -4
  580. package/src/modules/sample-data/fixture.ts +63 -0
  581. package/src/modules/sample-data/index.ts +1 -0
  582. package/src/modules/sample-data/routes.ts +1 -0
  583. package/src/modules/sample-data/service.ts +97 -8
  584. package/src/modules/search/index.ts +2 -1
  585. package/src/modules/search/repository.ts +33 -1
  586. package/src/modules/search/service.ts +7 -5
  587. package/src/modules/stagedRecords.ts +18 -3
  588. package/src/modules/webhooks/payloads.ts +20 -2
  589. package/src/modules/workspace/repository.ts +12 -0
  590. package/src/modules/workspace/service.ts +14 -0
  591. package/src/modules/workspace/starters.ts +5 -0
  592. package/src/runtime/events.ts +1 -0
  593. package/src/schema/index.ts +3 -0
  594. package/src/testing/database.ts +97 -11
@@ -0,0 +1,43 @@
1
+ import { CUSTOM_FIELD_OBJECT_TYPES, CUSTOM_FIELD_TYPES } from '@kelpie/schemas';
2
+ import { index, integer, jsonb, pgTable, text, unique } from 'drizzle-orm/pg-core';
3
+ import { checkOneOf, createdAt, primaryId, updatedAt } from '../../lib/columns.js';
4
+ import { workspaces } from '../workspace/schema.js';
5
+ /**
6
+ * Workspace-defined field definitions for the six taggable record types.
7
+ *
8
+ * `key` and `type` are set at create and are immutable after: a rename would
9
+ * strand every record's value under an old key, and a type swap would leave the
10
+ * jsonb value in the wrong shape. The strict PATCH body naturally refuses
11
+ * either as a `422`.
12
+ *
13
+ * `options` is stored as jsonb rather than `text[]` so future option metadata
14
+ * (colours, an archived flag) can be added without a migration. Empty for every
15
+ * type but `select` and `multi_select`; the service enforces that half of the
16
+ * rule.
17
+ *
18
+ * Re-exports the two arrays so the routes layer reads them from here alongside
19
+ * the tables they constrain.
20
+ */
21
+ export { CUSTOM_FIELD_OBJECT_TYPES, CUSTOM_FIELD_TYPES } from '@kelpie/schemas';
22
+ export const customFieldDefinitions = pgTable('custom_field_definitions', {
23
+ id: primaryId(),
24
+ workspaceId: text('workspace_id')
25
+ .notNull()
26
+ .references(() => workspaces.id, { onDelete: 'cascade' }),
27
+ objectType: text('object_type').notNull(),
28
+ key: text('key').notNull(),
29
+ label: text('label').notNull(),
30
+ type: text('type').notNull(),
31
+ options: jsonb('options').$type().notNull().default([]),
32
+ description: text('description').notNull().default(''),
33
+ sortOrder: integer('sort_order').notNull(),
34
+ createdAt: createdAt(),
35
+ updatedAt: updatedAt(),
36
+ }, (table) => [
37
+ index('custom_field_definitions_workspace_idx').on(table.workspaceId),
38
+ index('custom_field_definitions_workspace_object_idx').on(table.workspaceId, table.objectType),
39
+ unique('custom_field_definitions_workspace_object_key_key').on(table.workspaceId, table.objectType, table.key),
40
+ checkOneOf('custom_field_definitions_object_type_check', table.objectType, CUSTOM_FIELD_OBJECT_TYPES),
41
+ checkOneOf('custom_field_definitions_type_check', table.type, CUSTOM_FIELD_TYPES),
42
+ ]);
43
+ //# sourceMappingURL=schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/modules/custom-fields/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAC/E,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAA;AAElF,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAA;AAClF,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAA;AAEnD;;;;;;;;;;;;;;;GAeG;AACH,OAAO,EAAE,yBAAyB,EAAE,kBAAkB,EAAE,MAAM,iBAAiB,CAAA;AAG/E,MAAM,CAAC,MAAM,sBAAsB,GAAG,OAAO,CAC3C,0BAA0B,EAC1B;IACE,EAAE,EAAE,SAAS,EAAE;IACf,WAAW,EAAE,IAAI,CAAC,cAAc,CAAC;SAC9B,OAAO,EAAE;SACT,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAC3D,UAAU,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE;IACzC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE;IAC1B,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE;IAC9B,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE;IAC5B,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC,KAAK,EAAqB,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IAC1E,WAAW,EAAE,IAAI,CAAC,aAAa,CAAC,CAAC,OAAO,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;IACtD,SAAS,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC,OAAO,EAAE;IAC1C,SAAS,EAAE,SAAS,EAAE;IACtB,SAAS,EAAE,SAAS,EAAE;CACvB,EACD,CAAC,KAAK,EAAE,EAAE,CAAC;IACT,KAAK,CAAC,wCAAwC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC;IACrE,KAAK,CAAC,+CAA+C,CAAC,CAAC,EAAE,CACvD,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,UAAU,CACjB;IACD,MAAM,CAAC,mDAAmD,CAAC,CAAC,EAAE,CAC5D,KAAK,CAAC,WAAW,EACjB,KAAK,CAAC,UAAU,EAChB,KAAK,CAAC,GAAG,CACV;IACD,UAAU,CACR,4CAA4C,EAC5C,KAAK,CAAC,UAAU,EAChB,yBAAyB,CAC1B;IACD,UAAU,CAAC,qCAAqC,EAAE,KAAK,CAAC,IAAI,EAAE,kBAAkB,CAAC;CAClF,CACF,CAAA"}
@@ -0,0 +1,57 @@
1
+ import type { Database } from '../../lib/database.ts';
2
+ import type { IdFactory } from '../../lib/ids.ts';
3
+ import type { ListQueryParameters, Page } from '../../lib/pagination.ts';
4
+ import type { EntitlementRegistry } from '../../runtime/entitlements.ts';
5
+ import type { TransactionScope } from '../../runtime/transaction.ts';
6
+ import type { Actor } from '../auth/actor.ts';
7
+ import './events.ts';
8
+ import type { CustomFieldDefinitionFilters, CustomFieldDefinitionRecord } from './repository.ts';
9
+ import type { CustomFieldObjectType, CustomFieldType } from './schema.ts';
10
+ /**
11
+ * Definition-side CRUD for custom fields.
12
+ *
13
+ * Reads are open to any workspace actor: agents that write values must be able
14
+ * to list definitions first, and detail pages fetch them for every viewer.
15
+ * Writes require the admin role, matching how API keys and webhooks are gated
16
+ * — a definition changes the shape of every record of one object type and is
17
+ * team-wide config, not a per-user preference.
18
+ *
19
+ * The record-side write path lives in `values.ts`: create/update pass their
20
+ * sent `custom_fields` through `createCustomFieldValues(...).forCreate` /
21
+ * `.forUpdate`, which reads definitions and enforces per-type validity.
22
+ */
23
+ /** Hard cap per (workspace, object_type). Bites when the entitlement leaves the count unlimited. */
24
+ export declare const CUSTOM_FIELDS_PER_OBJECT_HARD_CAP = 100;
25
+ export interface CustomFieldDefinitionsDependencies {
26
+ readonly db: Database;
27
+ readonly transaction: TransactionScope;
28
+ readonly createId: IdFactory;
29
+ readonly now: () => Date;
30
+ readonly entitlements: EntitlementRegistry;
31
+ }
32
+ /** The definition as the API returns it: the stored row minus the tenancy column. */
33
+ export type CustomFieldDefinitionView = Omit<CustomFieldDefinitionRecord, 'workspaceId'>;
34
+ export interface CreateCustomFieldDefinitionInput {
35
+ readonly objectType: CustomFieldObjectType;
36
+ readonly key: string;
37
+ readonly label: string;
38
+ readonly type: CustomFieldType;
39
+ readonly options: readonly string[];
40
+ readonly description: string;
41
+ }
42
+ /** PATCH semantics: `key`, `type`, `object_type` are immutable and refused by the route body. */
43
+ export interface UpdateCustomFieldDefinitionInput {
44
+ readonly label?: string | undefined;
45
+ readonly description?: string | undefined;
46
+ readonly options?: readonly string[] | undefined;
47
+ readonly sortOrder?: number | undefined;
48
+ }
49
+ export interface CustomFieldDefinitionsService {
50
+ list(actor: Actor, filters: CustomFieldDefinitionFilters, query: ListQueryParameters): Promise<Page<CustomFieldDefinitionView>>;
51
+ get(actor: Actor, id: string): Promise<CustomFieldDefinitionView>;
52
+ create(actor: Actor, input: CreateCustomFieldDefinitionInput): Promise<CustomFieldDefinitionView>;
53
+ update(actor: Actor, id: string, changes: UpdateCustomFieldDefinitionInput): Promise<CustomFieldDefinitionView>;
54
+ remove(actor: Actor, id: string): Promise<void>;
55
+ }
56
+ export declare function createCustomFieldDefinitionsService(dependencies: CustomFieldDefinitionsDependencies): CustomFieldDefinitionsService;
57
+ //# sourceMappingURL=service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../../src/modules/custom-fields/service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAA;AAErD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAA;AAEjD,OAAO,KAAK,EAAE,mBAAmB,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAA;AAExE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,+BAA+B,CAAA;AAExE,OAAO,KAAK,EAAe,gBAAgB,EAAE,MAAM,8BAA8B,CAAA;AACjF,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAA;AAI7C,OAAO,aAAa,CAAA;AAMpB,OAAO,KAAK,EACV,4BAA4B,EAC5B,2BAA2B,EAC5B,MAAM,iBAAiB,CAAA;AAExB,OAAO,KAAK,EAAE,qBAAqB,EAAE,eAAe,EAAE,MAAM,aAAa,CAAA;AAEzE;;;;;;;;;;;;GAYG;AAEH,oGAAoG;AACpG,eAAO,MAAM,iCAAiC,MAAM,CAAA;AAcpD,MAAM,WAAW,kCAAkC;IACjD,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAA;IACrB,QAAQ,CAAC,WAAW,EAAE,gBAAgB,CAAA;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,CAAA;IAC5B,QAAQ,CAAC,GAAG,EAAE,MAAM,IAAI,CAAA;IACxB,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAAA;CAC3C;AAED,qFAAqF;AACrF,MAAM,MAAM,yBAAyB,GAAG,IAAI,CAAC,2BAA2B,EAAE,aAAa,CAAC,CAAA;AAExF,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,UAAU,EAAE,qBAAqB,CAAA;IAC1C,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;IACtB,QAAQ,CAAC,IAAI,EAAE,eAAe,CAAA;IAC9B,QAAQ,CAAC,OAAO,EAAE,SAAS,MAAM,EAAE,CAAA;IACnC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,iGAAiG;AACjG,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACnC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,GAAG,SAAS,CAAA;IAChD,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CACxC;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,CACF,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,4BAA4B,EACrC,KAAK,EAAE,mBAAmB,GACzB,OAAO,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC,CAAA;IAC3C,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,yBAAyB,CAAC,CAAA;IACjE,MAAM,CACJ,KAAK,EAAE,KAAK,EACZ,KAAK,EAAE,gCAAgC,GACtC,OAAO,CAAC,yBAAyB,CAAC,CAAA;IACrC,MAAM,CACJ,KAAK,EAAE,KAAK,EACZ,EAAE,EAAE,MAAM,EACV,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,yBAAyB,CAAC,CAAA;IACrC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;CAChD;AA6ED,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,kCAAkC,GAC/C,6BAA6B,CAiQ/B"}
@@ -0,0 +1,273 @@
1
+ import { changedKeys } from '../../lib/changes.js';
2
+ import { UNIQUE_VIOLATION, postgresErrorCode } from '../../lib/database.js';
3
+ import { AppError } from '../../lib/errors.js';
4
+ import { mapPage, readListWindow, toPage } from '../../lib/pagination.js';
5
+ import { toEventActor } from '../../lib/actor.js';
6
+ import { limitFor } from '../../runtime/entitlements.js';
7
+ import { requireWorkspaceId } from '../auth/actor.js';
8
+ import { roleAllows } from '../workspace/roles.js';
9
+ import { CUSTOM_FIELDS_LIMIT } from './capabilities.js';
10
+ import './events.js';
11
+ import * as repository from './repository.js';
12
+ import { CUSTOM_FIELD_DEFINITION_SORTS, DEFAULT_CUSTOM_FIELD_DEFINITION_SORT, } from './repository.js';
13
+ import { CUSTOM_FIELD_OBJECT_TYPES } from './schema.js';
14
+ /**
15
+ * Definition-side CRUD for custom fields.
16
+ *
17
+ * Reads are open to any workspace actor: agents that write values must be able
18
+ * to list definitions first, and detail pages fetch them for every viewer.
19
+ * Writes require the admin role, matching how API keys and webhooks are gated
20
+ * — a definition changes the shape of every record of one object type and is
21
+ * team-wide config, not a per-user preference.
22
+ *
23
+ * The record-side write path lives in `values.ts`: create/update pass their
24
+ * sent `custom_fields` through `createCustomFieldValues(...).forCreate` /
25
+ * `.forUpdate`, which reads definitions and enforces per-type validity.
26
+ */
27
+ /** Hard cap per (workspace, object_type). Bites when the entitlement leaves the count unlimited. */
28
+ export const CUSTOM_FIELDS_PER_OBJECT_HARD_CAP = 100;
29
+ const KEY_PATTERN = /^[a-z][a-z0-9_]*$/u;
30
+ const MAX_KEY_LENGTH = 64;
31
+ const MAX_LABEL_LENGTH = 120;
32
+ const MIN_LABEL_LENGTH = 1;
33
+ const MAX_DESCRIPTION_LENGTH = 2000;
34
+ const MAX_OPTIONS = 100;
35
+ const MIN_OPTION_LENGTH = 1;
36
+ const MAX_OPTION_LENGTH = 120;
37
+ /** The wire types that require a non-empty `options`. */
38
+ const TYPES_WITH_OPTIONS = new Set(['select', 'multi_select']);
39
+ function toView(record) {
40
+ const { workspaceId: _workspaceId, ...view } = record;
41
+ return view;
42
+ }
43
+ function duplicateKey() {
44
+ return AppError.conflict('Another custom field on this object type already has that key', [{ field: 'key', message: 'Already in use' }]);
45
+ }
46
+ function fieldError(field, message) {
47
+ return AppError.validationFailed('That custom field is not valid', [{ field, message }]);
48
+ }
49
+ function validateKey(key) {
50
+ if (key.length === 0 || key.length > MAX_KEY_LENGTH) {
51
+ throw fieldError('key', `1 to ${String(MAX_KEY_LENGTH)} characters`);
52
+ }
53
+ if (!KEY_PATTERN.test(key)) {
54
+ throw fieldError('key', 'Lowercase letters, digits and underscores; must start with a letter');
55
+ }
56
+ }
57
+ function validateLabel(label) {
58
+ if (label.length < MIN_LABEL_LENGTH || label.length > MAX_LABEL_LENGTH) {
59
+ throw fieldError('label', `${String(MIN_LABEL_LENGTH)} to ${String(MAX_LABEL_LENGTH)} characters`);
60
+ }
61
+ }
62
+ function validateDescription(description) {
63
+ if (description.length > MAX_DESCRIPTION_LENGTH) {
64
+ throw fieldError('description', `At most ${String(MAX_DESCRIPTION_LENGTH)} characters`);
65
+ }
66
+ }
67
+ function validateOptionsFor(type, options) {
68
+ const requiresOptions = TYPES_WITH_OPTIONS.has(type);
69
+ if (!requiresOptions) {
70
+ if (options.length > 0) {
71
+ throw fieldError('options', 'Only select and multi_select fields carry options');
72
+ }
73
+ return;
74
+ }
75
+ if (options.length === 0) {
76
+ throw fieldError('options', 'Select fields need at least one option');
77
+ }
78
+ if (options.length > MAX_OPTIONS) {
79
+ throw fieldError('options', `At most ${String(MAX_OPTIONS)} options`);
80
+ }
81
+ const seen = new Set();
82
+ for (const option of options) {
83
+ if (option.length < MIN_OPTION_LENGTH || option.length > MAX_OPTION_LENGTH) {
84
+ throw fieldError('options', `Each option is ${String(MIN_OPTION_LENGTH)} to ${String(MAX_OPTION_LENGTH)} characters`);
85
+ }
86
+ if (seen.has(option)) {
87
+ throw fieldError('options', `"${option}" appears more than once`);
88
+ }
89
+ seen.add(option);
90
+ }
91
+ }
92
+ function assertObjectType(objectType) {
93
+ if (!CUSTOM_FIELD_OBJECT_TYPES.includes(objectType)) {
94
+ throw fieldError('object_type', `Unknown object type "${objectType}"`);
95
+ }
96
+ }
97
+ export function createCustomFieldDefinitionsService(dependencies) {
98
+ function requireAdminWorkspace(actor) {
99
+ const workspaceId = requireWorkspaceId(actor);
100
+ if (actor.role === null || !roleAllows(actor.role, 'admin')) {
101
+ throw new AppError('forbidden', 'This action needs the admin role');
102
+ }
103
+ return workspaceId;
104
+ }
105
+ async function require(workspaceId, id) {
106
+ const definition = await repository.findDefinition(dependencies.db, workspaceId, id);
107
+ if (definition === undefined) {
108
+ throw AppError.notFound('Custom field not found');
109
+ }
110
+ return definition;
111
+ }
112
+ /**
113
+ * Renumbers the sort_order of one object type's definitions to 0..N-1 in
114
+ * `order`, writing only the rows whose position moved. Mirrors the pipeline
115
+ * stage renumber pattern.
116
+ */
117
+ async function renumber(tx, workspaceId, order) {
118
+ for (const [index, definition] of order.entries()) {
119
+ if (definition.sortOrder !== index) {
120
+ await repository.updateDefinition(tx, workspaceId, definition.id, {
121
+ sortOrder: index,
122
+ updatedAt: dependencies.now(),
123
+ });
124
+ }
125
+ }
126
+ }
127
+ async function moveToPosition(tx, workspaceId, definition, position) {
128
+ const rows = await repository.definitionsForObject(tx, workspaceId, definition.objectType);
129
+ const target = rows.find((row) => row.id === definition.id);
130
+ if (target === undefined) {
131
+ throw AppError.notFound('Custom field not found');
132
+ }
133
+ if (position < 0 || position >= rows.length) {
134
+ throw fieldError('sort_order', `Use 0 to ${String(rows.length - 1)}`);
135
+ }
136
+ const reordered = rows.filter((row) => row.id !== definition.id);
137
+ reordered.splice(position, 0, target);
138
+ await renumber(tx, workspaceId, reordered);
139
+ }
140
+ return {
141
+ async list(actor, filters, query) {
142
+ const workspaceId = requireWorkspaceId(actor);
143
+ const window = readListWindow(query, CUSTOM_FIELD_DEFINITION_SORTS, DEFAULT_CUSTOM_FIELD_DEFINITION_SORT);
144
+ const rows = await repository.listDefinitions(dependencies.db, workspaceId, filters, window);
145
+ return mapPage(toPage(rows, window, (row) => row.id), toView);
146
+ },
147
+ async get(actor, id) {
148
+ return toView(await require(requireWorkspaceId(actor), id));
149
+ },
150
+ async create(actor, input) {
151
+ const workspaceId = requireAdminWorkspace(actor);
152
+ assertObjectType(input.objectType);
153
+ validateKey(input.key);
154
+ validateLabel(input.label);
155
+ validateDescription(input.description);
156
+ validateOptionsFor(input.type, input.options);
157
+ const limit = await limitFor(dependencies.entitlements, workspaceId, CUSTOM_FIELDS_LIMIT.name);
158
+ if (limit !== null) {
159
+ const total = await repository.countDefinitions(dependencies.db, workspaceId);
160
+ if (total >= limit) {
161
+ throw new AppError('entitlement_required', `Your plan allows ${String(limit)} custom field${limit === 1 ? '' : 's'}`);
162
+ }
163
+ }
164
+ const id = dependencies.createId('customFieldDefinition');
165
+ return dependencies.transaction(async ({ tx, events }) => {
166
+ const existing = await repository.definitionsForObject(tx, workspaceId, input.objectType);
167
+ if (existing.length >= CUSTOM_FIELDS_PER_OBJECT_HARD_CAP) {
168
+ throw AppError.conflict(`A record type may carry at most ${String(CUSTOM_FIELDS_PER_OBJECT_HARD_CAP)} custom fields`, [{ field: 'object_type', message: 'Limit reached' }]);
169
+ }
170
+ let created;
171
+ try {
172
+ created = await repository.insertDefinition(tx, {
173
+ id,
174
+ workspaceId,
175
+ objectType: input.objectType,
176
+ key: input.key,
177
+ label: input.label,
178
+ type: input.type,
179
+ options: input.options,
180
+ description: input.description,
181
+ sortOrder: (existing.at(-1)?.sortOrder ?? -1) + 1,
182
+ });
183
+ }
184
+ catch (error) {
185
+ if (postgresErrorCode(error) === UNIQUE_VIOLATION) {
186
+ throw duplicateKey();
187
+ }
188
+ throw error;
189
+ }
190
+ events.emit('custom_fields.field.created', { type: 'custom_field', id: created.id }, { objectType: created.objectType, key: created.key });
191
+ return toView(created);
192
+ }, { workspaceId, actor: toEventActor(actor) });
193
+ },
194
+ async update(actor, id, changes) {
195
+ const workspaceId = requireAdminWorkspace(actor);
196
+ const existing = await require(workspaceId, id);
197
+ if (changes.label !== undefined) {
198
+ validateLabel(changes.label);
199
+ }
200
+ if (changes.description !== undefined) {
201
+ validateDescription(changes.description);
202
+ }
203
+ if (changes.options !== undefined) {
204
+ validateOptionsFor(existing.type, changes.options);
205
+ }
206
+ const columns = {
207
+ ...(changes.label === undefined ? {} : { label: changes.label }),
208
+ ...(changes.description === undefined ? {} : { description: changes.description }),
209
+ ...(changes.options === undefined ? {} : { options: changes.options }),
210
+ };
211
+ const changed = changedKeys(existing, columns);
212
+ const position = changes.sortOrder;
213
+ if (changed.length === 0 && position === undefined) {
214
+ return toView(existing);
215
+ }
216
+ return dependencies.transaction(async ({ tx, events }) => {
217
+ if (position !== undefined) {
218
+ await moveToPosition(tx, workspaceId, existing, position);
219
+ }
220
+ let updated;
221
+ if (changed.length > 0) {
222
+ updated = await repository.updateDefinition(tx, workspaceId, id, {
223
+ ...columns,
224
+ updatedAt: dependencies.now(),
225
+ });
226
+ if (updated === undefined) {
227
+ throw AppError.notFound('Custom field not found');
228
+ }
229
+ }
230
+ else {
231
+ updated = await repository.findDefinition(tx, workspaceId, id);
232
+ if (updated === undefined) {
233
+ throw AppError.notFound('Custom field not found');
234
+ }
235
+ }
236
+ if (changed.length > 0 || position !== undefined) {
237
+ const changedPaths = [
238
+ ...changed,
239
+ ...(position !== undefined && position !== existing.sortOrder ? ['sortOrder'] : []),
240
+ ];
241
+ events.emit('custom_fields.field.updated', { type: 'custom_field', id }, {
242
+ objectType: updated.objectType,
243
+ key: updated.key,
244
+ changed: changedPaths,
245
+ });
246
+ }
247
+ return toView(updated);
248
+ }, { workspaceId, actor: toEventActor(actor) });
249
+ },
250
+ async remove(actor, id) {
251
+ const workspaceId = requireAdminWorkspace(actor);
252
+ const existing = await require(workspaceId, id);
253
+ await dependencies.transaction(async ({ tx, events }) => {
254
+ const stripped = await repository.stripKeyFromRecords(tx, workspaceId, existing.objectType, existing.key);
255
+ await repository.deleteDefinition(tx, workspaceId, id);
256
+ // Renumber survivors so `sort_order` stays contiguous, same as the
257
+ // pipelines remove path.
258
+ const survivors = await repository.definitionsForObject(tx, workspaceId, existing.objectType);
259
+ await renumber(tx, workspaceId, survivors);
260
+ // No per-record `<object>.updated` events for the strip: a definition
261
+ // delete may touch thousands of rows and would flood every webhook
262
+ // subscriber. The `custom_fields.field.deleted` event carries the
263
+ // count for a consumer that wants to know how many rows were touched.
264
+ events.emit('custom_fields.field.deleted', { type: 'custom_field', id }, {
265
+ objectType: existing.objectType,
266
+ key: existing.key,
267
+ strippedRecordCount: stripped,
268
+ });
269
+ }, { workspaceId, actor: toEventActor(actor) });
270
+ },
271
+ };
272
+ }
273
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../../src/modules/custom-fields/service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import type { McpToolRegistry } from '../../runtime/module.ts';
2
+ import type { CustomFieldDefinitionsService } from './service.ts';
3
+ export declare function registerCustomFieldsTools(mcp: McpToolRegistry, service: CustomFieldDefinitionsService): void;
4
+ //# sourceMappingURL=tools.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.d.ts","sourceRoot":"","sources":["../../../src/modules/custom-fields/tools.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAA;AAU9D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAA;AAqBjE,wBAAgB,yBAAyB,CACvC,GAAG,EAAE,eAAe,EACpB,OAAO,EAAE,6BAA6B,GACrC,IAAI,CAgBN"}
@@ -0,0 +1,38 @@
1
+ import { z } from 'zod';
2
+ import { idArg, listWindowShape, registerCrudTools, termArg } from '../crudTools.js';
3
+ import { createBody, customFieldDefinitionResponse, toCreateInput, toUpdateInput, updateBody, } from './routes.js';
4
+ import { CUSTOM_FIELD_OBJECT_TYPES } from './schema.js';
5
+ /**
6
+ * `custom_fields_*`. Same schemas and mappers as `/v1/custom_fields`, so the
7
+ * REST surface and the MCP one cannot drift.
8
+ *
9
+ * The record-side tools (`deals_update`, `people_update`, …) pick up
10
+ * `custom_fields` automatically through `registerCrudTools` reusing each
11
+ * module's route bodies — see the `custom_fields` field on those bodies. The
12
+ * schema's `.describe()` tells an agent to list definitions first.
13
+ */
14
+ const listArgs = z.strictObject({
15
+ ...listWindowShape,
16
+ q: termArg,
17
+ object_type: z
18
+ .enum(CUSTOM_FIELD_OBJECT_TYPES)
19
+ .optional()
20
+ .describe('Only definitions for this record type.'),
21
+ });
22
+ export function registerCustomFieldsTools(mcp, service) {
23
+ registerCrudTools(mcp, {
24
+ resource: 'custom_fields',
25
+ subject: 'custom field',
26
+ about: 'A workspace-defined field on a record type. Read these before writing values in a ' +
27
+ 'record create or update: a value is only accepted if it matches a definition here.',
28
+ service,
29
+ render: customFieldDefinitionResponse,
30
+ listArgs,
31
+ toFilters: (args) => ({ term: args.q, objectType: args.object_type }),
32
+ createArgs: createBody,
33
+ toCreateInput,
34
+ updateArgs: updateBody.extend({ id: idArg }),
35
+ toUpdateInput,
36
+ });
37
+ }
38
+ //# sourceMappingURL=tools.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tools.js","sourceRoot":"","sources":["../../../src/modules/custom-fields/tools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAGvB,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,iBAAiB,EAAE,OAAO,EAAE,MAAM,iBAAiB,CAAA;AACpF,OAAO,EACL,UAAU,EACV,6BAA6B,EAC7B,aAAa,EACb,aAAa,EACb,UAAU,GACX,MAAM,aAAa,CAAA;AACpB,OAAO,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAA;AAGvD;;;;;;;;GAQG;AAEH,MAAM,QAAQ,GAAG,CAAC,CAAC,YAAY,CAAC;IAC9B,GAAG,eAAe;IAClB,CAAC,EAAE,OAAO;IACV,WAAW,EAAE,CAAC;SACX,IAAI,CAAC,yBAAyB,CAAC;SAC/B,QAAQ,EAAE;SACV,QAAQ,CAAC,wCAAwC,CAAC;CACtD,CAAC,CAAA;AAEF,MAAM,UAAU,yBAAyB,CACvC,GAAoB,EACpB,OAAsC;IAEtC,iBAAiB,CAAC,GAAG,EAAE;QACrB,QAAQ,EAAE,eAAe;QACzB,OAAO,EAAE,cAAc;QACvB,KAAK,EACH,oFAAoF;YACpF,oFAAoF;QACtF,OAAO;QACP,MAAM,EAAE,6BAA6B;QACrC,QAAQ;QACR,SAAS,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,EAAE,UAAU,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QACrE,UAAU,EAAE,UAAU;QACtB,aAAa;QACb,UAAU,EAAE,UAAU,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC;QAC5C,aAAa;KACd,CAAC,CAAA;AACJ,CAAC"}
@@ -0,0 +1,49 @@
1
+ import type { CustomFieldValue, CustomFieldWireValue } from '@kelpie/schemas';
2
+ import { AppError } from '../../lib/errors.ts';
3
+ import type { ErrorDetail } from '../../lib/errors.ts';
4
+ import type { Queryable } from '../../runtime/transaction.ts';
5
+ import type { CustomFieldObjectType } from './schema.ts';
6
+ /** The stored jsonb value for one custom field, as the record carries it. */
7
+ export type StoredCustomFieldValue = CustomFieldValue;
8
+ /** The result of merging a `PATCH` into the stored `custom_fields` object. */
9
+ export interface CustomFieldsMerge {
10
+ /** The whole custom_fields object to write, with keys sorted for stable diffs. */
11
+ readonly merged: Readonly<Record<string, StoredCustomFieldValue>>;
12
+ /** Per-key change paths, `customFields.<key>`, for the `.updated` event's `changed`. */
13
+ readonly changedPaths: readonly string[];
14
+ /** Definition labels for the keys that changed, keyed by their `customFields.<key>` path. */
15
+ readonly labels: Readonly<Record<string, string>>;
16
+ /** Flat before-values for `describeUpdate`, keyed by `customFields.<key>`. */
17
+ readonly flatBefore: Readonly<Record<string, StoredCustomFieldValue | undefined>>;
18
+ /** Flat after-values for `describeUpdate`, keyed by `customFields.<key>`. */
19
+ readonly flatAfter: Readonly<Record<string, StoredCustomFieldValue | undefined>>;
20
+ }
21
+ export interface CustomFieldValuesDependencies {
22
+ readonly db: Queryable;
23
+ }
24
+ export interface CustomFieldValuesValidator {
25
+ /**
26
+ * Validates and normalises the `custom_fields` a record is being created with.
27
+ * `null` keys are ignored. Missing keys are simply absent from the result.
28
+ */
29
+ forCreate(tx: Queryable, workspaceId: string, objectType: CustomFieldObjectType, sent: Readonly<Record<string, CustomFieldWireValue | null>> | undefined): Promise<Readonly<Record<string, StoredCustomFieldValue>>>;
30
+ /**
31
+ * Merges a `PATCH` into the stored `custom_fields`, validating every sent
32
+ * key against the workspace's definitions. `null` clears a key. An unknown
33
+ * key is `422`.
34
+ */
35
+ forUpdate(tx: Queryable, workspaceId: string, objectType: CustomFieldObjectType, stored: Readonly<Record<string, StoredCustomFieldValue>>, sent: Readonly<Record<string, CustomFieldWireValue | null>> | undefined): Promise<CustomFieldsMerge | undefined>;
36
+ }
37
+ export declare function createCustomFieldValues(_dependencies: CustomFieldValuesDependencies): CustomFieldValuesValidator;
38
+ /**
39
+ * Rebuilds the object with keys in sorted order.
40
+ *
41
+ * `changedKeys` in `lib/changes.ts` compares by `JSON.stringify`, so two
42
+ * objects with the same entries but different insertion order would look
43
+ * different. Every stored write and every diffed comparison passes through
44
+ * this so the two agree.
45
+ */
46
+ export declare function normaliseCustomFields(values: Readonly<Record<string, StoredCustomFieldValue>>): Readonly<Record<string, StoredCustomFieldValue>>;
47
+ /** Collects one detail-list from several field-level rejections. Unused today; kept for future bulk validators. */
48
+ export declare function collectDetails(errors: readonly AppError[]): readonly ErrorDetail[];
49
+ //# sourceMappingURL=values.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"values.d.ts","sourceRoot":"","sources":["../../../src/modules/custom-fields/values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAA;AAE7E,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAA;AAC9C,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAA;AACtD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAA;AAG7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAA;AAoBxD,6EAA6E;AAC7E,MAAM,MAAM,sBAAsB,GAAG,gBAAgB,CAAA;AAErD,8EAA8E;AAC9E,MAAM,WAAW,iBAAiB;IAChC,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAA;IACjE,wFAAwF;IACxF,QAAQ,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,CAAA;IACxC,6FAA6F;IAC7F,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IACjD,8EAA8E;IAC9E,QAAQ,CAAC,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC,CAAA;IACjF,6EAA6E;IAC7E,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,GAAG,SAAS,CAAC,CAAC,CAAA;CACjF;AAED,MAAM,WAAW,6BAA6B;IAC5C,QAAQ,CAAC,EAAE,EAAE,SAAS,CAAA;CACvB;AAED,MAAM,WAAW,0BAA0B;IACzC;;;OAGG;IACH,SAAS,CACP,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,qBAAqB,EACjC,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,GACtE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAAC,CAAA;IAE5D;;;;OAIG;IACH,SAAS,CACP,EAAE,EAAE,SAAS,EACb,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,qBAAqB,EACjC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,EACxD,IAAI,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,oBAAoB,GAAG,IAAI,CAAC,CAAC,GAAG,SAAS,GACtE,OAAO,CAAC,iBAAiB,GAAG,SAAS,CAAC,CAAA;CAC1C;AAED,wBAAgB,uBAAuB,CACrC,aAAa,EAAE,6BAA6B,GAC3C,0BAA0B,CAgF5B;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,GACvD,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAMlD;AA8KD,mHAAmH;AACnH,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,GAAG,SAAS,WAAW,EAAE,CAElF"}