@jini-ai/cms 0.1.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 (527) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +84 -0
  3. package/dist/content-types/agent-tools.d.ts +65 -0
  4. package/dist/content-types/agent-tools.d.ts.map +1 -0
  5. package/dist/content-types/agent-tools.js +172 -0
  6. package/dist/content-types/agent-tools.js.map +1 -0
  7. package/dist/content-types/cleanup.d.ts +118 -0
  8. package/dist/content-types/cleanup.d.ts.map +1 -0
  9. package/dist/content-types/cleanup.js +65 -0
  10. package/dist/content-types/cleanup.js.map +1 -0
  11. package/dist/content-types/errors.d.ts +90 -0
  12. package/dist/content-types/errors.d.ts.map +1 -0
  13. package/dist/content-types/errors.js +119 -0
  14. package/dist/content-types/errors.js.map +1 -0
  15. package/dist/content-types/field-defs.d.ts +25 -0
  16. package/dist/content-types/field-defs.d.ts.map +1 -0
  17. package/dist/content-types/field-defs.js +155 -0
  18. package/dist/content-types/field-defs.js.map +1 -0
  19. package/dist/content-types/index-provisioning.d.ts +94 -0
  20. package/dist/content-types/index-provisioning.d.ts.map +1 -0
  21. package/dist/content-types/index-provisioning.js +133 -0
  22. package/dist/content-types/index-provisioning.js.map +1 -0
  23. package/dist/content-types/index.d.ts +63 -0
  24. package/dist/content-types/index.d.ts.map +1 -0
  25. package/dist/content-types/index.js +36 -0
  26. package/dist/content-types/index.js.map +1 -0
  27. package/dist/content-types/lifecycle-dispatch.d.ts +38 -0
  28. package/dist/content-types/lifecycle-dispatch.d.ts.map +1 -0
  29. package/dist/content-types/lifecycle-dispatch.js +28 -0
  30. package/dist/content-types/lifecycle-dispatch.js.map +1 -0
  31. package/dist/content-types/lifecycle.d.ts +104 -0
  32. package/dist/content-types/lifecycle.d.ts.map +1 -0
  33. package/dist/content-types/lifecycle.js +143 -0
  34. package/dist/content-types/lifecycle.js.map +1 -0
  35. package/dist/content-types/list.d.ts +44 -0
  36. package/dist/content-types/list.d.ts.map +1 -0
  37. package/dist/content-types/list.js +13 -0
  38. package/dist/content-types/list.js.map +1 -0
  39. package/dist/content-types/repo.memory.d.ts +72 -0
  40. package/dist/content-types/repo.memory.d.ts.map +1 -0
  41. package/dist/content-types/repo.memory.js +71 -0
  42. package/dist/content-types/repo.memory.js.map +1 -0
  43. package/dist/content-types/tool-registrations.d.ts +65 -0
  44. package/dist/content-types/tool-registrations.d.ts.map +1 -0
  45. package/dist/content-types/tool-registrations.js +180 -0
  46. package/dist/content-types/tool-registrations.js.map +1 -0
  47. package/dist/content-types/types.d.ts +78 -0
  48. package/dist/content-types/types.d.ts.map +1 -0
  49. package/dist/content-types/types.js +32 -0
  50. package/dist/content-types/types.js.map +1 -0
  51. package/dist/content-types/write-service.d.ts +141 -0
  52. package/dist/content-types/write-service.d.ts.map +1 -0
  53. package/dist/content-types/write-service.js +180 -0
  54. package/dist/content-types/write-service.js.map +1 -0
  55. package/dist/core/commands/change-set.d.ts +98 -0
  56. package/dist/core/commands/change-set.d.ts.map +1 -0
  57. package/dist/core/commands/change-set.js +2 -0
  58. package/dist/core/commands/change-set.js.map +1 -0
  59. package/dist/core/commands/command.d.ts +168 -0
  60. package/dist/core/commands/command.d.ts.map +1 -0
  61. package/dist/core/commands/command.js +173 -0
  62. package/dist/core/commands/command.js.map +1 -0
  63. package/dist/core/index.d.ts +45 -0
  64. package/dist/core/index.d.ts.map +1 -0
  65. package/dist/core/index.js +43 -0
  66. package/dist/core/index.js.map +1 -0
  67. package/dist/core/ports.d.ts +139 -0
  68. package/dist/core/ports.d.ts.map +1 -0
  69. package/dist/core/ports.js +2 -0
  70. package/dist/core/ports.js.map +1 -0
  71. package/dist/core/tools/registration-kit.d.ts +308 -0
  72. package/dist/core/tools/registration-kit.d.ts.map +1 -0
  73. package/dist/core/tools/registration-kit.js +381 -0
  74. package/dist/core/tools/registration-kit.js.map +1 -0
  75. package/dist/entries/agent-tools.d.ts +78 -0
  76. package/dist/entries/agent-tools.d.ts.map +1 -0
  77. package/dist/entries/agent-tools.js +158 -0
  78. package/dist/entries/agent-tools.js.map +1 -0
  79. package/dist/entries/errors.d.ts +43 -0
  80. package/dist/entries/errors.d.ts.map +1 -0
  81. package/dist/entries/errors.js +59 -0
  82. package/dist/entries/errors.js.map +1 -0
  83. package/dist/entries/field-validation.d.ts +70 -0
  84. package/dist/entries/field-validation.d.ts.map +1 -0
  85. package/dist/entries/field-validation.js +87 -0
  86. package/dist/entries/field-validation.js.map +1 -0
  87. package/dist/entries/index.d.ts +55 -0
  88. package/dist/entries/index.d.ts.map +1 -0
  89. package/dist/entries/index.js +38 -0
  90. package/dist/entries/index.js.map +1 -0
  91. package/dist/entries/lifecycle-dispatch.d.ts +15 -0
  92. package/dist/entries/lifecycle-dispatch.d.ts.map +1 -0
  93. package/dist/entries/lifecycle-dispatch.js +16 -0
  94. package/dist/entries/lifecycle-dispatch.js.map +1 -0
  95. package/dist/entries/list.d.ts +47 -0
  96. package/dist/entries/list.d.ts.map +1 -0
  97. package/dist/entries/list.js +12 -0
  98. package/dist/entries/list.js.map +1 -0
  99. package/dist/entries/repo.memory.d.ts +64 -0
  100. package/dist/entries/repo.memory.d.ts.map +1 -0
  101. package/dist/entries/repo.memory.js +73 -0
  102. package/dist/entries/repo.memory.js.map +1 -0
  103. package/dist/entries/tool-registrations.d.ts +52 -0
  104. package/dist/entries/tool-registrations.d.ts.map +1 -0
  105. package/dist/entries/tool-registrations.js +141 -0
  106. package/dist/entries/tool-registrations.js.map +1 -0
  107. package/dist/entries/types.d.ts +55 -0
  108. package/dist/entries/types.d.ts.map +1 -0
  109. package/dist/entries/types.js +2 -0
  110. package/dist/entries/types.js.map +1 -0
  111. package/dist/entries/write-service.d.ts +202 -0
  112. package/dist/entries/write-service.d.ts.map +1 -0
  113. package/dist/entries/write-service.js +204 -0
  114. package/dist/entries/write-service.js.map +1 -0
  115. package/dist/identity/admin-crud-service.d.ts +252 -0
  116. package/dist/identity/admin-crud-service.d.ts.map +1 -0
  117. package/dist/identity/admin-crud-service.js +437 -0
  118. package/dist/identity/admin-crud-service.js.map +1 -0
  119. package/dist/identity/agent-tool-input.d.ts +58 -0
  120. package/dist/identity/agent-tool-input.d.ts.map +1 -0
  121. package/dist/identity/agent-tool-input.js +126 -0
  122. package/dist/identity/agent-tool-input.js.map +1 -0
  123. package/dist/identity/agent-tools.d.ts +101 -0
  124. package/dist/identity/agent-tools.d.ts.map +1 -0
  125. package/dist/identity/agent-tools.js +290 -0
  126. package/dist/identity/agent-tools.js.map +1 -0
  127. package/dist/identity/auth-service.d.ts +87 -0
  128. package/dist/identity/auth-service.d.ts.map +1 -0
  129. package/dist/identity/auth-service.js +141 -0
  130. package/dist/identity/auth-service.js.map +1 -0
  131. package/dist/identity/authorize.d.ts +90 -0
  132. package/dist/identity/authorize.d.ts.map +1 -0
  133. package/dist/identity/authorize.js +94 -0
  134. package/dist/identity/authorize.js.map +1 -0
  135. package/dist/identity/grant-service.d.ts +198 -0
  136. package/dist/identity/grant-service.d.ts.map +1 -0
  137. package/dist/identity/grant-service.js +361 -0
  138. package/dist/identity/grant-service.js.map +1 -0
  139. package/dist/identity/hasher.d.ts +39 -0
  140. package/dist/identity/hasher.d.ts.map +1 -0
  141. package/dist/identity/hasher.js +39 -0
  142. package/dist/identity/hasher.js.map +1 -0
  143. package/dist/identity/index.d.ts +59 -0
  144. package/dist/identity/index.d.ts.map +1 -0
  145. package/dist/identity/index.js +51 -0
  146. package/dist/identity/index.js.map +1 -0
  147. package/dist/identity/password-policy.d.ts +58 -0
  148. package/dist/identity/password-policy.d.ts.map +1 -0
  149. package/dist/identity/password-policy.js +67 -0
  150. package/dist/identity/password-policy.js.map +1 -0
  151. package/dist/identity/permission-migrations.d.ts +86 -0
  152. package/dist/identity/permission-migrations.d.ts.map +1 -0
  153. package/dist/identity/permission-migrations.js +67 -0
  154. package/dist/identity/permission-migrations.js.map +1 -0
  155. package/dist/identity/permissions.d.ts +35 -0
  156. package/dist/identity/permissions.d.ts.map +1 -0
  157. package/dist/identity/permissions.js +603 -0
  158. package/dist/identity/permissions.js.map +1 -0
  159. package/dist/identity/ports.d.ts +201 -0
  160. package/dist/identity/ports.d.ts.map +1 -0
  161. package/dist/identity/ports.js +2 -0
  162. package/dist/identity/ports.js.map +1 -0
  163. package/dist/identity/repo.memory.d.ts +164 -0
  164. package/dist/identity/repo.memory.d.ts.map +1 -0
  165. package/dist/identity/repo.memory.js +224 -0
  166. package/dist/identity/repo.memory.js.map +1 -0
  167. package/dist/identity/seed.d.ts +42 -0
  168. package/dist/identity/seed.d.ts.map +1 -0
  169. package/dist/identity/seed.js +277 -0
  170. package/dist/identity/seed.js.map +1 -0
  171. package/dist/identity/tool-registrations.d.ts +50 -0
  172. package/dist/identity/tool-registrations.d.ts.map +1 -0
  173. package/dist/identity/tool-registrations.js +419 -0
  174. package/dist/identity/tool-registrations.js.map +1 -0
  175. package/dist/identity/types.d.ts +185 -0
  176. package/dist/identity/types.d.ts.map +1 -0
  177. package/dist/identity/types.js +64 -0
  178. package/dist/identity/types.js.map +1 -0
  179. package/dist/identity/username.d.ts +12 -0
  180. package/dist/identity/username.d.ts.map +1 -0
  181. package/dist/identity/username.js +14 -0
  182. package/dist/identity/username.js.map +1 -0
  183. package/dist/media/agent-tools.d.ts +66 -0
  184. package/dist/media/agent-tools.d.ts.map +1 -0
  185. package/dist/media/agent-tools.js +131 -0
  186. package/dist/media/agent-tools.js.map +1 -0
  187. package/dist/media/blob-gc-lock.d.ts +37 -0
  188. package/dist/media/blob-gc-lock.d.ts.map +1 -0
  189. package/dist/media/blob-gc-lock.js +55 -0
  190. package/dist/media/blob-gc-lock.js.map +1 -0
  191. package/dist/media/blob-gc.d.ts +246 -0
  192. package/dist/media/blob-gc.d.ts.map +1 -0
  193. package/dist/media/blob-gc.js +254 -0
  194. package/dist/media/blob-gc.js.map +1 -0
  195. package/dist/media/blob-key.d.ts +28 -0
  196. package/dist/media/blob-key.d.ts.map +1 -0
  197. package/dist/media/blob-key.js +11 -0
  198. package/dist/media/blob-key.js.map +1 -0
  199. package/dist/media/blob-store.fs.d.ts +23 -0
  200. package/dist/media/blob-store.fs.d.ts.map +1 -0
  201. package/dist/media/blob-store.fs.js +48 -0
  202. package/dist/media/blob-store.fs.js.map +1 -0
  203. package/dist/media/blob-store.memory.d.ts +22 -0
  204. package/dist/media/blob-store.memory.d.ts.map +1 -0
  205. package/dist/media/blob-store.memory.js +23 -0
  206. package/dist/media/blob-store.memory.js.map +1 -0
  207. package/dist/media/content-type-sniffer.d.ts +49 -0
  208. package/dist/media/content-type-sniffer.d.ts.map +1 -0
  209. package/dist/media/content-type-sniffer.js +141 -0
  210. package/dist/media/content-type-sniffer.js.map +1 -0
  211. package/dist/media/image-transformer.d.ts +45 -0
  212. package/dist/media/image-transformer.d.ts.map +1 -0
  213. package/dist/media/image-transformer.js +23 -0
  214. package/dist/media/image-transformer.js.map +1 -0
  215. package/dist/media/image-transformer.sharp.d.ts +26 -0
  216. package/dist/media/image-transformer.sharp.d.ts.map +1 -0
  217. package/dist/media/image-transformer.sharp.js +91 -0
  218. package/dist/media/image-transformer.sharp.js.map +1 -0
  219. package/dist/media/index.d.ts +43 -0
  220. package/dist/media/index.d.ts.map +1 -0
  221. package/dist/media/index.js +31 -0
  222. package/dist/media/index.js.map +1 -0
  223. package/dist/media/media-service.d.ts +244 -0
  224. package/dist/media/media-service.d.ts.map +1 -0
  225. package/dist/media/media-service.js +345 -0
  226. package/dist/media/media-service.js.map +1 -0
  227. package/dist/media/ports.d.ts +142 -0
  228. package/dist/media/ports.d.ts.map +1 -0
  229. package/dist/media/ports.js +2 -0
  230. package/dist/media/ports.js.map +1 -0
  231. package/dist/media/rendition-service.d.ts +66 -0
  232. package/dist/media/rendition-service.d.ts.map +1 -0
  233. package/dist/media/rendition-service.js +135 -0
  234. package/dist/media/rendition-service.js.map +1 -0
  235. package/dist/media/repo.memory.d.ts +107 -0
  236. package/dist/media/repo.memory.d.ts.map +1 -0
  237. package/dist/media/repo.memory.js +131 -0
  238. package/dist/media/repo.memory.js.map +1 -0
  239. package/dist/media/tool-registrations.d.ts +42 -0
  240. package/dist/media/tool-registrations.d.ts.map +1 -0
  241. package/dist/media/tool-registrations.js +121 -0
  242. package/dist/media/tool-registrations.js.map +1 -0
  243. package/dist/media/transform-lock.d.ts +36 -0
  244. package/dist/media/transform-lock.d.ts.map +1 -0
  245. package/dist/media/transform-lock.js +50 -0
  246. package/dist/media/transform-lock.js.map +1 -0
  247. package/dist/media/transform-registry.d.ts +103 -0
  248. package/dist/media/transform-registry.d.ts.map +1 -0
  249. package/dist/media/transform-registry.js +87 -0
  250. package/dist/media/transform-registry.js.map +1 -0
  251. package/dist/media/transform-types.d.ts +82 -0
  252. package/dist/media/transform-types.d.ts.map +1 -0
  253. package/dist/media/transform-types.js +47 -0
  254. package/dist/media/transform-types.js.map +1 -0
  255. package/dist/media/types.d.ts +150 -0
  256. package/dist/media/types.d.ts.map +1 -0
  257. package/dist/media/types.js +26 -0
  258. package/dist/media/types.js.map +1 -0
  259. package/dist/navigation/agent-tools.d.ts +90 -0
  260. package/dist/navigation/agent-tools.d.ts.map +1 -0
  261. package/dist/navigation/agent-tools.js +225 -0
  262. package/dist/navigation/agent-tools.js.map +1 -0
  263. package/dist/navigation/contracts.d.ts +98 -0
  264. package/dist/navigation/contracts.d.ts.map +1 -0
  265. package/dist/navigation/contracts.js +70 -0
  266. package/dist/navigation/contracts.js.map +1 -0
  267. package/dist/navigation/index.d.ts +39 -0
  268. package/dist/navigation/index.d.ts.map +1 -0
  269. package/dist/navigation/index.js +30 -0
  270. package/dist/navigation/index.js.map +1 -0
  271. package/dist/navigation/menu-service.d.ts +256 -0
  272. package/dist/navigation/menu-service.d.ts.map +1 -0
  273. package/dist/navigation/menu-service.js +382 -0
  274. package/dist/navigation/menu-service.js.map +1 -0
  275. package/dist/navigation/ports.d.ts +147 -0
  276. package/dist/navigation/ports.d.ts.map +1 -0
  277. package/dist/navigation/ports.js +2 -0
  278. package/dist/navigation/ports.js.map +1 -0
  279. package/dist/navigation/read-model.d.ts +11 -0
  280. package/dist/navigation/read-model.d.ts.map +1 -0
  281. package/dist/navigation/read-model.js +27 -0
  282. package/dist/navigation/read-model.js.map +1 -0
  283. package/dist/navigation/reconcile.d.ts +57 -0
  284. package/dist/navigation/reconcile.d.ts.map +1 -0
  285. package/dist/navigation/reconcile.js +33 -0
  286. package/dist/navigation/reconcile.js.map +1 -0
  287. package/dist/navigation/repo.memory.d.ts +137 -0
  288. package/dist/navigation/repo.memory.d.ts.map +1 -0
  289. package/dist/navigation/repo.memory.js +95 -0
  290. package/dist/navigation/repo.memory.js.map +1 -0
  291. package/dist/navigation/resolver.d.ts +110 -0
  292. package/dist/navigation/resolver.d.ts.map +1 -0
  293. package/dist/navigation/resolver.js +131 -0
  294. package/dist/navigation/resolver.js.map +1 -0
  295. package/dist/navigation/tool-registrations.d.ts +43 -0
  296. package/dist/navigation/tool-registrations.d.ts.map +1 -0
  297. package/dist/navigation/tool-registrations.js +126 -0
  298. package/dist/navigation/tool-registrations.js.map +1 -0
  299. package/dist/navigation/types.d.ts +207 -0
  300. package/dist/navigation/types.d.ts.map +1 -0
  301. package/dist/navigation/types.js +14 -0
  302. package/dist/navigation/types.js.map +1 -0
  303. package/dist/presentation/index.d.ts +15 -0
  304. package/dist/presentation/index.d.ts.map +1 -0
  305. package/dist/presentation/index.js +15 -0
  306. package/dist/presentation/index.js.map +1 -0
  307. package/dist/presentation/presentation.d.ts +72 -0
  308. package/dist/presentation/presentation.d.ts.map +1 -0
  309. package/dist/presentation/presentation.js +51 -0
  310. package/dist/presentation/presentation.js.map +1 -0
  311. package/dist/presentation/repo.memory.d.ts +9 -0
  312. package/dist/presentation/repo.memory.d.ts.map +1 -0
  313. package/dist/presentation/repo.memory.js +21 -0
  314. package/dist/presentation/repo.memory.js.map +1 -0
  315. package/dist/server/index.d.ts +28 -0
  316. package/dist/server/index.d.ts.map +1 -0
  317. package/dist/server/index.js +28 -0
  318. package/dist/server/index.js.map +1 -0
  319. package/dist/settings/agent-tools.d.ts +83 -0
  320. package/dist/settings/agent-tools.d.ts.map +1 -0
  321. package/dist/settings/agent-tools.js +200 -0
  322. package/dist/settings/agent-tools.js.map +1 -0
  323. package/dist/settings/agent-writable-preferences.d.ts +67 -0
  324. package/dist/settings/agent-writable-preferences.d.ts.map +1 -0
  325. package/dist/settings/agent-writable-preferences.js +144 -0
  326. package/dist/settings/agent-writable-preferences.js.map +1 -0
  327. package/dist/settings/change-feed.d.ts +74 -0
  328. package/dist/settings/change-feed.d.ts.map +1 -0
  329. package/dist/settings/change-feed.js +61 -0
  330. package/dist/settings/change-feed.js.map +1 -0
  331. package/dist/settings/definitions-dispatch.d.ts +51 -0
  332. package/dist/settings/definitions-dispatch.d.ts.map +1 -0
  333. package/dist/settings/definitions-dispatch.js +86 -0
  334. package/dist/settings/definitions-dispatch.js.map +1 -0
  335. package/dist/settings/dictionaries/index.d.ts +45 -0
  336. package/dist/settings/dictionaries/index.d.ts.map +1 -0
  337. package/dist/settings/dictionaries/index.js +69 -0
  338. package/dist/settings/dictionaries/index.js.map +1 -0
  339. package/dist/settings/dictionaries/settings-dialog.ar.d.ts +3 -0
  340. package/dist/settings/dictionaries/settings-dialog.ar.d.ts.map +1 -0
  341. package/dist/settings/dictionaries/settings-dialog.ar.js +28 -0
  342. package/dist/settings/dictionaries/settings-dialog.ar.js.map +1 -0
  343. package/dist/settings/dictionaries/settings-dialog.bn.d.ts +3 -0
  344. package/dist/settings/dictionaries/settings-dialog.bn.d.ts.map +1 -0
  345. package/dist/settings/dictionaries/settings-dialog.bn.js +28 -0
  346. package/dist/settings/dictionaries/settings-dialog.bn.js.map +1 -0
  347. package/dist/settings/dictionaries/settings-dialog.de.d.ts +3 -0
  348. package/dist/settings/dictionaries/settings-dialog.de.d.ts.map +1 -0
  349. package/dist/settings/dictionaries/settings-dialog.de.js +28 -0
  350. package/dist/settings/dictionaries/settings-dialog.de.js.map +1 -0
  351. package/dist/settings/dictionaries/settings-dialog.es.d.ts +3 -0
  352. package/dist/settings/dictionaries/settings-dialog.es.d.ts.map +1 -0
  353. package/dist/settings/dictionaries/settings-dialog.es.js +28 -0
  354. package/dist/settings/dictionaries/settings-dialog.es.js.map +1 -0
  355. package/dist/settings/dictionaries/settings-dialog.fa.d.ts +3 -0
  356. package/dist/settings/dictionaries/settings-dialog.fa.d.ts.map +1 -0
  357. package/dist/settings/dictionaries/settings-dialog.fa.js +28 -0
  358. package/dist/settings/dictionaries/settings-dialog.fa.js.map +1 -0
  359. package/dist/settings/dictionaries/settings-dialog.fr.d.ts +3 -0
  360. package/dist/settings/dictionaries/settings-dialog.fr.d.ts.map +1 -0
  361. package/dist/settings/dictionaries/settings-dialog.fr.js +28 -0
  362. package/dist/settings/dictionaries/settings-dialog.fr.js.map +1 -0
  363. package/dist/settings/dictionaries/settings-dialog.hi.d.ts +3 -0
  364. package/dist/settings/dictionaries/settings-dialog.hi.d.ts.map +1 -0
  365. package/dist/settings/dictionaries/settings-dialog.hi.js +28 -0
  366. package/dist/settings/dictionaries/settings-dialog.hi.js.map +1 -0
  367. package/dist/settings/dictionaries/settings-dialog.hu.d.ts +3 -0
  368. package/dist/settings/dictionaries/settings-dialog.hu.d.ts.map +1 -0
  369. package/dist/settings/dictionaries/settings-dialog.hu.js +28 -0
  370. package/dist/settings/dictionaries/settings-dialog.hu.js.map +1 -0
  371. package/dist/settings/dictionaries/settings-dialog.id.d.ts +3 -0
  372. package/dist/settings/dictionaries/settings-dialog.id.d.ts.map +1 -0
  373. package/dist/settings/dictionaries/settings-dialog.id.js +28 -0
  374. package/dist/settings/dictionaries/settings-dialog.id.js.map +1 -0
  375. package/dist/settings/dictionaries/settings-dialog.it.d.ts +3 -0
  376. package/dist/settings/dictionaries/settings-dialog.it.d.ts.map +1 -0
  377. package/dist/settings/dictionaries/settings-dialog.it.js +28 -0
  378. package/dist/settings/dictionaries/settings-dialog.it.js.map +1 -0
  379. package/dist/settings/dictionaries/settings-dialog.ja.d.ts +3 -0
  380. package/dist/settings/dictionaries/settings-dialog.ja.d.ts.map +1 -0
  381. package/dist/settings/dictionaries/settings-dialog.ja.js +28 -0
  382. package/dist/settings/dictionaries/settings-dialog.ja.js.map +1 -0
  383. package/dist/settings/dictionaries/settings-dialog.ko.d.ts +3 -0
  384. package/dist/settings/dictionaries/settings-dialog.ko.d.ts.map +1 -0
  385. package/dist/settings/dictionaries/settings-dialog.ko.js +28 -0
  386. package/dist/settings/dictionaries/settings-dialog.ko.js.map +1 -0
  387. package/dist/settings/dictionaries/settings-dialog.pl.d.ts +3 -0
  388. package/dist/settings/dictionaries/settings-dialog.pl.d.ts.map +1 -0
  389. package/dist/settings/dictionaries/settings-dialog.pl.js +28 -0
  390. package/dist/settings/dictionaries/settings-dialog.pl.js.map +1 -0
  391. package/dist/settings/dictionaries/settings-dialog.pt-BR.d.ts +3 -0
  392. package/dist/settings/dictionaries/settings-dialog.pt-BR.d.ts.map +1 -0
  393. package/dist/settings/dictionaries/settings-dialog.pt-BR.js +28 -0
  394. package/dist/settings/dictionaries/settings-dialog.pt-BR.js.map +1 -0
  395. package/dist/settings/dictionaries/settings-dialog.ru.d.ts +3 -0
  396. package/dist/settings/dictionaries/settings-dialog.ru.d.ts.map +1 -0
  397. package/dist/settings/dictionaries/settings-dialog.ru.js +28 -0
  398. package/dist/settings/dictionaries/settings-dialog.ru.js.map +1 -0
  399. package/dist/settings/dictionaries/settings-dialog.th.d.ts +3 -0
  400. package/dist/settings/dictionaries/settings-dialog.th.d.ts.map +1 -0
  401. package/dist/settings/dictionaries/settings-dialog.th.js +28 -0
  402. package/dist/settings/dictionaries/settings-dialog.th.js.map +1 -0
  403. package/dist/settings/dictionaries/settings-dialog.tr.d.ts +3 -0
  404. package/dist/settings/dictionaries/settings-dialog.tr.d.ts.map +1 -0
  405. package/dist/settings/dictionaries/settings-dialog.tr.js +28 -0
  406. package/dist/settings/dictionaries/settings-dialog.tr.js.map +1 -0
  407. package/dist/settings/dictionaries/settings-dialog.uk.d.ts +3 -0
  408. package/dist/settings/dictionaries/settings-dialog.uk.d.ts.map +1 -0
  409. package/dist/settings/dictionaries/settings-dialog.uk.js +28 -0
  410. package/dist/settings/dictionaries/settings-dialog.uk.js.map +1 -0
  411. package/dist/settings/dictionaries/settings-dialog.ur.d.ts +3 -0
  412. package/dist/settings/dictionaries/settings-dialog.ur.d.ts.map +1 -0
  413. package/dist/settings/dictionaries/settings-dialog.ur.js +28 -0
  414. package/dist/settings/dictionaries/settings-dialog.ur.js.map +1 -0
  415. package/dist/settings/dictionaries/settings-dialog.zh-CN.d.ts +3 -0
  416. package/dist/settings/dictionaries/settings-dialog.zh-CN.d.ts.map +1 -0
  417. package/dist/settings/dictionaries/settings-dialog.zh-CN.js +28 -0
  418. package/dist/settings/dictionaries/settings-dialog.zh-CN.js.map +1 -0
  419. package/dist/settings/dictionaries/settings-dialog.zh-TW.d.ts +3 -0
  420. package/dist/settings/dictionaries/settings-dialog.zh-TW.d.ts.map +1 -0
  421. package/dist/settings/dictionaries/settings-dialog.zh-TW.js +28 -0
  422. package/dist/settings/dictionaries/settings-dialog.zh-TW.js.map +1 -0
  423. package/dist/settings/ensure-definitions.d.ts +88 -0
  424. package/dist/settings/ensure-definitions.d.ts.map +1 -0
  425. package/dist/settings/ensure-definitions.js +91 -0
  426. package/dist/settings/ensure-definitions.js.map +1 -0
  427. package/dist/settings/errors.d.ts +36 -0
  428. package/dist/settings/errors.d.ts.map +1 -0
  429. package/dist/settings/errors.js +40 -0
  430. package/dist/settings/errors.js.map +1 -0
  431. package/dist/settings/index.d.ts +37 -0
  432. package/dist/settings/index.d.ts.map +1 -0
  433. package/dist/settings/index.js +36 -0
  434. package/dist/settings/index.js.map +1 -0
  435. package/dist/settings/ports.d.ts +117 -0
  436. package/dist/settings/ports.d.ts.map +1 -0
  437. package/dist/settings/ports.js +2 -0
  438. package/dist/settings/ports.js.map +1 -0
  439. package/dist/settings/purge-service.d.ts +53 -0
  440. package/dist/settings/purge-service.d.ts.map +1 -0
  441. package/dist/settings/purge-service.js +105 -0
  442. package/dist/settings/purge-service.js.map +1 -0
  443. package/dist/settings/repo.memory.d.ts +119 -0
  444. package/dist/settings/repo.memory.d.ts.map +1 -0
  445. package/dist/settings/repo.memory.js +199 -0
  446. package/dist/settings/repo.memory.js.map +1 -0
  447. package/dist/settings/settings.d.ts +124 -0
  448. package/dist/settings/settings.d.ts.map +1 -0
  449. package/dist/settings/settings.js +238 -0
  450. package/dist/settings/settings.js.map +1 -0
  451. package/dist/settings/tool-registrations.d.ts +56 -0
  452. package/dist/settings/tool-registrations.d.ts.map +1 -0
  453. package/dist/settings/tool-registrations.js +240 -0
  454. package/dist/settings/tool-registrations.js.map +1 -0
  455. package/dist/settings/types.d.ts +125 -0
  456. package/dist/settings/types.d.ts.map +1 -0
  457. package/dist/settings/types.js +3 -0
  458. package/dist/settings/types.js.map +1 -0
  459. package/dist/settings/ui-tab-definitions.d.ts +41 -0
  460. package/dist/settings/ui-tab-definitions.d.ts.map +1 -0
  461. package/dist/settings/ui-tab-definitions.js +148 -0
  462. package/dist/settings/ui-tab-definitions.js.map +1 -0
  463. package/dist/settings/write-service.d.ts +314 -0
  464. package/dist/settings/write-service.d.ts.map +1 -0
  465. package/dist/settings/write-service.js +677 -0
  466. package/dist/settings/write-service.js.map +1 -0
  467. package/dist/taxonomy/agent-tools.d.ts +76 -0
  468. package/dist/taxonomy/agent-tools.d.ts.map +1 -0
  469. package/dist/taxonomy/agent-tools.js +178 -0
  470. package/dist/taxonomy/agent-tools.js.map +1 -0
  471. package/dist/taxonomy/content-lookup.d.ts +45 -0
  472. package/dist/taxonomy/content-lookup.d.ts.map +1 -0
  473. package/dist/taxonomy/content-lookup.js +9 -0
  474. package/dist/taxonomy/content-lookup.js.map +1 -0
  475. package/dist/taxonomy/index.d.ts +38 -0
  476. package/dist/taxonomy/index.d.ts.map +1 -0
  477. package/dist/taxonomy/index.js +38 -0
  478. package/dist/taxonomy/index.js.map +1 -0
  479. package/dist/taxonomy/list.d.ts +39 -0
  480. package/dist/taxonomy/list.d.ts.map +1 -0
  481. package/dist/taxonomy/list.js +19 -0
  482. package/dist/taxonomy/list.js.map +1 -0
  483. package/dist/taxonomy/merge-term.d.ts +94 -0
  484. package/dist/taxonomy/merge-term.d.ts.map +1 -0
  485. package/dist/taxonomy/merge-term.js +65 -0
  486. package/dist/taxonomy/merge-term.js.map +1 -0
  487. package/dist/taxonomy/repo.memory.d.ts +160 -0
  488. package/dist/taxonomy/repo.memory.d.ts.map +1 -0
  489. package/dist/taxonomy/repo.memory.js +171 -0
  490. package/dist/taxonomy/repo.memory.js.map +1 -0
  491. package/dist/taxonomy/validation-chain.d.ts +114 -0
  492. package/dist/taxonomy/validation-chain.d.ts.map +1 -0
  493. package/dist/taxonomy/validation-chain.js +152 -0
  494. package/dist/taxonomy/validation-chain.js.map +1 -0
  495. package/dist/taxonomy/write-service.d.ts +387 -0
  496. package/dist/taxonomy/write-service.d.ts.map +1 -0
  497. package/dist/taxonomy/write-service.js +350 -0
  498. package/dist/taxonomy/write-service.js.map +1 -0
  499. package/dist/workspace/agent-tools.d.ts +67 -0
  500. package/dist/workspace/agent-tools.d.ts.map +1 -0
  501. package/dist/workspace/agent-tools.js +103 -0
  502. package/dist/workspace/agent-tools.js.map +1 -0
  503. package/dist/workspace/create.d.ts +116 -0
  504. package/dist/workspace/create.d.ts.map +1 -0
  505. package/dist/workspace/create.js +69 -0
  506. package/dist/workspace/create.js.map +1 -0
  507. package/dist/workspace/delete.d.ts +50 -0
  508. package/dist/workspace/delete.d.ts.map +1 -0
  509. package/dist/workspace/delete.js +24 -0
  510. package/dist/workspace/delete.js.map +1 -0
  511. package/dist/workspace/index.d.ts +27 -0
  512. package/dist/workspace/index.d.ts.map +1 -0
  513. package/dist/workspace/index.js +27 -0
  514. package/dist/workspace/index.js.map +1 -0
  515. package/dist/workspace/repo.memory.d.ts +34 -0
  516. package/dist/workspace/repo.memory.d.ts.map +1 -0
  517. package/dist/workspace/repo.memory.js +50 -0
  518. package/dist/workspace/repo.memory.js.map +1 -0
  519. package/dist/workspace/tool-registrations.d.ts +38 -0
  520. package/dist/workspace/tool-registrations.d.ts.map +1 -0
  521. package/dist/workspace/tool-registrations.js +71 -0
  522. package/dist/workspace/tool-registrations.js.map +1 -0
  523. package/dist/workspace/update.d.ts +52 -0
  524. package/dist/workspace/update.d.ts.map +1 -0
  525. package/dist/workspace/update.js +41 -0
  526. package/dist/workspace/update.js.map +1 -0
  527. package/package.json +149 -0
