@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,65 @@
|
|
|
1
|
+
import { CleanupNotEligibleError } from "./errors.js";
|
|
2
|
+
const RETENTION_WINDOW_MS = 30 * 24 * 60 * 60 * 1000;
|
|
3
|
+
/**
|
|
4
|
+
* REQ-20 — the fixed-order eligibility gate: `status==='tombstone'` -> retention window elapsed
|
|
5
|
+
* (>=30 days since `tombstonedAt`, inclusive lower bound) -> `exportReference` present. Only once
|
|
6
|
+
* all three pass does this call reach the real `gateway.plan()`.
|
|
7
|
+
*
|
|
8
|
+
* @complexity O(1) — one repo read, one date diff, one delegated gateway call at most.
|
|
9
|
+
* @overallScore 100
|
|
10
|
+
*/
|
|
11
|
+
export async function planCleanup(required) {
|
|
12
|
+
const { deps, input } = required;
|
|
13
|
+
const authResult = await deps.authorize({ principalId: input.actorId, permission: "admin.collections.read", workspaceId: input.workspaceId });
|
|
14
|
+
if (!authResult.allowed) {
|
|
15
|
+
return { ok: false, error: new CleanupNotEligibleError("forbidden", `principal '${input.actorId}' is not authorized to plan a cleanup (${authResult.reason})`) };
|
|
16
|
+
}
|
|
17
|
+
const contentType = await deps.repo.findByKey({ workspaceId: input.workspaceId, key: input.contentTypeKey });
|
|
18
|
+
if (!contentType || contentType.status !== "tombstone") {
|
|
19
|
+
return { ok: false, error: new CleanupNotEligibleError("not_tombstoned") };
|
|
20
|
+
}
|
|
21
|
+
const now = deps.clock.nowIso();
|
|
22
|
+
const elapsedMs = new Date(now).getTime() - new Date(contentType.tombstonedAt ?? now).getTime();
|
|
23
|
+
if (elapsedMs < RETENTION_WINDOW_MS) {
|
|
24
|
+
return { ok: false, error: new CleanupNotEligibleError("retention_window_not_elapsed") };
|
|
25
|
+
}
|
|
26
|
+
if (!input.exportReference) {
|
|
27
|
+
return { ok: false, error: new CleanupNotEligibleError("export_reference_missing") };
|
|
28
|
+
}
|
|
29
|
+
const planResult = await deps.gateway.plan({
|
|
30
|
+
principalId: input.actorId,
|
|
31
|
+
workspaceId: input.workspaceId,
|
|
32
|
+
contentTypeKey: input.contentTypeKey,
|
|
33
|
+
domain: "collections",
|
|
34
|
+
action: "cleanup",
|
|
35
|
+
});
|
|
36
|
+
if (!planResult.ok) {
|
|
37
|
+
return { ok: false, error: new CleanupNotEligibleError("gateway_rejected", String(planResult.error)) };
|
|
38
|
+
}
|
|
39
|
+
return { ok: true, value: planResult.value };
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* REQ-21/INV-07 — forwards straight to the gated-mutation gateway's own `execute()`; only once
|
|
43
|
+
* that confirms (token redeemed, actor-class checked, plan still fresh) does this function perform
|
|
44
|
+
* the actual atomic multi-table removal. A gateway rejection (expired/already-redeemed token,
|
|
45
|
+
* stale plan) is forwarded verbatim and no local removal is ever attempted (EC-10).
|
|
46
|
+
*
|
|
47
|
+
* @complexity O(1) plus one delegated gateway call and, on success, one same-tx multi-table
|
|
48
|
+
* removal.
|
|
49
|
+
* @overallScore 100
|
|
50
|
+
*/
|
|
51
|
+
export async function executeCleanup(required) {
|
|
52
|
+
const { deps, input } = required;
|
|
53
|
+
const gatewayResult = await deps.gateway.execute({
|
|
54
|
+
principalId: input.principalId,
|
|
55
|
+
principalKind: input.principalKind,
|
|
56
|
+
confirmationToken: input.confirmationToken,
|
|
57
|
+
contentTypeKey: input.contentTypeKey,
|
|
58
|
+
});
|
|
59
|
+
if (!gatewayResult.ok) {
|
|
60
|
+
return gatewayResult;
|
|
61
|
+
}
|
|
62
|
+
const removal = await deps.repo.transaction(async () => deps.repo.removeContentTypeAndAllScopedRows({ contentTypeKey: input.contentTypeKey }));
|
|
63
|
+
return { ok: true, value: removal };
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=cleanup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cleanup.js","sourceRoot":"","sources":["../../src/content-types/cleanup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Typed error surface for the `content-types` package.
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* Every rejection this package's write-service/lifecycle/cleanup/index-provisioning modules
|
|
6
|
+
* produce is one of these classes, never a bare `Error`/string, so callers (routes, agent tools,
|
|
7
|
+
* tests) can branch on `instanceof` or on `.name` without parsing a message.
|
|
8
|
+
*
|
|
9
|
+
* `class X extends Error {}` does NOT give an instance a `.name` of `"X"` on this runtime unless
|
|
10
|
+
* the constructor sets `this.name` explicitly (confirmed empirically in Session 2 of this
|
|
11
|
+
* workstream) — every class below sets it.
|
|
12
|
+
*
|
|
13
|
+
* Architectural role:
|
|
14
|
+
* `features/content-types` domain logic. No dependencies.
|
|
15
|
+
*/
|
|
16
|
+
export declare class ForbiddenError extends Error {
|
|
17
|
+
constructor(message: string);
|
|
18
|
+
}
|
|
19
|
+
/** CIC U-002-B1 guard 1 — `key`/field-name grammar gate `^[a-z][a-z0-9_]{0,63}$` (U-001-B2). */
|
|
20
|
+
export declare class InvalidKeyGrammarError extends Error {
|
|
21
|
+
constructor(message: string);
|
|
22
|
+
}
|
|
23
|
+
/** CIC U-002-B1 guard 2 — `key` is one of the permanently reserved legacy `posts` keys. */
|
|
24
|
+
export declare class ReservedContentTypeKeyError extends Error {
|
|
25
|
+
constructor(message: string);
|
|
26
|
+
}
|
|
27
|
+
/** CIC U-002-B1 guard 3 — a field name fails the identifier grammar gate. */
|
|
28
|
+
export declare class InvalidFieldNameGrammarError extends Error {
|
|
29
|
+
constructor(message: string);
|
|
30
|
+
}
|
|
31
|
+
/** CIC U-001-B1 / U-002-B1 guard 4 — a field `kind` is not one of the closed 5-entry enum. */
|
|
32
|
+
export declare class InvalidFieldKindError extends Error {
|
|
33
|
+
constructor(message: string);
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* A `fields` payload whose STRUCTURE is wrong — not a value that failed a domain rule, but a
|
|
37
|
+
* shape the `ContentTypeFieldDef[]` contract does not describe at all (a non-array, a non-object
|
|
38
|
+
* element, a missing/mistyped `name`/`required`/`queryable`, or an unrecognized key).
|
|
39
|
+
*
|
|
40
|
+
* Distinct from the five CIC U-002-B1 guard errors on purpose: those judge a well-formed field
|
|
41
|
+
* definition against a domain rule, and they remain the sole owners of the grammar, kind-enum and
|
|
42
|
+
* queryable-cap decisions. This one fires strictly earlier, at the untrusted-input boundary
|
|
43
|
+
* (`field-defs.ts`), for payloads the guards could not have judged without either crashing or
|
|
44
|
+
* silently persisting a value of the wrong type.
|
|
45
|
+
*
|
|
46
|
+
* `violation.received` names the offending value's TYPE, never the value — a field payload can
|
|
47
|
+
* carry operator content, and this message reaches both an HTTP client and a model.
|
|
48
|
+
*/
|
|
49
|
+
export declare class InvalidFieldShapeError extends Error {
|
|
50
|
+
readonly code: "VALIDATION_ERROR";
|
|
51
|
+
readonly violation: {
|
|
52
|
+
path: string;
|
|
53
|
+
expected: string;
|
|
54
|
+
received: string;
|
|
55
|
+
};
|
|
56
|
+
constructor(violation: {
|
|
57
|
+
path: string;
|
|
58
|
+
expected: string;
|
|
59
|
+
received: string;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
/** CIC U-002-B1 guard 5 — more than the per-type cap of `queryable` fields were submitted. */
|
|
63
|
+
export declare class QueryableFieldCapExceededError extends Error {
|
|
64
|
+
constructor(message: string);
|
|
65
|
+
}
|
|
66
|
+
/** CIC U-004-B1 — `expectedVersion` did not match the current row's version (OCC conflict). */
|
|
67
|
+
export declare class VersionConflictError extends Error {
|
|
68
|
+
constructor(message: string);
|
|
69
|
+
}
|
|
70
|
+
export declare class ContentTypeNotFoundError extends Error {
|
|
71
|
+
constructor(message: string);
|
|
72
|
+
}
|
|
73
|
+
/** A generic validation rejection carrying a stable machine-readable `details.reason`. */
|
|
74
|
+
export declare class ValidationError extends Error {
|
|
75
|
+
readonly code: "VALIDATION_ERROR";
|
|
76
|
+
readonly details: {
|
|
77
|
+
reason: string;
|
|
78
|
+
};
|
|
79
|
+
constructor(message: string, reason: string);
|
|
80
|
+
}
|
|
81
|
+
/** REQ-09..12 lifecycle state-machine guard rejection (INV-06 terminal-tombstone, EC-09 deprecate-first). */
|
|
82
|
+
export declare class ContentTypeLifecycleError extends Error {
|
|
83
|
+
constructor(message: string);
|
|
84
|
+
}
|
|
85
|
+
/** REQ-20 `planCleanup` eligibility-gate rejection; `reason` is one of a closed, ordered set. */
|
|
86
|
+
export declare class CleanupNotEligibleError extends Error {
|
|
87
|
+
readonly reason: string;
|
|
88
|
+
constructor(reason: string, message?: string);
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../src/content-types/errors.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAI5B;AAED,gGAAgG;AAChG,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,OAAO,EAAE,MAAM;CAI5B;AAED,2FAA2F;AAC3F,qBAAa,2BAA4B,SAAQ,KAAK;gBACxC,OAAO,EAAE,MAAM;CAI5B;AAED,6EAA6E;AAC7E,qBAAa,4BAA6B,SAAQ,KAAK;gBACzC,OAAO,EAAE,MAAM;CAI5B;AAED,8FAA8F;AAC9F,qBAAa,qBAAsB,SAAQ,KAAK;gBAClC,OAAO,EAAE,MAAM;CAI5B;AAED;;;;;;;;;;;;;GAaG;AACH,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;IAC5C,QAAQ,CAAC,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,CAAC;gBAE7D,SAAS,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;CAK5E;AAED,8FAA8F;AAC9F,qBAAa,8BAA+B,SAAQ,KAAK;gBAC3C,OAAO,EAAE,MAAM;CAI5B;AAED,+FAA+F;AAC/F,qBAAa,oBAAqB,SAAQ,KAAK;gBACjC,OAAO,EAAE,MAAM;CAI5B;AAED,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,OAAO,EAAE,MAAM;CAI5B;AAED,0FAA0F;AAC1F,qBAAa,eAAgB,SAAQ,KAAK;IACxC,QAAQ,CAAC,IAAI,EAAG,kBAAkB,CAAU;IAC5C,QAAQ,CAAC,OAAO,EAAE;QAAE,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;gBAEzB,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;CAK5C;AAED,6GAA6G;AAC7G,qBAAa,yBAA0B,SAAQ,KAAK;gBACtC,OAAO,EAAE,MAAM;CAI5B;AAED,iGAAiG;AACjG,qBAAa,uBAAwB,SAAQ,KAAK;IAChD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEZ,MAAM,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAK7C"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Typed error surface for the `content-types` package.
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* Every rejection this package's write-service/lifecycle/cleanup/index-provisioning modules
|
|
6
|
+
* produce is one of these classes, never a bare `Error`/string, so callers (routes, agent tools,
|
|
7
|
+
* tests) can branch on `instanceof` or on `.name` without parsing a message.
|
|
8
|
+
*
|
|
9
|
+
* `class X extends Error {}` does NOT give an instance a `.name` of `"X"` on this runtime unless
|
|
10
|
+
* the constructor sets `this.name` explicitly (confirmed empirically in Session 2 of this
|
|
11
|
+
* workstream) — every class below sets it.
|
|
12
|
+
*
|
|
13
|
+
* Architectural role:
|
|
14
|
+
* `features/content-types` domain logic. No dependencies.
|
|
15
|
+
*/
|
|
16
|
+
export class ForbiddenError extends Error {
|
|
17
|
+
constructor(message) {
|
|
18
|
+
super(message);
|
|
19
|
+
this.name = "ForbiddenError";
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
/** CIC U-002-B1 guard 1 — `key`/field-name grammar gate `^[a-z][a-z0-9_]{0,63}$` (U-001-B2). */
|
|
23
|
+
export class InvalidKeyGrammarError extends Error {
|
|
24
|
+
constructor(message) {
|
|
25
|
+
super(message);
|
|
26
|
+
this.name = "InvalidKeyGrammarError";
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/** CIC U-002-B1 guard 2 — `key` is one of the permanently reserved legacy `posts` keys. */
|
|
30
|
+
export class ReservedContentTypeKeyError extends Error {
|
|
31
|
+
constructor(message) {
|
|
32
|
+
super(message);
|
|
33
|
+
this.name = "ReservedContentTypeKeyError";
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
/** CIC U-002-B1 guard 3 — a field name fails the identifier grammar gate. */
|
|
37
|
+
export class InvalidFieldNameGrammarError extends Error {
|
|
38
|
+
constructor(message) {
|
|
39
|
+
super(message);
|
|
40
|
+
this.name = "InvalidFieldNameGrammarError";
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
/** CIC U-001-B1 / U-002-B1 guard 4 — a field `kind` is not one of the closed 5-entry enum. */
|
|
44
|
+
export class InvalidFieldKindError extends Error {
|
|
45
|
+
constructor(message) {
|
|
46
|
+
super(message);
|
|
47
|
+
this.name = "InvalidFieldKindError";
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* A `fields` payload whose STRUCTURE is wrong — not a value that failed a domain rule, but a
|
|
52
|
+
* shape the `ContentTypeFieldDef[]` contract does not describe at all (a non-array, a non-object
|
|
53
|
+
* element, a missing/mistyped `name`/`required`/`queryable`, or an unrecognized key).
|
|
54
|
+
*
|
|
55
|
+
* Distinct from the five CIC U-002-B1 guard errors on purpose: those judge a well-formed field
|
|
56
|
+
* definition against a domain rule, and they remain the sole owners of the grammar, kind-enum and
|
|
57
|
+
* queryable-cap decisions. This one fires strictly earlier, at the untrusted-input boundary
|
|
58
|
+
* (`field-defs.ts`), for payloads the guards could not have judged without either crashing or
|
|
59
|
+
* silently persisting a value of the wrong type.
|
|
60
|
+
*
|
|
61
|
+
* `violation.received` names the offending value's TYPE, never the value — a field payload can
|
|
62
|
+
* carry operator content, and this message reaches both an HTTP client and a model.
|
|
63
|
+
*/
|
|
64
|
+
export class InvalidFieldShapeError extends Error {
|
|
65
|
+
code = "VALIDATION_ERROR";
|
|
66
|
+
violation;
|
|
67
|
+
constructor(violation) {
|
|
68
|
+
super(`${violation.path} must be ${violation.expected}, received ${violation.received}`);
|
|
69
|
+
this.name = "InvalidFieldShapeError";
|
|
70
|
+
this.violation = violation;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/** CIC U-002-B1 guard 5 — more than the per-type cap of `queryable` fields were submitted. */
|
|
74
|
+
export class QueryableFieldCapExceededError extends Error {
|
|
75
|
+
constructor(message) {
|
|
76
|
+
super(message);
|
|
77
|
+
this.name = "QueryableFieldCapExceededError";
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/** CIC U-004-B1 — `expectedVersion` did not match the current row's version (OCC conflict). */
|
|
81
|
+
export class VersionConflictError extends Error {
|
|
82
|
+
constructor(message) {
|
|
83
|
+
super(message);
|
|
84
|
+
this.name = "VersionConflictError";
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
export class ContentTypeNotFoundError extends Error {
|
|
88
|
+
constructor(message) {
|
|
89
|
+
super(message);
|
|
90
|
+
this.name = "CONTENT_TYPE_NOT_FOUND";
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
/** A generic validation rejection carrying a stable machine-readable `details.reason`. */
|
|
94
|
+
export class ValidationError extends Error {
|
|
95
|
+
code = "VALIDATION_ERROR";
|
|
96
|
+
details;
|
|
97
|
+
constructor(message, reason) {
|
|
98
|
+
super(message);
|
|
99
|
+
this.name = "VALIDATION_ERROR";
|
|
100
|
+
this.details = { reason };
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
/** REQ-09..12 lifecycle state-machine guard rejection (INV-06 terminal-tombstone, EC-09 deprecate-first). */
|
|
104
|
+
export class ContentTypeLifecycleError extends Error {
|
|
105
|
+
constructor(message) {
|
|
106
|
+
super(message);
|
|
107
|
+
this.name = "ContentTypeLifecycleError";
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/** REQ-20 `planCleanup` eligibility-gate rejection; `reason` is one of a closed, ordered set. */
|
|
111
|
+
export class CleanupNotEligibleError extends Error {
|
|
112
|
+
reason;
|
|
113
|
+
constructor(reason, message) {
|
|
114
|
+
super(message ?? `cleanup is not eligible: ${reason}`);
|
|
115
|
+
this.name = "CleanupNotEligibleError";
|
|
116
|
+
this.reason = reason;
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/content-types/errors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { type ContentTypeFieldDef, type Result } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Validates an untrusted value against the `ContentTypeFieldDef[]` contract, returning either the
|
|
4
|
+
* verified array or the first structural violation found.
|
|
5
|
+
*
|
|
6
|
+
* Stops at the first violation rather than collecting all of them, matching the
|
|
7
|
+
* stop-at-first-failure convention CIC U-002-B1 already establishes for the domain guard chain
|
|
8
|
+
* this function feeds.
|
|
9
|
+
*
|
|
10
|
+
* @param value - The untrusted `fields` payload: a parsed JSON body's property, or an agent tool's
|
|
11
|
+
* `ctx.input.fields`. Any type is accepted as input; that is the point.
|
|
12
|
+
* @returns `{ok:true, value}` with an array whose every element is a verified
|
|
13
|
+
* {@link ContentTypeFieldDef}, or `{ok:false, error}` carrying an
|
|
14
|
+
* {@link InvalidFieldShapeError} (wrong structure, with the offending path) or an
|
|
15
|
+
* {@link InvalidFieldKindError} (well-formed string `kind` outside the closed enum).
|
|
16
|
+
* @throws Never. Every rejection is returned, including for inputs that previously threw.
|
|
17
|
+
* @complexity O(f·k) time with f = element count (bounded by {@link MAX_FIELD_DEFS}) and k = 4
|
|
18
|
+
* fixed keys, so effectively O(f); O(f) space for the returned array.
|
|
19
|
+
* @example
|
|
20
|
+
* const parsed = parseContentTypeFieldDefs([{ name: "servings", kind: "integer", required: false, queryable: true }]);
|
|
21
|
+
* if (!parsed.ok) return { ok: false, error: parsed.error };
|
|
22
|
+
* @overallScore 100
|
|
23
|
+
*/
|
|
24
|
+
export declare function parseContentTypeFieldDefs(value: unknown): Result<ContentTypeFieldDef[], Error>;
|
|
25
|
+
//# sourceMappingURL=field-defs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-defs.d.ts","sourceRoot":"","sources":["../../src/content-types/field-defs.ts"],"names":[],"mappings":"AA0CA,OAAO,EAA0B,KAAK,mBAAmB,EAAE,KAAK,MAAM,EAAE,MAAM,YAAY,CAAC;AAoC3F;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,EAAE,KAAK,CAAC,CAmB9F"}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file The single untrusted-input boundary for a content type's `fields` payload — used by BOTH
|
|
3
|
+
* callers that accept one from outside the process: the admin HTTP routes
|
|
4
|
+
* (`server/routes/admin/content-types/{register,update-fields}.ts`) and the agent-tool handlers
|
|
5
|
+
* (`assistant/tool-registrations.ts`).
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* Before this module both call sites did the same two things: check `Array.isArray(body.fields)`
|
|
9
|
+
* and then cast the result to `ContentTypeFieldDef[]`. The cast was the whole of the nested-shape
|
|
10
|
+
* validation, which left three real gaps:
|
|
11
|
+
*
|
|
12
|
+
* 1. `required` and `queryable` were never type-checked anywhere in the codebase, so
|
|
13
|
+
* `queryable: "yes"` counted as queryable (`write-service.ts`'s `countQueryableFields` filters
|
|
14
|
+
* on truthiness) and `required: "maybe"` was persisted verbatim into the stored record and its
|
|
15
|
+
* revision `stateJson`. That is a data-integrity gap, not merely a sloppy contract.
|
|
16
|
+
* 2. A non-object element (`fields: [null]`) made the field-name grammar guard throw a bare
|
|
17
|
+
* `TypeError` on `field.name` instead of returning a typed rejection — a 500 on the HTTP path
|
|
18
|
+
* and an opaque `'failed'` tool execution on the agent path.
|
|
19
|
+
* 3. A misspelled key (`queryible: true`) was silently dropped rather than reported, so a caller
|
|
20
|
+
* got a field that was quietly non-queryable with no indication why.
|
|
21
|
+
*
|
|
22
|
+
* Division of responsibility (deliberate, and the reason this module is narrow):
|
|
23
|
+
* this module owns STRUCTURE only — array-ness, element object-ness, the four keys and their
|
|
24
|
+
* types. It does NOT own the domain rules. The field-name grammar gate, the reserved-key check and
|
|
25
|
+
* the queryable-field cap stay solely in `write-service.ts`'s CIC U-002-B1 guard chain, whose
|
|
26
|
+
* fixed order (`key grammar -> reserved-key -> field-name grammar -> field-kind -> queryable-cap`)
|
|
27
|
+
* and stop-at-first-failure behavior are pinned by
|
|
28
|
+
* `__tests__/unit/write-service.register.unit.test.ts` (AC-38). Duplicating any of those here
|
|
29
|
+
* would either reorder that chain for boundary callers or create a second source of truth for a
|
|
30
|
+
* rule that must have exactly one definition.
|
|
31
|
+
*
|
|
32
|
+
* The one exception is `kind`, and it is a reuse rather than a restatement: this module calls the
|
|
33
|
+
* same `isContentTypeFieldKind` predicate guard 4 calls and raises the same
|
|
34
|
+
* `InvalidFieldKindError` guard 4 raises. Verifying it here is what lets this function honestly
|
|
35
|
+
* return `ContentTypeFieldDef[]` instead of handing back another unchecked cast. Both call sites
|
|
36
|
+
* already map that error class to `400 VALIDATION_ERROR`, so no HTTP response shape changes.
|
|
37
|
+
*
|
|
38
|
+
* Architectural role:
|
|
39
|
+
* `features/content-types` domain logic. Pure — no I/O, no clock, no repo. Depends only on this
|
|
40
|
+
* package's own `types.ts` and `errors.ts`.
|
|
41
|
+
*/
|
|
42
|
+
import { InvalidFieldKindError, InvalidFieldShapeError } from "./errors.js";
|
|
43
|
+
import { isContentTypeFieldKind } from "./types.js";
|
|
44
|
+
/**
|
|
45
|
+
* The complete, closed key set of a `ContentTypeFieldDef`. Any other key is rejected rather than
|
|
46
|
+
* ignored — silently dropping an unrecognized key is how a typo'd `queryible: true` became a
|
|
47
|
+
* quietly non-queryable field with no error to act on.
|
|
48
|
+
*/
|
|
49
|
+
const FIELD_DEF_KEYS = ["name", "kind", "required", "queryable"];
|
|
50
|
+
/**
|
|
51
|
+
* Upper bound on how many field definitions one payload may carry.
|
|
52
|
+
*
|
|
53
|
+
* Not a product rule — a resource bound. `fields` is a caller-supplied, previously unbounded
|
|
54
|
+
* collection: the existing `QUERYABLE_FIELD_CAP` (20, `write-service.ts`) limits only the
|
|
55
|
+
* `queryable` subset, so a payload of a million non-queryable fields was accepted and persisted
|
|
56
|
+
* as one JSON blob. Deliberately far above any plausible real content type so it can never act as
|
|
57
|
+
* a product constraint; if a legitimate schema ever approaches it, raise it rather than working
|
|
58
|
+
* around it.
|
|
59
|
+
*/
|
|
60
|
+
const MAX_FIELD_DEFS = 500;
|
|
61
|
+
/**
|
|
62
|
+
* Names the offending value's TYPE for an error message that must never echo operator content.
|
|
63
|
+
* Article chosen by initial vowel because two `typeof` results ("object", "undefined") take "an".
|
|
64
|
+
*/
|
|
65
|
+
function describeType(value) {
|
|
66
|
+
if (value === null)
|
|
67
|
+
return "null";
|
|
68
|
+
if (Array.isArray(value))
|
|
69
|
+
return "an array";
|
|
70
|
+
const type = typeof value;
|
|
71
|
+
return `${/^[aeiou]/.test(type) ? "an" : "a"} ${type}`;
|
|
72
|
+
}
|
|
73
|
+
function isPlainObject(value) {
|
|
74
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Validates an untrusted value against the `ContentTypeFieldDef[]` contract, returning either the
|
|
78
|
+
* verified array or the first structural violation found.
|
|
79
|
+
*
|
|
80
|
+
* Stops at the first violation rather than collecting all of them, matching the
|
|
81
|
+
* stop-at-first-failure convention CIC U-002-B1 already establishes for the domain guard chain
|
|
82
|
+
* this function feeds.
|
|
83
|
+
*
|
|
84
|
+
* @param value - The untrusted `fields` payload: a parsed JSON body's property, or an agent tool's
|
|
85
|
+
* `ctx.input.fields`. Any type is accepted as input; that is the point.
|
|
86
|
+
* @returns `{ok:true, value}` with an array whose every element is a verified
|
|
87
|
+
* {@link ContentTypeFieldDef}, or `{ok:false, error}` carrying an
|
|
88
|
+
* {@link InvalidFieldShapeError} (wrong structure, with the offending path) or an
|
|
89
|
+
* {@link InvalidFieldKindError} (well-formed string `kind` outside the closed enum).
|
|
90
|
+
* @throws Never. Every rejection is returned, including for inputs that previously threw.
|
|
91
|
+
* @complexity O(f·k) time with f = element count (bounded by {@link MAX_FIELD_DEFS}) and k = 4
|
|
92
|
+
* fixed keys, so effectively O(f); O(f) space for the returned array.
|
|
93
|
+
* @example
|
|
94
|
+
* const parsed = parseContentTypeFieldDefs([{ name: "servings", kind: "integer", required: false, queryable: true }]);
|
|
95
|
+
* if (!parsed.ok) return { ok: false, error: parsed.error };
|
|
96
|
+
* @overallScore 100
|
|
97
|
+
*/
|
|
98
|
+
export function parseContentTypeFieldDefs(value) {
|
|
99
|
+
if (!Array.isArray(value)) {
|
|
100
|
+
return { ok: false, error: new InvalidFieldShapeError({ path: "fields", expected: "an array", received: describeType(value) }) };
|
|
101
|
+
}
|
|
102
|
+
if (value.length > MAX_FIELD_DEFS) {
|
|
103
|
+
return {
|
|
104
|
+
ok: false,
|
|
105
|
+
error: new InvalidFieldShapeError({ path: "fields", expected: `at most ${MAX_FIELD_DEFS} entries`, received: `an array of ${value.length}` }),
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
const parsed = [];
|
|
109
|
+
for (const [index, element] of value.entries()) {
|
|
110
|
+
const one = parseOneFieldDef(element, `fields[${index}]`);
|
|
111
|
+
if (!one.ok)
|
|
112
|
+
return one;
|
|
113
|
+
parsed.push(one.value);
|
|
114
|
+
}
|
|
115
|
+
return { ok: true, value: parsed };
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Validates one element of the `fields` array. Split out of {@link parseContentTypeFieldDefs} so
|
|
119
|
+
* the guard sequence sits flat at one nesting level instead of inside the array loop — the checks,
|
|
120
|
+
* their order, and the exact error each returns are unchanged, and the first failure still
|
|
121
|
+
* short-circuits the whole parse.
|
|
122
|
+
*
|
|
123
|
+
* @complexity O(k) with k = 4 fixed keys.
|
|
124
|
+
*/
|
|
125
|
+
function parseOneFieldDef(element, at) {
|
|
126
|
+
if (!isPlainObject(element)) {
|
|
127
|
+
return { ok: false, error: new InvalidFieldShapeError({ path: at, expected: "an object", received: describeType(element) }) };
|
|
128
|
+
}
|
|
129
|
+
const unrecognized = Object.keys(element).find((key) => !FIELD_DEF_KEYS.includes(key));
|
|
130
|
+
if (unrecognized !== undefined) {
|
|
131
|
+
return {
|
|
132
|
+
ok: false,
|
|
133
|
+
error: new InvalidFieldShapeError({ path: `${at}.${unrecognized}`, expected: `absent (allowed keys: ${FIELD_DEF_KEYS.join(", ")})`, received: "an unrecognized key" }),
|
|
134
|
+
};
|
|
135
|
+
}
|
|
136
|
+
// `name` is checked for string-ness only — its grammar belongs to guard 3. Checking it here is
|
|
137
|
+
// what stops that guard from receiving a non-string and throwing inside `RegExp.test`.
|
|
138
|
+
if (typeof element.name !== "string") {
|
|
139
|
+
return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.name`, expected: "a string", received: describeType(element.name) }) };
|
|
140
|
+
}
|
|
141
|
+
if (typeof element.required !== "boolean") {
|
|
142
|
+
return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.required`, expected: "a boolean", received: describeType(element.required) }) };
|
|
143
|
+
}
|
|
144
|
+
if (typeof element.queryable !== "boolean") {
|
|
145
|
+
return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.queryable`, expected: "a boolean", received: describeType(element.queryable) }) };
|
|
146
|
+
}
|
|
147
|
+
if (typeof element.kind !== "string") {
|
|
148
|
+
return { ok: false, error: new InvalidFieldShapeError({ path: `${at}.kind`, expected: "a string", received: describeType(element.kind) }) };
|
|
149
|
+
}
|
|
150
|
+
if (!isContentTypeFieldKind(element.kind)) {
|
|
151
|
+
return { ok: false, error: new InvalidFieldKindError(`field '${element.name}' has kind '${element.kind}', not one of the closed field-kind enum`) };
|
|
152
|
+
}
|
|
153
|
+
return { ok: true, value: { name: element.name, kind: element.kind, required: element.required, queryable: element.queryable } };
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=field-defs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"field-defs.js","sourceRoot":"","sources":["../../src/content-types/field-defs.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AACH,OAAO,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,sBAAsB,EAAyC,MAAM,YAAY,CAAC;AAE3F;;;;GAIG;AACH,MAAM,cAAc,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,CAAU,CAAC;AAE1E;;;;;;;;;GASG;AACH,MAAM,cAAc,GAAG,GAAG,CAAC;AAE3B;;;GAGG;AACH,SAAS,YAAY,CAAC,KAAc;IAClC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,MAAM,CAAC;IAClC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,UAAU,CAAC;IAC5C,MAAM,IAAI,GAAG,OAAO,KAAK,CAAC;IAC1B,OAAO,GAAG,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,EAAE,CAAC;AACzD,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAc;IACtD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,CAAC;IACnI,CAAC;IACD,IAAI,KAAK,CAAC,MAAM,GAAG,cAAc,EAAE,CAAC;QAClC,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,QAAQ,EAAE,WAAW,cAAc,UAAU,EAAE,QAAQ,EAAE,eAAe,KAAK,CAAC,MAAM,EAAE,EAAE,CAAC;SAC9I,CAAC;IACJ,CAAC;IAED,MAAM,MAAM,GAA0B,EAAE,CAAC;IACzC,KAAK,MAAM,CAAC,KAAK,EAAE,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,gBAAgB,CAAC,OAAO,EAAE,UAAU,KAAK,GAAG,CAAC,CAAC;QAC1D,IAAI,CAAC,GAAG,CAAC,EAAE;YAAE,OAAO,GAAG,CAAC;QACxB,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;AACrC,CAAC;AAED;;;;;;;GAOG;AACH,SAAS,gBAAgB,CAAC,OAAgB,EAAE,EAAU;IACpD,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,EAAE,CAAC;QAC5B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;IAChI,CAAC;IAED,MAAM,YAAY,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAE,cAAoC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9G,IAAI,YAAY,KAAK,SAAS,EAAE,CAAC;QAC/B,OAAO;YACL,EAAE,EAAE,KAAK;YACT,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,IAAI,YAAY,EAAE,EAAE,QAAQ,EAAE,yBAAyB,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,qBAAqB,EAAE,CAAC;SACvK,CAAC;IACJ,CAAC;IAED,+FAA+F;IAC/F,uFAAuF;IACvF,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9I,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,WAAW,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IACvJ,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAC3C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC;IACzJ,CAAC;IACD,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QACrC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,sBAAsB,CAAC,EAAE,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9I,CAAC;IACD,IAAI,CAAC,sBAAsB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,qBAAqB,CAAC,UAAU,OAAO,CAAC,IAAI,eAAe,OAAO,CAAC,IAAI,0CAA0C,CAAC,EAAE,CAAC;IACtJ,CAAC;IAED,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,SAAS,EAAE,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC;AACnI,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type ContentTypeFieldKind } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @file CIC U-001 — the `kind`->`CAST` fixed lookup table, the identifier grammar
|
|
4
|
+
* gate, the workspace-scoped queryable-index naming scheme, and the before/after index-transition
|
|
5
|
+
* resolver (grammar-and-workspace-scoping folds).
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* THIS IS THE HIGHEST-SECURITY-SEVERITY MODULE IN THE 5-PACKAGE PIPELINE — every value that ends
|
|
9
|
+
* up inside a `CREATE INDEX ... CAST(json_extract(fields,'$.ext.{ns}.{field}') AS {type})`
|
|
10
|
+
* statement is produced here, and only here:
|
|
11
|
+
* - `mapFieldKindToCast` never interpolates an operator-supplied string — it is a fixed,
|
|
12
|
+
* hardcoded 5-entry table (U-001-B1).
|
|
13
|
+
* - `validateIdentifierGrammar`/`buildQueryableFieldIndexName` gate every `key`/field name
|
|
14
|
+
* through `^[a-z][a-z0-9_]{0,63}$` before it can reach an index-name segment or JSON-path
|
|
15
|
+
* literal (U-001-B2), and join grammar-gated segments with `/` — a delimiter outside the
|
|
16
|
+
* grammar's own alphabet `[a-z0-9_]`, closing the namespace-injectivity collision class
|
|
17
|
+
* (U-001-B3) — and fold in a workspace-derived segment so two workspaces defining the same
|
|
18
|
+
* `(key, field)` pair never collide on index identity.
|
|
19
|
+
*
|
|
20
|
+
* How it relates to the project:
|
|
21
|
+
* `write-service.ts`'s `registerContentType`/`updateContentTypeFields` call
|
|
22
|
+
* `resolveFieldIndexTransition` once per field (never two independent kind/queryable branches —
|
|
23
|
+
* CIC U-003-B1) and hand the result to the injected `indexProvisioner` port, which is the only
|
|
24
|
+
* thing that ever issues the real `CREATE INDEX`/`DROP INDEX` DDL (this module only decides what
|
|
25
|
+
* to build, never executes DDL itself).
|
|
26
|
+
*
|
|
27
|
+
* Architectural role:
|
|
28
|
+
* `features/content-types` domain logic. No dependencies beyond `node:crypto` (workspace-segment
|
|
29
|
+
* hashing) and this package's own `errors.ts`/`types.ts`.
|
|
30
|
+
*/
|
|
31
|
+
/**
|
|
32
|
+
* U-001-B2 — the closed identifier grammar every `content_types.key` and field name must satisfy,
|
|
33
|
+
* as a pattern string so the agent-facing JSON Schemas in `agent-tools.ts` can publish the very
|
|
34
|
+
* same grammar instead of restating it. A cross-cutting single-source-of-truth governance rule makes this grammar load-bearing for DDL
|
|
35
|
+
* safety, so it must have exactly one definition; {@link IDENTIFIER_GRAMMAR} is compiled from this
|
|
36
|
+
* string rather than written twice.
|
|
37
|
+
*/
|
|
38
|
+
export declare const IDENTIFIER_GRAMMAR_PATTERN = "^[a-z][a-z0-9_]{0,63}$";
|
|
39
|
+
/**
|
|
40
|
+
* Structural grammar gate for a `content_types.key` or field name (U-001-B2).
|
|
41
|
+
*
|
|
42
|
+
* @complexity O(n) in the string's length (regex match), bounded at 64 chars.
|
|
43
|
+
* @overallScore 100
|
|
44
|
+
*/
|
|
45
|
+
export declare function validateIdentifierGrammar(value: string): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Maps a closed-enum field `kind` to its fixed `CAST(... AS {type})` type token. Throws
|
|
48
|
+
* {@link InvalidFieldKindError} for anything not exactly one of the 5 enum values — this is a
|
|
49
|
+
* lookup, never a template, so an adversarial payload can never reach the returned string
|
|
50
|
+
* (U-001-B1).
|
|
51
|
+
*
|
|
52
|
+
* @complexity O(1) — a fixed-size object lookup.
|
|
53
|
+
* @overallScore 100
|
|
54
|
+
*/
|
|
55
|
+
export declare function mapFieldKindToCast(kind: ContentTypeFieldKind): string;
|
|
56
|
+
/**
|
|
57
|
+
* Builds the workspace-scoped queryable-field index identity for `(workspaceId, contentTypeKey,
|
|
58
|
+
* fieldName)`. Both `contentTypeKey` and `fieldName` are grammar-gated first — a failure throws
|
|
59
|
+
* before any index name is produced (U-001-B2). Segments are joined with `/`, a delimiter outside
|
|
60
|
+
* the grammar's own alphabet `[a-z0-9_]`, so distinct `(key, name)` pairs can never collide by
|
|
61
|
+
* boundary-shifting (U-001-B3, e.g. `("a_b","c")` vs `("a","b_c")`).
|
|
62
|
+
*
|
|
63
|
+
* @complexity O(1) plus two grammar checks and one SHA-256 hash.
|
|
64
|
+
* @overallScore 100
|
|
65
|
+
*/
|
|
66
|
+
export declare function buildQueryableFieldIndexName(params: {
|
|
67
|
+
workspaceId: string;
|
|
68
|
+
contentTypeKey: string;
|
|
69
|
+
fieldName: string;
|
|
70
|
+
}): string;
|
|
71
|
+
/** A field's `(kind, queryable)` pair at one side of an update call, or `undefined` if absent (new/removed). */
|
|
72
|
+
export type FieldIndexState = {
|
|
73
|
+
kind: ContentTypeFieldKind;
|
|
74
|
+
queryable: boolean;
|
|
75
|
+
} | undefined;
|
|
76
|
+
export interface FieldIndexTransition {
|
|
77
|
+
action: "none" | "provision" | "teardown" | "reprovision";
|
|
78
|
+
/** Present only for `provision`/`reprovision` — always the field's POST-call kind. */
|
|
79
|
+
newKind?: ContentTypeFieldKind;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* CIC U-003-B1 — resolves a single field's index transition from ONE before/after comparison of
|
|
83
|
+
* its `(kind, queryable)` pair, never from two independent branches that each assume the other
|
|
84
|
+
* property is unchanged (the bug class this closes: a field whose `kind` AND `queryable` both
|
|
85
|
+
* change in the same call must still resolve correctly — REQ-30(b)).
|
|
86
|
+
*
|
|
87
|
+
* @complexity O(1) — four comparisons, one of four fixed outcomes.
|
|
88
|
+
* @overallScore 100
|
|
89
|
+
*/
|
|
90
|
+
export declare function resolveFieldIndexTransition(params: {
|
|
91
|
+
before: FieldIndexState;
|
|
92
|
+
after: FieldIndexState;
|
|
93
|
+
}): FieldIndexTransition;
|
|
94
|
+
//# sourceMappingURL=index-provisioning.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index-provisioning.d.ts","sourceRoot":"","sources":["../../src/content-types/index-provisioning.ts"],"names":[],"mappings":"AAGA,OAAO,EAA4B,KAAK,oBAAoB,EAA0B,MAAM,YAAY,CAAC;AAEzG;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,2BAA2B,CAAC;AAKnE;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAEhE;AAcD;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,oBAAoB,GAAG,MAAM,CAOrE;AAgBD;;;;;;;;;GASG;AACH,wBAAgB,4BAA4B,CAAC,MAAM,EAAE;IACnD,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,MAAM,CAYT;AAED,gHAAgH;AAChH,MAAM,MAAM,eAAe,GAAG;IAAE,IAAI,EAAE,oBAAoB,CAAC;IAAC,SAAS,EAAE,OAAO,CAAA;CAAE,GAAG,SAAS,CAAC;AAE7F,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,CAAC;IAC1D,sFAAsF;IACtF,OAAO,CAAC,EAAE,oBAAoB,CAAC;CAChC;AAED;;;;;;;;GAQG;AACH,wBAAgB,2BAA2B,CAAC,MAAM,EAAE;IAClD,MAAM,EAAE,eAAe,CAAC;IACxB,KAAK,EAAE,eAAe,CAAC;CACxB,GAAG,oBAAoB,CAWvB"}
|