@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,133 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
import { InvalidFieldKindError, InvalidFieldNameGrammarError, InvalidKeyGrammarError } from "./errors.js";
|
|
3
|
+
import { CONTENT_TYPE_FIELD_KINDS, isContentTypeFieldKind } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* @file CIC U-001 — the `kind`->`CAST` fixed lookup table, the identifier grammar
|
|
6
|
+
* gate, the workspace-scoped queryable-index naming scheme, and the before/after index-transition
|
|
7
|
+
* resolver (grammar-and-workspace-scoping folds).
|
|
8
|
+
*
|
|
9
|
+
* Purpose:
|
|
10
|
+
* THIS IS THE HIGHEST-SECURITY-SEVERITY MODULE IN THE 5-PACKAGE PIPELINE — every value that ends
|
|
11
|
+
* up inside a `CREATE INDEX ... CAST(json_extract(fields,'$.ext.{ns}.{field}') AS {type})`
|
|
12
|
+
* statement is produced here, and only here:
|
|
13
|
+
* - `mapFieldKindToCast` never interpolates an operator-supplied string — it is a fixed,
|
|
14
|
+
* hardcoded 5-entry table (U-001-B1).
|
|
15
|
+
* - `validateIdentifierGrammar`/`buildQueryableFieldIndexName` gate every `key`/field name
|
|
16
|
+
* through `^[a-z][a-z0-9_]{0,63}$` before it can reach an index-name segment or JSON-path
|
|
17
|
+
* literal (U-001-B2), and join grammar-gated segments with `/` — a delimiter outside the
|
|
18
|
+
* grammar's own alphabet `[a-z0-9_]`, closing the namespace-injectivity collision class
|
|
19
|
+
* (U-001-B3) — and fold in a workspace-derived segment so two workspaces defining the same
|
|
20
|
+
* `(key, field)` pair never collide on index identity.
|
|
21
|
+
*
|
|
22
|
+
* How it relates to the project:
|
|
23
|
+
* `write-service.ts`'s `registerContentType`/`updateContentTypeFields` call
|
|
24
|
+
* `resolveFieldIndexTransition` once per field (never two independent kind/queryable branches —
|
|
25
|
+
* CIC U-003-B1) and hand the result to the injected `indexProvisioner` port, which is the only
|
|
26
|
+
* thing that ever issues the real `CREATE INDEX`/`DROP INDEX` DDL (this module only decides what
|
|
27
|
+
* to build, never executes DDL itself).
|
|
28
|
+
*
|
|
29
|
+
* Architectural role:
|
|
30
|
+
* `features/content-types` domain logic. No dependencies beyond `node:crypto` (workspace-segment
|
|
31
|
+
* hashing) and this package's own `errors.ts`/`types.ts`.
|
|
32
|
+
*/
|
|
33
|
+
/**
|
|
34
|
+
* U-001-B2 — the closed identifier grammar every `content_types.key` and field name must satisfy,
|
|
35
|
+
* as a pattern string so the agent-facing JSON Schemas in `agent-tools.ts` can publish the very
|
|
36
|
+
* same grammar instead of restating it. A cross-cutting single-source-of-truth governance rule makes this grammar load-bearing for DDL
|
|
37
|
+
* safety, so it must have exactly one definition; {@link IDENTIFIER_GRAMMAR} is compiled from this
|
|
38
|
+
* string rather than written twice.
|
|
39
|
+
*/
|
|
40
|
+
export const IDENTIFIER_GRAMMAR_PATTERN = "^[a-z][a-z0-9_]{0,63}$";
|
|
41
|
+
/** U-001-B2 — the closed identifier grammar every `content_types.key` and field name must satisfy. */
|
|
42
|
+
const IDENTIFIER_GRAMMAR = new RegExp(IDENTIFIER_GRAMMAR_PATTERN);
|
|
43
|
+
/**
|
|
44
|
+
* Structural grammar gate for a `content_types.key` or field name (U-001-B2).
|
|
45
|
+
*
|
|
46
|
+
* @complexity O(n) in the string's length (regex match), bounded at 64 chars.
|
|
47
|
+
* @overallScore 100
|
|
48
|
+
*/
|
|
49
|
+
export function validateIdentifierGrammar(value) {
|
|
50
|
+
return IDENTIFIER_GRAMMAR.test(value);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* U-001-B1 — the fixed, hardcoded `kind` -> SQL `CAST` type-token table. Every value here is a
|
|
54
|
+
* plain uppercase SQL type token with no quotes/parens/whitespace; never built by concatenation.
|
|
55
|
+
*/
|
|
56
|
+
const KIND_TO_CAST_LITERAL = {
|
|
57
|
+
text: "TEXT",
|
|
58
|
+
integer: "INTEGER",
|
|
59
|
+
real: "REAL",
|
|
60
|
+
boolean: "BOOLEAN",
|
|
61
|
+
datetime: "TEXT",
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Maps a closed-enum field `kind` to its fixed `CAST(... AS {type})` type token. Throws
|
|
65
|
+
* {@link InvalidFieldKindError} for anything not exactly one of the 5 enum values — this is a
|
|
66
|
+
* lookup, never a template, so an adversarial payload can never reach the returned string
|
|
67
|
+
* (U-001-B1).
|
|
68
|
+
*
|
|
69
|
+
* @complexity O(1) — a fixed-size object lookup.
|
|
70
|
+
* @overallScore 100
|
|
71
|
+
*/
|
|
72
|
+
export function mapFieldKindToCast(kind) {
|
|
73
|
+
if (!isContentTypeFieldKind(kind)) {
|
|
74
|
+
throw new InvalidFieldKindError(`'${String(kind)}' is not one of the closed field-kind enum (${CONTENT_TYPE_FIELD_KINDS.join("|")}) — U-001-B1`);
|
|
75
|
+
}
|
|
76
|
+
return KIND_TO_CAST_LITERAL[kind];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Derives a grammar-safe, workspace-scoped index-name segment from an arbitrary `workspaceId`
|
|
80
|
+
* (which itself is not grammar-constrained — e.g. `"ws-1"` contains a hyphen). Hashing collapses
|
|
81
|
+
* it to a fixed `[0-9a-f]` alphabet (a strict subset of the identifier grammar's `[a-z0-9_]`)
|
|
82
|
+
* prefixed with a letter so the segment independently satisfies {@link validateIdentifierGrammar}.
|
|
83
|
+
*
|
|
84
|
+
* @complexity O(1) — a fixed-length SHA-256 digest.
|
|
85
|
+
* @overallScore 100
|
|
86
|
+
*/
|
|
87
|
+
function workspaceIndexSegment(workspaceId) {
|
|
88
|
+
const digest = createHash("sha256").update(workspaceId).digest("hex").slice(0, 16);
|
|
89
|
+
return `w${digest}`;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Builds the workspace-scoped queryable-field index identity for `(workspaceId, contentTypeKey,
|
|
93
|
+
* fieldName)`. Both `contentTypeKey` and `fieldName` are grammar-gated first — a failure throws
|
|
94
|
+
* before any index name is produced (U-001-B2). Segments are joined with `/`, a delimiter outside
|
|
95
|
+
* the grammar's own alphabet `[a-z0-9_]`, so distinct `(key, name)` pairs can never collide by
|
|
96
|
+
* boundary-shifting (U-001-B3, e.g. `("a_b","c")` vs `("a","b_c")`).
|
|
97
|
+
*
|
|
98
|
+
* @complexity O(1) plus two grammar checks and one SHA-256 hash.
|
|
99
|
+
* @overallScore 100
|
|
100
|
+
*/
|
|
101
|
+
export function buildQueryableFieldIndexName(params) {
|
|
102
|
+
if (!validateIdentifierGrammar(params.contentTypeKey)) {
|
|
103
|
+
throw new InvalidKeyGrammarError(`content-type key '${params.contentTypeKey}' fails the identifier grammar gate ^[a-z][a-z0-9_]{0,63}$ (U-001-B2)`);
|
|
104
|
+
}
|
|
105
|
+
if (!validateIdentifierGrammar(params.fieldName)) {
|
|
106
|
+
throw new InvalidFieldNameGrammarError(`field name '${params.fieldName}' fails the identifier grammar gate ^[a-z][a-z0-9_]{0,63}$ (U-001-B2)`);
|
|
107
|
+
}
|
|
108
|
+
return `q/${workspaceIndexSegment(params.workspaceId)}/${params.contentTypeKey}/${params.fieldName}`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* CIC U-003-B1 — resolves a single field's index transition from ONE before/after comparison of
|
|
112
|
+
* its `(kind, queryable)` pair, never from two independent branches that each assume the other
|
|
113
|
+
* property is unchanged (the bug class this closes: a field whose `kind` AND `queryable` both
|
|
114
|
+
* change in the same call must still resolve correctly — REQ-30(b)).
|
|
115
|
+
*
|
|
116
|
+
* @complexity O(1) — four comparisons, one of four fixed outcomes.
|
|
117
|
+
* @overallScore 100
|
|
118
|
+
*/
|
|
119
|
+
export function resolveFieldIndexTransition(params) {
|
|
120
|
+
const beforeQueryable = params.before?.queryable ?? false;
|
|
121
|
+
const afterQueryable = params.after?.queryable ?? false;
|
|
122
|
+
if (!beforeQueryable && !afterQueryable)
|
|
123
|
+
return { action: "none" };
|
|
124
|
+
if (beforeQueryable && !afterQueryable)
|
|
125
|
+
return { action: "teardown" };
|
|
126
|
+
if (!beforeQueryable && afterQueryable)
|
|
127
|
+
return { action: "provision", newKind: params.after.kind };
|
|
128
|
+
if (params.before.kind !== params.after.kind) {
|
|
129
|
+
return { action: "reprovision", newKind: params.after.kind };
|
|
130
|
+
}
|
|
131
|
+
return { action: "none" };
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=index-provisioning.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-provisioning.js","sourceRoot":"","sources":["../../src/content-types/index-provisioning.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Public surface (barrel) for the `content-types` library.
|
|
3
|
+
*
|
|
4
|
+
* A module's public contract is its `index.ts` — deep imports from outside this
|
|
5
|
+
* directory should go through here.
|
|
6
|
+
*
|
|
7
|
+
* See `../entries/index.js`'s header for why these two ship as separate subpaths rather than one.
|
|
8
|
+
*/
|
|
9
|
+
export type { ContentTypeFieldKind, ContentTypeFieldDef, ContentTypeStatus, ContentTypeRecord, ActorPrincipalKind, ActorIdentityInput, Result, } from "./types.js";
|
|
10
|
+
export { CONTENT_TYPE_FIELD_KINDS, isContentTypeFieldKind } from "./types.js";
|
|
11
|
+
export type { ContentTypeListPort } from "./list.js";
|
|
12
|
+
export { listContentTypes } from "./list.js";
|
|
13
|
+
export { parseContentTypeFieldDefs } from "./field-defs.js";
|
|
14
|
+
/**
|
|
15
|
+
* These are exported as **values**, not types: callers catch them with `instanceof`. Because this
|
|
16
|
+
* barrel re-exports rather than redeclares, there is exactly one class object per error across
|
|
17
|
+
* every consumer. `ForbiddenError`/`VersionConflictError`/`ContentTypeNotFoundError` are this
|
|
18
|
+
* module's own and are deliberately distinct from the same-named classes on `../entries/index.js`
|
|
19
|
+
* and `../core/commands/command.js` — a consumer must catch the one it actually called into.
|
|
20
|
+
*/
|
|
21
|
+
export { ForbiddenError, InvalidKeyGrammarError, ReservedContentTypeKeyError, InvalidFieldNameGrammarError, InvalidFieldKindError, InvalidFieldShapeError, QueryableFieldCapExceededError, VersionConflictError, ContentTypeNotFoundError, ValidationError, ContentTypeLifecycleError, CleanupNotEligibleError, } from "./errors.js";
|
|
22
|
+
/**
|
|
23
|
+
* The queryable-field index machinery. `IDENTIFIER_GRAMMAR_PATTERN` is exported because it is the
|
|
24
|
+
* single definition of the identifier grammar — the published agent-tool schemas reference it
|
|
25
|
+
* rather than restating it, and a consumer validating input ahead of a call must reach the same
|
|
26
|
+
* one. `mapFieldKindToCast`/`buildQueryableFieldIndexName` are what a host's own DDL provisioner
|
|
27
|
+
* needs in order to generate the same index names this module expects to find.
|
|
28
|
+
*/
|
|
29
|
+
export type { FieldIndexState, FieldIndexTransition } from "./index-provisioning.js";
|
|
30
|
+
export { IDENTIFIER_GRAMMAR_PATTERN, validateIdentifierGrammar, mapFieldKindToCast, buildQueryableFieldIndexName, resolveFieldIndexTransition, } from "./index-provisioning.js";
|
|
31
|
+
export type { AuthorizeFn, ContentTypeRevisionInput, ContentTypeRepoPort, IndexProvisionerPort, OutboxPort, WatermarkPort, ContentTypeWriteServiceDeps, RegisterContentTypeRequired, UpdateContentTypeFieldsRequired, } from "./write-service.js";
|
|
32
|
+
export { registerContentType, updateContentTypeFields } from "./write-service.js";
|
|
33
|
+
export type { LifecycleTransitionInput, DeprecateContentTypeRequired, ReactivateContentTypeRequired, TeardownIndexProvisionerPort, TombstoneContentTypeRequired, } from "./lifecycle.js";
|
|
34
|
+
export { deprecateContentType, reactivateContentType, tombstoneContentType, } from "./lifecycle.js";
|
|
35
|
+
export type { ContentTypeLifecycleOp, ContentTypeLifecycleHandler, LifecycleDispatchDeps, LifecycleDispatchInput, } from "./lifecycle-dispatch.js";
|
|
36
|
+
export { CONTENT_TYPE_LIFECYCLE_OP_NAMES, CONTENT_TYPE_LIFECYCLE_OPS, parseContentTypeLifecycleOp, } from "./lifecycle-dispatch.js";
|
|
37
|
+
/**
|
|
38
|
+
* Cleanup is the permanent-removal path for a tombstoned type. Both halves are gateway-mediated:
|
|
39
|
+
* this module never performs the destructive removal on its own authority, it plans and then
|
|
40
|
+
* forwards a redeemed confirmation token.
|
|
41
|
+
*/
|
|
42
|
+
export type { CleanupEligibilityCheckRepoPort, PlanCleanupGatewayPort, PlanCleanupRequired, ExecuteCleanupGatewayPort, CleanupRemovalRepoPort, ExecuteCleanupRequired, } from "./cleanup.js";
|
|
43
|
+
export { planCleanup, executeCleanup } from "./cleanup.js";
|
|
44
|
+
/**
|
|
45
|
+
* The in-memory repository and the no-op index provisioner. The latter is the correct
|
|
46
|
+
* `IndexProvisionerPort` for any store with no DDL to run (an in-memory or document backend), not
|
|
47
|
+
* merely a test double.
|
|
48
|
+
*/
|
|
49
|
+
export { InMemoryContentTypeRepo, NoopContentTypeIndexProvisioner, toContentTypeOutbox, } from "./repo.memory.js";
|
|
50
|
+
/** The agent-tool surface for this domain (see `agent-tools.ts` for what is deliberately omitted). */
|
|
51
|
+
export { contentTypesAgentToolCatalog, type AgentToolDefinition as ContentTypesAgentToolDefinition, type AgentToolSideEffect as ContentTypesAgentToolSideEffect, type AgentToolActorClassRule as ContentTypesAgentToolActorClassRule, } from "./agent-tools.js";
|
|
52
|
+
/**
|
|
53
|
+
* The agent-tool wiring for this domain.
|
|
54
|
+
*
|
|
55
|
+
* `ContentTypesToolDeps` is declared structurally rather than derived from any host's
|
|
56
|
+
* request-scoped dependency bag, which is what lets a host satisfy it by passing whatever object it
|
|
57
|
+
* already has — the shape is the contract, so no host type needs to be named here.
|
|
58
|
+
*/
|
|
59
|
+
export { buildContentTypesRegistrations, contentTypesDerivedRisk, type ContentTypesToolDeps, } from "./tool-registrations.js";
|
|
60
|
+
/**
|
|
61
|
+
* There is no SQLite adapter export here, deliberately — same reason as `../entries/index.js`.
|
|
62
|
+
*/
|
|
63
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/content-types/index.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,YAAY,EACV,oBAAoB,EACpB,mBAAmB,EACnB,iBAAiB,EACjB,iBAAiB,EACjB,kBAAkB,EAClB,kBAAkB,EAClB,MAAM,GACP,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAE9E,YAAY,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D;;;;;;GAMG;AACH,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAErB;;;;;;GAMG;AACH,YAAY,EAAE,eAAe,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAEjC,YAAY,EACV,WAAW,EACX,wBAAwB,EACxB,mBAAmB,EACnB,oBAAoB,EACpB,UAAU,EACV,aAAa,EACb,2BAA2B,EAC3B,2BAA2B,EAC3B,+BAA+B,GAChC,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAElF,YAAY,EACV,wBAAwB,EACxB,4BAA4B,EAC5B,6BAA6B,EAC7B,4BAA4B,EAC5B,4BAA4B,GAC7B,MAAM,gBAAgB,CAAC;AACxB,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAExB,YAAY,EACV,sBAAsB,EACtB,2BAA2B,EAC3B,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,yBAAyB,CAAC;AACjC,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAEjC;;;;GAIG;AACH,YAAY,EACV,+BAA+B,EAC/B,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3D;;;;GAIG;AACH,OAAO,EACL,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,sGAAsG;AACtG,OAAO,EACL,4BAA4B,EAC5B,KAAK,mBAAmB,IAAI,+BAA+B,EAC3D,KAAK,mBAAmB,IAAI,+BAA+B,EAC3D,KAAK,uBAAuB,IAAI,mCAAmC,GACpE,MAAM,kBAAkB,CAAC;AAE1B;;;;;;GAMG;AACH,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,EACvB,KAAK,oBAAoB,GAC1B,MAAM,yBAAyB,CAAC;AAEjC;;GAEG"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export { CONTENT_TYPE_FIELD_KINDS, isContentTypeFieldKind } from "./types.js";
|
|
2
|
+
export { listContentTypes } from "./list.js";
|
|
3
|
+
export { parseContentTypeFieldDefs } from "./field-defs.js";
|
|
4
|
+
/**
|
|
5
|
+
* These are exported as **values**, not types: callers catch them with `instanceof`. Because this
|
|
6
|
+
* barrel re-exports rather than redeclares, there is exactly one class object per error across
|
|
7
|
+
* every consumer. `ForbiddenError`/`VersionConflictError`/`ContentTypeNotFoundError` are this
|
|
8
|
+
* module's own and are deliberately distinct from the same-named classes on `../entries/index.js`
|
|
9
|
+
* and `../core/commands/command.js` — a consumer must catch the one it actually called into.
|
|
10
|
+
*/
|
|
11
|
+
export { ForbiddenError, InvalidKeyGrammarError, ReservedContentTypeKeyError, InvalidFieldNameGrammarError, InvalidFieldKindError, InvalidFieldShapeError, QueryableFieldCapExceededError, VersionConflictError, ContentTypeNotFoundError, ValidationError, ContentTypeLifecycleError, CleanupNotEligibleError, } from "./errors.js";
|
|
12
|
+
export { IDENTIFIER_GRAMMAR_PATTERN, validateIdentifierGrammar, mapFieldKindToCast, buildQueryableFieldIndexName, resolveFieldIndexTransition, } from "./index-provisioning.js";
|
|
13
|
+
export { registerContentType, updateContentTypeFields } from "./write-service.js";
|
|
14
|
+
export { deprecateContentType, reactivateContentType, tombstoneContentType, } from "./lifecycle.js";
|
|
15
|
+
export { CONTENT_TYPE_LIFECYCLE_OP_NAMES, CONTENT_TYPE_LIFECYCLE_OPS, parseContentTypeLifecycleOp, } from "./lifecycle-dispatch.js";
|
|
16
|
+
export { planCleanup, executeCleanup } from "./cleanup.js";
|
|
17
|
+
/**
|
|
18
|
+
* The in-memory repository and the no-op index provisioner. The latter is the correct
|
|
19
|
+
* `IndexProvisionerPort` for any store with no DDL to run (an in-memory or document backend), not
|
|
20
|
+
* merely a test double.
|
|
21
|
+
*/
|
|
22
|
+
export { InMemoryContentTypeRepo, NoopContentTypeIndexProvisioner, toContentTypeOutbox, } from "./repo.memory.js";
|
|
23
|
+
/** The agent-tool surface for this domain (see `agent-tools.ts` for what is deliberately omitted). */
|
|
24
|
+
export { contentTypesAgentToolCatalog, } from "./agent-tools.js";
|
|
25
|
+
/**
|
|
26
|
+
* The agent-tool wiring for this domain.
|
|
27
|
+
*
|
|
28
|
+
* `ContentTypesToolDeps` is declared structurally rather than derived from any host's
|
|
29
|
+
* request-scoped dependency bag, which is what lets a host satisfy it by passing whatever object it
|
|
30
|
+
* already has — the shape is the contract, so no host type needs to be named here.
|
|
31
|
+
*/
|
|
32
|
+
export { buildContentTypesRegistrations, contentTypesDerivedRisk, } from "./tool-registrations.js";
|
|
33
|
+
/**
|
|
34
|
+
* There is no SQLite adapter export here, deliberately — same reason as `../entries/index.js`.
|
|
35
|
+
*/
|
|
36
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/content-types/index.ts"],"names":[],"mappings":"AAiBA,OAAO,EAAE,wBAAwB,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AAG9E,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAE5D;;;;;;GAMG;AACH,OAAO,EACL,cAAc,EACd,sBAAsB,EACtB,2BAA2B,EAC3B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,wBAAwB,EACxB,eAAe,EACf,yBAAyB,EACzB,uBAAuB,GACxB,MAAM,aAAa,CAAC;AAUrB,OAAO,EACL,0BAA0B,EAC1B,yBAAyB,EACzB,kBAAkB,EAClB,4BAA4B,EAC5B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAajC,OAAO,EAAE,mBAAmB,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AASlF,OAAO,EACL,oBAAoB,EACpB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,gBAAgB,CAAC;AAQxB,OAAO,EACL,+BAA+B,EAC/B,0BAA0B,EAC1B,2BAA2B,GAC5B,MAAM,yBAAyB,CAAC;AAejC,OAAO,EAAE,WAAW,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAE3D;;;;GAIG;AACH,OAAO,EACL,uBAAuB,EACvB,+BAA+B,EAC/B,mBAAmB,GACpB,MAAM,kBAAkB,CAAC;AAE1B,sGAAsG;AACtG,OAAO,EACL,4BAA4B,GAI7B,MAAM,kBAAkB,CAAC;AAE1B;;;;;;GAMG;AACH,OAAO,EACL,8BAA8B,EAC9B,uBAAuB,GAExB,MAAM,yBAAyB,CAAC;AAEjC;;GAEG"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { ClockPort } from "../core/ports.js";
|
|
2
|
+
import type { AuthorizeFn, ContentTypeRepoPort, OutboxPort } from "./write-service.js";
|
|
3
|
+
import type { TeardownIndexProvisionerPort } from "./lifecycle.js";
|
|
4
|
+
import type { ActorPrincipalKind, ContentTypeRecord, Result } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* @file Content-type lifecycle `op` dispatch (the closed-union-dispatch convention,
|
|
7
|
+
* `features/settings/definitions-dispatch.ts`'s pattern reused verbatim for this domain).
|
|
8
|
+
*
|
|
9
|
+
* Purpose:
|
|
10
|
+
* The admin lifecycle route (`routes/admin/content-types/lifecycle.ts`) accepts an untrusted `op`
|
|
11
|
+
* string in the request body. Per the binding rule that any such string is narrowed to this
|
|
12
|
+
* closed 3-entry union at the parse boundary (`parseContentTypeLifecycleOp`) BEFORE any dispatch
|
|
13
|
+
* table lookup — never a raw `Record<string, Handler>` keyed by the unparsed value.
|
|
14
|
+
*/
|
|
15
|
+
export declare const CONTENT_TYPE_LIFECYCLE_OP_NAMES: readonly ["deprecate", "reactivate", "tombstone"];
|
|
16
|
+
export type ContentTypeLifecycleOp = (typeof CONTENT_TYPE_LIFECYCLE_OP_NAMES)[number];
|
|
17
|
+
/** Narrows an untrusted `op` string to {@link ContentTypeLifecycleOp}, or `null` if it isn't one. */
|
|
18
|
+
export declare function parseContentTypeLifecycleOp(op: unknown): ContentTypeLifecycleOp | null;
|
|
19
|
+
export interface LifecycleDispatchDeps {
|
|
20
|
+
repo: ContentTypeRepoPort;
|
|
21
|
+
clock: ClockPort;
|
|
22
|
+
authorize: AuthorizeFn;
|
|
23
|
+
outbox: OutboxPort;
|
|
24
|
+
indexProvisioner: TeardownIndexProvisionerPort;
|
|
25
|
+
}
|
|
26
|
+
export interface LifecycleDispatchInput {
|
|
27
|
+
workspaceId: string;
|
|
28
|
+
actorId: string;
|
|
29
|
+
key: string;
|
|
30
|
+
expectedVersion: number;
|
|
31
|
+
/** Threaded straight through to {@link LifecycleTransitionInput.principalKind} — the audit provenance stamped on the revision row. */
|
|
32
|
+
principalKind?: ActorPrincipalKind;
|
|
33
|
+
}
|
|
34
|
+
export type ContentTypeLifecycleHandler = (deps: LifecycleDispatchDeps, input: LifecycleDispatchInput) => Promise<Result<{
|
|
35
|
+
contentType: ContentTypeRecord;
|
|
36
|
+
}, Error>>;
|
|
37
|
+
export declare const CONTENT_TYPE_LIFECYCLE_OPS: Record<ContentTypeLifecycleOp, ContentTypeLifecycleHandler>;
|
|
38
|
+
//# sourceMappingURL=lifecycle-dispatch.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-dispatch.d.ts","sourceRoot":"","sources":["../../src/content-types/lifecycle-dispatch.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhF;;;;;;;;;GASG;AAEH,eAAO,MAAM,+BAA+B,mDAAoD,CAAC;AACjG,MAAM,MAAM,sBAAsB,GAAG,CAAC,OAAO,+BAA+B,CAAC,CAAC,MAAM,CAAC,CAAC;AAEtF,qGAAqG;AACrG,wBAAgB,2BAA2B,CAAC,EAAE,EAAE,OAAO,GAAG,sBAAsB,GAAG,IAAI,CAItF;AAED,MAAM,WAAW,qBAAqB;IACpC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,WAAW,CAAC;IACvB,MAAM,EAAE,UAAU,CAAC;IACnB,gBAAgB,EAAE,4BAA4B,CAAC;CAChD;AAED,MAAM,WAAW,sBAAsB;IACrC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,sIAAsI;IACtI,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAED,MAAM,MAAM,2BAA2B,GAAG,CACxC,IAAI,EAAE,qBAAqB,EAC3B,KAAK,EAAE,sBAAsB,KAC1B,OAAO,CAAC,MAAM,CAAC;IAAE,WAAW,EAAE,iBAAiB,CAAA;CAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAWhE,eAAO,MAAM,0BAA0B,EAAE,MAAM,CAAC,sBAAsB,EAAE,2BAA2B,CAGlG,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { deprecateContentType, reactivateContentType, tombstoneContentType } from "./lifecycle.js";
|
|
2
|
+
/**
|
|
3
|
+
* @file Content-type lifecycle `op` dispatch (the closed-union-dispatch convention,
|
|
4
|
+
* `features/settings/definitions-dispatch.ts`'s pattern reused verbatim for this domain).
|
|
5
|
+
*
|
|
6
|
+
* Purpose:
|
|
7
|
+
* The admin lifecycle route (`routes/admin/content-types/lifecycle.ts`) accepts an untrusted `op`
|
|
8
|
+
* string in the request body. Per the binding rule that any such string is narrowed to this
|
|
9
|
+
* closed 3-entry union at the parse boundary (`parseContentTypeLifecycleOp`) BEFORE any dispatch
|
|
10
|
+
* table lookup — never a raw `Record<string, Handler>` keyed by the unparsed value.
|
|
11
|
+
*/
|
|
12
|
+
export const CONTENT_TYPE_LIFECYCLE_OP_NAMES = ["deprecate", "reactivate", "tombstone"];
|
|
13
|
+
/** Narrows an untrusted `op` string to {@link ContentTypeLifecycleOp}, or `null` if it isn't one. */
|
|
14
|
+
export function parseContentTypeLifecycleOp(op) {
|
|
15
|
+
return typeof op === "string" && CONTENT_TYPE_LIFECYCLE_OP_NAMES.includes(op)
|
|
16
|
+
? op
|
|
17
|
+
: null;
|
|
18
|
+
}
|
|
19
|
+
/** Op name -> handler, keyed only by {@link ContentTypeLifecycleOp}, `Object.create(null)`-based
|
|
20
|
+
* (defense-in-depth against a prototype-chain key ever resolving, matching the settings
|
|
21
|
+
* dispatch table's own convention). */
|
|
22
|
+
const contentTypeLifecycleOps = {
|
|
23
|
+
deprecate: (deps, input) => deprecateContentType({ deps, input }),
|
|
24
|
+
reactivate: (deps, input) => reactivateContentType({ deps: { repo: deps.repo, clock: deps.clock, authorize: deps.authorize }, input }),
|
|
25
|
+
tombstone: (deps, input) => tombstoneContentType({ deps, input }),
|
|
26
|
+
};
|
|
27
|
+
export const CONTENT_TYPE_LIFECYCLE_OPS = Object.assign(Object.create(null), contentTypeLifecycleOps);
|
|
28
|
+
//# sourceMappingURL=lifecycle-dispatch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle-dispatch.js","sourceRoot":"","sources":["../../src/content-types/lifecycle-dispatch.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,gBAAgB,CAAC;AAKnG;;;;;;;;;GASG;AAEH,MAAM,CAAC,MAAM,+BAA+B,GAAG,CAAC,WAAW,EAAE,YAAY,EAAE,WAAW,CAAU,CAAC;AAGjG,qGAAqG;AACrG,MAAM,UAAU,2BAA2B,CAAC,EAAW;IACrD,OAAO,OAAO,EAAE,KAAK,QAAQ,IAAK,+BAAqD,CAAC,QAAQ,CAAC,EAAE,CAAC;QAClG,CAAC,CAAE,EAA6B;QAChC,CAAC,CAAC,IAAI,CAAC;AACX,CAAC;AAwBD;;uCAEuC;AACvC,MAAM,uBAAuB,GAAG;IAC9B,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;IACjE,UAAU,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,EAAE,KAAK,EAAE,CAAC;IACtI,SAAS,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC;CACI,CAAC;AAExE,MAAM,CAAC,MAAM,0BAA0B,GAAgE,MAAM,CAAC,MAAM,CAClH,MAAM,CAAC,MAAM,CAAC,IAAI,CAAgE,EAClF,uBAAuB,CACxB,CAAC"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import type { ClockPort } from "../core/ports.js";
|
|
2
|
+
import type { AuthorizeFn, ContentTypeRepoPort, OutboxPort } from "./write-service.js";
|
|
3
|
+
import type { ActorPrincipalKind, ContentTypeRecord, Result } from "./types.js";
|
|
4
|
+
/**
|
|
5
|
+
* @file REQ-09..12 — the content-type lifecycle state machine `active ⇄ deprecated ->
|
|
6
|
+
* tombstone` (INV-06).
|
|
7
|
+
*
|
|
8
|
+
* Purpose:
|
|
9
|
+
* `deprecateContentType`/`reactivateContentType` are the reversible `active <-> deprecated` pair
|
|
10
|
+
* (deprecate blocks new-entry creation only, per REQ-10/REQ-28's asymmetry — existing entries stay
|
|
11
|
+
* fully readable/writable). `tombstoneContentType` is the one-way terminal transition: it MUST be
|
|
12
|
+
* entered from `deprecated` (EC-09, "must deprecate first") and never left (INV-06) — both
|
|
13
|
+
* `reactivateContentType` and `deprecateContentType` reject unconditionally against a tombstoned
|
|
14
|
+
* row (the property `operationTests INV-06` case). Tombstoning tears down every queryable-field
|
|
15
|
+
* index the type ever provisioned (AC-17) and enqueues the same-call outbox event
|
|
16
|
+
* required for `content_type.deprecated`/`content_type.tombstoned`.
|
|
17
|
+
*
|
|
18
|
+
* How it relates to the project:
|
|
19
|
+
* `reactivateContentType` deliberately does not accept `outbox`/`indexProvisioner` deps — no
|
|
20
|
+
* certified test requires a reactivation event or index reprovisioning on this transition, and
|
|
21
|
+
* REQ-09..12 name only deprecate/tombstone as outbox-obligated.
|
|
22
|
+
*
|
|
23
|
+
* Architectural role:
|
|
24
|
+
* `features/content-types` domain logic, composing `write-service.ts`'s repo/outbox/index-
|
|
25
|
+
* provisioner port shapes rather than redeclaring them.
|
|
26
|
+
*/
|
|
27
|
+
export interface LifecycleTransitionInput {
|
|
28
|
+
workspaceId: string;
|
|
29
|
+
actorId: string;
|
|
30
|
+
key: string;
|
|
31
|
+
expectedVersion: number;
|
|
32
|
+
/** Audit provenance stamped onto this transition's revision row — see `types.ts`'s `ActorIdentityInput.principalKind`. */
|
|
33
|
+
principalKind?: ActorPrincipalKind;
|
|
34
|
+
}
|
|
35
|
+
export interface DeprecateContentTypeRequired {
|
|
36
|
+
deps: {
|
|
37
|
+
repo: ContentTypeRepoPort;
|
|
38
|
+
clock: ClockPort;
|
|
39
|
+
authorize: AuthorizeFn;
|
|
40
|
+
outbox: OutboxPort;
|
|
41
|
+
};
|
|
42
|
+
input: LifecycleTransitionInput;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* AC-13/AC-19 — flips an active type to `deprecated` (blocks only NEW entry creation, REQ-10) and
|
|
46
|
+
* enqueues `content_type.deprecated` in the same call. Rejected unconditionally (INV-06) if the
|
|
47
|
+
* type is already `tombstone` — deprecate can never be used to "step back" out of tombstone.
|
|
48
|
+
*
|
|
49
|
+
* @complexity O(1) plus one repo read, one same-tx write pair, and one outbox enqueue.
|
|
50
|
+
* @overallScore 100
|
|
51
|
+
*/
|
|
52
|
+
export declare function deprecateContentType(required: DeprecateContentTypeRequired): Promise<Result<{
|
|
53
|
+
contentType: ContentTypeRecord;
|
|
54
|
+
}, Error>>;
|
|
55
|
+
export interface ReactivateContentTypeRequired {
|
|
56
|
+
deps: {
|
|
57
|
+
repo: ContentTypeRepoPort;
|
|
58
|
+
clock: ClockPort;
|
|
59
|
+
authorize: AuthorizeFn;
|
|
60
|
+
};
|
|
61
|
+
input: LifecycleTransitionInput;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* AC-13 — flips a `deprecated` (or already-`active`, a no-op-shaped success) type back to
|
|
65
|
+
* `active`. Rejected unconditionally (AC-14/INV-06) against a tombstoned row.
|
|
66
|
+
*
|
|
67
|
+
* @complexity O(1) plus one repo read and one same-tx write pair.
|
|
68
|
+
* @overallScore 100
|
|
69
|
+
*/
|
|
70
|
+
export declare function reactivateContentType(required: ReactivateContentTypeRequired): Promise<Result<{
|
|
71
|
+
contentType: ContentTypeRecord;
|
|
72
|
+
}, Error>>;
|
|
73
|
+
/** The one index-provisioner method the tombstone transition needs — a narrower port than `write-service.ts`'s registration-time `IndexProvisionerPort`. */
|
|
74
|
+
export interface TeardownIndexProvisionerPort {
|
|
75
|
+
tearDownAllIndexesForContentType(input: {
|
|
76
|
+
workspaceId: string;
|
|
77
|
+
contentTypeKey: string;
|
|
78
|
+
}): Promise<void>;
|
|
79
|
+
}
|
|
80
|
+
export interface TombstoneContentTypeRequired {
|
|
81
|
+
deps: {
|
|
82
|
+
repo: ContentTypeRepoPort;
|
|
83
|
+
clock: ClockPort;
|
|
84
|
+
authorize: AuthorizeFn;
|
|
85
|
+
outbox: OutboxPort;
|
|
86
|
+
indexProvisioner: TeardownIndexProvisionerPort;
|
|
87
|
+
};
|
|
88
|
+
input: LifecycleTransitionInput;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* AC-17/AC-20/EC-09 — the one-way terminal transition into `tombstone`. Must be entered from
|
|
92
|
+
* `deprecated` (any other status, including an already-tombstoned row, is rejected with the same
|
|
93
|
+
* "must deprecate first" guard — EC-09/INV-06 collapse to one check). Tears down every queryable-
|
|
94
|
+
* field index the type ever provisioned BEFORE persisting the status flip, and enqueues
|
|
95
|
+
* `content_type.tombstoned` in the same call.
|
|
96
|
+
*
|
|
97
|
+
* @complexity O(1) plus one repo read, one index-teardown call, one same-tx write pair, and one
|
|
98
|
+
* outbox enqueue.
|
|
99
|
+
* @overallScore 100
|
|
100
|
+
*/
|
|
101
|
+
export declare function tombstoneContentType(required: TombstoneContentTypeRequired): Promise<Result<{
|
|
102
|
+
contentType: ContentTypeRecord;
|
|
103
|
+
}, Error>>;
|
|
104
|
+
//# sourceMappingURL=lifecycle.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.d.ts","sourceRoot":"","sources":["../../src/content-types/lifecycle.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD,OAAO,KAAK,EAAE,WAAW,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACvF,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAEhF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,MAAM,WAAW,wBAAwB;IACvC,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,eAAe,EAAE,MAAM,CAAC;IACxB,0HAA0H;IAC1H,aAAa,CAAC,EAAE,kBAAkB,CAAC;CACpC;AAcD,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,UAAU,CAAA;KAAE,CAAC;IAClG,KAAK,EAAE,wBAAwB,CAAC;CACjC;AAED;;;;;;;GAOG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,4BAA4B,GACrC,OAAO,CAAC,MAAM,CAAC;IAAE,WAAW,EAAE,iBAAiB,CAAA;CAAE,EAAE,KAAK,CAAC,CAAC,CAwC5D;AAED,MAAM,WAAW,6BAA6B;IAC5C,IAAI,EAAE;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,WAAW,CAAA;KAAE,CAAC;IAC9E,KAAK,EAAE,wBAAwB,CAAC;CACjC;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,6BAA6B,GACtC,OAAO,CAAC,MAAM,CAAC;IAAE,WAAW,EAAE,iBAAiB,CAAA;CAAE,EAAE,KAAK,CAAC,CAAC,CAsC5D;AAED,4JAA4J;AAC5J,MAAM,WAAW,4BAA4B;IAC3C,gCAAgC,CAAC,KAAK,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,cAAc,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACzG;AAED,MAAM,WAAW,4BAA4B;IAC3C,IAAI,EAAE;QAAE,IAAI,EAAE,mBAAmB,CAAC;QAAC,KAAK,EAAE,SAAS,CAAC;QAAC,SAAS,EAAE,WAAW,CAAC;QAAC,MAAM,EAAE,UAAU,CAAC;QAAC,gBAAgB,EAAE,4BAA4B,CAAA;KAAE,CAAC;IAClJ,KAAK,EAAE,wBAAwB,CAAC;CACjC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,oBAAoB,CACxC,QAAQ,EAAE,4BAA4B,GACrC,OAAO,CAAC,MAAM,CAAC;IAAE,WAAW,EAAE,iBAAiB,CAAA;CAAE,EAAE,KAAK,CAAC,CAAC,CA+C5D"}
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { ContentTypeLifecycleError, ContentTypeNotFoundError, ForbiddenError, VersionConflictError } from "./errors.js";
|
|
2
|
+
async function resolveActiveOrDeprecated(repo, workspaceId, key) {
|
|
3
|
+
const current = await repo.findByKey({ workspaceId, key });
|
|
4
|
+
if (!current) {
|
|
5
|
+
return { ok: false, error: new ContentTypeNotFoundError(`content type '${key}' was not found in workspace '${workspaceId}'`) };
|
|
6
|
+
}
|
|
7
|
+
return { ok: true, value: current };
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* AC-13/AC-19 — flips an active type to `deprecated` (blocks only NEW entry creation, REQ-10) and
|
|
11
|
+
* enqueues `content_type.deprecated` in the same call. Rejected unconditionally (INV-06) if the
|
|
12
|
+
* type is already `tombstone` — deprecate can never be used to "step back" out of tombstone.
|
|
13
|
+
*
|
|
14
|
+
* @complexity O(1) plus one repo read, one same-tx write pair, and one outbox enqueue.
|
|
15
|
+
* @overallScore 100
|
|
16
|
+
*/
|
|
17
|
+
export async function deprecateContentType(required) {
|
|
18
|
+
const { deps, input } = required;
|
|
19
|
+
const authResult = await deps.authorize({ principalId: input.actorId, permission: "admin.collections.manage", workspaceId: input.workspaceId });
|
|
20
|
+
if (!authResult.allowed) {
|
|
21
|
+
return { ok: false, error: new ForbiddenError(`principal '${input.actorId}' cannot deprecate content type '${input.key}' (${authResult.reason})`) };
|
|
22
|
+
}
|
|
23
|
+
const resolved = await resolveActiveOrDeprecated(deps.repo, input.workspaceId, input.key);
|
|
24
|
+
if (!resolved.ok)
|
|
25
|
+
return resolved;
|
|
26
|
+
const current = resolved.value;
|
|
27
|
+
if (current.status === "tombstone") {
|
|
28
|
+
return { ok: false, error: new ContentTypeLifecycleError(`content type '${input.key}' is tombstoned; INV-06 forbids any transition out of tombstone`) };
|
|
29
|
+
}
|
|
30
|
+
if (input.expectedVersion !== current.version) {
|
|
31
|
+
return { ok: false, error: new VersionConflictError(`expected version ${input.expectedVersion} for content type '${input.key}', found ${current.version}`) };
|
|
32
|
+
}
|
|
33
|
+
const now = deps.clock.nowIso();
|
|
34
|
+
const updated = { ...current, status: "deprecated", version: current.version + 1 };
|
|
35
|
+
await deps.repo.transaction(async () => {
|
|
36
|
+
await deps.repo.save(updated);
|
|
37
|
+
await deps.repo.appendRevision({
|
|
38
|
+
contentTypeKey: input.key,
|
|
39
|
+
workspaceId: input.workspaceId,
|
|
40
|
+
op: "field-change",
|
|
41
|
+
stateJson: updated,
|
|
42
|
+
actorId: input.actorId,
|
|
43
|
+
principalKind: input.principalKind ?? null,
|
|
44
|
+
delegatedByWorkspaceId: null,
|
|
45
|
+
delegatedById: null,
|
|
46
|
+
recordedAt: now,
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
await deps.outbox.enqueue({ name: "content_type.deprecated", payload: { workspaceId: input.workspaceId, key: input.key } });
|
|
50
|
+
return { ok: true, value: { contentType: updated } };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* AC-13 — flips a `deprecated` (or already-`active`, a no-op-shaped success) type back to
|
|
54
|
+
* `active`. Rejected unconditionally (AC-14/INV-06) against a tombstoned row.
|
|
55
|
+
*
|
|
56
|
+
* @complexity O(1) plus one repo read and one same-tx write pair.
|
|
57
|
+
* @overallScore 100
|
|
58
|
+
*/
|
|
59
|
+
export async function reactivateContentType(required) {
|
|
60
|
+
const { deps, input } = required;
|
|
61
|
+
const authResult = await deps.authorize({ principalId: input.actorId, permission: "admin.collections.manage", workspaceId: input.workspaceId });
|
|
62
|
+
if (!authResult.allowed) {
|
|
63
|
+
return { ok: false, error: new ForbiddenError(`principal '${input.actorId}' cannot reactivate content type '${input.key}' (${authResult.reason})`) };
|
|
64
|
+
}
|
|
65
|
+
const resolved = await resolveActiveOrDeprecated(deps.repo, input.workspaceId, input.key);
|
|
66
|
+
if (!resolved.ok)
|
|
67
|
+
return resolved;
|
|
68
|
+
const current = resolved.value;
|
|
69
|
+
if (current.status === "tombstone") {
|
|
70
|
+
return { ok: false, error: new ContentTypeLifecycleError(`content type '${input.key}' is tombstoned; INV-06 forbids any transition out of tombstone`) };
|
|
71
|
+
}
|
|
72
|
+
if (input.expectedVersion !== current.version) {
|
|
73
|
+
return { ok: false, error: new VersionConflictError(`expected version ${input.expectedVersion} for content type '${input.key}', found ${current.version}`) };
|
|
74
|
+
}
|
|
75
|
+
const now = deps.clock.nowIso();
|
|
76
|
+
const updated = { ...current, status: "active", version: current.version + 1 };
|
|
77
|
+
await deps.repo.transaction(async () => {
|
|
78
|
+
await deps.repo.save(updated);
|
|
79
|
+
await deps.repo.appendRevision({
|
|
80
|
+
contentTypeKey: input.key,
|
|
81
|
+
workspaceId: input.workspaceId,
|
|
82
|
+
op: "field-change",
|
|
83
|
+
stateJson: updated,
|
|
84
|
+
actorId: input.actorId,
|
|
85
|
+
principalKind: input.principalKind ?? null,
|
|
86
|
+
delegatedByWorkspaceId: null,
|
|
87
|
+
delegatedById: null,
|
|
88
|
+
recordedAt: now,
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
return { ok: true, value: { contentType: updated } };
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* AC-17/AC-20/EC-09 — the one-way terminal transition into `tombstone`. Must be entered from
|
|
95
|
+
* `deprecated` (any other status, including an already-tombstoned row, is rejected with the same
|
|
96
|
+
* "must deprecate first" guard — EC-09/INV-06 collapse to one check). Tears down every queryable-
|
|
97
|
+
* field index the type ever provisioned BEFORE persisting the status flip, and enqueues
|
|
98
|
+
* `content_type.tombstoned` in the same call.
|
|
99
|
+
*
|
|
100
|
+
* @complexity O(1) plus one repo read, one index-teardown call, one same-tx write pair, and one
|
|
101
|
+
* outbox enqueue.
|
|
102
|
+
* @overallScore 100
|
|
103
|
+
*/
|
|
104
|
+
export async function tombstoneContentType(required) {
|
|
105
|
+
const { deps, input } = required;
|
|
106
|
+
const authResult = await deps.authorize({ principalId: input.actorId, permission: "admin.collections.manage", workspaceId: input.workspaceId });
|
|
107
|
+
if (!authResult.allowed) {
|
|
108
|
+
return { ok: false, error: new ForbiddenError(`principal '${input.actorId}' cannot tombstone content type '${input.key}' (${authResult.reason})`) };
|
|
109
|
+
}
|
|
110
|
+
const resolved = await resolveActiveOrDeprecated(deps.repo, input.workspaceId, input.key);
|
|
111
|
+
if (!resolved.ok)
|
|
112
|
+
return resolved;
|
|
113
|
+
const current = resolved.value;
|
|
114
|
+
if (current.status !== "deprecated") {
|
|
115
|
+
return {
|
|
116
|
+
ok: false,
|
|
117
|
+
error: new ContentTypeLifecycleError(`content type '${input.key}' must be 'deprecated' before it can be tombstoned (EC-09); current status is '${current.status}'`),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
if (input.expectedVersion !== current.version) {
|
|
121
|
+
return { ok: false, error: new VersionConflictError(`expected version ${input.expectedVersion} for content type '${input.key}', found ${current.version}`) };
|
|
122
|
+
}
|
|
123
|
+
const now = deps.clock.nowIso();
|
|
124
|
+
const updated = { ...current, status: "tombstone", tombstonedAt: now, version: current.version + 1 };
|
|
125
|
+
await deps.indexProvisioner.tearDownAllIndexesForContentType({ workspaceId: input.workspaceId, contentTypeKey: input.key });
|
|
126
|
+
await deps.repo.transaction(async () => {
|
|
127
|
+
await deps.repo.save(updated);
|
|
128
|
+
await deps.repo.appendRevision({
|
|
129
|
+
contentTypeKey: input.key,
|
|
130
|
+
workspaceId: input.workspaceId,
|
|
131
|
+
op: "field-change",
|
|
132
|
+
stateJson: updated,
|
|
133
|
+
actorId: input.actorId,
|
|
134
|
+
principalKind: input.principalKind ?? null,
|
|
135
|
+
delegatedByWorkspaceId: null,
|
|
136
|
+
delegatedById: null,
|
|
137
|
+
recordedAt: now,
|
|
138
|
+
});
|
|
139
|
+
});
|
|
140
|
+
await deps.outbox.enqueue({ name: "content_type.tombstoned", payload: { workspaceId: input.workspaceId, key: input.key } });
|
|
141
|
+
return { ok: true, value: { contentType: updated } };
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=lifecycle.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lifecycle.js","sourceRoot":"","sources":["../../src/content-types/lifecycle.ts"],"names":[],"mappings":"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"}
|