@@ -0,0 +1,65 @@
1
+ import { CleanupNotEligibleError } from "./errors.js";
2
+ const RETENTION_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
3
+ /**
4
+ * REQ-20 — the fixed-order eligibility gate: `status==='tombstone'` -> retention window elapsed
5
+ * (>=30 days since `tombstonedAt`, inclusive lower bound) -> `exportReference` present. Only once
6
+ * all three pass does this call reach the real `gateway.plan()`.
7
+ *
8
+ * @complexity O(1) — one repo read, one date diff, one delegated gateway call at most.
9
+ * @overallScore 100
10
+ */
11
+ export async function planCleanup(required) {
12
+ const { deps, input } = required;
13
+ const authResult = await deps.authorize({ principalId: input.actorId, permission: "admin.collections.read", workspaceId: input.workspaceId });
14
+ if (!authResult.allowed) {
15
+ return { ok: false, error: new CleanupNotEligibleError("forbidden", `principal '${input.actorId}' is not authorized to plan a cleanup (${authResult.reason})`) };
16
+ }
17
+ const contentType = await deps.repo.findByKey({ workspaceId: input.workspaceId, key: input.contentTypeKey });
18
+ if (!contentType || contentType.status !== "tombstone") {
19
+ return { ok: false, error: new CleanupNotEligibleError("not_tombstoned") };
20
+ }
21
+ const now = deps.clock.nowIso();
22
+ const elapsedMs = new Date(now).getTime() - new Date(contentType.tombstonedAt ?? now).getTime();
23
+ if (elapsedMs < RETENTION_WINDOW_MS) {
24
+ return { ok: false, error: new CleanupNotEligibleError("retention_window_not_elapsed") };
25
+ }
26
+ if (!input.exportReference) {
27
+ return { ok: false, error: new CleanupNotEligibleError("export_reference_missing") };
28
+ }
29
+ const planResult = await deps.gateway.plan({
30
+ principalId: input.actorId,
31
+ workspaceId: input.workspaceId,
32
+ contentTypeKey: input.contentTypeKey,
33
+ domain: "collections",
34
+ action: "cleanup",
35
+ });
36
+ if (!planResult.ok) {
37
+ return { ok: false, error: new CleanupNotEligibleError("gateway_rejected", String(planResult.error)) };
38
+ }
39
+ return { ok: true, value: planResult.value };
40
+ }
41
+ /**
42
+ * REQ-21/INV-07 — forwards straight to the gated-mutation gateway's own `execute()`; only once
43
+ * that confirms (token redeemed, actor-class checked, plan still fresh) does this function perform
44
+ * the actual atomic multi-table removal. A gateway rejection (expired/already-redeemed token,
45
+ * stale plan) is forwarded verbatim and no local removal is ever attempted (EC-10).
46
+ *
47
+ * @complexity O(1) plus one delegated gateway call and, on success, one same-tx multi-table
48
+ * removal.
49
+ * @overallScore 100
50
+ */
51
+ export async function executeCleanup(required) {
52
+ const { deps, input } = required;
53
+ const gatewayResult = await deps.gateway.execute({
54
+ principalId: input.principalId,
55
+ principalKind: input.principalKind,
56
+ confirmationToken: input.confirmationToken,
57
+ contentTypeKey: input.contentTypeKey,
58
+ });
59
+ if (!gatewayResult.ok) {
60
+ return gatewayResult;
61
+ }
62
+ const removal = await deps.repo.transaction(async () => deps.repo.removeContentTypeAndAllScopedRows({ contentTypeKey: input.contentTypeKey }));
63
+ return { ok: true, value: removal };
64
+ }
65
+ //# sourceMappingURL=cleanup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/content-types/cleanup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,90 @@
1
+ /**
2
+ * @file Typed error surface for the `content-types` package.
3
+ *
4
+ * Purpose:
5
+ * Every rejection this package's write-service/lifecycle/cleanup/index-provisioning modules
6
+ * produce is one of these classes, never a bare `Error`/string, so callers (routes, agent tools,
7
+ * tests) can branch on `instanceof` or on `.name` without parsing a message.
8
+ *
9
+ * `class X extends Error {}` does NOT give an instance a `.name` of `"X"` on this runtime unless
10
+ * the constructor sets `this.name` explicitly (confirmed empirically in Session 2 of this
11
+ * workstream) — every class below sets it.
12
+ *
13
+ * Architectural role:
14
+ * `features/content-types` domain logic. No dependencies.
15
+ */
16
+ export declare class ForbiddenError extends Error {
17
+ constructor(message: string);
18
+ }
19
+ /** CIC U-002-B1 guard 1 — `key`/field-name grammar gate `^[a-z][a-z0-9_]{0,63}$` (U-001-B2). */
20
+ export declare class InvalidKeyGrammarError extends Error {
21
+ constructor(message: string);
22
+ }
23
+ /** CIC U-002-B1 guard 2 — `key` is one of the permanently reserved legacy `posts` keys. */
24
+ export declare class ReservedContentTypeKeyError extends Error {
25
+ constructor(message: string);
26
+ }
27
+ /** CIC U-002-B1 guard 3 — a field name fails the identifier grammar gate. */
28
+ export declare class InvalidFieldNameGrammarError extends Error {
29
+ constructor(message: string);
30
+ }
31
+ /** CIC U-001-B1 / U-002-B1 guard 4 — a field `kind` is not one of the closed 5-entry enum. */
32
+ export declare class InvalidFieldKindError extends Error {
33
+ constructor(message: string);
34
+ }
35
+ /**
36
+ * A `fields` payload whose STRUCTURE is wrong — not a value that failed a domain rule, but a
37
+ * shape the `ContentTypeFieldDef[]` contract does not describe at all (a non-array, a non-object
38
+ * element, a missing/mistyped `name`/`required`/`queryable`, or an unrecognized key).
39
+ *
40
+ * Distinct from the five CIC U-002-B1 guard errors on purpose: those judge a well-formed field
41
+ * definition against a domain rule, and they remain the sole owners of the grammar, kind-enum and
42
+ * queryable-cap decisions. This one fires strictly earlier, at the untrusted-input boundary
43
+ * (`field-defs.ts`), for payloads the guards could not have judged without either crashing or
44
+ * silently persisting a value of the wrong type.
45
+ *
46
+ * `violation.received` names the offending value's TYPE, never the value — a field payload can
47
+ * carry operator content, and this message reaches both an HTTP client and a model.
48
+ */
49
+ export declare class InvalidFieldShapeError extends Error {
50
+ readonly code: "VALIDATION_ERROR";
51
+ readonly violation: {
52
+ path: string;
53
+ expected: string;
54
+ received: string;
55
+ };
56
+ constructor(violation: {
57
+ path: string;
58
+ expected: string;
59
+ received: string;
60
+ });
61
+ }
62
+ /** CIC U-002-B1 guard 5 — more than the per-type cap of `queryable` fields were submitted. */
63
+ export declare class QueryableFieldCapExceededError extends Error {
64
+ constructor(message: string);
65
+ }
66
+ /** CIC U-004-B1 — `expectedVersion` did not match the current row's version (OCC conflict). */
67
+ export declare class VersionConflictError extends Error {
68
+ constructor(message: string);
69
+ }
70
+ export declare class ContentTypeNotFoundError extends Error {
71
+ constructor(message: string);
72
+ }
73
+ /** A generic validation rejection carrying a stable machine-readable `details.reason`. */
74
+ export declare class ValidationError extends Error {
75
+ readonly code: "VALIDATION_ERROR";
76
+ readonly details: {
77
+ reason: string;
78
+ };
79
+ constructor(message: string, reason: string);
80
+ }
81
+ /** REQ-09..12 lifecycle state-machine guard rejection (INV-06 terminal-tombstone, EC-09 deprecate-first). */
82
+ export declare class ContentTypeLifecycleError extends Error {
83
+ constructor(message: string);
84
+ }
85
+ /** REQ-20 `planCleanup` eligibility-gate rejection; `reason` is one of a closed, ordered set. */
86
+ export declare class CleanupNotEligibleError extends Error {
87
+ readonly reason: string;
88
+ constructor(reason: string, message?: string);
89
+ }
90
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/content-types/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,gGAAgG;AAChG,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,2FAA2F;AAC3F,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,6EAA6E;AAC7E,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,OAAO,EAAE,MAAM;CAI5B;AAED,8FAA8F;AAC9F,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;IAC5C,QAAQ,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;gBAE7D,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAK5E;AAED,8FAA8F;AAC9F,qBAAa,8BAA+B,SAAQ,KAAK;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,+FAA+F;AAC/F,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,0FAA0F;AAC1F,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;IAC5C,QAAQ,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;gBAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK5C;AAED,6GAA6G;AAC7G,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,iGAAiG;AACjG,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAK7C"}
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @file Typed error surface for the `content-types` package.
3
+ *
4
+ * Purpose:
5
+ * Every rejection this package's write-service/lifecycle/cleanup/index-provisioning modules
6
+ * produce is one of these classes, never a bare `Error`/string, so callers (routes, agent tools,
7
+ * tests) can branch on `instanceof` or on `.name` without parsing a message.
8
+ *
9
+ * `class X extends Error {}` does NOT give an instance a `.name` of `"X"` on this runtime unless
10
+ * the constructor sets `this.name` explicitly (confirmed empirically in Session 2 of this
11
+ * workstream) — every class below sets it.
12
+ *
13
+ * Architectural role:
14
+ * `features/content-types` domain logic. No dependencies.
15
+ */
16
+ export class ForbiddenError extends Error {
17
+ constructor(message) {
18
+ super(message);
19
+ this.name = "ForbiddenError";
20
+ }
21
+ }
22
+ /** CIC U-002-B1 guard 1 — `key`/field-name grammar gate `^[a-z][a-z0-9_]{0,63}$` (U-001-B2). */
23
+ export class InvalidKeyGrammarError extends Error {
24
+ constructor(message) {
25
+ super(message);
26
+ this.name = "InvalidKeyGrammarError";
27
+ }
28
+ }
29
+ /** CIC U-002-B1 guard 2 — `key` is one of the permanently reserved legacy `posts` keys. */
30
+ export class ReservedContentTypeKeyError extends Error {
31
+ constructor(message) {
32
+ super(message);
33
+ this.name = "ReservedContentTypeKeyError";
34
+ }
35
+ }
36
+ /** CIC U-002-B1 guard 3 — a field name fails the identifier grammar gate. */
37
+ export class InvalidFieldNameGrammarError extends Error {
38
+ constructor(message) {
39
+ super(message);
40
+ this.name = "InvalidFieldNameGrammarError";
41
+ }
42
+ }
43
+ /** CIC U-001-B1 / U-002-B1 guard 4 — a field `kind` is not one of the closed 5-entry enum. */
44
+ export class InvalidFieldKindError extends Error {
45
+ constructor(message) {
46
+ super(message);
47
+ this.name = "InvalidFieldKindError";
48
+ }
49
+ }
50
+ /**
51
+ * A `fields` payload whose STRUCTURE is wrong — not a value that failed a domain rule, but a
52
+ * shape the `ContentTypeFieldDef[]` contract does not describe at all (a non-array, a non-object
53
+ * element, a missing/mistyped `name`/`required`/`queryable`, or an unrecognized key).
54
+ *
55
+ * Distinct from the five CIC U-002-B1 guard errors on purpose: those judge a well-formed field
56
+ * definition against a domain rule, and they remain the sole owners of the grammar, kind-enum and
57
+ * queryable-cap decisions. This one fires strictly earlier, at the untrusted-input boundary
58
+ * (`field-defs.ts`), for payloads the guards could not have judged without either crashing or
59
+ * silently persisting a value of the wrong type.
60
+ *
61
+ * `violation.received` names the offending value's TYPE, never the value — a field payload can
62
+ * carry operator content, and this message reaches both an HTTP client and a model.
63
+ */
64
+ export class InvalidFieldShapeError extends Error {
65
+ code = "VALIDATION_ERROR";
66
+ violation;
67
+ constructor(violation) {
68
+ super(`${violation.path} must be ${violation.expected}, received ${violation.received}`);
69
+ this.name = "InvalidFieldShapeError";
70
+ this.violation = violation;
71
+ }
72
+ }
73
+ /** CIC U-002-B1 guard 5 — more than the per-type cap of `queryable` fields were submitted. */
74
+ export class QueryableFieldCapExceededError extends Error {
75
+ constructor(message) {
76
+ super(message);
77
+ this.name = "QueryableFieldCapExceededError";
78
+ }
79
+ }
80
+ /** CIC U-004-B1 — `expectedVersion` did not match the current row's version (OCC conflict). */
81
+ export class VersionConflictError extends Error {
82
+ constructor(message) {
83
+ super(message);
84
+ this.name = "VersionConflictError";
85
+ }
86
+ }
87
+ export class ContentTypeNotFoundError extends Error {
88
+ constructor(message) {
89
+ super(message);
90
+ this.name = "CONTENT_TYPE_NOT_FOUND";
91
+ }
92
+ }
93
+ /** A generic validation rejection carrying a stable machine-readable `details.reason`. */
94
+ export class ValidationError extends Error {
95
+ code = "VALIDATION_ERROR";
96
+ details;
97
+ constructor(message, reason) {
98
+ super(message);
99
+ this.name = "VALIDATION_ERROR";
100
+ this.details = { reason };
101
+ }
102
+ }
103
+ /** REQ-09..12 lifecycle state-machine guard rejection (INV-06 terminal-tombstone, EC-09 deprecate-first). */
104
+ export class ContentTypeLifecycleError extends Error {
105
+ constructor(message) {
106
+ super(message);
107
+ this.name = "ContentTypeLifecycleError";
108
+ }
109
+ }
110
+ /** REQ-20 `planCleanup` eligibility-gate rejection; `reason` is one of a closed, ordered set. */
111
+ export class CleanupNotEligibleError extends Error {
112
+ reason;
113
+ constructor(reason, message) {
114
+ super(message ?? `cleanup is not eligible: ${reason}`);
115
+ this.name = "CleanupNotEligibleError";
116
+ this.reason = reason;
117
+ }
118
+ }
119
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/content-types/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,MAAM,OAAO,cAAe,SAAQ,KAAK;IACvC,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;IAC/B,CAAC;CACF;AAED,gGAAgG;AAChG,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IAC/C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,2FAA2F;AAC3F,MAAM,OAAO,2BAA4B,SAAQ,KAAK;IACpD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,6BAA6B,CAAC;IAC5C,CAAC;CACF;AAED,6EAA6E;AAC7E,MAAM,OAAO,4BAA6B,SAAQ,KAAK;IACrD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,8BAA8B,CAAC;IAC7C,CAAC;CACF;AAED,8FAA8F;AAC9F,MAAM,OAAO,qBAAsB,SAAQ,KAAK;IAC9C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,uBAAuB,CAAC;IACtC,CAAC;CACF;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,IAAI,GAAG,kBAA2B,CAAC;IACnC,SAAS,CAAuD;IAEzE,YAAY,SAA+D;QACzE,KAAK,CAAC,GAAG,SAAS,CAAC,IAAI,YAAY,SAAS,CAAC,QAAQ,cAAc,SAAS,CAAC,QAAQ,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;CACF;AAED,8FAA8F;AAC9F,MAAM,OAAO,8BAA+B,SAAQ,KAAK;IACvD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,gCAAgC,CAAC;IAC/C,CAAC;CACF;AAED,+FAA+F;AAC/F,MAAM,OAAO,oBAAqB,SAAQ,KAAK;IAC7C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,sBAAsB,CAAC;IACrC,CAAC;CACF;AAED,MAAM,OAAO,wBAAyB,SAAQ,KAAK;IACjD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;IACvC,CAAC;CACF;AAED,0FAA0F;AAC1F,MAAM,OAAO,eAAgB,SAAQ,KAAK;IAC/B,IAAI,GAAG,kBAA2B,CAAC;IACnC,OAAO,CAAqB;IAErC,YAAY,OAAe,EAAE,MAAc;QACzC,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,EAAE,MAAM,EAAE,CAAC;IAC5B,CAAC;CACF;AAED,6GAA6G;AAC7G,MAAM,OAAO,yBAA0B,SAAQ,KAAK;IAClD,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,2BAA2B,CAAC;IAC1C,CAAC;CACF;AAED,iGAAiG;AACjG,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IACvC,MAAM,CAAS;IAExB,YAAY,MAAc,EAAE,OAAgB;QAC1C,KAAK,CAAC,OAAO,IAAI,4BAA4B,MAAM,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;CACF"}
@@ -0,0 +1,25 @@
1
+ import { type ContentTypeFieldDef, type Result } from "./types.js";
2
+ /**
3
+ * Validates an untrusted value against the `ContentTypeFieldDef[]` contract, returning either the
4
+ * verified array or the first structural violation found.
5
+ *
6
+ * Stops at the first violation rather than collecting all of them, matching the
7
+ * stop-at-first-failure convention CIC U-002-B1 already establishes for the domain guard chain
8
+ * this function feeds.
9
+ *
10
+ * @param value - The untrusted `fields` payload: a parsed JSON body's property, or an agent tool's
11
+ * `ctx.input.fields`. Any type is accepted as input; that is the point.
12
+ * @returns `{ok:true, value}` with an array whose every element is a verified
13
+ * {@link ContentTypeFieldDef}, or `{ok:false, error}` carrying an
14
+ * {@link InvalidFieldShapeError} (wrong structure, with the offending path) or an
15
+ * {@link InvalidFieldKindError} (well-formed string `kind` outside the closed enum).
16
+ * @throws Never. Every rejection is returned, including for inputs that previously threw.
17
+ * @complexity O(f·k) time with f = element count (bounded by {@link MAX_FIELD_DEFS}) and k = 4
18
+ * fixed keys, so effectively O(f); O(f) space for the returned array.
19
+ * @example
20
+ * const parsed = parseContentTypeFieldDefs([{ name: "servings", kind: "integer", required: false, queryable: true }]);
21
+ * if (!parsed.ok) return { ok: false, error: parsed.error };
22
+ * @overallScore 100
23
+ */
24
+ export declare function parseContentTypeFieldDefs(value: unknown): Result<ContentTypeFieldDef[], Error>;
25
+ //# sourceMappingURL=field-defs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-defs.d.ts","sourceRoot":"","sources":["../../src/content-types/field-defs.ts"],"names":[],"mappings":"AA0CA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAoC3F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,KAAK,CAAC,CAmB9F"}
@@ -0,0 +1,155 @@
1
+ /**
2
+ * @file The single untrusted-input boundary for a content type's `fields` payload — used by BOTH
3
+ * callers that accept one from outside the process: the admin HTTP routes
4
+ * (`server/routes/admin/content-types/{register,update-fields}.ts`) and the agent-tool handlers
5
+ * (`assistant/tool-registrations.ts`).
6
+ *
7
+ * Purpose:
8
+ * Before this module both call sites did the same two things: check `Array.isArray(body.fields)`
9
+ * and then cast the result to `ContentTypeFieldDef[]`. The cast was the whole of the nested-shape
10
+ * validation, which left three real gaps:
11
+ *
12
+ * 1. `required` and `queryable` were never type-checked anywhere in the codebase, so
13
+ * `queryable: "yes"` counted as queryable (`write-service.ts`'s `countQueryableFields` filters
14
+ * on truthiness) and `required: "maybe"` was persisted verbatim into the stored record and its
15
+ * revision `stateJson`. That is a data-integrity gap, not merely a sloppy contract.
16
+ * 2. A non-object element (`fields: [null]`) made the field-name grammar guard throw a bare
17
+ * `TypeError` on `field.name` instead of returning a typed rejection — a 500 on the HTTP path
18
+ * and an opaque `'failed'` tool execution on the agent path.
19
+ * 3. A misspelled key (`queryible: true`) was silently dropped rather than reported, so a caller
20
+ * got a field that was quietly non-queryable with no indication why.
21
+ *
22
+ * Division of responsibility (deliberate, and the reason this module is narrow):
23
+ * this module owns STRUCTURE only — array-ness, element object-ness, the four keys and their
24
+ * types. It does NOT own the domain rules. The field-name grammar gate, the reserved-key check and
25
+ * the queryable-field cap stay solely in `write-service.ts`'s CIC U-002-B1 guard chain, whose
26
+ * fixed order (`key grammar -> reserved-key -> field-name grammar -> field-kind -> queryable-cap`)
27
+ * and stop-at-first-failure behavior are pinned by
28
+ * `__tests__/unit/write-service.register.unit.test.ts` (AC-38). Duplicating any of those here
29
+ * would either reorder that chain for boundary callers or create a second source of truth for a
30
+ * rule that must have exactly one definition.
31
+ *
32
+ * The one exception is `kind`, and it is a reuse rather than a restatement: this module calls the
33
+ * same `isContentTypeFieldKind` predicate guard 4 calls and raises the same
34
+ * `InvalidFieldKindError` guard 4 raises. Verifying it here is what lets this function honestly
35
+ * return `ContentTypeFieldDef[]` instead of handing back another unchecked cast. Both call sites
36
+ * already map that error class to `400 VALIDATION_ERROR`, so no HTTP response shape changes.
37
+ *
38
+ * Architectural role:
39
+ * `features/content-types` domain logic. Pure — no I/O, no clock, no repo. Depends only on this
40
+ * package's own `types.ts` and `errors.ts`.
41
+ */
42
+ import { InvalidFieldKindError, InvalidFieldShapeError } from "./errors.js";
43
+ import { isContentTypeFieldKind } from "./types.js";
44
+ /**
45
+ * The complete, closed key set of a `ContentTypeFieldDef`. Any other key is rejected rather than
46
+ * ignored — silently dropping an unrecognized key is how a typo'd `queryible: true` became a
47
+ * quietly non-queryable field with no error to act on.
48
+ */
49
+ const FIELD_DEF_KEYS = ["name", "kind", "required", "queryable"];
50
+ /**
51
+ * Upper bound on how many field definitions one payload may carry.
52
+ *
53
+ * Not a product rule — a resource bound. `fields` is a caller-supplied, previously unbounded
54
+ * collection: the existing `QUERYABLE_FIELD_CAP` (20, `write-service.ts`) limits only the
55
+ * `queryable` subset, so a payload of a million non-queryable fields was accepted and persisted
56
+ * as one JSON blob. Deliberately far above any plausible real content type so it can never act as
57
+ * a product constraint; if a legitimate schema ever approaches it, raise it rather than working
58
+ * around it.
59
+ */
60
+ const MAX_FIELD_DEFS = 500;
61
+ /**
62
+ * Names the offending value's TYPE for an error message that must never echo operator content.
63
+ * Article chosen by initial vowel because two `typeof` results ("object", "undefined") take "an".
64
+ */
65
+ function describeType(value) {
66
+ if (value === null)
67
+ return "null";
68
+ if (Array.isArray(value))
69
+ return "an array";
70
+ const type = typeof value;
71
+ return `${/^[aeiou]/.test(type) ? "an" : "a"} ${type}`;
72
+ }
73
+ function isPlainObject(value) {
74
+ return typeof value === "object" && value !== null && !Array.isArray(value);
75
+ }
76
+ /**
77
+ * Validates an untrusted value against the `ContentTypeFieldDef[]` contract, returning either the
78
+ * verified array or the first structural violation found.
79
+ *
80
+ * Stops at the first violation rather than collecting all of them, matching the
81
+ * stop-at-first-failure convention CIC U-002-B1 already establishes for the domain guard chain
82
+ * this function feeds.
83
+ *
84
+ * @param value - The untrusted `fields` payload: a parsed JSON body's property, or an agent tool's
85
+ * `ctx.input.fields`. Any type is accepted as input; that is the point.
86
+ * @returns `{ok:true, value}` with an array whose every element is a verified
87
+ * {@link ContentTypeFieldDef}, or `{ok:false, error}` carrying an
88
+ * {@link InvalidFieldShapeError} (wrong structure, with the offending path) or an
89
+ * {@link InvalidFieldKindError} (well-formed string `kind` outside the closed enum).
90
+ * @throws Never. Every rejection is returned, including for inputs that previously threw.
91
+ * @complexity O(f·k) time with f = element count (bounded by {@link MAX_FIELD_DEFS}) and k = 4
92
+ * fixed keys, so effectively O(f); O(f) space for the returned array.
93
+ * @example
94
+ * const parsed = parseContentTypeFieldDefs([{ name: "servings", kind: "integer", required: false, queryable: true }]);
95
+ * if (!parsed.ok) return { ok: false, error: parsed.error };
96
+ * @overallScore 100
97
+ */
98
+ export function parseContentTypeFieldDefs(value) {
99
+ if (!Array.isArray(value)) {
100
+ return { ok: false, error: new InvalidFieldShapeError({ path: "fields", expected: "an array", received: describeType(value) }) };
101
+ }
102
+ if (value.length > MAX_FIELD_DEFS) {
103
+ return {
104
+ ok: false,
105
+ error: new InvalidFieldShapeError({ path: "fields", expected: `at most ${MAX_FIELD_DEFS} entries`, received: `an array of ${value.length}` }),
106
+ };
107
+ }
108
+ const parsed = [];
109
+ for (const [index, element] of value.entries()) {
110
+ const one = parseOneFieldDef(element, `fields[${index}]`);
111
+ if (!one.ok)
112
+ return one;
113
+ parsed.push(one.value);
114
+ }
115
+ return { ok: true, value: parsed };
116
+ }
117
+ /**
118
+ * Validates one element of the `fields` array. Split out of {@link parseContentTypeFieldDefs} so
119
+ * the guard sequence sits flat at one nesting level instead of inside the array loop — the checks,
120
+ * their order, and the exact error each returns are unchanged, and the first failure still
121
+ * short-circuits the whole parse.
122
+ *
123
+ * @complexity O(k) with k = 4 fixed keys.
124
+ */
125
+ function parseOneFieldDef(element, at) {
126
+ if (!isPlainObject(element)) {
127
+ return { ok: false, error: new InvalidFieldShapeError({ path: at, expected: "an object", received: describeType(element) }) };
128
+ }
129
+ const unrecognized = Object.keys(element).find((key) => !FIELD_DEF_KEYS.includes(key));
130
+ if (unrecognized !== undefined) {
131
+ return {
132
+ ok: false,
133
+ error: new InvalidFieldShapeError({ path: `${at}.${unrecognized}`, expected: `absent (allowed keys: ${FIELD_DEF_KEYS.join(", ")})`, received: "an unrecognized key" }),
134
+ };
135
+ }
136
+ // `name` is checked for string-ness only — its grammar belongs to guard 3. Checking it here is
137
+ // what stops that guard from receiving a non-string and throwing inside `RegExp.test`.
138
+ if (typeof element.name !== "string") {
139
+ return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.name`, expected: "a string", received: describeType(element.name) }) };
140
+ }
141
+ if (typeof element.required !== "boolean") {
142
+ return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.required`, expected: "a boolean", received: describeType(element.required) }) };
143
+ }
144
+ if (typeof element.queryable !== "boolean") {
145
+ return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.queryable`, expected: "a boolean", received: describeType(element.queryable) }) };
146
+ }
147
+ if (typeof element.kind !== "string") {
148
+ return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.kind`, expected: "a string", received: describeType(element.kind) }) };
149
+ }
150
+ if (!isContentTypeFieldKind(element.kind)) {
151
+ return { ok: false, error: new InvalidFieldKindError(`field '${element.name}' has kind '${element.kind}', not one of the closed field-kind enum`) };
152
+ }
153
+ return { ok: true, value: { name: element.name, kind: element.kind, required: element.required, queryable: element.queryable } };
154
+ }
155
+ //# sourceMappingURL=field-defs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"field-defs.js","sourceRoot":"","sources":["../../src/content-types/field-defs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,94 @@
1
+ import { type ContentTypeFieldKind } from "./types.js";
2
+ /**
3
+ * @file CIC U-001 — the `kind`->`CAST` fixed lookup table, the identifier grammar
4
+ * gate, the workspace-scoped queryable-index naming scheme, and the before/after index-transition
5
+ * resolver (grammar-and-workspace-scoping folds).
6
+ *
7
+ * Purpose:
8
+ * THIS IS THE HIGHEST-SECURITY-SEVERITY MODULE IN THE 5-PACKAGE PIPELINE — every value that ends
9
+ * up inside a `CREATE INDEX ... CAST(json_extract(fields,'$.ext.{ns}.{field}') AS {type})`
10
+ * statement is produced here, and only here:
11
+ * - `mapFieldKindToCast` never interpolates an operator-supplied string — it is a fixed,
12
+ * hardcoded 5-entry table (U-001-B1).
13
+ * - `validateIdentifierGrammar`/`buildQueryableFieldIndexName` gate every `key`/field name
14
+ * through `^[a-z][a-z0-9_]{0,63}$` before it can reach an index-name segment or JSON-path
15
+ * literal (U-001-B2), and join grammar-gated segments with `/` — a delimiter outside the
16
+ * grammar's own alphabet `[a-z0-9_]`, closing the namespace-injectivity collision class
17
+ * (U-001-B3) — and fold in a workspace-derived segment so two workspaces defining the same
18
+ * `(key, field)` pair never collide on index identity.
19
+ *
20
+ * How it relates to the project:
21
+ * `write-service.ts`'s `registerContentType`/`updateContentTypeFields` call
22
+ * `resolveFieldIndexTransition` once per field (never two independent kind/queryable branches —
23
+ * CIC U-003-B1) and hand the result to the injected `indexProvisioner` port, which is the only
24
+ * thing that ever issues the real `CREATE INDEX`/`DROP INDEX` DDL (this module only decides what
25
+ * to build, never executes DDL itself).
26
+ *
27
+ * Architectural role:
28
+ * `features/content-types` domain logic. No dependencies beyond `node:crypto` (workspace-segment
29
+ * hashing) and this package's own `errors.ts`/`types.ts`.
30
+ */
31
+ /**
32
+ * U-001-B2 — the closed identifier grammar every `content_types.key` and field name must satisfy,
33
+ * as a pattern string so the agent-facing JSON Schemas in `agent-tools.ts` can publish the very
34
+ * same grammar instead of restating it. A cross-cutting single-source-of-truth governance rule makes this grammar load-bearing for DDL
35
+ * safety, so it must have exactly one definition; {@link IDENTIFIER_GRAMMAR} is compiled from this
36
+ * string rather than written twice.
37
+ */
38
+ export declare const IDENTIFIER_GRAMMAR_PATTERN = "^[a-z][a-z0-9_]{0,63}$";
39
+ /**
40
+ * Structural grammar gate for a `content_types.key` or field name (U-001-B2).
41
+ *
42
+ * @complexity O(n) in the string's length (regex match), bounded at 64 chars.
43
+ * @overallScore 100
44
+ */
45
+ export declare function validateIdentifierGrammar(value: string): boolean;
46
+ /**
47
+ * Maps a closed-enum field `kind` to its fixed `CAST(... AS {type})` type token. Throws
48
+ * {@link InvalidFieldKindError} for anything not exactly one of the 5 enum values — this is a
49
+ * lookup, never a template, so an adversarial payload can never reach the returned string
50
+ * (U-001-B1).
51
+ *
52
+ * @complexity O(1) — a fixed-size object lookup.
53
+ * @overallScore 100
54
+ */
55
+ export declare function mapFieldKindToCast(kind: ContentTypeFieldKind): string;
56
+ /**
57
+ * Builds the workspace-scoped queryable-field index identity for `(workspaceId, contentTypeKey,
58
+ * fieldName)`. Both `contentTypeKey` and `fieldName` are grammar-gated first — a failure throws
59
+ * before any index name is produced (U-001-B2). Segments are joined with `/`, a delimiter outside
60
+ * the grammar's own alphabet `[a-z0-9_]`, so distinct `(key, name)` pairs can never collide by
61
+ * boundary-shifting (U-001-B3, e.g. `("a_b","c")` vs `("a","b_c")`).
62
+ *
63
+ * @complexity O(1) plus two grammar checks and one SHA-256 hash.
64
+ * @overallScore 100
65
+ */
66
+ export declare function buildQueryableFieldIndexName(params: {
67
+ workspaceId: string;
68
+ contentTypeKey: string;
69
+ fieldName: string;
70
+ }): string;
71
+ /** A field's `(kind, queryable)` pair at one side of an update call, or `undefined` if absent (new/removed). */
72
+ export type FieldIndexState = {
73
+ kind: ContentTypeFieldKind;
74
+ queryable: boolean;
75
+ } | undefined;
76
+ export interface FieldIndexTransition {
77
+ action: "none" | "provision" | "teardown" | "reprovision";
78
+ /** Present only for `provision`/`reprovision` — always the field's POST-call kind. */
79
+ newKind?: ContentTypeFieldKind;
80
+ }
81
+ /**
82
+ * CIC U-003-B1 — resolves a single field's index transition from ONE before/after comparison of
83
+ * its `(kind, queryable)` pair, never from two independent branches that each assume the other
84
+ * property is unchanged (the bug class this closes: a field whose `kind` AND `queryable` both
85
+ * change in the same call must still resolve correctly — REQ-30(b)).
86
+ *
87
+ * @complexity O(1) — four comparisons, one of four fixed outcomes.
88
+ * @overallScore 100
89
+ */
90
+ export declare function resolveFieldIndexTransition(params: {
91
+ before: FieldIndexState;
92
+ after: FieldIndexState;
93
+ }): FieldIndexTransition;
94
+ //# sourceMappingURL=index-provisioning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-provisioning.d.ts","sourceRoot":"","sources":["../../src/content-types/index-provisioning.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,oBAAoB,EAA0B,MAAM,YAAY,CAAC;AAEzG;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAKnE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhE;AAcD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAOrE;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAYT;AAED,gHAAgH;AAChH,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;IAC1D,sFAAsF;IACtF,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;CACxB,GAAG,oBAAoB,CAWvB"}