@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,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `runFrontDoorLogin` — the shared onboarding front-door orchestrator (T11725 · M3).
|
|
3
|
+
*
|
|
4
|
+
* This is the ONE function every front-door entry point (`cleo login`,
|
|
5
|
+
* `cleo auth login`, `cleo llm login`) dispatches to. It owns the small amount
|
|
6
|
+
* of orchestration that sits ABOVE the 3-step onboarding engine
|
|
7
|
+
* ({@link runOnboardingLogin}):
|
|
8
|
+
*
|
|
9
|
+
* 1. **resolve provider** — alias → canonical via {@link getProviderProfile}.
|
|
10
|
+
* 2. **resolve auth method** — caller-supplied, else inferred from the
|
|
11
|
+
* provider profile (OAuth when the profile advertises an `oauth` config,
|
|
12
|
+
* else `api_key`).
|
|
13
|
+
* 3. **acquire the credential secret**:
|
|
14
|
+
* - `api_key` → the caller passes the raw key in {@link FrontDoorLoginOptions.token}.
|
|
15
|
+
* - `oauth` → the caller's injected {@link OAuthTokenAcquirer} runs the
|
|
16
|
+
* interactive browser / device-code dance and RETURNS the token. The
|
|
17
|
+
* interactive step lives in the CLI (so this module stays
|
|
18
|
+
* non-interactive and unit-testable); the acquirer is a seam, not a hard
|
|
19
|
+
* dependency.
|
|
20
|
+
* 4. **run the engine** — hand the acquired token to {@link runOnboardingLogin},
|
|
21
|
+
* which performs connect → select → bind → validate and returns the typed,
|
|
22
|
+
* secret-free {@link OnboardingResult} envelope.
|
|
23
|
+
*
|
|
24
|
+
* ## Why a core orchestrator (and not CLI glue)
|
|
25
|
+
*
|
|
26
|
+
* Keeping this in `@cleocode/core` means the CLI handlers for all three entry
|
|
27
|
+
* points are THIN — they parse flags, build a {@link ReadlineWizardIO}, supply
|
|
28
|
+
* the OAuth acquirer, and call THIS function. No entry point re-implements the
|
|
29
|
+
* picker, the auth-method inference, or the engine call (AC2: no duplicated
|
|
30
|
+
* handler logic). Studio / the future API surface reuse the same orchestrator.
|
|
31
|
+
*
|
|
32
|
+
* ## Security
|
|
33
|
+
*
|
|
34
|
+
* The returned {@link OnboardingResult} carries NO secret fields (inherited from
|
|
35
|
+
* the engine contract). The raw token flows only from the acquirer into the
|
|
36
|
+
* engine's connect step; it is never logged or surfaced on the envelope.
|
|
37
|
+
*
|
|
38
|
+
* @module llm/onboarding/front-door
|
|
39
|
+
* @task T11725
|
|
40
|
+
* @epic T11671 (E6-ONBOARDING-FRONT-DOOR)
|
|
41
|
+
*/
|
|
42
|
+
import { getProviderProfile } from '../provider-registry/index.js';
|
|
43
|
+
import { runOnboardingLogin, } from './login-engine.js';
|
|
44
|
+
/**
|
|
45
|
+
* The default front-door dependency set — the real, merged core accessors.
|
|
46
|
+
*
|
|
47
|
+
* @internal
|
|
48
|
+
*/
|
|
49
|
+
function defaultFrontDoorDeps() {
|
|
50
|
+
return {
|
|
51
|
+
getProviderProfile,
|
|
52
|
+
runOnboardingLogin: (provider, opts, deps) => runOnboardingLogin(provider, opts, deps),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
// Public API
|
|
57
|
+
// ---------------------------------------------------------------------------
|
|
58
|
+
/**
|
|
59
|
+
* Resolve the auth method for a provider profile: caller override wins, else
|
|
60
|
+
* `oauth` when the profile advertises an OAuth config, else `api_key`.
|
|
61
|
+
*
|
|
62
|
+
* @param profile - The resolved provider profile.
|
|
63
|
+
* @param override - Optional explicit auth mode from the caller.
|
|
64
|
+
* @returns The effective {@link OnboardingAuthMode}.
|
|
65
|
+
* @task T11725
|
|
66
|
+
*/
|
|
67
|
+
export function resolveAuthMode(profile, override) {
|
|
68
|
+
if (override)
|
|
69
|
+
return override;
|
|
70
|
+
return profile.oauth ? 'oauth' : 'api_key';
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Run the shared onboarding front-door flow for a provider (T11725 · M3).
|
|
74
|
+
*
|
|
75
|
+
* Resolves the provider + auth method, acquires the credential secret (raw API
|
|
76
|
+
* key from `opts.token`, or via the injected {@link OAuthTokenAcquirer} for the
|
|
77
|
+
* OAuth path), then delegates the heavy lifting to {@link runOnboardingLogin}.
|
|
78
|
+
*
|
|
79
|
+
* Mirrors the engine's never-throw-on-expected-failure contract: an unknown
|
|
80
|
+
* provider or a missing api-key secret returns a failed {@link OnboardingResult}
|
|
81
|
+
* envelope rather than throwing. The OAuth acquirer's own errors DO propagate —
|
|
82
|
+
* an aborted browser flow is a hard, caller-visible failure.
|
|
83
|
+
*
|
|
84
|
+
* @param provider - Provider name or alias (e.g. `'anthropic'`, `'codex'`).
|
|
85
|
+
* @param opts - {@link FrontDoorLoginOptions}.
|
|
86
|
+
* @param acquireOAuth - Interactive OAuth token acquirer (the CLI's browser flow).
|
|
87
|
+
* Only invoked on the `oauth` path; may be omitted when the flow is `api_key`.
|
|
88
|
+
* @param deps - Injectable accessor seam; defaults to real core accessors.
|
|
89
|
+
* @returns The typed onboarding result envelope.
|
|
90
|
+
* @task T11725
|
|
91
|
+
*/
|
|
92
|
+
export async function runFrontDoorLogin(provider, opts = {}, acquireOAuth, deps = defaultFrontDoorDeps()) {
|
|
93
|
+
// --- Resolve provider (alias → canonical) -------------------------------
|
|
94
|
+
const profile = await deps.getProviderProfile(provider);
|
|
95
|
+
if (!profile) {
|
|
96
|
+
// Defer the canonical "unknown provider" envelope to the engine so the
|
|
97
|
+
// failure shape is produced in exactly one place (DRY).
|
|
98
|
+
return deps.runOnboardingLogin(provider, buildEngineOptions(opts, opts.token, false));
|
|
99
|
+
}
|
|
100
|
+
const canonicalProvider = profile.name;
|
|
101
|
+
// --- Resolve auth method ------------------------------------------------
|
|
102
|
+
const authMode = resolveAuthMode(profile, opts.authMode);
|
|
103
|
+
// --- Acquire the credential ---------------------------------------------
|
|
104
|
+
// api_key: the raw key is already in `opts.token` — the engine's connect step
|
|
105
|
+
// performs the single write.
|
|
106
|
+
// oauth: the acquirer runs the interactive browser flow AND stores the
|
|
107
|
+
// credential, so the engine connect step skips its own write.
|
|
108
|
+
let token = opts.token;
|
|
109
|
+
let credentialAlreadyStored = false;
|
|
110
|
+
let label = opts.label;
|
|
111
|
+
if (authMode === 'oauth') {
|
|
112
|
+
if (!acquireOAuth) {
|
|
113
|
+
throw new Error(`OAuth login for '${canonicalProvider}' requires an interactive token acquirer. ` +
|
|
114
|
+
'This entry point cannot complete an OAuth flow non-interactively — ' +
|
|
115
|
+
`supply an API key with --api-key/--token, or run on a terminal.`);
|
|
116
|
+
}
|
|
117
|
+
const acquired = await acquireOAuth(canonicalProvider);
|
|
118
|
+
credentialAlreadyStored = true;
|
|
119
|
+
// Prefer the acquirer-reported label so the engine binds to the credential
|
|
120
|
+
// the OAuth flow actually stored.
|
|
121
|
+
label = label ?? acquired.label;
|
|
122
|
+
token = undefined;
|
|
123
|
+
}
|
|
124
|
+
// --- Run the engine (connect → select → bind → validate) ----------------
|
|
125
|
+
return deps.runOnboardingLogin(canonicalProvider, buildEngineOptions({ ...opts, authMode, label }, token, credentialAlreadyStored));
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* Map the front-door options + resolved token to the engine's option shape.
|
|
129
|
+
*
|
|
130
|
+
* Centralised so the unknown-provider deferral path and the happy path build
|
|
131
|
+
* identical engine options.
|
|
132
|
+
*
|
|
133
|
+
* @internal
|
|
134
|
+
*/
|
|
135
|
+
function buildEngineOptions(opts, token, credentialAlreadyStored) {
|
|
136
|
+
const engineOpts = {};
|
|
137
|
+
if (token !== undefined)
|
|
138
|
+
engineOpts.token = token;
|
|
139
|
+
if (opts.authMode !== undefined)
|
|
140
|
+
engineOpts.authMode = opts.authMode;
|
|
141
|
+
if (opts.label !== undefined)
|
|
142
|
+
engineOpts.label = opts.label;
|
|
143
|
+
if (opts.model !== undefined)
|
|
144
|
+
engineOpts.model = opts.model;
|
|
145
|
+
if (opts.role !== undefined)
|
|
146
|
+
engineOpts.role = opts.role;
|
|
147
|
+
if (opts.projectRoot !== undefined)
|
|
148
|
+
engineOpts.projectRoot = opts.projectRoot;
|
|
149
|
+
if (credentialAlreadyStored)
|
|
150
|
+
engineOpts.credentialAlreadyStored = true;
|
|
151
|
+
return engineOpts;
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=front-door.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"front-door.js","sourceRoot":"","sources":["../../../src/llm/onboarding/front-door.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `runOnboardingLogin` — the 3-step onboarding login engine (T11724 · M3).
|
|
3
|
+
*
|
|
4
|
+
* The imperative front-door flow that takes a provider from a cold start to a
|
|
5
|
+
* usable, validated profile binding. It ORCHESTRATES the already-merged
|
|
6
|
+
* credential / catalog / config / resolver accessors — it does NOT reimplement
|
|
7
|
+
* OAuth, construct a transport, or open an LLM client (Gate-13: chokepoint only).
|
|
8
|
+
*
|
|
9
|
+
* ## The four steps
|
|
10
|
+
*
|
|
11
|
+
* 1. **connect** — resolve the provider (alias → canonical via
|
|
12
|
+
* {@link getProviderProfile}) and land a credential (Account) in the
|
|
13
|
+
* multi-credential pool via {@link addCredential}. The OAuth token / API
|
|
14
|
+
* key is supplied by the caller (`opts.token`): the owner-driven browser
|
|
15
|
+
* step (PKCE / device-code) runs in `cleo llm login` BEFORE this engine,
|
|
16
|
+
* so the engine itself is non-interactive and testable. OAuth-less
|
|
17
|
+
* providers pass the same `opts.token` as an API key (AC4).
|
|
18
|
+
* 2. **select** — choose a model from the catalog: `opts.model` when given
|
|
19
|
+
* (validated against the catalog), else the latest by `release_date` via
|
|
20
|
+
* {@link resolveProviderDefaultModel}.
|
|
21
|
+
* 3. **bind** — write the `llm.default` (or `llm.roles[role]`) config
|
|
22
|
+
* binding tying the account + model together via {@link setConfigValue}.
|
|
23
|
+
* 4. **validate** — round-trip the binding through {@link resolveLLMForSystem}
|
|
24
|
+
* and confirm the resolved provider/model are consistent. NOT a live LLM
|
|
25
|
+
* call: no token is materialized; only resolution metadata is asserted,
|
|
26
|
+
* and the secret stays behind the sealed handle.
|
|
27
|
+
*
|
|
28
|
+
* ## Security (AC2)
|
|
29
|
+
*
|
|
30
|
+
* The {@link OnboardingResult} envelope carries NO secret fields — never an
|
|
31
|
+
* access token, API key, or refresh token. The plaintext is materialized only
|
|
32
|
+
* at the wire via the sealed handle, never on this envelope.
|
|
33
|
+
*
|
|
34
|
+
* ## Testability (AC3)
|
|
35
|
+
*
|
|
36
|
+
* Every step depends only on the injectable {@link OnboardingDeps} seam, which
|
|
37
|
+
* defaults to the real core accessors. Tests pass a {@link StubOnboardingDeps}
|
|
38
|
+
* (stub catalog + in-memory pool/config + stub resolver) to exercise each step
|
|
39
|
+
* in isolation without a live browser, network, or disk.
|
|
40
|
+
*
|
|
41
|
+
* @module llm/onboarding/login-engine
|
|
42
|
+
* @task T11724
|
|
43
|
+
* @epic T11671 (E6-ONBOARDING-FRONT-DOOR)
|
|
44
|
+
*/
|
|
45
|
+
import type { ModelTransport, OnboardingAuthMode, OnboardingResult, ProviderProfile, RoleName } from '@cleocode/contracts';
|
|
46
|
+
import { type StoredAuthType } from '../credentials-store.js';
|
|
47
|
+
/**
|
|
48
|
+
* Options for {@link runOnboardingLogin}.
|
|
49
|
+
*
|
|
50
|
+
* @task T11724
|
|
51
|
+
*/
|
|
52
|
+
export interface OnboardingLoginOptions {
|
|
53
|
+
/**
|
|
54
|
+
* The credential secret to store — an OAuth access token (when
|
|
55
|
+
* `authMode: 'oauth'`) or a raw API key (when `authMode: 'api_key'`).
|
|
56
|
+
*
|
|
57
|
+
* The interactive OAuth browser/device-code exchange runs in
|
|
58
|
+
* `cleo llm login` BEFORE this engine; the resulting token is passed here so
|
|
59
|
+
* the engine is non-interactive and testable. When omitted, the connect step
|
|
60
|
+
* fails cleanly with `E_ONBOARDING_NO_CREDENTIAL` (no throw).
|
|
61
|
+
*/
|
|
62
|
+
token?: string;
|
|
63
|
+
/**
|
|
64
|
+
* Auth scheme for the supplied `token`. Defaults to `'oauth'` when the
|
|
65
|
+
* resolved provider profile exposes an OAuth config, else `'api_key'` (AC4).
|
|
66
|
+
*/
|
|
67
|
+
authMode?: OnboardingAuthMode;
|
|
68
|
+
/** Human-readable label stored alongside the credential. Defaults to `'oauth-login'`. */
|
|
69
|
+
label?: string;
|
|
70
|
+
/**
|
|
71
|
+
* Explicit model id to bind. When omitted, the latest catalog model for the
|
|
72
|
+
* provider (by `release_date`) is selected. When given, it is validated
|
|
73
|
+
* against the catalog and rejected with `E_MODEL_NOT_IN_CATALOG` on a miss.
|
|
74
|
+
*/
|
|
75
|
+
model?: string;
|
|
76
|
+
/**
|
|
77
|
+
* Bind the model to a specific role (`llm.roles[role]`) instead of the
|
|
78
|
+
* global default (`llm.default`). The bound name surfaces as
|
|
79
|
+
* {@link OnboardingResult.profileName}.
|
|
80
|
+
*/
|
|
81
|
+
role?: RoleName;
|
|
82
|
+
/** Project root passed through to the resolver during the validate step. */
|
|
83
|
+
projectRoot?: string;
|
|
84
|
+
/**
|
|
85
|
+
* Skip the connect-step credential write because an interactive OAuth flow
|
|
86
|
+
* (e.g. `cleo llm login`'s PKCE / device-code dance) has ALREADY landed the
|
|
87
|
+
* credential in the pool. The connect step still resolves the provider and
|
|
88
|
+
* records an `ok` trace, but does NOT call {@link addCredential} a second
|
|
89
|
+
* time. Used by the shared front-door orchestrator (T11725) so the OAuth
|
|
90
|
+
* token is stored exactly once.
|
|
91
|
+
*
|
|
92
|
+
* When `true`, {@link OnboardingLoginOptions.token} is NOT required.
|
|
93
|
+
*/
|
|
94
|
+
credentialAlreadyStored?: boolean;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* Minimal resolver result the validate step asserts against — a structural
|
|
98
|
+
* subset of `ResolvedLLMForSystem` so a stub resolver need not construct a full
|
|
99
|
+
* client/credential graph.
|
|
100
|
+
*
|
|
101
|
+
* @task T11724
|
|
102
|
+
*/
|
|
103
|
+
export interface OnboardingResolution {
|
|
104
|
+
/** Provider the binding resolved to. */
|
|
105
|
+
provider: ModelTransport;
|
|
106
|
+
/** Model the binding resolved to. */
|
|
107
|
+
model: string;
|
|
108
|
+
/**
|
|
109
|
+
* Sealed credential handle (or `null`). The validate step reads only its
|
|
110
|
+
* presence + `tokenPreview` — it NEVER calls `fetch()`, so no secret is
|
|
111
|
+
* materialized during onboarding.
|
|
112
|
+
*/
|
|
113
|
+
sealedCredential: {
|
|
114
|
+
tokenPreview: string;
|
|
115
|
+
} | null;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Injectable accessor seam. Defaults to the real `@cleocode/core` accessors;
|
|
119
|
+
* tests override individual members to exercise each step in isolation.
|
|
120
|
+
*
|
|
121
|
+
* @task T11724
|
|
122
|
+
*/
|
|
123
|
+
export interface OnboardingDeps {
|
|
124
|
+
/** Resolve a provider profile by name/alias (alias → canonical). */
|
|
125
|
+
getProviderProfile: (name: string) => Promise<ProviderProfile | undefined>;
|
|
126
|
+
/** Persist a credential (Account) into the multi-credential pool. */
|
|
127
|
+
addCredential: (input: {
|
|
128
|
+
provider: ModelTransport;
|
|
129
|
+
label: string;
|
|
130
|
+
authType: StoredAuthType;
|
|
131
|
+
accessToken: string;
|
|
132
|
+
source: string;
|
|
133
|
+
}) => Promise<unknown>;
|
|
134
|
+
/** Map a CLEO provider name to its models.dev catalog key. */
|
|
135
|
+
catalogKeyForProvider: (providerName: string) => string;
|
|
136
|
+
/** Resolve the latest catalog model for a provider, or `null`. */
|
|
137
|
+
resolveProviderDefaultModel: (catalogKey: string) => string | null;
|
|
138
|
+
/** Validate a model id against the catalog for a provider. */
|
|
139
|
+
validateModelForProvider: (model: string, catalogKey: string) => {
|
|
140
|
+
valid: boolean;
|
|
141
|
+
reason: string;
|
|
142
|
+
};
|
|
143
|
+
/** Write a global config value (the `llm.default` / `llm.roles[role]` binding). */
|
|
144
|
+
setConfigValue: (key: string, value: unknown) => Promise<unknown>;
|
|
145
|
+
/**
|
|
146
|
+
* Round-trip resolve the binding for the validate step.
|
|
147
|
+
*
|
|
148
|
+
* `role` is the role the bind step just wrote (`llm.roles[role]`), so the
|
|
149
|
+
* validate resolution MUST target that role — resolving a different role
|
|
150
|
+
* would validate an unrelated binding (T11725 takeover review).
|
|
151
|
+
*/
|
|
152
|
+
resolve: (provider: ModelTransport, projectRoot?: string, role?: RoleName) => Promise<OnboardingResolution>;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Run the 3-step onboarding login flow for a provider (T11724 · M3).
|
|
156
|
+
*
|
|
157
|
+
* Walks **connect → select → bind → validate**, reusing the merged credential /
|
|
158
|
+
* catalog / config / resolver accessors. Returns a typed {@link OnboardingResult}
|
|
159
|
+
* envelope with the per-step trace and the non-secret binding identifiers.
|
|
160
|
+
*
|
|
161
|
+
* Like the resolver chokepoint, this engine **never throws** for an expected
|
|
162
|
+
* failure (missing credential, unknown model, config write error): it returns
|
|
163
|
+
* an envelope whose failing step carries `status: 'failed'` and a stable `E_*`
|
|
164
|
+
* `code`, with `validated: false`. Unexpected accessor errors are caught and
|
|
165
|
+
* mapped to a failed step trace as well.
|
|
166
|
+
*
|
|
167
|
+
* @param provider - Provider name or alias (e.g. `'anthropic'`, `'codex'`).
|
|
168
|
+
* @param opts - {@link OnboardingLoginOptions} (token, model, role, …).
|
|
169
|
+
* @param deps - Injectable accessor seam (AC3); defaults to real core accessors.
|
|
170
|
+
* @returns The typed onboarding result envelope; never throws on expected failure.
|
|
171
|
+
*
|
|
172
|
+
* @task T11724
|
|
173
|
+
*/
|
|
174
|
+
export declare function runOnboardingLogin(provider: string, opts?: OnboardingLoginOptions, deps?: OnboardingDeps): Promise<OnboardingResult>;
|
|
175
|
+
//# sourceMappingURL=login-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-engine.d.ts","sourceRoot":"","sources":["../../../src/llm/onboarding/login-engine.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAEH,OAAO,KAAK,EACV,cAAc,EACd,kBAAkB,EAClB,gBAAgB,EAGhB,eAAe,EACf,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAS7B,OAAO,EAAiB,KAAK,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAU7E;;;;GAIG;AACH,MAAM,WAAW,sBAAsB;IACrC;;;;;;;;OAQG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;OAGG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,yFAAyF;IACzF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,4EAA4E;IAC5E,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;OASG;IACH,uBAAuB,CAAC,EAAE,OAAO,CAAC;CACnC;AAMD;;;;;;GAMG;AACH,MAAM,WAAW,oBAAoB;IACnC,wCAAwC;IACxC,QAAQ,EAAE,cAAc,CAAC;IACzB,qCAAqC;IACrC,KAAK,EAAE,MAAM,CAAC;IACd;;;;OAIG;IACH,gBAAgB,EAAE;QAAE,YAAY,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;CACnD;AAED;;;;;GAKG;AACH,MAAM,WAAW,cAAc;IAC7B,oEAAoE;IACpE,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAC3E,qEAAqE;IACrE,aAAa,EAAE,CAAC,KAAK,EAAE;QACrB,QAAQ,EAAE,cAAc,CAAC;QACzB,KAAK,EAAE,MAAM,CAAC;QACd,QAAQ,EAAE,cAAc,CAAC;QACzB,WAAW,EAAE,MAAM,CAAC;QACpB,MAAM,EAAE,MAAM,CAAC;KAChB,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACvB,8DAA8D;IAC9D,qBAAqB,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,CAAC;IACxD,kEAAkE;IAClE,2BAA2B,EAAE,CAAC,UAAU,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACnE,8DAA8D;IAC9D,wBAAwB,EAAE,CACxB,KAAK,EAAE,MAAM,EACb,UAAU,EAAE,MAAM,KACf;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC;IACxC,mFAAmF;IACnF,cAAc,EAAE,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IAClE;;;;;;OAMG;IACH,OAAO,EAAE,CACP,QAAQ,EAAE,cAAc,EACxB,WAAW,CAAC,EAAE,MAAM,EACpB,IAAI,CAAC,EAAE,QAAQ,KACZ,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACpC;AA6ED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,sBAA2B,EACjC,IAAI,GAAE,cAA8B,GACnC,OAAO,CAAC,gBAAgB,CAAC,CAqM3B"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `runOnboardingLogin` — the 3-step onboarding login engine (T11724 · M3).
|
|
3
|
+
*
|
|
4
|
+
* The imperative front-door flow that takes a provider from a cold start to a
|
|
5
|
+
* usable, validated profile binding. It ORCHESTRATES the already-merged
|
|
6
|
+
* credential / catalog / config / resolver accessors — it does NOT reimplement
|
|
7
|
+
* OAuth, construct a transport, or open an LLM client (Gate-13: chokepoint only).
|
|
8
|
+
*
|
|
9
|
+
* ## The four steps
|
|
10
|
+
*
|
|
11
|
+
* 1. **connect** — resolve the provider (alias → canonical via
|
|
12
|
+
* {@link getProviderProfile}) and land a credential (Account) in the
|
|
13
|
+
* multi-credential pool via {@link addCredential}. The OAuth token / API
|
|
14
|
+
* key is supplied by the caller (`opts.token`): the owner-driven browser
|
|
15
|
+
* step (PKCE / device-code) runs in `cleo llm login` BEFORE this engine,
|
|
16
|
+
* so the engine itself is non-interactive and testable. OAuth-less
|
|
17
|
+
* providers pass the same `opts.token` as an API key (AC4).
|
|
18
|
+
* 2. **select** — choose a model from the catalog: `opts.model` when given
|
|
19
|
+
* (validated against the catalog), else the latest by `release_date` via
|
|
20
|
+
* {@link resolveProviderDefaultModel}.
|
|
21
|
+
* 3. **bind** — write the `llm.default` (or `llm.roles[role]`) config
|
|
22
|
+
* binding tying the account + model together via {@link setConfigValue}.
|
|
23
|
+
* 4. **validate** — round-trip the binding through {@link resolveLLMForSystem}
|
|
24
|
+
* and confirm the resolved provider/model are consistent. NOT a live LLM
|
|
25
|
+
* call: no token is materialized; only resolution metadata is asserted,
|
|
26
|
+
* and the secret stays behind the sealed handle.
|
|
27
|
+
*
|
|
28
|
+
* ## Security (AC2)
|
|
29
|
+
*
|
|
30
|
+
* The {@link OnboardingResult} envelope carries NO secret fields — never an
|
|
31
|
+
* access token, API key, or refresh token. The plaintext is materialized only
|
|
32
|
+
* at the wire via the sealed handle, never on this envelope.
|
|
33
|
+
*
|
|
34
|
+
* ## Testability (AC3)
|
|
35
|
+
*
|
|
36
|
+
* Every step depends only on the injectable {@link OnboardingDeps} seam, which
|
|
37
|
+
* defaults to the real core accessors. Tests pass a {@link StubOnboardingDeps}
|
|
38
|
+
* (stub catalog + in-memory pool/config + stub resolver) to exercise each step
|
|
39
|
+
* in isolation without a live browser, network, or disk.
|
|
40
|
+
*
|
|
41
|
+
* @module llm/onboarding/login-engine
|
|
42
|
+
* @task T11724
|
|
43
|
+
* @epic T11671 (E6-ONBOARDING-FRONT-DOOR)
|
|
44
|
+
*/
|
|
45
|
+
import { WHOAMI_ROLE_IDS } from '@cleocode/contracts';
|
|
46
|
+
import { setConfigValue } from '../../config.js';
|
|
47
|
+
import { getLogger } from '../../logger.js';
|
|
48
|
+
import { catalogKeyForProvider, resolveProviderDefaultModel, validateModelForProvider, } from '../catalog-model-resolver.js';
|
|
49
|
+
import { addCredential } from '../credentials-store.js';
|
|
50
|
+
import { getProviderProfile } from '../provider-registry/index.js';
|
|
51
|
+
import { resolveLLMForSystem } from '../system-resolver.js';
|
|
52
|
+
const logger = getLogger('llm-onboarding');
|
|
53
|
+
/**
|
|
54
|
+
* The default dependency set — the real, merged core accessors.
|
|
55
|
+
*
|
|
56
|
+
* @task T11724
|
|
57
|
+
*/
|
|
58
|
+
function defaultDeps() {
|
|
59
|
+
return {
|
|
60
|
+
getProviderProfile,
|
|
61
|
+
addCredential: (input) => addCredential(input),
|
|
62
|
+
catalogKeyForProvider,
|
|
63
|
+
resolveProviderDefaultModel: (catalogKey) => resolveProviderDefaultModel(catalogKey),
|
|
64
|
+
validateModelForProvider: (model, catalogKey) => validateModelForProvider(model, catalogKey),
|
|
65
|
+
setConfigValue: (key, value) => setConfigValue(key, value, undefined, { global: true }),
|
|
66
|
+
resolve: async (_provider, projectRoot, role) => {
|
|
67
|
+
const resolved = await resolveLLMForSystem({ kind: 'role', id: role ?? 'consolidation' }, projectRoot !== undefined ? { projectRoot } : undefined);
|
|
68
|
+
// Map the full resolver envelope down to the structural subset the
|
|
69
|
+
// validate step needs. NOTE: we never read or materialize the secret.
|
|
70
|
+
return {
|
|
71
|
+
provider: resolved.provider,
|
|
72
|
+
model: resolved.model,
|
|
73
|
+
sealedCredential: resolved.sealedCredential
|
|
74
|
+
? { tokenPreview: resolved.sealedCredential.tokenPreview }
|
|
75
|
+
: null,
|
|
76
|
+
};
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
// Internal step-trace helpers
|
|
82
|
+
// ---------------------------------------------------------------------------
|
|
83
|
+
/** Build an `ok` step trace. @internal */
|
|
84
|
+
function ok(step, detail) {
|
|
85
|
+
return { step, status: 'ok', detail };
|
|
86
|
+
}
|
|
87
|
+
/** Build a `failed` step trace carrying a stable `E_*` code. @internal */
|
|
88
|
+
function fail(step, code, detail) {
|
|
89
|
+
return { step, status: 'failed', detail, code };
|
|
90
|
+
}
|
|
91
|
+
/** Build a `skipped` step trace (downstream of a failure). @internal */
|
|
92
|
+
function skipped(step, detail) {
|
|
93
|
+
return { step, status: 'skipped', detail };
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Compose the partial envelope returned when a step fails: the failed step's
|
|
97
|
+
* trace plus a `skipped` trace for every remaining step, so the 4-row shape is
|
|
98
|
+
* always stable.
|
|
99
|
+
*
|
|
100
|
+
* @internal
|
|
101
|
+
*/
|
|
102
|
+
function withSkips(done, failedAt) {
|
|
103
|
+
const order = ['connect', 'select', 'bind', 'validate'];
|
|
104
|
+
const steps = [...done, failedAt];
|
|
105
|
+
const seen = new Set(steps.map((s) => s.step));
|
|
106
|
+
for (const name of order) {
|
|
107
|
+
if (!seen.has(name))
|
|
108
|
+
steps.push(skipped(name, 'skipped — earlier step failed'));
|
|
109
|
+
}
|
|
110
|
+
// Re-sort into canonical execution order.
|
|
111
|
+
return order.map((name) => steps.find((s) => s.step === name));
|
|
112
|
+
}
|
|
113
|
+
// ---------------------------------------------------------------------------
|
|
114
|
+
// Public API
|
|
115
|
+
// ---------------------------------------------------------------------------
|
|
116
|
+
/**
|
|
117
|
+
* Run the 3-step onboarding login flow for a provider (T11724 · M3).
|
|
118
|
+
*
|
|
119
|
+
* Walks **connect → select → bind → validate**, reusing the merged credential /
|
|
120
|
+
* catalog / config / resolver accessors. Returns a typed {@link OnboardingResult}
|
|
121
|
+
* envelope with the per-step trace and the non-secret binding identifiers.
|
|
122
|
+
*
|
|
123
|
+
* Like the resolver chokepoint, this engine **never throws** for an expected
|
|
124
|
+
* failure (missing credential, unknown model, config write error): it returns
|
|
125
|
+
* an envelope whose failing step carries `status: 'failed'` and a stable `E_*`
|
|
126
|
+
* `code`, with `validated: false`. Unexpected accessor errors are caught and
|
|
127
|
+
* mapped to a failed step trace as well.
|
|
128
|
+
*
|
|
129
|
+
* @param provider - Provider name or alias (e.g. `'anthropic'`, `'codex'`).
|
|
130
|
+
* @param opts - {@link OnboardingLoginOptions} (token, model, role, …).
|
|
131
|
+
* @param deps - Injectable accessor seam (AC3); defaults to real core accessors.
|
|
132
|
+
* @returns The typed onboarding result envelope; never throws on expected failure.
|
|
133
|
+
*
|
|
134
|
+
* @task T11724
|
|
135
|
+
*/
|
|
136
|
+
export async function runOnboardingLogin(provider, opts = {}, deps = defaultDeps()) {
|
|
137
|
+
const label = opts.label?.trim() ? opts.label.trim() : 'oauth-login';
|
|
138
|
+
const done = [];
|
|
139
|
+
// --- Step 1: connect ----------------------------------------------------
|
|
140
|
+
let canonicalProvider;
|
|
141
|
+
let authMode;
|
|
142
|
+
try {
|
|
143
|
+
const profile = await deps.getProviderProfile(provider);
|
|
144
|
+
if (!profile) {
|
|
145
|
+
const step = fail('connect', 'E_UNKNOWN_PROVIDER', `Unknown provider '${provider}'. Run \`cleo llm list-providers\` to see supported providers.`);
|
|
146
|
+
return envelope(withSkips(done, step), provider, label, null, null, null, false);
|
|
147
|
+
}
|
|
148
|
+
canonicalProvider = profile.name;
|
|
149
|
+
// OAuth when the provider profile advertises an OAuth config; else API key (AC4).
|
|
150
|
+
authMode = opts.authMode ?? (profile.oauth ? 'oauth' : 'api_key');
|
|
151
|
+
if (opts.credentialAlreadyStored) {
|
|
152
|
+
// An interactive OAuth flow already landed the credential in the pool
|
|
153
|
+
// (front-door orchestrator path — T11725). Resolve + record connect as
|
|
154
|
+
// ok WITHOUT a second write so the token is stored exactly once.
|
|
155
|
+
done.push(ok('connect', `account '${label}' connected (${authMode}, pre-stored)`));
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
if (!opts.token) {
|
|
159
|
+
const step = fail('connect', 'E_ONBOARDING_NO_CREDENTIAL', `No credential supplied for '${canonicalProvider}'. ` +
|
|
160
|
+
`Complete \`cleo llm login ${canonicalProvider}\` (OAuth) or pass an API key.`);
|
|
161
|
+
return envelope(withSkips(done, step), canonicalProvider, label, null, null, null, false);
|
|
162
|
+
}
|
|
163
|
+
const storedAuthType = authMode === 'oauth' ? 'oauth' : 'api_key';
|
|
164
|
+
await deps.addCredential({
|
|
165
|
+
provider: canonicalProvider,
|
|
166
|
+
label,
|
|
167
|
+
authType: storedAuthType,
|
|
168
|
+
accessToken: opts.token,
|
|
169
|
+
source: 'onboarding-login',
|
|
170
|
+
});
|
|
171
|
+
done.push(ok('connect', `account '${label}' connected (${authMode})`));
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
catch (err) {
|
|
175
|
+
const step = fail('connect', 'E_ONBOARDING_CONNECT_FAILED', errMsg(err));
|
|
176
|
+
return envelope(withSkips(done, step), provider, label, null, null, null, false);
|
|
177
|
+
}
|
|
178
|
+
// --- Step 2: select -----------------------------------------------------
|
|
179
|
+
let modelId;
|
|
180
|
+
try {
|
|
181
|
+
const catalogKey = deps.catalogKeyForProvider(canonicalProvider);
|
|
182
|
+
if (opts.model) {
|
|
183
|
+
const validation = deps.validateModelForProvider(opts.model, catalogKey);
|
|
184
|
+
if (!validation.valid && validation.reason === 'not-found') {
|
|
185
|
+
const step = fail('select', 'E_MODEL_NOT_IN_CATALOG', `Model '${opts.model}' is not in the catalog for provider '${canonicalProvider}'. ` +
|
|
186
|
+
`Run \`cleo llm refresh-catalog\` to update the catalog.`);
|
|
187
|
+
return envelope(withSkips(done, step), canonicalProvider, label, authMode, null, null, false);
|
|
188
|
+
}
|
|
189
|
+
modelId = opts.model;
|
|
190
|
+
done.push(ok('select', `model '${modelId}' selected (explicit, validated)`));
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
const latest = deps.resolveProviderDefaultModel(catalogKey);
|
|
194
|
+
if (!latest) {
|
|
195
|
+
const step = fail('select', 'E_NO_CATALOG_MODEL', `No catalog model available for '${canonicalProvider}'. ` +
|
|
196
|
+
`Run \`cleo llm refresh-catalog\`, or pass an explicit \`--model\`.`);
|
|
197
|
+
return envelope(withSkips(done, step), canonicalProvider, label, authMode, null, null, false);
|
|
198
|
+
}
|
|
199
|
+
modelId = latest;
|
|
200
|
+
done.push(ok('select', `model '${modelId}' selected (catalog default, latest release_date)`));
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
catch (err) {
|
|
204
|
+
const step = fail('select', 'E_ONBOARDING_SELECT_FAILED', errMsg(err));
|
|
205
|
+
return envelope(withSkips(done, step), canonicalProvider, label, authMode, null, null, false);
|
|
206
|
+
}
|
|
207
|
+
// --- Step 3: bind -------------------------------------------------------
|
|
208
|
+
let profileName;
|
|
209
|
+
try {
|
|
210
|
+
if (opts.role) {
|
|
211
|
+
if (!WHOAMI_ROLE_IDS.includes(opts.role)) {
|
|
212
|
+
const step = fail('bind', 'E_INVALID_ROLE', `Invalid role '${opts.role}'. Valid roles: ${WHOAMI_ROLE_IDS.join(', ')}.`);
|
|
213
|
+
return envelope(withSkips(done, step), canonicalProvider, label, authMode, modelId, null, false);
|
|
214
|
+
}
|
|
215
|
+
await deps.setConfigValue(`llm.roles.${opts.role}.provider`, canonicalProvider);
|
|
216
|
+
await deps.setConfigValue(`llm.roles.${opts.role}.model`, modelId);
|
|
217
|
+
await deps.setConfigValue(`llm.roles.${opts.role}.credentialLabel`, label);
|
|
218
|
+
profileName = opts.role;
|
|
219
|
+
done.push(ok('bind', `profile '${profileName}' bound → ${canonicalProvider}/${modelId}`));
|
|
220
|
+
}
|
|
221
|
+
else {
|
|
222
|
+
await deps.setConfigValue('llm.default.provider', canonicalProvider);
|
|
223
|
+
await deps.setConfigValue('llm.default.model', modelId);
|
|
224
|
+
profileName = 'default';
|
|
225
|
+
done.push(ok('bind', `default binding → ${canonicalProvider}/${modelId}`));
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
catch (err) {
|
|
229
|
+
const step = fail('bind', 'E_ONBOARDING_BIND_FAILED', errMsg(err));
|
|
230
|
+
return envelope(withSkips(done, step), canonicalProvider, label, authMode, modelId, null, false);
|
|
231
|
+
}
|
|
232
|
+
// --- Step 4: validate ---------------------------------------------------
|
|
233
|
+
try {
|
|
234
|
+
const resolved = await deps.resolve(canonicalProvider, opts.projectRoot, opts.role);
|
|
235
|
+
const providerMatch = resolved.provider === canonicalProvider;
|
|
236
|
+
const modelMatch = resolved.model === modelId;
|
|
237
|
+
const hasHandle = resolved.sealedCredential !== null;
|
|
238
|
+
if (providerMatch && modelMatch && hasHandle) {
|
|
239
|
+
done.push(ok('validate', `round-trip ok — resolves to ${resolved.provider}/${resolved.model} ` +
|
|
240
|
+
`(sealed handle ${resolved.sealedCredential?.tokenPreview ?? '…'})`));
|
|
241
|
+
return envelope(done, canonicalProvider, label, authMode, modelId, profileName, true);
|
|
242
|
+
}
|
|
243
|
+
const reason = !hasHandle
|
|
244
|
+
? 'no credential handle resolved'
|
|
245
|
+
: `resolved ${resolved.provider}/${resolved.model}, expected ${canonicalProvider}/${modelId}`;
|
|
246
|
+
const step = fail('validate', 'E_ONBOARDING_VALIDATION_FAILED', `binding inconsistent — ${reason}`);
|
|
247
|
+
return envelope([...done, step], canonicalProvider, label, authMode, modelId, profileName, false);
|
|
248
|
+
}
|
|
249
|
+
catch (err) {
|
|
250
|
+
const step = fail('validate', 'E_ONBOARDING_VALIDATION_FAILED', errMsg(err));
|
|
251
|
+
return envelope([...done, step], canonicalProvider, label, authMode, modelId, profileName, false);
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
// ---------------------------------------------------------------------------
|
|
255
|
+
// Internal helpers
|
|
256
|
+
// ---------------------------------------------------------------------------
|
|
257
|
+
/**
|
|
258
|
+
* Assemble the {@link OnboardingResult} envelope. Centralised so every return
|
|
259
|
+
* path produces an identically-shaped, secret-free result.
|
|
260
|
+
*
|
|
261
|
+
* @internal
|
|
262
|
+
*/
|
|
263
|
+
function envelope(steps, provider, accountLabel, authMode, modelId, profileName, validated) {
|
|
264
|
+
return {
|
|
265
|
+
steps,
|
|
266
|
+
provider,
|
|
267
|
+
accountLabel,
|
|
268
|
+
authMode,
|
|
269
|
+
modelId,
|
|
270
|
+
profileName,
|
|
271
|
+
validated,
|
|
272
|
+
};
|
|
273
|
+
}
|
|
274
|
+
/**
|
|
275
|
+
* Extract a short, secret-free message from an unknown thrown value. The
|
|
276
|
+
* onboarding accessors already redact their own error strings; this is a final
|
|
277
|
+
* defensive narrow so the envelope never carries a raw stack.
|
|
278
|
+
*
|
|
279
|
+
* @internal
|
|
280
|
+
*/
|
|
281
|
+
function errMsg(err) {
|
|
282
|
+
const raw = err instanceof Error ? err.message : String(err);
|
|
283
|
+
logger.debug({ err: raw }, 'onboarding: step accessor error');
|
|
284
|
+
return raw;
|
|
285
|
+
}
|
|
286
|
+
//# sourceMappingURL=login-engine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login-engine.js","sourceRoot":"","sources":["../../../src/llm/onboarding/login-engine.ts"],"names":[],"mappings":"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"}
|