@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,94 @@
1
+ /**
2
+ * @file `mergeTerm`'s gated-mutation instantiation via `core/gated-mutations` — the one gated
3
+ * mutation in this domain.
4
+ *
5
+ * Purpose:
6
+ * Merge is destructive and can silently lose pre-merge `entry_terms` assignment history for
7
+ * content already assigned to both terms — it gets the plan/confirm/execute ceremony every other
8
+ * taxonomy mutation does not. This file owns only this domain's OWN wrapping logic: the structural
9
+ * self-merge guard (rejected BEFORE any overlap computation, so a forged confirmation token for a
10
+ * self-merge can never even exist) and the plan's overlap-loss disclosure. The plan/confirm/execute
11
+ * ordering itself, token TTL, and actor-class rule are `core/gated-mutations`' own certified
12
+ * contract (`core/gated-mutations/__tests__/unit/gateway.unit.test.ts`) — consumed here via
13
+ * injected `gatewayPlan`/`gatewayConfirm`/`gatewayExecute` closures a composition root binds to the
14
+ * real `core/gated-mutations.plan/confirm/execute`, never re-tested here.
15
+ *
16
+ * Certified: no export beyond this plan/confirm/execute trio may perform a merge directly —
17
+ * enforced by `merge-term.unit.test.ts`'s own export-surface inspection.
18
+ */
19
+ export declare class SameTermMergeError extends Error {
20
+ constructor(message: string);
21
+ }
22
+ export interface MergeTermPlanDetails {
23
+ fromTermId: string;
24
+ intoTermId: string;
25
+ overlapLossDisclosed: boolean;
26
+ overlappingContentCount: number;
27
+ }
28
+ export interface PlanMergeTermRequired {
29
+ principalId: string;
30
+ principalKind: "user" | "agent" | "api_key";
31
+ fromTermId: string;
32
+ intoTermId: string;
33
+ /** Counts content already assigned to BOTH terms — the assignments that would be silently
34
+ * deduplicated (and thus permanently lost) by the merge's `entry_terms_unique` dedup step. */
35
+ computeOverlap: () => Promise<{
36
+ overlappingContentCount: number;
37
+ }>;
38
+ /** Bound by the caller to `core/gated-mutations.plan()` with `domain="taxonomy.merge"`. */
39
+ gatewayPlan: (details: MergeTermPlanDetails) => Promise<{
40
+ planId: string;
41
+ planHash: string;
42
+ details: unknown;
43
+ }>;
44
+ }
45
+ /**
46
+ * AC-22a/REQ-15a/INV-08 — rejects `fromTermId === intoTermId` structurally BEFORE
47
+ * `computeOverlap()` ever runs (no plan, therefore no token, can ever exist for a self-merge).
48
+ * AC-23/AC-24/REQ-16 — the returned plan discloses whether the merge would lose any pre-existing
49
+ * overlapping assignment (never a false "no loss" when `overlappingContentCount > 0`).
50
+ *
51
+ * @complexity O(1) plus the caller-supplied `computeOverlap`/`gatewayPlan` costs.
52
+ * @overallScore 100
53
+ */
54
+ export declare function planMergeTerm(required: PlanMergeTermRequired, _optional?: Record<string, never>): Promise<{
55
+ planId: string;
56
+ planHash: string;
57
+ details: MergeTermPlanDetails;
58
+ }>;
59
+ export interface ConfirmMergeTermRequired {
60
+ principalId: string;
61
+ principalKind: "user" | "agent" | "api_key";
62
+ planId: string;
63
+ planHash: string;
64
+ /** Bound by the caller to `core/gated-mutations.confirm()`. */
65
+ gatewayConfirm: (params: {
66
+ planId: string;
67
+ planHash: string;
68
+ }) => Promise<{
69
+ token: string;
70
+ }>;
71
+ }
72
+ /** Delegates to the injected `core/gated-mutations.confirm()` binding — no domain logic of its
73
+ * own beyond forwarding, since `core/gated-mutations` already owns the confirm-time actor-class
74
+ * rule (agents may never confirm) and token minting. */
75
+ export declare function confirmMergeTerm(required: ConfirmMergeTermRequired, _optional?: Record<string, never>): Promise<{
76
+ token: string;
77
+ }>;
78
+ export interface ExecuteMergeTermRequired {
79
+ confirmationToken: string;
80
+ /** Bound by the caller to `core/gated-mutations.execute()`, whose `hooks.executeMutation()` in
81
+ * turn re-points `entry_terms` and writes the one `taxonomy_revisions` row this merge produces. */
82
+ gatewayExecute: (params: {
83
+ confirmationToken: string;
84
+ }) => Promise<{
85
+ mergedCount: number;
86
+ }>;
87
+ }
88
+ /** Delegates to the injected `core/gated-mutations.execute()` binding — its fixed
89
+ * check-sequence (authorize -> token state -> actor-class -> plan-hash -> redeem-then-mutate)
90
+ * runs entirely inside that binding; this function performs no independent redemption logic. */
91
+ export declare function executeMergeTerm(required: ExecuteMergeTermRequired, _optional?: Record<string, never>): Promise<{
92
+ mergedCount: number;
93
+ }>;
94
+ //# sourceMappingURL=merge-term.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-term.d.ts","sourceRoot":"","sources":["../../src/taxonomy/merge-term.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAED,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,oBAAoB,EAAE,OAAO,CAAC;IAC9B,uBAAuB,EAAE,MAAM,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB;kGAC8F;IAC9F,cAAc,EAAE,MAAM,OAAO,CAAC;QAAE,uBAAuB,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IACnE,2FAA2F;IAC3F,WAAW,EAAE,CAAC,OAAO,EAAE,oBAAoB,KAAK,OAAO,CAAC;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACjH;AAED;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,qBAAqB,EAC/B,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,oBAAoB,CAAA;CAAE,CAAC,CAqB9E;AAED,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,aAAa,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAC5C,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;IACjB,+DAA+D;IAC/D,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9F;AAED;;wDAEwD;AACxD,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,wBAAwB,EAClC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAE5B;AAED,MAAM,WAAW,wBAAwB;IACvC,iBAAiB,EAAE,MAAM,CAAC;IAC1B;uGACmG;IACnG,cAAc,EAAE,CAAC,MAAM,EAAE;QAAE,iBAAiB,EAAE,MAAM,CAAA;KAAE,KAAK,OAAO,CAAC;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC7F;AAED;;gGAEgG;AAChG,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE,wBAAwB,EAClC,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAElC"}
@@ -0,0 +1,65 @@
1
+ /**
2
+ * @file `mergeTerm`'s gated-mutation instantiation via `core/gated-mutations` — the one gated
3
+ * mutation in this domain.
4
+ *
5
+ * Purpose:
6
+ * Merge is destructive and can silently lose pre-merge `entry_terms` assignment history for
7
+ * content already assigned to both terms — it gets the plan/confirm/execute ceremony every other
8
+ * taxonomy mutation does not. This file owns only this domain's OWN wrapping logic: the structural
9
+ * self-merge guard (rejected BEFORE any overlap computation, so a forged confirmation token for a
10
+ * self-merge can never even exist) and the plan's overlap-loss disclosure. The plan/confirm/execute
11
+ * ordering itself, token TTL, and actor-class rule are `core/gated-mutations`' own certified
12
+ * contract (`core/gated-mutations/__tests__/unit/gateway.unit.test.ts`) — consumed here via
13
+ * injected `gatewayPlan`/`gatewayConfirm`/`gatewayExecute` closures a composition root binds to the
14
+ * real `core/gated-mutations.plan/confirm/execute`, never re-tested here.
15
+ *
16
+ * Certified: no export beyond this plan/confirm/execute trio may perform a merge directly —
17
+ * enforced by `merge-term.unit.test.ts`'s own export-surface inspection.
18
+ */
19
+ export class SameTermMergeError extends Error {
20
+ constructor(message) {
21
+ super(message);
22
+ this.name = "SameTermMergeError";
23
+ }
24
+ }
25
+ /**
26
+ * AC-22a/REQ-15a/INV-08 — rejects `fromTermId === intoTermId` structurally BEFORE
27
+ * `computeOverlap()` ever runs (no plan, therefore no token, can ever exist for a self-merge).
28
+ * AC-23/AC-24/REQ-16 — the returned plan discloses whether the merge would lose any pre-existing
29
+ * overlapping assignment (never a false "no loss" when `overlappingContentCount > 0`).
30
+ *
31
+ * @complexity O(1) plus the caller-supplied `computeOverlap`/`gatewayPlan` costs.
32
+ * @overallScore 100
33
+ */
34
+ export async function planMergeTerm(required, _optional = {}) {
35
+ const { fromTermId, intoTermId, computeOverlap, gatewayPlan } = required;
36
+ if (fromTermId === intoTermId) {
37
+ throw new SameTermMergeError(`cannot merge term '${fromTermId}' into itself`);
38
+ }
39
+ const { overlappingContentCount } = await computeOverlap();
40
+ const details = {
41
+ fromTermId,
42
+ intoTermId,
43
+ overlapLossDisclosed: overlappingContentCount > 0,
44
+ overlappingContentCount,
45
+ };
46
+ const plan = await gatewayPlan(details);
47
+ return {
48
+ planId: plan.planId,
49
+ planHash: plan.planHash,
50
+ details: plan.details ?? details,
51
+ };
52
+ }
53
+ /** Delegates to the injected `core/gated-mutations.confirm()` binding — no domain logic of its
54
+ * own beyond forwarding, since `core/gated-mutations` already owns the confirm-time actor-class
55
+ * rule (agents may never confirm) and token minting. */
56
+ export async function confirmMergeTerm(required, _optional = {}) {
57
+ return required.gatewayConfirm({ planId: required.planId, planHash: required.planHash });
58
+ }
59
+ /** Delegates to the injected `core/gated-mutations.execute()` binding — its fixed
60
+ * check-sequence (authorize -> token state -> actor-class -> plan-hash -> redeem-then-mutate)
61
+ * runs entirely inside that binding; this function performs no independent redemption logic. */
62
+ export async function executeMergeTerm(required, _optional = {}) {
63
+ return required.gatewayExecute({ confirmationToken: required.confirmationToken });
64
+ }
65
+ //# sourceMappingURL=merge-term.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merge-term.js","sourceRoot":"","sources":["../../src/taxonomy/merge-term.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;GAiBG;AAEH,MAAM,OAAO,kBAAmB,SAAQ,KAAK;IAC3C,YAAY,OAAe;QACzB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,oBAAoB,CAAC;IACnC,CAAC;CACF;AAqBD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,QAA+B,EAC/B,YAAmC,EAAE;IAErC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,cAAc,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IAEzE,IAAI,UAAU,KAAK,UAAU,EAAE,CAAC;QAC9B,MAAM,IAAI,kBAAkB,CAAC,sBAAsB,UAAU,eAAe,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,EAAE,uBAAuB,EAAE,GAAG,MAAM,cAAc,EAAE,CAAC;IAC3D,MAAM,OAAO,GAAyB;QACpC,UAAU;QACV,UAAU;QACV,oBAAoB,EAAE,uBAAuB,GAAG,CAAC;QACjD,uBAAuB;KACxB,CAAC;IAEF,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,OAAO,CAAC,CAAC;IACxC,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,QAAQ,EAAE,IAAI,CAAC,QAAQ;QACvB,OAAO,EAAG,IAAI,CAAC,OAA4C,IAAI,OAAO;KACvE,CAAC;AACJ,CAAC;AAWD;;wDAEwD;AACxD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkC,EAClC,YAAmC,EAAE;IAErC,OAAO,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;AAC3F,CAAC;AASD;;gGAEgG;AAChG,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAAkC,EAClC,YAAmC,EAAE;IAErC,OAAO,QAAQ,CAAC,cAAc,CAAC,EAAE,iBAAiB,EAAE,QAAQ,CAAC,iBAAiB,EAAE,CAAC,CAAC;AACpF,CAAC"}
@@ -0,0 +1,160 @@
1
+ import type { ContentLookupPort, EntryTermRepoPort, TaxonomyRepoPort, TaxonomyRevisionRepoPort, TaxonomyRevisionRow, Term, TermRepoPort } from "./write-service.js";
2
+ import type { Taxonomy } from "./write-service.js";
3
+ import type { TaxonomyListPort, TermListPort } from "./list.js";
4
+ /**
5
+ * @file In-memory adapters for the `taxonomy` package's write/list ports — same disclosed
6
+ * rule-of-two-until-a-real-adapter-exists precedent as `features/content-types/repo.memory.ts`.
7
+ */
8
+ export declare class InMemoryTaxonomyRepo implements TaxonomyRepoPort, TaxonomyListPort {
9
+ private readonly rows;
10
+ insert(row: Taxonomy): Promise<unknown>;
11
+ findById(id: string): Promise<{
12
+ id: string;
13
+ hierarchical: boolean;
14
+ allowList?: string[] | undefined;
15
+ } | null>;
16
+ list(): Promise<Taxonomy[]>;
17
+ /** `DeletableTaxonomyRepoPort` — additive capability for `deleteTaxonomy`, see
18
+ * `write-service.ts`'s doc comment on that interface. */
19
+ delete(id: string): Promise<void>;
20
+ /**
21
+ * `TransactionalRepoPort` — disclosed narrowing, not a silently-wrong implementation of a real
22
+ * capability (same disclosure style as `noopStampWatermark` below): a plain in-process `Map` has
23
+ * no rollback primitive to offer, and — unlike a real SQLite connection another OS process could
24
+ * also be writing to — nothing else can observe or mutate this `Map` between two `await`s of a
25
+ * single request's own call chain (Node drains the full microtask queue, including every
26
+ * already-scheduled continuation of THIS call, before it services a different macrotask/request;
27
+ * see `write-service.ts`'s `TransactionalRepoPort` doc for what this exists to prevent). So the
28
+ * TOCTOU risk that port exists to close cannot arise against this adapter specifically. What is
29
+ * NOT covered: a genuine mid-cascade exception (e.g. `deleteTaxonomy`'s second `terms.delete`
30
+ * throwing) leaves whatever this call chain already wrote — across this Map and its SIBLING
31
+ * `InMemoryTermRepo`/`InMemoryEntryTermRepo` instances — un-rolled-back, since no in-memory
32
+ * transaction spans multiple independent `Map`s. In-memory mode is dev/test-only (`server/
33
+ * app.ts`'s hermetic composition), never the host of a real workspace's real content, which is
34
+ * why this gap is accepted here rather than closed.
35
+ */
36
+ transaction<T>(fn: () => Promise<T>): Promise<T>;
37
+ }
38
+ export declare class InMemoryTermRepo implements TermRepoPort, TermListPort {
39
+ private readonly rows;
40
+ insert(row: Term): Promise<unknown>;
41
+ update(row: Term): Promise<unknown>;
42
+ findById(id: string): Promise<{
43
+ id: string;
44
+ taxonomyId: string;
45
+ name?: string | undefined;
46
+ } | null>;
47
+ listByTaxonomy(params: {
48
+ taxonomyId: string;
49
+ }): Promise<Term[]>;
50
+ /** Ancestor-chain lookup for `validation-chain.ts`'s `wouldCreateCycle` — not required by any
51
+ * currently-wired route (reparent has no route this pass, design-spec.md §2.8), kept here so a
52
+ * future reparent route has a ready-made `TermTreeLookup` to inject. */
53
+ getParentId(termId: string): string | null;
54
+ /** `DeletableTermRepoPort` — additive capability for `deleteTerm`/`deleteTaxonomy`, see
55
+ * `write-service.ts`'s doc comment on that interface. */
56
+ delete(id: string): Promise<void>;
57
+ /** `DeletableTermRepoPort.countChildren` — direct children only (one level), matching
58
+ * `deleteTerm`'s guard (it does not recurse past the first level; a grandchild whose direct
59
+ * parent is itself already blocked from deletion is caught when that intermediate term's own
60
+ * delete is attempted). */
61
+ countChildren(params: {
62
+ parentId: string;
63
+ }): Promise<number>;
64
+ }
65
+ export declare class InMemoryEntryTermRepo implements EntryTermRepoPort {
66
+ private readonly rows;
67
+ upsert(row: {
68
+ contentType: string;
69
+ contentId: string;
70
+ termId: string;
71
+ addedAt: string;
72
+ }): Promise<unknown>;
73
+ deleteByContent(params: {
74
+ workspaceId: string;
75
+ contentType: string;
76
+ contentId: string;
77
+ }): Promise<number>;
78
+ /** Mirrors `SqliteEntryTermRepo.countOverlap` — see that method's doc comment for the full
79
+ * rationale (an additive capability beyond the certified `EntryTermRepoPort`, needed by the
80
+ * `mergeTerm` gated-mutation composition this dispatch wires). */
81
+ countOverlap(params: {
82
+ fromTermId: string;
83
+ intoTermId: string;
84
+ }): Promise<number>;
85
+ /** Mirrors `SqliteEntryTermRepo.repointTerm`. */
86
+ repointTerm(params: {
87
+ fromTermId: string;
88
+ intoTermId: string;
89
+ }): Promise<{
90
+ repointedCount: number;
91
+ }>;
92
+ /** `AssignmentCountEntryTermRepoPort` — additive capability for `deleteTerm`/`deleteTaxonomy`'s
93
+ * content-assignment guard, see `write-service.ts`'s doc comment on that interface. */
94
+ countByTerm(params: {
95
+ termId: string;
96
+ }): Promise<number>;
97
+ }
98
+ export declare class InMemoryTaxonomyRevisionRepo implements TaxonomyRevisionRepoPort {
99
+ readonly rows: TaxonomyRevisionRow[];
100
+ insert(row: TaxonomyRevisionRow): Promise<unknown>;
101
+ }
102
+ /**
103
+ * In-memory `ContentLookupPort` — test-friendly, keyed by `(contentType, contentId)`, no real
104
+ * `posts` table backing it. Seed content into `rows` directly (or via the constructor) before a
105
+ * test exercises `assignTerms`'s content-join validation (Finding 1 fix,
106
+ * TM-adr041-043-044-045-audit-001).
107
+ */
108
+ export declare class InMemoryContentLookup implements ContentLookupPort {
109
+ private readonly rows;
110
+ constructor(seed?: Array<{
111
+ contentType: string;
112
+ contentId: string;
113
+ workspaceId: string;
114
+ kind: string;
115
+ }>);
116
+ set(contentType: string, contentId: string, value: {
117
+ workspaceId: string;
118
+ kind: string;
119
+ }): void;
120
+ resolve(params: {
121
+ contentType: string;
122
+ contentId: string;
123
+ }): Promise<{
124
+ workspaceId: string;
125
+ kind: string;
126
+ } | null>;
127
+ }
128
+ /** No-op `stampWatermark` — `WriteServiceDeps.stampWatermark` is required (not optional, unlike
129
+ * `content-types`/`entries`' own watermark ports), but this package has no SQLite adapter yet
130
+ * (this file's header) so there is no real watermark row to advance. Disclosed stand-in, not a
131
+ * silently-wrong implementation of a real capability. */
132
+ export declare function noopStampWatermark(): void;
133
+ /** Adapts a real `core/ports` `OutboxPort` into the loose `{enqueue(event: unknown)}` shape
134
+ * `taxonomy/write-service.ts` declares locally. That package's own event objects already carry
135
+ * `name`/`occurredAt` at their top level (unlike `content-types`/`entries`' nested-`payload`
136
+ * shape), so this wrapper forwards them as the full event payload rather than re-nesting. */
137
+ export declare function toTaxonomyOutbox(deps: {
138
+ outbox: {
139
+ enqueue(event: {
140
+ id: string;
141
+ workspaceId: string;
142
+ name: string;
143
+ occurredAt: string;
144
+ payload: Record<string, unknown>;
145
+ }): Promise<void>;
146
+ };
147
+ clock: {
148
+ nowIso(): string;
149
+ };
150
+ idGen: {
151
+ newId(): string;
152
+ };
153
+ /** Required — see `entries/repo.memory.ts`'s `toEntryOutbox` for the full rationale. Taxonomy is
154
+ * the case that rules out reading the tenant off the event: its own event objects
155
+ * (`{name, taxonomyId, actorId, occurredAt}`) carry no `workspaceId` at all. */
156
+ workspaceId: string;
157
+ }): {
158
+ enqueue: (event: unknown) => Promise<void>;
159
+ };
160
+ //# sourceMappingURL=repo.memory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.memory.d.ts","sourceRoot":"","sources":["../../src/taxonomy/repo.memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,171 @@
1
+ /**
2
+ * @file In-memory adapters for the `taxonomy` package's write/list ports — same disclosed
3
+ * rule-of-two-until-a-real-adapter-exists precedent as `features/content-types/repo.memory.ts`.
4
+ */
5
+ export class InMemoryTaxonomyRepo {
6
+ rows = new Map();
7
+ async insert(row) {
8
+ this.rows.set(row.id, { ...row });
9
+ return row;
10
+ }
11
+ async findById(id) {
12
+ const row = this.rows.get(id);
13
+ return row ? { id: row.id, hierarchical: row.hierarchical } : null;
14
+ }
15
+ async list() {
16
+ return [...this.rows.values()].map((row) => ({ ...row }));
17
+ }
18
+ /** `DeletableTaxonomyRepoPort` — additive capability for `deleteTaxonomy`, see
19
+ * `write-service.ts`'s doc comment on that interface. */
20
+ async delete(id) {
21
+ this.rows.delete(id);
22
+ }
23
+ /**
24
+ * `TransactionalRepoPort` — disclosed narrowing, not a silently-wrong implementation of a real
25
+ * capability (same disclosure style as `noopStampWatermark` below): a plain in-process `Map` has
26
+ * no rollback primitive to offer, and — unlike a real SQLite connection another OS process could
27
+ * also be writing to — nothing else can observe or mutate this `Map` between two `await`s of a
28
+ * single request's own call chain (Node drains the full microtask queue, including every
29
+ * already-scheduled continuation of THIS call, before it services a different macrotask/request;
30
+ * see `write-service.ts`'s `TransactionalRepoPort` doc for what this exists to prevent). So the
31
+ * TOCTOU risk that port exists to close cannot arise against this adapter specifically. What is
32
+ * NOT covered: a genuine mid-cascade exception (e.g. `deleteTaxonomy`'s second `terms.delete`
33
+ * throwing) leaves whatever this call chain already wrote — across this Map and its SIBLING
34
+ * `InMemoryTermRepo`/`InMemoryEntryTermRepo` instances — un-rolled-back, since no in-memory
35
+ * transaction spans multiple independent `Map`s. In-memory mode is dev/test-only (`server/
36
+ * app.ts`'s hermetic composition), never the host of a real workspace's real content, which is
37
+ * why this gap is accepted here rather than closed.
38
+ */
39
+ async transaction(fn) {
40
+ return fn();
41
+ }
42
+ }
43
+ export class InMemoryTermRepo {
44
+ rows = new Map();
45
+ async insert(row) {
46
+ this.rows.set(row.id, { ...row });
47
+ return row;
48
+ }
49
+ async update(row) {
50
+ this.rows.set(row.id, { ...row });
51
+ return row;
52
+ }
53
+ async findById(id) {
54
+ const row = this.rows.get(id);
55
+ return row ? { id: row.id, taxonomyId: row.taxonomyId, name: row.name } : null;
56
+ }
57
+ async listByTaxonomy(params) {
58
+ return [...this.rows.values()].filter((row) => row.taxonomyId === params.taxonomyId).map((row) => ({ ...row }));
59
+ }
60
+ /** Ancestor-chain lookup for `validation-chain.ts`'s `wouldCreateCycle` — not required by any
61
+ * currently-wired route (reparent has no route this pass, design-spec.md §2.8), kept here so a
62
+ * future reparent route has a ready-made `TermTreeLookup` to inject. */
63
+ getParentId(termId) {
64
+ return this.rows.get(termId)?.parentId ?? null;
65
+ }
66
+ /** `DeletableTermRepoPort` — additive capability for `deleteTerm`/`deleteTaxonomy`, see
67
+ * `write-service.ts`'s doc comment on that interface. */
68
+ async delete(id) {
69
+ this.rows.delete(id);
70
+ }
71
+ /** `DeletableTermRepoPort.countChildren` — direct children only (one level), matching
72
+ * `deleteTerm`'s guard (it does not recurse past the first level; a grandchild whose direct
73
+ * parent is itself already blocked from deletion is caught when that intermediate term's own
74
+ * delete is attempted). */
75
+ async countChildren(params) {
76
+ let count = 0;
77
+ for (const row of this.rows.values()) {
78
+ if (row.parentId === params.parentId)
79
+ count += 1;
80
+ }
81
+ return count;
82
+ }
83
+ }
84
+ export class InMemoryEntryTermRepo {
85
+ rows = [];
86
+ async upsert(row) {
87
+ const existingIndex = this.rows.findIndex((r) => r.contentType === row.contentType && r.contentId === row.contentId && r.termId === row.termId);
88
+ if (existingIndex >= 0) {
89
+ this.rows[existingIndex] = row;
90
+ }
91
+ else {
92
+ this.rows.push(row);
93
+ }
94
+ return row;
95
+ }
96
+ async deleteByContent(params) {
97
+ const before = this.rows.length;
98
+ const remaining = this.rows.filter((r) => !(r.contentType === params.contentType && r.contentId === params.contentId));
99
+ this.rows.length = 0;
100
+ this.rows.push(...remaining);
101
+ return before - this.rows.length;
102
+ }
103
+ /** Mirrors `SqliteEntryTermRepo.countOverlap` — see that method's doc comment for the full
104
+ * rationale (an additive capability beyond the certified `EntryTermRepoPort`, needed by the
105
+ * `mergeTerm` gated-mutation composition this dispatch wires). */
106
+ async countOverlap(params) {
107
+ const fromKeys = new Set(this.rows.filter((r) => r.termId === params.fromTermId).map((r) => `${r.contentType}::${r.contentId}`));
108
+ return this.rows.filter((r) => r.termId === params.intoTermId && fromKeys.has(`${r.contentType}::${r.contentId}`)).length;
109
+ }
110
+ /** Mirrors `SqliteEntryTermRepo.repointTerm`. */
111
+ async repointTerm(params) {
112
+ const fromRows = this.rows.filter((r) => r.termId === params.fromTermId);
113
+ for (const row of fromRows) {
114
+ await this.upsert({ contentType: row.contentType, contentId: row.contentId, termId: params.intoTermId, addedAt: row.addedAt });
115
+ }
116
+ const remaining = this.rows.filter((r) => r.termId !== params.fromTermId);
117
+ this.rows.length = 0;
118
+ this.rows.push(...remaining);
119
+ return { repointedCount: fromRows.length };
120
+ }
121
+ /** `AssignmentCountEntryTermRepoPort` — additive capability for `deleteTerm`/`deleteTaxonomy`'s
122
+ * content-assignment guard, see `write-service.ts`'s doc comment on that interface. */
123
+ async countByTerm(params) {
124
+ return this.rows.filter((r) => r.termId === params.termId).length;
125
+ }
126
+ }
127
+ export class InMemoryTaxonomyRevisionRepo {
128
+ rows = [];
129
+ async insert(row) {
130
+ this.rows.push(row);
131
+ return row;
132
+ }
133
+ }
134
+ /**
135
+ * In-memory `ContentLookupPort` — test-friendly, keyed by `(contentType, contentId)`, no real
136
+ * `posts` table backing it. Seed content into `rows` directly (or via the constructor) before a
137
+ * test exercises `assignTerms`'s content-join validation (Finding 1 fix,
138
+ * TM-adr041-043-044-045-audit-001).
139
+ */
140
+ export class InMemoryContentLookup {
141
+ rows;
142
+ constructor(seed = []) {
143
+ this.rows = new Map(seed.map((s) => [`${s.contentType}::${s.contentId}`, { workspaceId: s.workspaceId, kind: s.kind }]));
144
+ }
145
+ set(contentType, contentId, value) {
146
+ this.rows.set(`${contentType}::${contentId}`, value);
147
+ }
148
+ async resolve(params) {
149
+ return this.rows.get(`${params.contentType}::${params.contentId}`) ?? null;
150
+ }
151
+ }
152
+ /** No-op `stampWatermark` — `WriteServiceDeps.stampWatermark` is required (not optional, unlike
153
+ * `content-types`/`entries`' own watermark ports), but this package has no SQLite adapter yet
154
+ * (this file's header) so there is no real watermark row to advance. Disclosed stand-in, not a
155
+ * silently-wrong implementation of a real capability. */
156
+ export function noopStampWatermark() { }
157
+ /** Adapts a real `core/ports` `OutboxPort` into the loose `{enqueue(event: unknown)}` shape
158
+ * `taxonomy/write-service.ts` declares locally. That package's own event objects already carry
159
+ * `name`/`occurredAt` at their top level (unlike `content-types`/`entries`' nested-`payload`
160
+ * shape), so this wrapper forwards them as the full event payload rather than re-nesting. */
161
+ export function toTaxonomyOutbox(deps) {
162
+ return {
163
+ enqueue: async (event) => {
164
+ const record = event;
165
+ const name = typeof record.name === "string" ? record.name : "taxonomy.event";
166
+ const occurredAt = typeof record.occurredAt === "string" ? record.occurredAt : deps.clock.nowIso();
167
+ await deps.outbox.enqueue({ id: deps.idGen.newId(), workspaceId: deps.workspaceId, name, occurredAt, payload: record });
168
+ },
169
+ };
170
+ }
171
+ //# sourceMappingURL=repo.memory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"repo.memory.js","sourceRoot":"","sources":["../../src/taxonomy/repo.memory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * @file The fixed taxonomy validation chains.
3
+ *
4
+ * Purpose:
5
+ * Two pure, order-critical decision functions:
6
+ * - `validateContentJoin` — the allow-list -> workspace -> lens chain that gates every
7
+ * `entry_terms` write ("opt-in per content type" plus the workspace/lens folds a security
8
+ * audit added).
9
+ * - `validateHierarchyAssignment` — the hierarchical-mode -> same-taxonomy -> cycle chain
10
+ * that gates every `parentId` write.
11
+ *
12
+ * Both chains were the exact unit three separate Red-Team rounds found real ordering defects in —
13
+ * a combined-failure case must always report the FIRST-in-order failure, never a later one that
14
+ * also happens to apply. Every test in `validation-chain.unit.test.ts` replays one of those
15
+ * regressions or a compound-failure case to lock the order in place.
16
+ *
17
+ * `wouldCreateCycle` is the full ancestor-chain walk `validateHierarchyAssignment`'s cycle check
18
+ * ultimately calls — kept exported separately since it has its own certified property tests
19
+ * (depth 1-10 chains) independent of the chain that wraps it.
20
+ *
21
+ * How it relates to the project:
22
+ * Consumed directly by `write-service.ts`'s `createTerm`/`renameTerm`/`assignTerms` (and would be
23
+ * consumed by a future `reparentTerm`, not yet built — no certified test in this slice exercises
24
+ * it). Reuses no port/dep — these are pure functions over caller-resolved data, never performing
25
+ * their own repo lookups, so the ordering guarantee holds regardless of how a caller wires them.
26
+ */
27
+ export declare class TaxonomyNotApplicableError extends Error {
28
+ constructor(message: string);
29
+ }
30
+ export declare class WorkspaceMismatchError extends Error {
31
+ constructor(message: string);
32
+ }
33
+ export declare class ContentTypeMismatchError extends Error {
34
+ constructor(message: string);
35
+ }
36
+ export declare class TaxonomyNotHierarchicalError extends Error {
37
+ constructor(message: string);
38
+ }
39
+ export declare class ParentCrossTaxonomyError extends Error {
40
+ constructor(message: string);
41
+ }
42
+ export declare class TermNotFoundError extends Error {
43
+ constructor(message: string);
44
+ }
45
+ export declare class HierarchyCycleDetectedError extends Error {
46
+ constructor(message: string);
47
+ }
48
+ /** Ancestor-chain lookup a cycle check walks. `null` marks a root (no parent). */
49
+ export interface TermTreeLookup {
50
+ getParentId(termId: string): string | null;
51
+ }
52
+ /**
53
+ * CIC U-002 — true if assigning `candidateParentId` as `termId`'s parent would create a cycle:
54
+ * either immediate self-parenting, or `termId` appearing anywhere in `candidateParentId`'s own
55
+ * ancestor chain. A full recursive walk, not a fixed-depth or immediate-parent-only comparison
56
+ * (U-002-B1) — the exact shape a naive implementation gets wrong (a 3+-hop cycle is the
57
+ * regression case this exists to catch).
58
+ *
59
+ * A `visited` guard bounds the walk even against a pre-existing malformed tree (defensive; no
60
+ * certified test constructs one, but an unbounded walk over attacker/bug-corrupted ancestor data
61
+ * would otherwise loop forever).
62
+ *
63
+ * @complexity O(depth) — one `getParentId` call per ancestor hop, each hop visited at most once.
64
+ * @overallScore 100
65
+ */
66
+ export declare function wouldCreateCycle(required: {
67
+ termId: string;
68
+ candidateParentId: string;
69
+ tree: TermTreeLookup;
70
+ }, _optional?: Record<string, never>): boolean;
71
+ /**
72
+ * U-001-B1/ORD1/ORD2 — the content-join chain: allow-list, THEN workspace, THEN lens, in that
73
+ * fixed order. A combined-failure case always reports the first-in-order failure (U-001-ORD1:
74
+ * not-on-allow-list always wins over a simultaneous workspace mismatch; U-001-ORD2: a workspace
75
+ * mismatch always wins over a simultaneous lens mismatch).
76
+ *
77
+ * @complexity O(1) — three independent comparisons, no loop.
78
+ * @overallScore 100
79
+ */
80
+ export declare function validateContentJoin(required: {
81
+ taxonomyId: string;
82
+ isOnAllowList: boolean;
83
+ callerWorkspaceId: string;
84
+ resolvedTermWorkspaceId: string;
85
+ resolvedContentWorkspaceId: string;
86
+ suppliedContentType: string;
87
+ resolvedContentKind: string;
88
+ }, _optional?: Record<string, never>): void;
89
+ /**
90
+ * U-001-B2/B3/ORD3 — the hierarchy chain: hierarchical-mode, THEN same-taxonomy (distinguishing
91
+ * not-found from wrong-taxonomy), THEN cycle, in that fixed order. `null` `candidateParentId`
92
+ * (no parent assignment attempted) always short-circuits to a pass regardless of mode (RT-012's
93
+ * regression: a no-op parent write must never be rejected).
94
+ *
95
+ * The compound RT-001 regression this chain exists to prevent: a flat taxonomy's candidate parent
96
+ * that ALSO happens to exist in a different taxonomy must report `TAXONOMY_NOT_HIERARCHICAL`,
97
+ * never `PARENT_CROSS_TAXONOMY` — hierarchical-mode is checked first and is decisive on its own.
98
+ *
99
+ * @complexity O(1) plus the injected `wouldCreateCycle` closure's own cost (U-002, only reached
100
+ * once hierarchical-mode and same-taxonomy both pass).
101
+ * @overallScore 100
102
+ */
103
+ export declare function validateHierarchyAssignment(required: {
104
+ childTaxonomyId: string;
105
+ taxonomyIsHierarchical: boolean;
106
+ candidateParentId: string | null;
107
+ resolvedParent: {
108
+ id: string;
109
+ taxonomyId: string;
110
+ } | null | "not-applicable";
111
+ wouldCreateCycle: (candidateParentId: string) => boolean;
112
+ termId: string;
113
+ }, _optional?: Record<string, never>): void;
114
+ //# sourceMappingURL=validation-chain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation-chain.d.ts","sourceRoot":"","sources":["../../src/taxonomy/validation-chain.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,qBAAa,0BAA2B,SAAQ,KAAK;gBACvC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,iBAAkB,SAAQ,KAAK;gBAC9B,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;CAC5C;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,cAAc,CAAA;CAAE,EAC7E,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,OAAO,CAeT;AAED;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE;IACR,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,OAAO,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,uBAAuB,EAAE,MAAM,CAAC;IAChC,0BAA0B,EAAE,MAAM,CAAC;IACnC,mBAAmB,EAAE,MAAM,CAAC;IAC5B,mBAAmB,EAAE,MAAM,CAAC;CAC7B,EACD,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,IAAI,CA4BN;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE;IACR,eAAe,EAAE,MAAM,CAAC;IACxB,sBAAsB,EAAE,OAAO,CAAC;IAChC,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,cAAc,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,GAAG,gBAAgB,CAAC;IAC7E,gBAAgB,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC;IACzD,MAAM,EAAE,MAAM,CAAC;CAChB,EACD,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,IAAI,CA2BN"}