@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,44 @@
|
|
|
1
|
+
import type { ContentTypeRecord } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* @file Admin-UI backend-gap closure (design-spec.md §1.9) — the `content_types` registry's
|
|
4
|
+
* missing read side. `write-service.ts`/`lifecycle.ts` were fully built and tested with no way to
|
|
5
|
+
* list what had been written; this is that read.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* `listContentTypes` mirrors `features/database/timeline.ts`'s `getTimeline` shape exactly: a thin
|
|
9
|
+
* pass-through over an injected read port, no authorization/business logic of its own (the caller
|
|
10
|
+
* route checks `admin.collections.read` before calling this, same division of labor
|
|
11
|
+
* `routes/admin/database/timeline.ts` already established).
|
|
12
|
+
*
|
|
13
|
+
* How it relates to the project:
|
|
14
|
+
* `ContentTypeListPort` is deliberately a NEW, narrower port — not an addition to
|
|
15
|
+
* `write-service.ts`'s `ContentTypeRepoPort` — so a caller who only needs read access
|
|
16
|
+
* (`routes/admin/content-types/list.ts`) can be typed against just this port, matching this
|
|
17
|
+
* codebase's port-segregation convention (`LedgerReadPort` vs `BootLedgerPort` on the same
|
|
18
|
+
* underlying table, `db/sqlite/database-journal-repo.ts`). The concrete adapter
|
|
19
|
+
* (`repo.memory.ts`'s `InMemoryContentTypeRepo`) implements both this and `ContentTypeRepoPort`.
|
|
20
|
+
*
|
|
21
|
+
* Architectural role:
|
|
22
|
+
* `features/content-types` domain logic. Depends only on this package's own `types.ts`.
|
|
23
|
+
*/
|
|
24
|
+
export interface ContentTypeListPort {
|
|
25
|
+
/** Every content type registered for `workspaceId`, in no particular guaranteed order (the
|
|
26
|
+
* route layer is free to sort for display; the original design does not specify a canonical list order). */
|
|
27
|
+
listByWorkspace(params: {
|
|
28
|
+
workspaceId: string;
|
|
29
|
+
}): Promise<ContentTypeRecord[]>;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Lists every content type registered in `workspaceId`.
|
|
33
|
+
*
|
|
34
|
+
* @complexity O(1) plus one `ContentTypeListPort.listByWorkspace()` call (the port owns the actual
|
|
35
|
+
* scan cost).
|
|
36
|
+
* @overallScore 100
|
|
37
|
+
*/
|
|
38
|
+
export declare function listContentTypes(required: {
|
|
39
|
+
repo: ContentTypeListPort;
|
|
40
|
+
workspaceId: string;
|
|
41
|
+
}, _optional?: Record<string, never>): Promise<{
|
|
42
|
+
items: ContentTypeRecord[];
|
|
43
|
+
}>;
|
|
44
|
+
//# sourceMappingURL=list.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.d.ts","sourceRoot":"","sources":["../../src/content-types/list.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;;;;;;;;;;;;;;GAqBG;AAEH,MAAM,WAAW,mBAAmB;IAClC;gHAC4G;IAC5G,eAAe,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CAChF;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,QAAQ,EAAE;IAAE,IAAI,EAAE,mBAAmB,CAAC;IAAC,WAAW,EAAE,MAAM,CAAA;CAAE,EAC5D,SAAS,GAAE,MAAM,CAAC,MAAM,EAAE,KAAK,CAAM,GACpC,OAAO,CAAC;IAAE,KAAK,EAAE,iBAAiB,EAAE,CAAA;CAAE,CAAC,CAIzC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lists every content type registered in `workspaceId`.
|
|
3
|
+
*
|
|
4
|
+
* @complexity O(1) plus one `ContentTypeListPort.listByWorkspace()` call (the port owns the actual
|
|
5
|
+
* scan cost).
|
|
6
|
+
* @overallScore 100
|
|
7
|
+
*/
|
|
8
|
+
export async function listContentTypes(required, _optional = {}) {
|
|
9
|
+
const { repo, workspaceId } = required;
|
|
10
|
+
const items = await repo.listByWorkspace({ workspaceId });
|
|
11
|
+
return { items };
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=list.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"list.js","sourceRoot":"","sources":["../../src/content-types/list.ts"],"names":[],"mappings":"AA+BA;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,QAA4D,EAC5D,YAAmC,EAAE;IAErC,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,QAAQ,CAAC;IACvC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,EAAE,WAAW,EAAE,CAAC,CAAC;IAC1D,OAAO,EAAE,KAAK,EAAE,CAAC;AACnB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ContentTypeRepoPort, ContentTypeRevisionInput, IndexProvisionerPort, OutboxPort } from "./write-service.js";
|
|
2
|
+
import type { TeardownIndexProvisionerPort } from "./lifecycle.js";
|
|
3
|
+
import type { ContentTypeListPort } from "./list.js";
|
|
4
|
+
import type { ContentTypeRecord } from "./types.js";
|
|
5
|
+
/**
|
|
6
|
+
* @file In-memory adapters for the `content-types` package's write/list ports (port/adapter rule-of-two
|
|
7
|
+
* "one being built now" half). Backs `server/app.ts`'s hermetic test/dev composition AND, until a
|
|
8
|
+
* real SQLite adapter is built for this domain (a disclosed gap — see this dispatch's handoff),
|
|
9
|
+
* `server/deps.ts`'s real running-server composition too — the same precedent `mediaRepo`/
|
|
10
|
+
* `transformDefinitionRepo`/`memberRepo` already establish in both those files (in-process,
|
|
11
|
+
* non-persistent-across-restarts rows are an accepted stand-in until each domain gets its own
|
|
12
|
+
* `repo.sqlite.ts`).
|
|
13
|
+
*/
|
|
14
|
+
/** In-memory `ContentTypeRepoPort` + `ContentTypeListPort` double, keyed by `(workspaceId, key)`. */
|
|
15
|
+
export declare class InMemoryContentTypeRepo implements ContentTypeRepoPort, ContentTypeListPort {
|
|
16
|
+
private readonly rows;
|
|
17
|
+
private readonly revisions;
|
|
18
|
+
private static key;
|
|
19
|
+
save(row: ContentTypeRecord): Promise<void>;
|
|
20
|
+
appendRevision(revision: ContentTypeRevisionInput): Promise<void>;
|
|
21
|
+
/**
|
|
22
|
+
* The append-only revision log, oldest first. Not part of `ContentTypeRepoPort` — the domain only
|
|
23
|
+
* ever appends. Exposed so route-level tests can assert what provenance
|
|
24
|
+
* (`actorId`/`principalKind`) a write actually recorded, which is otherwise unobservable in the
|
|
25
|
+
* hermetic in-memory composition; `SqliteContentTypeRepo`'s equivalent is a plain table read.
|
|
26
|
+
*
|
|
27
|
+
* @complexity O(n) in the number of recorded revisions (defensive copy).
|
|
28
|
+
* @overallScore 100
|
|
29
|
+
*/
|
|
30
|
+
listRevisions(): ContentTypeRevisionInput[];
|
|
31
|
+
findByKey(params: {
|
|
32
|
+
workspaceId: string;
|
|
33
|
+
key: string;
|
|
34
|
+
}): Promise<ContentTypeRecord | null>;
|
|
35
|
+
transaction<T>(fn: () => Promise<T>): Promise<T>;
|
|
36
|
+
listByWorkspace(params: {
|
|
37
|
+
workspaceId: string;
|
|
38
|
+
}): Promise<ContentTypeRecord[]>;
|
|
39
|
+
}
|
|
40
|
+
/** In-memory `IndexProvisionerPort` + `TeardownIndexProvisionerPort` no-op double. Real DDL index
|
|
41
|
+
* provisioning (`index-provisioning.ts`'s CAST-mapping) targets `content.db` tables this domain
|
|
42
|
+
* has no SQLite adapter for yet (see this file's header) — a no-op here is honest given that, not
|
|
43
|
+
* a shortcut around a working implementation. */
|
|
44
|
+
export declare class NoopContentTypeIndexProvisioner implements IndexProvisionerPort, TeardownIndexProvisionerPort {
|
|
45
|
+
provisionIndexesForNewContentType(): Promise<void>;
|
|
46
|
+
applyFieldIndexTransitions(): Promise<void>;
|
|
47
|
+
tearDownAllIndexesForContentType(): Promise<void>;
|
|
48
|
+
}
|
|
49
|
+
/** Adapts a real `core/ports` `OutboxPort` (`{name,payload}` -> full `DomainEvent`) into the
|
|
50
|
+
* narrower `{enqueue({name,payload})}` shape this package's write-service/lifecycle modules
|
|
51
|
+
* declare locally (mirrors their own "no shared import, kept decoupled" convention). */
|
|
52
|
+
export declare function toContentTypeOutbox(deps: {
|
|
53
|
+
outbox: {
|
|
54
|
+
enqueue(event: {
|
|
55
|
+
id: string;
|
|
56
|
+
workspaceId: string;
|
|
57
|
+
name: string;
|
|
58
|
+
occurredAt: string;
|
|
59
|
+
payload: Record<string, unknown>;
|
|
60
|
+
}): Promise<void>;
|
|
61
|
+
};
|
|
62
|
+
clock: {
|
|
63
|
+
nowIso(): string;
|
|
64
|
+
};
|
|
65
|
+
idGen: {
|
|
66
|
+
newId(): string;
|
|
67
|
+
};
|
|
68
|
+
/** Required — see `entries/repo.memory.ts`'s `toEntryOutbox` for the full rationale (workspace
|
|
69
|
+
* tenant boundary, NOT NULL in persistent adapters, previously under-declared and omitted). */
|
|
70
|
+
workspaceId: string;
|
|
71
|
+
}): OutboxPort;
|
|
72
|
+
//# sourceMappingURL=repo.memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.memory.d.ts","sourceRoot":"","sources":["../../src/content-types/repo.memory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1H,OAAO,KAAK,EAAE,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AACnE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACrD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAEpD;;;;;;;;GAQG;AAEH,qGAAqG;AACrG,qBAAa,uBAAwB,YAAW,mBAAmB,EAAE,mBAAmB;IACtF,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwC;IAC7D,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAkC;IAE5D,OAAO,CAAC,MAAM,CAAC,GAAG;IAIZ,IAAI,CAAC,GAAG,EAAE,iBAAiB,GAAG,OAAO,CAAC,IAAI,CAAC;IAI3C,cAAc,CAAC,QAAQ,EAAE,wBAAwB,GAAG,OAAO,CAAC,IAAI,CAAC;IAIvE;;;;;;;;OAQG;IACH,aAAa,IAAI,wBAAwB,EAAE;IAIrC,SAAS,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAK1F,WAAW,CAAC,CAAC,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAIhD,eAAe,CAAC,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAGrF;AAED;;;iDAGiD;AACjD,qBAAa,+BAAgC,YAAW,oBAAoB,EAAE,4BAA4B;IAClG,iCAAiC,IAAI,OAAO,CAAC,IAAI,CAAC;IAClD,0BAA0B,IAAI,OAAO,CAAC,IAAI,CAAC;IAC3C,gCAAgC,IAAI,OAAO,CAAC,IAAI,CAAC;CACxD;AAED;;wFAEwF;AACxF,wBAAgB,mBAAmB,CAAC,IAAI,EAAE;IACxC,MAAM,EAAE;QACN,OAAO,CAAC,KAAK,EAAE;YACb,EAAE,EAAE,MAAM,CAAC;YACX,WAAW,EAAE,MAAM,CAAC;YACpB,IAAI,EAAE,MAAM,CAAC;YACb,UAAU,EAAE,MAAM,CAAC;YACnB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;SAClC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;KACnB,CAAC;IACF,KAAK,EAAE;QAAE,MAAM,IAAI,MAAM,CAAA;KAAE,CAAC;IAC5B,KAAK,EAAE;QAAE,KAAK,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3B;mGAC+F;IAC/F,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,UAAU,CAYb"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file In-memory adapters for the `content-types` package's write/list ports (port/adapter rule-of-two
|
|
3
|
+
* "one being built now" half). Backs `server/app.ts`'s hermetic test/dev composition AND, until a
|
|
4
|
+
* real SQLite adapter is built for this domain (a disclosed gap — see this dispatch's handoff),
|
|
5
|
+
* `server/deps.ts`'s real running-server composition too — the same precedent `mediaRepo`/
|
|
6
|
+
* `transformDefinitionRepo`/`memberRepo` already establish in both those files (in-process,
|
|
7
|
+
* non-persistent-across-restarts rows are an accepted stand-in until each domain gets its own
|
|
8
|
+
* `repo.sqlite.ts`).
|
|
9
|
+
*/
|
|
10
|
+
/** In-memory `ContentTypeRepoPort` + `ContentTypeListPort` double, keyed by `(workspaceId, key)`. */
|
|
11
|
+
export class InMemoryContentTypeRepo {
|
|
12
|
+
rows = new Map();
|
|
13
|
+
revisions = [];
|
|
14
|
+
static key(workspaceId, key) {
|
|
15
|
+
return `${workspaceId}::${key}`;
|
|
16
|
+
}
|
|
17
|
+
async save(row) {
|
|
18
|
+
this.rows.set(InMemoryContentTypeRepo.key(row.workspaceId, row.key), { ...row });
|
|
19
|
+
}
|
|
20
|
+
async appendRevision(revision) {
|
|
21
|
+
this.revisions.push(revision);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* The append-only revision log, oldest first. Not part of `ContentTypeRepoPort` — the domain only
|
|
25
|
+
* ever appends. Exposed so route-level tests can assert what provenance
|
|
26
|
+
* (`actorId`/`principalKind`) a write actually recorded, which is otherwise unobservable in the
|
|
27
|
+
* hermetic in-memory composition; `SqliteContentTypeRepo`'s equivalent is a plain table read.
|
|
28
|
+
*
|
|
29
|
+
* @complexity O(n) in the number of recorded revisions (defensive copy).
|
|
30
|
+
* @overallScore 100
|
|
31
|
+
*/
|
|
32
|
+
listRevisions() {
|
|
33
|
+
return this.revisions.map((revision) => ({ ...revision }));
|
|
34
|
+
}
|
|
35
|
+
async findByKey(params) {
|
|
36
|
+
const row = this.rows.get(InMemoryContentTypeRepo.key(params.workspaceId, params.key));
|
|
37
|
+
return row ? { ...row } : null;
|
|
38
|
+
}
|
|
39
|
+
async transaction(fn) {
|
|
40
|
+
return fn();
|
|
41
|
+
}
|
|
42
|
+
async listByWorkspace(params) {
|
|
43
|
+
return [...this.rows.values()].filter((row) => row.workspaceId === params.workspaceId).map((row) => ({ ...row }));
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/** In-memory `IndexProvisionerPort` + `TeardownIndexProvisionerPort` no-op double. Real DDL index
|
|
47
|
+
* provisioning (`index-provisioning.ts`'s CAST-mapping) targets `content.db` tables this domain
|
|
48
|
+
* has no SQLite adapter for yet (see this file's header) — a no-op here is honest given that, not
|
|
49
|
+
* a shortcut around a working implementation. */
|
|
50
|
+
export class NoopContentTypeIndexProvisioner {
|
|
51
|
+
async provisionIndexesForNewContentType() { }
|
|
52
|
+
async applyFieldIndexTransitions() { }
|
|
53
|
+
async tearDownAllIndexesForContentType() { }
|
|
54
|
+
}
|
|
55
|
+
/** Adapts a real `core/ports` `OutboxPort` (`{name,payload}` -> full `DomainEvent`) into the
|
|
56
|
+
* narrower `{enqueue({name,payload})}` shape this package's write-service/lifecycle modules
|
|
57
|
+
* declare locally (mirrors their own "no shared import, kept decoupled" convention). */
|
|
58
|
+
export function toContentTypeOutbox(deps) {
|
|
59
|
+
return {
|
|
60
|
+
enqueue: async (event) => {
|
|
61
|
+
await deps.outbox.enqueue({
|
|
62
|
+
id: deps.idGen.newId(),
|
|
63
|
+
workspaceId: deps.workspaceId,
|
|
64
|
+
name: event.name,
|
|
65
|
+
occurredAt: deps.clock.nowIso(),
|
|
66
|
+
payload: event.payload,
|
|
67
|
+
});
|
|
68
|
+
},
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=repo.memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.memory.js","sourceRoot":"","sources":["../../src/content-types/repo.memory.ts"],"names":[],"mappings":"AAKA;;;;;;;;GAQG;AAEH,qGAAqG;AACrG,MAAM,OAAO,uBAAuB;IACjB,IAAI,GAAG,IAAI,GAAG,EAA6B,CAAC;IAC5C,SAAS,GAA+B,EAAE,CAAC;IAEpD,MAAM,CAAC,GAAG,CAAC,WAAmB,EAAE,GAAW;QACjD,OAAO,GAAG,WAAW,KAAK,GAAG,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,GAAsB;QAC/B,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,QAAkC;QACrD,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChC,CAAC;IAED;;;;;;;;OAQG;IACH,aAAa;QACX,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC,CAAC;IAC7D,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,MAA4C;QAC1D,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,uBAAuB,CAAC,GAAG,CAAC,MAAM,CAAC,WAAW,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;QACvF,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,WAAW,CAAI,EAAoB;QACvC,OAAO,EAAE,EAAE,CAAC;IACd,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAA+B;QACnD,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,WAAW,KAAK,MAAM,CAAC,WAAW,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC;IACpH,CAAC;CACF;AAED;;;iDAGiD;AACjD,MAAM,OAAO,+BAA+B;IAC1C,KAAK,CAAC,iCAAiC,KAAmB,CAAC;IAC3D,KAAK,CAAC,0BAA0B,KAAmB,CAAC;IACpD,KAAK,CAAC,gCAAgC,KAAmB,CAAC;CAC3D;AAED;;wFAEwF;AACxF,MAAM,UAAU,mBAAmB,CAAC,IAenC;IACC,OAAO;QACL,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;YACvB,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;gBACxB,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;gBACtB,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE;gBAC/B,OAAO,EAAE,KAAK,CAAC,OAAO;aACvB,CAAC,CAAC;QACL,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Content-types' half of the agent-tool authorization wiring: maps `agent-tools.ts`'s catalog entries onto the
|
|
3
|
+
* `write-service.ts`/`lifecycle.ts` functions the admin HTTP routes call, as `ToolRegistration`s.
|
|
4
|
+
*
|
|
5
|
+
* Colocated with the domain rather than in `assistant/`, so the knowledge this file depends on —
|
|
6
|
+
* which domain function each tool id runs, and therefore what it actually costs — lives next to
|
|
7
|
+
* those functions. `assistant/tool-registrations.ts` only assembles what every domain returns.
|
|
8
|
+
*
|
|
9
|
+
* Scope: 6 of 7 entries are wired — the 5 non-cleanup mutations plus the read-only
|
|
10
|
+
* `collections_content_type_list`. `collections_plan_cleanup`/`collections_execute_cleanup` are
|
|
11
|
+
* declared unwired — the destructive token-gated ceremony, whose mapping is deferred per this
|
|
12
|
+
* catalog's own deferred list. `ToolRegistry.list()` will not show them, which is intentional: no silent stub
|
|
13
|
+
* registrations that could look like a bug if ever actually invoked.
|
|
14
|
+
*
|
|
15
|
+
* `ToolPolicy.authorize` is a pass-through for every entry here (see `buildDomainRegistrations`).
|
|
16
|
+
* For the five mutations, that is the "one evaluator" rule: each domain entrypoint —
|
|
17
|
+
* `registerContentType`, `updateContentTypeFields` (`write-service.ts`), `deprecateContentType`,
|
|
18
|
+
* `reactivateContentType`, `tombstoneContentType` (`lifecycle.ts`) — opens with an
|
|
19
|
+
* `await deps.authorize({ permission: 'admin.collections.manage', ... })` that returns
|
|
20
|
+
* `ForbiddenError` before any repo read, repo write, or index-provisioner call, and
|
|
21
|
+
* `admin.collections.manage` is exactly what each of their five catalog entries declares under
|
|
22
|
+
* `authorization.permission`. `assistant/__tests__/tool-registrations.authorization.test.ts` drives
|
|
23
|
+
* all five through a denying `authorize` and asserts each refuses and writes nothing, deriving its
|
|
24
|
+
* expectations from the catalog itself — so a future tool wired here whose handler does NOT
|
|
25
|
+
* self-enforce fails rather than silently inheriting the pass-through.
|
|
26
|
+
*
|
|
27
|
+
* `collections_content_type_list` is the exception: `listContentTypes` (`list.ts`) is a pure
|
|
28
|
+
* pass-through read with no `authorize()` call of its own — exactly like `routes/admin/content-
|
|
29
|
+
* types/list.ts`, which checks `admin.collections.read` in the route BEFORE calling it. Its handler
|
|
30
|
+
* below does the identical explicit `requireToolPermission` check, in the route's place, the same
|
|
31
|
+
* pattern `comments/tool-registrations.ts` uses for `comments_list_moderation_queue`.
|
|
32
|
+
*/
|
|
33
|
+
import type { AuthorizeFn } from "../core/commands/command.js";
|
|
34
|
+
import type { OutboxPort } from "../core/ports.js";
|
|
35
|
+
import { type DerivedRiskByToolId, type ToolRegistration } from "../core/tools/registration-kit.js";
|
|
36
|
+
import { type ContentTypeListPort } from "./list.js";
|
|
37
|
+
import { type TeardownIndexProvisionerPort } from "./lifecycle.js";
|
|
38
|
+
import { type ContentTypeRepoPort, type IndexProvisionerPort } from "./write-service.js";
|
|
39
|
+
/**
|
|
40
|
+
* The exact slice of the route-deps bag Content-Types' tool handlers read. Declared structurally
|
|
41
|
+
* (rather than importing `server/routes/types`'s `RouteDeps`) so this module carries no back-edge
|
|
42
|
+
* into the composition root. `server/routes/*` satisfies this structurally by passing its existing
|
|
43
|
+
* `RouteDeps` object; nothing there changes.
|
|
44
|
+
*/
|
|
45
|
+
export interface ContentTypesToolDeps {
|
|
46
|
+
authorize: AuthorizeFn;
|
|
47
|
+
workspaceId: string;
|
|
48
|
+
clock: {
|
|
49
|
+
nowIso(): string;
|
|
50
|
+
};
|
|
51
|
+
idGen: {
|
|
52
|
+
newId(): string;
|
|
53
|
+
};
|
|
54
|
+
outbox: OutboxPort;
|
|
55
|
+
contentTypeRepo: ContentTypeRepoPort & ContentTypeListPort;
|
|
56
|
+
contentTypeIndexProvisioner: IndexProvisionerPort & TeardownIndexProvisionerPort;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* This wiring layer's OWN risk classification, authored from what each handler below actually
|
|
60
|
+
* calls — deliberately a second, independent source rather than a read of the catalog's own
|
|
61
|
+
* `sideEffects` field. See `DerivedRiskByToolId` in the kit for why that independence matters.
|
|
62
|
+
*/
|
|
63
|
+
export declare const contentTypesDerivedRisk: DerivedRiskByToolId;
|
|
64
|
+
export declare function buildContentTypesRegistrations(routeDeps: ContentTypesToolDeps): ToolRegistration[];
|
|
65
|
+
//# sourceMappingURL=tool-registrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrations.d.ts","sourceRoot":"","sources":["../../src/content-types/tool-registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAYL,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACtB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,EAAoB,KAAK,mBAAmB,EAAE,MAAM,WAAW,CAAC;AACvE,OAAO,EAAqE,KAAK,4BAA4B,EAAE,MAAM,gBAAgB,CAAC;AAEtI,OAAO,EAAgD,KAAK,mBAAmB,EAAE,KAAK,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAIvI;;;;;GAKG;AACH,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,WAAW,CAAC;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE;QAAE,MAAM,IAAI,MAAM,CAAA;KAAE,CAAC;IAC5B,KAAK,EAAE;QAAE,KAAK,IAAI,MAAM,CAAA;KAAE,CAAC;IAC3B,MAAM,EAAE,UAAU,CAAC;IACnB,eAAe,EAAE,mBAAmB,GAAG,mBAAmB,CAAC;IAC3D,2BAA2B,EAAE,oBAAoB,GAAG,4BAA4B,CAAC;CAClF;AAKD;;;;GAIG;AACH,eAAO,MAAM,uBAAuB,EAAE,mBAcpC,CAAC;AA6EH,wBAAgB,8BAA8B,CAAC,SAAS,EAAE,oBAAoB,GAAG,gBAAgB,EAAE,CAmGlG"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
import { AGENT_TOOL_PRINCIPAL_KIND, buildDomainRegistrations, decorateWithSchema, fromResult, indexCatalogById, requireInputRecord, requireNoInput, requireNumber, requireString, requireToolPermission, } from "../core/tools/registration-kit.js";
|
|
2
|
+
import { contentTypesAgentToolCatalog } from "./agent-tools.js";
|
|
3
|
+
import { parseContentTypeFieldDefs } from "./field-defs.js";
|
|
4
|
+
import { listContentTypes } from "./list.js";
|
|
5
|
+
import { deprecateContentType, reactivateContentType, tombstoneContentType } from "./lifecycle.js";
|
|
6
|
+
import { registerContentType, updateContentTypeFields } from "./write-service.js";
|
|
7
|
+
const CATALOG_BY_ID = indexCatalogById(contentTypesAgentToolCatalog);
|
|
8
|
+
/** Descriptors for the 2 cleanup tools this pass does not wire — see file header. */
|
|
9
|
+
const UNWIRED_CONTENT_TYPES_TOOL_IDS = new Set(["collections_plan_cleanup", "collections_execute_cleanup"]);
|
|
10
|
+
/**
|
|
11
|
+
* This wiring layer's OWN risk classification, authored from what each handler below actually
|
|
12
|
+
* calls — deliberately a second, independent source rather than a read of the catalog's own
|
|
13
|
+
* `sideEffects` field. See `DerivedRiskByToolId` in the kit for why that independence matters.
|
|
14
|
+
*/
|
|
15
|
+
export const contentTypesDerivedRisk = new Map([
|
|
16
|
+
// -> listContentTypes (list.ts): one repo.listByWorkspace read, no write of any kind.
|
|
17
|
+
["collections_content_type_list", "none"],
|
|
18
|
+
// -> registerContentType (write-service.ts): repo.save + appendRevision in one tx.
|
|
19
|
+
["collections_content_type_define", "mutates-durable-state"],
|
|
20
|
+
// -> updateContentTypeFields (write-service.ts): full field-schema replace + index transitions.
|
|
21
|
+
["collections_content_type_update_fields", "mutates-durable-state"],
|
|
22
|
+
// -> deprecateContentType (lifecycle.ts): status flip + revision.
|
|
23
|
+
["collections_content_type_deprecate", "mutates-durable-state"],
|
|
24
|
+
// -> reactivateContentType (lifecycle.ts): status flip + revision.
|
|
25
|
+
["collections_content_type_reactivate", "mutates-durable-state"],
|
|
26
|
+
// -> tombstoneContentType (lifecycle.ts): one-way terminal transition that tears down every
|
|
27
|
+
// provisioned index BEFORE persisting the flip. The heaviest of the five.
|
|
28
|
+
["collections_content_type_tombstone", "mutates-durable-state"],
|
|
29
|
+
]);
|
|
30
|
+
/**
|
|
31
|
+
* Validates `input.fields` through the SAME boundary parser the admin HTTP routes use
|
|
32
|
+
* (`field-defs.ts`), then re-throws any rejection with the tool's published `inputSchema` appended.
|
|
33
|
+
*
|
|
34
|
+
* The appended schema is the error-recovery half of the contract: a model that gets back only
|
|
35
|
+
* "fields[0].queryable must be a boolean" has to guess the rest of the shape, whereas one that
|
|
36
|
+
* gets the schema alongside it can correct the call in a single turn.
|
|
37
|
+
*
|
|
38
|
+
* @complexity O(f) in the field count, delegated to the parser.
|
|
39
|
+
* @overallScore 100
|
|
40
|
+
*/
|
|
41
|
+
function requireFields(input, toolId) {
|
|
42
|
+
const parsed = parseContentTypeFieldDefs(input.fields);
|
|
43
|
+
if (parsed.ok)
|
|
44
|
+
return parsed.value;
|
|
45
|
+
throw decorateWithSchema({ toolId, catalog: CATALOG_BY_ID, message: parsed.error.message });
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Projects a `ContentTypeRecord` into the explicit model-facing shape, instead of returning the
|
|
49
|
+
* domain record verbatim.
|
|
50
|
+
*
|
|
51
|
+
* Two reasons this is a named projection rather than a pass-through. `workspaceId` is dropped: the
|
|
52
|
+
* agent is already scoped to one workspace it did not choose and cannot change, so echoing the id
|
|
53
|
+
* back spends model attention on a value that can never inform a decision. And an explicit view
|
|
54
|
+
* means a future field added to `ContentTypeRecord` — for a plugin, an internal counter, an
|
|
55
|
+
* operator note — does not silently begin flowing to the model as a side effect of a domain change.
|
|
56
|
+
*
|
|
57
|
+
* `version` is deliberately kept: every mutating tool requires `expectedVersion`, so the model
|
|
58
|
+
* needs the post-write value to make a correct follow-up call without re-reading.
|
|
59
|
+
*
|
|
60
|
+
* @param record - The content type as the domain returned it.
|
|
61
|
+
* @returns The model-facing view. `tombstonedAt` is present only when set, so an active type's
|
|
62
|
+
* payload carries no always-null key.
|
|
63
|
+
* @complexity O(f) in the field count (the array is copied so the caller cannot alias domain state).
|
|
64
|
+
* @overallScore 100
|
|
65
|
+
*/
|
|
66
|
+
function toContentTypeView(record) {
|
|
67
|
+
const view = {
|
|
68
|
+
key: record.key,
|
|
69
|
+
label: record.label,
|
|
70
|
+
status: record.status,
|
|
71
|
+
version: record.version,
|
|
72
|
+
fields: [...record.fields],
|
|
73
|
+
};
|
|
74
|
+
if (record.tombstonedAt)
|
|
75
|
+
view.tombstonedAt = record.tombstonedAt;
|
|
76
|
+
return view;
|
|
77
|
+
}
|
|
78
|
+
function fromContentTypeResult(fn) {
|
|
79
|
+
return fromResult(fn).then(({ contentType }) => ({ contentType: toContentTypeView(contentType) }));
|
|
80
|
+
}
|
|
81
|
+
function contentTypesDeps(routeDeps) {
|
|
82
|
+
return {
|
|
83
|
+
repo: routeDeps.contentTypeRepo,
|
|
84
|
+
clock: routeDeps.clock,
|
|
85
|
+
ids: routeDeps.idGen,
|
|
86
|
+
authorize: routeDeps.authorize,
|
|
87
|
+
outbox: routeDeps.outbox,
|
|
88
|
+
indexProvisioner: routeDeps.contentTypeIndexProvisioner,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
export function buildContentTypesRegistrations(routeDeps) {
|
|
92
|
+
const handlers = {
|
|
93
|
+
collections_content_type_list: async (ctx) => {
|
|
94
|
+
requireNoInput(ctx.input);
|
|
95
|
+
await requireToolPermission(routeDeps, {
|
|
96
|
+
principalId: ctx.principal.id,
|
|
97
|
+
permission: "admin.collections.read",
|
|
98
|
+
entityType: "content-type",
|
|
99
|
+
});
|
|
100
|
+
const { items } = await listContentTypes({ repo: routeDeps.contentTypeRepo, workspaceId: routeDeps.workspaceId });
|
|
101
|
+
return { contentTypes: items.map(toContentTypeView) };
|
|
102
|
+
},
|
|
103
|
+
collections_content_type_define: async (ctx) => {
|
|
104
|
+
const input = requireInputRecord(ctx.input);
|
|
105
|
+
return fromContentTypeResult(() => registerContentType({
|
|
106
|
+
deps: contentTypesDeps(routeDeps),
|
|
107
|
+
input: {
|
|
108
|
+
actorId: ctx.principal.id,
|
|
109
|
+
principalKind: AGENT_TOOL_PRINCIPAL_KIND,
|
|
110
|
+
workspaceId: routeDeps.workspaceId,
|
|
111
|
+
key: requireString(input, "key"),
|
|
112
|
+
label: requireString(input, "label"),
|
|
113
|
+
fields: requireFields(input, "collections_content_type_define"),
|
|
114
|
+
},
|
|
115
|
+
}));
|
|
116
|
+
},
|
|
117
|
+
collections_content_type_update_fields: async (ctx) => {
|
|
118
|
+
const input = requireInputRecord(ctx.input);
|
|
119
|
+
return fromContentTypeResult(() => updateContentTypeFields({
|
|
120
|
+
deps: contentTypesDeps(routeDeps),
|
|
121
|
+
input: {
|
|
122
|
+
actorId: ctx.principal.id,
|
|
123
|
+
principalKind: AGENT_TOOL_PRINCIPAL_KIND,
|
|
124
|
+
workspaceId: routeDeps.workspaceId,
|
|
125
|
+
key: requireString(input, "key"),
|
|
126
|
+
fields: requireFields(input, "collections_content_type_update_fields"),
|
|
127
|
+
expectedVersion: requireNumber(input, "expectedVersion"),
|
|
128
|
+
},
|
|
129
|
+
}));
|
|
130
|
+
},
|
|
131
|
+
collections_content_type_deprecate: async (ctx) => {
|
|
132
|
+
const input = requireInputRecord(ctx.input);
|
|
133
|
+
return fromContentTypeResult(() => deprecateContentType({
|
|
134
|
+
deps: contentTypesDeps(routeDeps),
|
|
135
|
+
input: {
|
|
136
|
+
actorId: ctx.principal.id,
|
|
137
|
+
principalKind: AGENT_TOOL_PRINCIPAL_KIND,
|
|
138
|
+
workspaceId: routeDeps.workspaceId,
|
|
139
|
+
key: requireString(input, "key"),
|
|
140
|
+
expectedVersion: requireNumber(input, "expectedVersion"),
|
|
141
|
+
},
|
|
142
|
+
}));
|
|
143
|
+
},
|
|
144
|
+
collections_content_type_reactivate: async (ctx) => {
|
|
145
|
+
const input = requireInputRecord(ctx.input);
|
|
146
|
+
return fromContentTypeResult(() => reactivateContentType({
|
|
147
|
+
deps: contentTypesDeps(routeDeps),
|
|
148
|
+
input: {
|
|
149
|
+
actorId: ctx.principal.id,
|
|
150
|
+
principalKind: AGENT_TOOL_PRINCIPAL_KIND,
|
|
151
|
+
workspaceId: routeDeps.workspaceId,
|
|
152
|
+
key: requireString(input, "key"),
|
|
153
|
+
expectedVersion: requireNumber(input, "expectedVersion"),
|
|
154
|
+
},
|
|
155
|
+
}));
|
|
156
|
+
},
|
|
157
|
+
collections_content_type_tombstone: async (ctx) => {
|
|
158
|
+
const input = requireInputRecord(ctx.input);
|
|
159
|
+
return fromContentTypeResult(() => tombstoneContentType({
|
|
160
|
+
deps: contentTypesDeps(routeDeps),
|
|
161
|
+
input: {
|
|
162
|
+
actorId: ctx.principal.id,
|
|
163
|
+
principalKind: AGENT_TOOL_PRINCIPAL_KIND,
|
|
164
|
+
workspaceId: routeDeps.workspaceId,
|
|
165
|
+
key: requireString(input, "key"),
|
|
166
|
+
expectedVersion: requireNumber(input, "expectedVersion"),
|
|
167
|
+
},
|
|
168
|
+
}));
|
|
169
|
+
},
|
|
170
|
+
};
|
|
171
|
+
return buildDomainRegistrations({
|
|
172
|
+
domain: "content-types",
|
|
173
|
+
catalogModule: "features/content-types/agent-tools.ts",
|
|
174
|
+
catalog: CATALOG_BY_ID,
|
|
175
|
+
handlers,
|
|
176
|
+
derivedRisk: contentTypesDerivedRisk,
|
|
177
|
+
unwiredToolIds: UNWIRED_CONTENT_TYPES_TOOL_IDS,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
//# sourceMappingURL=tool-registrations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrations.js","sourceRoot":"","sources":["../../src/content-types/tool-registrations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Shared vocabulary for the `content-types` package.
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* The closed field-kind enum, the content-type record shape, and the generic `Result<T,E>`
|
|
6
|
+
* envelope every write-service/lifecycle/cleanup export in this package returns. Kept as plain
|
|
7
|
+
* data types with no I/O so every other module in this package (and `features/entries`, which
|
|
8
|
+
* consumes a content type's `fields` to validate an entry's `fieldsJson`) can depend on it
|
|
9
|
+
* without pulling in any adapter.
|
|
10
|
+
*
|
|
11
|
+
* How it relates to the project:
|
|
12
|
+
* The expression-index query surface requires the field-kind enum to be closed and
|
|
13
|
+
* mapped through a fixed lookup table (`index-provisioning.ts`), never interpolated — this file
|
|
14
|
+
* is that enum's single source of truth so the write-service's validation and the index
|
|
15
|
+
* provisioner's CAST-mapping can never drift apart.
|
|
16
|
+
*
|
|
17
|
+
* Architectural role:
|
|
18
|
+
* `features/content-types` domain vocabulary. No dependencies.
|
|
19
|
+
*/
|
|
20
|
+
/** CIC U-001-B1 — the closed, 5-entry field-kind enum. Never extend ad hoc. */
|
|
21
|
+
export declare const CONTENT_TYPE_FIELD_KINDS: readonly ["text", "integer", "real", "boolean", "datetime"];
|
|
22
|
+
export type ContentTypeFieldKind = (typeof CONTENT_TYPE_FIELD_KINDS)[number];
|
|
23
|
+
/**
|
|
24
|
+
* Type guard for {@link ContentTypeFieldKind}. The single gate every kind value must pass before
|
|
25
|
+
* it is trusted anywhere near DDL construction (`index-provisioning.ts`) or write validation.
|
|
26
|
+
*
|
|
27
|
+
* @complexity O(1).
|
|
28
|
+
* @overallScore 100
|
|
29
|
+
*/
|
|
30
|
+
export declare function isContentTypeFieldKind(value: unknown): value is ContentTypeFieldKind;
|
|
31
|
+
export interface ContentTypeFieldDef {
|
|
32
|
+
name: string;
|
|
33
|
+
kind: ContentTypeFieldKind;
|
|
34
|
+
required: boolean;
|
|
35
|
+
queryable: boolean;
|
|
36
|
+
}
|
|
37
|
+
export type ContentTypeStatus = "active" | "deprecated" | "tombstone";
|
|
38
|
+
/** Sample schema, expressed as the package's in-memory record shape (repo-agnostic). */
|
|
39
|
+
export interface ContentTypeRecord {
|
|
40
|
+
workspaceId: string;
|
|
41
|
+
key: string;
|
|
42
|
+
label: string;
|
|
43
|
+
fields: ContentTypeFieldDef[];
|
|
44
|
+
status: ContentTypeStatus;
|
|
45
|
+
version: number;
|
|
46
|
+
tombstonedAt?: string | null;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Actor classes a chokepoint write can be attributed to. Structurally identical to
|
|
50
|
+
* `identity.PrincipalKind`, deliberately redeclared here rather than imported so this package
|
|
51
|
+
* stays dependency-free (the same "no shared import, kept decoupled" convention `write-service.ts`
|
|
52
|
+
* applies to `AuthorizeFn`). `identity.PrincipalRecord.kind` assigns to it directly.
|
|
53
|
+
*/
|
|
54
|
+
export type ActorPrincipalKind = "user" | "agent" | "api_key" | "system";
|
|
55
|
+
/** The actor-identity envelope every chokepoint write in this package accepts (REQ-01/02/16). */
|
|
56
|
+
export interface ActorIdentityInput {
|
|
57
|
+
actorId: string;
|
|
58
|
+
/**
|
|
59
|
+
* Provenance for the audit trail: WHICH CLASS of actor performed this write. `actorId` alone
|
|
60
|
+
* cannot answer "was this the human admin, or the AI assistant acting for them?" — the assistant
|
|
61
|
+
* typically runs under that same human's principal id (a host's assistant proxy stamps it into
|
|
62
|
+
* the run's `contextRef`), so both paths record an identical `actorId`. Recorded onto
|
|
63
|
+
* the revision row by the write chokepoint; optional so pre-existing call sites are unaffected
|
|
64
|
+
* (they persist `NULL`, honestly meaning "not recorded" rather than a fabricated default).
|
|
65
|
+
*/
|
|
66
|
+
principalKind?: ActorPrincipalKind;
|
|
67
|
+
delegatedByWorkspaceId?: string | null;
|
|
68
|
+
delegatedById?: string | null;
|
|
69
|
+
}
|
|
70
|
+
/** Generic success/failure envelope used across this package instead of throwing for expected rejections. */
|
|
71
|
+
export type Result<T, E> = {
|
|
72
|
+
ok: true;
|
|
73
|
+
value: T;
|
|
74
|
+
} | {
|
|
75
|
+
ok: false;
|
|
76
|
+
error: E;
|
|
77
|
+
};
|
|
78
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/content-types/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB,6DAA8D,CAAC;AAEpG,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,wBAAwB,CAAC,CAAC,MAAM,CAAC,CAAC;AAE7E;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,oBAAoB,CAEpF;AAED,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,oBAAoB,CAAC;IAC3B,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,MAAM,iBAAiB,GAAG,QAAQ,GAAG,YAAY,GAAG,WAAW,CAAC;AAEtE,wFAAwF;AACxF,MAAM,WAAW,iBAAiB;IAChC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,MAAM,EAAE,iBAAiB,CAAC;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,CAAC;AAEzE,iGAAiG;AACjG,MAAM,WAAW,kBAAkB;IACjC,OAAO,EAAE,MAAM,CAAC;IAChB;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,kBAAkB,CAAC;IACnC,sBAAsB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvC,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AAED,6GAA6G;AAC7G,MAAM,MAAM,MAAM,CAAC,CAAC,EAAE,CAAC,IAAI;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,CAAC,CAAA;CAAE,CAAC"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Shared vocabulary for the `content-types` package.
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* The closed field-kind enum, the content-type record shape, and the generic `Result<T,E>`
|
|
6
|
+
* envelope every write-service/lifecycle/cleanup export in this package returns. Kept as plain
|
|
7
|
+
* data types with no I/O so every other module in this package (and `features/entries`, which
|
|
8
|
+
* consumes a content type's `fields` to validate an entry's `fieldsJson`) can depend on it
|
|
9
|
+
* without pulling in any adapter.
|
|
10
|
+
*
|
|
11
|
+
* How it relates to the project:
|
|
12
|
+
* The expression-index query surface requires the field-kind enum to be closed and
|
|
13
|
+
* mapped through a fixed lookup table (`index-provisioning.ts`), never interpolated — this file
|
|
14
|
+
* is that enum's single source of truth so the write-service's validation and the index
|
|
15
|
+
* provisioner's CAST-mapping can never drift apart.
|
|
16
|
+
*
|
|
17
|
+
* Architectural role:
|
|
18
|
+
* `features/content-types` domain vocabulary. No dependencies.
|
|
19
|
+
*/
|
|
20
|
+
/** CIC U-001-B1 — the closed, 5-entry field-kind enum. Never extend ad hoc. */
|
|
21
|
+
export const CONTENT_TYPE_FIELD_KINDS = ["text", "integer", "real", "boolean", "datetime"];
|
|
22
|
+
/**
|
|
23
|
+
* Type guard for {@link ContentTypeFieldKind}. The single gate every kind value must pass before
|
|
24
|
+
* it is trusted anywhere near DDL construction (`index-provisioning.ts`) or write validation.
|
|
25
|
+
*
|
|
26
|
+
* @complexity O(1).
|
|
27
|
+
* @overallScore 100
|
|
28
|
+
*/
|
|
29
|
+
export function isContentTypeFieldKind(value) {
|
|
30
|
+
return typeof value === "string" && CONTENT_TYPE_FIELD_KINDS.includes(value);
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/content-types/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,+EAA+E;AAC/E,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,UAAU,CAAU,CAAC;AAIpG;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAc;IACnD,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAK,wBAA8C,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;AACtG,CAAC"}
|