@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,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **LLM-queue admit gate** — the Node-side gate for the supervisor's LLM-queue
|
|
3
|
+
* priority scheduler + per-provider rate governor (T11630 · AC1-AC4).
|
|
4
|
+
*
|
|
5
|
+
* The contended priority + rate state lives in the Rust arbiter
|
|
6
|
+
* (`crates/cleo-supervisor/src/llm_queue.rs`), exposed over `lease-ipc` v1.1 as
|
|
7
|
+
* the `queue_admit` → `queue_admit_result` verb. THIS module is the thin Node
|
|
8
|
+
* gate every outbound LLM call passes through immediately before it hits the
|
|
9
|
+
* wire: it asks the supervisor "may I admit this call?" and, on a `deferred`
|
|
10
|
+
* answer, backs off `retry_after_ms` and re-asks — a structured deferral, never
|
|
11
|
+
* a silent drop (AC4).
|
|
12
|
+
*
|
|
13
|
+
* ## Modes ({@link resolveLlmQueueMode})
|
|
14
|
+
*
|
|
15
|
+
* `CLEO_LLM_QUEUE_MODE` ∈ `{ supervisor | off }`, **default `off`** — mirrors
|
|
16
|
+
* {@link ../store/writer-lease.ts}'s `resolveLeaseMode()` shape:
|
|
17
|
+
*
|
|
18
|
+
* - `off` — pure pass-through: {@link llmQueueAdmit} returns `{ admitted: true }`
|
|
19
|
+
* without touching the supervisor. The daemon is OFF by default in production,
|
|
20
|
+
* so this is the shipping config: EVERY LLM call works with no supervisor.
|
|
21
|
+
* - `supervisor` — prefer the supervisor arbiter over the IPC socket; a
|
|
22
|
+
* `deferred` result is honoured with a back-off + re-request. When the socket
|
|
23
|
+
* is absent / refused / errors, the gate logs the demotion ONCE and degrades
|
|
24
|
+
* to direct execution (`{ admitted: true }`) — a dead/absent arbiter must
|
|
25
|
+
* NEVER block an LLM call.
|
|
26
|
+
*
|
|
27
|
+
* ## CRITICAL degrade-to-direct (headline correctness — AC4 inverse)
|
|
28
|
+
*
|
|
29
|
+
* Because the daemon stays OFF by default, the load-bearing path is the degrade:
|
|
30
|
+
* mode `off`, no socket, `E_LEASE_UNAVAILABLE`, or a connect-refused all resolve
|
|
31
|
+
* to `{ admitted: true }` and the caller executes the LLM call DIRECTLY. The
|
|
32
|
+
* supervisor is a pure OPTIMISATION; its absence is never an error.
|
|
33
|
+
*
|
|
34
|
+
* @module llm/llm-queue-admit
|
|
35
|
+
* @task T11630
|
|
36
|
+
* @epic T11625
|
|
37
|
+
* @see ../store/writer-lease.ts — the `resolveLeaseMode()` + log-once demotion this mirrors
|
|
38
|
+
* @see ../../../runtime/src/daemon/lease-ipc-client.ts — the v1.1 codec this mirrors (boundary: core cannot import runtime)
|
|
39
|
+
*/
|
|
40
|
+
import { type QueuePriorityClass } from '@cleocode/contracts';
|
|
41
|
+
/** The LLM-queue admit gate mode. Resolved once per process; default `off`. */
|
|
42
|
+
export type LlmQueueMode = 'supervisor' | 'off';
|
|
43
|
+
/**
|
|
44
|
+
* The structured result of an admit gate decision. `admitted: true` means
|
|
45
|
+
* execute the LLM call now; the gate NEVER returns a "dropped" — an over-budget
|
|
46
|
+
* request is internally retried (with back-off) until admitted or the supervisor
|
|
47
|
+
* is found unavailable (then degrades to admitted-direct). AC4.
|
|
48
|
+
*/
|
|
49
|
+
export interface LlmAdmitResult {
|
|
50
|
+
/** Whether the LLM call may proceed (always `true` once this resolves). */
|
|
51
|
+
readonly admitted: true;
|
|
52
|
+
/**
|
|
53
|
+
* How the admission was decided — `direct` when no supervisor arbitrated
|
|
54
|
+
* (off-mode / degrade), `supervisor` when the arbiter granted it. Diagnostic
|
|
55
|
+
* only; both mean "go".
|
|
56
|
+
*/
|
|
57
|
+
readonly via: 'direct' | 'supervisor';
|
|
58
|
+
}
|
|
59
|
+
/** Options for {@link llmQueueAdmit}. */
|
|
60
|
+
export interface LlmQueueAdmitOptions {
|
|
61
|
+
/**
|
|
62
|
+
* Override the supervisor socket path. Defaults to
|
|
63
|
+
* `<cleoHome>/cleo-supervisor.sock` (or `$CLEO_SUPERVISOR_SOCKET`).
|
|
64
|
+
*/
|
|
65
|
+
socketPath?: string;
|
|
66
|
+
/**
|
|
67
|
+
* Max wall-clock (ms) the gate will spend re-requesting a deferred admit
|
|
68
|
+
* before degrading to direct. Bounds the worst-case latency a starved call
|
|
69
|
+
* adds; on timeout the call proceeds (the supervisor budget is advisory, never
|
|
70
|
+
* a hard block on a real call). Default {@link DEFAULT_ADMIT_DEADLINE_MS}.
|
|
71
|
+
*/
|
|
72
|
+
deadlineMs?: number;
|
|
73
|
+
}
|
|
74
|
+
/** Max wall-clock a deferred admit will be re-requested before degrading. */
|
|
75
|
+
export declare const DEFAULT_ADMIT_DEADLINE_MS = 30000;
|
|
76
|
+
/**
|
|
77
|
+
* Resolve the LLM-queue mode from `CLEO_LLM_QUEUE_MODE`, once per process.
|
|
78
|
+
*
|
|
79
|
+
* Unknown / unset values resolve to `'off'` — the production-safe default while
|
|
80
|
+
* the supervisor daemon is disabled. Mirrors `resolveLeaseMode()`.
|
|
81
|
+
*
|
|
82
|
+
* @returns The resolved {@link LlmQueueMode}.
|
|
83
|
+
* @task T11630
|
|
84
|
+
*/
|
|
85
|
+
export declare function resolveLlmQueueMode(): LlmQueueMode;
|
|
86
|
+
/**
|
|
87
|
+
* Reset cached process-global state (mode + demotion flag). Tests only.
|
|
88
|
+
*
|
|
89
|
+
* @internal
|
|
90
|
+
*/
|
|
91
|
+
export declare function _resetLlmQueueStateForTest(): void;
|
|
92
|
+
/**
|
|
93
|
+
* Gate an outbound LLM call through the supervisor's priority scheduler +
|
|
94
|
+
* per-provider rate governor (T11630). Call this immediately BEFORE executing
|
|
95
|
+
* the LLM request.
|
|
96
|
+
*
|
|
97
|
+
* - mode `off` (default) → returns `{ admitted: true, via: 'direct' }` with no
|
|
98
|
+
* IPC. The shipping config.
|
|
99
|
+
* - mode `supervisor`, arbiter reachable → sends `queue_admit`; on `admitted`
|
|
100
|
+
* returns immediately; on `deferred` awaits `retry_after_ms` and re-requests
|
|
101
|
+
* until admitted or the deadline elapses (then degrades to direct — the budget
|
|
102
|
+
* is advisory). AC4: a deferral is a structured wait, never a dropped call.
|
|
103
|
+
* - mode `supervisor`, arbiter UNreachable (no socket / connect-refused /
|
|
104
|
+
* `E_LEASE_UNAVAILABLE` / any transport error) → logs the demotion once and
|
|
105
|
+
* returns `{ admitted: true, via: 'direct' }`. A dead/absent supervisor MUST
|
|
106
|
+
* NEVER block an LLM call.
|
|
107
|
+
*
|
|
108
|
+
* @param provider - The provider id the call targets (rate budget is per-provider).
|
|
109
|
+
* @param priorityClass - The caller's priority class (lead > worker > background).
|
|
110
|
+
* @param estTokens - The caller's estimate of the request's token cost.
|
|
111
|
+
* @param childId - The child the call belongs to (in-flight tracking seam).
|
|
112
|
+
* @param opts - Socket path + deadline overrides.
|
|
113
|
+
* @returns Always resolves to an `{ admitted: true }` result — never throws, never drops.
|
|
114
|
+
*
|
|
115
|
+
* @task T11630
|
|
116
|
+
*/
|
|
117
|
+
export declare function llmQueueAdmit(provider: string, priorityClass: QueuePriorityClass, estTokens: number, childId: string, opts?: LlmQueueAdmitOptions): Promise<LlmAdmitResult>;
|
|
118
|
+
//# sourceMappingURL=llm-queue-admit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-queue-admit.d.ts","sourceRoot":"","sources":["../../src/llm/llm-queue-admit.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsCG;AAIH,OAAO,EAML,KAAK,kBAAkB,EACxB,MAAM,qBAAqB,CAAC;AAO7B,+EAA+E;AAC/E,MAAM,MAAM,YAAY,GAAG,YAAY,GAAG,KAAK,CAAC;AAEhD;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB;;;;OAIG;IACH,QAAQ,CAAC,GAAG,EAAE,QAAQ,GAAG,YAAY,CAAC;CACvC;AAED,yCAAyC;AACzC,MAAM,WAAW,oBAAoB;IACnC;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,6EAA6E;AAC7E,eAAO,MAAM,yBAAyB,QAAS,CAAC;AAwBhD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,IAAI,YAAY,CAKlD;AAED;;;;GAIG;AACH,wBAAgB,0BAA0B,IAAI,IAAI,CAGjD;AA2BD;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,kBAAkB,EACjC,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,IAAI,GAAE,oBAAyB,GAC9B,OAAO,CAAC,cAAc,CAAC,CAiDzB"}
|
|
@@ -0,0 +1,275 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* **LLM-queue admit gate** — the Node-side gate for the supervisor's LLM-queue
|
|
3
|
+
* priority scheduler + per-provider rate governor (T11630 · AC1-AC4).
|
|
4
|
+
*
|
|
5
|
+
* The contended priority + rate state lives in the Rust arbiter
|
|
6
|
+
* (`crates/cleo-supervisor/src/llm_queue.rs`), exposed over `lease-ipc` v1.1 as
|
|
7
|
+
* the `queue_admit` → `queue_admit_result` verb. THIS module is the thin Node
|
|
8
|
+
* gate every outbound LLM call passes through immediately before it hits the
|
|
9
|
+
* wire: it asks the supervisor "may I admit this call?" and, on a `deferred`
|
|
10
|
+
* answer, backs off `retry_after_ms` and re-asks — a structured deferral, never
|
|
11
|
+
* a silent drop (AC4).
|
|
12
|
+
*
|
|
13
|
+
* ## Modes ({@link resolveLlmQueueMode})
|
|
14
|
+
*
|
|
15
|
+
* `CLEO_LLM_QUEUE_MODE` ∈ `{ supervisor | off }`, **default `off`** — mirrors
|
|
16
|
+
* {@link ../store/writer-lease.ts}'s `resolveLeaseMode()` shape:
|
|
17
|
+
*
|
|
18
|
+
* - `off` — pure pass-through: {@link llmQueueAdmit} returns `{ admitted: true }`
|
|
19
|
+
* without touching the supervisor. The daemon is OFF by default in production,
|
|
20
|
+
* so this is the shipping config: EVERY LLM call works with no supervisor.
|
|
21
|
+
* - `supervisor` — prefer the supervisor arbiter over the IPC socket; a
|
|
22
|
+
* `deferred` result is honoured with a back-off + re-request. When the socket
|
|
23
|
+
* is absent / refused / errors, the gate logs the demotion ONCE and degrades
|
|
24
|
+
* to direct execution (`{ admitted: true }`) — a dead/absent arbiter must
|
|
25
|
+
* NEVER block an LLM call.
|
|
26
|
+
*
|
|
27
|
+
* ## CRITICAL degrade-to-direct (headline correctness — AC4 inverse)
|
|
28
|
+
*
|
|
29
|
+
* Because the daemon stays OFF by default, the load-bearing path is the degrade:
|
|
30
|
+
* mode `off`, no socket, `E_LEASE_UNAVAILABLE`, or a connect-refused all resolve
|
|
31
|
+
* to `{ admitted: true }` and the caller executes the LLM call DIRECTLY. The
|
|
32
|
+
* supervisor is a pure OPTIMISATION; its absence is never an error.
|
|
33
|
+
*
|
|
34
|
+
* @module llm/llm-queue-admit
|
|
35
|
+
* @task T11630
|
|
36
|
+
* @epic T11625
|
|
37
|
+
* @see ../store/writer-lease.ts — the `resolveLeaseMode()` + log-once demotion this mirrors
|
|
38
|
+
* @see ../../../runtime/src/daemon/lease-ipc-client.ts — the v1.1 codec this mirrors (boundary: core cannot import runtime)
|
|
39
|
+
*/
|
|
40
|
+
import { connect } from 'node:net';
|
|
41
|
+
import { join } from 'node:path';
|
|
42
|
+
import { LEASE_IPC_PROTOCOL_VERSION, LeaseIpcRequestEnvelopeSchema, LeaseIpcResponseEnvelopeSchema, } from '@cleocode/contracts';
|
|
43
|
+
import { getCleoHome } from '@cleocode/paths';
|
|
44
|
+
import { getLogger } from '../logger.js';
|
|
45
|
+
/** The supervisor IPC socket filename — MUST equal `SOCKET_NAME` in the Rust `crates/cleo-supervisor/src/paths.rs`. */
|
|
46
|
+
const SUPERVISOR_SOCKET_NAME = 'cleo-supervisor.sock';
|
|
47
|
+
/** Max wall-clock a deferred admit will be re-requested before degrading. */
|
|
48
|
+
export const DEFAULT_ADMIT_DEADLINE_MS = 30_000;
|
|
49
|
+
/** Connect timeout for the supervisor socket (ms). A slow/absent socket degrades fast. */
|
|
50
|
+
const CONNECT_TIMEOUT_MS = 250;
|
|
51
|
+
/** Per-request read timeout for a `queue_admit_result` (ms). */
|
|
52
|
+
const REQUEST_TIMEOUT_MS = 2_000;
|
|
53
|
+
/** Cap on a single deferral back-off so a misconfigured window cannot wedge a call. */
|
|
54
|
+
const MAX_RETRY_BACKOFF_MS = 5_000;
|
|
55
|
+
/**
|
|
56
|
+
* Lazily-memoized module logger (import-time-side-effect-free — matches the
|
|
57
|
+
* `writer-lease.ts` deferral pattern so a mocked import graph never hits a TDZ).
|
|
58
|
+
*/
|
|
59
|
+
let _log = null;
|
|
60
|
+
function log() {
|
|
61
|
+
if (_log === null)
|
|
62
|
+
_log = getLogger('llm-queue-admit');
|
|
63
|
+
return _log;
|
|
64
|
+
}
|
|
65
|
+
let _cachedMode = null;
|
|
66
|
+
let _supervisorDemotionLogged = false;
|
|
67
|
+
/**
|
|
68
|
+
* Resolve the LLM-queue mode from `CLEO_LLM_QUEUE_MODE`, once per process.
|
|
69
|
+
*
|
|
70
|
+
* Unknown / unset values resolve to `'off'` — the production-safe default while
|
|
71
|
+
* the supervisor daemon is disabled. Mirrors `resolveLeaseMode()`.
|
|
72
|
+
*
|
|
73
|
+
* @returns The resolved {@link LlmQueueMode}.
|
|
74
|
+
* @task T11630
|
|
75
|
+
*/
|
|
76
|
+
export function resolveLlmQueueMode() {
|
|
77
|
+
if (_cachedMode !== null)
|
|
78
|
+
return _cachedMode;
|
|
79
|
+
const raw = process.env.CLEO_LLM_QUEUE_MODE;
|
|
80
|
+
_cachedMode = raw === 'supervisor' ? 'supervisor' : 'off';
|
|
81
|
+
return _cachedMode;
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Reset cached process-global state (mode + demotion flag). Tests only.
|
|
85
|
+
*
|
|
86
|
+
* @internal
|
|
87
|
+
*/
|
|
88
|
+
export function _resetLlmQueueStateForTest() {
|
|
89
|
+
_cachedMode = null;
|
|
90
|
+
_supervisorDemotionLogged = false;
|
|
91
|
+
}
|
|
92
|
+
/** Log the supervisor→direct demotion AT MOST once per process. */
|
|
93
|
+
function logDemotionOnce(reason) {
|
|
94
|
+
if (_supervisorDemotionLogged)
|
|
95
|
+
return;
|
|
96
|
+
_supervisorDemotionLogged = true;
|
|
97
|
+
log().info(`CLEO_LLM_QUEUE_MODE=supervisor but the LLM-queue arbiter is unavailable ` +
|
|
98
|
+
`(${reason}); degrading to direct LLM execution for the process lifetime.`);
|
|
99
|
+
}
|
|
100
|
+
/** The default supervisor socket path: `$CLEO_SUPERVISOR_SOCKET` or `<cleoHome>/cleo-supervisor.sock`. */
|
|
101
|
+
function defaultSocketPath() {
|
|
102
|
+
const override = process.env.CLEO_SUPERVISOR_SOCKET;
|
|
103
|
+
if (override !== undefined && override.length > 0)
|
|
104
|
+
return override;
|
|
105
|
+
return join(getCleoHome(), SUPERVISOR_SOCKET_NAME);
|
|
106
|
+
}
|
|
107
|
+
/** The "execute directly" result — the load-bearing degrade path. */
|
|
108
|
+
const ADMITTED_DIRECT = { admitted: true, via: 'direct' };
|
|
109
|
+
/** Async sleep that yields the event loop. */
|
|
110
|
+
function sleep(ms) {
|
|
111
|
+
return new Promise((resolve) => setTimeout(resolve, Math.max(0, Math.round(ms))));
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Gate an outbound LLM call through the supervisor's priority scheduler +
|
|
115
|
+
* per-provider rate governor (T11630). Call this immediately BEFORE executing
|
|
116
|
+
* the LLM request.
|
|
117
|
+
*
|
|
118
|
+
* - mode `off` (default) → returns `{ admitted: true, via: 'direct' }` with no
|
|
119
|
+
* IPC. The shipping config.
|
|
120
|
+
* - mode `supervisor`, arbiter reachable → sends `queue_admit`; on `admitted`
|
|
121
|
+
* returns immediately; on `deferred` awaits `retry_after_ms` and re-requests
|
|
122
|
+
* until admitted or the deadline elapses (then degrades to direct — the budget
|
|
123
|
+
* is advisory). AC4: a deferral is a structured wait, never a dropped call.
|
|
124
|
+
* - mode `supervisor`, arbiter UNreachable (no socket / connect-refused /
|
|
125
|
+
* `E_LEASE_UNAVAILABLE` / any transport error) → logs the demotion once and
|
|
126
|
+
* returns `{ admitted: true, via: 'direct' }`. A dead/absent supervisor MUST
|
|
127
|
+
* NEVER block an LLM call.
|
|
128
|
+
*
|
|
129
|
+
* @param provider - The provider id the call targets (rate budget is per-provider).
|
|
130
|
+
* @param priorityClass - The caller's priority class (lead > worker > background).
|
|
131
|
+
* @param estTokens - The caller's estimate of the request's token cost.
|
|
132
|
+
* @param childId - The child the call belongs to (in-flight tracking seam).
|
|
133
|
+
* @param opts - Socket path + deadline overrides.
|
|
134
|
+
* @returns Always resolves to an `{ admitted: true }` result — never throws, never drops.
|
|
135
|
+
*
|
|
136
|
+
* @task T11630
|
|
137
|
+
*/
|
|
138
|
+
export async function llmQueueAdmit(provider, priorityClass, estTokens, childId, opts = {}) {
|
|
139
|
+
if (resolveLlmQueueMode() === 'off') {
|
|
140
|
+
return ADMITTED_DIRECT;
|
|
141
|
+
}
|
|
142
|
+
const socketPath = opts.socketPath ?? defaultSocketPath();
|
|
143
|
+
const deadline = Date.now() + (opts.deadlineMs ?? DEFAULT_ADMIT_DEADLINE_MS);
|
|
144
|
+
for (;;) {
|
|
145
|
+
let result;
|
|
146
|
+
try {
|
|
147
|
+
result = await sendQueueAdmit(socketPath, {
|
|
148
|
+
kind: 'queue_admit',
|
|
149
|
+
provider,
|
|
150
|
+
priority_class: priorityClass,
|
|
151
|
+
est_tokens: Math.max(0, Math.trunc(estTokens)),
|
|
152
|
+
child_id: childId,
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
catch (err) {
|
|
156
|
+
// Any transport failure (ENOENT, ECONNREFUSED, timeout, malformed frame)
|
|
157
|
+
// → the arbiter is unavailable; degrade to direct (AC4 inverse).
|
|
158
|
+
logDemotionOnce(err instanceof Error ? err.message : String(err));
|
|
159
|
+
return ADMITTED_DIRECT;
|
|
160
|
+
}
|
|
161
|
+
if ('unavailable' in result) {
|
|
162
|
+
// The supervisor answered E_LEASE_UNAVAILABLE (arbiter not wired) →
|
|
163
|
+
// degrade to direct.
|
|
164
|
+
logDemotionOnce(result.reason);
|
|
165
|
+
return ADMITTED_DIRECT;
|
|
166
|
+
}
|
|
167
|
+
if (result.disposition === 'admitted') {
|
|
168
|
+
return { admitted: true, via: 'supervisor' };
|
|
169
|
+
}
|
|
170
|
+
// Deferred — structured back-off then re-request (AC4: never a silent drop).
|
|
171
|
+
if (Date.now() >= deadline) {
|
|
172
|
+
// The budget is advisory; a real call must not be blocked indefinitely.
|
|
173
|
+
// Past the deadline, proceed (degrade to direct) rather than starve.
|
|
174
|
+
log().debug({ provider, priorityClass, queuePosition: result.queue_position }, 'llm-queue admit deadline exceeded while deferred; proceeding directly');
|
|
175
|
+
return ADMITTED_DIRECT;
|
|
176
|
+
}
|
|
177
|
+
const backoff = Math.min(MAX_RETRY_BACKOFF_MS, Math.max(1, result.retry_after_ms));
|
|
178
|
+
await sleep(backoff);
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Send ONE `queue_admit` over a fresh supervisor socket connection and resolve
|
|
183
|
+
* the typed `queue_admit_result` (or a sentinel when the arbiter answered
|
|
184
|
+
* `E_LEASE_UNAVAILABLE`). Connection-per-request keeps the gate stateless and
|
|
185
|
+
* transport failures isolated; the socket is closed before resolution.
|
|
186
|
+
*
|
|
187
|
+
* Encodes the request envelope + decodes the response line through the SAME
|
|
188
|
+
* `@cleocode/contracts` v1.1 Zod schemas the runtime `lease-ipc-client` uses —
|
|
189
|
+
* core cannot import `@cleocode/runtime` (cycle), so it mirrors the codec here.
|
|
190
|
+
*
|
|
191
|
+
* @throws On any transport error (connect refused, ENOENT, timeout, malformed frame).
|
|
192
|
+
*/
|
|
193
|
+
function sendQueueAdmit(socketPath, request) {
|
|
194
|
+
return new Promise((resolve, reject) => {
|
|
195
|
+
const id = `qa-${process.pid}-${Date.now().toString(36)}-${Math.random().toString(36).slice(2, 8)}`;
|
|
196
|
+
const envelope = LeaseIpcRequestEnvelopeSchema.parse({
|
|
197
|
+
protocol_version: LEASE_IPC_PROTOCOL_VERSION,
|
|
198
|
+
id,
|
|
199
|
+
direction: 'request',
|
|
200
|
+
request,
|
|
201
|
+
});
|
|
202
|
+
const line = `${JSON.stringify(envelope)}\n`;
|
|
203
|
+
let settled = false;
|
|
204
|
+
let buffer = '';
|
|
205
|
+
const socket = connect(socketPath);
|
|
206
|
+
const cleanup = () => {
|
|
207
|
+
socket.removeAllListeners();
|
|
208
|
+
socket.destroy();
|
|
209
|
+
};
|
|
210
|
+
const fail = (err) => {
|
|
211
|
+
if (settled)
|
|
212
|
+
return;
|
|
213
|
+
settled = true;
|
|
214
|
+
cleanup();
|
|
215
|
+
reject(err);
|
|
216
|
+
};
|
|
217
|
+
const succeed = (value) => {
|
|
218
|
+
if (settled)
|
|
219
|
+
return;
|
|
220
|
+
settled = true;
|
|
221
|
+
cleanup();
|
|
222
|
+
resolve(value);
|
|
223
|
+
};
|
|
224
|
+
socket.setTimeout(REQUEST_TIMEOUT_MS);
|
|
225
|
+
// A connect that does not complete within the bound is a degrade signal.
|
|
226
|
+
const connectTimer = setTimeout(() => fail(new Error('supervisor connect timeout')), CONNECT_TIMEOUT_MS);
|
|
227
|
+
socket.on('connect', () => {
|
|
228
|
+
clearTimeout(connectTimer);
|
|
229
|
+
socket.write(line);
|
|
230
|
+
});
|
|
231
|
+
socket.on('timeout', () => fail(new Error('supervisor request timeout')));
|
|
232
|
+
socket.on('error', (err) => {
|
|
233
|
+
clearTimeout(connectTimer);
|
|
234
|
+
fail(err);
|
|
235
|
+
});
|
|
236
|
+
socket.on('close', () => {
|
|
237
|
+
if (!settled)
|
|
238
|
+
fail(new Error('supervisor closed the connection before responding'));
|
|
239
|
+
});
|
|
240
|
+
socket.on('data', (chunk) => {
|
|
241
|
+
buffer += chunk.toString('utf8');
|
|
242
|
+
const nl = buffer.indexOf('\n');
|
|
243
|
+
if (nl < 0)
|
|
244
|
+
return; // wait for a full NDJSON line
|
|
245
|
+
const raw = buffer.slice(0, nl);
|
|
246
|
+
let json;
|
|
247
|
+
try {
|
|
248
|
+
json = JSON.parse(raw);
|
|
249
|
+
}
|
|
250
|
+
catch (cause) {
|
|
251
|
+
fail(new Error(`malformed lease-ipc frame: ${cause instanceof Error ? cause.message : cause}`));
|
|
252
|
+
return;
|
|
253
|
+
}
|
|
254
|
+
const parsed = LeaseIpcResponseEnvelopeSchema.safeParse(json);
|
|
255
|
+
if (!parsed.success) {
|
|
256
|
+
fail(new Error(`off-contract lease-ipc response: ${parsed.error.message}`));
|
|
257
|
+
return;
|
|
258
|
+
}
|
|
259
|
+
const { response } = parsed.data;
|
|
260
|
+
if (response.kind === 'queue_admit_result') {
|
|
261
|
+
succeed(response);
|
|
262
|
+
return;
|
|
263
|
+
}
|
|
264
|
+
if (response.kind === 'error') {
|
|
265
|
+
// E_LEASE_UNAVAILABLE (arbiter not wired) or any arbiter error →
|
|
266
|
+
// treat as "supervisor cannot arbitrate"; the caller degrades to direct.
|
|
267
|
+
succeed({ unavailable: true, reason: `${response.code}: ${response.message}` });
|
|
268
|
+
return;
|
|
269
|
+
}
|
|
270
|
+
// Any other kind on a queue_admit correlation is a protocol violation.
|
|
271
|
+
fail(new Error(`unexpected lease-ipc response kind for queue_admit: ${response.kind}`));
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
}
|
|
275
|
+
//# sourceMappingURL=llm-queue-admit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm-queue-admit.js","sourceRoot":"","sources":["../../src/llm/llm-queue-admit.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,260 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Local-model fit ranking for Ollama-backed open-weight models (T11982).
|
|
3
|
+
*
|
|
4
|
+
* ## Purpose
|
|
5
|
+
*
|
|
6
|
+
* Given the current machine's hardware (RAM, VRAM), rank 2–3 curated
|
|
7
|
+
* open-weight models that are actually likely to run well. This is the
|
|
8
|
+
* `cleo llm fit` wizard building block — it powers T11983's one-keypress
|
|
9
|
+
* pull+connect flow.
|
|
10
|
+
*
|
|
11
|
+
* ## Vendor-vs-inspire decision (llmfit)
|
|
12
|
+
*
|
|
13
|
+
* Evaluated `github.com/AlexsJones/llmfit` (MIT, Go, ~400 LOC). The library
|
|
14
|
+
* is a standalone Go binary — not a TS/ESM package. Its key contribution is
|
|
15
|
+
* the IDEA: use RAM thresholds to gate model selection, prefer VRAM when
|
|
16
|
+
* available, and produce a ranked list with human-readable reasons. We
|
|
17
|
+
* **vendor the IDEA** (TS-native re-implementation) rather than shelling out
|
|
18
|
+
* to a Go binary or adding a cross-language dependency. The model thresholds
|
|
19
|
+
* below are independently calibrated from Ollama's documentation and the
|
|
20
|
+
* Hugging Face model cards, not copy-pasted from llmfit.
|
|
21
|
+
*
|
|
22
|
+
* ## Gate-13 compliance
|
|
23
|
+
*
|
|
24
|
+
* This module:
|
|
25
|
+
* - MUST NOT construct any transport or SDK client.
|
|
26
|
+
* - MUST NOT read `process.env.*_API_KEY` directly.
|
|
27
|
+
* - MUST NOT define a new `resolveLLMFor*` function.
|
|
28
|
+
* - MUST NOT hardcode model-id literals in logic — all model IDs come from
|
|
29
|
+
* the {@link LOCAL_MODEL_CANDIDATES} data table.
|
|
30
|
+
*
|
|
31
|
+
* The hardware detection (`os.totalmem`, `os.freemem`, `/proc/meminfo`,
|
|
32
|
+
* `nvidia-smi`) is plain system inspection — not covered by Gate-13 (which
|
|
33
|
+
* governs LLM resolution / transport construction).
|
|
34
|
+
*
|
|
35
|
+
* Ollama liveness re-uses {@link probeOllamaAlive} from
|
|
36
|
+
* `cross-provider-selector.ts` (no duplication). The `/api/tags` fetch is
|
|
37
|
+
* a vanilla HTTP call to localhost, not a transport construction.
|
|
38
|
+
*
|
|
39
|
+
* @module llm/local-model-fit
|
|
40
|
+
* @task T11982
|
|
41
|
+
* @epic T11671
|
|
42
|
+
*/
|
|
43
|
+
/**
|
|
44
|
+
* A single entry in the curated open-weight model catalog.
|
|
45
|
+
*
|
|
46
|
+
* These values are calibrated from Ollama model pages and Hugging Face cards.
|
|
47
|
+
* Quantisation notes describe the default GGUF quantisation level pulled by
|
|
48
|
+
* `ollama pull <model>`.
|
|
49
|
+
*/
|
|
50
|
+
export interface LocalModelCandidate {
|
|
51
|
+
/** Ollama model tag (used verbatim in `ollama pull <modelTag>`). */
|
|
52
|
+
readonly modelTag: string;
|
|
53
|
+
/** Human-readable display name. */
|
|
54
|
+
readonly displayName: string;
|
|
55
|
+
/** Model family (for grouping in the wizard). */
|
|
56
|
+
readonly family: 'gemma4' | 'qwen3' | 'llama3.2' | 'qwen2.5-coder' | 'phi4';
|
|
57
|
+
/** Minimum RAM required to run (worst-case, CPU inference), in GiB. */
|
|
58
|
+
readonly minRamGb: number;
|
|
59
|
+
/** Recommended RAM for comfortable CPU inference, in GiB. */
|
|
60
|
+
readonly recommendedRamGb: number;
|
|
61
|
+
/** Minimum VRAM required for GPU acceleration, in GiB (0 = CPU-only model). */
|
|
62
|
+
readonly minVramGb: number;
|
|
63
|
+
/** Recommended VRAM for full GPU offload, in GiB (0 = CPU-only model). */
|
|
64
|
+
readonly recommendedVramGb: number;
|
|
65
|
+
/** Approximate model size on disk (for download size estimation), in GiB. */
|
|
66
|
+
readonly diskSizeGb: number;
|
|
67
|
+
/** Default quantisation pulled by `ollama pull` (informational). */
|
|
68
|
+
readonly quantNote: string;
|
|
69
|
+
/**
|
|
70
|
+
* Whether this model is intended for code tasks (true) or general use (false).
|
|
71
|
+
* Shown as a tag in the wizard.
|
|
72
|
+
*/
|
|
73
|
+
readonly codeSpecialist: boolean;
|
|
74
|
+
/**
|
|
75
|
+
* Context window in tokens.
|
|
76
|
+
* Used to surface context-length as a selection criterion.
|
|
77
|
+
*/
|
|
78
|
+
readonly contextLengthK: number;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Curated candidate table. These are the ONLY models `rankLocalModelFit`
|
|
82
|
+
* can recommend — expand this table to add new models.
|
|
83
|
+
*
|
|
84
|
+
* Exclusions:
|
|
85
|
+
* - `qwen2:0.5b` — proof-of-life only; deliberately absent from this list.
|
|
86
|
+
*
|
|
87
|
+
* @task T11982
|
|
88
|
+
*/
|
|
89
|
+
export declare const LOCAL_MODEL_CANDIDATES: ReadonlyArray<LocalModelCandidate>;
|
|
90
|
+
/**
|
|
91
|
+
* VRAM detection result.
|
|
92
|
+
*
|
|
93
|
+
* VRAM detection is best-effort and graceful — the field is `null` when no
|
|
94
|
+
* GPU is detected (nvidia-smi absent, no Apple Silicon heuristic, etc.).
|
|
95
|
+
*/
|
|
96
|
+
export interface VramInfo {
|
|
97
|
+
/** Total VRAM in bytes, or null if detection failed. */
|
|
98
|
+
totalBytes: number | null;
|
|
99
|
+
/** Free VRAM in bytes, or null if detection failed. */
|
|
100
|
+
freeBytes: number | null;
|
|
101
|
+
/** Detection method used. */
|
|
102
|
+
method: 'nvidia-smi' | 'rocm-smi' | 'apple-unified' | 'none';
|
|
103
|
+
}
|
|
104
|
+
/**
|
|
105
|
+
* Full hardware snapshot used by the ranking algorithm.
|
|
106
|
+
*/
|
|
107
|
+
export interface HardwareSnapshot {
|
|
108
|
+
/** Total system RAM in bytes (from `os.totalmem()`). */
|
|
109
|
+
totalRamBytes: number;
|
|
110
|
+
/**
|
|
111
|
+
* Available RAM in bytes.
|
|
112
|
+
* Linux: from `/proc/meminfo` `MemAvailable` (more accurate than `os.freemem`).
|
|
113
|
+
* Other platforms: `os.freemem()`.
|
|
114
|
+
*/
|
|
115
|
+
availableRamBytes: number;
|
|
116
|
+
/** VRAM information (best-effort, never throws). */
|
|
117
|
+
vram: VramInfo;
|
|
118
|
+
/** Detected platform. */
|
|
119
|
+
platform: string;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Capture a full hardware snapshot.
|
|
123
|
+
*
|
|
124
|
+
* Never throws — VRAM detection failures degrade gracefully to `null`.
|
|
125
|
+
*
|
|
126
|
+
* @param overrides - Override fields for testing (avoids OS calls in unit tests).
|
|
127
|
+
* @returns A hardware snapshot describing this machine's capabilities.
|
|
128
|
+
*
|
|
129
|
+
* @task T11982
|
|
130
|
+
*/
|
|
131
|
+
export declare function captureHardwareSnapshot(overrides?: {
|
|
132
|
+
totalRamBytes?: number;
|
|
133
|
+
availableRamBytes?: number;
|
|
134
|
+
vram?: VramInfo;
|
|
135
|
+
platform?: string;
|
|
136
|
+
}): Promise<HardwareSnapshot>;
|
|
137
|
+
/**
|
|
138
|
+
* A model already pulled and available locally in Ollama.
|
|
139
|
+
*/
|
|
140
|
+
export interface OllamaPulledModel {
|
|
141
|
+
/** Tag as returned by `/api/tags`. */
|
|
142
|
+
name: string;
|
|
143
|
+
/** Parameter size string (e.g. `"3.1B"`). */
|
|
144
|
+
parameterSize: string;
|
|
145
|
+
/** Quantisation level (e.g. `"Q4_K_M"`). */
|
|
146
|
+
quantizationLevel: string;
|
|
147
|
+
/** Model family (e.g. `"qwen2"`). */
|
|
148
|
+
family: string;
|
|
149
|
+
}
|
|
150
|
+
/**
|
|
151
|
+
* Fetch the list of locally-pulled models from Ollama's `/api/tags` endpoint.
|
|
152
|
+
*
|
|
153
|
+
* Uses the HTTP API (not shelling out) — Gate-13 does not govern plain `fetch`
|
|
154
|
+
* calls to localhost.
|
|
155
|
+
*
|
|
156
|
+
* @param baseUrl - Ollama base URL (default `http://localhost:11434`).
|
|
157
|
+
* @param fetchFn - Injectable `fetch` for testing (defaults to global `fetch`).
|
|
158
|
+
* @returns Array of pulled models, or empty array if Ollama is not reachable.
|
|
159
|
+
*
|
|
160
|
+
* @task T11982
|
|
161
|
+
*/
|
|
162
|
+
export declare function listOllamaPulledModels(baseUrl?: string, fetchFn?: typeof fetch): Promise<OllamaPulledModel[]>;
|
|
163
|
+
/**
|
|
164
|
+
* Hard RAM floor below which no local model recommendation is made.
|
|
165
|
+
* Machines under this threshold are steered toward cloud providers instead.
|
|
166
|
+
*/
|
|
167
|
+
export declare const LOCAL_FIT_FLOOR_GB = 4;
|
|
168
|
+
/**
|
|
169
|
+
* A ranked local model fit result.
|
|
170
|
+
*/
|
|
171
|
+
export interface LocalModelFitResult {
|
|
172
|
+
/** The candidate model. */
|
|
173
|
+
candidate: LocalModelCandidate;
|
|
174
|
+
/**
|
|
175
|
+
* Overall fit score (higher is better).
|
|
176
|
+
* Used to rank candidates — not surfaced directly in the wizard UI.
|
|
177
|
+
*/
|
|
178
|
+
score: number;
|
|
179
|
+
/**
|
|
180
|
+
* Whether this model is already pulled in the local Ollama installation.
|
|
181
|
+
* Models that are already pulled get a score boost (prefer not re-downloading).
|
|
182
|
+
*/
|
|
183
|
+
alreadyPulled: boolean;
|
|
184
|
+
/**
|
|
185
|
+
* Human-readable fit reasons (bullet list for wizard display).
|
|
186
|
+
* Examples: "fits in 10GB VRAM", "already pulled", "recommended for 8GB RAM".
|
|
187
|
+
*/
|
|
188
|
+
reasons: string[];
|
|
189
|
+
/**
|
|
190
|
+
* Fit tier:
|
|
191
|
+
* - `'excellent'` — hardware is well above requirements; full GPU offload expected.
|
|
192
|
+
* - `'good'` — hardware meets recommended threshold; runs well.
|
|
193
|
+
* - `'marginal'` — hardware meets minimum; expect slower inference.
|
|
194
|
+
*/
|
|
195
|
+
fitTier: 'excellent' | 'good' | 'marginal';
|
|
196
|
+
/**
|
|
197
|
+
* The `ollama pull <pullCommand>` string for this model.
|
|
198
|
+
*/
|
|
199
|
+
pullCommand: string;
|
|
200
|
+
}
|
|
201
|
+
/**
|
|
202
|
+
* Output envelope returned by {@link rankLocalModelFit}.
|
|
203
|
+
*/
|
|
204
|
+
export interface LocalModelFitEnvelope {
|
|
205
|
+
/** Hardware snapshot used for ranking. */
|
|
206
|
+
hardware: {
|
|
207
|
+
totalRamGb: number;
|
|
208
|
+
availableRamGb: number;
|
|
209
|
+
vramTotalGb: number | null;
|
|
210
|
+
vramFreeGb: number | null;
|
|
211
|
+
vramMethod: VramInfo['method'];
|
|
212
|
+
};
|
|
213
|
+
/** Whether Ollama was detected as running. */
|
|
214
|
+
ollamaRunning: boolean;
|
|
215
|
+
/** Models already available in the local Ollama installation. */
|
|
216
|
+
pulledModels: OllamaPulledModel[];
|
|
217
|
+
/**
|
|
218
|
+
* Ranked 2–3 best-fit candidates.
|
|
219
|
+
* Empty when hardware is below the 4 GB floor.
|
|
220
|
+
*/
|
|
221
|
+
recommendations: LocalModelFitResult[];
|
|
222
|
+
/**
|
|
223
|
+
* Human-readable explanation when no recommendations are available.
|
|
224
|
+
* null when recommendations is non-empty.
|
|
225
|
+
*/
|
|
226
|
+
noRecommendationReason: string | null;
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Rank the 2–3 best-fit local open-weight models for this machine.
|
|
230
|
+
*
|
|
231
|
+
* ## Floor
|
|
232
|
+
*
|
|
233
|
+
* Machines with total RAM below {@link LOCAL_FIT_FLOOR_GB} (4 GB) receive no
|
|
234
|
+
* recommendations. This deliberately excludes `qwen2:0.5b` (proof-of-life
|
|
235
|
+
* only) — it is absent from {@link LOCAL_MODEL_CANDIDATES}.
|
|
236
|
+
*
|
|
237
|
+
* ## Algorithm
|
|
238
|
+
*
|
|
239
|
+
* 1. Capture hardware snapshot.
|
|
240
|
+
* 2. Probe Ollama liveness and fetch the pulled-models list.
|
|
241
|
+
* 3. Filter candidates to those whose `minRamGb` ≤ total RAM.
|
|
242
|
+
* 4. Score remaining candidates (VRAM fit + RAM comfort + already-pulled bonus).
|
|
243
|
+
* 5. Return the top 3 (or fewer), ordered by score descending.
|
|
244
|
+
*
|
|
245
|
+
* @param opts - Override hardware snapshot for testing.
|
|
246
|
+
* @returns Fit envelope with ranked candidates.
|
|
247
|
+
*
|
|
248
|
+
* @task T11982
|
|
249
|
+
*/
|
|
250
|
+
export declare function rankLocalModelFit(opts?: {
|
|
251
|
+
/** Override the hardware snapshot (for testing). */
|
|
252
|
+
hardwareOverride?: Parameters<typeof captureHardwareSnapshot>[0];
|
|
253
|
+
/** Override Ollama base URL. */
|
|
254
|
+
ollamaBaseUrl?: string;
|
|
255
|
+
/** Injectable fetch for testing. */
|
|
256
|
+
fetchFn?: typeof fetch;
|
|
257
|
+
/** Override pulled models list (for testing). */
|
|
258
|
+
pulledModelsOverride?: OllamaPulledModel[];
|
|
259
|
+
}): Promise<LocalModelFitEnvelope>;
|
|
260
|
+
//# sourceMappingURL=local-model-fit.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-model-fit.d.ts","sourceRoot":"","sources":["../../src/llm/local-model-fit.ts"],"names":[],"mappings":"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"}
|