@cleocode/core 2026.6.13 → 2026.6.14
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 +179 -0
- package/dist/check/pr-gate.d.ts.map +1 -0
- package/dist/check/pr-gate.js +366 -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/registry.d.ts +54 -0
- package/dist/config/registry.d.ts.map +1 -1
- package/dist/config/registry.js +94 -2
- package/dist/config/registry.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 +3704 -680
- 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/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.js +5 -5
- 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/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 +15 -0
- package/dist/llm/index.d.ts.map +1 -1
- package/dist/llm/index.js +8 -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/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 +3853 -814
- 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/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 +9 -2
- 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/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/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/scenarios/dhq-replay-find/golden.json +32 -0
- package/dist/selfimprove/scenarios/dhq-replay-find/scenario.json +18 -0
- 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/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/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/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 +23 -13
package/dist/llm/oauth/pkce.js
CHANGED
|
@@ -75,6 +75,53 @@ export function buildAuthorizationUrl(params) {
|
|
|
75
75
|
}
|
|
76
76
|
return url.toString();
|
|
77
77
|
}
|
|
78
|
+
// ---------------------------------------------------------------------------
|
|
79
|
+
// Authorization-response input parsing
|
|
80
|
+
// ---------------------------------------------------------------------------
|
|
81
|
+
/**
|
|
82
|
+
* Parse a user-pasted authorization response into `{ code, state }`.
|
|
83
|
+
*
|
|
84
|
+
* Accepts every form a provider's callback page can hand the user
|
|
85
|
+
* (mirrors pi-ai's `parseAuthorizationInput`):
|
|
86
|
+
* - a full redirect URL — `https://…/callback?code=…&state=…`
|
|
87
|
+
* - the `code#state` pair Anthropic's hosted callback page displays
|
|
88
|
+
* - a bare query string — `code=…&state=…`
|
|
89
|
+
* - a bare authorization code
|
|
90
|
+
*
|
|
91
|
+
* Callers MUST validate a returned `state` against the authorize-time state
|
|
92
|
+
* (CSRF check, RFC 6749 §10.12) before exchanging the code.
|
|
93
|
+
*
|
|
94
|
+
* @param input - Raw pasted text from the user.
|
|
95
|
+
* @returns Extracted `code` and `state` (either may be `undefined`).
|
|
96
|
+
* @task T11958
|
|
97
|
+
*/
|
|
98
|
+
export function parseAuthorizationInput(input) {
|
|
99
|
+
const value = input.trim();
|
|
100
|
+
if (!value)
|
|
101
|
+
return {};
|
|
102
|
+
try {
|
|
103
|
+
const url = new URL(value);
|
|
104
|
+
return {
|
|
105
|
+
code: url.searchParams.get('code') ?? undefined,
|
|
106
|
+
state: url.searchParams.get('state') ?? undefined,
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
// not a URL — fall through to the bare forms
|
|
111
|
+
}
|
|
112
|
+
if (value.includes('#')) {
|
|
113
|
+
const [code, state] = value.split('#', 2);
|
|
114
|
+
return { code: code || undefined, state: state || undefined };
|
|
115
|
+
}
|
|
116
|
+
if (value.includes('code=')) {
|
|
117
|
+
const params = new URLSearchParams(value);
|
|
118
|
+
return {
|
|
119
|
+
code: params.get('code') ?? undefined,
|
|
120
|
+
state: params.get('state') ?? undefined,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
return { code: value };
|
|
124
|
+
}
|
|
78
125
|
/**
|
|
79
126
|
* Exchange an authorization code + PKCE verifier for access and refresh tokens.
|
|
80
127
|
*
|
|
@@ -87,24 +134,21 @@ export function buildAuthorizationUrl(params) {
|
|
|
87
134
|
* @task T9302
|
|
88
135
|
*/
|
|
89
136
|
export async function exchangePkceCode(params) {
|
|
90
|
-
const
|
|
137
|
+
const fields = {
|
|
91
138
|
grant_type: 'authorization_code',
|
|
92
139
|
client_id: params.clientId,
|
|
93
140
|
code: params.code,
|
|
94
141
|
code_verifier: params.codeVerifier,
|
|
95
142
|
redirect_uri: params.redirectUri,
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
},
|
|
104
|
-
body: body.toString(),
|
|
105
|
-
});
|
|
143
|
+
};
|
|
144
|
+
// Anthropic (json) requires the authorize-time state echoed in the exchange;
|
|
145
|
+
// form-encoded RFC endpoints do not define it on the token request.
|
|
146
|
+
if (params.bodyFormat === 'json' && params.state) {
|
|
147
|
+
fields['state'] = params.state;
|
|
148
|
+
}
|
|
149
|
+
const resp = await postTokenRequest(params.tokenEndpoint, fields, params);
|
|
106
150
|
if (!resp.ok) {
|
|
107
|
-
const detail = await
|
|
151
|
+
const detail = await extractOAuthErrorDetail(resp);
|
|
108
152
|
throw new Error(`PKCE code exchange failed for provider '${params.provider}': HTTP ${resp.status}${detail}`);
|
|
109
153
|
}
|
|
110
154
|
return parseTokenResponse(params.provider, await resp.json());
|
|
@@ -122,22 +166,14 @@ export async function exchangePkceCode(params) {
|
|
|
122
166
|
* @task T9302
|
|
123
167
|
*/
|
|
124
168
|
export async function refreshPkceToken(params) {
|
|
125
|
-
const
|
|
169
|
+
const fields = {
|
|
126
170
|
grant_type: 'refresh_token',
|
|
127
171
|
client_id: params.clientId,
|
|
128
172
|
refresh_token: params.refreshToken,
|
|
129
|
-
}
|
|
130
|
-
const resp = await
|
|
131
|
-
method: 'POST',
|
|
132
|
-
headers: {
|
|
133
|
-
'Content-Type': 'application/x-www-form-urlencoded',
|
|
134
|
-
Accept: 'application/json',
|
|
135
|
-
...params.extraHeaders,
|
|
136
|
-
},
|
|
137
|
-
body: body.toString(),
|
|
138
|
-
});
|
|
173
|
+
};
|
|
174
|
+
const resp = await postTokenRequest(params.tokenEndpoint, fields, params);
|
|
139
175
|
if (!resp.ok) {
|
|
140
|
-
const detail = await
|
|
176
|
+
const detail = await extractOAuthErrorDetail(resp);
|
|
141
177
|
throw new Error(`PKCE token refresh failed for provider '${params.provider}': HTTP ${resp.status}${detail}`);
|
|
142
178
|
}
|
|
143
179
|
return parseTokenResponse(params.provider, await resp.json());
|
|
@@ -145,6 +181,28 @@ export async function refreshPkceToken(params) {
|
|
|
145
181
|
// ---------------------------------------------------------------------------
|
|
146
182
|
// Internal helpers
|
|
147
183
|
// ---------------------------------------------------------------------------
|
|
184
|
+
/**
|
|
185
|
+
* POST a token-endpoint request (code exchange or refresh grant).
|
|
186
|
+
*
|
|
187
|
+
* Single home for the body-encoding split shared by {@link exchangePkceCode}
|
|
188
|
+
* and {@link refreshPkceToken}: `'form'` (RFC 6749 default,
|
|
189
|
+
* `application/x-www-form-urlencoded`) vs `'json'` (Anthropic's non-RFC
|
|
190
|
+
* `application/json` token endpoint). See
|
|
191
|
+
* `ProviderOAuthConfig.tokenBodyFormat`.
|
|
192
|
+
*
|
|
193
|
+
* @internal
|
|
194
|
+
*/
|
|
195
|
+
function postTokenRequest(tokenEndpoint, fields, opts) {
|
|
196
|
+
return globalThis.fetch(tokenEndpoint, {
|
|
197
|
+
method: 'POST',
|
|
198
|
+
headers: {
|
|
199
|
+
'Content-Type': opts.bodyFormat === 'json' ? 'application/json' : 'application/x-www-form-urlencoded',
|
|
200
|
+
Accept: 'application/json',
|
|
201
|
+
...opts.extraHeaders,
|
|
202
|
+
},
|
|
203
|
+
body: opts.bodyFormat === 'json' ? JSON.stringify(fields) : new URLSearchParams(fields).toString(),
|
|
204
|
+
});
|
|
205
|
+
}
|
|
148
206
|
/**
|
|
149
207
|
* base64url-encode a byte array (RFC 4648 §5, no padding).
|
|
150
208
|
*
|
|
@@ -180,12 +238,20 @@ function parseTokenResponse(provider, data) {
|
|
|
180
238
|
};
|
|
181
239
|
}
|
|
182
240
|
/**
|
|
183
|
-
* Extract a human-readable error detail string from a non-OK HTTP
|
|
241
|
+
* Extract a human-readable error detail string from a non-OK OAuth HTTP
|
|
242
|
+
* response.
|
|
243
|
+
*
|
|
244
|
+
* The single shared extractor for every OAuth surface in the LLM layer
|
|
245
|
+
* (`pkce.ts`, `google-pkce.ts`, `device-code.ts`) — local copies drifted and
|
|
246
|
+
* re-introduced the `[object Object]` masking of DHQ-075 (T11958).
|
|
184
247
|
*
|
|
185
248
|
* Strategy:
|
|
186
249
|
* 1. Clone the response so the body stream is not consumed by the primary
|
|
187
250
|
* error path (callers may need the body for further inspection).
|
|
188
251
|
* 2. Parse as JSON; use `error_description` or `error` fields (RFC 6749 §5.2).
|
|
252
|
+
* When the field is an object (Anthropic nests
|
|
253
|
+
* `{"error": {"type", "message"}}`), extract `message`/`type` — never
|
|
254
|
+
* `String(object)`.
|
|
189
255
|
* 3. Fall back to the raw text body when JSON parsing fails (e.g. HTML pages
|
|
190
256
|
* returned by a WAF or a misconfigured reverse proxy). Truncate at 512 chars
|
|
191
257
|
* so a multi-kilobyte HTML page does not flood the error message.
|
|
@@ -194,16 +260,27 @@ function parseTokenResponse(provider, data) {
|
|
|
194
260
|
* This ensures the caller never sees `[object Object]` in the thrown message
|
|
195
261
|
* and always surfaces the actual HTTP response body for debugging.
|
|
196
262
|
*
|
|
197
|
-
* @
|
|
263
|
+
* @task T11958
|
|
198
264
|
*/
|
|
199
|
-
async function
|
|
265
|
+
export async function extractOAuthErrorDetail(resp) {
|
|
200
266
|
// Clone before reading so the caller's Response is not drained.
|
|
201
267
|
const clone = resp.clone();
|
|
202
268
|
try {
|
|
203
269
|
const body = (await clone.json());
|
|
204
270
|
const desc = body['error_description'] ?? body['error'];
|
|
205
|
-
if (desc)
|
|
206
|
-
return ` — ${
|
|
271
|
+
if (typeof desc === 'string' && desc)
|
|
272
|
+
return ` — ${desc}`;
|
|
273
|
+
// Anthropic nests the detail: {"error": {"type": "...", "message": "..."}}.
|
|
274
|
+
// `String(object)` here is what produced the undebuggable
|
|
275
|
+
// "[object Object]" of DHQ-075 — extract message/type, else stringify.
|
|
276
|
+
if (desc !== null && typeof desc === 'object') {
|
|
277
|
+
const d = desc;
|
|
278
|
+
const message = typeof d['message'] === 'string' ? d['message'] : undefined;
|
|
279
|
+
const type = typeof d['type'] === 'string' ? d['type'] : undefined;
|
|
280
|
+
if (message)
|
|
281
|
+
return ` — ${type ? `${type}: ` : ''}${message}`;
|
|
282
|
+
return ` — ${JSON.stringify(desc).slice(0, 512)}`;
|
|
283
|
+
}
|
|
207
284
|
// JSON parsed but had no recognized field: fall through to raw-text path.
|
|
208
285
|
const text = JSON.stringify(body);
|
|
209
286
|
return ` — ${text.slice(0, 512)}`;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../../src/llm/oauth/pkce.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAsCH,8EAA8E;AAC9E,uBAAuB;AACvB,8EAA8E;AAE9E;;;;;;;;;;;;;;;GAeG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,WAAW,GAAG,MAAM,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/D,MAAM,YAAY,GAAG,eAAe,CAAC,WAAW,CAAC,CAAC;IAElD,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC;IAC7D,MAAM,UAAU,GAAG,MAAM,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;IACxE,MAAM,aAAa,GAAG,eAAe,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,CAAC,CAAC;IAElE,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,CAAC;AACzC,CAAC;AAgCD;;;;;;;;;GASG;AACH,MAAM,UAAU,qBAAqB,CAAC,MAAmC;IACvE,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,qBAAqB,CAAC,CAAC;IAClD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,eAAe,EAAE,MAAM,CAAC,CAAC;IAC9C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IACnD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,cAAc,EAAE,MAAM,CAAC,WAAW,CAAC,CAAC;IACzD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,gBAAgB,EAAE,MAAM,CAAC,aAAa,CAAC,CAAC;IAC7D,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACtD,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5C,0EAA0E;IAC1E,0EAA0E;IAC1E,iCAAiC;IACjC,IAAI,MAAM,CAAC,WAAW,EAAE,CAAC;QACvB,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC;YACxD,IAAI,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC;gBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC,QAAQ,EAAE,CAAC;AACxB,CAAC;
|
|
1
|
+
{"version":3,"file":"pkce.js","sourceRoot":"","sources":["../../../src/llm/oauth/pkce.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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 type { OnboardingAuthMode, OnboardingResult, ProviderProfile, RoleName } from '@cleocode/contracts';
|
|
43
|
+
import { type OnboardingDeps, type OnboardingLoginOptions } from './login-engine.js';
|
|
44
|
+
/**
|
|
45
|
+
* Outcome of an interactive OAuth acquisition. The acquirer performs the
|
|
46
|
+
* browser / device-code exchange and lands the credential in the pool itself
|
|
47
|
+
* (reusing the existing, battle-tested `cleo llm login` flow), then returns the
|
|
48
|
+
* non-secret metadata the front door surfaces. Because the credential is
|
|
49
|
+
* already stored, the engine's connect step is told to skip its own write
|
|
50
|
+
* (`credentialAlreadyStored`) so the OAuth token is persisted exactly once.
|
|
51
|
+
*
|
|
52
|
+
* @task T11725
|
|
53
|
+
*/
|
|
54
|
+
export interface AcquiredOAuthToken {
|
|
55
|
+
/** The credential label the acquirer stored the OAuth credential under. */
|
|
56
|
+
readonly label: string;
|
|
57
|
+
/** Seconds until the access token expires (surfaced in the summary), if known. */
|
|
58
|
+
readonly expiresIn?: number;
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Injectable seam that performs the interactive OAuth flow for a provider AND
|
|
62
|
+
* lands the resulting credential in the pool, returning its non-secret label +
|
|
63
|
+
* metadata.
|
|
64
|
+
*
|
|
65
|
+
* The CLI front-door handler supplies the real implementation (wrapping the
|
|
66
|
+
* existing PKCE / device-code browser dance in `cleo llm login`). Unit tests
|
|
67
|
+
* pass a stub that records the call and returns a fixed label so the
|
|
68
|
+
* orchestrator is exercised without a live browser.
|
|
69
|
+
*
|
|
70
|
+
* @param provider - Canonical provider name (alias already resolved).
|
|
71
|
+
* @returns The stored credential label + non-secret metadata.
|
|
72
|
+
* @task T11725
|
|
73
|
+
*/
|
|
74
|
+
export type OAuthTokenAcquirer = (provider: string) => Promise<AcquiredOAuthToken>;
|
|
75
|
+
/**
|
|
76
|
+
* Options for {@link runFrontDoorLogin}.
|
|
77
|
+
*
|
|
78
|
+
* @task T11725
|
|
79
|
+
*/
|
|
80
|
+
export interface FrontDoorLoginOptions {
|
|
81
|
+
/**
|
|
82
|
+
* Explicit auth method. When omitted it is inferred from the resolved
|
|
83
|
+
* provider profile: `oauth` when the profile advertises an `oauth` config,
|
|
84
|
+
* else `api_key`.
|
|
85
|
+
*/
|
|
86
|
+
authMode?: OnboardingAuthMode;
|
|
87
|
+
/**
|
|
88
|
+
* Pre-supplied credential secret for the `api_key` path (the raw API key).
|
|
89
|
+
* Ignored on the `oauth` path — that token comes from the acquirer.
|
|
90
|
+
*/
|
|
91
|
+
token?: string;
|
|
92
|
+
/** Human-readable label stored alongside the credential. */
|
|
93
|
+
label?: string;
|
|
94
|
+
/** Explicit model id to bind; defaults to the latest catalog model. */
|
|
95
|
+
model?: string;
|
|
96
|
+
/** Bind to a specific role instead of the global default. */
|
|
97
|
+
role?: RoleName;
|
|
98
|
+
/** Project root threaded through the engine's validate step. */
|
|
99
|
+
projectRoot?: string;
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Injectable accessors for {@link runFrontDoorLogin}.
|
|
103
|
+
*
|
|
104
|
+
* Defaults to the real core accessors; tests override individual members to
|
|
105
|
+
* drive the orchestrator without a live provider registry / engine.
|
|
106
|
+
*
|
|
107
|
+
* @task T11725
|
|
108
|
+
*/
|
|
109
|
+
export interface FrontDoorDeps {
|
|
110
|
+
/** Resolve a provider profile by name/alias (alias → canonical). */
|
|
111
|
+
getProviderProfile: (name: string) => Promise<ProviderProfile | undefined>;
|
|
112
|
+
/** The 3-step onboarding engine. */
|
|
113
|
+
runOnboardingLogin: (provider: string, opts?: OnboardingLoginOptions, deps?: OnboardingDeps) => Promise<OnboardingResult>;
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Resolve the auth method for a provider profile: caller override wins, else
|
|
117
|
+
* `oauth` when the profile advertises an OAuth config, else `api_key`.
|
|
118
|
+
*
|
|
119
|
+
* @param profile - The resolved provider profile.
|
|
120
|
+
* @param override - Optional explicit auth mode from the caller.
|
|
121
|
+
* @returns The effective {@link OnboardingAuthMode}.
|
|
122
|
+
* @task T11725
|
|
123
|
+
*/
|
|
124
|
+
export declare function resolveAuthMode(profile: ProviderProfile, override?: OnboardingAuthMode): OnboardingAuthMode;
|
|
125
|
+
/**
|
|
126
|
+
* Run the shared onboarding front-door flow for a provider (T11725 · M3).
|
|
127
|
+
*
|
|
128
|
+
* Resolves the provider + auth method, acquires the credential secret (raw API
|
|
129
|
+
* key from `opts.token`, or via the injected {@link OAuthTokenAcquirer} for the
|
|
130
|
+
* OAuth path), then delegates the heavy lifting to {@link runOnboardingLogin}.
|
|
131
|
+
*
|
|
132
|
+
* Mirrors the engine's never-throw-on-expected-failure contract: an unknown
|
|
133
|
+
* provider or a missing api-key secret returns a failed {@link OnboardingResult}
|
|
134
|
+
* envelope rather than throwing. The OAuth acquirer's own errors DO propagate —
|
|
135
|
+
* an aborted browser flow is a hard, caller-visible failure.
|
|
136
|
+
*
|
|
137
|
+
* @param provider - Provider name or alias (e.g. `'anthropic'`, `'codex'`).
|
|
138
|
+
* @param opts - {@link FrontDoorLoginOptions}.
|
|
139
|
+
* @param acquireOAuth - Interactive OAuth token acquirer (the CLI's browser flow).
|
|
140
|
+
* Only invoked on the `oauth` path; may be omitted when the flow is `api_key`.
|
|
141
|
+
* @param deps - Injectable accessor seam; defaults to real core accessors.
|
|
142
|
+
* @returns The typed onboarding result envelope.
|
|
143
|
+
* @task T11725
|
|
144
|
+
*/
|
|
145
|
+
export declare function runFrontDoorLogin(provider: string, opts?: FrontDoorLoginOptions, acquireOAuth?: OAuthTokenAcquirer, deps?: FrontDoorDeps): Promise<OnboardingResult>;
|
|
146
|
+
//# sourceMappingURL=front-door.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"front-door.d.ts","sourceRoot":"","sources":["../../../src/llm/onboarding/front-door.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAwCG;AAEH,OAAO,KAAK,EACV,kBAAkB,EAClB,gBAAgB,EAChB,eAAe,EACf,QAAQ,EACT,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EACL,KAAK,cAAc,EACnB,KAAK,sBAAsB,EAE5B,MAAM,mBAAmB,CAAC;AAM3B;;;;;;;;;GASG;AACH,MAAM,WAAW,kBAAkB;IACjC,2EAA2E;IAC3E,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kFAAkF;IAClF,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;CAC7B;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,kBAAkB,GAAG,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,kBAAkB,CAAC,CAAC;AAMnF;;;;GAIG;AACH,MAAM,WAAW,qBAAqB;IACpC;;;;OAIG;IACH,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,4DAA4D;IAC5D,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uEAAuE;IACvE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,CAAC,EAAE,QAAQ,CAAC;IAChB,gEAAgE;IAChE,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAMD;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa;IAC5B,oEAAoE;IACpE,kBAAkB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC,CAAC;IAC3E,oCAAoC;IACpC,kBAAkB,EAAE,CAClB,QAAQ,EAAE,MAAM,EAChB,IAAI,CAAC,EAAE,sBAAsB,EAC7B,IAAI,CAAC,EAAE,cAAc,KAClB,OAAO,CAAC,gBAAgB,CAAC,CAAC;CAChC;AAkBD;;;;;;;;GAQG;AACH,wBAAgB,eAAe,CAC7B,OAAO,EAAE,eAAe,EACxB,QAAQ,CAAC,EAAE,kBAAkB,GAC5B,kBAAkB,CAGpB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iBAAiB,CACrC,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,qBAA0B,EAChC,YAAY,CAAC,EAAE,kBAAkB,EACjC,IAAI,GAAE,aAAsC,GAC3C,OAAO,CAAC,gBAAgB,CAAC,CA0C3B"}
|
|
@@ -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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"}
|