@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,42 @@
|
|
|
1
|
+
import type { ClockPort, IdGeneratorPort, UUID } from "../core/ports.js";
|
|
2
|
+
import type { IdentityRepos, PasswordHasherPort } from "./ports.js";
|
|
3
|
+
export interface SeedIdentityDeps {
|
|
4
|
+
repos: IdentityRepos;
|
|
5
|
+
hasher: PasswordHasherPort;
|
|
6
|
+
clock: ClockPort;
|
|
7
|
+
idGen: IdGeneratorPort;
|
|
8
|
+
}
|
|
9
|
+
export interface SeedIdentityInput {
|
|
10
|
+
workspaceId: UUID;
|
|
11
|
+
/** Defaults to `"admin"`. A username is not a secret, so a library default costs nothing here. */
|
|
12
|
+
ownerUsername?: string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Required, and deliberately without a default.
|
|
15
|
+
*
|
|
16
|
+
* This function mints the first credential that can administer a workspace. A library-supplied
|
|
17
|
+
* fallback would mean every host that forgot to pass one shipped the *same* owner password, and
|
|
18
|
+
* the omission would look like working code rather than a misconfiguration. Where the value comes
|
|
19
|
+
* from — an environment variable, an operator prompt, a secret store, a generated string — is a
|
|
20
|
+
* decision only the host can make, because only the host knows its deployment model. Making this
|
|
21
|
+
* required turns "forgot to decide" into a compile error instead of a shared default credential.
|
|
22
|
+
*/
|
|
23
|
+
ownerPassword: string;
|
|
24
|
+
ownerEmail?: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
export interface SeedIdentityResult {
|
|
27
|
+
ownerPrincipalId: UUID;
|
|
28
|
+
systemPrincipalId: UUID;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Seed first-boot identity data (idempotent — a no-op if the owner username
|
|
32
|
+
* already exists in the workspace).
|
|
33
|
+
*
|
|
34
|
+
* @complexity O(1) — fixed small number of inserts (4 roles/policies, ~2
|
|
35
|
+
* dozen policy_permissions, 3 principals, 1 user, 1 role assignment).
|
|
36
|
+
* @overallScore 100
|
|
37
|
+
*/
|
|
38
|
+
export declare function seedIdentity(required: {
|
|
39
|
+
deps: SeedIdentityDeps;
|
|
40
|
+
input: SeedIdentityInput;
|
|
41
|
+
}): Promise<SeedIdentityResult>;
|
|
42
|
+
//# sourceMappingURL=seed.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.d.ts","sourceRoot":"","sources":["../../src/identity/seed.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACzE,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAiJpE,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,IAAI,CAAC;IAClB,kGAAkG;IAClG,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;IACnC;;;;;;;;;OASG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACjC;AAED,MAAM,WAAW,kBAAkB;IACjC,gBAAgB,EAAE,IAAI,CAAC;IACvB,iBAAiB,EAAE,IAAI,CAAC;CACzB;AAwCD;;;;;;;GAOG;AACH,wBAAsB,YAAY,CAAC,QAAQ,EAAE;IAC3C,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,iBAAiB,CAAC;CAC1B,GAAG,OAAO,CAAC,kBAAkB,CAAC,CA+G9B"}
|
|
@@ -0,0 +1,277 @@
|
|
|
1
|
+
import { normalizeUsername } from "./username.js";
|
|
2
|
+
/**
|
|
3
|
+
* @file First-boot identity seed (REQ-09, state.spec `SEED_FIRST_BOOT`).
|
|
4
|
+
*
|
|
5
|
+
* Purpose:
|
|
6
|
+
* Seeds, in one idempotent pass: a `system` principal; a disabled legacy
|
|
7
|
+
* `user-local` principal (REQ-09/EC-09 — so any pre-existing `change_sets`
|
|
8
|
+
* stamped `actorId='user-local'` satisfy the composite FK without rewriting
|
|
9
|
+
* history); four built-in roles (`owner`/`admin`/`editor`/
|
|
10
|
+
* `viewer`) each 1:1 with a built-in policy; and the initial `owner` user.
|
|
11
|
+
*
|
|
12
|
+
* How it relates to the project:
|
|
13
|
+
* - Called once by each composition root (`server/app.ts` in-memory,
|
|
14
|
+
* `server/deps.ts` SQLite-content-with-in-memory-identity) before the
|
|
15
|
+
* server accepts requests. `RouteDeps.identityReady` is this call's
|
|
16
|
+
* promise — auth-adjacent middleware awaits it (see `middleware/dev-auth.ts`).
|
|
17
|
+
*
|
|
18
|
+
* Architectural role:
|
|
19
|
+
* Seed data lives in one place so both composition roots stay identical
|
|
20
|
+
* (mirrors `server/seed.ts`'s reasoning for workspace/post/presentation seed
|
|
21
|
+
* data). Idempotent: re-seeding an already-seeded workspace is a no-op
|
|
22
|
+
* (checked via the owner username).
|
|
23
|
+
*/
|
|
24
|
+
/** REQ-09: the literal id the legacy Article VI actor stamp resolves to. */
|
|
25
|
+
const LEGACY_USER_LOCAL_PRINCIPAL_ID = "user-local";
|
|
26
|
+
const BUILTIN_ADMIN_PERMISSIONS = [
|
|
27
|
+
"content.read",
|
|
28
|
+
"content.write",
|
|
29
|
+
"content.publish",
|
|
30
|
+
"content.delete",
|
|
31
|
+
"theme.set",
|
|
32
|
+
// Editing a theme's source files is an admin capability, deliberately NOT in the editor set
|
|
33
|
+
// below (which keeps theme.set): an editor may switch the site between validated themes, but
|
|
34
|
+
// authoring template/CSS source is a build-time-shaped capability whose failure mode is a broken
|
|
35
|
+
// theme, not a different-looking one.
|
|
36
|
+
"theme.edit",
|
|
37
|
+
"plugin.read",
|
|
38
|
+
"plugin.enable",
|
|
39
|
+
"plugin.disable",
|
|
40
|
+
"changeset.read",
|
|
41
|
+
"changeset.revert",
|
|
42
|
+
"member.manage",
|
|
43
|
+
"settings.write",
|
|
44
|
+
"apikey.manage",
|
|
45
|
+
// Migration clause (mirrors the admin.menus.*/admin.integrations.manage
|
|
46
|
+
// precedent above): every freshly-seeded workspace's admin role gets the concrete media.* working
|
|
47
|
+
// actions directly, so it never depends on migrateDeprecatedPermissionGrants(). The umbrella
|
|
48
|
+
// "media.manage" is deliberately not included here (mirrors admin.menus.manage's exclusion
|
|
49
|
+
// above). "media.write" is deliberately dropped from THIS seed list only — the string stays
|
|
50
|
+
// registered (deprecated) in identity/permissions.ts.
|
|
51
|
+
"media.read",
|
|
52
|
+
"media.upload",
|
|
53
|
+
"media.update",
|
|
54
|
+
"media.delete",
|
|
55
|
+
"media.delete.force",
|
|
56
|
+
"media.download_original",
|
|
57
|
+
"media.upload_svg",
|
|
58
|
+
// Menus remediation migration clause: every freshly-seeded
|
|
59
|
+
// workspace gets the 6 new admin.menus.* CRUD strings directly, so it never depends on
|
|
60
|
+
// migrateDeprecatedPermissionGrants() for its own built-in role grants. The now-legacy
|
|
61
|
+
// "navigation.manage" is deliberately dropped from THIS seed list only — the string itself
|
|
62
|
+
// stays registered (deprecated) in identity/permissions.ts. migrateDeprecatedPermissionGrants()
|
|
63
|
+
// now IS wired into live boot (identity/wiring.ts, chained right after seedIdentity resolves)
|
|
64
|
+
// so any pre-existing policy still holding navigation.manage/integration.manage also gains
|
|
65
|
+
// the new string(s) — this fresh-seed list just doesn't need to depend on that fan-out for its
|
|
66
|
+
// own built-in role grants.
|
|
67
|
+
"admin.menus.read",
|
|
68
|
+
"admin.menus.create",
|
|
69
|
+
"admin.menus.update",
|
|
70
|
+
"admin.menus.delete",
|
|
71
|
+
"admin.menus.delete.force",
|
|
72
|
+
"admin.menus.assign",
|
|
73
|
+
// Migration clause (mirrors the admin.menus.* precedent immediately
|
|
74
|
+
// above): every freshly-seeded workspace gets admin.integrations.manage directly, so it never
|
|
75
|
+
// depends on migrateDeprecatedPermissionGrants(). "integration.manage" is deliberately dropped
|
|
76
|
+
// from THIS seed list only — the string stays registered (deprecated) in permissions.ts.
|
|
77
|
+
"admin.integrations.manage",
|
|
78
|
+
// Migration clause: every settings.write holder also
|
|
79
|
+
// gets settings.definitions.manage, so the admin role isn't left
|
|
80
|
+
// fail-closed-locked-out of definition-lifecycle operations it previously
|
|
81
|
+
// reached through the coarse settings.write grant. No separate migration
|
|
82
|
+
// script is needed pre-launch — this seed function is the sole source of
|
|
83
|
+
// built-in role grants (no existing installation's data to migrate yet).
|
|
84
|
+
"settings.definitions.manage",
|
|
85
|
+
"settings.global.write",
|
|
86
|
+
"settings.workspace.write",
|
|
87
|
+
"settings.user.self.write",
|
|
88
|
+
"settings.user.write",
|
|
89
|
+
// Internal audit F2 remediation (2026-07-29): granted directly here so a freshly-seeded
|
|
90
|
+
// workspace never depends on the `settings.user.write` -> `settings.user.read` fan-out in
|
|
91
|
+
// permissions.ts (same "don't depend on migrateDeprecatedPermissionGrants for our own built-in
|
|
92
|
+
// role grants" discipline as the admin.menus.*/admin.integrations.manage clauses above). The
|
|
93
|
+
// fan-out exists for ALREADY-seeded installations, which this list cannot reach because
|
|
94
|
+
// seedIdentity early-returns once an owner user exists.
|
|
95
|
+
"settings.user.read",
|
|
96
|
+
"settings.reset.global",
|
|
97
|
+
"settings.reset.workspace",
|
|
98
|
+
"settings.reset.user",
|
|
99
|
+
"settings.read",
|
|
100
|
+
"settings.read.raw",
|
|
101
|
+
"settings.read.revisions",
|
|
102
|
+
"settings.read.definitions",
|
|
103
|
+
// Every freshly-seeded workspace's built-in admin role
|
|
104
|
+
// gets the one SEO umbrella permission directly, mirroring the admin.menus.* precedent above.
|
|
105
|
+
"admin.seo.manage",
|
|
106
|
+
// The AI Assistant section's umbrella permission, granted directly here for the same reason
|
|
107
|
+
// `admin.seo.manage` above is: a freshly-seeded workspace's built-in admin must be able to reach
|
|
108
|
+
// the public assistant's master switch without depending on any deprecated-grant fan-out. Turning
|
|
109
|
+
// the public assistant ON is still a deliberate act — the SETTING defaults to off
|
|
110
|
+
// (`assistant/public-assistant-settings.ts`); this only grants the ability to flip it.
|
|
111
|
+
"admin.assistant.manage",
|
|
112
|
+
// Workspace Administration: admin gets workspace.manage
|
|
113
|
+
// directly at seed — a distinct grant from settings.write, not owner-only (unlike user.manage/
|
|
114
|
+
// role.manage below).
|
|
115
|
+
"workspace.manage",
|
|
116
|
+
// Owner-only per REQ-09: "user.manage", "role.manage" are deliberately absent.
|
|
117
|
+
];
|
|
118
|
+
const BUILTIN_EDITOR_PERMISSIONS = [
|
|
119
|
+
"content.read",
|
|
120
|
+
"content.write",
|
|
121
|
+
"content.publish",
|
|
122
|
+
"content.delete",
|
|
123
|
+
// Migration clause: editor gets the ordinary media working actions
|
|
124
|
+
// (read/upload/update/trash) but, unlike admin above, NOT media.delete.force (destructive
|
|
125
|
+
// hard-purge), media.download_original (mint-only access to sensitive originals), or
|
|
126
|
+
// media.upload_svg (XSS-risk-gated capability) — mirrors the Forms admin.forms.manage vs
|
|
127
|
+
// admin.forms.submissions.* PII-split precedent rather than granting editor
|
|
128
|
+
// everything admin.write's single flat string previously implied. "media.write" is deliberately
|
|
129
|
+
// dropped from THIS seed list only — the string stays registered (deprecated) in
|
|
130
|
+
// identity/permissions.ts. Still a subset of admin's media.* set above (AC-12's owner ⊇ admin ⊇
|
|
131
|
+
// editor subset property).
|
|
132
|
+
"media.read",
|
|
133
|
+
"media.upload",
|
|
134
|
+
"media.update",
|
|
135
|
+
"media.delete",
|
|
136
|
+
"theme.set",
|
|
137
|
+
];
|
|
138
|
+
const BUILTIN_VIEWER_PERMISSIONS = ["content.read", "changeset.read", "plugin.read"];
|
|
139
|
+
/** Builds one built-in role + its 1:1 policy + policy_permissions rows, and saves all three. */
|
|
140
|
+
async function seedBuiltinRoleWithPolicy(required) {
|
|
141
|
+
const { deps, workspaceId, name, permissions, nowIso } = required;
|
|
142
|
+
const roleId = deps.idGen.newId();
|
|
143
|
+
const policyId = deps.idGen.newId();
|
|
144
|
+
await deps.repos.roles.save({ id: roleId, workspaceId, name, isBuiltin: true });
|
|
145
|
+
await deps.repos.policies.save({
|
|
146
|
+
id: policyId,
|
|
147
|
+
workspaceId,
|
|
148
|
+
name: `${name}-builtin-policy`,
|
|
149
|
+
description: `Built-in policy for the seeded '${name}' role.`,
|
|
150
|
+
isBuiltin: true,
|
|
151
|
+
isFrozen: false,
|
|
152
|
+
});
|
|
153
|
+
await deps.repos.rolePolicies.save({ id: deps.idGen.newId(), workspaceId, roleId, policyId });
|
|
154
|
+
for (const permission of permissions) {
|
|
155
|
+
await deps.repos.policyPermissions.save({
|
|
156
|
+
id: deps.idGen.newId(),
|
|
157
|
+
workspaceId,
|
|
158
|
+
policyId,
|
|
159
|
+
permission,
|
|
160
|
+
resourceType: null,
|
|
161
|
+
constraintJson: null,
|
|
162
|
+
});
|
|
163
|
+
}
|
|
164
|
+
void nowIso; // reserved for a future createdAt column on roles/policies
|
|
165
|
+
return { roleId, policyId };
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Seed first-boot identity data (idempotent — a no-op if the owner username
|
|
169
|
+
* already exists in the workspace).
|
|
170
|
+
*
|
|
171
|
+
* @complexity O(1) — fixed small number of inserts (4 roles/policies, ~2
|
|
172
|
+
* dozen policy_permissions, 3 principals, 1 user, 1 role assignment).
|
|
173
|
+
* @overallScore 100
|
|
174
|
+
*/
|
|
175
|
+
export async function seedIdentity(required) {
|
|
176
|
+
const { deps, input } = required;
|
|
177
|
+
const workspaceId = input.workspaceId;
|
|
178
|
+
const ownerUsername = normalizeUsername(input.ownerUsername ?? "admin");
|
|
179
|
+
const ownerPassword = input.ownerPassword;
|
|
180
|
+
const nowIso = deps.clock.nowIso();
|
|
181
|
+
const existingOwnerUser = await deps.repos.users.findByUsername({
|
|
182
|
+
workspaceId,
|
|
183
|
+
username: ownerUsername,
|
|
184
|
+
});
|
|
185
|
+
if (existingOwnerUser) {
|
|
186
|
+
const existingSystem = (await deps.repos.principals.list({ workspaceId })).find((row) => row.kind === "system" && row.id !== LEGACY_USER_LOCAL_PRINCIPAL_ID);
|
|
187
|
+
return {
|
|
188
|
+
ownerPrincipalId: existingOwnerUser.principalId,
|
|
189
|
+
systemPrincipalId: existingSystem?.id ?? LEGACY_USER_LOCAL_PRINCIPAL_ID,
|
|
190
|
+
};
|
|
191
|
+
}
|
|
192
|
+
const systemPrincipalId = deps.idGen.newId();
|
|
193
|
+
await deps.repos.principals.save({
|
|
194
|
+
id: systemPrincipalId,
|
|
195
|
+
workspaceId,
|
|
196
|
+
kind: "system",
|
|
197
|
+
displayName: "System",
|
|
198
|
+
status: "active",
|
|
199
|
+
createdAt: nowIso,
|
|
200
|
+
});
|
|
201
|
+
// REQ-09/EC-09: disabled legacy actor so historical `actorId='user-local'`
|
|
202
|
+
// change-sets resolve without rewriting history.
|
|
203
|
+
await deps.repos.principals.save({
|
|
204
|
+
id: LEGACY_USER_LOCAL_PRINCIPAL_ID,
|
|
205
|
+
workspaceId,
|
|
206
|
+
kind: "system",
|
|
207
|
+
displayName: "Legacy actor (pre-identity)",
|
|
208
|
+
status: "disabled",
|
|
209
|
+
disabledAt: nowIso,
|
|
210
|
+
createdAt: nowIso,
|
|
211
|
+
});
|
|
212
|
+
const { roleId: ownerRoleId } = await seedBuiltinRoleWithPolicy({
|
|
213
|
+
deps,
|
|
214
|
+
workspaceId,
|
|
215
|
+
name: "owner",
|
|
216
|
+
permissions: [],
|
|
217
|
+
nowIso,
|
|
218
|
+
});
|
|
219
|
+
// REQ-04/REQ-09: the owner policy holds the wildcard `*`, not an enumerated
|
|
220
|
+
// list, so it automatically covers permissions features register later.
|
|
221
|
+
const ownerPolicy = (await deps.repos.policies.list({ workspaceId })).find((row) => row.name === "owner-builtin-policy");
|
|
222
|
+
if (!ownerPolicy)
|
|
223
|
+
throw new Error("seedIdentity: owner policy was not created");
|
|
224
|
+
await deps.repos.policyPermissions.save({
|
|
225
|
+
id: deps.idGen.newId(),
|
|
226
|
+
workspaceId,
|
|
227
|
+
policyId: ownerPolicy.id,
|
|
228
|
+
permission: "*",
|
|
229
|
+
resourceType: null,
|
|
230
|
+
constraintJson: null,
|
|
231
|
+
});
|
|
232
|
+
await seedBuiltinRoleWithPolicy({
|
|
233
|
+
deps,
|
|
234
|
+
workspaceId,
|
|
235
|
+
name: "admin",
|
|
236
|
+
permissions: BUILTIN_ADMIN_PERMISSIONS,
|
|
237
|
+
nowIso,
|
|
238
|
+
});
|
|
239
|
+
await seedBuiltinRoleWithPolicy({
|
|
240
|
+
deps,
|
|
241
|
+
workspaceId,
|
|
242
|
+
name: "editor",
|
|
243
|
+
permissions: BUILTIN_EDITOR_PERMISSIONS,
|
|
244
|
+
nowIso,
|
|
245
|
+
});
|
|
246
|
+
await seedBuiltinRoleWithPolicy({
|
|
247
|
+
deps,
|
|
248
|
+
workspaceId,
|
|
249
|
+
name: "viewer",
|
|
250
|
+
permissions: BUILTIN_VIEWER_PERMISSIONS,
|
|
251
|
+
nowIso,
|
|
252
|
+
});
|
|
253
|
+
const ownerPrincipalId = deps.idGen.newId();
|
|
254
|
+
await deps.repos.principals.save({
|
|
255
|
+
id: ownerPrincipalId,
|
|
256
|
+
workspaceId,
|
|
257
|
+
kind: "user",
|
|
258
|
+
displayName: "Owner",
|
|
259
|
+
status: "active",
|
|
260
|
+
createdAt: nowIso,
|
|
261
|
+
});
|
|
262
|
+
await deps.repos.users.save({
|
|
263
|
+
principalId: ownerPrincipalId,
|
|
264
|
+
workspaceId,
|
|
265
|
+
username: ownerUsername,
|
|
266
|
+
email: input.ownerEmail,
|
|
267
|
+
passwordHash: await deps.hasher.hash(ownerPassword),
|
|
268
|
+
});
|
|
269
|
+
await deps.repos.principalRoles.save({
|
|
270
|
+
id: deps.idGen.newId(),
|
|
271
|
+
workspaceId,
|
|
272
|
+
principalId: ownerPrincipalId,
|
|
273
|
+
roleId: ownerRoleId,
|
|
274
|
+
});
|
|
275
|
+
return { ownerPrincipalId, systemPrincipalId };
|
|
276
|
+
}
|
|
277
|
+
//# sourceMappingURL=seed.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"seed.js","sourceRoot":"","sources":["../../src/identity/seed.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Identity's half of the agent-tool authorization wiring: maps `agent-tools.ts`'s fifteen catalog
|
|
3
|
+
* entries onto the users/roles/policies transitions `grant-service.ts`/`admin-crud-service.ts`
|
|
4
|
+
* export, plus the three repo-backed reads, as `ToolRegistration`s.
|
|
5
|
+
*
|
|
6
|
+
* `ToolPolicy.authorize` is a pass-through for all fifteen (see `buildDomainRegistrations`) for the
|
|
7
|
+
* "one evaluator" reason: the gate is the domain layer's, reached identically by every
|
|
8
|
+
* tool kind — mutations through their own service function, which opens with the check, and reads
|
|
9
|
+
* through {@link assertIdentityReadAllowed}, which calls the domain's own exported
|
|
10
|
+
* `assertCallerHasAnyPermission` rather than re-deriving an OR gate. A second check here would be a
|
|
11
|
+
* duplicate evaluator, and one any non-tool caller of the same service function would bypass. See
|
|
12
|
+
* `assistant/__tests__/tool-registrations.identity-authorization.test.ts`.
|
|
13
|
+
*/
|
|
14
|
+
import { type DerivedRiskByToolId, type ToolRegistration } from "../core/tools/registration-kit.js";
|
|
15
|
+
import type { PasswordHasherPort, PolicyPermissionRepoPort, PolicyRepoPort, PrincipalPolicyRepoPort, PrincipalRepoPort, PrincipalRoleRepoPort, RolePolicyRepoPort, RoleRepoPort, SessionRepoPort, UserRepoPort } from "./ports.js";
|
|
16
|
+
/**
|
|
17
|
+
* The exact slice of the route-deps bag Identity's tool handlers read. Declared structurally
|
|
18
|
+
* (rather than importing `server/routes/types`'s `RouteDeps`) so this module carries no back-edge
|
|
19
|
+
* into the composition root. `server/routes/*` satisfies this structurally by passing its existing
|
|
20
|
+
* `RouteDeps` (in practice `UsersRouteDeps`, a `Pick<RouteDeps, ...>` subset — a strict superset of
|
|
21
|
+
* this shape) object; nothing there changes.
|
|
22
|
+
*/
|
|
23
|
+
export interface IdentityToolDeps {
|
|
24
|
+
workspaceId: string;
|
|
25
|
+
clock: {
|
|
26
|
+
nowIso(): string;
|
|
27
|
+
};
|
|
28
|
+
idGen: {
|
|
29
|
+
newId(): string;
|
|
30
|
+
};
|
|
31
|
+
principalRepo: PrincipalRepoPort;
|
|
32
|
+
userRepo: UserRepoPort;
|
|
33
|
+
sessionRepo: SessionRepoPort;
|
|
34
|
+
roleRepo: RoleRepoPort;
|
|
35
|
+
policyRepo: PolicyRepoPort;
|
|
36
|
+
policyPermissionRepo: PolicyPermissionRepoPort;
|
|
37
|
+
rolePolicyRepo: RolePolicyRepoPort;
|
|
38
|
+
principalRoleRepo: PrincipalRoleRepoPort;
|
|
39
|
+
principalPolicyRepo: PrincipalPolicyRepoPort;
|
|
40
|
+
passwordHasher: PasswordHasherPort;
|
|
41
|
+
ownerPrincipalId: Promise<string>;
|
|
42
|
+
}
|
|
43
|
+
/**
|
|
44
|
+
* This wiring layer's OWN risk classification, authored from what each handler below actually
|
|
45
|
+
* calls. See `DerivedRiskByToolId` in the kit for why it is independent of the catalog's own
|
|
46
|
+
* `sideEffects` declaration.
|
|
47
|
+
*/
|
|
48
|
+
export declare const identityDerivedRisk: DerivedRiskByToolId;
|
|
49
|
+
export declare function buildIdentityRegistrations(routeDeps: IdentityToolDeps): ToolRegistration[];
|
|
50
|
+
//# sourceMappingURL=tool-registrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrations.d.ts","sourceRoot":"","sources":["../../src/identity/tool-registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAIL,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACtB,MAAM,mCAAmC,CAAC;AAM3C,OAAO,KAAK,EAEV,kBAAkB,EAClB,wBAAwB,EACxB,cAAc,EACd,uBAAuB,EACvB,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,YAAY,EACZ,eAAe,EACf,YAAY,EACb,MAAM,YAAY,CAAC;AAKpB;;;;;;GAMG;AACH,MAAM,WAAW,gBAAgB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QAAE,MAAM,IAAI,MAAM,CAAA;KAAE,CAAC;IAC5B,KAAK,EAAE;QAAE,KAAK,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3B,aAAa,EAAE,iBAAiB,CAAC;IACjC,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,eAAe,CAAC;IAC7B,QAAQ,EAAE,YAAY,CAAC;IACvB,UAAU,EAAE,cAAc,CAAC;IAC3B,oBAAoB,EAAE,wBAAwB,CAAC;IAC/C,cAAc,EAAE,kBAAkB,CAAC;IACnC,iBAAiB,EAAE,qBAAqB,CAAC;IACzC,mBAAmB,EAAE,uBAAuB,CAAC;IAC7C,cAAc,EAAE,kBAAkB,CAAC;IACnC,gBAAgB,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;CACnC;AAmCD;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAgChC,CAAC;AAkLH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CA8N1F"}
|