@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,238 @@
|
|
|
1
|
+
import { DefinitionInvalidError, SecretNotSupportedError } from "./errors.js";
|
|
2
|
+
import { SCOPE_BIT, } from "./types.js";
|
|
3
|
+
const NAMESPACE_FENCE = {
|
|
4
|
+
core: (input) => input.namespace.startsWith("core.") && input.workspaceId === null,
|
|
5
|
+
theme: (input) => input.namespace.startsWith("theme.") && input.workspaceId === null,
|
|
6
|
+
site: (input) => input.namespace.startsWith("site.") && input.workspaceId !== null,
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* REQ-02/REQ-09/INV-05/INV-08 — the pure half of `registerDefinitions`.
|
|
10
|
+
* Never throws; returns a discriminated result so the chokepoint decides how
|
|
11
|
+
* to surface the failure (matches `ValueValidationFailedError`'s pattern of
|
|
12
|
+
* keeping I/O out of validation).
|
|
13
|
+
*
|
|
14
|
+
* @complexity O(1) per definition.
|
|
15
|
+
* @overallScore 100
|
|
16
|
+
*/
|
|
17
|
+
export function validateDefinitionInput(input) {
|
|
18
|
+
if (input.secret) {
|
|
19
|
+
return {
|
|
20
|
+
valid: false,
|
|
21
|
+
error: new SecretNotSupportedError("secret:true definitions are not supported in the core-only subset (REQ-09/INV-08)"),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (!NAMESPACE_FENCE[input.ownerKind](input)) {
|
|
25
|
+
return {
|
|
26
|
+
valid: false,
|
|
27
|
+
error: new DefinitionInvalidError(`namespace '${input.namespace}' does not match the owner fence for owner_kind '${input.ownerKind}' (REQ-02)`),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
if (input.scopes < 1 || input.scopes > 7) {
|
|
31
|
+
return {
|
|
32
|
+
valid: false,
|
|
33
|
+
error: new DefinitionInvalidError(`scopes bitmask ${input.scopes} is out of range 1..7`),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
// INV-05: a site-owned def (workspace_id NOT NULL) may never declare the global scope bit.
|
|
37
|
+
if (input.workspaceId !== null && (input.scopes & SCOPE_BIT.global) !== 0) {
|
|
38
|
+
return {
|
|
39
|
+
valid: false,
|
|
40
|
+
error: new DefinitionInvalidError("a site-owned definition may not declare the global scope bit (INV-05)"),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
// Totality (behavior.spec §3): every non-secret def needs a non-null default so
|
|
44
|
+
// getEffective is always total (INV-02) and factory-reset is provably bootable.
|
|
45
|
+
if (input.defaultValue === null) {
|
|
46
|
+
return {
|
|
47
|
+
valid: false,
|
|
48
|
+
error: new DefinitionInvalidError("non-secret definitions require a non-null default_json (totality, INV-02)"),
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
return { valid: true };
|
|
52
|
+
}
|
|
53
|
+
export function validateValueAgainstSchema(schema, value) {
|
|
54
|
+
if (value === null)
|
|
55
|
+
return schema.nullable === true;
|
|
56
|
+
switch (schema.type) {
|
|
57
|
+
case "string":
|
|
58
|
+
return typeof value === "string";
|
|
59
|
+
case "number":
|
|
60
|
+
return typeof value === "number";
|
|
61
|
+
case "boolean":
|
|
62
|
+
return typeof value === "boolean";
|
|
63
|
+
case "enum":
|
|
64
|
+
return typeof value === "string" && schema.values.includes(value);
|
|
65
|
+
case "json":
|
|
66
|
+
// Any JSON value is accepted; internal shape/length validation is the
|
|
67
|
+
// registering feature's own write-path job — see
|
|
68
|
+
// docs/decisions/settings-json-schema-variant.md.
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/** Identity-registry of total coercers keyed by `coercionTag` (EC-08). `"identity"` is always registered. */
|
|
73
|
+
const coercers = new Map([["identity", (v) => v]]);
|
|
74
|
+
export function registerCoercer(tag, fn) {
|
|
75
|
+
coercers.set(tag, fn);
|
|
76
|
+
}
|
|
77
|
+
const cacheByRepo = new WeakMap();
|
|
78
|
+
function getCacheStore(repo) {
|
|
79
|
+
let store = cacheByRepo.get(repo);
|
|
80
|
+
if (!store) {
|
|
81
|
+
store = { definitions: new Map(), epoch: new Map() };
|
|
82
|
+
cacheByRepo.set(repo, store);
|
|
83
|
+
}
|
|
84
|
+
return store;
|
|
85
|
+
}
|
|
86
|
+
function namespaceEpoch(store, namespace) {
|
|
87
|
+
return store.epoch.get(namespace) ?? 0;
|
|
88
|
+
}
|
|
89
|
+
function workspaceCachePart(workspaceId) {
|
|
90
|
+
return workspaceId ?? "platform";
|
|
91
|
+
}
|
|
92
|
+
function definitionCacheKey(workspaceId, namespace, key, epoch) {
|
|
93
|
+
return `def:${workspaceCachePart(workspaceId)}:${namespace}:${key}:e${epoch}`;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Bumps the namespace's definition-cache epoch (lazy invalidation) — every
|
|
97
|
+
* previously-cached definition-cache entry for this
|
|
98
|
+
* namespace (across every workspace) becomes unreachable on the next read,
|
|
99
|
+
* without needing to enumerate tenants. Call after any write that changes a
|
|
100
|
+
* definition's identity/shape/status in this namespace: register, rename
|
|
101
|
+
* (both the old and new namespace), retype, deprecate, tombstone.
|
|
102
|
+
*/
|
|
103
|
+
export function invalidateDefinitionNamespaceCache(repo, namespace) {
|
|
104
|
+
const store = getCacheStore(repo);
|
|
105
|
+
store.epoch.set(namespace, namespaceEpoch(store, namespace) + 1);
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Purge support — now a no-op, deliberately kept rather than deleted.
|
|
109
|
+
*
|
|
110
|
+
* This cleared the workspace- and user-scope layer-cache entries a tenant/principal teardown
|
|
111
|
+
* invalidated, because a purge deletes an unbounded number of value rows across an unknown set of
|
|
112
|
+
* namespaces and per-namespace single-key invalidation was not practical for it. With the layer
|
|
113
|
+
* cache gone (see this module's cache header) there is nothing left to clear: the rows are deleted,
|
|
114
|
+
* and the next read goes to the repo and sees them gone.
|
|
115
|
+
*
|
|
116
|
+
* Kept as an explicit no-op instead of removed because of what it guards. `purge-service.ts` calls
|
|
117
|
+
* it as the last step of deleting a tenant's settings, and its correctness question — "can a purged
|
|
118
|
+
* value still be read back?" — is exactly the kind that must be answered again if anyone
|
|
119
|
+
* reintroduces caching. Deleting the call site would remove the place that question is asked. A
|
|
120
|
+
* cache added without restoring a purge hook is a tenant-teardown leak, so this stays as the seam.
|
|
121
|
+
*/
|
|
122
|
+
export function invalidateWorkspaceSettingsCache(_repo, _workspaceId, _principalId) {
|
|
123
|
+
// Intentionally empty — see doc above. Do not delete without re-reading `purge-service.ts`.
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Follows an alias marker (depth <=1) to the current row and returns it as
|
|
127
|
+
* stored — status intact, including `tombstone`. `resolveDefinition` (below)
|
|
128
|
+
* is the read-path wrapper that collapses tombstone to typed-absent (EC-10);
|
|
129
|
+
* `write-service.ts` uses this raw form directly so it can report
|
|
130
|
+
* `DEFINITION_TOMBSTONED` distinctly from "not found".
|
|
131
|
+
*/
|
|
132
|
+
export async function resolveDefinitionRaw(deps, input) {
|
|
133
|
+
// Namespace fencing (REQ-02) makes `site.*` (non-null workspace_id) and
|
|
134
|
+
// `core.*`/`theme.*` (null workspace_id) disjoint by construction, so a
|
|
135
|
+
// caller resolving inside a workspace context may still be asking for a
|
|
136
|
+
// platform definition. Try the caller's own partition first, then fall
|
|
137
|
+
// back to the platform (null) partition.
|
|
138
|
+
const found = (await deps.repo.findActiveDefinition(input)) ??
|
|
139
|
+
(input.workspaceId !== null
|
|
140
|
+
? await deps.repo.findActiveDefinition({ ...input, workspaceId: null })
|
|
141
|
+
: null);
|
|
142
|
+
if (!found)
|
|
143
|
+
return null;
|
|
144
|
+
if (found.status === "alias") {
|
|
145
|
+
if (found.aliasOfNamespace == null || found.aliasOfKey == null)
|
|
146
|
+
return null;
|
|
147
|
+
return resolveDefinitionRaw(deps, {
|
|
148
|
+
namespace: found.aliasOfNamespace,
|
|
149
|
+
key: found.aliasOfKey,
|
|
150
|
+
workspaceId: input.workspaceId,
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
return found;
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The read-path resolver: typed-absent (`null`) for a tombstoned or
|
|
157
|
+
* missing key. Cached — keyed by
|
|
158
|
+
* `(workspaceId, namespace, key, namespace-epoch)`, so it is workspace-
|
|
159
|
+
* qualified by construction and invalidated wholesale by
|
|
160
|
+
* `invalidateDefinitionNamespaceCache` on any definition-lifecycle write
|
|
161
|
+
* (register/rename/retype/deprecate/tombstone). `resolveDefinitionRaw`
|
|
162
|
+
* itself stays uncached — the write chokepoint (`write-service.ts`) calls it
|
|
163
|
+
* directly so authorization/validation decisions are always made against
|
|
164
|
+
* live data, never a cached read.
|
|
165
|
+
*/
|
|
166
|
+
export async function resolveDefinition(deps, input) {
|
|
167
|
+
const store = getCacheStore(deps.repo);
|
|
168
|
+
const epoch = namespaceEpoch(store, input.namespace);
|
|
169
|
+
const cacheKey = definitionCacheKey(input.workspaceId, input.namespace, input.key, epoch);
|
|
170
|
+
if (store.definitions.has(cacheKey))
|
|
171
|
+
return store.definitions.get(cacheKey);
|
|
172
|
+
const found = await resolveDefinitionRaw(deps, input);
|
|
173
|
+
const resolved = !found || found.status === "tombstone" ? null : found;
|
|
174
|
+
store.definitions.set(cacheKey, resolved);
|
|
175
|
+
return resolved;
|
|
176
|
+
}
|
|
177
|
+
/**
|
|
178
|
+
* REQ-03/INV-02 — total for a live key: never throws, never returns
|
|
179
|
+
* undefined. Precedence `user ?? workspace ?? global ?? default`. A
|
|
180
|
+
* `cleared` row is treated as absent at that layer (behavior.spec §1.2).
|
|
181
|
+
*
|
|
182
|
+
* Per-layer reads go straight to the repo (see this module's cache header for
|
|
183
|
+
* why the per-layer value cache that used to wrap these three calls does not
|
|
184
|
+
* exist here).
|
|
185
|
+
*
|
|
186
|
+
* @complexity O(1) — up to 3 layer reads + 1 definition read.
|
|
187
|
+
* @overallScore 100
|
|
188
|
+
*/
|
|
189
|
+
export async function getEffective(deps, input) {
|
|
190
|
+
const definition = await resolveDefinition(deps, {
|
|
191
|
+
namespace: input.namespace,
|
|
192
|
+
key: input.key,
|
|
193
|
+
workspaceId: input.scopeContext.workspaceId ?? null,
|
|
194
|
+
});
|
|
195
|
+
if (!definition)
|
|
196
|
+
return null;
|
|
197
|
+
const coerce = (value, defVersion) => {
|
|
198
|
+
if (defVersion === definition.version)
|
|
199
|
+
return value;
|
|
200
|
+
const coercer = coercers.get(definition.coercionTag ?? "identity") ?? coercers.get("identity");
|
|
201
|
+
return coercer(value);
|
|
202
|
+
};
|
|
203
|
+
// Every layer read below goes straight to the repo. See this module's cache header for why there
|
|
204
|
+
// is no per-layer cache wrapping these three calls.
|
|
205
|
+
if (input.scopeContext.workspaceId && input.scopeContext.principalId) {
|
|
206
|
+
const workspaceId = input.scopeContext.workspaceId;
|
|
207
|
+
const principalId = input.scopeContext.principalId;
|
|
208
|
+
const userValue = await deps.repo.getUserValue({ workspaceId, principalId, settingId: definition.settingId });
|
|
209
|
+
if (userValue && userValue.state === "set") {
|
|
210
|
+
return {
|
|
211
|
+
value: coerce(userValue.valueJson, userValue.defVersion),
|
|
212
|
+
sourceLayer: "user",
|
|
213
|
+
defVersion: definition.version,
|
|
214
|
+
};
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
if (input.scopeContext.workspaceId) {
|
|
218
|
+
const workspaceId = input.scopeContext.workspaceId;
|
|
219
|
+
const workspaceValue = await deps.repo.getWorkspaceValue({ workspaceId, settingId: definition.settingId });
|
|
220
|
+
if (workspaceValue && workspaceValue.state === "set") {
|
|
221
|
+
return {
|
|
222
|
+
value: coerce(workspaceValue.valueJson, workspaceValue.defVersion),
|
|
223
|
+
sourceLayer: "workspace",
|
|
224
|
+
defVersion: definition.version,
|
|
225
|
+
};
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
const globalValue = await deps.repo.getGlobalValue(definition.settingId);
|
|
229
|
+
if (globalValue && globalValue.state === "set") {
|
|
230
|
+
return {
|
|
231
|
+
value: coerce(globalValue.valueJson, globalValue.defVersion),
|
|
232
|
+
sourceLayer: "global",
|
|
233
|
+
defVersion: definition.version,
|
|
234
|
+
};
|
|
235
|
+
}
|
|
236
|
+
return { value: definition.defaultValue, sourceLayer: "default", defVersion: definition.version };
|
|
237
|
+
}
|
|
238
|
+
//# sourceMappingURL=settings.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"settings.js","sourceRoot":"","sources":["../../src/settings/settings.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Settings' tool-registration wiring: maps the wireable subset of `agent-tools.ts`'s eight
|
|
3
|
+
* catalog entries onto three reads and one curated write, as `ToolRegistration`s. See
|
|
4
|
+
* `agent-tools.ts`'s own file header for why the four GENERIC write entries are documented but
|
|
5
|
+
* deliberately never wired ({@link UNWIRED_SETTINGS_TOOL_IDS}), and why `settings_set_ui_preference`
|
|
6
|
+
* is not one of them.
|
|
7
|
+
*
|
|
8
|
+
* The one write here is shaped so that its blast radius is a property of the code rather than of
|
|
9
|
+
* the caller's restraint: its target key comes from a fixed enum
|
|
10
|
+
* (`agent-writable-preferences.ts`), its scope is a constant, and it never names a principal — so
|
|
11
|
+
* "write another operator's settings" and "write a key outside the list" are unrepresentable
|
|
12
|
+
* inputs, not merely unauthorized ones.
|
|
13
|
+
*
|
|
14
|
+
* Authorization shape: `getEffective`/`resolveDefinition` (`settings.ts`) and a direct
|
|
15
|
+
* `settingsRepo.listActiveDefinitions`/`getGlobalValue`/`getWorkspaceValue`/`getUserValue` read
|
|
16
|
+
* carry no `authorize()` call of their own — a host's admin routes gate inline — so every handler
|
|
17
|
+
* here calls the kit's `requireToolPermission` itself, mirroring those routes' identical checks.
|
|
18
|
+
* `resolveOwnOrOtherPrincipalRead` below deliberately duplicates (rather than imports) any HTTP
|
|
19
|
+
* admin layer's read-target resolution logic — this file is domain-owned wiring, and importing
|
|
20
|
+
* logic from a host's HTTP admin layer would invert this library's ports/adapters direction
|
|
21
|
+
* (features must not depend on a host's server/routes layer); the two are kept behaviorally
|
|
22
|
+
* identical by inspection, the same discipline that logic's own host-side callers should apply.
|
|
23
|
+
*/
|
|
24
|
+
import type { AuthorizeFn } from "../core/commands/command.js";
|
|
25
|
+
import { type DerivedRiskByToolId, type ToolRegistration } from "../core/tools/registration-kit.js";
|
|
26
|
+
import type { PrincipalRepoPort } from "../identity/index.js";
|
|
27
|
+
import type { SettingsRepoPort } from "./ports.js";
|
|
28
|
+
/**
|
|
29
|
+
* The exact slice of a host's route-deps bag Settings' tool handlers read. Declared structurally
|
|
30
|
+
* (rather than importing any host's own route-deps type) so this module carries no back-edge into
|
|
31
|
+
* a host's composition root. A host satisfies this structurally by passing its existing route deps
|
|
32
|
+
* object; nothing there needs to change shape.
|
|
33
|
+
*/
|
|
34
|
+
export interface SettingsToolDeps {
|
|
35
|
+
authorize: AuthorizeFn;
|
|
36
|
+
workspaceId: string;
|
|
37
|
+
clock: {
|
|
38
|
+
nowIso(): string;
|
|
39
|
+
};
|
|
40
|
+
idGen: {
|
|
41
|
+
newId(): string;
|
|
42
|
+
};
|
|
43
|
+
settingsReady: Promise<void>;
|
|
44
|
+
settingsUiTabsReady: Promise<void>;
|
|
45
|
+
settingsRepo: SettingsRepoPort;
|
|
46
|
+
principalRepo: PrincipalRepoPort;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* This wiring layer's OWN risk classification, authored from what each handler below actually
|
|
50
|
+
* calls. See `DerivedRiskByToolId` in the kit for why it is independent of the catalog's own
|
|
51
|
+
* `sideEffects` declaration — and note that the four excluded writes appear NOWHERE here, which is
|
|
52
|
+
* itself the strongest of the guards: an unclassified id cannot be wired at all.
|
|
53
|
+
*/
|
|
54
|
+
export declare const settingsDerivedRisk: DerivedRiskByToolId;
|
|
55
|
+
export declare function buildSettingsRegistrations(routeDeps: SettingsToolDeps): ToolRegistration[];
|
|
56
|
+
//# sourceMappingURL=tool-registrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrations.d.ts","sourceRoot":"","sources":["../../src/settings/tool-registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,EAUL,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACtB,MAAM,mCAAmC,CAAC;AAE3C,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AAa9D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAOnD;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,SAAS,EAAE,WAAW,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QAAE,MAAM,IAAI,MAAM,CAAA;KAAE,CAAC;IAC5B,KAAK,EAAE;QAAE,KAAK,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3B,aAAa,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7B,mBAAmB,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACnC,YAAY,EAAE,gBAAgB,CAAC;IAC/B,aAAa,EAAE,iBAAiB,CAAC;CAClC;AAmFD;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,mBAYhC,CAAC;AAkBH,wBAAgB,0BAA0B,CAAC,SAAS,EAAE,gBAAgB,GAAG,gBAAgB,EAAE,CAsJ1F"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
import { buildDomainRegistrations, indexCatalogById, optionalString, requireInputRecord, requireNoInput, requireString, requireToolPermission, withSchemaOnRejection, } from "../core/tools/registration-kit.js";
|
|
2
|
+
import { getSettingsAgentToolCatalog } from "./agent-tools.js";
|
|
3
|
+
import { AGENT_PREFERENCE_WRITE_SCOPE, AGENT_WRITABLE_PREFERENCE_IDS, resolveAgentWritablePreference, } from "./agent-writable-preferences.js";
|
|
4
|
+
import { DefinitionNotFoundError, DefinitionTombstonedError, ScopeNotAllowedError, ValueValidationFailedError, } from "./errors.js";
|
|
5
|
+
import { getEffective, resolveDefinition } from "./settings.js";
|
|
6
|
+
import { set as setSettingValue } from "./write-service.js";
|
|
7
|
+
const CATALOG_BY_ID = indexCatalogById(getSettingsAgentToolCatalog());
|
|
8
|
+
/** Permission gating a read that names a DIFFERENT principal than the caller — mirrors a host's
|
|
9
|
+
* own HTTP admin layer's equivalent constant (kept as a literal here per this file's header; the
|
|
10
|
+
* two are data, not logic, so duplication carries no drift risk beyond a string comparison). */
|
|
11
|
+
const CROSS_PRINCIPAL_SETTINGS_READ_PERMISSION = "settings.user.read";
|
|
12
|
+
/**
|
|
13
|
+
* Decides which principal's user layer a settings read tool may target — the tool-wiring twin of
|
|
14
|
+
* a host's own HTTP admin layer's equivalent read-target resolver (see this file's header for why
|
|
15
|
+
* it is duplicated rather than imported).
|
|
16
|
+
*
|
|
17
|
+
* @throws {ForbiddenError} (`core/commands`, via `requireToolPermission`) If `requestedPrincipalId`
|
|
18
|
+
* names a different principal than the caller and the caller lacks `settings.user.read`.
|
|
19
|
+
* @returns The principal id to read (`undefined` = skip the user layer entirely).
|
|
20
|
+
* @complexity O(1); at most one `authorize()` call (none for a self-read or no-op read).
|
|
21
|
+
* @overallScore 100
|
|
22
|
+
*/
|
|
23
|
+
async function resolveOwnOrOtherPrincipalRead(routeDeps, required) {
|
|
24
|
+
const { requestedPrincipalId, callerPrincipalId } = required;
|
|
25
|
+
// Defaults to the CALLER, never to `undefined`. `undefined` does not mean "the caller" to
|
|
26
|
+
// `getEffective` — it means "skip the user layer entirely" (`settings.ts`'s
|
|
27
|
+
// `if (workspaceId && principalId)` guard), so an omitted `principalId` would otherwise make
|
|
28
|
+
// every read tool report the workspace/global/default value while silently ignoring the
|
|
29
|
+
// operator's own — a read tool that cannot see the layer the operator is actually looking at
|
|
30
|
+
// does not fail loudly; it produces confident wrong answers.
|
|
31
|
+
const target = requestedPrincipalId ?? callerPrincipalId;
|
|
32
|
+
if (target === callerPrincipalId)
|
|
33
|
+
return target;
|
|
34
|
+
await requireToolPermission(routeDeps, {
|
|
35
|
+
principalId: callerPrincipalId,
|
|
36
|
+
permission: CROSS_PRINCIPAL_SETTINGS_READ_PERMISSION,
|
|
37
|
+
entityType: "setting-value",
|
|
38
|
+
});
|
|
39
|
+
return requestedPrincipalId;
|
|
40
|
+
}
|
|
41
|
+
function layerValueOf(record) {
|
|
42
|
+
return record && record.state === "set" ? record.valueJson : null;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Builds `write-service.ts`'s own five-field dep shape from `RouteDeps`.
|
|
46
|
+
*
|
|
47
|
+
* Deliberately duplicates a host's own HTTP admin layer's equivalent field-mapping helper rather
|
|
48
|
+
* than importing it, for the reason this file's header already gives about
|
|
49
|
+
* `resolveOwnOrOtherPrincipalRead`: this is domain-owned wiring, and importing from a host's HTTP
|
|
50
|
+
* admin layer would invert the ports/adapters direction. It is a field mapping, not logic, so the
|
|
51
|
+
* two copies carry no behavioral drift risk — and `write-service.ts` is the single chokepoint
|
|
52
|
+
* either way, so a divergence here could only produce a missing dependency, which fails loudly.
|
|
53
|
+
*/
|
|
54
|
+
function toWriteDeps(routeDeps) {
|
|
55
|
+
return {
|
|
56
|
+
repo: routeDeps.settingsRepo,
|
|
57
|
+
clock: routeDeps.clock,
|
|
58
|
+
ids: routeDeps.idGen,
|
|
59
|
+
authorize: routeDeps.authorize,
|
|
60
|
+
principals: routeDeps.principalRepo,
|
|
61
|
+
};
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Errors a DIFFERENT input would fix, for `withSchemaOnRejection`'s decoration.
|
|
65
|
+
*
|
|
66
|
+
* `ValueValidationFailedError` is the common one — the model sent a value of the wrong shape for
|
|
67
|
+
* the chosen setting, and republishing the schema (with its per-key value hints) lets it correct
|
|
68
|
+
* in one turn instead of guessing. The two definition errors are included because they are
|
|
69
|
+
* genuinely reachable from a bad `setting`: an id that passed the enum but names a definition this
|
|
70
|
+
* workspace has tombstoned. A `ForbiddenError` is deliberately absent — no input change fixes a
|
|
71
|
+
* missing grant, and decorating it would imply the call is worth retrying.
|
|
72
|
+
*/
|
|
73
|
+
function isPreferenceShapeRejection(error) {
|
|
74
|
+
return (error instanceof ValueValidationFailedError ||
|
|
75
|
+
error instanceof DefinitionNotFoundError ||
|
|
76
|
+
error instanceof DefinitionTombstonedError ||
|
|
77
|
+
error instanceof ScopeNotAllowedError);
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* This wiring layer's OWN risk classification, authored from what each handler below actually
|
|
81
|
+
* calls. See `DerivedRiskByToolId` in the kit for why it is independent of the catalog's own
|
|
82
|
+
* `sideEffects` declaration — and note that the four excluded writes appear NOWHERE here, which is
|
|
83
|
+
* itself the strongest of the guards: an unclassified id cannot be wired at all.
|
|
84
|
+
*/
|
|
85
|
+
export const settingsDerivedRisk = new Map([
|
|
86
|
+
// -> settingsRepo.listActiveDefinitions() x2 (platform + this workspace): reads only.
|
|
87
|
+
["settings_list_definitions", "none"],
|
|
88
|
+
// -> settingsRepo.listActiveDefinitions() x2 + getEffective() per key: reads only, no write path.
|
|
89
|
+
["settings_get_effective", "none"],
|
|
90
|
+
// -> resolveDefinition() + settingsRepo.getGlobalValue/getWorkspaceValue/getUserValue: reads only.
|
|
91
|
+
["settings_get_raw", "none"],
|
|
92
|
+
// -> write-service.set() at scope=user against the caller's own principal: writes a value row
|
|
93
|
+
// and a revision-ledger entry. Durable, and correctly classified as such even though every key
|
|
94
|
+
// it can reach is a reversible display preference — the classification describes what the
|
|
95
|
+
// handler DOES, not how much the operator would mind.
|
|
96
|
+
["settings_set_ui_preference", "mutates-durable-state"],
|
|
97
|
+
]);
|
|
98
|
+
/** Settings catalog entries this pass does not wire, and why — see `agent-tools.ts`'s own per-entry comments for the full reasoning. */
|
|
99
|
+
const UNWIRED_SETTINGS_TOOL_IDS = new Set([
|
|
100
|
+
// EXCLUDED BY DESIGN: generic "set any setting key" — a typical human admin UI for this domain
|
|
101
|
+
// is itself an uncurated free-text/raw-JSON editor, not a fixed named list (see agent-tools.ts
|
|
102
|
+
// file header).
|
|
103
|
+
"settings_set",
|
|
104
|
+
"settings_clear",
|
|
105
|
+
// EXCLUDED BY DESIGN: bulk variant — clears every value in an operator-named namespace at a
|
|
106
|
+
// scope in one call, irreversible.
|
|
107
|
+
"settings_reset",
|
|
108
|
+
// EXCLUDED BY DESIGN: schema-level, not value-level — can rename/retype/deprecate/tombstone the
|
|
109
|
+
// definition a key resolves through, reinterpreting every existing stored value for that key
|
|
110
|
+
// platform-wide.
|
|
111
|
+
"settings_register_definitions",
|
|
112
|
+
]);
|
|
113
|
+
export function buildSettingsRegistrations(routeDeps) {
|
|
114
|
+
const handlers = {
|
|
115
|
+
settings_list_definitions: async (ctx) => {
|
|
116
|
+
requireNoInput(ctx.input);
|
|
117
|
+
await routeDeps.settingsReady;
|
|
118
|
+
await requireToolPermission(routeDeps, { principalId: ctx.principal.id, permission: "settings.read.definitions", entityType: "setting-definition" });
|
|
119
|
+
const [platformDefs, siteDefs] = await Promise.all([
|
|
120
|
+
routeDeps.settingsRepo.listActiveDefinitions({ workspaceId: null }),
|
|
121
|
+
routeDeps.settingsRepo.listActiveDefinitions({ workspaceId: routeDeps.workspaceId }),
|
|
122
|
+
]);
|
|
123
|
+
const data = [...platformDefs, ...siteDefs]
|
|
124
|
+
.map((def) => ({ namespace: def.namespace, key: def.key, ownerKind: def.ownerKind, scopes: def.scopes, status: def.status, version: def.version }))
|
|
125
|
+
.sort((a, b) => a.namespace.localeCompare(b.namespace) || a.key.localeCompare(b.key));
|
|
126
|
+
return { data };
|
|
127
|
+
},
|
|
128
|
+
settings_get_effective: async (ctx) => {
|
|
129
|
+
const input = requireInputRecord(ctx.input);
|
|
130
|
+
const namespace = requireString(input, "namespace");
|
|
131
|
+
await routeDeps.settingsReady;
|
|
132
|
+
await requireToolPermission(routeDeps, { principalId: ctx.principal.id, permission: "settings.read", entityType: "setting-value" });
|
|
133
|
+
const workspaceId = routeDeps.workspaceId;
|
|
134
|
+
const principalId = await resolveOwnOrOtherPrincipalRead(routeDeps, {
|
|
135
|
+
requestedPrincipalId: optionalString(input, "principalId"),
|
|
136
|
+
callerPrincipalId: ctx.principal.id,
|
|
137
|
+
});
|
|
138
|
+
const [platformDefs, siteDefs] = await Promise.all([
|
|
139
|
+
routeDeps.settingsRepo.listActiveDefinitions({ workspaceId: null }),
|
|
140
|
+
routeDeps.settingsRepo.listActiveDefinitions({ workspaceId }),
|
|
141
|
+
]);
|
|
142
|
+
const keys = new Set([...platformDefs, ...siteDefs].filter((d) => d.namespace === namespace).map((d) => d.key));
|
|
143
|
+
const data = [];
|
|
144
|
+
for (const key of keys) {
|
|
145
|
+
const resolved = await getEffective({ repo: routeDeps.settingsRepo }, { namespace, key, scopeContext: { workspaceId, principalId } });
|
|
146
|
+
if (resolved)
|
|
147
|
+
data.push({ key, value: resolved.value, sourceLayer: resolved.sourceLayer, defVersion: resolved.defVersion });
|
|
148
|
+
}
|
|
149
|
+
return { data };
|
|
150
|
+
},
|
|
151
|
+
settings_get_raw: async (ctx) => {
|
|
152
|
+
const input = requireInputRecord(ctx.input);
|
|
153
|
+
const namespace = requireString(input, "namespace");
|
|
154
|
+
const key = requireString(input, "key");
|
|
155
|
+
await routeDeps.settingsReady;
|
|
156
|
+
await requireToolPermission(routeDeps, { principalId: ctx.principal.id, permission: "settings.read.raw", entityType: "setting-value" });
|
|
157
|
+
const workspaceId = routeDeps.workspaceId;
|
|
158
|
+
const principalId = await resolveOwnOrOtherPrincipalRead(routeDeps, {
|
|
159
|
+
requestedPrincipalId: optionalString(input, "principalId"),
|
|
160
|
+
callerPrincipalId: ctx.principal.id,
|
|
161
|
+
});
|
|
162
|
+
const definition = await resolveDefinition({ repo: routeDeps.settingsRepo }, { namespace, key, workspaceId });
|
|
163
|
+
if (!definition)
|
|
164
|
+
throw new Error(`definition '${namespace}.${key}' was not found`);
|
|
165
|
+
const [globalValue, workspaceValue, userValue] = await Promise.all([
|
|
166
|
+
routeDeps.settingsRepo.getGlobalValue(definition.settingId),
|
|
167
|
+
routeDeps.settingsRepo.getWorkspaceValue({ workspaceId, settingId: definition.settingId }),
|
|
168
|
+
principalId ? routeDeps.settingsRepo.getUserValue({ workspaceId, principalId, settingId: definition.settingId }) : Promise.resolve(null),
|
|
169
|
+
]);
|
|
170
|
+
return {
|
|
171
|
+
key: `${namespace}.${key}`,
|
|
172
|
+
global: layerValueOf(globalValue),
|
|
173
|
+
workspace: layerValueOf(workspaceValue),
|
|
174
|
+
user: layerValueOf(userValue),
|
|
175
|
+
default: definition.defaultValue,
|
|
176
|
+
};
|
|
177
|
+
},
|
|
178
|
+
settings_set_ui_preference: async (ctx) => {
|
|
179
|
+
const input = requireInputRecord(ctx.input);
|
|
180
|
+
const settingId = requireString(input, "setting");
|
|
181
|
+
// Re-checked here even though the published schema carries the same enum. See
|
|
182
|
+
// `agent-writable-preferences.ts` on why: the enum is enforced by a caller's descriptor
|
|
183
|
+
// validation, and this is the check that still holds if a stale or bypassed descriptor lets
|
|
184
|
+
// an unlisted id through. Rejected BEFORE `settingsUiTabsReady` is awaited so an unlisted id
|
|
185
|
+
// cannot even be used to probe which definitions exist.
|
|
186
|
+
const preference = resolveAgentWritablePreference(settingId);
|
|
187
|
+
if (!preference) {
|
|
188
|
+
throw new Error(`'${settingId}' is not an agent-writable preference. Allowed: ${AGENT_WRITABLE_PREFERENCE_IDS.join(", ")}.`);
|
|
189
|
+
}
|
|
190
|
+
// `in` rather than a truthiness check: `false` and `0` are legitimate values here
|
|
191
|
+
// (`soundEnabled`, `desktopEnabled`), and rejecting them would make the two boolean
|
|
192
|
+
// preferences settable in one direction only.
|
|
193
|
+
if (!("value" in input)) {
|
|
194
|
+
throw new Error(`a 'value' is required to set '${settingId}'`);
|
|
195
|
+
}
|
|
196
|
+
const value = input.value;
|
|
197
|
+
// This tool's definitions are registered by `ensureSettingsUiTabDefinitions()` at boot, not
|
|
198
|
+
// by any legacy-migration promise a host might also cover — awaiting the wrong promise would
|
|
199
|
+
// make an early call fail with a spurious "definition was not found".
|
|
200
|
+
await routeDeps.settingsUiTabsReady;
|
|
201
|
+
// No `requireToolPermission` call here, unlike every read above. That is deliberate and is
|
|
202
|
+
// the opposite of the reads' situation: the read paths carry no `authorize()` of their own,
|
|
203
|
+
// so this layer must supply it, whereas `write-service.set()` IS the authorization
|
|
204
|
+
// chokepoint (INV-07) and derives the permission itself from the scope and target. Adding a
|
|
205
|
+
// pre-check would mean this file naming a permission string that the chokepoint might later
|
|
206
|
+
// derive differently — the exact fail-open drift `deriveRequiredPermission`'s own header
|
|
207
|
+
// (Red-Team RT-003) says must not be duplicated. Omitting `principalId` is what makes the
|
|
208
|
+
// derived permission `settings.user.self.write`.
|
|
209
|
+
const { value: stored, revisionSeq } = await withSchemaOnRejection({
|
|
210
|
+
toolId: "settings_set_ui_preference",
|
|
211
|
+
catalog: CATALOG_BY_ID,
|
|
212
|
+
isShapeRejection: isPreferenceShapeRejection,
|
|
213
|
+
}, () => setSettingValue({
|
|
214
|
+
deps: toWriteDeps(routeDeps),
|
|
215
|
+
input: {
|
|
216
|
+
namespace: preference.namespace,
|
|
217
|
+
key: preference.key,
|
|
218
|
+
scope: AGENT_PREFERENCE_WRITE_SCOPE,
|
|
219
|
+
value,
|
|
220
|
+
workspaceId: routeDeps.workspaceId,
|
|
221
|
+
// `principalId` is deliberately NOT passed. `write-service.set()` falls back to
|
|
222
|
+
// `callerPrincipalId` for a user-scoped write, so the caller's own layer is the only
|
|
223
|
+
// reachable target — and the self-vs-other permission derivation sees a self-write.
|
|
224
|
+
callerPrincipalId: ctx.principal.id,
|
|
225
|
+
authWorkspaceId: routeDeps.workspaceId,
|
|
226
|
+
},
|
|
227
|
+
}));
|
|
228
|
+
return { setting: settingId, value: stored, scope: AGENT_PREFERENCE_WRITE_SCOPE, revisionSeq };
|
|
229
|
+
},
|
|
230
|
+
};
|
|
231
|
+
return buildDomainRegistrations({
|
|
232
|
+
domain: "settings",
|
|
233
|
+
catalogModule: "settings/agent-tools.ts",
|
|
234
|
+
catalog: CATALOG_BY_ID,
|
|
235
|
+
handlers,
|
|
236
|
+
derivedRisk: settingsDerivedRisk,
|
|
237
|
+
unwiredToolIds: UNWIRED_SETTINGS_TOOL_IDS,
|
|
238
|
+
});
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=tool-registrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrations.js","sourceRoot":"","sources":["../../src/settings/tool-registrations.ts"],"names":[],"mappings":"AAwBA,OAAO,EACL,wBAAwB,EACxB,gBAAgB,EAChB,cAAc,EACd,kBAAkB,EAClB,cAAc,EACd,aAAa,EACb,qBAAqB,EACrB,qBAAqB,GAKtB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kBAAkB,CAAC;AAC/D,OAAO,EACL,4BAA4B,EAC5B,6BAA6B,EAC7B,8BAA8B,GAC/B,MAAM,iCAAiC,CAAC;AACzC,OAAO,EACL,uBAAuB,EACvB,yBAAyB,EACzB,oBAAoB,EACpB,0BAA0B,GAC3B,MAAM,aAAa,CAAC;AAErB,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEhE,OAAO,EAAE,GAAG,IAAI,eAAe,EAAiC,MAAM,oBAAoB,CAAC;AAE3F,MAAM,aAAa,GAAG,gBAAgB,CAAC,2BAA2B,EAAE,CAAC,CAAC;AAmBtE;;gGAEgG;AAChG,MAAM,wCAAwC,GAAG,oBAAoB,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,KAAK,UAAU,8BAA8B,CAC3C,SAA2B,EAC3B,QAAiF;IAEjF,MAAM,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,GAAG,QAAQ,CAAC;IAC7D,0FAA0F;IAC1F,4EAA4E;IAC5E,6FAA6F;IAC7F,wFAAwF;IACxF,6FAA6F;IAC7F,6DAA6D;IAC7D,MAAM,MAAM,GAAG,oBAAoB,IAAI,iBAAiB,CAAC;IACzD,IAAI,MAAM,KAAK,iBAAiB;QAAE,OAAO,MAAM,CAAC;IAEhD,MAAM,qBAAqB,CAAC,SAAS,EAAE;QACrC,WAAW,EAAE,iBAAiB;QAC9B,UAAU,EAAE,wCAAwC;QACpD,UAAU,EAAE,eAAe;KAC5B,CAAC,CAAC;IACH,OAAO,oBAAoB,CAAC;AAC9B,CAAC;AAED,SAAS,YAAY,CAAC,MAAiC;IACrD,OAAO,MAAM,IAAI,MAAM,CAAC,KAAK,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,WAAW,CAAC,SAA2B;IAC9C,OAAO;QACL,IAAI,EAAE,SAAS,CAAC,YAAY;QAC5B,KAAK,EAAE,SAAS,CAAC,KAAK;QACtB,GAAG,EAAE,SAAS,CAAC,KAAK;QACpB,SAAS,EAAE,SAAS,CAAC,SAAS;QAC9B,UAAU,EAAE,SAAS,CAAC,aAAa;KACpC,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,0BAA0B,CAAC,KAAc;IAChD,OAAO,CACL,KAAK,YAAY,0BAA0B;QAC3C,KAAK,YAAY,uBAAuB;QACxC,KAAK,YAAY,yBAAyB;QAC1C,KAAK,YAAY,oBAAoB,CACtC,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAwB,IAAI,GAAG,CAA8B;IAC3F,sFAAsF;IACtF,CAAC,2BAA2B,EAAE,MAAM,CAAC;IACrC,kGAAkG;IAClG,CAAC,wBAAwB,EAAE,MAAM,CAAC;IAClC,mGAAmG;IACnG,CAAC,kBAAkB,EAAE,MAAM,CAAC;IAC5B,8FAA8F;IAC9F,+FAA+F;IAC/F,0FAA0F;IAC1F,sDAAsD;IACtD,CAAC,4BAA4B,EAAE,uBAAuB,CAAC;CACxD,CAAC,CAAC;AAEH,wIAAwI;AACxI,MAAM,yBAAyB,GAAG,IAAI,GAAG,CAAC;IACxC,+FAA+F;IAC/F,+FAA+F;IAC/F,gBAAgB;IAChB,cAAc;IACd,gBAAgB;IAChB,4FAA4F;IAC5F,mCAAmC;IACnC,gBAAgB;IAChB,gGAAgG;IAChG,6FAA6F;IAC7F,iBAAiB;IACjB,+BAA+B;CAChC,CAAC,CAAC;AAEH,MAAM,UAAU,0BAA0B,CAAC,SAA2B;IACpE,MAAM,QAAQ,GAAgC;QAC5C,yBAAyB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACvC,cAAc,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC1B,MAAM,SAAS,CAAC,aAAa,CAAC;YAC9B,MAAM,qBAAqB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,2BAA2B,EAAE,UAAU,EAAE,oBAAoB,EAAE,CAAC,CAAC;YAErJ,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjD,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBACnE,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC;aACrF,CAAC,CAAC;YAEH,MAAM,IAAI,GAAG,CAAC,GAAG,YAAY,EAAE,GAAG,QAAQ,CAAC;iBACxC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,CAAC,GAAG,EAAE,SAAS,EAAE,GAAG,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;iBAClJ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAExF,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,sBAAsB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACpC,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACpD,MAAM,SAAS,CAAC,aAAa,CAAC;YAC9B,MAAM,qBAAqB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,eAAe,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC;YAEpI,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,8BAA8B,CAAC,SAAS,EAAE;gBAClE,oBAAoB,EAAE,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC;gBAC1D,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE;aACpC,CAAC,CAAC;YAEH,MAAM,CAAC,YAAY,EAAE,QAAQ,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjD,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;gBACnE,SAAS,CAAC,YAAY,CAAC,qBAAqB,CAAC,EAAE,WAAW,EAAE,CAAC;aAC9D,CAAC,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,YAAY,EAAE,GAAG,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAEhH,MAAM,IAAI,GAAoF,EAAE,CAAC;YACjG,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,WAAW,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;gBACtI,IAAI,QAAQ;oBAAE,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;YAC9H,CAAC;YAED,OAAO,EAAE,IAAI,EAAE,CAAC;QAClB,CAAC;QAED,gBAAgB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YAC9B,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;YACpD,MAAM,GAAG,GAAG,aAAa,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;YACxC,MAAM,SAAS,CAAC,aAAa,CAAC;YAC9B,MAAM,qBAAqB,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,UAAU,EAAE,mBAAmB,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC,CAAC;YAExI,MAAM,WAAW,GAAG,SAAS,CAAC,WAAW,CAAC;YAC1C,MAAM,WAAW,GAAG,MAAM,8BAA8B,CAAC,SAAS,EAAE;gBAClE,oBAAoB,EAAE,cAAc,CAAC,KAAK,EAAE,aAAa,CAAC;gBAC1D,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE;aACpC,CAAC,CAAC;YAEH,MAAM,UAAU,GAAG,MAAM,iBAAiB,CAAC,EAAE,IAAI,EAAE,SAAS,CAAC,YAAY,EAAE,EAAE,EAAE,SAAS,EAAE,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC;YAC9G,IAAI,CAAC,UAAU;gBAAE,MAAM,IAAI,KAAK,CAAC,eAAe,SAAS,IAAI,GAAG,iBAAiB,CAAC,CAAC;YAEnF,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,SAAS,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;gBACjE,SAAS,CAAC,YAAY,CAAC,cAAc,CAAC,UAAU,CAAC,SAAS,CAAC;gBAC3D,SAAS,CAAC,YAAY,CAAC,iBAAiB,CAAC,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC;gBAC1F,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,WAAW,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC;aACzI,CAAC,CAAC;YAEH,OAAO;gBACL,GAAG,EAAE,GAAG,SAAS,IAAI,GAAG,EAAE;gBAC1B,MAAM,EAAE,YAAY,CAAC,WAAW,CAAC;gBACjC,SAAS,EAAE,YAAY,CAAC,cAAc,CAAC;gBACvC,IAAI,EAAE,YAAY,CAAC,SAAS,CAAC;gBAC7B,OAAO,EAAE,UAAU,CAAC,YAAY;aACjC,CAAC;QACJ,CAAC;QAED,0BAA0B,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;YACxC,MAAM,KAAK,GAAG,kBAAkB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC5C,MAAM,SAAS,GAAG,aAAa,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;YAElD,8EAA8E;YAC9E,wFAAwF;YACxF,4FAA4F;YAC5F,6FAA6F;YAC7F,wDAAwD;YACxD,MAAM,UAAU,GAAG,8BAA8B,CAAC,SAAS,CAAC,CAAC;YAC7D,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,MAAM,IAAI,KAAK,CACb,IAAI,SAAS,mDAAmD,6BAA6B,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAC5G,CAAC;YACJ,CAAC;YAED,kFAAkF;YAClF,oFAAoF;YACpF,8CAA8C;YAC9C,IAAI,CAAC,CAAC,OAAO,IAAI,KAAK,CAAC,EAAE,CAAC;gBACxB,MAAM,IAAI,KAAK,CAAC,iCAAiC,SAAS,GAAG,CAAC,CAAC;YACjE,CAAC;YACD,MAAM,KAAK,GAAG,KAAK,CAAC,KAAkB,CAAC;YAEvC,4FAA4F;YAC5F,6FAA6F;YAC7F,sEAAsE;YACtE,MAAM,SAAS,CAAC,mBAAmB,CAAC;YAEpC,2FAA2F;YAC3F,4FAA4F;YAC5F,mFAAmF;YACnF,4FAA4F;YAC5F,4FAA4F;YAC5F,yFAAyF;YACzF,0FAA0F;YAC1F,iDAAiD;YACjD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,MAAM,qBAAqB,CAChE;gBACE,MAAM,EAAE,4BAA4B;gBACpC,OAAO,EAAE,aAAa;gBACtB,gBAAgB,EAAE,0BAA0B;aAC7C,EACD,GAAG,EAAE,CACH,eAAe,CAAC;gBACd,IAAI,EAAE,WAAW,CAAC,SAAS,CAAC;gBAC5B,KAAK,EAAE;oBACL,SAAS,EAAE,UAAU,CAAC,SAAS;oBAC/B,GAAG,EAAE,UAAU,CAAC,GAAG;oBACnB,KAAK,EAAE,4BAA4B;oBACnC,KAAK;oBACL,WAAW,EAAE,SAAS,CAAC,WAAW;oBAClC,gFAAgF;oBAChF,qFAAqF;oBACrF,oFAAoF;oBACpF,iBAAiB,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE;oBACnC,eAAe,EAAE,SAAS,CAAC,WAAW;iBACvC;aACF,CAAC,CACL,CAAC;YAEF,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,4BAA4B,EAAE,WAAW,EAAE,CAAC;QACjG,CAAC;KACF,CAAC;IAEF,OAAO,wBAAwB,CAAC;QAC9B,MAAM,EAAE,UAAU;QAClB,aAAa,EAAE,yBAAyB;QACxC,OAAO,EAAE,aAAa;QACtB,QAAQ;QACR,WAAW,EAAE,mBAAmB;QAChC,cAAc,EAAE,yBAAyB;KAC1C,CAAC,CAAC;AACL,CAAC"}
|