@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,101 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file The identity (users/roles) agent-tool catalog — this domain's instance of the
|
|
3
|
+
* per-domain `agent-tools.ts` convention already used by `features/content-types`,
|
|
4
|
+
* `features/database`, and `features/recovery`.
|
|
5
|
+
*
|
|
6
|
+
* Purpose:
|
|
7
|
+
* A static, in-process catalog describing every agent-callable identity tool and the permission
|
|
8
|
+
* each one carries. `assistant/tool-registrations.ts` maps these entries onto handlers that call
|
|
9
|
+
* `grant-service.ts` / `admin-crud-service.ts` — the SAME functions the human admin routes under
|
|
10
|
+
* `server/routes/admin/users/` call. There is deliberately no path from a tool to the database
|
|
11
|
+
* that skips those functions, because they are where the domain's authorization gates live.
|
|
12
|
+
*
|
|
13
|
+
* WHAT THIS CATALOG DELIBERATELY OMITS, and why (identity is the escalation-dense
|
|
14
|
+
* surface, so the omissions are part of the design rather than a backlog):
|
|
15
|
+
*
|
|
16
|
+
* - `resetUserPassword` (REQ-17). The one identity transition that sets a credential on
|
|
17
|
+
* an account the caller does not own, and — unlike `ASSIGN_ROLE`/`ATTACH_POLICY` — it carries
|
|
18
|
+
* NO INV-07 grant-authority clamp. A `user.manage` holder may reset the OWNER's password and
|
|
19
|
+
* then authenticate as owner, so it is a full account-takeover primitive rather than a
|
|
20
|
+
* permission grant. An assistant is reachable by prompt injection through ordinary operator
|
|
21
|
+
* content (a form submission, a comment) in a way a human clicking the admin button is not.
|
|
22
|
+
* Left human-UI-only, mirroring `features/content-types/agent-tools.ts`'s reasoning for never
|
|
23
|
+
* exposing the destructive-cleanup confirm() step to an agent.
|
|
24
|
+
* - `writePolicyPermission` (INV-07). This is the one policy transition still
|
|
25
|
+
* deliberately excluded, and on different grounds than the five wired below: unlike
|
|
26
|
+
* `identity_role_assign`/`identity_policy_attach`, which each confer whatever a role/policy
|
|
27
|
+
* ALREADY carries onto exactly one named target principal, `writePolicyPermission` MUTATES a
|
|
28
|
+
* shared, reusable `PolicyRecord` in place — and any non-built-in, non-frozen policy can
|
|
29
|
+
* already be attached to an arbitrary number of OTHER users via `identity_policy_attach` (or to
|
|
30
|
+
* roles via the seed-only `role_policies` table) before this call happens. The INV-07 clamp
|
|
31
|
+
* (`assertGrantClamp`) still bounds WHAT the caller can add — only a permission it itself holds
|
|
32
|
+
* unconstrained — but it says nothing about WHO ends up holding it: every principal already
|
|
33
|
+
* attached to that policy inherits the new permission the instant it is written, invisibly to
|
|
34
|
+
* whoever asked for the one change. That is a materially different blast-radius shape than the
|
|
35
|
+
* single-target primitives this catalog does wire (see the tool descriptions below), and exactly
|
|
36
|
+
* the "grant that ripples to principals never named in the call" class this pass's directive
|
|
37
|
+
* asks to be excluded and explained rather than wired reflexively. Left human-UI-only, where
|
|
38
|
+
* `apps/admin/src/sections/Roles.tsx`'s "Add permission" control still lives.
|
|
39
|
+
*
|
|
40
|
+
* Every OTHER policy transition (`identity_policy_list`, `identity_policy_create`,
|
|
41
|
+
* `identity_policy_update`, `identity_policy_delete`, `identity_policy_attach`) IS wired below,
|
|
42
|
+
* mirroring the risk profile this catalog already accepted for the equivalent role transitions
|
|
43
|
+
* (`identity_role_list`/`identity_role_create`/`identity_role_rename`/`identity_role_delete`/
|
|
44
|
+
* `identity_role_assign`) — see each entry's own description for why its shape matches its role
|
|
45
|
+
* counterpart exactly.
|
|
46
|
+
*
|
|
47
|
+
* - Role REVOCATION. Not a choice: no such operation exists anywhere in this codebase.
|
|
48
|
+
* `PrincipalRoleRepoPort` (`ports.ts`) declares `listByPrincipalId`, `save`, and `listByRoleId`
|
|
49
|
+
* — there is no `delete`, and no service function unassigns a role. A tool cannot be written
|
|
50
|
+
* against an operation the domain does not have, and adding a repo-level delete here to
|
|
51
|
+
* manufacture one would be exactly the "skip the service layer" failure this work exists to
|
|
52
|
+
* close. The same is true of "detach a policy from a principal" — `PrincipalPolicyRepoPort`
|
|
53
|
+
* has no delete either, so `identity_policy_attach` is one-directional exactly like
|
|
54
|
+
* `identity_role_assign`.
|
|
55
|
+
*
|
|
56
|
+
* Architectural role:
|
|
57
|
+
* `identity` library declaration only. Performs no I/O and no enforcement — `authorize()` and each
|
|
58
|
+
* service function's own caller-permission gate enforce at call time. The local
|
|
59
|
+
* `AgentToolSideEffect`/`AgentToolActorClassRule`/`AgentToolDefinition` declarations mirror the
|
|
60
|
+
* house convention: `features/database/agent-tools.ts` and `features/recovery/agent-tools.ts` each
|
|
61
|
+
* declare their own structurally identical copy rather than importing another module's, so a
|
|
62
|
+
* low-level library like `identity` never acquires a dependency on a feature module.
|
|
63
|
+
*/
|
|
64
|
+
export type AgentToolSideEffect = "none" | "mutates-durable-state" | "mints-token";
|
|
65
|
+
export type AgentToolActorClassRule = "confirmer-must-equal-own-delegatedBy" | "user-only" | "none";
|
|
66
|
+
export interface AgentToolDefinition {
|
|
67
|
+
name: string;
|
|
68
|
+
description: string;
|
|
69
|
+
sideEffects: AgentToolSideEffect;
|
|
70
|
+
/**
|
|
71
|
+
* The permission the tool's underlying service function gates on.
|
|
72
|
+
*
|
|
73
|
+
* `orPermission` is present only where that gate is genuinely an OR — three identity transitions
|
|
74
|
+
* accept `user.manage` OR `member.manage` (the admin-onboarding gate, `grant-service.ts`'s
|
|
75
|
+
* `assertCallerHasAnyPermission`). Recording only the first would make this catalog quietly
|
|
76
|
+
* disagree with the code it describes; `__tests__/agent-tools.authorization.test.ts` derives its
|
|
77
|
+
* expected permission set from BOTH fields, so an undeclared OR fails the suite.
|
|
78
|
+
*/
|
|
79
|
+
authorization: {
|
|
80
|
+
permission: string;
|
|
81
|
+
orPermission?: string;
|
|
82
|
+
};
|
|
83
|
+
actorClassRule?: AgentToolActorClassRule;
|
|
84
|
+
/**
|
|
85
|
+
* JSON Schema for this tool's `input`, published to the model via `ToolDescriptor.inputSchema`
|
|
86
|
+
* AND interpreted as the enforcing boundary parser by `agent-tool-input.ts`.
|
|
87
|
+
*
|
|
88
|
+
* Required, not optional as in `features/content-types/agent-tools.ts`: every entry here is
|
|
89
|
+
* wired, so there is no unwired entry whose input shape is undesigned.
|
|
90
|
+
*/
|
|
91
|
+
inputSchema: Readonly<Record<string, unknown>>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* The identity domain's fixed agent-tool catalog.
|
|
95
|
+
*
|
|
96
|
+
* Ordered read-tools-first because that is the order a correct multi-step call chain uses: a model
|
|
97
|
+
* cannot assign a role without a `roleId`, and the only way to learn one for an EXISTING role
|
|
98
|
+
* (including the four seeded built-ins) is `identity_role_list`.
|
|
99
|
+
*/
|
|
100
|
+
export declare const identityAgentToolCatalog: AgentToolDefinition[];
|
|
101
|
+
//# sourceMappingURL=agent-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.d.ts","sourceRoot":"","sources":["../../src/identity/agent-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8DG;AAEH,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,uBAAuB,GAAG,aAAa,CAAC;AAEnF,MAAM,MAAM,uBAAuB,GAAG,sCAAsC,GAAG,WAAW,GAAG,MAAM,CAAC;AAEpG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,mBAAmB,CAAC;IACjC;;;;;;;;OAQG;IACH,aAAa,EAAE;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,YAAY,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAC7D,cAAc,CAAC,EAAE,uBAAuB,CAAC;IACzC;;;;;;OAMG;IACH,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;CAChD;AAgDD;;;;;;GAMG;AACH,eAAO,MAAM,wBAAwB,EAAE,mBAAmB,EAiMzD,CAAC"}
|
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file The identity (users/roles) agent-tool catalog — this domain's instance of the
|
|
3
|
+
* per-domain `agent-tools.ts` convention already used by `features/content-types`,
|
|
4
|
+
* `features/database`, and `features/recovery`.
|
|
5
|
+
*
|
|
6
|
+
* Purpose:
|
|
7
|
+
* A static, in-process catalog describing every agent-callable identity tool and the permission
|
|
8
|
+
* each one carries. `assistant/tool-registrations.ts` maps these entries onto handlers that call
|
|
9
|
+
* `grant-service.ts` / `admin-crud-service.ts` — the SAME functions the human admin routes under
|
|
10
|
+
* `server/routes/admin/users/` call. There is deliberately no path from a tool to the database
|
|
11
|
+
* that skips those functions, because they are where the domain's authorization gates live.
|
|
12
|
+
*
|
|
13
|
+
* WHAT THIS CATALOG DELIBERATELY OMITS, and why (identity is the escalation-dense
|
|
14
|
+
* surface, so the omissions are part of the design rather than a backlog):
|
|
15
|
+
*
|
|
16
|
+
* - `resetUserPassword` (REQ-17). The one identity transition that sets a credential on
|
|
17
|
+
* an account the caller does not own, and — unlike `ASSIGN_ROLE`/`ATTACH_POLICY` — it carries
|
|
18
|
+
* NO INV-07 grant-authority clamp. A `user.manage` holder may reset the OWNER's password and
|
|
19
|
+
* then authenticate as owner, so it is a full account-takeover primitive rather than a
|
|
20
|
+
* permission grant. An assistant is reachable by prompt injection through ordinary operator
|
|
21
|
+
* content (a form submission, a comment) in a way a human clicking the admin button is not.
|
|
22
|
+
* Left human-UI-only, mirroring `features/content-types/agent-tools.ts`'s reasoning for never
|
|
23
|
+
* exposing the destructive-cleanup confirm() step to an agent.
|
|
24
|
+
* - `writePolicyPermission` (INV-07). This is the one policy transition still
|
|
25
|
+
* deliberately excluded, and on different grounds than the five wired below: unlike
|
|
26
|
+
* `identity_role_assign`/`identity_policy_attach`, which each confer whatever a role/policy
|
|
27
|
+
* ALREADY carries onto exactly one named target principal, `writePolicyPermission` MUTATES a
|
|
28
|
+
* shared, reusable `PolicyRecord` in place — and any non-built-in, non-frozen policy can
|
|
29
|
+
* already be attached to an arbitrary number of OTHER users via `identity_policy_attach` (or to
|
|
30
|
+
* roles via the seed-only `role_policies` table) before this call happens. The INV-07 clamp
|
|
31
|
+
* (`assertGrantClamp`) still bounds WHAT the caller can add — only a permission it itself holds
|
|
32
|
+
* unconstrained — but it says nothing about WHO ends up holding it: every principal already
|
|
33
|
+
* attached to that policy inherits the new permission the instant it is written, invisibly to
|
|
34
|
+
* whoever asked for the one change. That is a materially different blast-radius shape than the
|
|
35
|
+
* single-target primitives this catalog does wire (see the tool descriptions below), and exactly
|
|
36
|
+
* the "grant that ripples to principals never named in the call" class this pass's directive
|
|
37
|
+
* asks to be excluded and explained rather than wired reflexively. Left human-UI-only, where
|
|
38
|
+
* `apps/admin/src/sections/Roles.tsx`'s "Add permission" control still lives.
|
|
39
|
+
*
|
|
40
|
+
* Every OTHER policy transition (`identity_policy_list`, `identity_policy_create`,
|
|
41
|
+
* `identity_policy_update`, `identity_policy_delete`, `identity_policy_attach`) IS wired below,
|
|
42
|
+
* mirroring the risk profile this catalog already accepted for the equivalent role transitions
|
|
43
|
+
* (`identity_role_list`/`identity_role_create`/`identity_role_rename`/`identity_role_delete`/
|
|
44
|
+
* `identity_role_assign`) — see each entry's own description for why its shape matches its role
|
|
45
|
+
* counterpart exactly.
|
|
46
|
+
*
|
|
47
|
+
* - Role REVOCATION. Not a choice: no such operation exists anywhere in this codebase.
|
|
48
|
+
* `PrincipalRoleRepoPort` (`ports.ts`) declares `listByPrincipalId`, `save`, and `listByRoleId`
|
|
49
|
+
* — there is no `delete`, and no service function unassigns a role. A tool cannot be written
|
|
50
|
+
* against an operation the domain does not have, and adding a repo-level delete here to
|
|
51
|
+
* manufacture one would be exactly the "skip the service layer" failure this work exists to
|
|
52
|
+
* close. The same is true of "detach a policy from a principal" — `PrincipalPolicyRepoPort`
|
|
53
|
+
* has no delete either, so `identity_policy_attach` is one-directional exactly like
|
|
54
|
+
* `identity_role_assign`.
|
|
55
|
+
*
|
|
56
|
+
* Architectural role:
|
|
57
|
+
* `identity` library declaration only. Performs no I/O and no enforcement — `authorize()` and each
|
|
58
|
+
* service function's own caller-permission gate enforce at call time. The local
|
|
59
|
+
* `AgentToolSideEffect`/`AgentToolActorClassRule`/`AgentToolDefinition` declarations mirror the
|
|
60
|
+
* house convention: `features/database/agent-tools.ts` and `features/recovery/agent-tools.ts` each
|
|
61
|
+
* declare their own structurally identical copy rather than importing another module's, so a
|
|
62
|
+
* low-level library like `identity` never acquires a dependency on a feature module.
|
|
63
|
+
*/
|
|
64
|
+
/** A workspace-scoped principal id, as returned by `identity_user_list` or `identity_user_create`. */
|
|
65
|
+
const PRINCIPAL_ID_SCHEMA = {
|
|
66
|
+
type: "string",
|
|
67
|
+
minLength: 1,
|
|
68
|
+
description: "The user's principalId. Get it from identity_user_list, or from identity_user_create's result.",
|
|
69
|
+
};
|
|
70
|
+
/** A workspace-scoped role id, as returned by `identity_role_list` or `identity_role_create`. */
|
|
71
|
+
const ROLE_ID_SCHEMA = {
|
|
72
|
+
type: "string",
|
|
73
|
+
minLength: 1,
|
|
74
|
+
description: "The role's id. Get it from identity_role_list, or from identity_role_create's result.",
|
|
75
|
+
};
|
|
76
|
+
/** A workspace-scoped policy id, as returned by `identity_policy_list` or `identity_policy_create`. */
|
|
77
|
+
const POLICY_ID_SCHEMA = {
|
|
78
|
+
type: "string",
|
|
79
|
+
minLength: 1,
|
|
80
|
+
description: "The policy's id. Get it from identity_policy_list, or from identity_policy_create's result.",
|
|
81
|
+
};
|
|
82
|
+
/** A required, non-blank human-authored name. `minLength` is published because the service
|
|
83
|
+
* functions reject a blank/whitespace-only name — leaving it unstated would show the model a
|
|
84
|
+
* contract wider than the one enforced. */
|
|
85
|
+
const REQUIRED_NAME_SCHEMA = {
|
|
86
|
+
type: "string",
|
|
87
|
+
minLength: 1,
|
|
88
|
+
description: "Human-readable name. Must not be blank or whitespace-only.",
|
|
89
|
+
};
|
|
90
|
+
/** The input shape of the three read tools — they take no arguments at all. */
|
|
91
|
+
const NO_INPUT_SCHEMA = {
|
|
92
|
+
type: "object",
|
|
93
|
+
additionalProperties: false,
|
|
94
|
+
required: [],
|
|
95
|
+
properties: {},
|
|
96
|
+
};
|
|
97
|
+
/** `{principalId}` — shared by the two principal-status transitions, which take exactly that. */
|
|
98
|
+
const PRINCIPAL_ONLY_INPUT_SCHEMA = {
|
|
99
|
+
type: "object",
|
|
100
|
+
additionalProperties: false,
|
|
101
|
+
required: ["principalId"],
|
|
102
|
+
properties: { principalId: PRINCIPAL_ID_SCHEMA },
|
|
103
|
+
};
|
|
104
|
+
/**
|
|
105
|
+
* The identity domain's fixed agent-tool catalog.
|
|
106
|
+
*
|
|
107
|
+
* Ordered read-tools-first because that is the order a correct multi-step call chain uses: a model
|
|
108
|
+
* cannot assign a role without a `roleId`, and the only way to learn one for an EXISTING role
|
|
109
|
+
* (including the four seeded built-ins) is `identity_role_list`.
|
|
110
|
+
*/
|
|
111
|
+
export const identityAgentToolCatalog = [
|
|
112
|
+
{
|
|
113
|
+
name: "identity_user_list",
|
|
114
|
+
description: "Lists the workspace's human operator users with their principalId, username, status, and assigned role ids. Read-only. Call this to find a user's principalId before updating, disabling, enabling, or assigning a role to them.",
|
|
115
|
+
sideEffects: "none",
|
|
116
|
+
authorization: { permission: "user.manage", orPermission: "member.manage" },
|
|
117
|
+
inputSchema: NO_INPUT_SCHEMA,
|
|
118
|
+
},
|
|
119
|
+
{
|
|
120
|
+
name: "identity_role_list",
|
|
121
|
+
description: "Lists the workspace's roles (the four built-ins plus any custom ones) with their id, name, and isBuiltin flag. Read-only. Call this to find a roleId before assigning, renaming, or deleting a role.",
|
|
122
|
+
sideEffects: "none",
|
|
123
|
+
authorization: { permission: "role.manage" },
|
|
124
|
+
inputSchema: NO_INPUT_SCHEMA,
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
name: "identity_policy_list",
|
|
128
|
+
description: "Lists the workspace's policies (built-ins plus any custom ones) with their id, name, description, isBuiltin, and isFrozen flags. Read-only. Call this to find a policyId before renaming, deleting, or attaching a policy.",
|
|
129
|
+
sideEffects: "none",
|
|
130
|
+
authorization: { permission: "role.manage" },
|
|
131
|
+
inputSchema: NO_INPUT_SCHEMA,
|
|
132
|
+
},
|
|
133
|
+
{
|
|
134
|
+
name: "identity_user_create",
|
|
135
|
+
description: "Creates a new human operator user, minting a new principal and its credential row together. The new user starts with NO roles and therefore no permissions — grant access afterwards with identity_role_assign. Fails if the username is already taken.",
|
|
136
|
+
sideEffects: "mutates-durable-state",
|
|
137
|
+
authorization: { permission: "user.manage", orPermission: "member.manage" },
|
|
138
|
+
inputSchema: {
|
|
139
|
+
type: "object",
|
|
140
|
+
additionalProperties: false,
|
|
141
|
+
required: ["username", "password"],
|
|
142
|
+
properties: {
|
|
143
|
+
username: {
|
|
144
|
+
type: "string",
|
|
145
|
+
minLength: 1,
|
|
146
|
+
description: "Login name. Stored lowercased and Unicode-NFC-normalized, and unique per workspace on that normalized form.",
|
|
147
|
+
},
|
|
148
|
+
password: {
|
|
149
|
+
type: "string",
|
|
150
|
+
minLength: 1,
|
|
151
|
+
description: "Initial password. Hashed with argon2id before storage; never stored or returned in plaintext.",
|
|
152
|
+
},
|
|
153
|
+
email: { type: "string", description: "Optional contact email." },
|
|
154
|
+
},
|
|
155
|
+
},
|
|
156
|
+
},
|
|
157
|
+
{
|
|
158
|
+
name: "identity_user_update_email",
|
|
159
|
+
description: "Sets or clears an existing user's email address. Omitting 'email' (or passing an empty string) CLEARS the stored value rather than leaving it unchanged. Username and password are not editable through this tool.",
|
|
160
|
+
sideEffects: "mutates-durable-state",
|
|
161
|
+
authorization: { permission: "user.manage", orPermission: "member.manage" },
|
|
162
|
+
inputSchema: {
|
|
163
|
+
type: "object",
|
|
164
|
+
additionalProperties: false,
|
|
165
|
+
required: ["principalId"],
|
|
166
|
+
properties: {
|
|
167
|
+
principalId: PRINCIPAL_ID_SCHEMA,
|
|
168
|
+
email: { type: "string", description: "The new email. Omit it or pass an empty string to clear the stored value." },
|
|
169
|
+
},
|
|
170
|
+
},
|
|
171
|
+
},
|
|
172
|
+
{
|
|
173
|
+
name: "identity_user_disable",
|
|
174
|
+
description: "Disables a user, revoking their access. Principals are never hard-deleted because the audit trail references them, so this is how a user is removed. Refuses to disable the seeded owner, and refuses any disable that would leave the workspace with no active owner. Already-disabled is a no-op.",
|
|
175
|
+
sideEffects: "mutates-durable-state",
|
|
176
|
+
authorization: { permission: "user.manage" },
|
|
177
|
+
inputSchema: PRINCIPAL_ONLY_INPUT_SCHEMA,
|
|
178
|
+
},
|
|
179
|
+
{
|
|
180
|
+
name: "identity_user_enable",
|
|
181
|
+
description: "Re-enables a previously disabled human user. Already-active is a no-op. Only kind='user' principals can be enabled this way.",
|
|
182
|
+
sideEffects: "mutates-durable-state",
|
|
183
|
+
authorization: { permission: "user.manage" },
|
|
184
|
+
inputSchema: PRINCIPAL_ONLY_INPUT_SCHEMA,
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
name: "identity_role_create",
|
|
188
|
+
description: "Creates a new custom role. The role starts with no policies attached and therefore confers no permissions until one is attached, which is not an agent-callable operation.",
|
|
189
|
+
sideEffects: "mutates-durable-state",
|
|
190
|
+
authorization: { permission: "role.manage" },
|
|
191
|
+
inputSchema: {
|
|
192
|
+
type: "object",
|
|
193
|
+
additionalProperties: false,
|
|
194
|
+
required: ["name"],
|
|
195
|
+
properties: { name: REQUIRED_NAME_SCHEMA },
|
|
196
|
+
},
|
|
197
|
+
},
|
|
198
|
+
{
|
|
199
|
+
name: "identity_role_assign",
|
|
200
|
+
description: "Assigns an existing role to an existing user. This is the step that actually grants permissions. The caller can only confer permissions it already holds itself unconstrained, so assigning a role more powerful than the caller's own is refused.",
|
|
201
|
+
sideEffects: "mutates-durable-state",
|
|
202
|
+
authorization: { permission: "role.manage" },
|
|
203
|
+
inputSchema: {
|
|
204
|
+
type: "object",
|
|
205
|
+
additionalProperties: false,
|
|
206
|
+
required: ["principalId", "roleId"],
|
|
207
|
+
properties: { principalId: PRINCIPAL_ID_SCHEMA, roleId: ROLE_ID_SCHEMA },
|
|
208
|
+
},
|
|
209
|
+
},
|
|
210
|
+
{
|
|
211
|
+
name: "identity_role_rename",
|
|
212
|
+
description: "Renames a custom role. Built-in roles cannot be renamed — relabelling 'viewer' to read as trusted is a social-engineering variant of privilege escalation, so it is refused.",
|
|
213
|
+
sideEffects: "mutates-durable-state",
|
|
214
|
+
authorization: { permission: "role.manage" },
|
|
215
|
+
inputSchema: {
|
|
216
|
+
type: "object",
|
|
217
|
+
additionalProperties: false,
|
|
218
|
+
required: ["roleId", "name"],
|
|
219
|
+
properties: { roleId: ROLE_ID_SCHEMA, name: REQUIRED_NAME_SCHEMA },
|
|
220
|
+
},
|
|
221
|
+
},
|
|
222
|
+
{
|
|
223
|
+
name: "identity_role_delete",
|
|
224
|
+
description: "Deletes a custom role. Built-in roles cannot be deleted. A role still assigned to at least one user is refused — this system has no unassign operation, so a role in use cannot be removed at all.",
|
|
225
|
+
sideEffects: "mutates-durable-state",
|
|
226
|
+
authorization: { permission: "role.manage" },
|
|
227
|
+
inputSchema: {
|
|
228
|
+
type: "object",
|
|
229
|
+
additionalProperties: false,
|
|
230
|
+
required: ["roleId"],
|
|
231
|
+
properties: { roleId: ROLE_ID_SCHEMA },
|
|
232
|
+
},
|
|
233
|
+
},
|
|
234
|
+
{
|
|
235
|
+
name: "identity_policy_create",
|
|
236
|
+
description: "Creates a new custom policy. The policy starts with no permissions and therefore confers none until permissions are added, which is not an agent-callable operation — identity_policy_write_permission is deliberately not wired (see this file's own header comment). Attaching a freshly created, still-empty policy to anyone is a no-op.",
|
|
237
|
+
sideEffects: "mutates-durable-state",
|
|
238
|
+
authorization: { permission: "role.manage" },
|
|
239
|
+
inputSchema: {
|
|
240
|
+
type: "object",
|
|
241
|
+
additionalProperties: false,
|
|
242
|
+
required: ["name"],
|
|
243
|
+
properties: {
|
|
244
|
+
name: REQUIRED_NAME_SCHEMA,
|
|
245
|
+
description: { type: "string", description: "Optional human-readable description." },
|
|
246
|
+
},
|
|
247
|
+
},
|
|
248
|
+
},
|
|
249
|
+
{
|
|
250
|
+
name: "identity_policy_update",
|
|
251
|
+
description: "Renames and/or re-describes a custom policy. Built-in and frozen policies are refused. At least one of 'name'/'description' must be supplied.",
|
|
252
|
+
sideEffects: "mutates-durable-state",
|
|
253
|
+
authorization: { permission: "role.manage" },
|
|
254
|
+
inputSchema: {
|
|
255
|
+
type: "object",
|
|
256
|
+
additionalProperties: false,
|
|
257
|
+
required: ["policyId"],
|
|
258
|
+
properties: {
|
|
259
|
+
policyId: POLICY_ID_SCHEMA,
|
|
260
|
+
name: { type: "string", minLength: 1, description: "New name. Omit to leave unchanged." },
|
|
261
|
+
description: { type: "string", description: "New description. Omit to leave unchanged." },
|
|
262
|
+
},
|
|
263
|
+
},
|
|
264
|
+
},
|
|
265
|
+
{
|
|
266
|
+
name: "identity_policy_delete",
|
|
267
|
+
description: "Deletes a custom policy. Built-in and frozen policies cannot be deleted. A policy still referenced by at least one role or attached to at least one user is refused — deletion fails safe (it only ever removes access, never orphans a reference) exactly like identity_role_delete.",
|
|
268
|
+
sideEffects: "mutates-durable-state",
|
|
269
|
+
authorization: { permission: "role.manage" },
|
|
270
|
+
inputSchema: {
|
|
271
|
+
type: "object",
|
|
272
|
+
additionalProperties: false,
|
|
273
|
+
required: ["policyId"],
|
|
274
|
+
properties: { policyId: POLICY_ID_SCHEMA },
|
|
275
|
+
},
|
|
276
|
+
},
|
|
277
|
+
{
|
|
278
|
+
name: "identity_policy_attach",
|
|
279
|
+
description: "Attaches an existing policy directly to an existing user, granting every permission the policy carries. This is the direct-grant counterpart to identity_role_assign, targets exactly one named user per call, and carries the identical INV-07 clamp: the caller can only confer permissions it already holds itself unconstrained, so attaching a policy more powerful than the caller's own is refused. There is no detach operation.",
|
|
280
|
+
sideEffects: "mutates-durable-state",
|
|
281
|
+
authorization: { permission: "role.manage" },
|
|
282
|
+
inputSchema: {
|
|
283
|
+
type: "object",
|
|
284
|
+
additionalProperties: false,
|
|
285
|
+
required: ["principalId", "policyId"],
|
|
286
|
+
properties: { principalId: PRINCIPAL_ID_SCHEMA, policyId: POLICY_ID_SCHEMA },
|
|
287
|
+
},
|
|
288
|
+
},
|
|
289
|
+
];
|
|
290
|
+
//# sourceMappingURL=agent-tools.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-tools.js","sourceRoot":"","sources":["../../src/identity/agent-tools.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { ClockPort, IdGeneratorPort, ISODateTime, UUID } from "../core/ports.js";
|
|
2
|
+
import type { IdentityRepos, PasswordHasherPort } from "./ports.js";
|
|
3
|
+
import { type PrincipalRecord, type SessionRecord } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* @file Login / logout / session validation (REQ-06, state.spec `LOGIN`/`LOGOUT`).
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* The credential-verification + session-lifecycle surface `middleware/dev-auth.ts`
|
|
9
|
+
* wires into HTTP. Session tokens are hashed with SHA-256 before storage — the
|
|
10
|
+
* same technique `members/write-service.ts` uses for magic-link/member-session
|
|
11
|
+
* tokens (INV-05: the raw token is never persisted). Password verification is
|
|
12
|
+
* argon2id (`hasher.ts`), never a raw comparison.
|
|
13
|
+
*
|
|
14
|
+
* Architectural role:
|
|
15
|
+
* Ordinary core functions (like `updatePost`/`membersWriteService`), not a
|
|
16
|
+
* port — session/credential logic has one implementation.
|
|
17
|
+
*/
|
|
18
|
+
/** RT-004/behavior.spec §4: absolute session lifetime, fixed at creation. */
|
|
19
|
+
export declare const SESSION_TTL_MS: number;
|
|
20
|
+
export interface AuthServiceDeps {
|
|
21
|
+
repos: IdentityRepos;
|
|
22
|
+
hasher: PasswordHasherPort;
|
|
23
|
+
clock: ClockPort;
|
|
24
|
+
idGen: IdGeneratorPort;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* Verify `username`+`password` for an `active` principal and mint a session
|
|
28
|
+
* (AC-02, REQ-06). Constant-shaped failure: a nonexistent username, a
|
|
29
|
+
* disabled principal, and a wrong password are all `AuthInvalidCredentialsError`
|
|
30
|
+
* with the same message — no user-enumeration signal.
|
|
31
|
+
*
|
|
32
|
+
* @complexity O(1) — one username lookup, one principal lookup, one hash
|
|
33
|
+
* verify, one session write, one `lastLoginAt` write.
|
|
34
|
+
* @overallScore 100
|
|
35
|
+
*/
|
|
36
|
+
export declare function login(required: {
|
|
37
|
+
deps: AuthServiceDeps;
|
|
38
|
+
input: {
|
|
39
|
+
workspaceId: UUID;
|
|
40
|
+
username: string;
|
|
41
|
+
password: string;
|
|
42
|
+
ip?: string;
|
|
43
|
+
userAgent?: string;
|
|
44
|
+
};
|
|
45
|
+
}): Promise<{
|
|
46
|
+
principal: PrincipalRecord;
|
|
47
|
+
session: SessionRecord;
|
|
48
|
+
rawToken: string;
|
|
49
|
+
}>;
|
|
50
|
+
/**
|
|
51
|
+
* Resolve a session cookie's raw token to its principal, applying every
|
|
52
|
+
* fail-closed check server-side (EC-02/EC-03/EC-13, AC-05/AC-20): unknown
|
|
53
|
+
* token, revoked, past absolute `expiresAt`, or a disabled bound principal
|
|
54
|
+
* all resolve to `null` (the caller maps that to 401 `UNAUTHENTICATED` and
|
|
55
|
+
* never reaches `authorize()`).
|
|
56
|
+
*
|
|
57
|
+
* @complexity O(1) — one token-hash lookup, one principal lookup.
|
|
58
|
+
* @overallScore 100
|
|
59
|
+
*/
|
|
60
|
+
export declare function validateSession(required: {
|
|
61
|
+
deps: AuthServiceDeps;
|
|
62
|
+
input: {
|
|
63
|
+
workspaceId: UUID;
|
|
64
|
+
rawToken: string;
|
|
65
|
+
nowIso?: ISODateTime;
|
|
66
|
+
};
|
|
67
|
+
}): Promise<{
|
|
68
|
+
principal: PrincipalRecord;
|
|
69
|
+
session: SessionRecord;
|
|
70
|
+
} | null>;
|
|
71
|
+
/** Revoke the session bound to `rawToken`. Idempotent — already-revoked/unknown is a no-op. */
|
|
72
|
+
export declare function logout(required: {
|
|
73
|
+
deps: AuthServiceDeps;
|
|
74
|
+
input: {
|
|
75
|
+
workspaceId: UUID;
|
|
76
|
+
rawToken: string;
|
|
77
|
+
};
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
/** The introspection surface for `AUTH_ME` (REQ-07): dotted permission strings, `["*"]` for owner. */
|
|
80
|
+
export declare function getEffectivePermissions(required: {
|
|
81
|
+
deps: IdentityRepos;
|
|
82
|
+
input: {
|
|
83
|
+
workspaceId: UUID;
|
|
84
|
+
principalId: UUID;
|
|
85
|
+
};
|
|
86
|
+
}): Promise<string[]>;
|
|
87
|
+
//# sourceMappingURL=auth-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-service.d.ts","sourceRoot":"","sources":["../../src/identity/auth-service.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAEtF,OAAO,KAAK,EAAE,aAAa,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AACpE,OAAO,EAA+B,KAAK,eAAe,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAC;AAGnG;;;;;;;;;;;;;GAaG;AAEH,6EAA6E;AAC7E,eAAO,MAAM,cAAc,QAA2B,CAAC;AAEvD,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,aAAa,CAAC;IACrB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,eAAe,CAAC;CACxB;AAeD;;;;;;;;;GASG;AACH,wBAAsB,KAAK,CAAC,QAAQ,EAAE;IACpC,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,EAAE,CAAC,EAAE,MAAM,CAAC;QAAC,SAAS,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACnG,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CA0CpF;AAED;;;;;;;;;GASG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE;IAC9C,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,WAAW,CAAA;KAAE,CAAC;CACtE,GAAG,OAAO,CAAC;IAAE,SAAS,EAAE,eAAe,CAAC;IAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GAAG,IAAI,CAAC,CAqBzE;AAED,+FAA+F;AAC/F,wBAAsB,MAAM,CAAC,QAAQ,EAAE;IACrC,IAAI,EAAE,eAAe,CAAC;IACtB,KAAK,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;CAChD,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB;AAED,sGAAsG;AACtG,wBAAsB,uBAAuB,CAAC,QAAQ,EAAE;IACtD,IAAI,EAAE,aAAa,CAAC;IACpB,KAAK,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,WAAW,EAAE,IAAI,CAAA;KAAE,CAAC;CACjD,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAapB"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { createHash, randomBytes } from "node:crypto";
|
|
2
|
+
import { resolveEffectivePermissions } from "./authorize.js";
|
|
3
|
+
import { AuthInvalidCredentialsError } from "./types.js";
|
|
4
|
+
import { normalizeUsername } from "./username.js";
|
|
5
|
+
/**
|
|
6
|
+
* @file Login / logout / session validation (REQ-06, state.spec `LOGIN`/`LOGOUT`).
|
|
7
|
+
*
|
|
8
|
+
* Purpose:
|
|
9
|
+
* The credential-verification + session-lifecycle surface `middleware/dev-auth.ts`
|
|
10
|
+
* wires into HTTP. Session tokens are hashed with SHA-256 before storage — the
|
|
11
|
+
* same technique `members/write-service.ts` uses for magic-link/member-session
|
|
12
|
+
* tokens (INV-05: the raw token is never persisted). Password verification is
|
|
13
|
+
* argon2id (`hasher.ts`), never a raw comparison.
|
|
14
|
+
*
|
|
15
|
+
* Architectural role:
|
|
16
|
+
* Ordinary core functions (like `updatePost`/`membersWriteService`), not a
|
|
17
|
+
* port — session/credential logic has one implementation.
|
|
18
|
+
*/
|
|
19
|
+
/** RT-004/behavior.spec §4: absolute session lifetime, fixed at creation. */
|
|
20
|
+
export const SESSION_TTL_MS = 30 * 24 * 60 * 60 * 1000;
|
|
21
|
+
/** SHA-256 hex digest of a raw bearer token (mirrors `members/write-service.ts`'s `hashToken`). */
|
|
22
|
+
function hashToken(rawToken) {
|
|
23
|
+
return createHash("sha256").update(rawToken).digest("hex");
|
|
24
|
+
}
|
|
25
|
+
function newRawToken() {
|
|
26
|
+
return randomBytes(32).toString("hex");
|
|
27
|
+
}
|
|
28
|
+
function isoPlusMs(nowIso, ms) {
|
|
29
|
+
return new Date(new Date(nowIso).getTime() + ms).toISOString();
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Verify `username`+`password` for an `active` principal and mint a session
|
|
33
|
+
* (AC-02, REQ-06). Constant-shaped failure: a nonexistent username, a
|
|
34
|
+
* disabled principal, and a wrong password are all `AuthInvalidCredentialsError`
|
|
35
|
+
* with the same message — no user-enumeration signal.
|
|
36
|
+
*
|
|
37
|
+
* @complexity O(1) — one username lookup, one principal lookup, one hash
|
|
38
|
+
* verify, one session write, one `lastLoginAt` write.
|
|
39
|
+
* @overallScore 100
|
|
40
|
+
*/
|
|
41
|
+
export async function login(required) {
|
|
42
|
+
const { deps, input } = required;
|
|
43
|
+
const username = normalizeUsername(input.username);
|
|
44
|
+
if (!username || !input.password) {
|
|
45
|
+
throw new AuthInvalidCredentialsError("invalid username or password");
|
|
46
|
+
}
|
|
47
|
+
const userRow = await deps.repos.users.findByUsername({ workspaceId: input.workspaceId, username });
|
|
48
|
+
if (!userRow) {
|
|
49
|
+
throw new AuthInvalidCredentialsError("invalid username or password");
|
|
50
|
+
}
|
|
51
|
+
const principal = await deps.repos.principals.findById({
|
|
52
|
+
workspaceId: input.workspaceId,
|
|
53
|
+
id: userRow.principalId,
|
|
54
|
+
});
|
|
55
|
+
if (!principal || principal.status !== "active") {
|
|
56
|
+
throw new AuthInvalidCredentialsError("invalid username or password");
|
|
57
|
+
}
|
|
58
|
+
const passwordOk = await deps.hasher.verify(userRow.passwordHash, input.password);
|
|
59
|
+
if (!passwordOk) {
|
|
60
|
+
throw new AuthInvalidCredentialsError("invalid username or password");
|
|
61
|
+
}
|
|
62
|
+
const nowIso = deps.clock.nowIso();
|
|
63
|
+
const rawToken = newRawToken();
|
|
64
|
+
const session = {
|
|
65
|
+
id: deps.idGen.newId(),
|
|
66
|
+
workspaceId: input.workspaceId,
|
|
67
|
+
principalId: principal.id,
|
|
68
|
+
tokenHash: hashToken(rawToken),
|
|
69
|
+
createdAt: nowIso,
|
|
70
|
+
expiresAt: isoPlusMs(nowIso, SESSION_TTL_MS),
|
|
71
|
+
ip: input.ip,
|
|
72
|
+
userAgent: input.userAgent,
|
|
73
|
+
};
|
|
74
|
+
await deps.repos.sessions.save(session);
|
|
75
|
+
await deps.repos.users.save({ ...userRow, lastLoginAt: nowIso });
|
|
76
|
+
return { principal, session, rawToken };
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Resolve a session cookie's raw token to its principal, applying every
|
|
80
|
+
* fail-closed check server-side (EC-02/EC-03/EC-13, AC-05/AC-20): unknown
|
|
81
|
+
* token, revoked, past absolute `expiresAt`, or a disabled bound principal
|
|
82
|
+
* all resolve to `null` (the caller maps that to 401 `UNAUTHENTICATED` and
|
|
83
|
+
* never reaches `authorize()`).
|
|
84
|
+
*
|
|
85
|
+
* @complexity O(1) — one token-hash lookup, one principal lookup.
|
|
86
|
+
* @overallScore 100
|
|
87
|
+
*/
|
|
88
|
+
export async function validateSession(required) {
|
|
89
|
+
const { deps, input } = required;
|
|
90
|
+
const nowIso = input.nowIso ?? deps.clock.nowIso();
|
|
91
|
+
const session = await deps.repos.sessions.findByTokenHash({
|
|
92
|
+
workspaceId: input.workspaceId,
|
|
93
|
+
tokenHash: hashToken(input.rawToken),
|
|
94
|
+
});
|
|
95
|
+
if (!session)
|
|
96
|
+
return null;
|
|
97
|
+
if (session.revokedAt)
|
|
98
|
+
return null;
|
|
99
|
+
// EC-13/AC-20: past absolute expiry is treated as revoked, never reaching authorize().
|
|
100
|
+
if (session.expiresAt <= nowIso)
|
|
101
|
+
return null;
|
|
102
|
+
const principal = await deps.repos.principals.findById({
|
|
103
|
+
workspaceId: input.workspaceId,
|
|
104
|
+
id: session.principalId,
|
|
105
|
+
});
|
|
106
|
+
// EC-02: a disabled principal's live session stops validating immediately.
|
|
107
|
+
if (!principal || principal.status !== "active")
|
|
108
|
+
return null;
|
|
109
|
+
return { principal, session };
|
|
110
|
+
}
|
|
111
|
+
/** Revoke the session bound to `rawToken`. Idempotent — already-revoked/unknown is a no-op. */
|
|
112
|
+
export async function logout(required) {
|
|
113
|
+
const { deps, input } = required;
|
|
114
|
+
const session = await deps.repos.sessions.findByTokenHash({
|
|
115
|
+
workspaceId: input.workspaceId,
|
|
116
|
+
tokenHash: hashToken(input.rawToken),
|
|
117
|
+
});
|
|
118
|
+
if (!session || session.revokedAt)
|
|
119
|
+
return;
|
|
120
|
+
await deps.repos.sessions.revoke({
|
|
121
|
+
workspaceId: input.workspaceId,
|
|
122
|
+
id: session.id,
|
|
123
|
+
revokedAt: deps.clock.nowIso(),
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
/** The introspection surface for `AUTH_ME` (REQ-07): dotted permission strings, `["*"]` for owner. */
|
|
127
|
+
export async function getEffectivePermissions(required) {
|
|
128
|
+
const rows = await resolveEffectivePermissions({
|
|
129
|
+
deps: {
|
|
130
|
+
principals: required.deps.principals,
|
|
131
|
+
principalRoles: required.deps.principalRoles,
|
|
132
|
+
rolePolicies: required.deps.rolePolicies,
|
|
133
|
+
principalPolicies: required.deps.principalPolicies,
|
|
134
|
+
policyPermissions: required.deps.policyPermissions,
|
|
135
|
+
},
|
|
136
|
+
principalId: required.input.principalId,
|
|
137
|
+
workspaceId: required.input.workspaceId,
|
|
138
|
+
});
|
|
139
|
+
return [...new Set(rows.map((row) => row.permission))];
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=auth-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auth-service.js","sourceRoot":"","sources":["../../src/identity/auth-service.ts"],"names":[],"mappings":"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"}
|