@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.
- package/LICENSE +201 -0
- package/README.md +84 -0
- package/dist/content-types/agent-tools.d.ts +65 -0
- package/dist/content-types/agent-tools.d.ts.map +1 -0
- package/dist/content-types/agent-tools.js +172 -0
- package/dist/content-types/agent-tools.js.map +1 -0
- package/dist/content-types/cleanup.d.ts +118 -0
- package/dist/content-types/cleanup.d.ts.map +1 -0
- package/dist/content-types/cleanup.js +65 -0
- package/dist/content-types/cleanup.js.map +1 -0
- package/dist/content-types/errors.d.ts +90 -0
- package/dist/content-types/errors.d.ts.map +1 -0
- package/dist/content-types/errors.js +119 -0
- package/dist/content-types/errors.js.map +1 -0
- package/dist/content-types/field-defs.d.ts +25 -0
- package/dist/content-types/field-defs.d.ts.map +1 -0
- package/dist/content-types/field-defs.js +155 -0
- package/dist/content-types/field-defs.js.map +1 -0
- package/dist/content-types/index-provisioning.d.ts +94 -0
- package/dist/content-types/index-provisioning.d.ts.map +1 -0
- package/dist/content-types/index-provisioning.js +133 -0
- package/dist/content-types/index-provisioning.js.map +1 -0
- package/dist/content-types/index.d.ts +63 -0
- package/dist/content-types/index.d.ts.map +1 -0
- package/dist/content-types/index.js +36 -0
- package/dist/content-types/index.js.map +1 -0
- package/dist/content-types/lifecycle-dispatch.d.ts +38 -0
- package/dist/content-types/lifecycle-dispatch.d.ts.map +1 -0
- package/dist/content-types/lifecycle-dispatch.js +28 -0
- package/dist/content-types/lifecycle-dispatch.js.map +1 -0
- package/dist/content-types/lifecycle.d.ts +104 -0
- package/dist/content-types/lifecycle.d.ts.map +1 -0
- package/dist/content-types/lifecycle.js +143 -0
- package/dist/content-types/lifecycle.js.map +1 -0
- package/dist/content-types/list.d.ts +44 -0
- package/dist/content-types/list.d.ts.map +1 -0
- package/dist/content-types/list.js +13 -0
- package/dist/content-types/list.js.map +1 -0
- package/dist/content-types/repo.memory.d.ts +72 -0
- package/dist/content-types/repo.memory.d.ts.map +1 -0
- package/dist/content-types/repo.memory.js +71 -0
- package/dist/content-types/repo.memory.js.map +1 -0
- package/dist/content-types/tool-registrations.d.ts +65 -0
- package/dist/content-types/tool-registrations.d.ts.map +1 -0
- package/dist/content-types/tool-registrations.js +180 -0
- package/dist/content-types/tool-registrations.js.map +1 -0
- package/dist/content-types/types.d.ts +78 -0
- package/dist/content-types/types.d.ts.map +1 -0
- package/dist/content-types/types.js +32 -0
- package/dist/content-types/types.js.map +1 -0
- package/dist/content-types/write-service.d.ts +141 -0
- package/dist/content-types/write-service.d.ts.map +1 -0
- package/dist/content-types/write-service.js +180 -0
- package/dist/content-types/write-service.js.map +1 -0
- package/dist/core/commands/change-set.d.ts +98 -0
- package/dist/core/commands/change-set.d.ts.map +1 -0
- package/dist/core/commands/change-set.js +2 -0
- package/dist/core/commands/change-set.js.map +1 -0
- package/dist/core/commands/command.d.ts +168 -0
- package/dist/core/commands/command.d.ts.map +1 -0
- package/dist/core/commands/command.js +173 -0
- package/dist/core/commands/command.js.map +1 -0
- package/dist/core/index.d.ts +45 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +43 -0
- package/dist/core/index.js.map +1 -0
- package/dist/core/ports.d.ts +139 -0
- package/dist/core/ports.d.ts.map +1 -0
- package/dist/core/ports.js +2 -0
- package/dist/core/ports.js.map +1 -0
- package/dist/core/tools/registration-kit.d.ts +308 -0
- package/dist/core/tools/registration-kit.d.ts.map +1 -0
- package/dist/core/tools/registration-kit.js +381 -0
- package/dist/core/tools/registration-kit.js.map +1 -0
- package/dist/entries/agent-tools.d.ts +78 -0
- package/dist/entries/agent-tools.d.ts.map +1 -0
- package/dist/entries/agent-tools.js +158 -0
- package/dist/entries/agent-tools.js.map +1 -0
- package/dist/entries/errors.d.ts +43 -0
- package/dist/entries/errors.d.ts.map +1 -0
- package/dist/entries/errors.js +59 -0
- package/dist/entries/errors.js.map +1 -0
- package/dist/entries/field-validation.d.ts +70 -0
- package/dist/entries/field-validation.d.ts.map +1 -0
- package/dist/entries/field-validation.js +87 -0
- package/dist/entries/field-validation.js.map +1 -0
- package/dist/entries/index.d.ts +55 -0
- package/dist/entries/index.d.ts.map +1 -0
- package/dist/entries/index.js +38 -0
- package/dist/entries/index.js.map +1 -0
- package/dist/entries/lifecycle-dispatch.d.ts +15 -0
- package/dist/entries/lifecycle-dispatch.d.ts.map +1 -0
- package/dist/entries/lifecycle-dispatch.js +16 -0
- package/dist/entries/lifecycle-dispatch.js.map +1 -0
- package/dist/entries/list.d.ts +47 -0
- package/dist/entries/list.d.ts.map +1 -0
- package/dist/entries/list.js +12 -0
- package/dist/entries/list.js.map +1 -0
- package/dist/entries/repo.memory.d.ts +64 -0
- package/dist/entries/repo.memory.d.ts.map +1 -0
- package/dist/entries/repo.memory.js +73 -0
- package/dist/entries/repo.memory.js.map +1 -0
- package/dist/entries/tool-registrations.d.ts +52 -0
- package/dist/entries/tool-registrations.d.ts.map +1 -0
- package/dist/entries/tool-registrations.js +141 -0
- package/dist/entries/tool-registrations.js.map +1 -0
- package/dist/entries/types.d.ts +55 -0
- package/dist/entries/types.d.ts.map +1 -0
- package/dist/entries/types.js +2 -0
- package/dist/entries/types.js.map +1 -0
- package/dist/entries/write-service.d.ts +202 -0
- package/dist/entries/write-service.d.ts.map +1 -0
- package/dist/entries/write-service.js +204 -0
- package/dist/entries/write-service.js.map +1 -0
- package/dist/identity/admin-crud-service.d.ts +252 -0
- package/dist/identity/admin-crud-service.d.ts.map +1 -0
- package/dist/identity/admin-crud-service.js +437 -0
- package/dist/identity/admin-crud-service.js.map +1 -0
- package/dist/identity/agent-tool-input.d.ts +58 -0
- package/dist/identity/agent-tool-input.d.ts.map +1 -0
- package/dist/identity/agent-tool-input.js +126 -0
- package/dist/identity/agent-tool-input.js.map +1 -0
- package/dist/identity/agent-tools.d.ts +101 -0
- package/dist/identity/agent-tools.d.ts.map +1 -0
- package/dist/identity/agent-tools.js +290 -0
- package/dist/identity/agent-tools.js.map +1 -0
- package/dist/identity/auth-service.d.ts +87 -0
- package/dist/identity/auth-service.d.ts.map +1 -0
- package/dist/identity/auth-service.js +141 -0
- package/dist/identity/auth-service.js.map +1 -0
- package/dist/identity/authorize.d.ts +90 -0
- package/dist/identity/authorize.d.ts.map +1 -0
- package/dist/identity/authorize.js +94 -0
- package/dist/identity/authorize.js.map +1 -0
- package/dist/identity/grant-service.d.ts +198 -0
- package/dist/identity/grant-service.d.ts.map +1 -0
- package/dist/identity/grant-service.js +361 -0
- package/dist/identity/grant-service.js.map +1 -0
- package/dist/identity/hasher.d.ts +39 -0
- package/dist/identity/hasher.d.ts.map +1 -0
- package/dist/identity/hasher.js +39 -0
- package/dist/identity/hasher.js.map +1 -0
- package/dist/identity/index.d.ts +59 -0
- package/dist/identity/index.d.ts.map +1 -0
- package/dist/identity/index.js +51 -0
- package/dist/identity/index.js.map +1 -0
- package/dist/identity/password-policy.d.ts +58 -0
- package/dist/identity/password-policy.d.ts.map +1 -0
- package/dist/identity/password-policy.js +67 -0
- package/dist/identity/password-policy.js.map +1 -0
- package/dist/identity/permission-migrations.d.ts +86 -0
- package/dist/identity/permission-migrations.d.ts.map +1 -0
- package/dist/identity/permission-migrations.js +67 -0
- package/dist/identity/permission-migrations.js.map +1 -0
- package/dist/identity/permissions.d.ts +35 -0
- package/dist/identity/permissions.d.ts.map +1 -0
- package/dist/identity/permissions.js +603 -0
- package/dist/identity/permissions.js.map +1 -0
- package/dist/identity/ports.d.ts +201 -0
- package/dist/identity/ports.d.ts.map +1 -0
- package/dist/identity/ports.js +2 -0
- package/dist/identity/ports.js.map +1 -0
- package/dist/identity/repo.memory.d.ts +164 -0
- package/dist/identity/repo.memory.d.ts.map +1 -0
- package/dist/identity/repo.memory.js +224 -0
- package/dist/identity/repo.memory.js.map +1 -0
- package/dist/identity/seed.d.ts +42 -0
- package/dist/identity/seed.d.ts.map +1 -0
- package/dist/identity/seed.js +277 -0
- package/dist/identity/seed.js.map +1 -0
- package/dist/identity/tool-registrations.d.ts +50 -0
- package/dist/identity/tool-registrations.d.ts.map +1 -0
- package/dist/identity/tool-registrations.js +419 -0
- package/dist/identity/tool-registrations.js.map +1 -0
- package/dist/identity/types.d.ts +185 -0
- package/dist/identity/types.d.ts.map +1 -0
- package/dist/identity/types.js +64 -0
- package/dist/identity/types.js.map +1 -0
- package/dist/identity/username.d.ts +12 -0
- package/dist/identity/username.d.ts.map +1 -0
- package/dist/identity/username.js +14 -0
- package/dist/identity/username.js.map +1 -0
- package/dist/media/agent-tools.d.ts +66 -0
- package/dist/media/agent-tools.d.ts.map +1 -0
- package/dist/media/agent-tools.js +131 -0
- package/dist/media/agent-tools.js.map +1 -0
- package/dist/media/blob-gc-lock.d.ts +37 -0
- package/dist/media/blob-gc-lock.d.ts.map +1 -0
- package/dist/media/blob-gc-lock.js +55 -0
- package/dist/media/blob-gc-lock.js.map +1 -0
- package/dist/media/blob-gc.d.ts +246 -0
- package/dist/media/blob-gc.d.ts.map +1 -0
- package/dist/media/blob-gc.js +254 -0
- package/dist/media/blob-gc.js.map +1 -0
- package/dist/media/blob-key.d.ts +28 -0
- package/dist/media/blob-key.d.ts.map +1 -0
- package/dist/media/blob-key.js +11 -0
- package/dist/media/blob-key.js.map +1 -0
- package/dist/media/blob-store.fs.d.ts +23 -0
- package/dist/media/blob-store.fs.d.ts.map +1 -0
- package/dist/media/blob-store.fs.js +48 -0
- package/dist/media/blob-store.fs.js.map +1 -0
- package/dist/media/blob-store.memory.d.ts +22 -0
- package/dist/media/blob-store.memory.d.ts.map +1 -0
- package/dist/media/blob-store.memory.js +23 -0
- package/dist/media/blob-store.memory.js.map +1 -0
- package/dist/media/content-type-sniffer.d.ts +49 -0
- package/dist/media/content-type-sniffer.d.ts.map +1 -0
- package/dist/media/content-type-sniffer.js +141 -0
- package/dist/media/content-type-sniffer.js.map +1 -0
- package/dist/media/image-transformer.d.ts +45 -0
- package/dist/media/image-transformer.d.ts.map +1 -0
- package/dist/media/image-transformer.js +23 -0
- package/dist/media/image-transformer.js.map +1 -0
- package/dist/media/image-transformer.sharp.d.ts +26 -0
- package/dist/media/image-transformer.sharp.d.ts.map +1 -0
- package/dist/media/image-transformer.sharp.js +91 -0
- package/dist/media/image-transformer.sharp.js.map +1 -0
- package/dist/media/index.d.ts +43 -0
- package/dist/media/index.d.ts.map +1 -0
- package/dist/media/index.js +31 -0
- package/dist/media/index.js.map +1 -0
- package/dist/media/media-service.d.ts +244 -0
- package/dist/media/media-service.d.ts.map +1 -0
- package/dist/media/media-service.js +345 -0
- package/dist/media/media-service.js.map +1 -0
- package/dist/media/ports.d.ts +142 -0
- package/dist/media/ports.d.ts.map +1 -0
- package/dist/media/ports.js +2 -0
- package/dist/media/ports.js.map +1 -0
- package/dist/media/rendition-service.d.ts +66 -0
- package/dist/media/rendition-service.d.ts.map +1 -0
- package/dist/media/rendition-service.js +135 -0
- package/dist/media/rendition-service.js.map +1 -0
- package/dist/media/repo.memory.d.ts +107 -0
- package/dist/media/repo.memory.d.ts.map +1 -0
- package/dist/media/repo.memory.js +131 -0
- package/dist/media/repo.memory.js.map +1 -0
- package/dist/media/tool-registrations.d.ts +42 -0
- package/dist/media/tool-registrations.d.ts.map +1 -0
- package/dist/media/tool-registrations.js +121 -0
- package/dist/media/tool-registrations.js.map +1 -0
- package/dist/media/transform-lock.d.ts +36 -0
- package/dist/media/transform-lock.d.ts.map +1 -0
- package/dist/media/transform-lock.js +50 -0
- package/dist/media/transform-lock.js.map +1 -0
- package/dist/media/transform-registry.d.ts +103 -0
- package/dist/media/transform-registry.d.ts.map +1 -0
- package/dist/media/transform-registry.js +87 -0
- package/dist/media/transform-registry.js.map +1 -0
- package/dist/media/transform-types.d.ts +82 -0
- package/dist/media/transform-types.d.ts.map +1 -0
- package/dist/media/transform-types.js +47 -0
- package/dist/media/transform-types.js.map +1 -0
- package/dist/media/types.d.ts +150 -0
- package/dist/media/types.d.ts.map +1 -0
- package/dist/media/types.js +26 -0
- package/dist/media/types.js.map +1 -0
- package/dist/navigation/agent-tools.d.ts +90 -0
- package/dist/navigation/agent-tools.d.ts.map +1 -0
- package/dist/navigation/agent-tools.js +225 -0
- package/dist/navigation/agent-tools.js.map +1 -0
- package/dist/navigation/contracts.d.ts +98 -0
- package/dist/navigation/contracts.d.ts.map +1 -0
- package/dist/navigation/contracts.js +70 -0
- package/dist/navigation/contracts.js.map +1 -0
- package/dist/navigation/index.d.ts +39 -0
- package/dist/navigation/index.d.ts.map +1 -0
- package/dist/navigation/index.js +30 -0
- package/dist/navigation/index.js.map +1 -0
- package/dist/navigation/menu-service.d.ts +256 -0
- package/dist/navigation/menu-service.d.ts.map +1 -0
- package/dist/navigation/menu-service.js +382 -0
- package/dist/navigation/menu-service.js.map +1 -0
- package/dist/navigation/ports.d.ts +147 -0
- package/dist/navigation/ports.d.ts.map +1 -0
- package/dist/navigation/ports.js +2 -0
- package/dist/navigation/ports.js.map +1 -0
- package/dist/navigation/read-model.d.ts +11 -0
- package/dist/navigation/read-model.d.ts.map +1 -0
- package/dist/navigation/read-model.js +27 -0
- package/dist/navigation/read-model.js.map +1 -0
- package/dist/navigation/reconcile.d.ts +57 -0
- package/dist/navigation/reconcile.d.ts.map +1 -0
- package/dist/navigation/reconcile.js +33 -0
- package/dist/navigation/reconcile.js.map +1 -0
- package/dist/navigation/repo.memory.d.ts +137 -0
- package/dist/navigation/repo.memory.d.ts.map +1 -0
- package/dist/navigation/repo.memory.js +95 -0
- package/dist/navigation/repo.memory.js.map +1 -0
- package/dist/navigation/resolver.d.ts +110 -0
- package/dist/navigation/resolver.d.ts.map +1 -0
- package/dist/navigation/resolver.js +131 -0
- package/dist/navigation/resolver.js.map +1 -0
- package/dist/navigation/tool-registrations.d.ts +43 -0
- package/dist/navigation/tool-registrations.d.ts.map +1 -0
- package/dist/navigation/tool-registrations.js +126 -0
- package/dist/navigation/tool-registrations.js.map +1 -0
- package/dist/navigation/types.d.ts +207 -0
- package/dist/navigation/types.d.ts.map +1 -0
- package/dist/navigation/types.js +14 -0
- package/dist/navigation/types.js.map +1 -0
- package/dist/presentation/index.d.ts +15 -0
- package/dist/presentation/index.d.ts.map +1 -0
- package/dist/presentation/index.js +15 -0
- package/dist/presentation/index.js.map +1 -0
- package/dist/presentation/presentation.d.ts +72 -0
- package/dist/presentation/presentation.d.ts.map +1 -0
- package/dist/presentation/presentation.js +51 -0
- package/dist/presentation/presentation.js.map +1 -0
- package/dist/presentation/repo.memory.d.ts +9 -0
- package/dist/presentation/repo.memory.d.ts.map +1 -0
- package/dist/presentation/repo.memory.js +21 -0
- package/dist/presentation/repo.memory.js.map +1 -0
- package/dist/server/index.d.ts +28 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +28 -0
- package/dist/server/index.js.map +1 -0
- package/dist/settings/agent-tools.d.ts +83 -0
- package/dist/settings/agent-tools.d.ts.map +1 -0
- package/dist/settings/agent-tools.js +200 -0
- package/dist/settings/agent-tools.js.map +1 -0
- package/dist/settings/agent-writable-preferences.d.ts +67 -0
- package/dist/settings/agent-writable-preferences.d.ts.map +1 -0
- package/dist/settings/agent-writable-preferences.js +144 -0
- package/dist/settings/agent-writable-preferences.js.map +1 -0
- package/dist/settings/change-feed.d.ts +74 -0
- package/dist/settings/change-feed.d.ts.map +1 -0
- package/dist/settings/change-feed.js +61 -0
- package/dist/settings/change-feed.js.map +1 -0
- package/dist/settings/definitions-dispatch.d.ts +51 -0
- package/dist/settings/definitions-dispatch.d.ts.map +1 -0
- package/dist/settings/definitions-dispatch.js +86 -0
- package/dist/settings/definitions-dispatch.js.map +1 -0
- package/dist/settings/dictionaries/index.d.ts +45 -0
- package/dist/settings/dictionaries/index.d.ts.map +1 -0
- package/dist/settings/dictionaries/index.js +69 -0
- package/dist/settings/dictionaries/index.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ar.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.ar.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ar.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.ar.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.bn.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.bn.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.bn.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.bn.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.de.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.de.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.de.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.de.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.es.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.es.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.es.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.es.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.fa.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.fa.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.fa.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.fa.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.fr.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.fr.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.fr.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.fr.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.hi.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.hi.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.hi.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.hi.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.hu.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.hu.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.hu.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.hu.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.id.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.id.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.id.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.id.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.it.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.it.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.it.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.it.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ja.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.ja.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ja.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.ja.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ko.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.ko.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ko.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.ko.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.pl.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.pl.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.pl.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.pl.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.pt-BR.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.pt-BR.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.pt-BR.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.pt-BR.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ru.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.ru.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ru.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.ru.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.th.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.th.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.th.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.th.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.tr.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.tr.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.tr.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.tr.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.uk.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.uk.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.uk.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.uk.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ur.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.ur.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.ur.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.ur.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.zh-CN.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.zh-CN.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.zh-CN.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.zh-CN.js.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.zh-TW.d.ts +3 -0
- package/dist/settings/dictionaries/settings-dialog.zh-TW.d.ts.map +1 -0
- package/dist/settings/dictionaries/settings-dialog.zh-TW.js +28 -0
- package/dist/settings/dictionaries/settings-dialog.zh-TW.js.map +1 -0
- package/dist/settings/ensure-definitions.d.ts +88 -0
- package/dist/settings/ensure-definitions.d.ts.map +1 -0
- package/dist/settings/ensure-definitions.js +91 -0
- package/dist/settings/ensure-definitions.js.map +1 -0
- package/dist/settings/errors.d.ts +36 -0
- package/dist/settings/errors.d.ts.map +1 -0
- package/dist/settings/errors.js +40 -0
- package/dist/settings/errors.js.map +1 -0
- package/dist/settings/index.d.ts +37 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +36 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/ports.d.ts +117 -0
- package/dist/settings/ports.d.ts.map +1 -0
- package/dist/settings/ports.js +2 -0
- package/dist/settings/ports.js.map +1 -0
- package/dist/settings/purge-service.d.ts +53 -0
- package/dist/settings/purge-service.d.ts.map +1 -0
- package/dist/settings/purge-service.js +105 -0
- package/dist/settings/purge-service.js.map +1 -0
- package/dist/settings/repo.memory.d.ts +119 -0
- package/dist/settings/repo.memory.d.ts.map +1 -0
- package/dist/settings/repo.memory.js +199 -0
- package/dist/settings/repo.memory.js.map +1 -0
- package/dist/settings/settings.d.ts +124 -0
- package/dist/settings/settings.d.ts.map +1 -0
- package/dist/settings/settings.js +238 -0
- package/dist/settings/settings.js.map +1 -0
- package/dist/settings/tool-registrations.d.ts +56 -0
- package/dist/settings/tool-registrations.d.ts.map +1 -0
- package/dist/settings/tool-registrations.js +240 -0
- package/dist/settings/tool-registrations.js.map +1 -0
- package/dist/settings/types.d.ts +125 -0
- package/dist/settings/types.d.ts.map +1 -0
- package/dist/settings/types.js +3 -0
- package/dist/settings/types.js.map +1 -0
- package/dist/settings/ui-tab-definitions.d.ts +41 -0
- package/dist/settings/ui-tab-definitions.d.ts.map +1 -0
- package/dist/settings/ui-tab-definitions.js +148 -0
- package/dist/settings/ui-tab-definitions.js.map +1 -0
- package/dist/settings/write-service.d.ts +314 -0
- package/dist/settings/write-service.d.ts.map +1 -0
- package/dist/settings/write-service.js +677 -0
- package/dist/settings/write-service.js.map +1 -0
- package/dist/taxonomy/agent-tools.d.ts +76 -0
- package/dist/taxonomy/agent-tools.d.ts.map +1 -0
- package/dist/taxonomy/agent-tools.js +178 -0
- package/dist/taxonomy/agent-tools.js.map +1 -0
- package/dist/taxonomy/content-lookup.d.ts +45 -0
- package/dist/taxonomy/content-lookup.d.ts.map +1 -0
- package/dist/taxonomy/content-lookup.js +9 -0
- package/dist/taxonomy/content-lookup.js.map +1 -0
- package/dist/taxonomy/index.d.ts +38 -0
- package/dist/taxonomy/index.d.ts.map +1 -0
- package/dist/taxonomy/index.js +38 -0
- package/dist/taxonomy/index.js.map +1 -0
- package/dist/taxonomy/list.d.ts +39 -0
- package/dist/taxonomy/list.d.ts.map +1 -0
- package/dist/taxonomy/list.js +19 -0
- package/dist/taxonomy/list.js.map +1 -0
- package/dist/taxonomy/merge-term.d.ts +94 -0
- package/dist/taxonomy/merge-term.d.ts.map +1 -0
- package/dist/taxonomy/merge-term.js +65 -0
- package/dist/taxonomy/merge-term.js.map +1 -0
- package/dist/taxonomy/repo.memory.d.ts +160 -0
- package/dist/taxonomy/repo.memory.d.ts.map +1 -0
- package/dist/taxonomy/repo.memory.js +171 -0
- package/dist/taxonomy/repo.memory.js.map +1 -0
- package/dist/taxonomy/validation-chain.d.ts +114 -0
- package/dist/taxonomy/validation-chain.d.ts.map +1 -0
- package/dist/taxonomy/validation-chain.js +152 -0
- package/dist/taxonomy/validation-chain.js.map +1 -0
- package/dist/taxonomy/write-service.d.ts +387 -0
- package/dist/taxonomy/write-service.d.ts.map +1 -0
- package/dist/taxonomy/write-service.js +350 -0
- package/dist/taxonomy/write-service.js.map +1 -0
- package/dist/workspace/agent-tools.d.ts +67 -0
- package/dist/workspace/agent-tools.d.ts.map +1 -0
- package/dist/workspace/agent-tools.js +103 -0
- package/dist/workspace/agent-tools.js.map +1 -0
- package/dist/workspace/create.d.ts +116 -0
- package/dist/workspace/create.d.ts.map +1 -0
- package/dist/workspace/create.js +69 -0
- package/dist/workspace/create.js.map +1 -0
- package/dist/workspace/delete.d.ts +50 -0
- package/dist/workspace/delete.d.ts.map +1 -0
- package/dist/workspace/delete.js +24 -0
- package/dist/workspace/delete.js.map +1 -0
- package/dist/workspace/index.d.ts +27 -0
- package/dist/workspace/index.d.ts.map +1 -0
- package/dist/workspace/index.js +27 -0
- package/dist/workspace/index.js.map +1 -0
- package/dist/workspace/repo.memory.d.ts +34 -0
- package/dist/workspace/repo.memory.d.ts.map +1 -0
- package/dist/workspace/repo.memory.js +50 -0
- package/dist/workspace/repo.memory.js.map +1 -0
- package/dist/workspace/tool-registrations.d.ts +38 -0
- package/dist/workspace/tool-registrations.d.ts.map +1 -0
- package/dist/workspace/tool-registrations.js +71 -0
- package/dist/workspace/tool-registrations.js.map +1 -0
- package/dist/workspace/update.d.ts +52 -0
- package/dist/workspace/update.d.ts.map +1 -0
- package/dist/workspace/update.js +41 -0
- package/dist/workspace/update.js.map +1 -0
- package/package.json +149 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
import { ContentTypeNotActiveError, ContentTypeNotFoundError, EntryFieldValidationError, EntryNotFoundError, EntrySlugConflictError, ForbiddenError, VersionConflictError, } from "./errors.js";
|
|
2
|
+
import { validateFieldsAgainstSchema } from "./field-validation.js";
|
|
3
|
+
function delegationFields(input) {
|
|
4
|
+
return {
|
|
5
|
+
delegatedByWorkspaceId: input.delegatedByWorkspaceId ?? null,
|
|
6
|
+
delegatedById: input.delegatedById ?? null,
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* REQ-13/14/19 — creates a new entry. Order: authorize -> owning-type exists AND is owned by this
|
|
11
|
+
* workspace (INV-01) -> owning-type is `active` (REQ-10) -> `fieldsJson` validates against the
|
|
12
|
+
* type's current schema -> `(workspaceId, type, slug)` uniqueness (AC-21) -> same-tx write +
|
|
13
|
+
* revision + watermark + optional `deps.onWritten` side effect -> `entry.created` outbox event
|
|
14
|
+
* (AC-27).
|
|
15
|
+
*
|
|
16
|
+
* @complexity O(1) plus one content-type read, one field-validation pass, one slug lookup, and one
|
|
17
|
+
* same-tx write pair.
|
|
18
|
+
* @overallScore 100
|
|
19
|
+
*/
|
|
20
|
+
export async function createEntry(required) {
|
|
21
|
+
const { deps, input } = required;
|
|
22
|
+
const authResult = await deps.authorize({ principalId: input.actorId, permission: "admin.collections.manage", workspaceId: input.workspaceId });
|
|
23
|
+
if (!authResult.allowed) {
|
|
24
|
+
return { ok: false, error: new ForbiddenError(`principal '${input.actorId}' cannot create an entry (${authResult.reason})`) };
|
|
25
|
+
}
|
|
26
|
+
const contentType = await deps.contentTypeRepo.findByKey({ workspaceId: input.workspaceId, key: input.type });
|
|
27
|
+
if (!contentType || contentType.workspaceId !== input.workspaceId) {
|
|
28
|
+
return { ok: false, error: new ContentTypeNotFoundError(`content type '${input.type}' was not found in workspace '${input.workspaceId}'`) };
|
|
29
|
+
}
|
|
30
|
+
if (contentType.status !== "active") {
|
|
31
|
+
return { ok: false, error: new ContentTypeNotActiveError(`content type '${input.type}' is not active; new entries cannot be created (REQ-10)`) };
|
|
32
|
+
}
|
|
33
|
+
const validation = validateFieldsAgainstSchema({ schema: contentType.fields, fieldsJson: input.fieldsJson, owner: input.owner });
|
|
34
|
+
if (!validation.valid) {
|
|
35
|
+
return { ok: false, error: new EntryFieldValidationError(validation.fieldErrors) };
|
|
36
|
+
}
|
|
37
|
+
const existing = await deps.entryRepo.findBySlug({ workspaceId: input.workspaceId, type: input.type, slug: input.slug });
|
|
38
|
+
if (existing) {
|
|
39
|
+
return { ok: false, error: new EntrySlugConflictError(`an entry with slug '${input.slug}' already exists for type '${input.type}' in workspace '${input.workspaceId}'`) };
|
|
40
|
+
}
|
|
41
|
+
const now = deps.clock.nowIso();
|
|
42
|
+
const entry = {
|
|
43
|
+
id: deps.ids.newId(),
|
|
44
|
+
workspaceId: input.workspaceId,
|
|
45
|
+
type: input.type,
|
|
46
|
+
slug: input.slug,
|
|
47
|
+
status: "draft",
|
|
48
|
+
title: input.title,
|
|
49
|
+
bodyJson: input.bodyJson ?? null,
|
|
50
|
+
fieldsJson: input.fieldsJson,
|
|
51
|
+
publishedAt: null,
|
|
52
|
+
createdAt: now,
|
|
53
|
+
updatedAt: now,
|
|
54
|
+
version: 1,
|
|
55
|
+
};
|
|
56
|
+
await deps.entryRepo.transaction(async () => {
|
|
57
|
+
await deps.entryRepo.save(entry);
|
|
58
|
+
await deps.entryRepo.appendRevision({
|
|
59
|
+
entryId: entry.id,
|
|
60
|
+
workspaceId: input.workspaceId,
|
|
61
|
+
op: "create",
|
|
62
|
+
stateJson: entry,
|
|
63
|
+
actorId: input.actorId,
|
|
64
|
+
...delegationFields(input),
|
|
65
|
+
recordedAt: now,
|
|
66
|
+
});
|
|
67
|
+
if (deps.watermark)
|
|
68
|
+
await deps.watermark.stampWatermark({ workspaceId: input.workspaceId });
|
|
69
|
+
if (deps.onWritten)
|
|
70
|
+
await deps.onWritten(entry);
|
|
71
|
+
});
|
|
72
|
+
await deps.outbox.enqueue({ name: "entry.created", payload: { workspaceId: input.workspaceId, entryId: entry.id, type: input.type, slug: input.slug } });
|
|
73
|
+
return { ok: true, value: { entry } };
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* REQ-28's shared resolve step for `updateEntry`/`publishEntry`/`unpublishEntry`: authorize ->
|
|
77
|
+
* find the entry -> find its owning type -> reject ONLY if that type is `tombstone`
|
|
78
|
+
* (`deprecated` blocks nothing here, unlike `createEntry`'s REQ-10 rule) -> `expectedVersion`
|
|
79
|
+
* check.
|
|
80
|
+
*
|
|
81
|
+
* @complexity O(1) plus one entry read and one content-type read.
|
|
82
|
+
* @overallScore 100
|
|
83
|
+
*/
|
|
84
|
+
async function resolveExistingEntryForTransition(deps, input) {
|
|
85
|
+
const authResult = await deps.authorize({ principalId: input.actorId, permission: "admin.collections.manage", workspaceId: input.workspaceId });
|
|
86
|
+
if (!authResult.allowed) {
|
|
87
|
+
return { ok: false, error: new ForbiddenError(`principal '${input.actorId}' cannot modify entry '${input.id}' (${authResult.reason})`) };
|
|
88
|
+
}
|
|
89
|
+
const entry = await deps.entryRepo.findById({ workspaceId: input.workspaceId, id: input.id });
|
|
90
|
+
if (!entry) {
|
|
91
|
+
return { ok: false, error: new EntryNotFoundError(`entry '${input.id}' was not found in workspace '${input.workspaceId}'`) };
|
|
92
|
+
}
|
|
93
|
+
const contentType = await deps.contentTypeRepo.findByKey({ workspaceId: input.workspaceId, key: entry.type });
|
|
94
|
+
if (contentType && contentType.status === "tombstone") {
|
|
95
|
+
return { ok: false, error: new ContentTypeNotActiveError(`content type '${entry.type}' is tombstoned; existing entries cannot be updated/published/unpublished (REQ-28)`) };
|
|
96
|
+
}
|
|
97
|
+
if (input.expectedVersion !== entry.version) {
|
|
98
|
+
return { ok: false, error: new VersionConflictError(`expected version ${input.expectedVersion} for entry '${input.id}', found ${entry.version}`) };
|
|
99
|
+
}
|
|
100
|
+
return { ok: true, value: { entry, contentType } };
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* REQ-28 — updates an existing entry's `title`/`fieldsJson`/`bodyJson` (only the fields supplied
|
|
104
|
+
* are changed). Rejected `ContentTypeNotActiveError` only if the owning type is `tombstone`
|
|
105
|
+
* (AC-44/EC-13); a `deprecated` owning type is fine (AC-46).
|
|
106
|
+
*
|
|
107
|
+
* @complexity O(1) plus the shared resolve step and, when `fieldsJson` is supplied, one
|
|
108
|
+
* field-validation pass.
|
|
109
|
+
* @overallScore 100
|
|
110
|
+
*/
|
|
111
|
+
export async function updateEntry(required) {
|
|
112
|
+
const { deps, input } = required;
|
|
113
|
+
const resolved = await resolveExistingEntryForTransition(deps, input);
|
|
114
|
+
if (!resolved.ok)
|
|
115
|
+
return resolved;
|
|
116
|
+
const { entry: current, contentType } = resolved.value;
|
|
117
|
+
let fieldsJson = current.fieldsJson;
|
|
118
|
+
if (input.fieldsJson !== undefined) {
|
|
119
|
+
const validation = validateFieldsAgainstSchema({ schema: contentType?.fields ?? [], fieldsJson: input.fieldsJson, owner: input.owner });
|
|
120
|
+
if (!validation.valid) {
|
|
121
|
+
return { ok: false, error: new EntryFieldValidationError(validation.fieldErrors) };
|
|
122
|
+
}
|
|
123
|
+
fieldsJson = input.fieldsJson;
|
|
124
|
+
}
|
|
125
|
+
const now = deps.clock.nowIso();
|
|
126
|
+
const updated = {
|
|
127
|
+
...current,
|
|
128
|
+
title: input.title ?? current.title,
|
|
129
|
+
fieldsJson,
|
|
130
|
+
bodyJson: input.bodyJson !== undefined ? input.bodyJson : current.bodyJson,
|
|
131
|
+
updatedAt: now,
|
|
132
|
+
version: current.version + 1,
|
|
133
|
+
};
|
|
134
|
+
await deps.entryRepo.transaction(async () => {
|
|
135
|
+
await deps.entryRepo.save(updated);
|
|
136
|
+
await deps.entryRepo.appendRevision({
|
|
137
|
+
entryId: current.id,
|
|
138
|
+
workspaceId: input.workspaceId,
|
|
139
|
+
op: "update",
|
|
140
|
+
stateJson: updated,
|
|
141
|
+
actorId: input.actorId,
|
|
142
|
+
...delegationFields(input),
|
|
143
|
+
recordedAt: now,
|
|
144
|
+
});
|
|
145
|
+
if (deps.watermark)
|
|
146
|
+
await deps.watermark.stampWatermark({ workspaceId: input.workspaceId });
|
|
147
|
+
if (deps.onWritten)
|
|
148
|
+
await deps.onWritten(updated);
|
|
149
|
+
});
|
|
150
|
+
await deps.outbox.enqueue({ name: "entry.updated", payload: { workspaceId: input.workspaceId, entryId: current.id } });
|
|
151
|
+
return { ok: true, value: { entry: updated } };
|
|
152
|
+
}
|
|
153
|
+
async function transitionEntryStatus(required, target) {
|
|
154
|
+
const { deps, input } = required;
|
|
155
|
+
const resolved = await resolveExistingEntryForTransition(deps, input);
|
|
156
|
+
if (!resolved.ok)
|
|
157
|
+
return resolved;
|
|
158
|
+
const { entry: current } = resolved.value;
|
|
159
|
+
const now = deps.clock.nowIso();
|
|
160
|
+
const updated = {
|
|
161
|
+
...current,
|
|
162
|
+
status: target.status,
|
|
163
|
+
publishedAt: target.status === "published" ? now : current.publishedAt,
|
|
164
|
+
updatedAt: now,
|
|
165
|
+
version: current.version + 1,
|
|
166
|
+
};
|
|
167
|
+
await deps.entryRepo.transaction(async () => {
|
|
168
|
+
await deps.entryRepo.save(updated);
|
|
169
|
+
await deps.entryRepo.appendRevision({
|
|
170
|
+
entryId: current.id,
|
|
171
|
+
workspaceId: input.workspaceId,
|
|
172
|
+
op: target.op,
|
|
173
|
+
stateJson: updated,
|
|
174
|
+
actorId: input.actorId,
|
|
175
|
+
...delegationFields(input),
|
|
176
|
+
recordedAt: now,
|
|
177
|
+
});
|
|
178
|
+
if (deps.watermark)
|
|
179
|
+
await deps.watermark.stampWatermark({ workspaceId: input.workspaceId });
|
|
180
|
+
});
|
|
181
|
+
await deps.outbox.enqueue({ name: target.eventName, payload: { workspaceId: input.workspaceId, entryId: current.id } });
|
|
182
|
+
return { ok: true, value: { entry: updated } };
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* REQ-28 — flips an entry to `published`. Rejected `ContentTypeNotActiveError` only if the owning
|
|
186
|
+
* type is `tombstone` (AC-45), with NO outbox event enqueued on rejection.
|
|
187
|
+
*
|
|
188
|
+
* @complexity O(1) plus the shared resolve step and one same-tx write pair.
|
|
189
|
+
* @overallScore 100
|
|
190
|
+
*/
|
|
191
|
+
export async function publishEntry(required) {
|
|
192
|
+
return transitionEntryStatus(required, { status: "published", op: "publish", eventName: "entry.published" });
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* REQ-28 — flips an entry to `unpublished`. Rejected `ContentTypeNotActiveError` only if the
|
|
196
|
+
* owning type is `tombstone` (AC-45), with NO outbox event enqueued on rejection.
|
|
197
|
+
*
|
|
198
|
+
* @complexity O(1) plus the shared resolve step and one same-tx write pair.
|
|
199
|
+
* @overallScore 100
|
|
200
|
+
*/
|
|
201
|
+
export async function unpublishEntry(required) {
|
|
202
|
+
return transitionEntryStatus(required, { status: "unpublished", op: "unpublish", eventName: "entry.unpublished" });
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=write-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"write-service.js","sourceRoot":"","sources":["../../src/entries/write-service.ts"],"names":[],"mappings":"AACA,OAAO,EACL,yBAAyB,EACzB,wBAAwB,EACxB,yBAAyB,EACzB,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,oBAAoB,GACrB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,2BAA2B,EAAE,MAAM,uBAAuB,CAAC;AAoEpE,SAAS,gBAAgB,CAAC,KAAyB;IACjD,OAAO;QACL,sBAAsB,EAAE,KAAK,CAAC,sBAAsB,IAAI,IAAI;QAC5D,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,IAAI;KAC3C,CAAC;AACJ,CAAC;AA+BD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAA6B;IAC7D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAEjC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAChJ,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,cAAc,CAAC,cAAc,KAAK,CAAC,OAAO,6BAA6B,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAChI,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9G,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,WAAW,KAAK,KAAK,CAAC,WAAW,EAAE,CAAC;QAClE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,wBAAwB,CAAC,iBAAiB,KAAK,CAAC,IAAI,iCAAiC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;IAC9I,CAAC;IACD,IAAI,WAAW,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;QACpC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,yBAAyB,CAAC,iBAAiB,KAAK,CAAC,IAAI,yDAAyD,CAAC,EAAE,CAAC;IACnJ,CAAC;IAED,MAAM,UAAU,GAAG,2BAA2B,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;IACjI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,yBAAyB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;IACrF,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACzH,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,uBAAuB,KAAK,CAAC,IAAI,8BAA8B,KAAK,CAAC,IAAI,mBAAmB,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;IAC5K,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,KAAK,GAAgB;QACzB,EAAE,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE;QACpB,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,MAAM,EAAE,OAAO;QACf,KAAK,EAAE,KAAK,CAAC,KAAK;QAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ,IAAI,IAAI;QAChC,UAAU,EAAE,KAAK,CAAC,UAAU;QAC5B,WAAW,EAAE,IAAI;QACjB,SAAS,EAAE,GAAG;QACd,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,CAAC;KACX,CAAC;IAEF,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjC,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;YAClC,OAAO,EAAE,KAAK,CAAC,EAAE;YACjB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,KAAK;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,gBAAgB,CAAC,KAAK,CAAC;YAC1B,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAClD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,KAAK,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEzJ,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,EAAE,CAAC;AACxC,CAAC;AAaD;;;;;;;;GAQG;AACH,KAAK,UAAU,iCAAiC,CAC9C,IAAiC,EACjC,KAAoF;IAEpF,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,OAAO,EAAE,UAAU,EAAE,0BAA0B,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAChJ,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,cAAc,CAAC,cAAc,KAAK,CAAC,OAAO,0BAA0B,KAAK,CAAC,EAAE,MAAM,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;IAC3I,CAAC;IAED,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9F,IAAI,CAAC,KAAK,EAAE,CAAC;QACX,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,kBAAkB,CAAC,UAAU,KAAK,CAAC,EAAE,iCAAiC,KAAK,CAAC,WAAW,GAAG,CAAC,EAAE,CAAC;IAC/H,CAAC;IAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,SAAS,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC9G,IAAI,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,WAAW,EAAE,CAAC;QACtD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,yBAAyB,CAAC,iBAAiB,KAAK,CAAC,IAAI,oFAAoF,CAAC,EAAE,CAAC;IAC9K,CAAC;IAED,IAAI,KAAK,CAAC,eAAe,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC;QAC5C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,oBAAoB,CAAC,oBAAoB,KAAK,CAAC,eAAe,eAAe,KAAK,CAAC,EAAE,YAAY,KAAK,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;IACrJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,CAAC;AACrD,CAAC;AA+BD;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,QAA6B;IAC7D,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,iCAAiC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;IAEvD,IAAI,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;IACpC,IAAI,KAAK,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;QACnC,MAAM,UAAU,GAAG,2BAA2B,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,UAAU,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,CAAC,CAAC;QACxI,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;YACtB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,yBAAyB,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;QACrF,CAAC;QACD,UAAU,GAAG,KAAK,CAAC,UAAU,CAAC;IAChC,CAAC;IAED,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,OAAO,GAAgB;QAC3B,GAAG,OAAO;QACV,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK;QACnC,UAAU;QACV,QAAQ,EAAE,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,QAAQ;QAC1E,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC;KAC7B,CAAC;IAEF,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;YAClC,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,EAAE,EAAE,QAAQ;YACZ,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,gBAAgB,CAAC,KAAK,CAAC;YAC1B,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;QAC5F,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,eAAe,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAEvH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;AACjD,CAAC;AAOD,KAAK,UAAU,qBAAqB,CAClC,QAAuC,EACvC,MAAgI;IAEhI,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAEjC,MAAM,QAAQ,GAAG,MAAM,iCAAiC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IACtE,IAAI,CAAC,QAAQ,CAAC,EAAE;QAAE,OAAO,QAAQ,CAAC;IAClC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,QAAQ,CAAC,KAAK,CAAC;IAE1C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAChC,MAAM,OAAO,GAAgB;QAC3B,GAAG,OAAO;QACV,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,WAAW,EAAE,MAAM,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW;QACtE,SAAS,EAAE,GAAG;QACd,OAAO,EAAE,OAAO,CAAC,OAAO,GAAG,CAAC;KAC7B,CAAC;IAEF,MAAM,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,KAAK,IAAI,EAAE;QAC1C,MAAM,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC;YAClC,OAAO,EAAE,OAAO,CAAC,EAAE;YACnB,WAAW,EAAE,KAAK,CAAC,WAAW;YAC9B,EAAE,EAAE,MAAM,CAAC,EAAE;YACb,SAAS,EAAE,OAAO;YAClB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,gBAAgB,CAAC,KAAK,CAAC;YAC1B,UAAU,EAAE,GAAG;SAChB,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,SAAS;YAAE,MAAM,IAAI,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,CAAC,CAAC;IAC9F,CAAC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;IAExH,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC;AACjD,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,QAAuC;IACxE,OAAO,qBAAqB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC,CAAC;AAC/G,CAAC;AAED;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAuC;IAC1E,OAAO,qBAAqB,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,EAAE,EAAE,WAAW,EAAE,SAAS,EAAE,mBAAmB,EAAE,CAAC,CAAC;AACrH,CAAC"}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
import type { UUID } from "../core/ports.js";
|
|
2
|
+
import type { AuthServiceDeps } from "./auth-service.js";
|
|
3
|
+
import { type PolicyPermissionRecord, type PolicyRecord, type PrincipalRecord, type RoleRecord, type UserRecord } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* @file An amendment that completes the users/roles/policies admin CRUD surface
|
|
6
|
+
* (feature.spec.md REQ-11/REQ-15..19).
|
|
7
|
+
*
|
|
8
|
+
* Purpose:
|
|
9
|
+
* Two of these nine transitions (`disablePrincipal`, `writePolicyPermission`) were fully specified
|
|
10
|
+
* since v0.5.0/v0.5.3 but never implemented — this file is their first implementation, not a
|
|
11
|
+
* re-specification (AC-32). The other seven (`enablePrincipal`, `updateUser`,
|
|
12
|
+
* `resetUserPassword`, `updateRole`, `updatePolicy`, `deleteRole`, `deletePolicy`) are new
|
|
13
|
+
* transitions this amendment adds. Grouped in one file, separate from `grant-service.ts`'s
|
|
14
|
+
* "human grant-writing transitions" (`CREATE_*`/`ASSIGN_ROLE`/`ATTACH_POLICY`) because most of
|
|
15
|
+
* these are plain CRUD, not grant-writing — `writePolicyPermission` is the one exception (it IS
|
|
16
|
+
* INV-07-clamped) and reuses `grant-service.ts`'s exported `assertGrantClamp` rather than
|
|
17
|
+
* duplicating it.
|
|
18
|
+
*
|
|
19
|
+
* Architectural role:
|
|
20
|
+
* Ordinary core functions — same shape as `grant-service.ts`: one exported async
|
|
21
|
+
* function per transition, plain `Error` subclasses for control flow, the caller-permission gate
|
|
22
|
+
* enforced here (not pushed to the route layer).
|
|
23
|
+
*/
|
|
24
|
+
/**
|
|
25
|
+
* `DISABLE_PRINCIPAL` (feature.spec.md REQ-11, state.spec §3, AC-08/AC-21/AC-27). Gated by
|
|
26
|
+
* `user.manage`. Refuses the seeded owner unconditionally (REQ-13's CLI/core resolution target —
|
|
27
|
+
* disabling it would strand the CLI-only management plane) and refuses any disable that would drop
|
|
28
|
+
* the workspace's active owner-`*` count to zero (INV-08) — both checked, and the status update
|
|
29
|
+
* performed, inside this one function body with no `await` yielded to another caller in between
|
|
30
|
+
* (this codebase's established "atomic by construction" reasoning for a single-connection,
|
|
31
|
+
* single-event-loop composition — same as `features/workspace/delete.ts`'s INV-03 guard).
|
|
32
|
+
*
|
|
33
|
+
* `input.seededOwnerPrincipalId` is the caller's job to resolve (`await deps.ownerPrincipalId` at
|
|
34
|
+
* the route layer, mirroring `identityReady`'s existing await-before-use convention) — this
|
|
35
|
+
* function takes the already-resolved id so it stays a plain, directly-testable function.
|
|
36
|
+
*
|
|
37
|
+
* @complexity O(n) in the workspace's principal count (one `list()` call to count active owner-`*`
|
|
38
|
+
* holders) — bounded by the same operator-managed-roster assumption `identity/INFO.md` already
|
|
39
|
+
* makes for `PrincipalRepoPort.list()`.
|
|
40
|
+
* @overallScore 100
|
|
41
|
+
*/
|
|
42
|
+
export declare function disablePrincipal(required: {
|
|
43
|
+
deps: AuthServiceDeps;
|
|
44
|
+
input: {
|
|
45
|
+
workspaceId: UUID;
|
|
46
|
+
callerPrincipalId: UUID;
|
|
47
|
+
principalId: UUID;
|
|
48
|
+
seededOwnerPrincipalId: UUID;
|
|
49
|
+
};
|
|
50
|
+
}): Promise<{
|
|
51
|
+
principal: PrincipalRecord;
|
|
52
|
+
}>;
|
|
53
|
+
/**
|
|
54
|
+
* `ENABLE_PRINCIPAL` (feature.spec.md REQ-15, AC-27, EC-14). Gated by `user.manage`. Target must be
|
|
55
|
+
* `kind='user'` — a `system`/`api_key` target is rejected `VALIDATION_ERROR` (mirrors AC-25b's
|
|
56
|
+
* human-only scoping; re-activating the disabled legacy `user-local` stub or an api_key principal
|
|
57
|
+
* outside `ISSUE_API_KEY`'s own lifecycle is never a valid call). Already-active is idempotent
|
|
58
|
+
* (mirrors `disablePrincipal`'s own already-disabled no-op above).
|
|
59
|
+
*
|
|
60
|
+
* @complexity O(1) — one lookup, one save.
|
|
61
|
+
* @overallScore 100
|
|
62
|
+
*/
|
|
63
|
+
export declare function enablePrincipal(required: {
|
|
64
|
+
deps: AuthServiceDeps;
|
|
65
|
+
input: {
|
|
66
|
+
workspaceId: UUID;
|
|
67
|
+
callerPrincipalId: UUID;
|
|
68
|
+
principalId: UUID;
|
|
69
|
+
};
|
|
70
|
+
}): Promise<{
|
|
71
|
+
principal: PrincipalRecord;
|
|
72
|
+
}>;
|
|
73
|
+
/**
|
|
74
|
+
* `UPDATE_USER` (feature.spec.md REQ-16, AC-28). Gated by `user.manage` **or** `member.manage`
|
|
75
|
+
* (mirrors `CREATE_USER`'s admin-onboarding gate) — `email` only; `username`/`password` are not
|
|
76
|
+
* this transition's concern (OQ-09 / REQ-17 respectively). An absent or empty-string `email`
|
|
77
|
+
* clears the stored value to `undefined` (EC-17 — no distinct "blank but present" state).
|
|
78
|
+
*
|
|
79
|
+
* @complexity O(1) — one lookup, one save.
|
|
80
|
+
* @overallScore 100
|
|
81
|
+
*/
|
|
82
|
+
export declare function updateUser(required: {
|
|
83
|
+
deps: AuthServiceDeps;
|
|
84
|
+
input: {
|
|
85
|
+
workspaceId: UUID;
|
|
86
|
+
callerPrincipalId: UUID;
|
|
87
|
+
principalId: UUID;
|
|
88
|
+
email?: string | undefined;
|
|
89
|
+
};
|
|
90
|
+
}): Promise<{
|
|
91
|
+
user: UserRecord;
|
|
92
|
+
}>;
|
|
93
|
+
/**
|
|
94
|
+
* `RESET_USER_PASSWORD` (feature.spec.md REQ-17, AC-29, EC-16). Gated by **`user.manage`** only
|
|
95
|
+
* (stricter than `updateUser` — resetting a credential is at least as sensitive as disabling the
|
|
96
|
+
* account, REQ-17's own reasoning). Hashes the new password identically to `CREATE_USER` (argon2id,
|
|
97
|
+
* INV-05), then revokes every one of the target's active sessions (idempotent no-op if it has none,
|
|
98
|
+
* EC-16) — a reset that left old sessions alive would not actually contain a compromised account.
|
|
99
|
+
*
|
|
100
|
+
* @complexity O(s) in the target's session count, s = active session rows to revoke — bounded by
|
|
101
|
+
* the same operator-managed-roster scale assumption every other identity list call here makes.
|
|
102
|
+
* @overallScore 100
|
|
103
|
+
*/
|
|
104
|
+
export declare function resetUserPassword(required: {
|
|
105
|
+
deps: AuthServiceDeps;
|
|
106
|
+
input: {
|
|
107
|
+
workspaceId: UUID;
|
|
108
|
+
callerPrincipalId: UUID;
|
|
109
|
+
principalId: UUID;
|
|
110
|
+
password: string;
|
|
111
|
+
};
|
|
112
|
+
}): Promise<{
|
|
113
|
+
user: UserRecord;
|
|
114
|
+
}>;
|
|
115
|
+
/**
|
|
116
|
+
* `UPDATE_ROLE` (feature.spec.md REQ-18, AC-30). Gated by `role.manage`. A built-in target is
|
|
117
|
+
* refused `VALIDATION_ERROR` — extends INV-06's existing undeletable/immutable/un-attachable-to
|
|
118
|
+
* rule to also cover un-renameable (same escalation shape: relabeling `viewer` to read as trusted
|
|
119
|
+
* is a social-engineering variant of what INV-06 already blocks structurally).
|
|
120
|
+
*
|
|
121
|
+
* @complexity O(1) — one lookup, one save.
|
|
122
|
+
* @overallScore 100
|
|
123
|
+
*/
|
|
124
|
+
export declare function updateRole(required: {
|
|
125
|
+
deps: AuthServiceDeps;
|
|
126
|
+
input: {
|
|
127
|
+
workspaceId: UUID;
|
|
128
|
+
callerPrincipalId: UUID;
|
|
129
|
+
roleId: UUID;
|
|
130
|
+
name: string;
|
|
131
|
+
};
|
|
132
|
+
}): Promise<{
|
|
133
|
+
role: RoleRecord;
|
|
134
|
+
}>;
|
|
135
|
+
/**
|
|
136
|
+
* `UPDATE_POLICY` (feature.spec.md REQ-18, AC-30). Gated by `role.manage`. A built-in or
|
|
137
|
+
* `is_frozen` target is refused `VALIDATION_ERROR` — the frozen-policy half mirrors
|
|
138
|
+
* `WRITE_POLICY_PERMISSION`'s existing refusal (AC-26): an issuance snapshot's identity is as
|
|
139
|
+
* immutable as its permission set. At least one of `name`/`description` must be present.
|
|
140
|
+
*
|
|
141
|
+
* @complexity O(1) — one lookup, one save.
|
|
142
|
+
* @overallScore 100
|
|
143
|
+
*/
|
|
144
|
+
export declare function updatePolicy(required: {
|
|
145
|
+
deps: AuthServiceDeps;
|
|
146
|
+
input: {
|
|
147
|
+
workspaceId: UUID;
|
|
148
|
+
callerPrincipalId: UUID;
|
|
149
|
+
policyId: UUID;
|
|
150
|
+
name?: string | undefined;
|
|
151
|
+
description?: string | undefined;
|
|
152
|
+
};
|
|
153
|
+
}): Promise<{
|
|
154
|
+
policy: PolicyRecord;
|
|
155
|
+
}>;
|
|
156
|
+
/**
|
|
157
|
+
* `DELETE_ROLE` (feature.spec.md REQ-19/INV-09, AC-31, EC-15). Gated by `role.manage`. A built-in
|
|
158
|
+
* target is refused `VALIDATION_ERROR` (checked before the reference count, matching AC-31's
|
|
159
|
+
* stated precedence). A still-referenced target (≥1 `principal_roles` row) is refused
|
|
160
|
+
* `IdentityConflictError` (409 `RESOURCE_CONFLICT`) — the reference check and the delete happen in
|
|
161
|
+
* this one function body with no yielded `await` in between (INV-09's atomicity, same reasoning as
|
|
162
|
+
* `disablePrincipal`'s owner-count guard above).
|
|
163
|
+
*
|
|
164
|
+
* @complexity O(a) in the role's assignment count (`principalRoles.listByRoleId`) — bounded by the
|
|
165
|
+
* same operator-managed-roster assumption every other identity list call makes.
|
|
166
|
+
* @overallScore 100
|
|
167
|
+
*/
|
|
168
|
+
export declare function deleteRole(required: {
|
|
169
|
+
deps: AuthServiceDeps;
|
|
170
|
+
input: {
|
|
171
|
+
workspaceId: UUID;
|
|
172
|
+
callerPrincipalId: UUID;
|
|
173
|
+
roleId: UUID;
|
|
174
|
+
};
|
|
175
|
+
}): Promise<void>;
|
|
176
|
+
/**
|
|
177
|
+
* `DELETE_POLICY` (feature.spec.md REQ-19/INV-09, AC-31, EC-15). Gated by `role.manage`. A
|
|
178
|
+
* built-in or `is_frozen` target is refused `VALIDATION_ERROR` (checked before the reference
|
|
179
|
+
* count). A still-referenced target (≥1 `role_policies` or `principal_policies` row) is refused
|
|
180
|
+
* `IdentityConflictError`. On success, cascades to the policy's OWN `policy_permissions` rows only
|
|
181
|
+
* (never a different policy's) before deleting the policy row itself.
|
|
182
|
+
*
|
|
183
|
+
* @complexity O(r + p) — role-reference count + principal-reference count, both bounded by the same
|
|
184
|
+
* operator-managed-roster assumption every other identity list call makes.
|
|
185
|
+
* @overallScore 100
|
|
186
|
+
*/
|
|
187
|
+
export declare function deletePolicy(required: {
|
|
188
|
+
deps: AuthServiceDeps;
|
|
189
|
+
input: {
|
|
190
|
+
workspaceId: UUID;
|
|
191
|
+
callerPrincipalId: UUID;
|
|
192
|
+
policyId: UUID;
|
|
193
|
+
};
|
|
194
|
+
}): Promise<void>;
|
|
195
|
+
/**
|
|
196
|
+
* `WRITE_POLICY_PERMISSION` (feature.spec.md INV-07, state.spec §3, AC-10/AC-24/AC-26). First HTTP
|
|
197
|
+
* implementation of a transition specified since v0.5.3 (AC-32 — this is a route, not a
|
|
198
|
+
* re-specification). Gated by `role.manage`. Refuses an unregistered permission
|
|
199
|
+
* (`PermissionUnknownError`, REQ-03), a built-in or `is_frozen` parent policy (INV-06/AC-26), and
|
|
200
|
+
* (via the shared `assertGrantClamp`) a permission the caller does not itself hold unconstrained
|
|
201
|
+
* (INV-07, `GrantExceedsIssuerError`).
|
|
202
|
+
*
|
|
203
|
+
* @complexity O(assertGrantClamp) — see that function's own doc (resolveEffectivePermissions +
|
|
204
|
+
* O(1) local filtering, one permission).
|
|
205
|
+
* @overallScore 100
|
|
206
|
+
*/
|
|
207
|
+
export declare function writePolicyPermission(required: {
|
|
208
|
+
deps: AuthServiceDeps;
|
|
209
|
+
input: {
|
|
210
|
+
workspaceId: UUID;
|
|
211
|
+
callerPrincipalId: UUID;
|
|
212
|
+
policyId: UUID;
|
|
213
|
+
permission: string;
|
|
214
|
+
resourceType?: string | null;
|
|
215
|
+
constraintJson?: string | null;
|
|
216
|
+
};
|
|
217
|
+
}): Promise<{
|
|
218
|
+
policyPermission: PolicyPermissionRecord;
|
|
219
|
+
}>;
|
|
220
|
+
/**
|
|
221
|
+
* `REMOVE_POLICY_PERMISSION` (OQ-10) — the inverse of {@link writePolicyPermission}, and the
|
|
222
|
+
* transition whose absence made a policy's permission set append-only: the only way to shrink one
|
|
223
|
+
* was `deletePolicy` + recreate, which INV-09 blocks outright the moment anything references the
|
|
224
|
+
* policy.
|
|
225
|
+
*
|
|
226
|
+
* Gated by `role.manage`, the same permission `writePolicyPermission` and `deletePolicy` require.
|
|
227
|
+
* Deliberately NOT clamped by `assertGrantClamp` (INV-07): the clamp exists to stop a caller
|
|
228
|
+
* conferring authority it does not itself hold, and removal confers nothing — it is a strict
|
|
229
|
+
* de-escalation. Requiring the clamp here would mean an admin who cannot grant `content.write`
|
|
230
|
+
* also cannot take it back, which is the wrong direction for a safety rule. This is strictly less
|
|
231
|
+
* powerful than the already-unclamped `deletePolicy`, which drops EVERY permission row the policy
|
|
232
|
+
* has.
|
|
233
|
+
*
|
|
234
|
+
* Refuses a built-in or `is_frozen` parent policy (INV-06/AC-26), checked BEFORE the row lookup so
|
|
235
|
+
* a frozen policy reports why it is frozen rather than leaking whether the row exists. A row that
|
|
236
|
+
* is absent — or that exists but belongs to a DIFFERENT policy — is one and the same
|
|
237
|
+
* `IdentityNotFoundError`: membership is proven from `listByPolicyId`'s result, so a caller can
|
|
238
|
+
* never delete across a policy boundary by guessing an id.
|
|
239
|
+
*
|
|
240
|
+
* @complexity O(n) in the policy's own permission-row count (one `listByPolicyId`) — bounded by the
|
|
241
|
+
* same operator-managed-roster assumption every other identity list call makes.
|
|
242
|
+
*/
|
|
243
|
+
export declare function removePolicyPermission(required: {
|
|
244
|
+
deps: AuthServiceDeps;
|
|
245
|
+
input: {
|
|
246
|
+
workspaceId: UUID;
|
|
247
|
+
callerPrincipalId: UUID;
|
|
248
|
+
policyId: UUID;
|
|
249
|
+
policyPermissionId: UUID;
|
|
250
|
+
};
|
|
251
|
+
}): Promise<void>;
|
|
252
|
+
//# sourceMappingURL=admin-crud-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-crud-service.d.ts","sourceRoot":"","sources":["../../src/identity/admin-crud-service.ts"],"names":[],"mappings":"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"}
|