@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,437 @@
1
+ import { resolveEffectivePermissions } from "./authorize.js";
2
+ import { assertCallerHasAnyPermission, assertGrantClamp, authorizeDepsFrom } from "./grant-service.js";
3
+ import { validatePasswordPolicy } from "./password-policy.js";
4
+ import { isKnownPermission } from "./permissions.js";
5
+ import { IdentityConflictError, IdentityNotFoundError, IdentityValidationError, OwnerRequiredError, PermissionUnknownError, } from "./types.js";
6
+ /**
7
+ * @file An amendment that completes the users/roles/policies admin CRUD surface
8
+ * (feature.spec.md REQ-11/REQ-15..19).
9
+ *
10
+ * Purpose:
11
+ * Two of these nine transitions (`disablePrincipal`, `writePolicyPermission`) were fully specified
12
+ * since v0.5.0/v0.5.3 but never implemented — this file is their first implementation, not a
13
+ * re-specification (AC-32). The other seven (`enablePrincipal`, `updateUser`,
14
+ * `resetUserPassword`, `updateRole`, `updatePolicy`, `deleteRole`, `deletePolicy`) are new
15
+ * transitions this amendment adds. Grouped in one file, separate from `grant-service.ts`'s
16
+ * "human grant-writing transitions" (`CREATE_*`/`ASSIGN_ROLE`/`ATTACH_POLICY`) because most of
17
+ * these are plain CRUD, not grant-writing — `writePolicyPermission` is the one exception (it IS
18
+ * INV-07-clamped) and reuses `grant-service.ts`'s exported `assertGrantClamp` rather than
19
+ * duplicating it.
20
+ *
21
+ * Architectural role:
22
+ * Ordinary core functions — same shape as `grant-service.ts`: one exported async
23
+ * function per transition, plain `Error` subclasses for control flow, the caller-permission gate
24
+ * enforced here (not pushed to the route layer).
25
+ */
26
+ /**
27
+ * `DISABLE_PRINCIPAL` (feature.spec.md REQ-11, state.spec §3, AC-08/AC-21/AC-27). Gated by
28
+ * `user.manage`. Refuses the seeded owner unconditionally (REQ-13's CLI/core resolution target —
29
+ * disabling it would strand the CLI-only management plane) and refuses any disable that would drop
30
+ * the workspace's active owner-`*` count to zero (INV-08) — both checked, and the status update
31
+ * performed, inside this one function body with no `await` yielded to another caller in between
32
+ * (this codebase's established "atomic by construction" reasoning for a single-connection,
33
+ * single-event-loop composition — same as `features/workspace/delete.ts`'s INV-03 guard).
34
+ *
35
+ * `input.seededOwnerPrincipalId` is the caller's job to resolve (`await deps.ownerPrincipalId` at
36
+ * the route layer, mirroring `identityReady`'s existing await-before-use convention) — this
37
+ * function takes the already-resolved id so it stays a plain, directly-testable function.
38
+ *
39
+ * @complexity O(n) in the workspace's principal count (one `list()` call to count active owner-`*`
40
+ * holders) — bounded by the same operator-managed-roster assumption `identity/INFO.md` already
41
+ * makes for `PrincipalRepoPort.list()`.
42
+ * @overallScore 100
43
+ */
44
+ export async function disablePrincipal(required) {
45
+ const { deps, input } = required;
46
+ await assertCallerHasAnyPermission({
47
+ deps,
48
+ workspaceId: input.workspaceId,
49
+ callerPrincipalId: input.callerPrincipalId,
50
+ permissions: ["user.manage"],
51
+ });
52
+ const target = await deps.repos.principals.findById({ workspaceId: input.workspaceId, id: input.principalId });
53
+ if (!target)
54
+ throw new IdentityNotFoundError(`principal '${input.principalId}' was not found`);
55
+ if (target.id === input.seededOwnerPrincipalId) {
56
+ throw new OwnerRequiredError("the seeded owner principal can never be disabled (REQ-11/REQ-13)");
57
+ }
58
+ if (target.status === "disabled") {
59
+ // Idempotent — matches LOGOUT's "already revoked is a no-op" discipline (state.spec §3).
60
+ return { principal: target };
61
+ }
62
+ const holdsOwnerWildcard = await principalHoldsOwnerWildcard({
63
+ deps,
64
+ workspaceId: input.workspaceId,
65
+ principalId: target.id,
66
+ });
67
+ if (holdsOwnerWildcard) {
68
+ const activeOwnerCount = await countActiveOwnerWildcardPrincipals({ deps, workspaceId: input.workspaceId });
69
+ if (activeOwnerCount <= 1) {
70
+ throw new OwnerRequiredError("the workspace must keep at least one active owner-`*` principal (INV-08)");
71
+ }
72
+ }
73
+ const disabled = { ...target, status: "disabled", disabledAt: deps.clock.nowIso() };
74
+ await deps.repos.principals.save(disabled);
75
+ return { principal: disabled };
76
+ }
77
+ /**
78
+ * `ENABLE_PRINCIPAL` (feature.spec.md REQ-15, AC-27, EC-14). Gated by `user.manage`. Target must be
79
+ * `kind='user'` — a `system`/`api_key` target is rejected `VALIDATION_ERROR` (mirrors AC-25b's
80
+ * human-only scoping; re-activating the disabled legacy `user-local` stub or an api_key principal
81
+ * outside `ISSUE_API_KEY`'s own lifecycle is never a valid call). Already-active is idempotent
82
+ * (mirrors `disablePrincipal`'s own already-disabled no-op above).
83
+ *
84
+ * @complexity O(1) — one lookup, one save.
85
+ * @overallScore 100
86
+ */
87
+ export async function enablePrincipal(required) {
88
+ const { deps, input } = required;
89
+ await assertCallerHasAnyPermission({
90
+ deps,
91
+ workspaceId: input.workspaceId,
92
+ callerPrincipalId: input.callerPrincipalId,
93
+ permissions: ["user.manage"],
94
+ });
95
+ const target = await deps.repos.principals.findById({ workspaceId: input.workspaceId, id: input.principalId });
96
+ if (!target)
97
+ throw new IdentityNotFoundError(`principal '${input.principalId}' was not found`);
98
+ if (target.kind !== "user") {
99
+ throw new IdentityValidationError(`ENABLE_PRINCIPAL target must be a human (kind='user') principal, got kind='${target.kind}'`);
100
+ }
101
+ if (target.status === "active") {
102
+ return { principal: target };
103
+ }
104
+ const enabled = { ...target, status: "active", disabledAt: undefined };
105
+ await deps.repos.principals.save(enabled);
106
+ return { principal: enabled };
107
+ }
108
+ /**
109
+ * `UPDATE_USER` (feature.spec.md REQ-16, AC-28). Gated by `user.manage` **or** `member.manage`
110
+ * (mirrors `CREATE_USER`'s admin-onboarding gate) — `email` only; `username`/`password` are not
111
+ * this transition's concern (OQ-09 / REQ-17 respectively). An absent or empty-string `email`
112
+ * clears the stored value to `undefined` (EC-17 — no distinct "blank but present" state).
113
+ *
114
+ * @complexity O(1) — one lookup, one save.
115
+ * @overallScore 100
116
+ */
117
+ export async function updateUser(required) {
118
+ const { deps, input } = required;
119
+ await assertCallerHasAnyPermission({
120
+ deps,
121
+ workspaceId: input.workspaceId,
122
+ callerPrincipalId: input.callerPrincipalId,
123
+ permissions: ["user.manage", "member.manage"],
124
+ });
125
+ const target = await deps.repos.users.findByPrincipalId({
126
+ workspaceId: input.workspaceId,
127
+ principalId: input.principalId,
128
+ });
129
+ if (!target)
130
+ throw new IdentityNotFoundError(`user '${input.principalId}' was not found`);
131
+ const updated = { ...target, email: input.email ? input.email : undefined };
132
+ await deps.repos.users.save(updated);
133
+ return { user: updated };
134
+ }
135
+ /**
136
+ * `RESET_USER_PASSWORD` (feature.spec.md REQ-17, AC-29, EC-16). Gated by **`user.manage`** only
137
+ * (stricter than `updateUser` — resetting a credential is at least as sensitive as disabling the
138
+ * account, REQ-17's own reasoning). Hashes the new password identically to `CREATE_USER` (argon2id,
139
+ * INV-05), then revokes every one of the target's active sessions (idempotent no-op if it has none,
140
+ * EC-16) — a reset that left old sessions alive would not actually contain a compromised account.
141
+ *
142
+ * @complexity O(s) in the target's session count, s = active session rows to revoke — bounded by
143
+ * the same operator-managed-roster scale assumption every other identity list call here makes.
144
+ * @overallScore 100
145
+ */
146
+ export async function resetUserPassword(required) {
147
+ const { deps, input } = required;
148
+ await assertCallerHasAnyPermission({
149
+ deps,
150
+ workspaceId: input.workspaceId,
151
+ callerPrincipalId: input.callerPrincipalId,
152
+ permissions: ["user.manage"],
153
+ });
154
+ const target = await deps.repos.users.findByPrincipalId({
155
+ workspaceId: input.workspaceId,
156
+ principalId: input.principalId,
157
+ });
158
+ if (!target)
159
+ throw new IdentityNotFoundError(`user '${input.principalId}' was not found`);
160
+ if (!input.password) {
161
+ throw new IdentityValidationError("password is required");
162
+ }
163
+ // Same NIST SP 800-63B length-only policy `createUser` applies. Both write paths must enforce
164
+ // it or neither does: a reset that accepted a 1-character password would be a strictly easier
165
+ // way to reach the state the create-side check exists to prevent. Never reaches `seed.ts`'s
166
+ // owner password or the login path — see `password-policy.ts`'s header for why.
167
+ const passwordError = validatePasswordPolicy(input.password);
168
+ if (passwordError) {
169
+ throw new IdentityValidationError(passwordError);
170
+ }
171
+ const passwordHash = await deps.hasher.hash(input.password);
172
+ const updated = { ...target, passwordHash };
173
+ await deps.repos.users.save(updated);
174
+ const sessions = await deps.repos.sessions.listByPrincipalId({
175
+ workspaceId: input.workspaceId,
176
+ principalId: input.principalId,
177
+ });
178
+ const nowIso = deps.clock.nowIso();
179
+ await Promise.all(sessions
180
+ .filter((session) => !session.revokedAt)
181
+ .map((session) => deps.repos.sessions.revoke({ workspaceId: input.workspaceId, id: session.id, revokedAt: nowIso })));
182
+ return { user: updated };
183
+ }
184
+ /**
185
+ * `UPDATE_ROLE` (feature.spec.md REQ-18, AC-30). Gated by `role.manage`. A built-in target is
186
+ * refused `VALIDATION_ERROR` — extends INV-06's existing undeletable/immutable/un-attachable-to
187
+ * rule to also cover un-renameable (same escalation shape: relabeling `viewer` to read as trusted
188
+ * is a social-engineering variant of what INV-06 already blocks structurally).
189
+ *
190
+ * @complexity O(1) — one lookup, one save.
191
+ * @overallScore 100
192
+ */
193
+ export async function updateRole(required) {
194
+ const { deps, input } = required;
195
+ await assertCallerHasAnyPermission({
196
+ deps,
197
+ workspaceId: input.workspaceId,
198
+ callerPrincipalId: input.callerPrincipalId,
199
+ permissions: ["role.manage"],
200
+ });
201
+ const target = await deps.repos.roles.findById({ workspaceId: input.workspaceId, id: input.roleId });
202
+ if (!target)
203
+ throw new IdentityNotFoundError(`role '${input.roleId}' was not found`);
204
+ if (target.isBuiltin) {
205
+ throw new IdentityValidationError("a built-in role cannot be renamed (INV-06)");
206
+ }
207
+ const name = (input.name ?? "").trim();
208
+ if (!name)
209
+ throw new IdentityValidationError("role name is required");
210
+ const updated = { ...target, name };
211
+ await deps.repos.roles.save(updated);
212
+ return { role: updated };
213
+ }
214
+ /**
215
+ * `UPDATE_POLICY` (feature.spec.md REQ-18, AC-30). Gated by `role.manage`. A built-in or
216
+ * `is_frozen` target is refused `VALIDATION_ERROR` — the frozen-policy half mirrors
217
+ * `WRITE_POLICY_PERMISSION`'s existing refusal (AC-26): an issuance snapshot's identity is as
218
+ * immutable as its permission set. At least one of `name`/`description` must be present.
219
+ *
220
+ * @complexity O(1) — one lookup, one save.
221
+ * @overallScore 100
222
+ */
223
+ export async function updatePolicy(required) {
224
+ const { deps, input } = required;
225
+ await assertCallerHasAnyPermission({
226
+ deps,
227
+ workspaceId: input.workspaceId,
228
+ callerPrincipalId: input.callerPrincipalId,
229
+ permissions: ["role.manage"],
230
+ });
231
+ const target = await deps.repos.policies.findById({ workspaceId: input.workspaceId, id: input.policyId });
232
+ if (!target)
233
+ throw new IdentityNotFoundError(`policy '${input.policyId}' was not found`);
234
+ if (target.isBuiltin || target.isFrozen) {
235
+ throw new IdentityValidationError("a built-in or frozen policy cannot be renamed/re-described (INV-06/AC-26)");
236
+ }
237
+ if (input.name === undefined && input.description === undefined) {
238
+ throw new IdentityValidationError("at least one of name or description is required");
239
+ }
240
+ const name = input.name !== undefined ? input.name.trim() : target.name;
241
+ if (!name)
242
+ throw new IdentityValidationError("policy name is required");
243
+ const updated = {
244
+ ...target,
245
+ name,
246
+ description: input.description !== undefined ? input.description : target.description,
247
+ };
248
+ await deps.repos.policies.save(updated);
249
+ return { policy: updated };
250
+ }
251
+ /**
252
+ * `DELETE_ROLE` (feature.spec.md REQ-19/INV-09, AC-31, EC-15). Gated by `role.manage`. A built-in
253
+ * target is refused `VALIDATION_ERROR` (checked before the reference count, matching AC-31's
254
+ * stated precedence). A still-referenced target (≥1 `principal_roles` row) is refused
255
+ * `IdentityConflictError` (409 `RESOURCE_CONFLICT`) — the reference check and the delete happen in
256
+ * this one function body with no yielded `await` in between (INV-09's atomicity, same reasoning as
257
+ * `disablePrincipal`'s owner-count guard above).
258
+ *
259
+ * @complexity O(a) in the role's assignment count (`principalRoles.listByRoleId`) — bounded by the
260
+ * same operator-managed-roster assumption every other identity list call makes.
261
+ * @overallScore 100
262
+ */
263
+ export async function deleteRole(required) {
264
+ const { deps, input } = required;
265
+ await assertCallerHasAnyPermission({
266
+ deps,
267
+ workspaceId: input.workspaceId,
268
+ callerPrincipalId: input.callerPrincipalId,
269
+ permissions: ["role.manage"],
270
+ });
271
+ const target = await deps.repos.roles.findById({ workspaceId: input.workspaceId, id: input.roleId });
272
+ if (!target)
273
+ throw new IdentityNotFoundError(`role '${input.roleId}' was not found`);
274
+ if (target.isBuiltin) {
275
+ throw new IdentityValidationError("a built-in role cannot be deleted (INV-06)");
276
+ }
277
+ const assignments = await deps.repos.principalRoles.listByRoleId({
278
+ workspaceId: input.workspaceId,
279
+ roleId: input.roleId,
280
+ });
281
+ if (assignments.length > 0) {
282
+ throw new IdentityConflictError(`role '${input.roleId}' is still assigned to ${assignments.length} principal(s) (INV-09)`);
283
+ }
284
+ await deps.repos.roles.delete({ workspaceId: input.workspaceId, id: input.roleId });
285
+ }
286
+ /**
287
+ * `DELETE_POLICY` (feature.spec.md REQ-19/INV-09, AC-31, EC-15). Gated by `role.manage`. A
288
+ * built-in or `is_frozen` target is refused `VALIDATION_ERROR` (checked before the reference
289
+ * count). A still-referenced target (≥1 `role_policies` or `principal_policies` row) is refused
290
+ * `IdentityConflictError`. On success, cascades to the policy's OWN `policy_permissions` rows only
291
+ * (never a different policy's) before deleting the policy row itself.
292
+ *
293
+ * @complexity O(r + p) — role-reference count + principal-reference count, both bounded by the same
294
+ * operator-managed-roster assumption every other identity list call makes.
295
+ * @overallScore 100
296
+ */
297
+ export async function deletePolicy(required) {
298
+ const { deps, input } = required;
299
+ await assertCallerHasAnyPermission({
300
+ deps,
301
+ workspaceId: input.workspaceId,
302
+ callerPrincipalId: input.callerPrincipalId,
303
+ permissions: ["role.manage"],
304
+ });
305
+ const target = await deps.repos.policies.findById({ workspaceId: input.workspaceId, id: input.policyId });
306
+ if (!target)
307
+ throw new IdentityNotFoundError(`policy '${input.policyId}' was not found`);
308
+ if (target.isBuiltin || target.isFrozen) {
309
+ throw new IdentityValidationError("a built-in or frozen policy cannot be deleted (INV-06/AC-26)");
310
+ }
311
+ const [roleRefs, principalRefs] = await Promise.all([
312
+ deps.repos.rolePolicies.listByPolicyId({ workspaceId: input.workspaceId, policyId: input.policyId }),
313
+ deps.repos.principalPolicies.listByPolicyId({ workspaceId: input.workspaceId, policyId: input.policyId }),
314
+ ]);
315
+ const referenceCount = roleRefs.length + principalRefs.length;
316
+ if (referenceCount > 0) {
317
+ throw new IdentityConflictError(`policy '${input.policyId}' is still referenced by ${referenceCount} row(s) (INV-09)`);
318
+ }
319
+ await deps.repos.policyPermissions.deleteByPolicyId({ workspaceId: input.workspaceId, policyId: input.policyId });
320
+ await deps.repos.policies.delete({ workspaceId: input.workspaceId, id: input.policyId });
321
+ }
322
+ /**
323
+ * `WRITE_POLICY_PERMISSION` (feature.spec.md INV-07, state.spec §3, AC-10/AC-24/AC-26). First HTTP
324
+ * implementation of a transition specified since v0.5.3 (AC-32 — this is a route, not a
325
+ * re-specification). Gated by `role.manage`. Refuses an unregistered permission
326
+ * (`PermissionUnknownError`, REQ-03), a built-in or `is_frozen` parent policy (INV-06/AC-26), and
327
+ * (via the shared `assertGrantClamp`) a permission the caller does not itself hold unconstrained
328
+ * (INV-07, `GrantExceedsIssuerError`).
329
+ *
330
+ * @complexity O(assertGrantClamp) — see that function's own doc (resolveEffectivePermissions +
331
+ * O(1) local filtering, one permission).
332
+ * @overallScore 100
333
+ */
334
+ export async function writePolicyPermission(required) {
335
+ const { deps, input } = required;
336
+ await assertCallerHasAnyPermission({
337
+ deps,
338
+ workspaceId: input.workspaceId,
339
+ callerPrincipalId: input.callerPrincipalId,
340
+ permissions: ["role.manage"],
341
+ });
342
+ if (!isKnownPermission(input.permission)) {
343
+ throw new PermissionUnknownError(`permission '${input.permission}' is not in the registered catalog`);
344
+ }
345
+ const policy = await deps.repos.policies.findById({ workspaceId: input.workspaceId, id: input.policyId });
346
+ if (!policy)
347
+ throw new IdentityNotFoundError(`policy '${input.policyId}' was not found`);
348
+ if (policy.isBuiltin || policy.isFrozen) {
349
+ throw new IdentityValidationError("cannot write a permission onto a built-in or frozen policy (INV-06/AC-26)");
350
+ }
351
+ await assertGrantClamp({
352
+ deps,
353
+ workspaceId: input.workspaceId,
354
+ callerPrincipalId: input.callerPrincipalId,
355
+ conferredPermissions: [input.permission],
356
+ });
357
+ const policyPermission = {
358
+ id: deps.idGen.newId(),
359
+ workspaceId: input.workspaceId,
360
+ policyId: input.policyId,
361
+ permission: input.permission,
362
+ resourceType: input.resourceType ?? null,
363
+ constraintJson: input.constraintJson ?? null,
364
+ };
365
+ await deps.repos.policyPermissions.save(policyPermission);
366
+ return { policyPermission };
367
+ }
368
+ /**
369
+ * `REMOVE_POLICY_PERMISSION` (OQ-10) — the inverse of {@link writePolicyPermission}, and the
370
+ * transition whose absence made a policy's permission set append-only: the only way to shrink one
371
+ * was `deletePolicy` + recreate, which INV-09 blocks outright the moment anything references the
372
+ * policy.
373
+ *
374
+ * Gated by `role.manage`, the same permission `writePolicyPermission` and `deletePolicy` require.
375
+ * Deliberately NOT clamped by `assertGrantClamp` (INV-07): the clamp exists to stop a caller
376
+ * conferring authority it does not itself hold, and removal confers nothing — it is a strict
377
+ * de-escalation. Requiring the clamp here would mean an admin who cannot grant `content.write`
378
+ * also cannot take it back, which is the wrong direction for a safety rule. This is strictly less
379
+ * powerful than the already-unclamped `deletePolicy`, which drops EVERY permission row the policy
380
+ * has.
381
+ *
382
+ * Refuses a built-in or `is_frozen` parent policy (INV-06/AC-26), checked BEFORE the row lookup so
383
+ * a frozen policy reports why it is frozen rather than leaking whether the row exists. A row that
384
+ * is absent — or that exists but belongs to a DIFFERENT policy — is one and the same
385
+ * `IdentityNotFoundError`: membership is proven from `listByPolicyId`'s result, so a caller can
386
+ * never delete across a policy boundary by guessing an id.
387
+ *
388
+ * @complexity O(n) in the policy's own permission-row count (one `listByPolicyId`) — bounded by the
389
+ * same operator-managed-roster assumption every other identity list call makes.
390
+ */
391
+ export async function removePolicyPermission(required) {
392
+ const { deps, input } = required;
393
+ await assertCallerHasAnyPermission({
394
+ deps,
395
+ workspaceId: input.workspaceId,
396
+ callerPrincipalId: input.callerPrincipalId,
397
+ permissions: ["role.manage"],
398
+ });
399
+ const policy = await deps.repos.policies.findById({ workspaceId: input.workspaceId, id: input.policyId });
400
+ if (!policy)
401
+ throw new IdentityNotFoundError(`policy '${input.policyId}' was not found`);
402
+ if (policy.isBuiltin || policy.isFrozen) {
403
+ throw new IdentityValidationError("cannot remove a permission from a built-in or frozen policy (INV-06/AC-26)");
404
+ }
405
+ const rows = await deps.repos.policyPermissions.listByPolicyId({
406
+ workspaceId: input.workspaceId,
407
+ policyId: input.policyId,
408
+ });
409
+ const target = rows.find((row) => row.id === input.policyPermissionId);
410
+ if (!target) {
411
+ throw new IdentityNotFoundError(`policy permission '${input.policyPermissionId}' was not found on policy '${input.policyId}'`);
412
+ }
413
+ await deps.repos.policyPermissions.delete({ workspaceId: input.workspaceId, id: target.id });
414
+ }
415
+ /** True iff `principalId` holds the owner wildcard `*` (unconstrained) in its effective set. */
416
+ async function principalHoldsOwnerWildcard(required) {
417
+ const { deps, workspaceId, principalId } = required;
418
+ const effectiveRows = await resolveEffectivePermissions({
419
+ deps: authorizeDepsFrom(deps.repos),
420
+ principalId,
421
+ workspaceId,
422
+ });
423
+ return effectiveRows.some((row) => row.permission === "*" && row.resourceType == null && row.constraintJson == null);
424
+ }
425
+ /**
426
+ * Count `active` principals in `workspaceId` that hold the owner wildcard `*` (INV-08's own
427
+ * definition of "owner-`*` principal"). O(n) in the workspace's principal count, n bounded by the
428
+ * same operator-managed-roster assumption `identity/INFO.md` documents.
429
+ */
430
+ async function countActiveOwnerWildcardPrincipals(required) {
431
+ const { deps, workspaceId } = required;
432
+ const principals = await deps.repos.principals.list({ workspaceId });
433
+ const activePrincipals = principals.filter((principal) => principal.status === "active");
434
+ const flags = await Promise.all(activePrincipals.map((principal) => principalHoldsOwnerWildcard({ deps, workspaceId, principalId: principal.id })));
435
+ return flags.filter(Boolean).length;
436
+ }
437
+ //# sourceMappingURL=admin-crud-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"admin-crud-service.js","sourceRoot":"","sources":["../../src/identity/admin-crud-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * @file The enforcing boundary parser for identity agent-tool input — the identity domain's
3
+ * analogue of `features/content-types/field-defs.ts`.
4
+ *
5
+ * Deliberate divergence from content-types, disclosed:
6
+ * content-types hand-authors its published `inputSchema` and hand-authors `field-defs.ts`
7
+ * separately, then pins the two together with a fixture corpus
8
+ * (`agent-tools.schema-agreement.unit.test.ts`) because deriving one from the other would have
9
+ * needed either a JSON Schema library this project does not depend on or a code generator. That
10
+ * reasoning does not carry over here: identity's schemas use five keywords and describe flat
11
+ * objects of strings, so INTERPRETING the published schema is ~40 lines. This file does that
12
+ * instead, which makes the published contract and the enforced contract the same artifact — the
13
+ * drift content-types has to test for cannot exist here by construction.
14
+ *
15
+ * What remains genuinely testable, and is tested in
16
+ * `__tests__/agent-tools.schema-agreement.test.ts`: that this interpreter actually implements
17
+ * every keyword the catalog uses (an unknown keyword fails loudly rather than being ignored, which
18
+ * is the one way a schema could still promise something unenforced), and that the wired handlers
19
+ * really route their input through here rather than reading `ctx.input` directly.
20
+ *
21
+ * Architectural role:
22
+ * `identity` library, pure. No I/O, no enforcement of permissions — this is shape validation only.
23
+ * Returns a `Result` rather than throwing so the caller decides how a rejection is surfaced.
24
+ */
25
+ export type IdentityToolInputResult = {
26
+ ok: true;
27
+ value: Readonly<Record<string, string>>;
28
+ } | {
29
+ ok: false;
30
+ error: Error;
31
+ };
32
+ /**
33
+ * Validates `input` against a tool's own published `inputSchema` and returns the extracted string
34
+ * values.
35
+ *
36
+ * Every identity tool's input is a closed, flat object whose properties are all strings, so the
37
+ * return type is narrowed to `Record<string, string>` — a caller reads `value.principalId` without
38
+ * re-checking the type, which is what keeps the handlers in `tool-registrations.ts` free of ad hoc
39
+ * `typeof` guards that could disagree with the schema.
40
+ *
41
+ * Rejection messages name the offending KEY and the rule it broke, and never echo the offending
42
+ * VALUE: a tool input carries operator content (a username, an email) and these messages travel
43
+ * back to the model and into the tool-attempt audit trail.
44
+ *
45
+ * @param required.schema - The tool's published `inputSchema`, used as the contract itself.
46
+ * @param required.input - The raw `ctx.input`, of any shape.
47
+ * @returns `{ok:true, value}` with each declared property present in `input` extracted, or
48
+ * `{ok:false, error}` naming the first violation found.
49
+ * @throws {Error} Only if the schema itself is uninterpretable — a developer error, distinct from
50
+ * a bad input, and therefore not folded into the `Result`.
51
+ * @complexity O(p) in the declared property count plus O(k) in the input's own key count.
52
+ * @overallScore 100
53
+ */
54
+ export declare function parseIdentityToolInput(required: {
55
+ schema: Readonly<Record<string, unknown>>;
56
+ input: unknown;
57
+ }): IdentityToolInputResult;
58
+ //# sourceMappingURL=agent-tool-input.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tool-input.d.ts","sourceRoot":"","sources":["../../src/identity/agent-tool-input.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAKH,MAAM,MAAM,uBAAuB,GAC/B;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;CAAE,GACrD;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,KAAK,CAAA;CAAE,CAAC;AAgChC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE;IAC/C,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IAC1C,KAAK,EAAE,OAAO,CAAC;CAChB,GAAG,uBAAuB,CAgD1B"}
@@ -0,0 +1,126 @@
1
+ /**
2
+ * @file The enforcing boundary parser for identity agent-tool input — the identity domain's
3
+ * analogue of `features/content-types/field-defs.ts`.
4
+ *
5
+ * Deliberate divergence from content-types, disclosed:
6
+ * content-types hand-authors its published `inputSchema` and hand-authors `field-defs.ts`
7
+ * separately, then pins the two together with a fixture corpus
8
+ * (`agent-tools.schema-agreement.unit.test.ts`) because deriving one from the other would have
9
+ * needed either a JSON Schema library this project does not depend on or a code generator. That
10
+ * reasoning does not carry over here: identity's schemas use five keywords and describe flat
11
+ * objects of strings, so INTERPRETING the published schema is ~40 lines. This file does that
12
+ * instead, which makes the published contract and the enforced contract the same artifact — the
13
+ * drift content-types has to test for cannot exist here by construction.
14
+ *
15
+ * What remains genuinely testable, and is tested in
16
+ * `__tests__/agent-tools.schema-agreement.test.ts`: that this interpreter actually implements
17
+ * every keyword the catalog uses (an unknown keyword fails loudly rather than being ignored, which
18
+ * is the one way a schema could still promise something unenforced), and that the wired handlers
19
+ * really route their input through here rather than reading `ctx.input` directly.
20
+ *
21
+ * Architectural role:
22
+ * `identity` library, pure. No I/O, no enforcement of permissions — this is shape validation only.
23
+ * Returns a `Result` rather than throwing so the caller decides how a rejection is surfaced.
24
+ */
25
+ /** The keywords this interpreter implements. Anything else in a schema is a hard error, never ignored. */
26
+ const SUPPORTED_KEYWORDS = new Set(["type", "properties", "required", "additionalProperties", "minLength", "description"]);
27
+ /**
28
+ * Asserts a schema uses only keywords {@link parseIdentityToolInput} implements.
29
+ *
30
+ * Separated from the parse loop and run over the WHOLE schema before any value is inspected, so an
31
+ * unimplemented keyword is reported even for an input that happens not to exercise it. Without
32
+ * that ordering a schema could publish, say, a `pattern` the parser silently ignores, and every
33
+ * test using a conforming fixture would still pass.
34
+ *
35
+ * @param schema - A tool's published `inputSchema`.
36
+ * @throws {Error} If the schema, or any property sub-schema, uses an unimplemented keyword.
37
+ * @complexity O(k) in the total keyword count across the schema and its property sub-schemas.
38
+ * @overallScore 100
39
+ */
40
+ function assertSchemaIsInterpretable(schema) {
41
+ for (const keyword of Object.keys(schema)) {
42
+ if (!SUPPORTED_KEYWORDS.has(keyword)) {
43
+ throw new Error(`identity agent-tool schema uses unimplemented keyword '${keyword}' — extend agent-tool-input.ts rather than publishing a contract it cannot enforce`);
44
+ }
45
+ }
46
+ for (const sub of Object.values((schema.properties ?? {}))) {
47
+ for (const keyword of Object.keys(sub)) {
48
+ if (!SUPPORTED_KEYWORDS.has(keyword)) {
49
+ throw new Error(`identity agent-tool schema uses unimplemented keyword '${keyword}' — extend agent-tool-input.ts rather than publishing a contract it cannot enforce`);
50
+ }
51
+ }
52
+ }
53
+ }
54
+ /**
55
+ * Validates `input` against a tool's own published `inputSchema` and returns the extracted string
56
+ * values.
57
+ *
58
+ * Every identity tool's input is a closed, flat object whose properties are all strings, so the
59
+ * return type is narrowed to `Record<string, string>` — a caller reads `value.principalId` without
60
+ * re-checking the type, which is what keeps the handlers in `tool-registrations.ts` free of ad hoc
61
+ * `typeof` guards that could disagree with the schema.
62
+ *
63
+ * Rejection messages name the offending KEY and the rule it broke, and never echo the offending
64
+ * VALUE: a tool input carries operator content (a username, an email) and these messages travel
65
+ * back to the model and into the tool-attempt audit trail.
66
+ *
67
+ * @param required.schema - The tool's published `inputSchema`, used as the contract itself.
68
+ * @param required.input - The raw `ctx.input`, of any shape.
69
+ * @returns `{ok:true, value}` with each declared property present in `input` extracted, or
70
+ * `{ok:false, error}` naming the first violation found.
71
+ * @throws {Error} Only if the schema itself is uninterpretable — a developer error, distinct from
72
+ * a bad input, and therefore not folded into the `Result`.
73
+ * @complexity O(p) in the declared property count plus O(k) in the input's own key count.
74
+ * @overallScore 100
75
+ */
76
+ export function parseIdentityToolInput(required) {
77
+ const schema = required.schema;
78
+ assertSchemaIsInterpretable(schema);
79
+ if (schema.type !== "object") {
80
+ throw new Error(`identity agent-tool schema must be an object schema, got type '${String(schema.type)}'`);
81
+ }
82
+ const { input } = required;
83
+ if (typeof input !== "object" || input === null || Array.isArray(input)) {
84
+ return { ok: false, error: new Error("input must be an object") };
85
+ }
86
+ const record = input;
87
+ const properties = (schema.properties ?? {});
88
+ if (schema.additionalProperties === false) {
89
+ for (const key of Object.keys(record)) {
90
+ if (!(key in properties)) {
91
+ return { ok: false, error: new Error(`'${key}' is not a recognized input key`) };
92
+ }
93
+ }
94
+ }
95
+ for (const key of schema.required ?? []) {
96
+ if (!(key in record) || record[key] === undefined) {
97
+ return { ok: false, error: new Error(`'${key}' is required`) };
98
+ }
99
+ }
100
+ const value = {};
101
+ for (const [key, sub] of Object.entries(properties)) {
102
+ if (!(key in record) || record[key] === undefined)
103
+ continue;
104
+ const candidate = record[key];
105
+ if (sub.type !== "string") {
106
+ throw new Error(`identity agent-tool schema declares non-string property '${key}' — this parser only implements string properties`);
107
+ }
108
+ if (typeof candidate !== "string") {
109
+ return { ok: false, error: new Error(`'${key}' must be a string, received ${describeType(candidate)}`) };
110
+ }
111
+ if (typeof sub.minLength === "number" && candidate.trim().length < sub.minLength) {
112
+ return { ok: false, error: new Error(`'${key}' must not be blank`) };
113
+ }
114
+ value[key] = candidate;
115
+ }
116
+ return { ok: true, value };
117
+ }
118
+ /** Names a value's type for a rejection message WITHOUT echoing the value itself. */
119
+ function describeType(value) {
120
+ if (value === null)
121
+ return "null";
122
+ if (Array.isArray(value))
123
+ return "an array";
124
+ return `a ${typeof value}`;
125
+ }
126
+ //# sourceMappingURL=agent-tool-input.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-tool-input.js","sourceRoot":"","sources":["../../src/identity/agent-tool-input.ts"],"names":[],"mappings":"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"}