@cleocode/core 2026.6.13 → 2026.6.15
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/dist/admin/ops.d.ts +4 -0
- package/dist/admin/ops.d.ts.map +1 -1
- package/dist/check/index.d.ts +12 -0
- package/dist/check/index.d.ts.map +1 -0
- package/dist/check/index.js +12 -0
- package/dist/check/index.js.map +1 -0
- package/dist/check/pr-gate.d.ts +183 -0
- package/dist/check/pr-gate.d.ts.map +1 -0
- package/dist/check/pr-gate.js +348 -0
- package/dist/check/pr-gate.js.map +1 -0
- package/dist/conduit/delivery-router.d.ts +134 -0
- package/dist/conduit/delivery-router.d.ts.map +1 -0
- package/dist/conduit/delivery-router.js +0 -0
- package/dist/conduit/delivery-router.js.map +1 -0
- package/dist/conduit/index.d.ts +5 -2
- package/dist/conduit/index.d.ts.map +1 -1
- package/dist/conduit/index.js +5 -2
- package/dist/conduit/index.js.map +1 -1
- package/dist/conduit/local-tui-adapter.d.ts +89 -0
- package/dist/conduit/local-tui-adapter.d.ts.map +1 -0
- package/dist/conduit/local-tui-adapter.js +225 -0
- package/dist/conduit/local-tui-adapter.js.map +1 -0
- package/dist/config/config-repair.d.ts +70 -0
- package/dist/config/config-repair.d.ts.map +1 -0
- package/dist/config/config-repair.js +248 -0
- package/dist/config/config-repair.js.map +1 -0
- package/dist/config/registry.d.ts +54 -0
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +92 -0
- package/dist/config/registry.js.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +11 -10
- package/dist/config.js.map +1 -1
- package/dist/deriver/queue-manager.d.ts +30 -2
- package/dist/deriver/queue-manager.d.ts.map +1 -1
- package/dist/deriver/queue-manager.js +54 -9
- package/dist/deriver/queue-manager.js.map +1 -1
- package/dist/dispatch/config-domain-handler.d.ts +125 -0
- package/dist/dispatch/config-domain-handler.d.ts.map +1 -0
- package/dist/dispatch/config-domain-handler.js +160 -0
- package/dist/dispatch/config-domain-handler.js.map +1 -0
- package/dist/dispatch/contracts/input-contracts.d.ts.map +1 -1
- package/dist/dispatch/contracts/input-contracts.js +19 -1
- package/dist/dispatch/contracts/input-contracts.js.map +1 -1
- package/dist/docs/export-document.js +3721 -696
- package/dist/docs/export-document.js.map +3 -3
- package/dist/gateway-client/client.d.ts +123 -0
- package/dist/gateway-client/client.d.ts.map +1 -0
- package/dist/gateway-client/client.js +93 -0
- package/dist/gateway-client/client.js.map +1 -0
- package/dist/gateway-client/generated/client/client.gen.d.ts +3 -0
- package/dist/gateway-client/generated/client/client.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/client/client.gen.js +217 -0
- package/dist/gateway-client/generated/client/client.gen.js.map +1 -0
- package/dist/gateway-client/generated/client/index.d.ts +11 -0
- package/dist/gateway-client/generated/client/index.d.ts.map +1 -0
- package/dist/gateway-client/generated/client/index.js +7 -0
- package/dist/gateway-client/generated/client/index.js.map +1 -0
- package/dist/gateway-client/generated/client/types.gen.d.ts +121 -0
- package/dist/gateway-client/generated/client/types.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/client/types.gen.js +3 -0
- package/dist/gateway-client/generated/client/types.gen.js.map +1 -0
- package/dist/gateway-client/generated/client/utils.gen.d.ts +38 -0
- package/dist/gateway-client/generated/client/utils.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/client/utils.gen.js +229 -0
- package/dist/gateway-client/generated/client/utils.gen.js.map +1 -0
- package/dist/gateway-client/generated/client.gen.d.ts +13 -0
- package/dist/gateway-client/generated/client.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/client.gen.js +4 -0
- package/dist/gateway-client/generated/client.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/auth.gen.d.ts +26 -0
- package/dist/gateway-client/generated/core/auth.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/auth.gen.js +15 -0
- package/dist/gateway-client/generated/core/auth.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts +26 -0
- package/dist/gateway-client/generated/core/bodySerializer.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/bodySerializer.gen.js +58 -0
- package/dist/gateway-client/generated/core/bodySerializer.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/params.gen.d.ts +44 -0
- package/dist/gateway-client/generated/core/params.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/params.gen.js +101 -0
- package/dist/gateway-client/generated/core/params.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts +34 -0
- package/dist/gateway-client/generated/core/pathSerializer.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/pathSerializer.gen.js +107 -0
- package/dist/gateway-client/generated/core/pathSerializer.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts +19 -0
- package/dist/gateway-client/generated/core/queryKeySerializer.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/queryKeySerializer.gen.js +93 -0
- package/dist/gateway-client/generated/core/queryKeySerializer.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts +72 -0
- package/dist/gateway-client/generated/core/serverSentEvents.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/serverSentEvents.gen.js +133 -0
- package/dist/gateway-client/generated/core/serverSentEvents.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/types.gen.d.ts +84 -0
- package/dist/gateway-client/generated/core/types.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/types.gen.js +3 -0
- package/dist/gateway-client/generated/core/types.gen.js.map +1 -0
- package/dist/gateway-client/generated/core/utils.gen.d.ts +20 -0
- package/dist/gateway-client/generated/core/utils.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/core/utils.gen.js +88 -0
- package/dist/gateway-client/generated/core/utils.gen.js.map +1 -0
- package/dist/gateway-client/generated/index.d.ts +3 -0
- package/dist/gateway-client/generated/index.d.ts.map +1 -0
- package/dist/gateway-client/generated/index.js +3 -0
- package/dist/gateway-client/generated/index.js.map +1 -0
- package/dist/gateway-client/generated/namespaces.gen.d.ts +512 -0
- package/dist/gateway-client/generated/namespaces.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/namespaces.gen.js +521 -0
- package/dist/gateway-client/generated/namespaces.gen.js.map +1 -0
- package/dist/gateway-client/generated/sdk.gen.d.ts +1780 -0
- package/dist/gateway-client/generated/sdk.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/sdk.gen.js +3811 -0
- package/dist/gateway-client/generated/sdk.gen.js.map +1 -0
- package/dist/gateway-client/generated/types.gen.d.ts +14681 -0
- package/dist/gateway-client/generated/types.gen.d.ts.map +1 -0
- package/dist/gateway-client/generated/types.gen.js +3 -0
- package/dist/gateway-client/generated/types.gen.js.map +1 -0
- package/dist/gateway-client/index.d.ts +27 -0
- package/dist/gateway-client/index.d.ts.map +1 -0
- package/dist/gateway-client/index.js +25 -0
- package/dist/gateway-client/index.js.map +1 -0
- package/dist/gc/cleanup.d.ts +23 -8
- package/dist/gc/cleanup.d.ts.map +1 -1
- package/dist/gc/cleanup.js +287 -22
- package/dist/gc/cleanup.js.map +1 -1
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -0
- package/dist/index.js.map +1 -1
- package/dist/init.d.ts.map +1 -1
- package/dist/init.js +28 -0
- package/dist/init.js.map +1 -1
- package/dist/internal.d.ts +10 -1
- package/dist/internal.d.ts.map +1 -1
- package/dist/internal.js +18 -1
- package/dist/internal.js.map +1 -1
- package/dist/llm/catalog-model-resolver.d.ts +19 -0
- package/dist/llm/catalog-model-resolver.d.ts.map +1 -1
- package/dist/llm/catalog-model-resolver.js +36 -0
- package/dist/llm/catalog-model-resolver.js.map +1 -1
- package/dist/llm/catalog-resolver.d.ts +112 -0
- package/dist/llm/catalog-resolver.d.ts.map +1 -0
- package/dist/llm/catalog-resolver.js +207 -0
- package/dist/llm/catalog-resolver.js.map +1 -0
- package/dist/llm/catalog-seeder.d.ts +96 -0
- package/dist/llm/catalog-seeder.d.ts.map +1 -0
- package/dist/llm/catalog-seeder.js +189 -0
- package/dist/llm/catalog-seeder.js.map +1 -0
- package/dist/llm/cli-ops.d.ts +16 -0
- package/dist/llm/cli-ops.d.ts.map +1 -1
- package/dist/llm/cli-ops.js +37 -10
- package/dist/llm/cli-ops.js.map +1 -1
- package/dist/llm/complexity-classifier.d.ts +208 -0
- package/dist/llm/complexity-classifier.d.ts.map +1 -0
- package/dist/llm/complexity-classifier.js +359 -0
- package/dist/llm/complexity-classifier.js.map +1 -0
- package/dist/llm/credential-pool.d.ts +2 -0
- package/dist/llm/credential-pool.d.ts.map +1 -1
- package/dist/llm/credential-pool.js +5 -2
- package/dist/llm/credential-pool.js.map +1 -1
- package/dist/llm/credentials-store.d.ts +10 -14
- package/dist/llm/credentials-store.d.ts.map +1 -1
- package/dist/llm/credentials-store.js.map +1 -1
- package/dist/llm/cross-provider-selector.d.ts +249 -0
- package/dist/llm/cross-provider-selector.d.ts.map +1 -0
- package/dist/llm/cross-provider-selector.js +572 -0
- package/dist/llm/cross-provider-selector.js.map +1 -0
- package/dist/llm/entity-ops.d.ts +299 -0
- package/dist/llm/entity-ops.d.ts.map +1 -0
- package/dist/llm/entity-ops.js +441 -0
- package/dist/llm/entity-ops.js.map +1 -0
- package/dist/llm/index.d.ts +17 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +9 -0
- package/dist/llm/index.js.map +1 -1
- package/dist/llm/llm-queue-admit.d.ts +118 -0
- package/dist/llm/llm-queue-admit.d.ts.map +1 -0
- package/dist/llm/llm-queue-admit.js +275 -0
- package/dist/llm/llm-queue-admit.js.map +1 -0
- package/dist/llm/local-model-fit.d.ts +260 -0
- package/dist/llm/local-model-fit.d.ts.map +1 -0
- package/dist/llm/local-model-fit.js +563 -0
- package/dist/llm/local-model-fit.js.map +1 -0
- package/dist/llm/oauth/device-code.d.ts.map +1 -1
- package/dist/llm/oauth/device-code.js +2 -8
- package/dist/llm/oauth/device-code.js.map +1 -1
- package/dist/llm/oauth/google-pkce.d.ts.map +1 -1
- package/dist/llm/oauth/google-pkce.js +2 -18
- package/dist/llm/oauth/google-pkce.js.map +1 -1
- package/dist/llm/oauth/pkce.d.ts +70 -0
- package/dist/llm/oauth/pkce.d.ts.map +1 -1
- package/dist/llm/oauth/pkce.js +106 -29
- package/dist/llm/oauth/pkce.js.map +1 -1
- package/dist/llm/onboarding/front-door.d.ts +146 -0
- package/dist/llm/onboarding/front-door.d.ts.map +1 -0
- package/dist/llm/onboarding/front-door.js +153 -0
- package/dist/llm/onboarding/front-door.js.map +1 -0
- package/dist/llm/onboarding/login-engine.d.ts +175 -0
- package/dist/llm/onboarding/login-engine.d.ts.map +1 -0
- package/dist/llm/onboarding/login-engine.js +286 -0
- package/dist/llm/onboarding/login-engine.js.map +1 -0
- package/dist/llm/pi/pi-gondolin-env.d.ts +23 -0
- package/dist/llm/pi/pi-gondolin-env.d.ts.map +1 -1
- package/dist/llm/pi/pi-gondolin-env.js +2 -2
- package/dist/llm/pi/pi-gondolin-env.js.map +1 -1
- package/dist/llm/plugin-facade.js +4612 -1042
- package/dist/llm/plugin-facade.js.map +3 -3
- package/dist/llm/provider-registry/builtin/anthropic.d.ts.map +1 -1
- package/dist/llm/provider-registry/builtin/anthropic.js +23 -10
- package/dist/llm/provider-registry/builtin/anthropic.js.map +1 -1
- package/dist/llm/provider-registry/builtin/ollama.d.ts +18 -0
- package/dist/llm/provider-registry/builtin/ollama.d.ts.map +1 -1
- package/dist/llm/provider-registry/builtin/ollama.js +20 -2
- package/dist/llm/provider-registry/builtin/ollama.js.map +1 -1
- package/dist/llm/provider-registry/provider-alias.d.ts +62 -0
- package/dist/llm/provider-registry/provider-alias.d.ts.map +1 -0
- package/dist/llm/provider-registry/provider-alias.js +85 -0
- package/dist/llm/provider-registry/provider-alias.js.map +1 -0
- package/dist/llm/provider-registry/provider-defs.d.ts +45 -0
- package/dist/llm/provider-registry/provider-defs.d.ts.map +1 -0
- package/dist/llm/provider-registry/provider-defs.js +145 -0
- package/dist/llm/provider-registry/provider-defs.js.map +1 -0
- package/dist/llm/provider-registry/provider-seed.d.ts +78 -0
- package/dist/llm/provider-registry/provider-seed.d.ts.map +1 -0
- package/dist/llm/provider-registry/provider-seed.js +113 -0
- package/dist/llm/provider-registry/provider-seed.js.map +1 -0
- package/dist/llm/role-executor.d.ts.map +1 -1
- package/dist/llm/role-executor.js +36 -0
- package/dist/llm/role-executor.js.map +1 -1
- package/dist/llm/role-resolver.d.ts.map +1 -1
- package/dist/llm/role-resolver.js +52 -10
- package/dist/llm/role-resolver.js.map +1 -1
- package/dist/llm/system-resolver.d.ts.map +1 -1
- package/dist/llm/system-resolver.js +73 -22
- package/dist/llm/system-resolver.js.map +1 -1
- package/dist/llm/transports/codex-responses.d.ts +111 -88
- package/dist/llm/transports/codex-responses.d.ts.map +1 -1
- package/dist/llm/transports/codex-responses.js +456 -258
- package/dist/llm/transports/codex-responses.js.map +1 -1
- package/dist/memory/learnings.d.ts +4 -0
- package/dist/memory/learnings.d.ts.map +1 -1
- package/dist/memory/patterns.d.ts +4 -0
- package/dist/memory/patterns.d.ts.map +1 -1
- package/dist/metrics/index.d.ts +2 -0
- package/dist/metrics/index.d.ts.map +1 -1
- package/dist/metrics/index.js +1 -0
- package/dist/metrics/index.js.map +1 -1
- package/dist/orchestration/spawn.d.ts +89 -0
- package/dist/orchestration/spawn.d.ts.map +1 -1
- package/dist/orchestration/spawn.js +68 -0
- package/dist/orchestration/spawn.js.map +1 -1
- package/dist/playbooks/cantbook-profile.d.ts +96 -0
- package/dist/playbooks/cantbook-profile.d.ts.map +1 -0
- package/dist/playbooks/cantbook-profile.js +97 -0
- package/dist/playbooks/cantbook-profile.js.map +1 -0
- package/dist/playbooks/guarded-deterministic-runner.d.ts +153 -0
- package/dist/playbooks/guarded-deterministic-runner.d.ts.map +1 -0
- package/dist/playbooks/guarded-deterministic-runner.js +155 -0
- package/dist/playbooks/guarded-deterministic-runner.js.map +1 -0
- package/dist/playbooks/index.d.ts +2 -0
- package/dist/playbooks/index.d.ts.map +1 -1
- package/dist/playbooks/index.js +10 -0
- package/dist/playbooks/index.js.map +1 -1
- package/dist/playbooks/pi-runner-wiring.d.ts +75 -0
- package/dist/playbooks/pi-runner-wiring.d.ts.map +1 -0
- package/dist/playbooks/pi-runner-wiring.js +82 -0
- package/dist/playbooks/pi-runner-wiring.js.map +1 -0
- package/dist/release/index.d.ts +2 -2
- package/dist/release/index.d.ts.map +1 -1
- package/dist/release/index.js +1 -1
- package/dist/release/index.js.map +1 -1
- package/dist/release/reconcile.d.ts +97 -0
- package/dist/release/reconcile.d.ts.map +1 -1
- package/dist/release/reconcile.js +412 -5
- package/dist/release/reconcile.js.map +1 -1
- package/dist/resources/backend.d.ts +155 -0
- package/dist/resources/backend.d.ts.map +1 -0
- package/dist/resources/backend.js +23 -0
- package/dist/resources/backend.js.map +1 -0
- package/dist/resources/linux-backend.d.ts +167 -0
- package/dist/resources/linux-backend.d.ts.map +1 -0
- package/dist/resources/linux-backend.js +259 -0
- package/dist/resources/linux-backend.js.map +1 -0
- package/dist/resources/monitor.d.ts +230 -0
- package/dist/resources/monitor.d.ts.map +1 -0
- package/dist/resources/monitor.js +255 -0
- package/dist/resources/monitor.js.map +1 -0
- package/dist/resources/spawn-wrapper.d.ts +265 -0
- package/dist/resources/spawn-wrapper.d.ts.map +1 -0
- package/dist/resources/spawn-wrapper.js +304 -0
- package/dist/resources/spawn-wrapper.js.map +1 -0
- package/dist/runtime/openapi/generate-openapi.d.ts +211 -0
- package/dist/runtime/openapi/generate-openapi.d.ts.map +1 -0
- package/dist/runtime/openapi/generate-openapi.js +300 -0
- package/dist/runtime/openapi/generate-openapi.js.map +1 -0
- package/dist/runtime/openapi/index.d.ts +16 -0
- package/dist/runtime/openapi/index.d.ts.map +1 -0
- package/dist/runtime/openapi/index.js +16 -0
- package/dist/runtime/openapi/index.js.map +1 -0
- package/dist/selfimprove/budget.d.ts +11 -2
- package/dist/selfimprove/budget.d.ts.map +1 -1
- package/dist/selfimprove/budget.js +11 -2
- package/dist/selfimprove/budget.js.map +1 -1
- package/dist/selfimprove/fix-gen.d.ts +229 -0
- package/dist/selfimprove/fix-gen.d.ts.map +1 -0
- package/dist/selfimprove/fix-gen.js +266 -0
- package/dist/selfimprove/fix-gen.js.map +1 -0
- package/dist/selfimprove/run-loop.d.ts +44 -4
- package/dist/selfimprove/run-loop.d.ts.map +1 -1
- package/dist/selfimprove/run-loop.js +73 -6
- package/dist/selfimprove/run-loop.js.map +1 -1
- package/dist/selfimprove/scenarios/dhq-replay-find/golden.json +32 -0
- package/dist/selfimprove/scenarios/dhq-replay-find/scenario.json +18 -0
- package/dist/sentient/cross-project-hygiene.d.ts +11 -2
- package/dist/sentient/cross-project-hygiene.d.ts.map +1 -1
- package/dist/sentient/cross-project-hygiene.js +73 -10
- package/dist/sentient/cross-project-hygiene.js.map +1 -1
- package/dist/sentient/daemon.d.ts.map +1 -1
- package/dist/sentient/daemon.js +7 -2
- package/dist/sentient/daemon.js.map +1 -1
- package/dist/sentient/worktree-dispatch.d.ts.map +1 -1
- package/dist/sentient/worktree-dispatch.js +8 -1
- package/dist/sentient/worktree-dispatch.js.map +1 -1
- package/dist/setup/config-json-merge.d.ts.map +1 -1
- package/dist/setup/config-json-merge.js +14 -0
- package/dist/setup/config-json-merge.js.map +1 -1
- package/dist/setup/index.d.ts +23 -11
- package/dist/setup/index.d.ts.map +1 -1
- package/dist/setup/index.js +25 -12
- package/dist/setup/index.js.map +1 -1
- package/dist/setup/sections/llm.d.ts +28 -1
- package/dist/setup/sections/llm.d.ts.map +1 -1
- package/dist/setup/sections/llm.js +27 -6
- package/dist/setup/sections/llm.js.map +1 -1
- package/dist/setup/sections/models-roles.d.ts +40 -0
- package/dist/setup/sections/models-roles.d.ts.map +1 -0
- package/dist/setup/sections/models-roles.js +219 -0
- package/dist/setup/sections/models-roles.js.map +1 -0
- package/dist/setup/wizard.d.ts +19 -1
- package/dist/setup/wizard.d.ts.map +1 -1
- package/dist/setup/wizard.js.map +1 -1
- package/dist/spawn/branch-lock.d.ts.map +1 -1
- package/dist/spawn/branch-lock.js +7 -1
- package/dist/spawn/branch-lock.js.map +1 -1
- package/dist/store/attachment-repair.d.ts +110 -0
- package/dist/store/attachment-repair.d.ts.map +1 -0
- package/dist/store/attachment-repair.js +326 -0
- package/dist/store/attachment-repair.js.map +1 -0
- package/dist/store/attachment-store.d.ts.map +1 -1
- package/dist/store/attachment-store.js +24 -7
- package/dist/store/attachment-store.js.map +1 -1
- package/dist/store/schedule-schema.d.ts +195 -0
- package/dist/store/schedule-schema.d.ts.map +1 -0
- package/dist/store/schedule-schema.js +84 -0
- package/dist/store/schedule-schema.js.map +1 -0
- package/dist/store/schedule-store.d.ts +144 -0
- package/dist/store/schedule-store.d.ts.map +1 -0
- package/dist/store/schedule-store.js +162 -0
- package/dist/store/schedule-store.js.map +1 -0
- package/dist/store/schema/attachments.d.ts +1 -1
- package/dist/store/schema/cleo-global/index.d.ts +3 -0
- package/dist/store/schema/cleo-global/index.d.ts.map +1 -1
- package/dist/store/schema/cleo-global/index.js +5 -0
- package/dist/store/schema/cleo-global/index.js.map +1 -1
- package/dist/store/schema/cleo-global/models-catalog.d.ts +359 -0
- package/dist/store/schema/cleo-global/models-catalog.d.ts.map +1 -0
- package/dist/store/schema/cleo-global/models-catalog.js +114 -0
- package/dist/store/schema/cleo-global/models-catalog.js.map +1 -0
- package/dist/store/schema/cleo-global/providers.d.ts +279 -0
- package/dist/store/schema/cleo-global/providers.d.ts.map +1 -0
- package/dist/store/schema/cleo-global/providers.js +94 -0
- package/dist/store/schema/cleo-global/providers.js.map +1 -0
- package/dist/store/schema/cleo-global/services.d.ts +493 -0
- package/dist/store/schema/cleo-global/services.d.ts.map +1 -0
- package/dist/store/schema/cleo-global/services.js +200 -0
- package/dist/store/schema/cleo-global/services.js.map +1 -0
- package/dist/store/schema/cleo-project/docs.d.ts +1 -1
- package/dist/store/schema/cleo-project/provenance-rest.d.ts +1 -1
- package/dist/store/schema/cleo-shared/brain.d.ts +2 -2
- package/dist/store/schema/memory-schema.d.ts +182 -2
- package/dist/store/schema/memory-schema.d.ts.map +1 -1
- package/dist/store/schema/memory-schema.js +111 -2
- package/dist/store/schema/memory-schema.js.map +1 -1
- package/dist/store/schema/provenance/releases.d.ts +1 -1
- package/dist/store/service-connections-accessor.d.ts +313 -0
- package/dist/store/service-connections-accessor.d.ts.map +1 -0
- package/dist/store/service-connections-accessor.js +464 -0
- package/dist/store/service-connections-accessor.js.map +1 -0
- package/dist/store/service-host-matcher.d.ts +70 -0
- package/dist/store/service-host-matcher.d.ts.map +1 -0
- package/dist/store/service-host-matcher.js +127 -0
- package/dist/store/service-host-matcher.js.map +1 -0
- package/dist/store/service-injection.d.ts +152 -0
- package/dist/store/service-injection.d.ts.map +1 -0
- package/dist/store/service-injection.js +225 -0
- package/dist/store/service-injection.js.map +1 -0
- package/dist/store/service-oauth.d.ts +287 -0
- package/dist/store/service-oauth.d.ts.map +1 -0
- package/dist/store/service-oauth.js +524 -0
- package/dist/store/service-oauth.js.map +1 -0
- package/dist/store/service-trust-gate.d.ts +164 -0
- package/dist/store/service-trust-gate.d.ts.map +1 -0
- package/dist/store/service-trust-gate.js +122 -0
- package/dist/store/service-trust-gate.js.map +1 -0
- package/dist/store/validation-schemas.d.ts +4 -4
- package/dist/tasks/agent-lifecycle-lane.d.ts +175 -0
- package/dist/tasks/agent-lifecycle-lane.d.ts.map +1 -0
- package/dist/tasks/agent-lifecycle-lane.js +176 -0
- package/dist/tasks/agent-lifecycle-lane.js.map +1 -0
- package/dist/tasks/complete.d.ts +17 -0
- package/dist/tasks/complete.d.ts.map +1 -1
- package/dist/tasks/complete.js +53 -10
- package/dist/tasks/complete.js.map +1 -1
- package/dist/tasks/depends-waiver-audit.d.ts +52 -0
- package/dist/tasks/depends-waiver-audit.d.ts.map +1 -0
- package/dist/tasks/depends-waiver-audit.js +36 -0
- package/dist/tasks/depends-waiver-audit.js.map +1 -0
- package/dist/tasks/engine-wrap.d.ts +36 -2
- package/dist/tasks/engine-wrap.d.ts.map +1 -1
- package/dist/tasks/engine-wrap.js +44 -2
- package/dist/tasks/engine-wrap.js.map +1 -1
- package/dist/tasks/evidence.d.ts +34 -2
- package/dist/tasks/evidence.d.ts.map +1 -1
- package/dist/tasks/evidence.js +293 -35
- package/dist/tasks/evidence.js.map +1 -1
- package/dist/tasks/index.d.ts +1 -0
- package/dist/tasks/index.d.ts.map +1 -1
- package/dist/tasks/index.js +1 -0
- package/dist/tasks/index.js.map +1 -1
- package/dist/tasks/ops.d.ts +3 -0
- package/dist/tasks/ops.d.ts.map +1 -1
- package/dist/tasks/task-ops.d.ts +1 -1
- package/dist/tasks/task-ops.d.ts.map +1 -1
- package/dist/tasks/task-ops.js +3 -1
- package/dist/tasks/task-ops.js.map +1 -1
- package/dist/tasks/task-reparent.d.ts +90 -0
- package/dist/tasks/task-reparent.d.ts.map +1 -1
- package/dist/tasks/task-reparent.js +171 -0
- package/dist/tasks/task-reparent.js.map +1 -1
- package/dist/tools/builtin-agent-tools.d.ts.map +1 -1
- package/dist/tools/builtin-agent-tools.js +41 -0
- package/dist/tools/builtin-agent-tools.js.map +1 -1
- package/dist/tools/exec-code-agent-tool.d.ts +179 -0
- package/dist/tools/exec-code-agent-tool.d.ts.map +1 -0
- package/dist/tools/exec-code-agent-tool.js +239 -0
- package/dist/tools/exec-code-agent-tool.js.map +1 -0
- package/dist/tools/index.d.ts +6 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +15 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/mcp-agent-tool.d.ts +189 -0
- package/dist/tools/mcp-agent-tool.d.ts.map +1 -0
- package/dist/tools/mcp-agent-tool.js +243 -0
- package/dist/tools/mcp-agent-tool.js.map +1 -0
- package/dist/tools/media-agent-tools.d.ts +105 -0
- package/dist/tools/media-agent-tools.d.ts.map +1 -0
- package/dist/tools/media-agent-tools.js +255 -0
- package/dist/tools/media-agent-tools.js.map +1 -0
- package/dist/tools/memory-agent-tools.d.ts +99 -0
- package/dist/tools/memory-agent-tools.d.ts.map +1 -0
- package/dist/tools/memory-agent-tools.js +190 -0
- package/dist/tools/memory-agent-tools.js.map +1 -0
- package/dist/tools/schedule-agent-tools.d.ts +151 -0
- package/dist/tools/schedule-agent-tools.d.ts.map +1 -0
- package/dist/tools/schedule-agent-tools.js +238 -0
- package/dist/tools/schedule-agent-tools.js.map +1 -0
- package/dist/tools/skill-agent-tool.d.ts +108 -0
- package/dist/tools/skill-agent-tool.d.ts.map +1 -0
- package/dist/tools/skill-agent-tool.js +135 -0
- package/dist/tools/skill-agent-tool.js.map +1 -0
- package/dist/validation/engine-ops.d.ts.map +1 -1
- package/dist/validation/engine-ops.js +17 -1
- package/dist/validation/engine-ops.js.map +1 -1
- package/dist/verification/verify-tools.d.ts.map +1 -1
- package/dist/verification/verify-tools.js +5 -6
- package/dist/verification/verify-tools.js.map +1 -1
- package/migrations/drizzle-brain/20260610000001_t10405-bitemporal-network-columns/migration.sql +71 -0
- package/migrations/drizzle-cleo-global/20260609000000_t11937-service-vault/migration.sql +93 -0
- package/migrations/drizzle-cleo-global/20260609010000_t11733-models-catalog/migration.sql +65 -0
- package/migrations/drizzle-cleo-global/20260609020000_t11703-providers/migration.sql +52 -0
- package/migrations/drizzle-cleo-global/20260610000000_t11962-schedules/migration.sql +48 -0
- package/migrations/drizzle-cleo-project/20260610000000_t11962-schedules/migration.sql +48 -0
- package/package.json +33 -13
- package/templates/workflows/release-prepare.yml.tmpl +48 -2
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native MCP client (fan-IN) agent tool — connect-time `listTools` → register each
|
|
3
|
+
* remote tool into the {@link ./agent-registry.js | AgentToolRegistry}
|
|
4
|
+
* (T11948 · M7 · epic T11456 · SG-TOOLS · satisfies T11593 EP-MCP-HOST-FANIN + T1746).
|
|
5
|
+
*
|
|
6
|
+
* Where the runtime gateway is the MCP *server* (fan-OUT: it EXPOSES cleo ops as
|
|
7
|
+
* MCP tools), this is the MCP *client* (fan-IN: it CONNECTS to an external MCP
|
|
8
|
+
* server and PULLS its tools into cleo's own agent loop). On connect the client
|
|
9
|
+
* performs the MCP handshake (`initialize` → `tools/list`) and registers EACH
|
|
10
|
+
* remote tool as a proxy {@link AgentToolDescriptor} BEFORE the registry is frozen
|
|
11
|
+
* (init-time fan-in). Each proxy tool's `execute` issues a `tools/call` over the
|
|
12
|
+
* SAME transport and formats the result for the loop; a transport failure becomes a
|
|
13
|
+
* typed result (the executable NEVER throws — the frozen ToolDispatchEngine is
|
|
14
|
+
* unchanged).
|
|
15
|
+
*
|
|
16
|
+
* This REPLACES the external mcp-tool dependency for the host-loop path. It is a
|
|
17
|
+
* deliberately-minimal native client — NO external MCP SDK dependency: the wire is
|
|
18
|
+
* the standard MCP JSON-RPC ({@link McpTransport}), with stdio / SSE / HTTP
|
|
19
|
+
* transports as concrete {@link McpTransport} implementations. Placed in `core` per
|
|
20
|
+
* the package boundary (consumed by the harness, never redefined there — Gate-11).
|
|
21
|
+
*
|
|
22
|
+
* ## Availability (AC — live-connection only)
|
|
23
|
+
*
|
|
24
|
+
* A fan-in tool is available ONLY while its MCP server connection is live. The
|
|
25
|
+
* client exposes an {@link McpConnection.isLive} cell that each proxy tool's
|
|
26
|
+
* {@link AvailabilityCheck} reads; once the connection closes (or its transport
|
|
27
|
+
* errors fatally), the proxy tools report unavailable rather than dispatching into
|
|
28
|
+
* a dead transport.
|
|
29
|
+
*
|
|
30
|
+
* ## Gate-13
|
|
31
|
+
*
|
|
32
|
+
* No model/transport/provider LLM client is constructed here — the MCP transport
|
|
33
|
+
* speaks the tool protocol, not an LLM wire. There is no chokepoint concern.
|
|
34
|
+
*
|
|
35
|
+
* @epic T11456
|
|
36
|
+
* @task T11948
|
|
37
|
+
* @see ../../runtime/src/gateway/mcp/types.ts — the MCP server (fan-out) wire types this mirrors
|
|
38
|
+
* @see ./exec-code-agent-tool.js — the injectable-seam + self-registering-marker pattern mirrored here
|
|
39
|
+
*/
|
|
40
|
+
import type { AgentToolDescriptor, AgentToolRegistry } from './agent-registry.js';
|
|
41
|
+
/** JSON Schema property descriptor for a single remote-tool input field. */
|
|
42
|
+
export interface McpInputProperty {
|
|
43
|
+
/** JSON Schema primitive type (`'string'`, `'number'`, …). */
|
|
44
|
+
readonly type: string;
|
|
45
|
+
/** Human-readable description. */
|
|
46
|
+
readonly description?: string;
|
|
47
|
+
/** Allowed values (JSON Schema `enum`). */
|
|
48
|
+
readonly enum?: readonly string[];
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* MCP remote-tool definition (minimal subset — no external MCP SDK dependency).
|
|
52
|
+
* The shape returned by an MCP server's `tools/list`.
|
|
53
|
+
*/
|
|
54
|
+
export interface McpRemoteTool {
|
|
55
|
+
/** Stable remote tool name. */
|
|
56
|
+
readonly name: string;
|
|
57
|
+
/** Human-readable description. */
|
|
58
|
+
readonly description?: string;
|
|
59
|
+
/** JSON Schema for the tool's input parameters. */
|
|
60
|
+
readonly inputSchema?: {
|
|
61
|
+
readonly type?: string;
|
|
62
|
+
readonly properties?: Readonly<Record<string, McpInputProperty>>;
|
|
63
|
+
readonly required?: readonly string[];
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
/** A single content block returned by an MCP `tools/call`. */
|
|
67
|
+
export interface McpContent {
|
|
68
|
+
readonly type: string;
|
|
69
|
+
readonly text?: string;
|
|
70
|
+
}
|
|
71
|
+
/** Result returned by an MCP `tools/call`. */
|
|
72
|
+
export interface McpToolCallResult {
|
|
73
|
+
readonly content?: readonly McpContent[];
|
|
74
|
+
readonly isError?: boolean;
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* The wire seam every MCP transport implements: issue a JSON-RPC `method` with
|
|
78
|
+
* `params` and resolve the typed `result`. The stdio / SSE / HTTP transports are
|
|
79
|
+
* concrete implementations; the unit test injects an in-memory fake. The transport
|
|
80
|
+
* owns framing + correlation — this module only speaks MCP methods over it.
|
|
81
|
+
*/
|
|
82
|
+
export interface McpTransport {
|
|
83
|
+
/**
|
|
84
|
+
* Send an MCP JSON-RPC request and resolve its `result`.
|
|
85
|
+
*
|
|
86
|
+
* @param method - The MCP method (`'initialize'`, `'tools/list'`, `'tools/call'`).
|
|
87
|
+
* @param params - The method params.
|
|
88
|
+
* @returns The JSON-RPC `result` payload.
|
|
89
|
+
* @throws When the transport is dead or the server returns a JSON-RPC error.
|
|
90
|
+
*/
|
|
91
|
+
request(method: string, params?: Readonly<Record<string, unknown>>): Promise<unknown>;
|
|
92
|
+
/** Close the transport (idempotent). After close, {@link request} rejects. */
|
|
93
|
+
close(): Promise<void>;
|
|
94
|
+
}
|
|
95
|
+
/** Transport kinds a native MCP client connection can speak over. */
|
|
96
|
+
export declare const MCP_TRANSPORT_KINDS: readonly ["stdio", "sse", "http"];
|
|
97
|
+
/** One supported {@link MCP_TRANSPORT_KINDS} value. */
|
|
98
|
+
export type McpTransportKind = (typeof MCP_TRANSPORT_KINDS)[number];
|
|
99
|
+
/**
|
|
100
|
+
* A live MCP client connection: a transport + the liveness cell the proxy tools'
|
|
101
|
+
* availability predicate reads. Produced by {@link connectMcpServer}.
|
|
102
|
+
*/
|
|
103
|
+
export interface McpConnection {
|
|
104
|
+
/** A stable server name used to namespace the fan-in tool names. */
|
|
105
|
+
readonly serverName: string;
|
|
106
|
+
/** The underlying transport. */
|
|
107
|
+
readonly transport: McpTransport;
|
|
108
|
+
/** The remote tools discovered at connect (`tools/list`). */
|
|
109
|
+
readonly tools: readonly McpRemoteTool[];
|
|
110
|
+
/** `true` while the connection is live; flips `false` on {@link disconnect}. */
|
|
111
|
+
isLive(): boolean;
|
|
112
|
+
/** Close the transport and flip the liveness cell to `false`. */
|
|
113
|
+
disconnect(): Promise<void>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Perform the MCP handshake over `transport` and discover its tools: send
|
|
117
|
+
* `initialize`, then `tools/list`. Returns a live {@link McpConnection} whose
|
|
118
|
+
* liveness cell is `true` until {@link McpConnection.disconnect}. The transport is
|
|
119
|
+
* supplied by the caller (so stdio / SSE / HTTP — or an in-memory fake — all flow
|
|
120
|
+
* through the same path).
|
|
121
|
+
*
|
|
122
|
+
* @param serverName - Stable name to namespace this server's fan-in tools.
|
|
123
|
+
* @param transport - The MCP transport to handshake over.
|
|
124
|
+
* @returns The connected {@link McpConnection}.
|
|
125
|
+
* @throws When `initialize` or `tools/list` fails (the connection is not live).
|
|
126
|
+
*/
|
|
127
|
+
export declare function connectMcpServer(serverName: string, transport: McpTransport): Promise<McpConnection>;
|
|
128
|
+
/**
|
|
129
|
+
* The namespaced agent-tool name for a remote MCP tool: `mcp_<server>_<tool>`. So
|
|
130
|
+
* two servers exposing a same-named tool never collide in the registry.
|
|
131
|
+
*
|
|
132
|
+
* @param serverName - The MCP server's stable name.
|
|
133
|
+
* @param toolName - The remote tool's name.
|
|
134
|
+
* @returns The namespaced, registry-unique tool name.
|
|
135
|
+
*/
|
|
136
|
+
export declare function mcpToolName(serverName: string, toolName: string): string;
|
|
137
|
+
/**
|
|
138
|
+
* Build the proxy {@link AgentToolDescriptor} for ONE remote tool over a live
|
|
139
|
+
* connection. Its `execute` issues `tools/call` over the connection's transport
|
|
140
|
+
* and formats the result; a transport / server error becomes a typed result (never
|
|
141
|
+
* throws). Its availability returns `true` only while the connection is live.
|
|
142
|
+
*
|
|
143
|
+
* @param conn - The live MCP connection.
|
|
144
|
+
* @param tool - The remote tool to proxy.
|
|
145
|
+
* @returns The proxy descriptor to register.
|
|
146
|
+
*/
|
|
147
|
+
export declare function buildMcpProxyTool(conn: McpConnection, tool: McpRemoteTool): AgentToolDescriptor;
|
|
148
|
+
/**
|
|
149
|
+
* Register every fan-in proxy tool for a live MCP connection into `registry`. Pure
|
|
150
|
+
* registration over an ALREADY-connected {@link McpConnection} — the connect /
|
|
151
|
+
* `tools/list` happened in {@link connectMcpServer} (which the host calls at
|
|
152
|
+
* init-time, before the registry is frozen). Each remote tool becomes one proxy
|
|
153
|
+
* descriptor (AC1); each is hidden once the connection drops (AC — live-only).
|
|
154
|
+
*
|
|
155
|
+
* @param registry - The registry to populate (must not yet be frozen).
|
|
156
|
+
* @param conn - The live MCP connection whose tools to fan in.
|
|
157
|
+
* @returns The registered proxy tool names.
|
|
158
|
+
*/
|
|
159
|
+
export declare function registerMcpConnectionTools(registry: AgentToolRegistry, conn: McpConnection): string[];
|
|
160
|
+
/** Options for {@link registerMcpAgentTools} — the connections to fan in. */
|
|
161
|
+
export interface McpAgentToolOptions {
|
|
162
|
+
/**
|
|
163
|
+
* Already-connected MCP connections whose remote tools to fan in. The host
|
|
164
|
+
* connects each server (via {@link connectMcpServer}) at init-time, BEFORE the
|
|
165
|
+
* registry is frozen, then passes the live connections here. Defaults to none —
|
|
166
|
+
* with no MCP servers configured this is a no-op (core runs MCP-OFF).
|
|
167
|
+
*/
|
|
168
|
+
readonly connections?: readonly McpConnection[];
|
|
169
|
+
}
|
|
170
|
+
/**
|
|
171
|
+
* Register the fan-in proxy tools for every supplied MCP connection. Pure
|
|
172
|
+
* registration — no network handshake here (the connections are already live);
|
|
173
|
+
* the connect happens earlier in {@link connectMcpServer}. With no connections
|
|
174
|
+
* this is a no-op (the common no-MCP-configured case).
|
|
175
|
+
*
|
|
176
|
+
* @param registry - The registry to populate.
|
|
177
|
+
* @param options - The live connections to fan in.
|
|
178
|
+
*/
|
|
179
|
+
export declare function registerMcpAgentTools(registry: AgentToolRegistry, options?: McpAgentToolOptions): void;
|
|
180
|
+
/**
|
|
181
|
+
* Self-registration marker (AC1) — the identifier the
|
|
182
|
+
* {@link AgentToolRegistry.discover} bounded source scan greps for. With no live
|
|
183
|
+
* connections supplied this registers nothing (a host wires connections via
|
|
184
|
+
* {@link registerMcpAgentTools} directly with its connected servers).
|
|
185
|
+
*
|
|
186
|
+
* @param registry - The registry to populate.
|
|
187
|
+
*/
|
|
188
|
+
export declare function registerAgentTools(registry: AgentToolRegistry): void;
|
|
189
|
+
//# sourceMappingURL=mcp-agent-tool.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-agent-tool.d.ts","sourceRoot":"","sources":["../../src/tools/mcp-agent-tool.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAIH,OAAO,KAAK,EACV,mBAAmB,EACnB,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AAI7B,4EAA4E;AAC5E,MAAM,WAAW,gBAAgB;IAC/B,8DAA8D;IAC9D,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,2CAA2C;IAC3C,QAAQ,CAAC,IAAI,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CACnC;AAED;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,+BAA+B;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,kCAAkC;IAClC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,mDAAmD;IACnD,QAAQ,CAAC,WAAW,CAAC,EAAE;QACrB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,UAAU,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,CAAC;QACjE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;KACvC,CAAC;CACH;AAED,8DAA8D;AAC9D,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,8CAA8C;AAC9C,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,UAAU,EAAE,CAAC;IACzC,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B;;;;;;;OAOG;IACH,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;IACtF,8EAA8E;IAC9E,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qEAAqE;AACrE,eAAO,MAAM,mBAAmB,mCAAoC,CAAC;AAErE,uDAAuD;AACvD,MAAM,MAAM,gBAAgB,GAAG,CAAC,OAAO,mBAAmB,CAAC,CAAC,MAAM,CAAC,CAAC;AAEpE;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,gCAAgC;IAChC,QAAQ,CAAC,SAAS,EAAE,YAAY,CAAC;IACjC,6DAA6D;IAC7D,QAAQ,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,CAAC;IACzC,gFAAgF;IAChF,MAAM,IAAI,OAAO,CAAC;IAClB,iEAAiE;IACjE,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,gBAAgB,CACpC,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,YAAY,GACtB,OAAO,CAAC,aAAa,CAAC,CAwBxB;AAiBD;;;;;;;GAOG;AACH,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAGxE;AAwCD;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,GAAG,mBAAmB,CA6C/F;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,aAAa,GAClB,MAAM,EAAE,CAQV;AAED,6EAA6E;AAC7E,MAAM,WAAW,mBAAmB;IAClC;;;;;OAKG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,SAAS,aAAa,EAAE,CAAC;CACjD;AAED;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,mBAAwB,GAChC,IAAI,CAIN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAEpE"}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Native MCP client (fan-IN) agent tool — connect-time `listTools` → register each
|
|
3
|
+
* remote tool into the {@link ./agent-registry.js | AgentToolRegistry}
|
|
4
|
+
* (T11948 · M7 · epic T11456 · SG-TOOLS · satisfies T11593 EP-MCP-HOST-FANIN + T1746).
|
|
5
|
+
*
|
|
6
|
+
* Where the runtime gateway is the MCP *server* (fan-OUT: it EXPOSES cleo ops as
|
|
7
|
+
* MCP tools), this is the MCP *client* (fan-IN: it CONNECTS to an external MCP
|
|
8
|
+
* server and PULLS its tools into cleo's own agent loop). On connect the client
|
|
9
|
+
* performs the MCP handshake (`initialize` → `tools/list`) and registers EACH
|
|
10
|
+
* remote tool as a proxy {@link AgentToolDescriptor} BEFORE the registry is frozen
|
|
11
|
+
* (init-time fan-in). Each proxy tool's `execute` issues a `tools/call` over the
|
|
12
|
+
* SAME transport and formats the result for the loop; a transport failure becomes a
|
|
13
|
+
* typed result (the executable NEVER throws — the frozen ToolDispatchEngine is
|
|
14
|
+
* unchanged).
|
|
15
|
+
*
|
|
16
|
+
* This REPLACES the external mcp-tool dependency for the host-loop path. It is a
|
|
17
|
+
* deliberately-minimal native client — NO external MCP SDK dependency: the wire is
|
|
18
|
+
* the standard MCP JSON-RPC ({@link McpTransport}), with stdio / SSE / HTTP
|
|
19
|
+
* transports as concrete {@link McpTransport} implementations. Placed in `core` per
|
|
20
|
+
* the package boundary (consumed by the harness, never redefined there — Gate-11).
|
|
21
|
+
*
|
|
22
|
+
* ## Availability (AC — live-connection only)
|
|
23
|
+
*
|
|
24
|
+
* A fan-in tool is available ONLY while its MCP server connection is live. The
|
|
25
|
+
* client exposes an {@link McpConnection.isLive} cell that each proxy tool's
|
|
26
|
+
* {@link AvailabilityCheck} reads; once the connection closes (or its transport
|
|
27
|
+
* errors fatally), the proxy tools report unavailable rather than dispatching into
|
|
28
|
+
* a dead transport.
|
|
29
|
+
*
|
|
30
|
+
* ## Gate-13
|
|
31
|
+
*
|
|
32
|
+
* No model/transport/provider LLM client is constructed here — the MCP transport
|
|
33
|
+
* speaks the tool protocol, not an LLM wire. There is no chokepoint concern.
|
|
34
|
+
*
|
|
35
|
+
* @epic T11456
|
|
36
|
+
* @task T11948
|
|
37
|
+
* @see ../../runtime/src/gateway/mcp/types.ts — the MCP server (fan-out) wire types this mirrors
|
|
38
|
+
* @see ./exec-code-agent-tool.js — the injectable-seam + self-registering-marker pattern mirrored here
|
|
39
|
+
*/
|
|
40
|
+
import { z } from 'zod';
|
|
41
|
+
import { getLogger } from '../logger.js';
|
|
42
|
+
const log = getLogger('tool-mcp-client');
|
|
43
|
+
/** Transport kinds a native MCP client connection can speak over. */
|
|
44
|
+
export const MCP_TRANSPORT_KINDS = ['stdio', 'sse', 'http'];
|
|
45
|
+
/**
|
|
46
|
+
* Perform the MCP handshake over `transport` and discover its tools: send
|
|
47
|
+
* `initialize`, then `tools/list`. Returns a live {@link McpConnection} whose
|
|
48
|
+
* liveness cell is `true` until {@link McpConnection.disconnect}. The transport is
|
|
49
|
+
* supplied by the caller (so stdio / SSE / HTTP — or an in-memory fake — all flow
|
|
50
|
+
* through the same path).
|
|
51
|
+
*
|
|
52
|
+
* @param serverName - Stable name to namespace this server's fan-in tools.
|
|
53
|
+
* @param transport - The MCP transport to handshake over.
|
|
54
|
+
* @returns The connected {@link McpConnection}.
|
|
55
|
+
* @throws When `initialize` or `tools/list` fails (the connection is not live).
|
|
56
|
+
*/
|
|
57
|
+
export async function connectMcpServer(serverName, transport) {
|
|
58
|
+
await transport.request('initialize', {
|
|
59
|
+
protocolVersion: '2025-06-18',
|
|
60
|
+
capabilities: {},
|
|
61
|
+
clientInfo: { name: 'cleo', version: '0' },
|
|
62
|
+
});
|
|
63
|
+
const listed = await transport.request('tools/list', {});
|
|
64
|
+
const tools = extractRemoteTools(listed);
|
|
65
|
+
let live = true;
|
|
66
|
+
return {
|
|
67
|
+
serverName,
|
|
68
|
+
transport,
|
|
69
|
+
tools,
|
|
70
|
+
isLive: () => live,
|
|
71
|
+
disconnect: async () => {
|
|
72
|
+
live = false;
|
|
73
|
+
try {
|
|
74
|
+
await transport.close();
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
log.debug({ err, serverName }, 'mcp: transport close failed (ignored)');
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
/** Narrow a `tools/list` result into an {@link McpRemoteTool}[] defensively. */
|
|
83
|
+
function extractRemoteTools(listed) {
|
|
84
|
+
if (typeof listed === 'object' &&
|
|
85
|
+
listed !== null &&
|
|
86
|
+
'tools' in listed &&
|
|
87
|
+
Array.isArray(listed.tools)) {
|
|
88
|
+
return listed.tools.filter((t) => typeof t?.name === 'string');
|
|
89
|
+
}
|
|
90
|
+
return [];
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* The namespaced agent-tool name for a remote MCP tool: `mcp_<server>_<tool>`. So
|
|
94
|
+
* two servers exposing a same-named tool never collide in the registry.
|
|
95
|
+
*
|
|
96
|
+
* @param serverName - The MCP server's stable name.
|
|
97
|
+
* @param toolName - The remote tool's name.
|
|
98
|
+
* @returns The namespaced, registry-unique tool name.
|
|
99
|
+
*/
|
|
100
|
+
export function mcpToolName(serverName, toolName) {
|
|
101
|
+
const safe = (s) => s.replace(/[^a-zA-Z0-9_]/g, '_');
|
|
102
|
+
return `mcp_${safe(serverName)}_${safe(toolName)}`;
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Build a Zod parameter schema from a remote tool's JSON Schema. The fan-in proxy
|
|
106
|
+
* accepts an open object (the remote server is the source of truth for its own
|
|
107
|
+
* validation); we surface declared properties as a permissive record so the model
|
|
108
|
+
* sees the shape while the remote performs authoritative validation.
|
|
109
|
+
*
|
|
110
|
+
* @param tool - The remote tool definition.
|
|
111
|
+
* @returns A Zod schema for the proxy's parameters.
|
|
112
|
+
*/
|
|
113
|
+
function remoteToolSchema(tool) {
|
|
114
|
+
const props = tool.inputSchema?.properties ?? {};
|
|
115
|
+
const shape = {};
|
|
116
|
+
const required = new Set(tool.inputSchema?.required ?? []);
|
|
117
|
+
for (const [key, prop] of Object.entries(props)) {
|
|
118
|
+
let field;
|
|
119
|
+
switch (prop.type) {
|
|
120
|
+
case 'number':
|
|
121
|
+
case 'integer':
|
|
122
|
+
field = z.number();
|
|
123
|
+
break;
|
|
124
|
+
case 'boolean':
|
|
125
|
+
field = z.boolean();
|
|
126
|
+
break;
|
|
127
|
+
case 'array':
|
|
128
|
+
field = z.array(z.unknown());
|
|
129
|
+
break;
|
|
130
|
+
case 'object':
|
|
131
|
+
field = z.record(z.string(), z.unknown());
|
|
132
|
+
break;
|
|
133
|
+
default:
|
|
134
|
+
field = z.string();
|
|
135
|
+
}
|
|
136
|
+
if (prop.description)
|
|
137
|
+
field = field.describe(prop.description);
|
|
138
|
+
shape[key] = required.has(key) ? field : field.optional();
|
|
139
|
+
}
|
|
140
|
+
return z.object(shape).passthrough();
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* Build the proxy {@link AgentToolDescriptor} for ONE remote tool over a live
|
|
144
|
+
* connection. Its `execute` issues `tools/call` over the connection's transport
|
|
145
|
+
* and formats the result; a transport / server error becomes a typed result (never
|
|
146
|
+
* throws). Its availability returns `true` only while the connection is live.
|
|
147
|
+
*
|
|
148
|
+
* @param conn - The live MCP connection.
|
|
149
|
+
* @param tool - The remote tool to proxy.
|
|
150
|
+
* @returns The proxy descriptor to register.
|
|
151
|
+
*/
|
|
152
|
+
export function buildMcpProxyTool(conn, tool) {
|
|
153
|
+
const liveOnly = () => conn.isLive();
|
|
154
|
+
return {
|
|
155
|
+
name: mcpToolName(conn.serverName, tool.name),
|
|
156
|
+
// 'net' — the proxy reaches an external MCP server over its transport.
|
|
157
|
+
class: 'net',
|
|
158
|
+
description: tool.description ??
|
|
159
|
+
`Proxy for remote MCP tool "${tool.name}" on server "${conn.serverName}".`,
|
|
160
|
+
toolset: 'agent',
|
|
161
|
+
stateless: false,
|
|
162
|
+
available: liveOnly,
|
|
163
|
+
parameters: remoteToolSchema(tool),
|
|
164
|
+
execute: async (rawArgs) => {
|
|
165
|
+
if (!conn.isLive()) {
|
|
166
|
+
return {
|
|
167
|
+
ok: false,
|
|
168
|
+
error: {
|
|
169
|
+
code: 'E_MCP_CONNECTION_DEAD',
|
|
170
|
+
message: `MCP server "${conn.serverName}" connection is no longer live`,
|
|
171
|
+
},
|
|
172
|
+
};
|
|
173
|
+
}
|
|
174
|
+
try {
|
|
175
|
+
const result = (await conn.transport.request('tools/call', {
|
|
176
|
+
name: tool.name,
|
|
177
|
+
arguments: rawArgs,
|
|
178
|
+
}));
|
|
179
|
+
const text = (result.content ?? [])
|
|
180
|
+
.map((c) => c.text ?? '')
|
|
181
|
+
.filter((t) => t.length > 0)
|
|
182
|
+
.join('\n');
|
|
183
|
+
return { ok: result.isError !== true, isError: result.isError === true, content: text };
|
|
184
|
+
}
|
|
185
|
+
catch (err) {
|
|
186
|
+
// A transport / server error is a typed dispatch failure, never a throw.
|
|
187
|
+
return {
|
|
188
|
+
ok: false,
|
|
189
|
+
error: {
|
|
190
|
+
code: 'E_MCP_CALL_FAILED',
|
|
191
|
+
message: err instanceof Error ? err.message : String(err),
|
|
192
|
+
},
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
},
|
|
196
|
+
};
|
|
197
|
+
}
|
|
198
|
+
/**
|
|
199
|
+
* Register every fan-in proxy tool for a live MCP connection into `registry`. Pure
|
|
200
|
+
* registration over an ALREADY-connected {@link McpConnection} — the connect /
|
|
201
|
+
* `tools/list` happened in {@link connectMcpServer} (which the host calls at
|
|
202
|
+
* init-time, before the registry is frozen). Each remote tool becomes one proxy
|
|
203
|
+
* descriptor (AC1); each is hidden once the connection drops (AC — live-only).
|
|
204
|
+
*
|
|
205
|
+
* @param registry - The registry to populate (must not yet be frozen).
|
|
206
|
+
* @param conn - The live MCP connection whose tools to fan in.
|
|
207
|
+
* @returns The registered proxy tool names.
|
|
208
|
+
*/
|
|
209
|
+
export function registerMcpConnectionTools(registry, conn) {
|
|
210
|
+
const names = [];
|
|
211
|
+
for (const tool of conn.tools) {
|
|
212
|
+
const descriptor = buildMcpProxyTool(conn, tool);
|
|
213
|
+
registry.register(descriptor);
|
|
214
|
+
names.push(descriptor.name);
|
|
215
|
+
}
|
|
216
|
+
return names;
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Register the fan-in proxy tools for every supplied MCP connection. Pure
|
|
220
|
+
* registration — no network handshake here (the connections are already live);
|
|
221
|
+
* the connect happens earlier in {@link connectMcpServer}. With no connections
|
|
222
|
+
* this is a no-op (the common no-MCP-configured case).
|
|
223
|
+
*
|
|
224
|
+
* @param registry - The registry to populate.
|
|
225
|
+
* @param options - The live connections to fan in.
|
|
226
|
+
*/
|
|
227
|
+
export function registerMcpAgentTools(registry, options = {}) {
|
|
228
|
+
for (const conn of options.connections ?? []) {
|
|
229
|
+
registerMcpConnectionTools(registry, conn);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Self-registration marker (AC1) — the identifier the
|
|
234
|
+
* {@link AgentToolRegistry.discover} bounded source scan greps for. With no live
|
|
235
|
+
* connections supplied this registers nothing (a host wires connections via
|
|
236
|
+
* {@link registerMcpAgentTools} directly with its connected servers).
|
|
237
|
+
*
|
|
238
|
+
* @param registry - The registry to populate.
|
|
239
|
+
*/
|
|
240
|
+
export function registerAgentTools(registry) {
|
|
241
|
+
registerMcpAgentTools(registry);
|
|
242
|
+
}
|
|
243
|
+
//# sourceMappingURL=mcp-agent-tool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mcp-agent-tool.js","sourceRoot":"","sources":["../../src/tools/mcp-agent-tool.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Vision / media agent-tool family — `vision_analyze` / `image_generate` /
|
|
3
|
+
* `text_to_speech` (T11951 · M7 · epic T11456 · SG-TOOLS).
|
|
4
|
+
*
|
|
5
|
+
* The FIRST occupants of the previously-empty `media` toolset. Every model /
|
|
6
|
+
* multimodal call routes THROUGH the single E9 chokepoint
|
|
7
|
+
* ({@link import('../llm/system-resolver.js')}'s `resolveLLMForSystem` →
|
|
8
|
+
* {@link import('../llm/model-runner.js')}'s `ModelRunner`), EXACTLY like
|
|
9
|
+
* `browser_vision` ({@link ./web-agent-tools.js}). There is NO raw provider client,
|
|
10
|
+
* NO new transport, NO API-key read at this call-site — the plaintext credential is
|
|
11
|
+
* materialized from the sealed handle ONLY at the wire inside `ModelRunner.build`
|
|
12
|
+
* (Gate-13 stays green).
|
|
13
|
+
*
|
|
14
|
+
* - **`vision_analyze`** — read a local image + a prompt, send them as a single
|
|
15
|
+
* multimodal user turn through the chokepoint, return the model's analysis.
|
|
16
|
+
* - **`image_generate`** — send an image prompt through the chokepoint; returns
|
|
17
|
+
* the model's response (text/asset-ref it emits). When the resolved model
|
|
18
|
+
* cannot generate an image the chokepoint degrades — the tool surfaces an
|
|
19
|
+
* `unsupported` flag rather than constructing a bespoke image client.
|
|
20
|
+
* - **`text_to_speech`** — send text through the chokepoint for narration intent;
|
|
21
|
+
* same degradation contract when the modality is unsupported.
|
|
22
|
+
*
|
|
23
|
+
* ## Availability (AC3 — mirrors `browser_vision`)
|
|
24
|
+
*
|
|
25
|
+
* Hidden unless outbound egress is permitted AND the host advertises a multimodal
|
|
26
|
+
* model (`networkEgressAllowed !== false && capabilities.multimodal === true`).
|
|
27
|
+
* Registered-but-hidden so core runs credential-OFF / egress-OFF and the catalog
|
|
28
|
+
* stays stable. (The capability flag is the host's "a multimodal model is
|
|
29
|
+
* resolvable" promise — availability is a SYNC predicate, so the actual resolution
|
|
30
|
+
* happens at `execute` time with graceful degradation when no credential resolves.)
|
|
31
|
+
*
|
|
32
|
+
* @epic T11456
|
|
33
|
+
* @task T11951
|
|
34
|
+
* @see ./web-agent-tools.js — `browser_vision`, the E9-routed multimodal pattern mirrored here
|
|
35
|
+
* @see ../llm/system-resolver.js — `resolveLLMForSystem` (the E9 chokepoint)
|
|
36
|
+
* @see ../llm/model-runner.js — `ModelRunner` (the single SSoT wire builder)
|
|
37
|
+
*/
|
|
38
|
+
import type { AgentToolRegistry, AvailabilityCheck } from './agent-registry.js';
|
|
39
|
+
/**
|
|
40
|
+
* Available only when outbound egress is permitted AND the host advertises a
|
|
41
|
+
* multimodal model. Mirrors `browser_vision`'s availability: registered-but-hidden
|
|
42
|
+
* (so the `media` catalog is stable) until a context advertises both
|
|
43
|
+
* `networkEgressAllowed !== false` and `capabilities.multimodal === true`.
|
|
44
|
+
*/
|
|
45
|
+
export declare const multimodalAvailable: AvailabilityCheck;
|
|
46
|
+
/**
|
|
47
|
+
* Read a local image file as base64 + sniff its MIME type from the extension.
|
|
48
|
+
* Injectable so the unit test supplies image bytes without a real file on disk.
|
|
49
|
+
*/
|
|
50
|
+
export type ImageReader = (path: string) => Promise<{
|
|
51
|
+
base64: string;
|
|
52
|
+
mediaType: string;
|
|
53
|
+
}>;
|
|
54
|
+
/** The outcome of a chokepoint-routed media call. */
|
|
55
|
+
export interface MediaModelResult {
|
|
56
|
+
/** Whether a model produced a response. */
|
|
57
|
+
readonly ok: boolean;
|
|
58
|
+
/** The model's textual response (analysis / description / refusal). */
|
|
59
|
+
readonly content?: string;
|
|
60
|
+
/** The model that answered (present once a credential resolves). */
|
|
61
|
+
readonly model?: string;
|
|
62
|
+
/**
|
|
63
|
+
* `true` when no credential resolved through the E9 chokepoint — the call
|
|
64
|
+
* degraded gracefully rather than throwing (mirrors `browser_vision`).
|
|
65
|
+
*/
|
|
66
|
+
readonly aiUnavailable?: boolean;
|
|
67
|
+
/**
|
|
68
|
+
* `true` when the resolved model cannot serve the requested modality
|
|
69
|
+
* (e.g. true image synthesis / TTS audio). The tool does NOT construct a
|
|
70
|
+
* bespoke client for an unsupported modality (Gate-13) — it reports this.
|
|
71
|
+
*/
|
|
72
|
+
readonly unsupported?: boolean;
|
|
73
|
+
/** A stable code + message when the call failed for another reason. */
|
|
74
|
+
readonly error?: {
|
|
75
|
+
readonly code: string;
|
|
76
|
+
readonly message: string;
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
/** Options for {@link registerMediaAgentTools} — all injectable for testing. */
|
|
80
|
+
export interface MediaAgentToolOptions {
|
|
81
|
+
/** The local-image reader. Defaults to a real `fs` read + MIME sniff. */
|
|
82
|
+
readonly readImage?: ImageReader;
|
|
83
|
+
/** Project root threaded into the E9 resolver (defaults to the resolver's own fallback). */
|
|
84
|
+
readonly projectRoot?: string;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Register the vision / media agent-tool family into `registry`. Pure
|
|
88
|
+
* registration — no model is resolved, no credential is read, no file is opened
|
|
89
|
+
* here; all of that happens later inside each tool's `execute` through the E9
|
|
90
|
+
* chokepoint (and the injected image reader). Import-time side-effect-free.
|
|
91
|
+
*
|
|
92
|
+
* @param registry - The registry to populate.
|
|
93
|
+
* @param options - Injectable image reader / project root (for testing).
|
|
94
|
+
*/
|
|
95
|
+
export declare function registerMediaAgentTools(registry: AgentToolRegistry, options?: MediaAgentToolOptions): void;
|
|
96
|
+
/**
|
|
97
|
+
* Self-registration marker (AC1) — the identifier the
|
|
98
|
+
* {@link AgentToolRegistry.discover} bounded source scan greps for. Aliases
|
|
99
|
+
* {@link registerMediaAgentTools} so a future scan-dir discovery (or the built-in
|
|
100
|
+
* aggregator) can call it uniformly with the other agent-tool modules.
|
|
101
|
+
*
|
|
102
|
+
* @param registry - The registry to populate.
|
|
103
|
+
*/
|
|
104
|
+
export declare function registerAgentTools(registry: AgentToolRegistry): void;
|
|
105
|
+
//# sourceMappingURL=media-agent-tools.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"media-agent-tools.d.ts","sourceRoot":"","sources":["../../src/tools/media-agent-tools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoCG;AAOH,OAAO,KAAK,EACV,iBAAiB,EACjB,iBAAiB,EAElB,MAAM,qBAAqB,CAAC;AAI7B;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,iBAC2C,CAAC;AAE9E;;;GAGG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAuB3F,qDAAqD;AACrD,MAAM,WAAW,gBAAgB;IAC/B,2CAA2C;IAC3C,QAAQ,CAAC,EAAE,EAAE,OAAO,CAAC;IACrB,uEAAuE;IACvE,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,oEAAoE;IACpE,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,aAAa,CAAC,EAAE,OAAO,CAAC;IACjC;;;;OAIG;IACH,QAAQ,CAAC,WAAW,CAAC,EAAE,OAAO,CAAC;IAC/B,uEAAuE;IACvE,QAAQ,CAAC,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACtE;AAED,gFAAgF;AAChF,MAAM,WAAW,qBAAqB;IACpC,yEAAyE;IACzE,QAAQ,CAAC,SAAS,CAAC,EAAE,WAAW,CAAC;IACjC,4FAA4F;IAC5F,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AA4DD;;;;;;;;GAQG;AACH,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,iBAAiB,EAC3B,OAAO,GAAE,qBAA0B,GAClC,IAAI,CAsHN;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE,iBAAiB,GAAG,IAAI,CAEpE"}
|