@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
|
@@ -0,0 +1,524 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Service-vault OAuth flow — build / exchange / refresh / self-heal (T11939).
|
|
3
|
+
*
|
|
4
|
+
* EP-UNIVERSAL-SERVICE-VAULT (epic T11765 · saga SG-VAULT-CORE T10409 · M2 W2 ·
|
|
5
|
+
* task T11939). The OAuth dance the foundation (T11937) left a clean seam for.
|
|
6
|
+
* Every function is DRIVEN BY the declarative {@link ServiceProviderDef} from the
|
|
7
|
+
* `SERVICE_PROVIDERS` registry (contracts, T11937 + T11938 breadth) — there is no
|
|
8
|
+
* per-provider code, only data-shaped branches on the provider's `oauth` config
|
|
9
|
+
* and `refresh.kind` discriminant.
|
|
10
|
+
*
|
|
11
|
+
* ## What this module owns (the four entry points)
|
|
12
|
+
*
|
|
13
|
+
* 1. {@link buildAuthUrl} — compose the authorization URL (PKCE S256 + state +
|
|
14
|
+
* provider `extraAuthParams`) for an `oauth2`/`oauth2-pkce` provider, or the
|
|
15
|
+
* device-authorization start for a `device-code` provider.
|
|
16
|
+
* 2. {@link exchangeCode} — POST `grant_type=authorization_code` (+ PKCE
|
|
17
|
+
* verifier) to the token endpoint and PERSIST the resulting
|
|
18
|
+
* `{accessToken, refreshToken}` blob `encryptGlobal`-encrypted via
|
|
19
|
+
* {@link connectService} (the foundation accessor — reused, not reinvented).
|
|
20
|
+
* 3. {@link refreshAccessToken} — refresh an access token honoring the
|
|
21
|
+
* provider's `refresh` config: the `refresh-token` grant (Form/Json body ×
|
|
22
|
+
* Body/BasicAuth client auth) plus the three special variants (`github-app`
|
|
23
|
+
* JWT, `service-account-jwt` bearer, `client-credentials`).
|
|
24
|
+
* 4. {@link selfHealConnection} — the resolve-path self-heal: when a connection's
|
|
25
|
+
* `expires_at` is past, transparently refresh → re-`encryptGlobal` → persist
|
|
26
|
+
* back via the accessor, returning a FRESH {@link SealedCredential} so agents
|
|
27
|
+
* NEVER see a stale token. Cannibalizes onecli `connect.rs::resolve_access_token`.
|
|
28
|
+
*
|
|
29
|
+
* ## Crypto + persistence reuse (DRY — no new crypto, no new store)
|
|
30
|
+
*
|
|
31
|
+
* Encryption is ALWAYS `encryptGlobal` keyed `id = service:${provider}:${label}`
|
|
32
|
+
* (via {@link connectService} / {@link updateConnectionTokens}). The egress handle
|
|
33
|
+
* is the shared {@link makeSealedCredential} — the plaintext materializes ONLY at
|
|
34
|
+
* the wire inside the handle's `fetch()`, never inline on a resolve. HTTP uses the
|
|
35
|
+
* platform `globalThis.fetch` (no new dep) so tests inject a stub.
|
|
36
|
+
*
|
|
37
|
+
* @module store/service-oauth
|
|
38
|
+
* @task T11939
|
|
39
|
+
* @epic T11765
|
|
40
|
+
* @saga T10409
|
|
41
|
+
* @see ../../../contracts/src/vault/service-provider.ts — the DATA that drives this flow
|
|
42
|
+
* @see ./service-connections-accessor.ts — connect/resolve/persist (reused)
|
|
43
|
+
* @see ../llm/oauth/pkce.ts — generatePkcePair / buildAuthorizationUrl (reused)
|
|
44
|
+
* @see ../crypto/credentials.ts — encryptGlobal / decryptGlobal (reused)
|
|
45
|
+
* @see ../../../onecli — apps/gateway/src/{apps.rs,connect.rs} (the ported design)
|
|
46
|
+
*/
|
|
47
|
+
import { SERVICE_PROVIDERS } from '@cleocode/contracts';
|
|
48
|
+
import { buildAuthorizationUrl, generatePkcePair } from '../llm/oauth/pkce.js';
|
|
49
|
+
import { makeSealedCredential, tokenPreview } from '../llm/sealed-credential.js';
|
|
50
|
+
import { connectService, loadDecryptedTokenBlob, updateConnectionTokens, } from './service-connections-accessor.js';
|
|
51
|
+
/** Bind the platform fetch lazily so the module imports side-effect-free. */
|
|
52
|
+
const globalFetch = (input, init) => globalThis.fetch(input, init);
|
|
53
|
+
// ---------------------------------------------------------------------------
|
|
54
|
+
// Provider resolution
|
|
55
|
+
// ---------------------------------------------------------------------------
|
|
56
|
+
/**
|
|
57
|
+
* Resolve the {@link ServiceProviderDef} for a provider key, throwing a typed
|
|
58
|
+
* error when unknown.
|
|
59
|
+
*
|
|
60
|
+
* @param provider - The stable provider key (e.g. `'github'`).
|
|
61
|
+
* @returns The declarative provider definition.
|
|
62
|
+
* @throws {Error} `E_SERVICE_PROVIDER_UNKNOWN` when the key is not in the registry.
|
|
63
|
+
* @task T11939
|
|
64
|
+
*/
|
|
65
|
+
export function resolveProviderDef(provider) {
|
|
66
|
+
const def = SERVICE_PROVIDERS[provider];
|
|
67
|
+
if (def === undefined) {
|
|
68
|
+
throw new Error(`E_SERVICE_PROVIDER_UNKNOWN: no service provider '${provider}' in registry`);
|
|
69
|
+
}
|
|
70
|
+
return def;
|
|
71
|
+
}
|
|
72
|
+
/** Resolve the provider's OAuth config, throwing when the provider is api-key-only. */
|
|
73
|
+
function requireOAuth(def) {
|
|
74
|
+
if (def.oauth === undefined) {
|
|
75
|
+
throw new Error(`E_SERVICE_OAUTH_UNSUPPORTED: provider '${def.provider}' (authKind=${def.authKind}) has no OAuth config`);
|
|
76
|
+
}
|
|
77
|
+
return def.oauth;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* AC1 — build the authorization URL (+ PKCE pair) for an OAuth provider.
|
|
81
|
+
*
|
|
82
|
+
* Generates a fresh PKCE verifier/challenge (RFC 7636 S256) and composes the
|
|
83
|
+
* authorization URL via the reused {@link buildAuthorizationUrl}, appending the
|
|
84
|
+
* provider's declared `extraAuthParams` (e.g. google `access_type=offline`).
|
|
85
|
+
* Returns the verifier + state the caller round-trips through the redirect into
|
|
86
|
+
* {@link exchangeCode}.
|
|
87
|
+
*
|
|
88
|
+
* @param provider - The provider key (must have an `oauth` config).
|
|
89
|
+
* @param opts - Optional state / scope / client-id / redirect overrides (BYOC).
|
|
90
|
+
* @returns The auth URL plus the PKCE verifier and state to round-trip.
|
|
91
|
+
* @throws {Error} When the provider is unknown or api-key-only.
|
|
92
|
+
* @task T11939
|
|
93
|
+
*/
|
|
94
|
+
export async function buildAuthUrl(provider, opts = {}) {
|
|
95
|
+
const def = resolveProviderDef(provider);
|
|
96
|
+
const oauth = requireOAuth(def);
|
|
97
|
+
if (oauth.authorizationEndpoint === undefined) {
|
|
98
|
+
throw new Error(`E_SERVICE_OAUTH_NO_AUTH_ENDPOINT: provider '${provider}' has no authorizationEndpoint (device-code flow uses startDeviceAuthorization)`);
|
|
99
|
+
}
|
|
100
|
+
const { codeVerifier, codeChallenge } = await generatePkcePair();
|
|
101
|
+
const state = opts.state ?? generateState();
|
|
102
|
+
const redirectUri = opts.redirectUri ?? oauth.redirectUri ?? 'http://127.0.0.1:7878/callback';
|
|
103
|
+
const scope = opts.scope ?? oauth.scope ?? def.defaultScopes ?? '';
|
|
104
|
+
const authUrl = buildAuthorizationUrl({
|
|
105
|
+
authorizationEndpoint: oauth.authorizationEndpoint,
|
|
106
|
+
clientId: opts.clientId ?? oauth.clientId,
|
|
107
|
+
redirectUri,
|
|
108
|
+
scope,
|
|
109
|
+
codeChallenge,
|
|
110
|
+
state,
|
|
111
|
+
...(oauth.extraAuthParams !== undefined ? { extraParams: oauth.extraAuthParams } : {}),
|
|
112
|
+
});
|
|
113
|
+
return { authUrl, codeVerifier, state, redirectUri };
|
|
114
|
+
}
|
|
115
|
+
/** Generate an opaque, URL-safe CSRF `state` value. */
|
|
116
|
+
function generateState() {
|
|
117
|
+
const bytes = crypto.getRandomValues(new Uint8Array(16));
|
|
118
|
+
return Array.from(bytes, (b) => b.toString(16).padStart(2, '0')).join('');
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* AC1 — exchange an authorization code for tokens and PERSIST them encrypted.
|
|
122
|
+
*
|
|
123
|
+
* POSTs `grant_type=authorization_code` (+ PKCE verifier) to the provider's token
|
|
124
|
+
* endpoint via the reused {@link exchangePkceCode}, then writes the resulting
|
|
125
|
+
* `{accessToken, refreshToken}` blob `encryptGlobal`-encrypted through
|
|
126
|
+
* {@link connectService}. The plaintext token is NEVER returned — only the
|
|
127
|
+
* non-secret connection identity. The expiry is computed from `expires_in`.
|
|
128
|
+
*
|
|
129
|
+
* @param provider - The provider key.
|
|
130
|
+
* @param opts - The code, PKCE verifier, redirect, and connection label.
|
|
131
|
+
* @param deps - Injectable HTTP / clock / vault (test seam).
|
|
132
|
+
* @returns The persisted connection's non-secret identity.
|
|
133
|
+
* @throws {Error} On HTTP failure or a token response missing `access_token`.
|
|
134
|
+
* @task T11939
|
|
135
|
+
*/
|
|
136
|
+
export async function exchangeCode(provider, opts, deps = {}) {
|
|
137
|
+
const def = resolveProviderDef(provider);
|
|
138
|
+
const oauth = requireOAuth(def);
|
|
139
|
+
const label = opts.label ?? 'default';
|
|
140
|
+
const fetchImpl = deps.fetch ?? globalFetch;
|
|
141
|
+
// POST grant_type=authorization_code + PKCE verifier through the injectable
|
|
142
|
+
// FetchLike (consistent with the refresh path; lets a test stub the endpoint).
|
|
143
|
+
const form = new URLSearchParams({
|
|
144
|
+
grant_type: 'authorization_code',
|
|
145
|
+
client_id: opts.clientId ?? oauth.clientId,
|
|
146
|
+
code: opts.code,
|
|
147
|
+
code_verifier: opts.codeVerifier,
|
|
148
|
+
redirect_uri: opts.redirectUri,
|
|
149
|
+
});
|
|
150
|
+
const resp = await fetchImpl(oauth.tokenEndpoint, {
|
|
151
|
+
method: 'POST',
|
|
152
|
+
headers: {
|
|
153
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
154
|
+
Accept: 'application/json',
|
|
155
|
+
},
|
|
156
|
+
body: form.toString(),
|
|
157
|
+
});
|
|
158
|
+
if (!resp.ok) {
|
|
159
|
+
throw new Error(`E_SERVICE_EXCHANGE_HTTP: provider '${provider}' code exchange failed: HTTP ${resp.status}: ${await safeText(resp)}`);
|
|
160
|
+
}
|
|
161
|
+
const data = (await resp.json());
|
|
162
|
+
const accessToken = data['access_token'];
|
|
163
|
+
if (typeof accessToken !== 'string' || accessToken.length === 0) {
|
|
164
|
+
const err = typeof data['error'] === 'string' ? data['error'] : 'no access_token';
|
|
165
|
+
throw new Error(`E_SERVICE_EXCHANGE_NO_ACCESS_TOKEN: provider '${provider}': ${err}`);
|
|
166
|
+
}
|
|
167
|
+
const tokens = {
|
|
168
|
+
accessToken,
|
|
169
|
+
refreshToken: typeof data['refresh_token'] === 'string' ? data['refresh_token'] : undefined,
|
|
170
|
+
expiresIn: typeof data['expires_in'] === 'number' ? data['expires_in'] : undefined,
|
|
171
|
+
tokenType: typeof data['token_type'] === 'string' ? data['token_type'] : 'bearer',
|
|
172
|
+
};
|
|
173
|
+
const expiresAt = computeExpiresAt(tokens.expiresIn, deps.now);
|
|
174
|
+
const blob = {
|
|
175
|
+
accessToken: tokens.accessToken,
|
|
176
|
+
...(tokens.refreshToken !== undefined ? { refreshToken: tokens.refreshToken } : {}),
|
|
177
|
+
};
|
|
178
|
+
const connectionId = await connectService({
|
|
179
|
+
provider,
|
|
180
|
+
label,
|
|
181
|
+
tokens: blob,
|
|
182
|
+
scopes: (oauth.scope ?? def.defaultScopes ?? '').split(' ').filter((s) => s.length > 0),
|
|
183
|
+
...(expiresAt !== null ? { expiresAt } : {}),
|
|
184
|
+
...(opts.metadata !== undefined ? { metadata: opts.metadata } : {}),
|
|
185
|
+
}, deps.vault);
|
|
186
|
+
return {
|
|
187
|
+
connectionId,
|
|
188
|
+
provider,
|
|
189
|
+
label,
|
|
190
|
+
expiresAt,
|
|
191
|
+
hasRefreshToken: tokens.refreshToken !== undefined,
|
|
192
|
+
};
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* AC2 — refresh an access token honoring the provider's declared refresh config.
|
|
196
|
+
*
|
|
197
|
+
* Branches on {@link RefreshConfig.kind}:
|
|
198
|
+
*
|
|
199
|
+
* - `refresh-token` — `grant_type=refresh_token` shaped by `bodyFormat`
|
|
200
|
+
* (Form/Json) × `clientAuth` (Body/BasicAuth). The common OAuth case.
|
|
201
|
+
* - `github-app` — sign an RS256 JWT with the app key, POST
|
|
202
|
+
* `/app/installations/{id}/access_tokens`.
|
|
203
|
+
* - `service-account-jwt` — sign an RS256 JWT, exchange via
|
|
204
|
+
* `grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer`.
|
|
205
|
+
* - `client-credentials` — `grant_type=client_credentials`, Basic-auth client.
|
|
206
|
+
*
|
|
207
|
+
* Returns normalized {@link OAuthTokens} (a fresh access token + optional rotated
|
|
208
|
+
* refresh token). PERSISTENCE is the caller's job ({@link selfHealConnection}
|
|
209
|
+
* does it); this function is pure HTTP + crypto so it is independently testable.
|
|
210
|
+
*
|
|
211
|
+
* @param provider - The provider key.
|
|
212
|
+
* @param opts - The refresh token / client credentials / variant secrets.
|
|
213
|
+
* @param deps - Injectable HTTP / clock (test seam).
|
|
214
|
+
* @returns The refreshed tokens.
|
|
215
|
+
* @throws {Error} When the provider declares no refresh, or the exchange fails.
|
|
216
|
+
* @task T11939
|
|
217
|
+
*/
|
|
218
|
+
export async function refreshAccessToken(provider, opts, deps = {}) {
|
|
219
|
+
const def = resolveProviderDef(provider);
|
|
220
|
+
const refresh = def.refresh;
|
|
221
|
+
if (refresh === undefined) {
|
|
222
|
+
throw new Error(`E_SERVICE_REFRESH_UNSUPPORTED: provider '${provider}' declares no refresh config`);
|
|
223
|
+
}
|
|
224
|
+
const fetchImpl = deps.fetch ?? globalFetch;
|
|
225
|
+
switch (refresh.kind) {
|
|
226
|
+
case 'refresh-token':
|
|
227
|
+
return refreshViaRefreshToken(provider, refresh, opts, fetchImpl);
|
|
228
|
+
case 'github-app':
|
|
229
|
+
return refreshViaGithubApp(refresh, opts, fetchImpl, deps.now);
|
|
230
|
+
case 'service-account-jwt':
|
|
231
|
+
return refreshViaServiceAccount(refresh, opts, fetchImpl, deps.now);
|
|
232
|
+
case 'client-credentials':
|
|
233
|
+
return refreshViaClientCredentials(refresh, opts, fetchImpl);
|
|
234
|
+
default: {
|
|
235
|
+
// Exhaustiveness guard — a new RefreshKind must extend this switch.
|
|
236
|
+
const never = refresh.kind;
|
|
237
|
+
throw new Error(`E_SERVICE_REFRESH_KIND_UNKNOWN: ${String(never)}`);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
/** `grant_type=refresh_token` — Form/Json body × Body/BasicAuth client auth. */
|
|
242
|
+
async function refreshViaRefreshToken(provider, refresh, opts, fetchImpl) {
|
|
243
|
+
const refreshToken = opts.refreshToken;
|
|
244
|
+
if (refreshToken === undefined || refreshToken.length === 0) {
|
|
245
|
+
throw new Error(`E_SERVICE_REFRESH_NO_TOKEN: provider '${provider}' refresh requires a token`);
|
|
246
|
+
}
|
|
247
|
+
const bodyFormat = refresh.bodyFormat ?? 'form';
|
|
248
|
+
const clientAuth = refresh.clientAuth ?? 'body';
|
|
249
|
+
const clientId = opts.client?.clientId;
|
|
250
|
+
const clientSecret = opts.client?.clientSecret;
|
|
251
|
+
const headers = { Accept: 'application/json' };
|
|
252
|
+
// BasicAuth presents the client credentials as an Authorization header.
|
|
253
|
+
if (clientAuth === 'basic-auth' && clientId !== undefined && clientSecret !== undefined) {
|
|
254
|
+
headers['authorization'] = `Basic ${base64(`${clientId}:${clientSecret}`)}`;
|
|
255
|
+
}
|
|
256
|
+
let body;
|
|
257
|
+
if (bodyFormat === 'json') {
|
|
258
|
+
headers['Content-Type'] = 'application/json';
|
|
259
|
+
const json = {
|
|
260
|
+
refresh_token: refreshToken,
|
|
261
|
+
grant_type: 'refresh_token',
|
|
262
|
+
};
|
|
263
|
+
if (clientAuth === 'body' && clientId !== undefined && clientSecret !== undefined) {
|
|
264
|
+
json['client_id'] = clientId;
|
|
265
|
+
json['client_secret'] = clientSecret;
|
|
266
|
+
}
|
|
267
|
+
body = JSON.stringify(json);
|
|
268
|
+
}
|
|
269
|
+
else {
|
|
270
|
+
headers['Content-Type'] = 'application/x-www-form-urlencoded';
|
|
271
|
+
const form = new URLSearchParams({
|
|
272
|
+
refresh_token: refreshToken,
|
|
273
|
+
grant_type: 'refresh_token',
|
|
274
|
+
});
|
|
275
|
+
if (clientAuth === 'body' && clientId !== undefined && clientSecret !== undefined) {
|
|
276
|
+
form.set('client_id', clientId);
|
|
277
|
+
form.set('client_secret', clientSecret);
|
|
278
|
+
}
|
|
279
|
+
body = form.toString();
|
|
280
|
+
}
|
|
281
|
+
const resp = await fetchImpl(refresh.tokenUrl, { method: 'POST', headers, body });
|
|
282
|
+
return parseRefreshResponse(provider, resp);
|
|
283
|
+
}
|
|
284
|
+
/** `grant_type=client_credentials` — Basic-auth client (e.g. MongoDB Atlas SAs). */
|
|
285
|
+
async function refreshViaClientCredentials(refresh, opts, fetchImpl) {
|
|
286
|
+
const clientId = opts.client?.clientId;
|
|
287
|
+
const clientSecret = opts.client?.clientSecret;
|
|
288
|
+
if (clientId === undefined || clientSecret === undefined) {
|
|
289
|
+
throw new Error('E_SERVICE_REFRESH_NO_CLIENT: client_credentials refresh requires clientId + clientSecret');
|
|
290
|
+
}
|
|
291
|
+
const resp = await fetchImpl(refresh.tokenUrl, {
|
|
292
|
+
method: 'POST',
|
|
293
|
+
headers: {
|
|
294
|
+
Authorization: `Basic ${base64(`${clientId}:${clientSecret}`)}`,
|
|
295
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
296
|
+
Accept: 'application/json',
|
|
297
|
+
},
|
|
298
|
+
body: 'grant_type=client_credentials',
|
|
299
|
+
});
|
|
300
|
+
return parseRefreshResponse('client-credentials', resp);
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* GitHub App installation token — sign an RS256 JWT with the app key, exchange at
|
|
304
|
+
* `/app/installations/{id}/access_tokens`. The response shape differs (`token` +
|
|
305
|
+
* `expires_at`), normalized here to {@link OAuthTokens}.
|
|
306
|
+
*/
|
|
307
|
+
async function refreshViaGithubApp(refresh, opts, fetchImpl, now) {
|
|
308
|
+
const { privateKeyPem, appId, installationId } = opts.variant ?? {};
|
|
309
|
+
if (privateKeyPem === undefined || appId === undefined || installationId === undefined) {
|
|
310
|
+
throw new Error('E_SERVICE_REFRESH_GITHUB_APP: github-app refresh requires privateKeyPem + appId + installationId');
|
|
311
|
+
}
|
|
312
|
+
const nowSec = Math.floor((now?.() ?? Date.now()) / 1000);
|
|
313
|
+
const jwt = await signRs256Jwt({ alg: 'RS256', typ: 'JWT' }, { iss: appId, iat: nowSec - 60, exp: nowSec + 600 }, privateKeyPem);
|
|
314
|
+
const url = `${refresh.tokenUrl}/${installationId}/access_tokens`;
|
|
315
|
+
const resp = await fetchImpl(url, {
|
|
316
|
+
method: 'POST',
|
|
317
|
+
headers: {
|
|
318
|
+
Authorization: `Bearer ${jwt}`,
|
|
319
|
+
Accept: 'application/vnd.github+json',
|
|
320
|
+
'X-GitHub-Api-Version': '2022-11-28',
|
|
321
|
+
'User-Agent': 'cleo-service-vault',
|
|
322
|
+
},
|
|
323
|
+
});
|
|
324
|
+
if (!resp.ok) {
|
|
325
|
+
throw new Error(`E_SERVICE_REFRESH_GITHUB_APP_HTTP: HTTP ${resp.status}: ${await safeText(resp)}`);
|
|
326
|
+
}
|
|
327
|
+
const data = (await resp.json());
|
|
328
|
+
const token = data['token'];
|
|
329
|
+
if (typeof token !== 'string' || token.length === 0) {
|
|
330
|
+
throw new Error('E_SERVICE_REFRESH_GITHUB_APP_NO_TOKEN: installation token response missing token');
|
|
331
|
+
}
|
|
332
|
+
// GitHub returns an ISO `expires_at`; derive seconds-until for the common shape.
|
|
333
|
+
const expiresAtIso = typeof data['expires_at'] === 'string' ? data['expires_at'] : undefined;
|
|
334
|
+
const expiresIn = expiresAtIso !== undefined
|
|
335
|
+
? Math.max(0, Math.floor((Date.parse(expiresAtIso) - (now?.() ?? Date.now())) / 1000))
|
|
336
|
+
: 3600;
|
|
337
|
+
return { accessToken: token, expiresIn, tokenType: 'bearer' };
|
|
338
|
+
}
|
|
339
|
+
/**
|
|
340
|
+
* Google service-account — sign an RS256 JWT and exchange via the jwt-bearer
|
|
341
|
+
* grant at the provider's token endpoint.
|
|
342
|
+
*/
|
|
343
|
+
async function refreshViaServiceAccount(refresh, opts, fetchImpl, now) {
|
|
344
|
+
const { privateKeyPem, clientEmail } = opts.variant ?? {};
|
|
345
|
+
if (privateKeyPem === undefined || clientEmail === undefined) {
|
|
346
|
+
throw new Error('E_SERVICE_REFRESH_SERVICE_ACCOUNT: service-account-jwt refresh requires privateKeyPem + clientEmail');
|
|
347
|
+
}
|
|
348
|
+
const nowSec = Math.floor((now?.() ?? Date.now()) / 1000);
|
|
349
|
+
const assertion = await signRs256Jwt({ alg: 'RS256', typ: 'JWT' }, {
|
|
350
|
+
iss: clientEmail,
|
|
351
|
+
sub: clientEmail,
|
|
352
|
+
aud: refresh.tokenUrl,
|
|
353
|
+
scope: 'https://www.googleapis.com/auth/cloud-platform',
|
|
354
|
+
iat: nowSec,
|
|
355
|
+
exp: nowSec + 3600,
|
|
356
|
+
}, privateKeyPem);
|
|
357
|
+
const resp = await fetchImpl(refresh.tokenUrl, {
|
|
358
|
+
method: 'POST',
|
|
359
|
+
headers: {
|
|
360
|
+
'Content-Type': 'application/x-www-form-urlencoded',
|
|
361
|
+
Accept: 'application/json',
|
|
362
|
+
},
|
|
363
|
+
body: new URLSearchParams({
|
|
364
|
+
grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',
|
|
365
|
+
assertion,
|
|
366
|
+
}).toString(),
|
|
367
|
+
});
|
|
368
|
+
return parseRefreshResponse('service-account', resp);
|
|
369
|
+
}
|
|
370
|
+
/**
|
|
371
|
+
* AC3 — resolve a connection, transparently refreshing a PAST-EXPIRY token.
|
|
372
|
+
*
|
|
373
|
+
* The self-heal resolve path (cannibalized from onecli
|
|
374
|
+
* `connect.rs::resolve_access_token`):
|
|
375
|
+
*
|
|
376
|
+
* 1. Read the connection's non-secret view (`expiresAt`).
|
|
377
|
+
* 2. If `expiresAt` is past (within `skewSeconds`) AND a refresh token exists:
|
|
378
|
+
* refresh via {@link refreshAccessToken}, re-`encryptGlobal` the new blob, and
|
|
379
|
+
* persist it back via {@link updateConnectionTokens} — so the NEXT resolve and
|
|
380
|
+
* every other agent see the fresh token.
|
|
381
|
+
* 3. Return a FRESH {@link SealedCredential} resolving against the (now-current)
|
|
382
|
+
* stored blob. A stale token is NEVER handed out: the heal runs BEFORE the
|
|
383
|
+
* sealed handle is built, and the handle decrypts the persisted (fresh) blob.
|
|
384
|
+
*
|
|
385
|
+
* The trust gate runs inside the accessor's resolve — a denied agent gets `null`
|
|
386
|
+
* with NO refresh and NO decrypt.
|
|
387
|
+
*
|
|
388
|
+
* @param connectionRef - The agent + provider + label, plus refresh credentials.
|
|
389
|
+
* @param deps - Injectable HTTP / clock / vault (test seam — the fake clock proves
|
|
390
|
+
* the past-expiry branch fires).
|
|
391
|
+
* @returns The fresh sealed credential + whether a refresh fired.
|
|
392
|
+
* @task T11939
|
|
393
|
+
*/
|
|
394
|
+
export async function selfHealConnection(connectionRef, deps = {}) {
|
|
395
|
+
const { agentId, provider, label } = connectionRef;
|
|
396
|
+
const nowMs = deps.now?.() ?? Date.now();
|
|
397
|
+
const skewMs = (connectionRef.skewSeconds ?? 0) * 1000;
|
|
398
|
+
// 1. Load the decrypted blob + expiry (gated: the accessor enforces the trust
|
|
399
|
+
// gate and only decrypts on allow). A denied/missing connection → null.
|
|
400
|
+
const loaded = await loadDecryptedTokenBlob({
|
|
401
|
+
agentId,
|
|
402
|
+
provider,
|
|
403
|
+
label,
|
|
404
|
+
...(connectionRef.approved !== undefined ? { approved: connectionRef.approved } : {}),
|
|
405
|
+
}, deps.vault);
|
|
406
|
+
if (loaded === null) {
|
|
407
|
+
return { sealed: null, refreshed: false, expiresAt: null };
|
|
408
|
+
}
|
|
409
|
+
let { blob, expiresAt } = loaded;
|
|
410
|
+
let refreshed = false;
|
|
411
|
+
// 2. Past expiry (within skew) AND refreshable → transparent refresh + persist.
|
|
412
|
+
const expiryMs = expiresAt !== null ? Date.parse(expiresAt) : Number.NaN;
|
|
413
|
+
const isPast = !Number.isNaN(expiryMs) && expiryMs - skewMs <= nowMs;
|
|
414
|
+
if (isPast && blob.refreshToken !== undefined && def_isRefreshable(provider)) {
|
|
415
|
+
const fresh = await refreshAccessToken(provider, {
|
|
416
|
+
refreshToken: blob.refreshToken,
|
|
417
|
+
...(connectionRef.client !== undefined ? { client: connectionRef.client } : {}),
|
|
418
|
+
...(connectionRef.variant !== undefined ? { variant: connectionRef.variant } : {}),
|
|
419
|
+
}, deps);
|
|
420
|
+
const newExpiresAt = computeExpiresAt(fresh.expiresIn, deps.now);
|
|
421
|
+
const newBlob = {
|
|
422
|
+
accessToken: fresh.accessToken,
|
|
423
|
+
// Honor refresh-token rotation; else keep the existing one.
|
|
424
|
+
refreshToken: fresh.refreshToken ?? blob.refreshToken,
|
|
425
|
+
};
|
|
426
|
+
await updateConnectionTokens({ provider, label, tokens: newBlob, expiresAt: newExpiresAt }, deps.vault);
|
|
427
|
+
blob = newBlob;
|
|
428
|
+
expiresAt = newExpiresAt;
|
|
429
|
+
refreshed = true;
|
|
430
|
+
}
|
|
431
|
+
// 3. Build a sealed handle over the (now-fresh) access token. The plaintext
|
|
432
|
+
// only materializes at the wire inside fetch().
|
|
433
|
+
const freshAccessToken = blob.accessToken;
|
|
434
|
+
const sealed = makeSealedCredential({
|
|
435
|
+
provider,
|
|
436
|
+
account: label,
|
|
437
|
+
tokenPreview: tokenPreview('', 'oauth'),
|
|
438
|
+
resolveToken: () => freshAccessToken,
|
|
439
|
+
});
|
|
440
|
+
return { sealed, refreshed, expiresAt };
|
|
441
|
+
}
|
|
442
|
+
/** Whether the provider declares a refresh config (drives the self-heal branch). */
|
|
443
|
+
function def_isRefreshable(provider) {
|
|
444
|
+
return SERVICE_PROVIDERS[provider]?.refresh !== undefined;
|
|
445
|
+
}
|
|
446
|
+
// ---------------------------------------------------------------------------
|
|
447
|
+
// Shared helpers (HTTP parse, expiry, base64, RS256 JWT)
|
|
448
|
+
// ---------------------------------------------------------------------------
|
|
449
|
+
/** Parse a token-endpoint response into normalized {@link OAuthTokens}. */
|
|
450
|
+
async function parseRefreshResponse(provider, resp) {
|
|
451
|
+
if (!resp.ok) {
|
|
452
|
+
throw new Error(`E_SERVICE_REFRESH_HTTP: provider '${provider}' refresh failed: HTTP ${resp.status}: ${await safeText(resp)}`);
|
|
453
|
+
}
|
|
454
|
+
const data = (await resp.json());
|
|
455
|
+
const accessToken = data['access_token'];
|
|
456
|
+
if (typeof accessToken !== 'string' || accessToken.length === 0) {
|
|
457
|
+
const err = typeof data['error'] === 'string' ? data['error'] : 'no access_token';
|
|
458
|
+
throw new Error(`E_SERVICE_REFRESH_NO_ACCESS_TOKEN: provider '${provider}': ${err}`);
|
|
459
|
+
}
|
|
460
|
+
return {
|
|
461
|
+
accessToken,
|
|
462
|
+
refreshToken: typeof data['refresh_token'] === 'string' ? data['refresh_token'] : undefined,
|
|
463
|
+
expiresIn: typeof data['expires_in'] === 'number' ? data['expires_in'] : undefined,
|
|
464
|
+
tokenType: typeof data['token_type'] === 'string' ? data['token_type'] : 'bearer',
|
|
465
|
+
};
|
|
466
|
+
}
|
|
467
|
+
/** Read a response body as text without throwing (for error detail). */
|
|
468
|
+
async function safeText(resp) {
|
|
469
|
+
try {
|
|
470
|
+
return (await resp.text()).slice(0, 512);
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
return '';
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/** Compute an ISO-8601 expiry from `expires_in` seconds, or `null` when absent. */
|
|
477
|
+
function computeExpiresAt(expiresIn, now) {
|
|
478
|
+
if (expiresIn === undefined)
|
|
479
|
+
return null;
|
|
480
|
+
return new Date((now?.() ?? Date.now()) + expiresIn * 1000).toISOString();
|
|
481
|
+
}
|
|
482
|
+
/** Base64-encode a UTF-8 string (Node Buffer; platform-available). */
|
|
483
|
+
function base64(input) {
|
|
484
|
+
return Buffer.from(input, 'utf-8').toString('base64');
|
|
485
|
+
}
|
|
486
|
+
/** Base64url-encode bytes (no padding) for JWT segments. */
|
|
487
|
+
function base64url(bytes) {
|
|
488
|
+
return Buffer.from(bytes)
|
|
489
|
+
.toString('base64')
|
|
490
|
+
.replace(/\+/g, '-')
|
|
491
|
+
.replace(/\//g, '_')
|
|
492
|
+
.replace(/=+$/, '');
|
|
493
|
+
}
|
|
494
|
+
/**
|
|
495
|
+
* Sign a compact RS256 JWT using Web Crypto (no new dep — replaces the Rust
|
|
496
|
+
* `jsonwebtoken` crate). Used by the github-app + service-account-jwt variants.
|
|
497
|
+
*
|
|
498
|
+
* @param header - The JOSE header (`{ alg: 'RS256', typ: 'JWT' }`).
|
|
499
|
+
* @param claims - The claim set.
|
|
500
|
+
* @param privateKeyPem - The RSA private key in PKCS#8 PEM.
|
|
501
|
+
* @returns The signed compact JWT.
|
|
502
|
+
*/
|
|
503
|
+
async function signRs256Jwt(header, claims, privateKeyPem) {
|
|
504
|
+
const enc = new TextEncoder();
|
|
505
|
+
const headerB64 = base64url(enc.encode(JSON.stringify(header)));
|
|
506
|
+
const claimsB64 = base64url(enc.encode(JSON.stringify(claims)));
|
|
507
|
+
const signingInput = `${headerB64}.${claimsB64}`;
|
|
508
|
+
const key = await crypto.subtle.importKey('pkcs8', pemToPkcs8(privateKeyPem), { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' }, false, ['sign']);
|
|
509
|
+
const signature = await crypto.subtle.sign('RSASSA-PKCS1-v1_5', key, enc.encode(signingInput));
|
|
510
|
+
return `${signingInput}.${base64url(new Uint8Array(signature))}`;
|
|
511
|
+
}
|
|
512
|
+
/** Decode a PKCS#8 PEM private key to its DER bytes. */
|
|
513
|
+
function pemToPkcs8(pem) {
|
|
514
|
+
const body = pem
|
|
515
|
+
.replace(/-----BEGIN [^-]+-----/, '')
|
|
516
|
+
.replace(/-----END [^-]+-----/, '')
|
|
517
|
+
.replace(/\s+/g, '');
|
|
518
|
+
const der = Buffer.from(body, 'base64');
|
|
519
|
+
// Return a copy as a standalone ArrayBuffer (avoids SharedArrayBuffer typing).
|
|
520
|
+
const out = new ArrayBuffer(der.byteLength);
|
|
521
|
+
new Uint8Array(out).set(der);
|
|
522
|
+
return out;
|
|
523
|
+
}
|
|
524
|
+
//# sourceMappingURL=service-oauth.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service-oauth.js","sourceRoot":"","sources":["../../src/store/service-oauth.ts"],"names":[],"mappings":"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"}
|