@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,57 @@
|
|
|
1
|
+
import type { ClockPort, UUID } from "../core/ports.js";
|
|
2
|
+
import type { MenuRepoPort } from "./repo.memory.js";
|
|
3
|
+
import type { NavLocationBindingRepoPort } from "./ports.js";
|
|
4
|
+
/**
|
|
5
|
+
* @file `rebuildNavLocationBindings` — the first real caller of the
|
|
6
|
+
* already-implemented-but-unused `NavLocationBindingRepoPort.rebuildForWorkspace`.
|
|
7
|
+
*
|
|
8
|
+
* Purpose:
|
|
9
|
+
* Reads every menu's `.locations` field (the source of truth,
|
|
10
|
+
* `NavMenuEntry.locations`), computes the resulting binding-index rows, and
|
|
11
|
+
* calls `rebuildForWorkspace` to replace the whole workspace's index in one
|
|
12
|
+
* shot. The index is derived + rebuildable by definition (same species as
|
|
13
|
+
* `entry_refs`) — a full
|
|
14
|
+
* rescan of menu entries can always reconstruct it, including dropping any
|
|
15
|
+
* orphan rows that drifted out of sync with the menus' own field.
|
|
16
|
+
*
|
|
17
|
+
* How it relates to the project:
|
|
18
|
+
* - Meant to be called once at boot from a host's SQLite composition root,
|
|
19
|
+
* after the SQLite db opens — the same
|
|
20
|
+
* per-row-failure-tolerant boot-time reconciliation pattern this library's
|
|
21
|
+
* first host uses elsewhere, though this rebuild has no per-row failure
|
|
22
|
+
* mode (a pure read-then-replace, not a fallible write-service call).
|
|
23
|
+
* - Also directly unit-testable against fixture repos, independent of which
|
|
24
|
+
* adapter (in-memory or a host's own SQLite adapter) is behind the ports.
|
|
25
|
+
*
|
|
26
|
+
* Architectural role:
|
|
27
|
+
* Feature logic only — no HTTP, no direct SQL. Read-then-replace, never a
|
|
28
|
+
* partial update (`rebuildForWorkspace` itself replaces the whole
|
|
29
|
+
* workspace's rows in one call, so there is no intermediate inconsistent
|
|
30
|
+
* state observable through the port).
|
|
31
|
+
*/
|
|
32
|
+
export interface RebuildNavLocationBindingsDeps {
|
|
33
|
+
menuRepo: MenuRepoPort;
|
|
34
|
+
bindingRepo: NavLocationBindingRepoPort;
|
|
35
|
+
clock: ClockPort;
|
|
36
|
+
workspaceId: UUID;
|
|
37
|
+
}
|
|
38
|
+
export interface RebuildNavLocationBindingsResult {
|
|
39
|
+
/** Total binding rows written (the size of the rebuilt index). */
|
|
40
|
+
rebuiltCount: number;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Recompute the workspace's `nav_location_bindings` index from scratch from
|
|
44
|
+
* every menu's `.locations` field, and replace the stored index with it.
|
|
45
|
+
* Idempotent: re-running against unchanged menu data produces the same
|
|
46
|
+
* index every time. If more than one menu somehow lists the same location
|
|
47
|
+
* key (a data-drift edge case the invariant should otherwise prevent), the
|
|
48
|
+
* later menu in `MenuRepoPort.list`'s iteration order wins — consistent with
|
|
49
|
+
* `NavLocationBindingRepoPort.upsert`'s existing last-writer-wins semantics
|
|
50
|
+
* elsewhere in this library.
|
|
51
|
+
*
|
|
52
|
+
* @complexity O(n) over menus in the workspace, plus O(k) over each menu's
|
|
53
|
+
* `.locations` entries (small, bounded by registered locations).
|
|
54
|
+
* @overallScore 100
|
|
55
|
+
*/
|
|
56
|
+
export declare function rebuildNavLocationBindings(deps: RebuildNavLocationBindingsDeps): Promise<RebuildNavLocationBindingsResult>;
|
|
57
|
+
//# sourceMappingURL=reconcile.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.d.ts","sourceRoot":"","sources":["../../src/navigation/reconcile.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAG7D;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,0BAA0B,CAAC;IACxC,KAAK,EAAE,SAAS,CAAC;IACjB,WAAW,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,gCAAgC;IAC/C,kEAAkE;IAClE,YAAY,EAAE,MAAM,CAAC;CACtB;AAED;;;;;;;;;;;;;GAaG;AACH,wBAAsB,0BAA0B,CAC9C,IAAI,EAAE,8BAA8B,GACnC,OAAO,CAAC,gCAAgC,CAAC,CAoB3C"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Recompute the workspace's `nav_location_bindings` index from scratch from
|
|
3
|
+
* every menu's `.locations` field, and replace the stored index with it.
|
|
4
|
+
* Idempotent: re-running against unchanged menu data produces the same
|
|
5
|
+
* index every time. If more than one menu somehow lists the same location
|
|
6
|
+
* key (a data-drift edge case the invariant should otherwise prevent), the
|
|
7
|
+
* later menu in `MenuRepoPort.list`'s iteration order wins — consistent with
|
|
8
|
+
* `NavLocationBindingRepoPort.upsert`'s existing last-writer-wins semantics
|
|
9
|
+
* elsewhere in this library.
|
|
10
|
+
*
|
|
11
|
+
* @complexity O(n) over menus in the workspace, plus O(k) over each menu's
|
|
12
|
+
* `.locations` entries (small, bounded by registered locations).
|
|
13
|
+
* @overallScore 100
|
|
14
|
+
*/
|
|
15
|
+
export async function rebuildNavLocationBindings(deps) {
|
|
16
|
+
const menus = await deps.menuRepo.list({ workspaceId: deps.workspaceId });
|
|
17
|
+
const boundAt = deps.clock.nowIso();
|
|
18
|
+
const byLocation = new Map();
|
|
19
|
+
for (const menu of menus) {
|
|
20
|
+
for (const locationKey of menu.locations) {
|
|
21
|
+
byLocation.set(locationKey, {
|
|
22
|
+
workspaceId: deps.workspaceId,
|
|
23
|
+
locationKey,
|
|
24
|
+
menuId: menu.id,
|
|
25
|
+
boundAt,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
const bindings = [...byLocation.values()];
|
|
30
|
+
await deps.bindingRepo.rebuildForWorkspace({ workspaceId: deps.workspaceId, bindings });
|
|
31
|
+
return { rebuiltCount: bindings.length };
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=reconcile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reconcile.js","sourceRoot":"","sources":["../../src/navigation/reconcile.ts"],"names":[],"mappings":"AA8CA;;;;;;;;;;;;;GAaG;AACH,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAC9C,IAAoC;IAEpC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IAC1E,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IAEpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAiC,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,KAAK,MAAM,WAAW,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACzC,UAAU,CAAC,GAAG,CAAC,WAAW,EAAE;gBAC1B,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,WAAW;gBACX,MAAM,EAAE,IAAI,CAAC,EAAE;gBACf,OAAO;aACR,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,MAAM,QAAQ,GAAG,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1C,MAAM,IAAI,CAAC,WAAW,CAAC,mBAAmB,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,QAAQ,EAAE,CAAC,CAAC;IAExF,OAAO,EAAE,YAAY,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file In-memory adapters for the `navigation` library.
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* Provides the two dev/test persistence adapters this build needs:
|
|
6
|
+
*
|
|
7
|
+
* - `InMemoryNavLocationBindingRepo` — the real `NavLocationBindingRepoPort`
|
|
8
|
+
* adapter (`ports.ts`) for the derived `nav_location_bindings` index, honoring
|
|
9
|
+
* its `UNIQUE (workspace_id, location_key)` constraint via last-writer-wins
|
|
10
|
+
* `upsert`.
|
|
11
|
+
* - `InMemoryMenuRepo` — a **self-contained** menu store. The original design is explicit
|
|
12
|
+
* that a menu "adds NO new persistence port" because it should ride the
|
|
13
|
+
* generic entries repo. That generic entries system is not yet
|
|
14
|
+
* implemented as reusable code (only `post` exists as a concrete type in the
|
|
15
|
+
* host that first built this), so this build stores menu records directly
|
|
16
|
+
* instead of force-fitting the not-yet-generic entries system. `MenuRepoPort`
|
|
17
|
+
* below is a local, navigation-owned interface (not part of the frozen
|
|
18
|
+
* `ports.ts` surface) that exists only to make this simplification
|
|
19
|
+
* swappable later without touching `menu-service.ts` call sites. When the
|
|
20
|
+
* generic entries system ships, this repo should be deleted in favor of the
|
|
21
|
+
* entries repo, and `MenuRepoPort` should be deleted in favor of typed reads
|
|
22
|
+
* over it.
|
|
23
|
+
*
|
|
24
|
+
* How it relates to the project:
|
|
25
|
+
* - `menu-service.ts` and `resolver.ts` depend on `MenuRepoPort`, not this
|
|
26
|
+
* concrete class, so a host-supplied SQLite/entries-backed adapter is a
|
|
27
|
+
* drop-in.
|
|
28
|
+
*
|
|
29
|
+
* Architectural role:
|
|
30
|
+
* Adapters only. No validation or business rules live here (that is
|
|
31
|
+
* `menu-service.ts`'s job) — these classes are dumb, uniqueness-enforcing
|
|
32
|
+
* collections.
|
|
33
|
+
*/
|
|
34
|
+
import type { UUID } from "../core/ports.js";
|
|
35
|
+
import type { NavLocationBindingRepoPort } from "./ports.js";
|
|
36
|
+
import type { NavLocationBindingRow, NavLocationKey, NavMenuEntry } from "./types.js";
|
|
37
|
+
/**
|
|
38
|
+
* Storage seam for menu records, standing in for the generic entries
|
|
39
|
+
* repo until that generic system exists as reusable code. Shape mirrors the
|
|
40
|
+
* `post` feature's own repo port plus a `remove` for hard purge, since menus
|
|
41
|
+
* have a real hard-delete step in their deletion ladder (mirrors the media
|
|
42
|
+
* library's).
|
|
43
|
+
*/
|
|
44
|
+
export interface MenuRepoPort {
|
|
45
|
+
findById(required: {
|
|
46
|
+
workspaceId: UUID;
|
|
47
|
+
id: UUID;
|
|
48
|
+
}): Promise<NavMenuEntry | null>;
|
|
49
|
+
findBySlug(required: {
|
|
50
|
+
workspaceId: UUID;
|
|
51
|
+
slug: string;
|
|
52
|
+
}): Promise<NavMenuEntry | null>;
|
|
53
|
+
list(required: {
|
|
54
|
+
workspaceId: UUID;
|
|
55
|
+
}): Promise<NavMenuEntry[]>;
|
|
56
|
+
save(record: NavMenuEntry): Promise<void>;
|
|
57
|
+
/** Hard-remove a menu row. Only called after the trash step. */
|
|
58
|
+
remove(required: {
|
|
59
|
+
workspaceId: UUID;
|
|
60
|
+
id: UUID;
|
|
61
|
+
}): Promise<void>;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* In-memory `MenuRepoPort` adapter for dev/tests. See file header for why a
|
|
65
|
+
* self-contained repo exists instead of an entries-backed one.
|
|
66
|
+
*
|
|
67
|
+
* @complexity Every operation is O(n) in the workspace's menu count via a
|
|
68
|
+
* linear scan; acceptable for the in-memory/dev-test adapter this library
|
|
69
|
+
* builds now. A SQLite adapter would index `(workspace_id, id)` /
|
|
70
|
+
* `(workspace_id, slug)` instead.
|
|
71
|
+
* @overallScore 100
|
|
72
|
+
*/
|
|
73
|
+
export declare class InMemoryMenuRepo implements MenuRepoPort {
|
|
74
|
+
private rows;
|
|
75
|
+
constructor(initialRows?: NavMenuEntry[]);
|
|
76
|
+
findById(required: {
|
|
77
|
+
workspaceId: UUID;
|
|
78
|
+
id: UUID;
|
|
79
|
+
}): Promise<NavMenuEntry | null>;
|
|
80
|
+
findBySlug(required: {
|
|
81
|
+
workspaceId: UUID;
|
|
82
|
+
slug: string;
|
|
83
|
+
}): Promise<NavMenuEntry | null>;
|
|
84
|
+
list(required: {
|
|
85
|
+
workspaceId: UUID;
|
|
86
|
+
}): Promise<NavMenuEntry[]>;
|
|
87
|
+
save(record: NavMenuEntry): Promise<void>;
|
|
88
|
+
remove(required: {
|
|
89
|
+
workspaceId: UUID;
|
|
90
|
+
id: UUID;
|
|
91
|
+
}): Promise<void>;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* In-memory `NavLocationBindingRepoPort` adapter for dev/tests. Enforces the
|
|
95
|
+
* derived index's `UNIQUE (workspace_id, location_key)` constraint by storing
|
|
96
|
+
* at most one row per `(workspaceId, locationKey)` pair: `upsert` replaces
|
|
97
|
+
* whatever row previously held that key (last-writer-wins).
|
|
98
|
+
*
|
|
99
|
+
* @complexity O(n) linear scan per operation over the workspace's binding
|
|
100
|
+
* count; `n` is bounded by the number of registered locations, which is small
|
|
101
|
+
* by construction (never a user-scale collection).
|
|
102
|
+
* @overallScore 100
|
|
103
|
+
*/
|
|
104
|
+
export declare class InMemoryNavLocationBindingRepo implements NavLocationBindingRepoPort {
|
|
105
|
+
private rows;
|
|
106
|
+
constructor(initialRows?: NavLocationBindingRow[]);
|
|
107
|
+
findByLocation(required: {
|
|
108
|
+
workspaceId: UUID;
|
|
109
|
+
locationKey: NavLocationKey;
|
|
110
|
+
}): Promise<NavLocationBindingRow | null>;
|
|
111
|
+
listByMenu(required: {
|
|
112
|
+
workspaceId: UUID;
|
|
113
|
+
menuId: UUID;
|
|
114
|
+
}): Promise<NavLocationBindingRow[]>;
|
|
115
|
+
listByWorkspace(required: {
|
|
116
|
+
workspaceId: UUID;
|
|
117
|
+
}): Promise<NavLocationBindingRow[]>;
|
|
118
|
+
upsert(required: {
|
|
119
|
+
workspaceId: UUID;
|
|
120
|
+
locationKey: NavLocationKey;
|
|
121
|
+
menuId: UUID;
|
|
122
|
+
boundAt: string;
|
|
123
|
+
}): Promise<NavLocationBindingRow>;
|
|
124
|
+
remove(required: {
|
|
125
|
+
workspaceId: UUID;
|
|
126
|
+
locationKey: NavLocationKey;
|
|
127
|
+
}): Promise<void>;
|
|
128
|
+
removeByMenu(required: {
|
|
129
|
+
workspaceId: UUID;
|
|
130
|
+
menuId: UUID;
|
|
131
|
+
}): Promise<void>;
|
|
132
|
+
rebuildForWorkspace(required: {
|
|
133
|
+
workspaceId: UUID;
|
|
134
|
+
bindings: readonly NavLocationBindingRow[];
|
|
135
|
+
}): Promise<void>;
|
|
136
|
+
}
|
|
137
|
+
//# sourceMappingURL=repo.memory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.memory.d.ts","sourceRoot":"","sources":["../../src/navigation/repo.memory.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,qBAAqB,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAOtF;;;;;;GAMG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IAClF,UAAU,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,CAAC;IACxF,IAAI,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAC/D,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1C,gEAAgE;IAChE,MAAM,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAClE;AAED;;;;;;;;;GASG;AACH,qBAAa,gBAAiB,YAAW,YAAY;IACnD,OAAO,CAAC,IAAI,CAAiB;gBAEjB,WAAW,GAAE,YAAY,EAAO;IAItC,QAAQ,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQjF,UAAU,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAQvF,IAAI,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAI9D,IAAI,CAAC,MAAM,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAWzC,MAAM,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,EAAE,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;CAKvE;AAMD;;;;;;;;;;GAUG;AACH,qBAAa,8BAA+B,YAAW,0BAA0B;IAC/E,OAAO,CAAC,IAAI,CAA0B;gBAE1B,WAAW,GAAE,qBAAqB,EAAO;IAI/C,cAAc,CAAC,QAAQ,EAAE;QAC7B,WAAW,EAAE,IAAI,CAAC;QAClB,WAAW,EAAE,cAAc,CAAC;KAC7B,GAAG,OAAO,CAAC,qBAAqB,GAAG,IAAI,CAAC;IASnC,UAAU,CAAC,QAAQ,EAAE;QACzB,WAAW,EAAE,IAAI,CAAC;QAClB,MAAM,EAAE,IAAI,CAAC;KACd,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAM9B,eAAe,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,qBAAqB,EAAE,CAAC;IAIlF,MAAM,CAAC,QAAQ,EAAE;QACrB,WAAW,EAAE,IAAI,CAAC;QAClB,WAAW,EAAE,cAAc,CAAC;QAC5B,MAAM,EAAE,IAAI,CAAC;QACb,OAAO,EAAE,MAAM,CAAC;KACjB,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAsB5B,MAAM,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,WAAW,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAOnF,YAAY,CAAC,QAAQ,EAAE;QAAE,WAAW,EAAE,IAAI,CAAC;QAAC,MAAM,EAAE,IAAI,CAAA;KAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAM1E,mBAAmB,CAAC,QAAQ,EAAE;QAClC,WAAW,EAAE,IAAI,CAAC;QAClB,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;KAC5C,GAAG,OAAO,CAAC,IAAI,CAAC;CAIlB"}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* In-memory `MenuRepoPort` adapter for dev/tests. See file header for why a
|
|
3
|
+
* self-contained repo exists instead of an entries-backed one.
|
|
4
|
+
*
|
|
5
|
+
* @complexity Every operation is O(n) in the workspace's menu count via a
|
|
6
|
+
* linear scan; acceptable for the in-memory/dev-test adapter this library
|
|
7
|
+
* builds now. A SQLite adapter would index `(workspace_id, id)` /
|
|
8
|
+
* `(workspace_id, slug)` instead.
|
|
9
|
+
* @overallScore 100
|
|
10
|
+
*/
|
|
11
|
+
export class InMemoryMenuRepo {
|
|
12
|
+
rows;
|
|
13
|
+
constructor(initialRows = []) {
|
|
14
|
+
this.rows = [...initialRows];
|
|
15
|
+
}
|
|
16
|
+
async findById(required) {
|
|
17
|
+
return (this.rows.find((row) => row.workspaceId === required.workspaceId && row.id === required.id) ?? null);
|
|
18
|
+
}
|
|
19
|
+
async findBySlug(required) {
|
|
20
|
+
return (this.rows.find((row) => row.workspaceId === required.workspaceId && row.slug === required.slug) ?? null);
|
|
21
|
+
}
|
|
22
|
+
async list(required) {
|
|
23
|
+
return this.rows.filter((row) => row.workspaceId === required.workspaceId);
|
|
24
|
+
}
|
|
25
|
+
async save(record) {
|
|
26
|
+
const index = this.rows.findIndex((row) => row.workspaceId === record.workspaceId && row.id === record.id);
|
|
27
|
+
if (index === -1) {
|
|
28
|
+
this.rows.push(record);
|
|
29
|
+
return;
|
|
30
|
+
}
|
|
31
|
+
this.rows[index] = record;
|
|
32
|
+
}
|
|
33
|
+
async remove(required) {
|
|
34
|
+
this.rows = this.rows.filter((row) => !(row.workspaceId === required.workspaceId && row.id === required.id));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// ---------------------------------------------------------------------------
|
|
38
|
+
// NavLocationBindingRepoPort — the one real port this library declares
|
|
39
|
+
// ---------------------------------------------------------------------------
|
|
40
|
+
/**
|
|
41
|
+
* In-memory `NavLocationBindingRepoPort` adapter for dev/tests. Enforces the
|
|
42
|
+
* derived index's `UNIQUE (workspace_id, location_key)` constraint by storing
|
|
43
|
+
* at most one row per `(workspaceId, locationKey)` pair: `upsert` replaces
|
|
44
|
+
* whatever row previously held that key (last-writer-wins).
|
|
45
|
+
*
|
|
46
|
+
* @complexity O(n) linear scan per operation over the workspace's binding
|
|
47
|
+
* count; `n` is bounded by the number of registered locations, which is small
|
|
48
|
+
* by construction (never a user-scale collection).
|
|
49
|
+
* @overallScore 100
|
|
50
|
+
*/
|
|
51
|
+
export class InMemoryNavLocationBindingRepo {
|
|
52
|
+
rows;
|
|
53
|
+
constructor(initialRows = []) {
|
|
54
|
+
this.rows = [...initialRows];
|
|
55
|
+
}
|
|
56
|
+
async findByLocation(required) {
|
|
57
|
+
return (this.rows.find((row) => row.workspaceId === required.workspaceId && row.locationKey === required.locationKey) ?? null);
|
|
58
|
+
}
|
|
59
|
+
async listByMenu(required) {
|
|
60
|
+
return this.rows.filter((row) => row.workspaceId === required.workspaceId && row.menuId === required.menuId);
|
|
61
|
+
}
|
|
62
|
+
async listByWorkspace(required) {
|
|
63
|
+
return this.rows.filter((row) => row.workspaceId === required.workspaceId);
|
|
64
|
+
}
|
|
65
|
+
async upsert(required) {
|
|
66
|
+
const row = {
|
|
67
|
+
workspaceId: required.workspaceId,
|
|
68
|
+
locationKey: required.locationKey,
|
|
69
|
+
menuId: required.menuId,
|
|
70
|
+
boundAt: required.boundAt,
|
|
71
|
+
};
|
|
72
|
+
const index = this.rows.findIndex((existing) => existing.workspaceId === required.workspaceId &&
|
|
73
|
+
existing.locationKey === required.locationKey);
|
|
74
|
+
if (index === -1) {
|
|
75
|
+
this.rows.push(row);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
// Last-writer-wins reassignment: the UNIQUE(workspace_id, location_key)
|
|
79
|
+
// constraint means there is never more than one row for this key.
|
|
80
|
+
this.rows[index] = row;
|
|
81
|
+
}
|
|
82
|
+
return row;
|
|
83
|
+
}
|
|
84
|
+
async remove(required) {
|
|
85
|
+
this.rows = this.rows.filter((row) => !(row.workspaceId === required.workspaceId && row.locationKey === required.locationKey));
|
|
86
|
+
}
|
|
87
|
+
async removeByMenu(required) {
|
|
88
|
+
this.rows = this.rows.filter((row) => !(row.workspaceId === required.workspaceId && row.menuId === required.menuId));
|
|
89
|
+
}
|
|
90
|
+
async rebuildForWorkspace(required) {
|
|
91
|
+
const others = this.rows.filter((row) => row.workspaceId !== required.workspaceId);
|
|
92
|
+
this.rows = [...others, ...required.bindings];
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=repo.memory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"repo.memory.js","sourceRoot":"","sources":["../../src/navigation/repo.memory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Render-time read model for the `navigation` library.
|
|
3
|
+
*
|
|
4
|
+
* Purpose:
|
|
5
|
+
* `resolveForLocation` is the one typed call a theme renderer makes: look up
|
|
6
|
+
* the menu bound to a location, then walk its stored item tree into a
|
|
7
|
+
* `ResolvedNav` — concrete hrefs, `available` flags, active-state — so the
|
|
8
|
+
* theme "receives resolved data, never resolves refs".
|
|
9
|
+
*
|
|
10
|
+
* How it relates to the project:
|
|
11
|
+
* - `entryRef`/`termRef`/`route` targets need a resolver over entries/taxonomy/
|
|
12
|
+
* routing. Those are host-owned concerns and are not this library's running
|
|
13
|
+
* code, so this module does NOT import them. Instead it takes an injected
|
|
14
|
+
* `resolveTargetHref` function as a dependency — the exact seam a host's own
|
|
15
|
+
* routing layer later backs. This keeps `resolver.ts` compiling and testable
|
|
16
|
+
* today with a fake, and wiring a real routing implementation in later is a
|
|
17
|
+
* pure DI swap, not a rewrite.
|
|
18
|
+
* - `url` targets are already-resolved hrefs (validated at write time in
|
|
19
|
+
* `menu-service.ts`) and pass straight through.
|
|
20
|
+
* - `termRef` targets: term-link
|
|
21
|
+
* integrity has **no compatible schema yet** (`entry_refs` is
|
|
22
|
+
* entry-to-entry only) — this is a named blocker, not an oversight.
|
|
23
|
+
* This resolver does not special-case `termRef`; it is passed to the same
|
|
24
|
+
* injected `resolveTargetHref` as `entryRef`/`route`, and a fake/real
|
|
25
|
+
* resolver that has no term schema to consult should return `null`, which
|
|
26
|
+
* this module already turns into `available: false` on that node only (the
|
|
27
|
+
* rest of the tree still resolves).
|
|
28
|
+
*
|
|
29
|
+
* Architectural role:
|
|
30
|
+
* Pure read-side feature logic. No storage writes; no theme code reachable
|
|
31
|
+
* from here reads storage directly (render-IR boundary honored by
|
|
32
|
+
* returning only `ResolvedNav`/`ResolvedNavItem` data).
|
|
33
|
+
*/
|
|
34
|
+
import type { MenuRepoPort } from "./repo.memory.js";
|
|
35
|
+
import type { NavLocationBindingRepoPort, NavResolveContext } from "./ports.js";
|
|
36
|
+
import type { NavLocationKey, NavMenuDoc, NavTarget, ResolvedNav, ResolvedNavItem } from "./types.js";
|
|
37
|
+
/**
|
|
38
|
+
* A resolved, already-known-available href for a `url` target, or the outcome
|
|
39
|
+
* of resolving a ref/route target: `path` plus whether it is currently
|
|
40
|
+
* reachable. `null` means "could not resolve at all" (unknown/deleted/no
|
|
41
|
+
* schema yet, e.g. `termRef` per the Round-3 fold) — distinct from
|
|
42
|
+
* `available: false`, which means "resolved to a real target that is
|
|
43
|
+
* currently unavailable" (e.g. trashed). Both cases end up `available: false`
|
|
44
|
+
* on the `ResolvedNavItem`; the distinction is for the resolver implementation's
|
|
45
|
+
* own diagnostics, not surfaced further.
|
|
46
|
+
*/
|
|
47
|
+
export interface ResolvedTargetHref {
|
|
48
|
+
readonly path: string;
|
|
49
|
+
readonly available: boolean;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* The injected seam standing in for a host's own routing library. Resolves
|
|
53
|
+
* one non-`url` target (`entryRef`, `termRef`, or `route`) to an href, or
|
|
54
|
+
* `null` if it cannot be resolved at all (deleted target, or — for `termRef`
|
|
55
|
+
* today — no schema yet to resolve against).
|
|
56
|
+
*/
|
|
57
|
+
export type ResolveTargetHrefFn = (target: NavTarget, context: NavResolveContext) => Promise<ResolvedTargetHref | null>;
|
|
58
|
+
export interface ResolveForLocationDeps {
|
|
59
|
+
menuRepo: MenuRepoPort;
|
|
60
|
+
bindingRepo: NavLocationBindingRepoPort;
|
|
61
|
+
resolveTargetHref: ResolveTargetHrefFn;
|
|
62
|
+
}
|
|
63
|
+
export interface ResolveForLocationServiceInput {
|
|
64
|
+
workspaceId: string;
|
|
65
|
+
locationKey: NavLocationKey;
|
|
66
|
+
/** Current request path, for `isCurrent`/`isActive` computation. */
|
|
67
|
+
currentPath?: string | undefined;
|
|
68
|
+
}
|
|
69
|
+
export interface ResolveForLocationRequired {
|
|
70
|
+
deps: ResolveForLocationDeps;
|
|
71
|
+
input: ResolveForLocationServiceInput;
|
|
72
|
+
}
|
|
73
|
+
export interface ResolveForLocationOptional {
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Resolves the menu bound to a theme location into a render-ready
|
|
77
|
+
* `ResolvedNav`, or `null` if the location has no menu bound.
|
|
78
|
+
*
|
|
79
|
+
* Defensive note: if the binding index points at a menu id the menu repo no
|
|
80
|
+
* longer has (a stale derived row — the index is declared rebuildable —
|
|
81
|
+
* this resolves to `null` rather than throwing, since a
|
|
82
|
+
* missing nav fragment is a theme-recoverable degradation and a hard error at
|
|
83
|
+
* render time is not.
|
|
84
|
+
*
|
|
85
|
+
* @complexity O(n) over the resolved menu's total node count — one
|
|
86
|
+
* `resolveTargetHref` call per non-`url` node, awaited depth-first. No bound
|
|
87
|
+
* on concurrency is applied since menu trees are bounded (
|
|
88
|
+
* `DEFAULT_MAX_ITEM_COUNT` in `menu-service.ts`) and are not a user-scale
|
|
89
|
+
* collection at render time.
|
|
90
|
+
* @overallScore 100
|
|
91
|
+
*/
|
|
92
|
+
export declare function resolveForLocation(required: ResolveForLocationRequired, _optional?: ResolveForLocationOptional): Promise<ResolvedNav | null>;
|
|
93
|
+
export interface ResolveMenuDocRequired {
|
|
94
|
+
doc: NavMenuDoc;
|
|
95
|
+
context: NavResolveContext;
|
|
96
|
+
resolveTargetHref: ResolveTargetHrefFn;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Resolves a menu document's item tree into render-ready `ResolvedNavItem`s, independent of any
|
|
100
|
+
* location binding — the doc-level building block `resolveForLocation` composes on top of (menu
|
|
101
|
+
* lookup + location-binding lookup), and the seam a caller with a menu already in hand (e.g. a
|
|
102
|
+
* `widgets`-style `menu` widget type) needs to get real hrefs without duplicating the href-walking
|
|
103
|
+
* logic `resolveForLocation` already owns (`resolveItemList`/`resolveItem` below stay
|
|
104
|
+
* module-private; this is the one exported entry point to their behavior).
|
|
105
|
+
*
|
|
106
|
+
* @complexity O(n) over the doc's total node count — see `resolveItemList`.
|
|
107
|
+
* @overallScore 100
|
|
108
|
+
*/
|
|
109
|
+
export declare function resolveMenuDoc(required: ResolveMenuDocRequired): Promise<ResolvedNavItem[]>;
|
|
110
|
+
//# sourceMappingURL=resolver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.d.ts","sourceRoot":"","sources":["../../src/navigation/resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACrD,OAAO,KAAK,EAAE,0BAA0B,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAChF,OAAO,KAAK,EAEV,cAAc,EACd,UAAU,EACV,SAAS,EACT,WAAW,EACX,eAAe,EAChB,MAAM,YAAY,CAAC;AAEpB;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AAED;;;;;GAKG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAChC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,iBAAiB,KACvB,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAAC;AAExC,MAAM,WAAW,sBAAsB;IACrC,QAAQ,EAAE,YAAY,CAAC;IACvB,WAAW,EAAE,0BAA0B,CAAC;IACxC,iBAAiB,EAAE,mBAAmB,CAAC;CACxC;AAED,MAAM,WAAW,8BAA8B;IAC7C,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,cAAc,CAAC;IAC5B,oEAAoE;IACpE,WAAW,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,WAAW,0BAA0B;IACzC,IAAI,EAAE,sBAAsB,CAAC;IAC7B,KAAK,EAAE,8BAA8B,CAAC;CACvC;AAED,MAAM,WAAW,0BAA0B;CAAG;AAE9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,0BAA0B,EACpC,SAAS,GAAE,0BAA+B,GACzC,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,CAyB7B;AAED,MAAM,WAAW,sBAAsB;IACrC,GAAG,EAAE,UAAU,CAAC;IAChB,OAAO,EAAE,iBAAiB,CAAC;IAC3B,iBAAiB,EAAE,mBAAmB,CAAC;CACxC;AAED;;;;;;;;;;GAUG;AACH,wBAAsB,cAAc,CAAC,QAAQ,EAAE,sBAAsB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAGjG"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolves the menu bound to a theme location into a render-ready
|
|
3
|
+
* `ResolvedNav`, or `null` if the location has no menu bound.
|
|
4
|
+
*
|
|
5
|
+
* Defensive note: if the binding index points at a menu id the menu repo no
|
|
6
|
+
* longer has (a stale derived row — the index is declared rebuildable —
|
|
7
|
+
* this resolves to `null` rather than throwing, since a
|
|
8
|
+
* missing nav fragment is a theme-recoverable degradation and a hard error at
|
|
9
|
+
* render time is not.
|
|
10
|
+
*
|
|
11
|
+
* @complexity O(n) over the resolved menu's total node count — one
|
|
12
|
+
* `resolveTargetHref` call per non-`url` node, awaited depth-first. No bound
|
|
13
|
+
* on concurrency is applied since menu trees are bounded (
|
|
14
|
+
* `DEFAULT_MAX_ITEM_COUNT` in `menu-service.ts`) and are not a user-scale
|
|
15
|
+
* collection at render time.
|
|
16
|
+
* @overallScore 100
|
|
17
|
+
*/
|
|
18
|
+
export async function resolveForLocation(required, _optional = {}) {
|
|
19
|
+
const { deps, input } = required;
|
|
20
|
+
const binding = await deps.bindingRepo.findByLocation({
|
|
21
|
+
workspaceId: input.workspaceId,
|
|
22
|
+
locationKey: input.locationKey,
|
|
23
|
+
});
|
|
24
|
+
if (!binding)
|
|
25
|
+
return null;
|
|
26
|
+
const menu = await deps.menuRepo.findById({ workspaceId: input.workspaceId, id: binding.menuId });
|
|
27
|
+
if (!menu)
|
|
28
|
+
return null;
|
|
29
|
+
const context = {
|
|
30
|
+
workspaceId: input.workspaceId,
|
|
31
|
+
currentPath: input.currentPath,
|
|
32
|
+
};
|
|
33
|
+
const items = await resolveMenuDoc({ doc: menu.doc, context, resolveTargetHref: deps.resolveTargetHref });
|
|
34
|
+
return {
|
|
35
|
+
menuId: menu.id,
|
|
36
|
+
locationKey: input.locationKey,
|
|
37
|
+
title: menu.title,
|
|
38
|
+
items,
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Resolves a menu document's item tree into render-ready `ResolvedNavItem`s, independent of any
|
|
43
|
+
* location binding — the doc-level building block `resolveForLocation` composes on top of (menu
|
|
44
|
+
* lookup + location-binding lookup), and the seam a caller with a menu already in hand (e.g. a
|
|
45
|
+
* `widgets`-style `menu` widget type) needs to get real hrefs without duplicating the href-walking
|
|
46
|
+
* logic `resolveForLocation` already owns (`resolveItemList`/`resolveItem` below stay
|
|
47
|
+
* module-private; this is the one exported entry point to their behavior).
|
|
48
|
+
*
|
|
49
|
+
* @complexity O(n) over the doc's total node count — see `resolveItemList`.
|
|
50
|
+
* @overallScore 100
|
|
51
|
+
*/
|
|
52
|
+
export async function resolveMenuDoc(required) {
|
|
53
|
+
const { doc, context, resolveTargetHref } = required;
|
|
54
|
+
return resolveItemList(doc.items, context, resolveTargetHref);
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Resolves a sibling list of item nodes, depth-first, preserving order.
|
|
58
|
+
*
|
|
59
|
+
* @complexity O(n) over the subtree's node count.
|
|
60
|
+
* @overallScore 100
|
|
61
|
+
*/
|
|
62
|
+
async function resolveItemList(nodes, context, resolveTargetHref) {
|
|
63
|
+
const resolved = [];
|
|
64
|
+
for (const node of nodes) {
|
|
65
|
+
resolved.push(await resolveItem(node, context, resolveTargetHref));
|
|
66
|
+
}
|
|
67
|
+
return resolved;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Resolves one node: `url` targets pass through directly (already validated
|
|
71
|
+
* hrefs, `menu-service.ts`); every other kind goes through the injected
|
|
72
|
+
* `resolveTargetHref` seam. A `null`/unavailable result never throws and never
|
|
73
|
+
* drops the node — it is returned with `available: false, href: null` so the
|
|
74
|
+
* rest of the tree keeps resolving (themes must omit unavailable
|
|
75
|
+
* links, never render dead ones, but core still hands back a full model for
|
|
76
|
+
* the theme to filter).
|
|
77
|
+
*
|
|
78
|
+
* Label-fallback simplification: `types.ts`'s `NavItemNode.label` doc says it
|
|
79
|
+
* "falls back to the target's title when absent." Deriving a target's title
|
|
80
|
+
* needs entry/taxonomy metadata that `ResolveTargetHrefFn` does not return
|
|
81
|
+
* (only `{ path, available }`); doing that fallback for real is deferred to
|
|
82
|
+
* whenever the injected resolver is widened to return a title alongside the
|
|
83
|
+
* href. For now an absent `label` resolves to `""`, which is a documented gap,
|
|
84
|
+
* not a silent behavior claim.
|
|
85
|
+
*
|
|
86
|
+
* @complexity O(1) at this node plus the cost of resolving its `children`
|
|
87
|
+
* subtree (accounted in the caller's overall O(n)).
|
|
88
|
+
* @overallScore 90
|
|
89
|
+
* @findings Low: label fallback to target title is not implemented (see note
|
|
90
|
+
* above) — deferred pending a richer `ResolveTargetHrefFn` return shape.
|
|
91
|
+
*/
|
|
92
|
+
async function resolveItem(node, context, resolveTargetHref) {
|
|
93
|
+
const children = node.children
|
|
94
|
+
? await resolveItemList(node.children, context, resolveTargetHref)
|
|
95
|
+
: [];
|
|
96
|
+
let href = null;
|
|
97
|
+
let available;
|
|
98
|
+
if (node.target.kind === "url") {
|
|
99
|
+
href = node.target.href;
|
|
100
|
+
available = true;
|
|
101
|
+
}
|
|
102
|
+
else {
|
|
103
|
+
// entryRef / termRef / route: resolved via the injected seam standing in
|
|
104
|
+
// for the host's own routing layer, which is not this library's running
|
|
105
|
+
// code. termRef in particular has no compatible entry_refs schema today
|
|
106
|
+
// — a resolver with no term schema to
|
|
107
|
+
// consult returns null here, same as any other "cannot resolve" outcome.
|
|
108
|
+
const result = await resolveTargetHref(node.target, context);
|
|
109
|
+
if (result === null) {
|
|
110
|
+
href = null;
|
|
111
|
+
available = false;
|
|
112
|
+
}
|
|
113
|
+
else {
|
|
114
|
+
href = result.path;
|
|
115
|
+
available = result.available;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
const isCurrent = available && href !== null && context.currentPath !== undefined && href === context.currentPath;
|
|
119
|
+
const isActive = isCurrent || children.some((child) => child.isActive);
|
|
120
|
+
return {
|
|
121
|
+
id: node.id,
|
|
122
|
+
label: node.label ?? "",
|
|
123
|
+
href: available ? href : null,
|
|
124
|
+
available,
|
|
125
|
+
isCurrent,
|
|
126
|
+
isActive,
|
|
127
|
+
attrs: node.attrs,
|
|
128
|
+
children,
|
|
129
|
+
};
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/navigation/resolver.ts"],"names":[],"mappings":"AA0FA;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,QAAoC,EACpC,YAAwC,EAAE;IAE1C,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,QAAQ,CAAC;IAEjC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,cAAc,CAAC;QACpD,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC,CAAC;IACH,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IAE1B,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,EAAE,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IAEvB,MAAM,OAAO,GAAsB;QACjC,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,WAAW,EAAE,KAAK,CAAC,WAAW;KAC/B,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM,cAAc,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,IAAI,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAE1G,OAAO;QACL,MAAM,EAAE,IAAI,CAAC,EAAE;QACf,WAAW,EAAE,KAAK,CAAC,WAAW;QAC9B,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,KAAK;KACN,CAAC;AACJ,CAAC;AAQD;;;;;;;;;;GAUG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAgC;IACnE,MAAM,EAAE,GAAG,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,QAAQ,CAAC;IACrD,OAAO,eAAe,CAAC,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC;AAChE,CAAC;AAED;;;;;GAKG;AACH,KAAK,UAAU,eAAe,CAC5B,KAA6B,EAC7B,OAA0B,EAC1B,iBAAsC;IAEtC,MAAM,QAAQ,GAAsB,EAAE,CAAC;IACvC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,QAAQ,CAAC,IAAI,CAAC,MAAM,WAAW,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,CAAC,CAAC,CAAC;IACrE,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,KAAK,UAAU,WAAW,CACxB,IAAiB,EACjB,OAA0B,EAC1B,iBAAsC;IAEtC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ;QAC5B,CAAC,CAAC,MAAM,eAAe,CAAC,IAAI,CAAC,QAAQ,EAAE,OAAO,EAAE,iBAAiB,CAAC;QAClE,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,SAAkB,CAAC;IAEvB,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,KAAK,EAAE,CAAC;QAC/B,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC;QACxB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC;SAAM,CAAC;QACN,yEAAyE;QACzE,wEAAwE;QACxE,wEAAwE;QACxE,sCAAsC;QACtC,yEAAyE;QACzE,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7D,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;YACpB,IAAI,GAAG,IAAI,CAAC;YACZ,SAAS,GAAG,KAAK,CAAC;QACpB,CAAC;aAAM,CAAC;YACN,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC;YACnB,SAAS,GAAG,MAAM,CAAC,SAAS,CAAC;QAC/B,CAAC;IACH,CAAC;IAED,MAAM,SAAS,GACb,SAAS,IAAI,IAAI,KAAK,IAAI,IAAI,OAAO,CAAC,WAAW,KAAK,SAAS,IAAI,IAAI,KAAK,OAAO,CAAC,WAAW,CAAC;IAClG,MAAM,QAAQ,GAAG,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAEvE,OAAO;QACL,EAAE,EAAE,IAAI,CAAC,EAAE;QACX,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,EAAE;QACvB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;QAC7B,SAAS;QACT,SAAS;QACT,QAAQ;QACR,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ;KACT,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @file Navigation's (Menus') half of the agent-tool authorization wiring: maps `agent-tools.ts`'s five
|
|
3
|
+
* catalog entries onto `menu-service.ts`'s read/create/update/assign operations, as
|
|
4
|
+
* `ToolRegistration`s. The entire catalog is wired — `deleteMenu` is deliberately absent from the
|
|
5
|
+
* catalog rather than present-but-unwired; see `navigation/agent-tools.ts`'s own header.
|
|
6
|
+
*
|
|
7
|
+
* Authorization shape: like Media and unlike Forms/Identity/Widgets, `menu-service.ts`'s functions
|
|
8
|
+
* perform NO internal `authorize()` call of their own — every admin HTTP route a host builds gates
|
|
9
|
+
* inline. Every handler here does the same via the kit's `requireToolPermission`, which is the
|
|
10
|
+
* single evaluation for these tools, located where the real route locates it.
|
|
11
|
+
*/
|
|
12
|
+
import type { AuthorizeFn } from "../core/commands/command.js";
|
|
13
|
+
import type { OutboxPort } from "../core/ports.js";
|
|
14
|
+
import { type DerivedRiskByToolId, type ToolRegistration } from "../core/tools/registration-kit.js";
|
|
15
|
+
import type { NavLocationBindingRepoPort } from "./ports.js";
|
|
16
|
+
import type { MenuRepoPort } from "./repo.memory.js";
|
|
17
|
+
/**
|
|
18
|
+
* The exact slice of the route-deps bag Menus' tool handlers read. Declared structurally (rather
|
|
19
|
+
* than importing a host's own `RouteDeps`) so this module carries no back-edge into any host's
|
|
20
|
+
* composition root. A host's `server/routes/*` satisfies this structurally by passing its existing
|
|
21
|
+
* route-deps object; nothing there needs to change shape.
|
|
22
|
+
*/
|
|
23
|
+
export interface MenusToolDeps {
|
|
24
|
+
authorize: AuthorizeFn;
|
|
25
|
+
workspaceId: string;
|
|
26
|
+
clock: {
|
|
27
|
+
nowIso(): string;
|
|
28
|
+
};
|
|
29
|
+
idGen: {
|
|
30
|
+
newId(): string;
|
|
31
|
+
};
|
|
32
|
+
outbox: OutboxPort;
|
|
33
|
+
menuRepo: MenuRepoPort;
|
|
34
|
+
navLocationBindingRepo: NavLocationBindingRepoPort;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* This wiring layer's OWN risk classification, authored from what each handler below actually
|
|
38
|
+
* calls. See `DerivedRiskByToolId` in the kit for why it is independent of the catalog's own
|
|
39
|
+
* `sideEffects` declaration.
|
|
40
|
+
*/
|
|
41
|
+
export declare const menusDerivedRisk: DerivedRiskByToolId;
|
|
42
|
+
export declare function buildMenusRegistrations(routeDeps: MenusToolDeps): ToolRegistration[];
|
|
43
|
+
//# sourceMappingURL=tool-registrations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-registrations.d.ts","sourceRoot":"","sources":["../../src/navigation/tool-registrations.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC/D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EASL,KAAK,mBAAmB,EAExB,KAAK,gBAAgB,EACtB,MAAM,mCAAmC,CAAC;AAG3C,OAAO,KAAK,EAAE,0BAA0B,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAKrD;;;;;GAKG;AACH,MAAM,WAAW,aAAa;IAC5B,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,QAAQ,EAAE,YAAY,CAAC;IACvB,sBAAsB,EAAE,0BAA0B,CAAC;CACpD;AAED;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,EAAE,mBAa7B,CAAC;AA0CH,wBAAgB,uBAAuB,CAAC,SAAS,EAAE,aAAa,GAAG,gBAAgB,EAAE,CA8EpF"}
|