@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,53 @@
|
|
|
1
|
+
import type { ClockPort, UUID } from "../core/ports.js";
|
|
2
|
+
import type { SettingsRepoPort } from "./ports.js";
|
|
3
|
+
import type { AuthorizeFn } from "./write-service.js";
|
|
4
|
+
/**
|
|
5
|
+
* @file `purgeTenantSettings` — the ledgered tenant/principal purge chokepoint.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* A host's value-table FKs (`setting_values_workspace`/`_user` -> `workspaces`)
|
|
9
|
+
* are typically `ON DELETE RESTRICT`, not `CASCADE` — a raw workspace delete
|
|
10
|
+
* cannot silently drop value rows without a ledgered revision. This module is
|
|
11
|
+
* the explicit, ledgered alternative that requires: `authorize()` once
|
|
12
|
+
* -> enumerate every affected row -> append a redacted `op='purge'` revision
|
|
13
|
+
* per row -> delete the row, all in ONE transaction. The `setting_revisions`
|
|
14
|
+
* ledger itself is NEVER touched by a purge — only value rows are removed,
|
|
15
|
+
* with their purge revision left behind. Repo write methods stay
|
|
16
|
+
* package-private to this file and `write-service.ts`.
|
|
17
|
+
*
|
|
18
|
+
* Deviation from the outline's `SettingsWriteServiceDeps`: purge needs
|
|
19
|
+
* neither `ids` (no new definition/value rows are created) nor `principals`
|
|
20
|
+
* (REQ-13's target-principal check is a write-time guard; purge only removes
|
|
21
|
+
* pre-existing rows, it never writes a new user-scope row for an unverified
|
|
22
|
+
* principal) — so it declares its own smaller `PurgeServiceDeps`.
|
|
23
|
+
*/
|
|
24
|
+
export interface PurgeServiceDeps {
|
|
25
|
+
repo: SettingsRepoPort;
|
|
26
|
+
clock: ClockPort;
|
|
27
|
+
authorize: AuthorizeFn;
|
|
28
|
+
}
|
|
29
|
+
export interface PurgeTenantSettingsRequired {
|
|
30
|
+
deps: PurgeServiceDeps;
|
|
31
|
+
input: {
|
|
32
|
+
workspaceId: UUID;
|
|
33
|
+
/**
|
|
34
|
+
* Omitted -> full tenant teardown: every `setting_values_workspace` row
|
|
35
|
+
* for the workspace AND every `setting_values_user` row for every
|
|
36
|
+
* principal in the workspace.
|
|
37
|
+
* Present -> scope the purge to one principal's `setting_values_user`
|
|
38
|
+
* rows only (GDPR single-subject erasure) — workspace-scope values and
|
|
39
|
+
* every other principal's rows are left untouched.
|
|
40
|
+
*/
|
|
41
|
+
principalId?: UUID;
|
|
42
|
+
callerPrincipalId: UUID;
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* The purge chokepoint: authorize `settings.definitions.manage` once ->
|
|
47
|
+
* enumerate the affected rows -> append a redacted `op='purge'` revision +
|
|
48
|
+
* delete, per row, all in one transaction.
|
|
49
|
+
*/
|
|
50
|
+
export declare function purgeTenantSettings(required: PurgeTenantSettingsRequired): Promise<{
|
|
51
|
+
purgedCount: number;
|
|
52
|
+
}>;
|
|
53
|
+
//# sourceMappingURL=purge-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purge-service.d.ts","sourceRoot":"","sources":["../../src/settings/purge-service.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAExD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,WAAW,CAAC;CACxB;AAED,MAAM,WAAW,2BAA2B;IAC1C,IAAI,EAAE,gBAAgB,CAAC;IACvB,KAAK,EAAE;QACL,WAAW,EAAE,IAAI,CAAC;QAClB;;;;;;;WAOG;QACH,WAAW,CAAC,EAAE,IAAI,CAAC;QACnB,iBAAiB,EAAE,IAAI,CAAC;KACzB,CAAC;CACH;AAED;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,QAAQ,EAAE,2BAA2B,GACpC,OAAO,CAAC;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,CAAC,CAwGlC"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { ForbiddenError } from "./errors.js";
|
|
2
|
+
import { invalidateWorkspaceSettingsCache } from "./settings.js";
|
|
3
|
+
/**
|
|
4
|
+
* The purge chokepoint: authorize `settings.definitions.manage` once ->
|
|
5
|
+
* enumerate the affected rows -> append a redacted `op='purge'` revision +
|
|
6
|
+
* delete, per row, all in one transaction.
|
|
7
|
+
*/
|
|
8
|
+
export async function purgeTenantSettings(required) {
|
|
9
|
+
const { deps, input } = required;
|
|
10
|
+
const authResult = await deps.authorize({
|
|
11
|
+
principalId: input.callerPrincipalId,
|
|
12
|
+
permission: "settings.definitions.manage",
|
|
13
|
+
workspaceId: input.workspaceId,
|
|
14
|
+
entityType: "setting-workspace",
|
|
15
|
+
entityId: input.workspaceId,
|
|
16
|
+
});
|
|
17
|
+
if (!authResult.allowed) {
|
|
18
|
+
throw new ForbiddenError(`principal '${input.callerPrincipalId}' is not authorized for 'settings.definitions.manage' (${authResult.reason})`);
|
|
19
|
+
}
|
|
20
|
+
const result = await deps.repo.transaction(async () => {
|
|
21
|
+
const now = deps.clock.nowIso();
|
|
22
|
+
let purgedCount = 0;
|
|
23
|
+
if (input.principalId) {
|
|
24
|
+
const userValues = await deps.repo.listUserValues({
|
|
25
|
+
workspaceId: input.workspaceId,
|
|
26
|
+
principalId: input.principalId,
|
|
27
|
+
});
|
|
28
|
+
for (const value of userValues) {
|
|
29
|
+
await deps.repo.appendRevision({
|
|
30
|
+
entityKind: "value",
|
|
31
|
+
settingId: value.settingId,
|
|
32
|
+
scope: "user",
|
|
33
|
+
workspaceId: input.workspaceId,
|
|
34
|
+
principalId: input.principalId,
|
|
35
|
+
op: "purge",
|
|
36
|
+
beforeJson: null,
|
|
37
|
+
afterJson: null,
|
|
38
|
+
defVersion: value.defVersion,
|
|
39
|
+
actor: input.callerPrincipalId,
|
|
40
|
+
originPluginId: null,
|
|
41
|
+
changeSetId: null,
|
|
42
|
+
createdAt: now,
|
|
43
|
+
});
|
|
44
|
+
await deps.repo.deleteUserValue({
|
|
45
|
+
workspaceId: input.workspaceId,
|
|
46
|
+
principalId: input.principalId,
|
|
47
|
+
settingId: value.settingId,
|
|
48
|
+
});
|
|
49
|
+
purgedCount++;
|
|
50
|
+
}
|
|
51
|
+
return { purgedCount };
|
|
52
|
+
}
|
|
53
|
+
const workspaceValues = await deps.repo.listWorkspaceValues({ workspaceId: input.workspaceId });
|
|
54
|
+
for (const value of workspaceValues) {
|
|
55
|
+
await deps.repo.appendRevision({
|
|
56
|
+
entityKind: "value",
|
|
57
|
+
settingId: value.settingId,
|
|
58
|
+
scope: "workspace",
|
|
59
|
+
workspaceId: input.workspaceId,
|
|
60
|
+
principalId: null,
|
|
61
|
+
op: "purge",
|
|
62
|
+
beforeJson: null,
|
|
63
|
+
afterJson: null,
|
|
64
|
+
defVersion: value.defVersion,
|
|
65
|
+
actor: input.callerPrincipalId,
|
|
66
|
+
originPluginId: null,
|
|
67
|
+
changeSetId: null,
|
|
68
|
+
createdAt: now,
|
|
69
|
+
});
|
|
70
|
+
await deps.repo.deleteWorkspaceValue({ workspaceId: input.workspaceId, settingId: value.settingId });
|
|
71
|
+
purgedCount++;
|
|
72
|
+
}
|
|
73
|
+
const userValues = await deps.repo.listUserValuesByWorkspace({ workspaceId: input.workspaceId });
|
|
74
|
+
for (const value of userValues) {
|
|
75
|
+
const targetPrincipalId = value.principalId;
|
|
76
|
+
if (!targetPrincipalId)
|
|
77
|
+
continue; // defensive: every setting_values_user row carries a principal_id
|
|
78
|
+
await deps.repo.appendRevision({
|
|
79
|
+
entityKind: "value",
|
|
80
|
+
settingId: value.settingId,
|
|
81
|
+
scope: "user",
|
|
82
|
+
workspaceId: input.workspaceId,
|
|
83
|
+
principalId: targetPrincipalId,
|
|
84
|
+
op: "purge",
|
|
85
|
+
beforeJson: null,
|
|
86
|
+
afterJson: null,
|
|
87
|
+
defVersion: value.defVersion,
|
|
88
|
+
actor: input.callerPrincipalId,
|
|
89
|
+
originPluginId: null,
|
|
90
|
+
changeSetId: null,
|
|
91
|
+
createdAt: now,
|
|
92
|
+
});
|
|
93
|
+
await deps.repo.deleteUserValue({
|
|
94
|
+
workspaceId: input.workspaceId,
|
|
95
|
+
principalId: targetPrincipalId,
|
|
96
|
+
settingId: value.settingId,
|
|
97
|
+
});
|
|
98
|
+
purgedCount++;
|
|
99
|
+
}
|
|
100
|
+
return { purgedCount };
|
|
101
|
+
});
|
|
102
|
+
invalidateWorkspaceSettingsCache(deps.repo, input.workspaceId, input.principalId);
|
|
103
|
+
return result;
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=purge-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"purge-service.js","sourceRoot":"","sources":["../../src/settings/purge-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import type { SettingsRepoPort } from "./ports.js";
|
|
2
|
+
import type { SettingDefinitionRecord, SettingRevisionRecord, SettingValueRecord } from "./types.js";
|
|
3
|
+
/**
|
|
4
|
+
* @file In-memory adapter for `SettingsRepoPort` (the rule-of-two: in-memory + production adapters).
|
|
5
|
+
*
|
|
6
|
+
* Purpose:
|
|
7
|
+
* Test/dev implementation. Mirrors the exact style of `identity/repo.memory.ts`:
|
|
8
|
+
* constructor takes seed rows, methods filter/mutate internal arrays.
|
|
9
|
+
*
|
|
10
|
+
* `transaction` is a real snapshot/restore journal, not a no-op wrapper. It
|
|
11
|
+
* used to be `async (fn) => fn()` on the reasoning that each individual
|
|
12
|
+
* mutation is already synchronous and atomic in-process — true, but the
|
|
13
|
+
* guarantee `SettingsRepoPort.transaction` actually sells is that a COMPOSITE
|
|
14
|
+
* of several mutations is all-or-nothing. `resetNamespace` clears a whole
|
|
15
|
+
* namespace inside one transaction; under a no-op wrapper a failure partway
|
|
16
|
+
* through left the namespace half reset while the caller saw an error. This
|
|
17
|
+
* adapter is a common wired default for dev/test composition, so that was
|
|
18
|
+
* live in dev, and the contract suite could not see it because the rollback
|
|
19
|
+
* assertion only ran against the SQLite adapter.
|
|
20
|
+
*/
|
|
21
|
+
export declare class InMemorySettingsRepo implements SettingsRepoPort {
|
|
22
|
+
private definitions;
|
|
23
|
+
private globalValues;
|
|
24
|
+
private workspaceValues;
|
|
25
|
+
private userValues;
|
|
26
|
+
private revisions;
|
|
27
|
+
private nextSeq;
|
|
28
|
+
/** True while `transaction` is open — see its doc for why this refuses
|
|
29
|
+
* rather than nests. */
|
|
30
|
+
private inTransaction;
|
|
31
|
+
constructor(seed?: {
|
|
32
|
+
definitions?: SettingDefinitionRecord[];
|
|
33
|
+
globalValues?: SettingValueRecord[];
|
|
34
|
+
workspaceValues?: SettingValueRecord[];
|
|
35
|
+
userValues?: SettingValueRecord[];
|
|
36
|
+
revisions?: SettingRevisionRecord[];
|
|
37
|
+
});
|
|
38
|
+
findActiveDefinition(required: {
|
|
39
|
+
namespace: string;
|
|
40
|
+
key: string;
|
|
41
|
+
workspaceId: string | null;
|
|
42
|
+
}): Promise<SettingDefinitionRecord | null>;
|
|
43
|
+
findDefinitionBySettingId(required: {
|
|
44
|
+
settingId: string;
|
|
45
|
+
version?: number;
|
|
46
|
+
}): Promise<SettingDefinitionRecord | null>;
|
|
47
|
+
listActiveDefinitions(required: {
|
|
48
|
+
workspaceId: string | null;
|
|
49
|
+
}): Promise<SettingDefinitionRecord[]>;
|
|
50
|
+
saveDefinition(record: SettingDefinitionRecord): Promise<void>;
|
|
51
|
+
getGlobalValue(settingId: string): Promise<SettingValueRecord | null>;
|
|
52
|
+
getWorkspaceValue(required: {
|
|
53
|
+
workspaceId: string;
|
|
54
|
+
settingId: string;
|
|
55
|
+
}): Promise<SettingValueRecord | null>;
|
|
56
|
+
getUserValue(required: {
|
|
57
|
+
workspaceId: string;
|
|
58
|
+
principalId: string;
|
|
59
|
+
settingId: string;
|
|
60
|
+
}): Promise<SettingValueRecord | null>;
|
|
61
|
+
saveGlobalValue(record: SettingValueRecord): Promise<void>;
|
|
62
|
+
saveWorkspaceValue(record: SettingValueRecord): Promise<void>;
|
|
63
|
+
saveUserValue(record: SettingValueRecord): Promise<void>;
|
|
64
|
+
listWorkspaceValues(required: {
|
|
65
|
+
workspaceId: string;
|
|
66
|
+
}): Promise<SettingValueRecord[]>;
|
|
67
|
+
listUserValues(required: {
|
|
68
|
+
workspaceId: string;
|
|
69
|
+
principalId: string;
|
|
70
|
+
}): Promise<SettingValueRecord[]>;
|
|
71
|
+
listUserValuesByWorkspace(required: {
|
|
72
|
+
workspaceId: string;
|
|
73
|
+
}): Promise<SettingValueRecord[]>;
|
|
74
|
+
deleteWorkspaceValue(required: {
|
|
75
|
+
workspaceId: string;
|
|
76
|
+
settingId: string;
|
|
77
|
+
}): Promise<void>;
|
|
78
|
+
deleteUserValue(required: {
|
|
79
|
+
workspaceId: string;
|
|
80
|
+
principalId: string;
|
|
81
|
+
settingId: string;
|
|
82
|
+
}): Promise<void>;
|
|
83
|
+
appendRevision(record: Omit<SettingRevisionRecord, "seq">): Promise<number>;
|
|
84
|
+
listRevisions(required: {
|
|
85
|
+
settingId: string;
|
|
86
|
+
}): Promise<SettingRevisionRecord[]>;
|
|
87
|
+
listRevisionsSince(required: {
|
|
88
|
+
sinceSeq: number;
|
|
89
|
+
limit: number;
|
|
90
|
+
workspaceId: string;
|
|
91
|
+
}): Promise<SettingRevisionRecord[]>;
|
|
92
|
+
maxRevisionSeq(): Promise<number>;
|
|
93
|
+
/**
|
|
94
|
+
* Runs `fn` atomically: every mutation it makes is discarded if it throws.
|
|
95
|
+
*
|
|
96
|
+
* A shallow copy of each array is enough because no method here mutates a
|
|
97
|
+
* record in place — `save*` REPLACES the element at its index, `delete*`
|
|
98
|
+
* reassigns a filtered array, `appendRevision` pushes. Restoring the arrays
|
|
99
|
+
* therefore restores the rows too. If a future method starts editing a
|
|
100
|
+
* record object in place, this must deep-copy instead.
|
|
101
|
+
*
|
|
102
|
+
* `nextSeq` is rolled back with the rest, matching SQLite: `sqlite_sequence`
|
|
103
|
+
* is an ordinary table, so an AUTOINCREMENT counter bumped inside a
|
|
104
|
+
* transaction is undone by its ROLLBACK. A seq handed out by a failed
|
|
105
|
+
* transaction is safe to reuse precisely because that revision no longer
|
|
106
|
+
* exists.
|
|
107
|
+
*
|
|
108
|
+
* **Deliberately NOT reentrant**, matching a SQLite adapter's `transaction`,
|
|
109
|
+
* where `BEGIN IMMEDIATE` inside an open transaction is an error. Refusing
|
|
110
|
+
* loudly is the point: an instance-level flag cannot tell "nested inside my
|
|
111
|
+
* caller's transaction" from "an unrelated transaction that started while
|
|
112
|
+
* mine was awaiting". Silently joining a stranger's transaction — and
|
|
113
|
+
* inheriting its rollback — is a worse defect than refusing. A caller that
|
|
114
|
+
* needs several writes to commit together opens ONE transaction and passes
|
|
115
|
+
* `skipTransaction` to the inner writes, as `resetNamespace` does.
|
|
116
|
+
*/
|
|
117
|
+
transaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=repo.memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.memory.d.ts","sourceRoot":"","sources":["../../src/settings/repo.memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file In-memory adapter for `SettingsRepoPort` (the rule-of-two: in-memory + production adapters).
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* Test/dev implementation. Mirrors the exact style of `identity/repo.memory.ts`:
|
|
6
|
+
* constructor takes seed rows, methods filter/mutate internal arrays.
|
|
7
|
+
*
|
|
8
|
+
* `transaction` is a real snapshot/restore journal, not a no-op wrapper. It
|
|
9
|
+
* used to be `async (fn) => fn()` on the reasoning that each individual
|
|
10
|
+
* mutation is already synchronous and atomic in-process — true, but the
|
|
11
|
+
* guarantee `SettingsRepoPort.transaction` actually sells is that a COMPOSITE
|
|
12
|
+
* of several mutations is all-or-nothing. `resetNamespace` clears a whole
|
|
13
|
+
* namespace inside one transaction; under a no-op wrapper a failure partway
|
|
14
|
+
* through left the namespace half reset while the caller saw an error. This
|
|
15
|
+
* adapter is a common wired default for dev/test composition, so that was
|
|
16
|
+
* live in dev, and the contract suite could not see it because the rollback
|
|
17
|
+
* assertion only ran against the SQLite adapter.
|
|
18
|
+
*/
|
|
19
|
+
export class InMemorySettingsRepo {
|
|
20
|
+
definitions;
|
|
21
|
+
globalValues;
|
|
22
|
+
workspaceValues;
|
|
23
|
+
userValues;
|
|
24
|
+
revisions;
|
|
25
|
+
nextSeq;
|
|
26
|
+
/** True while `transaction` is open — see its doc for why this refuses
|
|
27
|
+
* rather than nests. */
|
|
28
|
+
inTransaction = false;
|
|
29
|
+
constructor(seed = {}) {
|
|
30
|
+
this.definitions = [...(seed.definitions ?? [])];
|
|
31
|
+
this.globalValues = [...(seed.globalValues ?? [])];
|
|
32
|
+
this.workspaceValues = [...(seed.workspaceValues ?? [])];
|
|
33
|
+
this.userValues = [...(seed.userValues ?? [])];
|
|
34
|
+
this.revisions = [...(seed.revisions ?? [])];
|
|
35
|
+
this.nextSeq = (seed.revisions?.reduce((max, r) => Math.max(max, r.seq), 0) ?? 0) + 1;
|
|
36
|
+
}
|
|
37
|
+
async findActiveDefinition(required) {
|
|
38
|
+
// Matches active/alias/tombstone (the "current" row for this (ns,key,ws)
|
|
39
|
+
// slot — callers decide how to react to each status, e.g. settings.ts
|
|
40
|
+
// treats tombstone as read-absent but write-service.ts reports it
|
|
41
|
+
// distinctly as DEFINITION_TOMBSTONED). Deliberately excludes
|
|
42
|
+
// `deprecated`: those are stale prior-version rows superseded by a newer
|
|
43
|
+
// active row at the same (ns,key,ws) slot (the retype mechanism), so
|
|
44
|
+
// including them would make this lookup ambiguous.
|
|
45
|
+
return (this.definitions.find((d) => d.namespace === required.namespace &&
|
|
46
|
+
d.key === required.key &&
|
|
47
|
+
d.workspaceId === required.workspaceId &&
|
|
48
|
+
(d.status === "active" || d.status === "alias" || d.status === "tombstone")) ?? null);
|
|
49
|
+
}
|
|
50
|
+
async findDefinitionBySettingId(required) {
|
|
51
|
+
const candidates = this.definitions.filter((d) => d.settingId === required.settingId);
|
|
52
|
+
if (required.version != null) {
|
|
53
|
+
return candidates.find((d) => d.version === required.version) ?? null;
|
|
54
|
+
}
|
|
55
|
+
return (candidates.find((d) => d.status === "active") ??
|
|
56
|
+
candidates.sort((a, b) => b.version - a.version)[0] ??
|
|
57
|
+
null);
|
|
58
|
+
}
|
|
59
|
+
async listActiveDefinitions(required) {
|
|
60
|
+
return this.definitions.filter((d) => d.workspaceId === required.workspaceId && (d.status === "active" || d.status === "alias"));
|
|
61
|
+
}
|
|
62
|
+
async saveDefinition(record) {
|
|
63
|
+
const index = this.definitions.findIndex((d) => d.settingId === record.settingId && d.version === record.version);
|
|
64
|
+
if (index === -1) {
|
|
65
|
+
this.definitions.push(record);
|
|
66
|
+
return;
|
|
67
|
+
}
|
|
68
|
+
this.definitions[index] = record;
|
|
69
|
+
}
|
|
70
|
+
async getGlobalValue(settingId) {
|
|
71
|
+
return this.globalValues.find((v) => v.settingId === settingId) ?? null;
|
|
72
|
+
}
|
|
73
|
+
async getWorkspaceValue(required) {
|
|
74
|
+
return (this.workspaceValues.find((v) => v.workspaceId === required.workspaceId && v.settingId === required.settingId) ?? null);
|
|
75
|
+
}
|
|
76
|
+
async getUserValue(required) {
|
|
77
|
+
return (this.userValues.find((v) => v.workspaceId === required.workspaceId &&
|
|
78
|
+
v.principalId === required.principalId &&
|
|
79
|
+
v.settingId === required.settingId) ?? null);
|
|
80
|
+
}
|
|
81
|
+
async saveGlobalValue(record) {
|
|
82
|
+
const index = this.globalValues.findIndex((v) => v.settingId === record.settingId);
|
|
83
|
+
if (index === -1) {
|
|
84
|
+
this.globalValues.push(record);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
this.globalValues[index] = record;
|
|
88
|
+
}
|
|
89
|
+
async saveWorkspaceValue(record) {
|
|
90
|
+
const index = this.workspaceValues.findIndex((v) => v.workspaceId === record.workspaceId && v.settingId === record.settingId);
|
|
91
|
+
if (index === -1) {
|
|
92
|
+
this.workspaceValues.push(record);
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
this.workspaceValues[index] = record;
|
|
96
|
+
}
|
|
97
|
+
async saveUserValue(record) {
|
|
98
|
+
const index = this.userValues.findIndex((v) => v.workspaceId === record.workspaceId &&
|
|
99
|
+
v.principalId === record.principalId &&
|
|
100
|
+
v.settingId === record.settingId);
|
|
101
|
+
if (index === -1) {
|
|
102
|
+
this.userValues.push(record);
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
this.userValues[index] = record;
|
|
106
|
+
}
|
|
107
|
+
async listWorkspaceValues(required) {
|
|
108
|
+
return this.workspaceValues.filter((v) => v.workspaceId === required.workspaceId);
|
|
109
|
+
}
|
|
110
|
+
async listUserValues(required) {
|
|
111
|
+
return this.userValues.filter((v) => v.workspaceId === required.workspaceId && v.principalId === required.principalId);
|
|
112
|
+
}
|
|
113
|
+
async listUserValuesByWorkspace(required) {
|
|
114
|
+
return this.userValues.filter((v) => v.workspaceId === required.workspaceId);
|
|
115
|
+
}
|
|
116
|
+
async deleteWorkspaceValue(required) {
|
|
117
|
+
this.workspaceValues = this.workspaceValues.filter((v) => !(v.workspaceId === required.workspaceId && v.settingId === required.settingId));
|
|
118
|
+
}
|
|
119
|
+
async deleteUserValue(required) {
|
|
120
|
+
this.userValues = this.userValues.filter((v) => !(v.workspaceId === required.workspaceId &&
|
|
121
|
+
v.principalId === required.principalId &&
|
|
122
|
+
v.settingId === required.settingId));
|
|
123
|
+
}
|
|
124
|
+
async appendRevision(record) {
|
|
125
|
+
const seq = this.nextSeq++;
|
|
126
|
+
this.revisions.push({ ...record, seq });
|
|
127
|
+
return seq;
|
|
128
|
+
}
|
|
129
|
+
async listRevisions(required) {
|
|
130
|
+
return this.revisions.filter((r) => r.settingId === required.settingId).sort((a, b) => a.seq - b.seq);
|
|
131
|
+
}
|
|
132
|
+
async listRevisionsSince(required) {
|
|
133
|
+
return this.revisions
|
|
134
|
+
.filter((r) => r.seq > required.sinceSeq &&
|
|
135
|
+
// Mirrors the SQL predicate exactly — see the port's doc. `null` means
|
|
136
|
+
// platform-wide (every workspace resolves through it); anything else is one tenant's.
|
|
137
|
+
(r.workspaceId === null || r.workspaceId === required.workspaceId))
|
|
138
|
+
.sort((a, b) => a.seq - b.seq)
|
|
139
|
+
.slice(0, required.limit);
|
|
140
|
+
}
|
|
141
|
+
async maxRevisionSeq() {
|
|
142
|
+
return this.revisions.reduce((max, r) => (r.seq > max ? r.seq : max), 0);
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Runs `fn` atomically: every mutation it makes is discarded if it throws.
|
|
146
|
+
*
|
|
147
|
+
* A shallow copy of each array is enough because no method here mutates a
|
|
148
|
+
* record in place — `save*` REPLACES the element at its index, `delete*`
|
|
149
|
+
* reassigns a filtered array, `appendRevision` pushes. Restoring the arrays
|
|
150
|
+
* therefore restores the rows too. If a future method starts editing a
|
|
151
|
+
* record object in place, this must deep-copy instead.
|
|
152
|
+
*
|
|
153
|
+
* `nextSeq` is rolled back with the rest, matching SQLite: `sqlite_sequence`
|
|
154
|
+
* is an ordinary table, so an AUTOINCREMENT counter bumped inside a
|
|
155
|
+
* transaction is undone by its ROLLBACK. A seq handed out by a failed
|
|
156
|
+
* transaction is safe to reuse precisely because that revision no longer
|
|
157
|
+
* exists.
|
|
158
|
+
*
|
|
159
|
+
* **Deliberately NOT reentrant**, matching a SQLite adapter's `transaction`,
|
|
160
|
+
* where `BEGIN IMMEDIATE` inside an open transaction is an error. Refusing
|
|
161
|
+
* loudly is the point: an instance-level flag cannot tell "nested inside my
|
|
162
|
+
* caller's transaction" from "an unrelated transaction that started while
|
|
163
|
+
* mine was awaiting". Silently joining a stranger's transaction — and
|
|
164
|
+
* inheriting its rollback — is a worse defect than refusing. A caller that
|
|
165
|
+
* needs several writes to commit together opens ONE transaction and passes
|
|
166
|
+
* `skipTransaction` to the inner writes, as `resetNamespace` does.
|
|
167
|
+
*/
|
|
168
|
+
async transaction(fn) {
|
|
169
|
+
if (this.inTransaction) {
|
|
170
|
+
throw new Error("InMemorySettingsRepo.transaction is not reentrant, and cannot host a second overlapping transaction. " +
|
|
171
|
+
"Open one transaction and pass `skipTransaction` to the inner writes (see resetNamespace).");
|
|
172
|
+
}
|
|
173
|
+
const snapshot = {
|
|
174
|
+
definitions: [...this.definitions],
|
|
175
|
+
globalValues: [...this.globalValues],
|
|
176
|
+
workspaceValues: [...this.workspaceValues],
|
|
177
|
+
userValues: [...this.userValues],
|
|
178
|
+
revisions: [...this.revisions],
|
|
179
|
+
nextSeq: this.nextSeq,
|
|
180
|
+
};
|
|
181
|
+
this.inTransaction = true;
|
|
182
|
+
try {
|
|
183
|
+
return await fn();
|
|
184
|
+
}
|
|
185
|
+
catch (error) {
|
|
186
|
+
this.definitions = snapshot.definitions;
|
|
187
|
+
this.globalValues = snapshot.globalValues;
|
|
188
|
+
this.workspaceValues = snapshot.workspaceValues;
|
|
189
|
+
this.userValues = snapshot.userValues;
|
|
190
|
+
this.revisions = snapshot.revisions;
|
|
191
|
+
this.nextSeq = snapshot.nextSeq;
|
|
192
|
+
throw error;
|
|
193
|
+
}
|
|
194
|
+
finally {
|
|
195
|
+
this.inTransaction = false;
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
//# sourceMappingURL=repo.memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.memory.js","sourceRoot":"","sources":["../../src/settings/repo.memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
import type { JsonValue } from "../core/ports.js";
|
|
2
|
+
import { DefinitionInvalidError, SecretNotSupportedError } from "./errors.js";
|
|
3
|
+
import type { SettingsRepoPort } from "./ports.js";
|
|
4
|
+
import { type SettingDefinitionRecord, type SettingOwnerKind, type SettingScopeContext, type SettingValueSchema } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* @file The settings resolver + pure definition-registration validation
|
|
7
|
+
* (REQ-02, REQ-03, REQ-09; "one evaluator").
|
|
8
|
+
*
|
|
9
|
+
* Purpose:
|
|
10
|
+
* `validateDefinitionInput` is pure (no I/O) — the write-side chokepoint in
|
|
11
|
+
* `write-service.ts` calls it before persisting. `getEffective`/`getLayer`/
|
|
12
|
+
* `resolveDefinition` are read-only against `SettingsRepoPort`. Neither
|
|
13
|
+
* mutates anything; every mutation goes through `write-service.ts`.
|
|
14
|
+
*/
|
|
15
|
+
export interface DefinitionInput {
|
|
16
|
+
namespace: string;
|
|
17
|
+
key: string;
|
|
18
|
+
ownerKind: SettingOwnerKind;
|
|
19
|
+
workspaceId: string | null;
|
|
20
|
+
ownerId?: string | null | undefined;
|
|
21
|
+
schema: SettingValueSchema;
|
|
22
|
+
defaultValue: JsonValue | null;
|
|
23
|
+
scopes: number;
|
|
24
|
+
secret: boolean;
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* REQ-02/REQ-09/INV-05/INV-08 — the pure half of `registerDefinitions`.
|
|
28
|
+
* Never throws; returns a discriminated result so the chokepoint decides how
|
|
29
|
+
* to surface the failure (matches `ValueValidationFailedError`'s pattern of
|
|
30
|
+
* keeping I/O out of validation).
|
|
31
|
+
*
|
|
32
|
+
* @complexity O(1) per definition.
|
|
33
|
+
* @overallScore 100
|
|
34
|
+
*/
|
|
35
|
+
export declare function validateDefinitionInput(input: DefinitionInput): {
|
|
36
|
+
valid: true;
|
|
37
|
+
} | {
|
|
38
|
+
valid: false;
|
|
39
|
+
error: DefinitionInvalidError | SecretNotSupportedError;
|
|
40
|
+
};
|
|
41
|
+
export declare function validateValueAgainstSchema(schema: SettingValueSchema, value: JsonValue): boolean;
|
|
42
|
+
export declare function registerCoercer(tag: string, fn: (value: JsonValue) => JsonValue): void;
|
|
43
|
+
/**
|
|
44
|
+
* Bumps the namespace's definition-cache epoch (lazy invalidation) — every
|
|
45
|
+
* previously-cached definition-cache entry for this
|
|
46
|
+
* namespace (across every workspace) becomes unreachable on the next read,
|
|
47
|
+
* without needing to enumerate tenants. Call after any write that changes a
|
|
48
|
+
* definition's identity/shape/status in this namespace: register, rename
|
|
49
|
+
* (both the old and new namespace), retype, deprecate, tombstone.
|
|
50
|
+
*/
|
|
51
|
+
export declare function invalidateDefinitionNamespaceCache(repo: SettingsRepoPort, namespace: string): void;
|
|
52
|
+
/**
|
|
53
|
+
* Purge support — now a no-op, deliberately kept rather than deleted.
|
|
54
|
+
*
|
|
55
|
+
* This cleared the workspace- and user-scope layer-cache entries a tenant/principal teardown
|
|
56
|
+
* invalidated, because a purge deletes an unbounded number of value rows across an unknown set of
|
|
57
|
+
* namespaces and per-namespace single-key invalidation was not practical for it. With the layer
|
|
58
|
+
* cache gone (see this module's cache header) there is nothing left to clear: the rows are deleted,
|
|
59
|
+
* and the next read goes to the repo and sees them gone.
|
|
60
|
+
*
|
|
61
|
+
* Kept as an explicit no-op instead of removed because of what it guards. `purge-service.ts` calls
|
|
62
|
+
* it as the last step of deleting a tenant's settings, and its correctness question — "can a purged
|
|
63
|
+
* value still be read back?" — is exactly the kind that must be answered again if anyone
|
|
64
|
+
* reintroduces caching. Deleting the call site would remove the place that question is asked. A
|
|
65
|
+
* cache added without restoring a purge hook is a tenant-teardown leak, so this stays as the seam.
|
|
66
|
+
*/
|
|
67
|
+
export declare function invalidateWorkspaceSettingsCache(_repo: SettingsRepoPort, _workspaceId: string, _principalId?: string): void;
|
|
68
|
+
/**
|
|
69
|
+
* Follows an alias marker (depth <=1) to the current row and returns it as
|
|
70
|
+
* stored — status intact, including `tombstone`. `resolveDefinition` (below)
|
|
71
|
+
* is the read-path wrapper that collapses tombstone to typed-absent (EC-10);
|
|
72
|
+
* `write-service.ts` uses this raw form directly so it can report
|
|
73
|
+
* `DEFINITION_TOMBSTONED` distinctly from "not found".
|
|
74
|
+
*/
|
|
75
|
+
export declare function resolveDefinitionRaw(deps: {
|
|
76
|
+
repo: SettingsRepoPort;
|
|
77
|
+
}, input: {
|
|
78
|
+
namespace: string;
|
|
79
|
+
key: string;
|
|
80
|
+
workspaceId: string | null;
|
|
81
|
+
}): Promise<SettingDefinitionRecord | null>;
|
|
82
|
+
/**
|
|
83
|
+
* The read-path resolver: typed-absent (`null`) for a tombstoned or
|
|
84
|
+
* missing key. Cached — keyed by
|
|
85
|
+
* `(workspaceId, namespace, key, namespace-epoch)`, so it is workspace-
|
|
86
|
+
* qualified by construction and invalidated wholesale by
|
|
87
|
+
* `invalidateDefinitionNamespaceCache` on any definition-lifecycle write
|
|
88
|
+
* (register/rename/retype/deprecate/tombstone). `resolveDefinitionRaw`
|
|
89
|
+
* itself stays uncached — the write chokepoint (`write-service.ts`) calls it
|
|
90
|
+
* directly so authorization/validation decisions are always made against
|
|
91
|
+
* live data, never a cached read.
|
|
92
|
+
*/
|
|
93
|
+
export declare function resolveDefinition(deps: {
|
|
94
|
+
repo: SettingsRepoPort;
|
|
95
|
+
}, input: {
|
|
96
|
+
namespace: string;
|
|
97
|
+
key: string;
|
|
98
|
+
workspaceId: string | null;
|
|
99
|
+
}): Promise<SettingDefinitionRecord | null>;
|
|
100
|
+
export interface ResolvedSetting {
|
|
101
|
+
value: JsonValue | null;
|
|
102
|
+
sourceLayer: "user" | "workspace" | "global" | "default";
|
|
103
|
+
defVersion: number;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* REQ-03/INV-02 — total for a live key: never throws, never returns
|
|
107
|
+
* undefined. Precedence `user ?? workspace ?? global ?? default`. A
|
|
108
|
+
* `cleared` row is treated as absent at that layer (behavior.spec §1.2).
|
|
109
|
+
*
|
|
110
|
+
* Per-layer reads go straight to the repo (see this module's cache header for
|
|
111
|
+
* why the per-layer value cache that used to wrap these three calls does not
|
|
112
|
+
* exist here).
|
|
113
|
+
*
|
|
114
|
+
* @complexity O(1) — up to 3 layer reads + 1 definition read.
|
|
115
|
+
* @overallScore 100
|
|
116
|
+
*/
|
|
117
|
+
export declare function getEffective(deps: {
|
|
118
|
+
repo: SettingsRepoPort;
|
|
119
|
+
}, input: {
|
|
120
|
+
namespace: string;
|
|
121
|
+
key: string;
|
|
122
|
+
scopeContext: SettingScopeContext;
|
|
123
|
+
}): Promise<ResolvedSetting | null>;
|
|
124
|
+
//# sourceMappingURL=settings.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/settings/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AACnD,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,gBAAgB,EACrB,KAAK,mBAAmB,EAExB,KAAK,kBAAkB,EACxB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AAEH,MAAM,WAAW,eAAe;IAC9B,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,EAAE,gBAAgB,CAAC;IAC5B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,CAAC;IACpC,MAAM,EAAE,kBAAkB,CAAC;IAC3B,YAAY,EAAE,SAAS,GAAG,IAAI,CAAC;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,OAAO,CAAC;CACjB;AAQD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,eAAe,GACrB;IAAE,KAAK,EAAE,IAAI,CAAA;CAAE,GAAG;IAAE,KAAK,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,sBAAsB,GAAG,uBAAuB,CAAA;CAAE,CAgD7F;AAED,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,kBAAkB,EAAE,KAAK,EAAE,SAAS,GAAG,OAAO,CAiBhG;AAKD,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,SAAS,GAAG,IAAI,CAEtF;AAoED;;;;;;;GAOG;AACH,wBAAgB,kCAAkC,CAAC,IAAI,EAAE,gBAAgB,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAGlG;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gCAAgC,CAAC,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAE3H;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,IAAI,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,EAChC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpE,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAqBzC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,iBAAiB,CACrC,IAAI,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,EAChC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GACpE,OAAO,CAAC,uBAAuB,GAAG,IAAI,CAAC,CAUzC;AAED,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,SAAS,GAAG,IAAI,CAAC;IACxB,WAAW,EAAE,MAAM,GAAG,WAAW,GAAG,QAAQ,GAAG,SAAS,CAAC;IACzD,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAChC,IAAI,EAAE;IAAE,IAAI,EAAE,gBAAgB,CAAA;CAAE,EAChC,KAAK,EAAE;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,mBAAmB,CAAA;CAAE,GAC3E,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC,CAmDjC"}
|