@nodetool-ai/runtime 0.7.0-rc.23 → 0.8.2
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/README.md +29 -0
- package/dist/.nodetool-build-stamp +1 -0
- package/dist/agent-memory.d.ts +118 -0
- package/dist/agent-memory.d.ts.map +1 -0
- package/dist/agent-memory.js +186 -0
- package/dist/agent-memory.js.map +1 -0
- package/dist/async-local-storage.d.ts +20 -0
- package/dist/async-local-storage.d.ts.map +1 -0
- package/dist/async-local-storage.js +28 -0
- package/dist/async-local-storage.js.map +1 -0
- package/dist/blender-executor.d.ts +93 -0
- package/dist/blender-executor.d.ts.map +1 -0
- package/dist/blender-executor.js +294 -0
- package/dist/blender-executor.js.map +1 -0
- package/dist/comfy-executor.d.ts +23 -1
- package/dist/comfy-executor.d.ts.map +1 -1
- package/dist/comfy-executor.js +234 -55
- package/dist/comfy-executor.js.map +1 -1
- package/dist/context-packer.d.ts +1 -1
- package/dist/context-packer.d.ts.map +1 -1
- package/dist/context-packer.js +23 -25
- package/dist/context-packer.js.map +1 -1
- package/dist/context.d.ts +982 -127
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +2649 -530
- package/dist/context.js.map +1 -1
- package/dist/cost-reconciler.d.ts +32 -0
- package/dist/cost-reconciler.d.ts.map +1 -0
- package/dist/cost-reconciler.js +21 -0
- package/dist/cost-reconciler.js.map +1 -0
- package/dist/entities.d.ts +33 -0
- package/dist/entities.d.ts.map +1 -0
- package/dist/entities.js +43 -0
- package/dist/entities.js.map +1 -0
- package/dist/external-media-fetch.d.ts +29 -0
- package/dist/external-media-fetch.d.ts.map +1 -0
- package/dist/external-media-fetch.js +38 -0
- package/dist/external-media-fetch.js.map +1 -0
- package/dist/generation-receipt.d.ts +86 -0
- package/dist/generation-receipt.d.ts.map +1 -0
- package/dist/generation-receipt.js +137 -0
- package/dist/generation-receipt.js.map +1 -0
- package/dist/generation-registry.d.ts +75 -0
- package/dist/generation-registry.d.ts.map +1 -0
- package/dist/generation-registry.js +144 -0
- package/dist/generation-registry.js.map +1 -0
- package/dist/google/client.d.ts +196 -0
- package/dist/google/client.d.ts.map +1 -0
- package/dist/google/client.js +396 -0
- package/dist/google/client.js.map +1 -0
- package/dist/google/index.d.ts +3 -0
- package/dist/google/index.d.ts.map +1 -0
- package/dist/google/index.js +3 -0
- package/dist/google/index.js.map +1 -0
- package/dist/google/token.d.ts +15 -0
- package/dist/google/token.d.ts.map +1 -0
- package/dist/google/token.js +24 -0
- package/dist/google/token.js.map +1 -0
- package/dist/host-binaries.d.ts +106 -0
- package/dist/host-binaries.d.ts.map +1 -0
- package/dist/host-binaries.js +352 -0
- package/dist/host-binaries.js.map +1 -0
- package/dist/image-codec.d.ts +76 -0
- package/dist/image-codec.d.ts.map +1 -0
- package/dist/image-codec.js +293 -0
- package/dist/image-codec.js.map +1 -0
- package/dist/image-model-tasks.d.ts +15 -0
- package/dist/image-model-tasks.d.ts.map +1 -0
- package/dist/image-model-tasks.js +24 -0
- package/dist/image-model-tasks.js.map +1 -0
- package/dist/index.d.ts +67 -6
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +51 -4
- package/dist/index.js.map +1 -1
- package/dist/invocation-account.d.ts +43 -0
- package/dist/invocation-account.d.ts.map +1 -0
- package/dist/invocation-account.js +60 -0
- package/dist/invocation-account.js.map +1 -0
- package/dist/media-ref-bytes.d.ts +35 -0
- package/dist/media-ref-bytes.d.ts.map +1 -0
- package/dist/media-ref-bytes.js +191 -0
- package/dist/media-ref-bytes.js.map +1 -0
- package/dist/node-executor.d.ts +119 -2
- package/dist/node-executor.d.ts.map +1 -1
- package/dist/permission-gate.d.ts +152 -0
- package/dist/permission-gate.d.ts.map +1 -0
- package/dist/permission-gate.js +87 -0
- package/dist/permission-gate.js.map +1 -0
- package/dist/prefixed-storage-adapter.d.ts +33 -0
- package/dist/prefixed-storage-adapter.d.ts.map +1 -0
- package/dist/prefixed-storage-adapter.js +70 -0
- package/dist/prefixed-storage-adapter.js.map +1 -0
- package/dist/prompt-asset-refs.d.ts +222 -0
- package/dist/prompt-asset-refs.d.ts.map +1 -0
- package/dist/prompt-asset-refs.js +751 -0
- package/dist/prompt-asset-refs.js.map +1 -0
- package/dist/provider-cache.d.ts +3 -0
- package/dist/provider-cache.d.ts.map +1 -0
- package/dist/provider-cache.js +8 -0
- package/dist/provider-cache.js.map +1 -0
- package/dist/providers/aki-provider.d.ts +35 -10
- package/dist/providers/aki-provider.d.ts.map +1 -1
- package/dist/providers/aki-provider.js +90 -77
- package/dist/providers/aki-provider.js.map +1 -1
- package/dist/providers/alibaba-provider.d.ts +39 -0
- package/dist/providers/alibaba-provider.d.ts.map +1 -0
- package/dist/providers/alibaba-provider.js +86 -0
- package/dist/providers/alibaba-provider.js.map +1 -0
- package/dist/providers/anthropic-provider.d.ts +52 -3
- package/dist/providers/anthropic-provider.d.ts.map +1 -1
- package/dist/providers/anthropic-provider.js +1020 -338
- package/dist/providers/anthropic-provider.js.map +1 -1
- package/dist/providers/atlascloud-provider.d.ts +103 -0
- package/dist/providers/atlascloud-provider.d.ts.map +1 -0
- package/dist/providers/atlascloud-provider.js +1031 -0
- package/dist/providers/atlascloud-provider.js.map +1 -0
- package/dist/providers/atlascloud-transport.d.ts +100 -0
- package/dist/providers/atlascloud-transport.d.ts.map +1 -0
- package/dist/providers/atlascloud-transport.js +364 -0
- package/dist/providers/atlascloud-transport.js.map +1 -0
- package/dist/providers/atlascloud-webhook-registry.d.ts +35 -0
- package/dist/providers/atlascloud-webhook-registry.d.ts.map +1 -0
- package/dist/providers/atlascloud-webhook-registry.js +104 -0
- package/dist/providers/atlascloud-webhook-registry.js.map +1 -0
- package/dist/providers/audio-mime.d.ts +11 -0
- package/dist/providers/audio-mime.d.ts.map +1 -0
- package/dist/providers/audio-mime.js +46 -0
- package/dist/providers/audio-mime.js.map +1 -0
- package/dist/providers/base-provider.d.ts +501 -32
- package/dist/providers/base-provider.d.ts.map +1 -1
- package/dist/providers/base-provider.js +1280 -87
- package/dist/providers/base-provider.js.map +1 -1
- package/dist/providers/cassette-provider.d.ts +217 -0
- package/dist/providers/cassette-provider.d.ts.map +1 -0
- package/dist/providers/cassette-provider.js +502 -0
- package/dist/providers/cassette-provider.js.map +1 -0
- package/dist/providers/cerebras-provider.d.ts +6 -12
- package/dist/providers/cerebras-provider.d.ts.map +1 -1
- package/dist/providers/cerebras-provider.js +8 -33
- package/dist/providers/cerebras-provider.js.map +1 -1
- package/dist/providers/claude-agent-provider.d.ts +107 -74
- package/dist/providers/claude-agent-provider.d.ts.map +1 -1
- package/dist/providers/claude-agent-provider.js +1279 -517
- package/dist/providers/claude-agent-provider.js.map +1 -1
- package/dist/providers/codex-provider.d.ts +84 -0
- package/dist/providers/codex-provider.d.ts.map +1 -0
- package/dist/providers/codex-provider.js +505 -0
- package/dist/providers/codex-provider.js.map +1 -0
- package/dist/providers/cohere-provider.d.ts +7 -3
- package/dist/providers/cohere-provider.d.ts.map +1 -1
- package/dist/providers/cohere-provider.js +14 -2
- package/dist/providers/cohere-provider.js.map +1 -1
- package/dist/providers/comfy-cloud-provider.d.ts +30 -0
- package/dist/providers/comfy-cloud-provider.d.ts.map +1 -0
- package/dist/providers/comfy-cloud-provider.js +42 -0
- package/dist/providers/comfy-cloud-provider.js.map +1 -0
- package/dist/providers/content-filter.d.ts +46 -0
- package/dist/providers/content-filter.d.ts.map +1 -0
- package/dist/providers/content-filter.js +92 -0
- package/dist/providers/content-filter.js.map +1 -0
- package/dist/providers/context-exceeded.d.ts +37 -0
- package/dist/providers/context-exceeded.d.ts.map +1 -0
- package/dist/providers/context-exceeded.js +114 -0
- package/dist/providers/context-exceeded.js.map +1 -0
- package/dist/providers/context-window.d.ts +44 -0
- package/dist/providers/context-window.d.ts.map +1 -0
- package/dist/providers/context-window.js +145 -0
- package/dist/providers/context-window.js.map +1 -0
- package/dist/providers/contract/index.d.ts +4 -0
- package/dist/providers/contract/index.d.ts.map +1 -0
- package/dist/providers/contract/index.js +4 -0
- package/dist/providers/contract/index.js.map +1 -0
- package/dist/providers/contract/probe-manifest.d.ts +75 -0
- package/dist/providers/contract/probe-manifest.d.ts.map +1 -0
- package/dist/providers/contract/probe-manifest.js +379 -0
- package/dist/providers/contract/probe-manifest.js.map +1 -0
- package/dist/providers/contract/probe-runner.d.ts +57 -0
- package/dist/providers/contract/probe-runner.d.ts.map +1 -0
- package/dist/providers/contract/probe-runner.js +180 -0
- package/dist/providers/contract/probe-runner.js.map +1 -0
- package/dist/providers/contract/redact.d.ts +29 -0
- package/dist/providers/contract/redact.d.ts.map +1 -0
- package/dist/providers/contract/redact.js +113 -0
- package/dist/providers/contract/redact.js.map +1 -0
- package/dist/providers/core-tools.d.ts +75 -0
- package/dist/providers/core-tools.d.ts.map +1 -0
- package/dist/providers/core-tools.js +128 -0
- package/dist/providers/core-tools.js.map +1 -0
- package/dist/providers/cost-calculator.d.ts +69 -50
- package/dist/providers/cost-calculator.d.ts.map +1 -1
- package/dist/providers/cost-calculator.js +207 -397
- package/dist/providers/cost-calculator.js.map +1 -1
- package/dist/providers/credential-check.d.ts +45 -0
- package/dist/providers/credential-check.d.ts.map +1 -0
- package/dist/providers/credential-check.js +164 -0
- package/dist/providers/credential-check.js.map +1 -0
- package/dist/providers/custom-model-kinds.d.ts +33 -0
- package/dist/providers/custom-model-kinds.d.ts.map +1 -0
- package/dist/providers/custom-model-kinds.js +96 -0
- package/dist/providers/custom-model-kinds.js.map +1 -0
- package/dist/providers/custom-openai-provider.d.ts +83 -0
- package/dist/providers/custom-openai-provider.d.ts.map +1 -0
- package/dist/providers/custom-openai-provider.js +190 -0
- package/dist/providers/custom-openai-provider.js.map +1 -0
- package/dist/providers/custom-provider-registry.d.ts +19 -0
- package/dist/providers/custom-provider-registry.d.ts.map +1 -0
- package/dist/providers/custom-provider-registry.js +52 -0
- package/dist/providers/custom-provider-registry.js.map +1 -0
- package/dist/providers/deepseek-provider.d.ts +8 -14
- package/dist/providers/deepseek-provider.d.ts.map +1 -1
- package/dist/providers/deepseek-provider.js +6 -35
- package/dist/providers/deepseek-provider.js.map +1 -1
- package/dist/providers/defaults.d.ts +12 -0
- package/dist/providers/defaults.d.ts.map +1 -0
- package/dist/providers/defaults.js +12 -0
- package/dist/providers/defaults.js.map +1 -0
- package/dist/providers/dreamina-models.d.ts +5 -0
- package/dist/providers/dreamina-models.d.ts.map +1 -0
- package/dist/providers/dreamina-models.js +57 -0
- package/dist/providers/dreamina-models.js.map +1 -0
- package/dist/providers/dreamina-music.d.ts +52 -0
- package/dist/providers/dreamina-music.d.ts.map +1 -0
- package/dist/providers/dreamina-music.js +115 -0
- package/dist/providers/dreamina-music.js.map +1 -0
- package/dist/providers/dreamina-provider.d.ts +62 -0
- package/dist/providers/dreamina-provider.d.ts.map +1 -0
- package/dist/providers/dreamina-provider.js +790 -0
- package/dist/providers/dreamina-provider.js.map +1 -0
- package/dist/providers/elevenlabs-provider.d.ts +50 -0
- package/dist/providers/elevenlabs-provider.d.ts.map +1 -0
- package/dist/providers/elevenlabs-provider.js +147 -0
- package/dist/providers/elevenlabs-provider.js.map +1 -0
- package/dist/providers/entity-references.d.ts +31 -0
- package/dist/providers/entity-references.d.ts.map +1 -0
- package/dist/providers/entity-references.js +113 -0
- package/dist/providers/entity-references.js.map +1 -0
- package/dist/providers/evolink-provider.d.ts +40 -0
- package/dist/providers/evolink-provider.d.ts.map +1 -0
- package/dist/providers/evolink-provider.js +312 -0
- package/dist/providers/evolink-provider.js.map +1 -0
- package/dist/providers/fake-provider.d.ts +74 -2
- package/dist/providers/fake-provider.d.ts.map +1 -1
- package/dist/providers/fake-provider.js +213 -1
- package/dist/providers/fake-provider.js.map +1 -1
- package/dist/providers/fal-generations.d.ts +106 -0
- package/dist/providers/fal-generations.d.ts.map +1 -0
- package/dist/providers/fal-generations.js +286 -0
- package/dist/providers/fal-generations.js.map +1 -0
- package/dist/providers/fal-provider.d.ts +173 -8
- package/dist/providers/fal-provider.d.ts.map +1 -1
- package/dist/providers/fal-provider.js +1396 -64
- package/dist/providers/fal-provider.js.map +1 -1
- package/dist/providers/fal-queue.d.ts +47 -0
- package/dist/providers/fal-queue.d.ts.map +1 -0
- package/dist/providers/fal-queue.js +231 -0
- package/dist/providers/fal-queue.js.map +1 -0
- package/dist/providers/gemini-provider.d.ts +150 -9
- package/dist/providers/gemini-provider.d.ts.map +1 -1
- package/dist/providers/gemini-provider.js +1515 -316
- package/dist/providers/gemini-provider.js.map +1 -1
- package/dist/providers/gmi-provider.d.ts +21 -0
- package/dist/providers/gmi-provider.d.ts.map +1 -0
- package/dist/providers/gmi-provider.js +34 -0
- package/dist/providers/gmi-provider.js.map +1 -0
- package/dist/providers/gpt-image-size.d.ts +3 -0
- package/dist/providers/gpt-image-size.d.ts.map +1 -0
- package/dist/providers/gpt-image-size.js +37 -0
- package/dist/providers/gpt-image-size.js.map +1 -0
- package/dist/providers/groq-provider.d.ts +9 -12
- package/dist/providers/groq-provider.d.ts.map +1 -1
- package/dist/providers/groq-provider.js +19 -33
- package/dist/providers/groq-provider.js.map +1 -1
- package/dist/providers/groq-request.d.ts +38 -0
- package/dist/providers/groq-request.d.ts.map +1 -0
- package/dist/providers/groq-request.js +138 -0
- package/dist/providers/groq-request.js.map +1 -0
- package/dist/providers/higgsfield-provider.d.ts +31 -0
- package/dist/providers/higgsfield-provider.d.ts.map +1 -0
- package/dist/providers/higgsfield-provider.js +143 -0
- package/dist/providers/higgsfield-provider.js.map +1 -0
- package/dist/providers/higgsfield-transport.d.ts +106 -0
- package/dist/providers/higgsfield-transport.d.ts.map +1 -0
- package/dist/providers/higgsfield-transport.js +182 -0
- package/dist/providers/higgsfield-transport.js.map +1 -0
- package/dist/providers/http-transport.d.ts +74 -0
- package/dist/providers/http-transport.d.ts.map +1 -0
- package/dist/providers/http-transport.js +152 -0
- package/dist/providers/http-transport.js.map +1 -0
- package/dist/providers/huggingface-provider.d.ts +73 -4
- package/dist/providers/huggingface-provider.d.ts.map +1 -1
- package/dist/providers/huggingface-provider.js +240 -34
- package/dist/providers/huggingface-provider.js.map +1 -1
- package/dist/providers/image-mime.d.ts +39 -0
- package/dist/providers/image-mime.d.ts.map +1 -0
- package/dist/providers/image-mime.js +111 -0
- package/dist/providers/image-mime.js.map +1 -0
- package/dist/providers/image-ref.d.ts +21 -0
- package/dist/providers/image-ref.d.ts.map +1 -0
- package/dist/providers/image-ref.js +44 -0
- package/dist/providers/image-ref.js.map +1 -0
- package/dist/providers/index.d.ts +87 -8
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +250 -56
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/jina-provider.d.ts +12 -3
- package/dist/providers/jina-provider.d.ts.map +1 -1
- package/dist/providers/jina-provider.js +21 -7
- package/dist/providers/jina-provider.js.map +1 -1
- package/dist/providers/kie-provider.d.ts +172 -10
- package/dist/providers/kie-provider.d.ts.map +1 -1
- package/dist/providers/kie-provider.js +1190 -228
- package/dist/providers/kie-provider.js.map +1 -1
- package/dist/providers/kie-webhook-registry.d.ts +28 -0
- package/dist/providers/kie-webhook-registry.d.ts.map +1 -0
- package/dist/providers/kie-webhook-registry.js +91 -0
- package/dist/providers/kie-webhook-registry.js.map +1 -0
- package/dist/providers/llama-provider.d.ts +23 -36
- package/dist/providers/llama-provider.d.ts.map +1 -1
- package/dist/providers/llama-provider.js +50 -355
- package/dist/providers/llama-provider.js.map +1 -1
- package/dist/providers/lmstudio-provider.d.ts +4 -7
- package/dist/providers/lmstudio-provider.d.ts.map +1 -1
- package/dist/providers/lmstudio-provider.js +24 -15
- package/dist/providers/lmstudio-provider.js.map +1 -1
- package/dist/providers/loop-tracing.d.ts +17 -0
- package/dist/providers/loop-tracing.d.ts.map +1 -0
- package/dist/providers/loop-tracing.js +132 -0
- package/dist/providers/loop-tracing.js.map +1 -0
- package/dist/providers/manifest-models.d.ts +341 -1
- package/dist/providers/manifest-models.d.ts.map +1 -1
- package/dist/providers/manifest-models.js +1106 -22
- package/dist/providers/manifest-models.js.map +1 -1
- package/dist/providers/media-mime.d.ts +14 -0
- package/dist/providers/media-mime.d.ts.map +1 -0
- package/dist/providers/media-mime.js +35 -0
- package/dist/providers/media-mime.js.map +1 -0
- package/dist/providers/meshy-provider.d.ts +16 -2
- package/dist/providers/meshy-provider.d.ts.map +1 -1
- package/dist/providers/meshy-provider.js +82 -46
- package/dist/providers/meshy-provider.js.map +1 -1
- package/dist/providers/meta-provider.d.ts +22 -0
- package/dist/providers/meta-provider.d.ts.map +1 -0
- package/dist/providers/meta-provider.js +54 -0
- package/dist/providers/meta-provider.js.map +1 -0
- package/dist/providers/minimax-provider.d.ts +27 -18
- package/dist/providers/minimax-provider.d.ts.map +1 -1
- package/dist/providers/minimax-provider.js +222 -72
- package/dist/providers/minimax-provider.js.map +1 -1
- package/dist/providers/mistral-provider.d.ts +8 -12
- package/dist/providers/mistral-provider.d.ts.map +1 -1
- package/dist/providers/mistral-provider.js +15 -34
- package/dist/providers/mistral-provider.js.map +1 -1
- package/dist/providers/moonshot-provider.d.ts +11 -15
- package/dist/providers/moonshot-provider.d.ts.map +1 -1
- package/dist/providers/moonshot-provider.js +33 -23
- package/dist/providers/moonshot-provider.js.map +1 -1
- package/dist/providers/node-llama-cpp-provider.d.ts +99 -0
- package/dist/providers/node-llama-cpp-provider.d.ts.map +1 -0
- package/dist/providers/node-llama-cpp-provider.js +484 -0
- package/dist/providers/node-llama-cpp-provider.js.map +1 -0
- package/dist/providers/nodetool-provider.d.ts +49 -0
- package/dist/providers/nodetool-provider.d.ts.map +1 -0
- package/dist/providers/nodetool-provider.js +222 -0
- package/dist/providers/nodetool-provider.js.map +1 -0
- package/dist/providers/oauth/browser-launcher.d.ts +23 -0
- package/dist/providers/oauth/browser-launcher.d.ts.map +1 -0
- package/dist/providers/oauth/browser-launcher.js +45 -0
- package/dist/providers/oauth/browser-launcher.js.map +1 -0
- package/dist/providers/oauth/claude-code-credentials.d.ts +74 -0
- package/dist/providers/oauth/claude-code-credentials.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-credentials.js +133 -0
- package/dist/providers/oauth/claude-code-credentials.js.map +1 -0
- package/dist/providers/oauth/claude-code-login.d.ts +124 -0
- package/dist/providers/oauth/claude-code-login.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-login.js +230 -0
- package/dist/providers/oauth/claude-code-login.js.map +1 -0
- package/dist/providers/oauth/claude-code-oauth-client.d.ts +111 -0
- package/dist/providers/oauth/claude-code-oauth-client.d.ts.map +1 -0
- package/dist/providers/oauth/claude-code-oauth-client.js +207 -0
- package/dist/providers/oauth/claude-code-oauth-client.js.map +1 -0
- package/dist/providers/oauth/errors.d.ts +54 -0
- package/dist/providers/oauth/errors.d.ts.map +1 -0
- package/dist/providers/oauth/errors.js +79 -0
- package/dist/providers/oauth/errors.js.map +1 -0
- package/dist/providers/oauth/index.d.ts +105 -0
- package/dist/providers/oauth/index.d.ts.map +1 -0
- package/dist/providers/oauth/index.js +167 -0
- package/dist/providers/oauth/index.js.map +1 -0
- package/dist/providers/oauth/jwt-claims.d.ts +23 -0
- package/dist/providers/oauth/jwt-claims.d.ts.map +1 -0
- package/dist/providers/oauth/jwt-claims.js +67 -0
- package/dist/providers/oauth/jwt-claims.js.map +1 -0
- package/dist/providers/oauth/local-callback-server.d.ts +60 -0
- package/dist/providers/oauth/local-callback-server.d.ts.map +1 -0
- package/dist/providers/oauth/local-callback-server.js +148 -0
- package/dist/providers/oauth/local-callback-server.js.map +1 -0
- package/dist/providers/oauth/oauth-client.d.ts +55 -0
- package/dist/providers/oauth/oauth-client.d.ts.map +1 -0
- package/dist/providers/oauth/oauth-client.js +161 -0
- package/dist/providers/oauth/oauth-client.js.map +1 -0
- package/dist/providers/oauth/openai-oauth-provider.d.ts +129 -0
- package/dist/providers/oauth/openai-oauth-provider.d.ts.map +1 -0
- package/dist/providers/oauth/openai-oauth-provider.js +265 -0
- package/dist/providers/oauth/openai-oauth-provider.js.map +1 -0
- package/dist/providers/oauth/pkce-helper.d.ts +43 -0
- package/dist/providers/oauth/pkce-helper.d.ts.map +1 -0
- package/dist/providers/oauth/pkce-helper.js +57 -0
- package/dist/providers/oauth/pkce-helper.js.map +1 -0
- package/dist/providers/oauth/redaction.d.ts +22 -0
- package/dist/providers/oauth/redaction.d.ts.map +1 -0
- package/dist/providers/oauth/redaction.js +59 -0
- package/dist/providers/oauth/redaction.js.map +1 -0
- package/dist/providers/oauth/secure-credential-store.d.ts +67 -0
- package/dist/providers/oauth/secure-credential-store.d.ts.map +1 -0
- package/dist/providers/oauth/secure-credential-store.js +73 -0
- package/dist/providers/oauth/secure-credential-store.js.map +1 -0
- package/dist/providers/oauth/token-store.d.ts +53 -0
- package/dist/providers/oauth/token-store.d.ts.map +1 -0
- package/dist/providers/oauth/token-store.js +78 -0
- package/dist/providers/oauth/token-store.js.map +1 -0
- package/dist/providers/oauth/types.d.ts +64 -0
- package/dist/providers/oauth/types.d.ts.map +1 -0
- package/dist/providers/oauth/types.js +12 -0
- package/dist/providers/oauth/types.js.map +1 -0
- package/dist/providers/object-tracking.d.ts +47 -0
- package/dist/providers/object-tracking.d.ts.map +1 -0
- package/dist/providers/object-tracking.js +46 -0
- package/dist/providers/object-tracking.js.map +1 -0
- package/dist/providers/offline-model-index.d.ts +20 -0
- package/dist/providers/offline-model-index.d.ts.map +1 -0
- package/dist/providers/offline-model-index.js +112 -0
- package/dist/providers/offline-model-index.js.map +1 -0
- package/dist/providers/ollama-provider.d.ts +30 -2
- package/dist/providers/ollama-provider.d.ts.map +1 -1
- package/dist/providers/ollama-provider.js +198 -43
- package/dist/providers/ollama-provider.js.map +1 -1
- package/dist/providers/openai-compat/client.d.ts +57 -0
- package/dist/providers/openai-compat/client.d.ts.map +1 -0
- package/dist/providers/openai-compat/client.js +157 -0
- package/dist/providers/openai-compat/client.js.map +1 -0
- package/dist/providers/openai-compat/decode.d.ts +36 -0
- package/dist/providers/openai-compat/decode.d.ts.map +1 -0
- package/dist/providers/openai-compat/decode.js +55 -0
- package/dist/providers/openai-compat/decode.js.map +1 -0
- package/dist/providers/openai-compat/errors.d.ts +54 -0
- package/dist/providers/openai-compat/errors.d.ts.map +1 -0
- package/dist/providers/openai-compat/errors.js +144 -0
- package/dist/providers/openai-compat/errors.js.map +1 -0
- package/dist/providers/openai-compat/index.d.ts +8 -0
- package/dist/providers/openai-compat/index.d.ts.map +1 -0
- package/dist/providers/openai-compat/index.js +5 -0
- package/dist/providers/openai-compat/index.js.map +1 -0
- package/dist/providers/openai-compat/sse.d.ts +14 -0
- package/dist/providers/openai-compat/sse.d.ts.map +1 -0
- package/dist/providers/openai-compat/sse.js +69 -0
- package/dist/providers/openai-compat/sse.js.map +1 -0
- package/dist/providers/openai-compat/types.d.ts +75 -0
- package/dist/providers/openai-compat/types.d.ts.map +1 -0
- package/dist/providers/openai-compat/types.js +9 -0
- package/dist/providers/openai-compat/types.js.map +1 -0
- package/dist/providers/openai-compat-provider.d.ts +90 -0
- package/dist/providers/openai-compat-provider.d.ts.map +1 -0
- package/dist/providers/openai-compat-provider.js +282 -0
- package/dist/providers/openai-compat-provider.js.map +1 -0
- package/dist/providers/openai-provider.d.ts +98 -27
- package/dist/providers/openai-provider.d.ts.map +1 -1
- package/dist/providers/openai-provider.js +1037 -105
- package/dist/providers/openai-provider.js.map +1 -1
- package/dist/providers/openrouter-provider.d.ts +58 -13
- package/dist/providers/openrouter-provider.d.ts.map +1 -1
- package/dist/providers/openrouter-provider.js +383 -51
- package/dist/providers/openrouter-provider.js.map +1 -1
- package/dist/providers/provider-call-failure.d.ts +39 -0
- package/dist/providers/provider-call-failure.d.ts.map +1 -0
- package/dist/providers/provider-call-failure.js +132 -0
- package/dist/providers/provider-call-failure.js.map +1 -0
- package/dist/providers/provider-error.d.ts +59 -0
- package/dist/providers/provider-error.d.ts.map +1 -0
- package/dist/providers/provider-error.js +171 -0
- package/dist/providers/provider-error.js.map +1 -0
- package/dist/providers/provider-generations.d.ts +99 -0
- package/dist/providers/provider-generations.d.ts.map +1 -0
- package/dist/providers/provider-generations.js +71 -0
- package/dist/providers/provider-generations.js.map +1 -0
- package/dist/providers/provider-queue.d.ts +62 -0
- package/dist/providers/provider-queue.d.ts.map +1 -0
- package/dist/providers/provider-queue.js +28 -0
- package/dist/providers/provider-queue.js.map +1 -0
- package/dist/providers/provider-registry.d.ts +33 -14
- package/dist/providers/provider-registry.d.ts.map +1 -1
- package/dist/providers/provider-registry.js +85 -68
- package/dist/providers/provider-registry.js.map +1 -1
- package/dist/providers/provider-request-log.d.ts +53 -0
- package/dist/providers/provider-request-log.d.ts.map +1 -0
- package/dist/providers/provider-request-log.js +168 -0
- package/dist/providers/provider-request-log.js.map +1 -0
- package/dist/providers/provider-session.d.ts +3 -0
- package/dist/providers/provider-session.d.ts.map +1 -0
- package/dist/providers/provider-session.js +10 -0
- package/dist/providers/provider-session.js.map +1 -0
- package/dist/providers/provider-transport.d.ts +11 -0
- package/dist/providers/provider-transport.d.ts.map +1 -0
- package/dist/providers/provider-transport.js +11 -0
- package/dist/providers/provider-transport.js.map +1 -0
- package/dist/providers/python-provider.d.ts +26 -13
- package/dist/providers/python-provider.d.ts.map +1 -1
- package/dist/providers/python-provider.js +204 -25
- package/dist/providers/python-provider.js.map +1 -1
- package/dist/providers/replicate-provider.d.ts +91 -8
- package/dist/providers/replicate-provider.d.ts.map +1 -1
- package/dist/providers/replicate-provider.js +823 -65
- package/dist/providers/replicate-provider.js.map +1 -1
- package/dist/providers/replicate-retry.d.ts +30 -0
- package/dist/providers/replicate-retry.d.ts.map +1 -0
- package/dist/providers/replicate-retry.js +97 -0
- package/dist/providers/replicate-retry.js.map +1 -0
- package/dist/providers/requesty-provider.d.ts +30 -0
- package/dist/providers/requesty-provider.d.ts.map +1 -0
- package/dist/providers/requesty-provider.js +87 -0
- package/dist/providers/requesty-provider.js.map +1 -0
- package/dist/providers/responses-api.d.ts +27 -0
- package/dist/providers/responses-api.d.ts.map +1 -0
- package/dist/providers/responses-api.js +297 -0
- package/dist/providers/responses-api.js.map +1 -0
- package/dist/providers/reve-provider.d.ts +46 -0
- package/dist/providers/reve-provider.d.ts.map +1 -0
- package/dist/providers/reve-provider.js +165 -0
- package/dist/providers/reve-provider.js.map +1 -0
- package/dist/providers/rodin-provider.d.ts +25 -2
- package/dist/providers/rodin-provider.d.ts.map +1 -1
- package/dist/providers/rodin-provider.js +95 -51
- package/dist/providers/rodin-provider.js.map +1 -1
- package/dist/providers/safe-url.d.ts +70 -0
- package/dist/providers/safe-url.d.ts.map +1 -0
- package/dist/providers/safe-url.js +277 -0
- package/dist/providers/safe-url.js.map +1 -0
- package/dist/providers/scripted-provider.d.ts +9 -0
- package/dist/providers/scripted-provider.d.ts.map +1 -1
- package/dist/providers/scripted-provider.js +86 -10
- package/dist/providers/scripted-provider.js.map +1 -1
- package/dist/providers/structured-output.d.ts +42 -0
- package/dist/providers/structured-output.d.ts.map +1 -0
- package/dist/providers/structured-output.js +83 -0
- package/dist/providers/structured-output.js.map +1 -0
- package/dist/providers/together-operations.d.ts +27 -0
- package/dist/providers/together-operations.d.ts.map +1 -0
- package/dist/providers/together-operations.js +95 -0
- package/dist/providers/together-operations.js.map +1 -0
- package/dist/providers/together-provider.d.ts +18 -18
- package/dist/providers/together-provider.d.ts.map +1 -1
- package/dist/providers/together-provider.js +140 -367
- package/dist/providers/together-provider.js.map +1 -1
- package/dist/providers/topaz-provider.d.ts +45 -0
- package/dist/providers/topaz-provider.d.ts.map +1 -0
- package/dist/providers/topaz-provider.js +244 -0
- package/dist/providers/topaz-provider.js.map +1 -0
- package/dist/providers/types.d.ts +641 -4
- package/dist/providers/types.d.ts.map +1 -1
- package/dist/providers/types.js +81 -1
- package/dist/providers/types.js.map +1 -1
- package/dist/providers/useapi-provider.d.ts +28 -0
- package/dist/providers/useapi-provider.d.ts.map +1 -0
- package/dist/providers/useapi-provider.js +274 -0
- package/dist/providers/useapi-provider.js.map +1 -0
- package/dist/providers/video-duration.d.ts +6 -0
- package/dist/providers/video-duration.d.ts.map +1 -0
- package/dist/providers/video-duration.js +63 -0
- package/dist/providers/video-duration.js.map +1 -0
- package/dist/providers/video-frame-fallback.d.ts +39 -0
- package/dist/providers/video-frame-fallback.d.ts.map +1 -0
- package/dist/providers/video-frame-fallback.js +155 -0
- package/dist/providers/video-frame-fallback.js.map +1 -0
- package/dist/providers/video-frames.d.ts +61 -0
- package/dist/providers/video-frames.d.ts.map +1 -0
- package/dist/providers/video-frames.js +208 -0
- package/dist/providers/video-frames.js.map +1 -0
- package/dist/providers/video-mime.d.ts +14 -0
- package/dist/providers/video-mime.d.ts.map +1 -0
- package/dist/providers/video-mime.js +44 -0
- package/dist/providers/video-mime.js.map +1 -0
- package/dist/providers/video-to-audio.d.ts +34 -0
- package/dist/providers/video-to-audio.d.ts.map +1 -0
- package/dist/providers/video-to-audio.js +62 -0
- package/dist/providers/video-to-audio.js.map +1 -0
- package/dist/providers/vllm-provider.d.ts +20 -8
- package/dist/providers/vllm-provider.d.ts.map +1 -1
- package/dist/providers/vllm-provider.js +44 -23
- package/dist/providers/vllm-provider.js.map +1 -1
- package/dist/providers/voyage-provider.d.ts +12 -3
- package/dist/providers/voyage-provider.d.ts.map +1 -1
- package/dist/providers/voyage-provider.js +21 -7
- package/dist/providers/voyage-provider.js.map +1 -1
- package/dist/providers/xai-provider.d.ts +56 -13
- package/dist/providers/xai-provider.d.ts.map +1 -1
- package/dist/providers/xai-provider.js +307 -22
- package/dist/providers/xai-provider.js.map +1 -1
- package/dist/python-bridge-base.d.ts +358 -0
- package/dist/python-bridge-base.d.ts.map +1 -0
- package/dist/python-bridge-base.js +1557 -0
- package/dist/python-bridge-base.js.map +1 -0
- package/dist/python-bridge-codec.d.ts +28 -0
- package/dist/python-bridge-codec.d.ts.map +1 -0
- package/dist/python-bridge-codec.js +39 -0
- package/dist/python-bridge-codec.js.map +1 -0
- package/dist/python-bridge-factory.d.ts +52 -0
- package/dist/python-bridge-factory.d.ts.map +1 -0
- package/dist/python-bridge-factory.js +69 -0
- package/dist/python-bridge-factory.js.map +1 -0
- package/dist/python-bridge-framing.d.ts +68 -0
- package/dist/python-bridge-framing.d.ts.map +1 -0
- package/dist/python-bridge-framing.js +91 -0
- package/dist/python-bridge-framing.js.map +1 -0
- package/dist/python-bridge-types.d.ts +545 -2
- package/dist/python-bridge-types.d.ts.map +1 -1
- package/dist/python-bridge-types.js +49 -1
- package/dist/python-bridge-types.js.map +1 -1
- package/dist/python-graph-resolver.d.ts +57 -0
- package/dist/python-graph-resolver.d.ts.map +1 -0
- package/dist/python-graph-resolver.js +79 -0
- package/dist/python-graph-resolver.js.map +1 -0
- package/dist/python-node-executor.d.ts +36 -4
- package/dist/python-node-executor.d.ts.map +1 -1
- package/dist/python-node-executor.js +177 -86
- package/dist/python-node-executor.js.map +1 -1
- package/dist/python-stdio-bridge.d.ts +18 -37
- package/dist/python-stdio-bridge.d.ts.map +1 -1
- package/dist/python-stdio-bridge.js +148 -475
- package/dist/python-stdio-bridge.js.map +1 -1
- package/dist/python-websocket-bridge.d.ts +140 -0
- package/dist/python-websocket-bridge.d.ts.map +1 -0
- package/dist/python-websocket-bridge.js +561 -0
- package/dist/python-websocket-bridge.js.map +1 -0
- package/dist/python-worker-stderr.d.ts +4 -0
- package/dist/python-worker-stderr.d.ts.map +1 -0
- package/dist/python-worker-stderr.js +24 -0
- package/dist/python-worker-stderr.js.map +1 -0
- package/dist/recommended-models.d.ts +2 -2
- package/dist/recommended-models.d.ts.map +1 -1
- package/dist/recommended-models.js +44 -4
- package/dist/recommended-models.js.map +1 -1
- package/dist/recoverable-node-error.d.ts +31 -0
- package/dist/recoverable-node-error.d.ts.map +1 -0
- package/dist/recoverable-node-error.js +37 -0
- package/dist/recoverable-node-error.js.map +1 -0
- package/dist/redact-params.d.ts +13 -0
- package/dist/redact-params.d.ts.map +1 -0
- package/dist/redact-params.js +57 -0
- package/dist/redact-params.js.map +1 -0
- package/dist/run-context.d.ts +20 -0
- package/dist/run-context.d.ts.map +1 -0
- package/dist/run-context.js +18 -0
- package/dist/run-context.js.map +1 -0
- package/dist/run-trace-context.d.ts +30 -0
- package/dist/run-trace-context.d.ts.map +1 -0
- package/dist/run-trace-context.js +80 -0
- package/dist/run-trace-context.js.map +1 -0
- package/dist/run-trace-processor.d.ts +65 -0
- package/dist/run-trace-processor.d.ts.map +1 -0
- package/dist/run-trace-processor.js +417 -0
- package/dist/run-trace-processor.js.map +1 -0
- package/dist/run-trace-serialization.d.ts +5 -0
- package/dist/run-trace-serialization.d.ts.map +1 -0
- package/dist/run-trace-serialization.js +113 -0
- package/dist/run-trace-serialization.js.map +1 -0
- package/dist/sandbox-module-catalog.d.ts +43 -0
- package/dist/sandbox-module-catalog.d.ts.map +1 -0
- package/dist/sandbox-module-catalog.js +25 -0
- package/dist/sandbox-module-catalog.js.map +1 -0
- package/dist/storage-workspace.d.ts +62 -0
- package/dist/storage-workspace.d.ts.map +1 -0
- package/dist/storage-workspace.js +441 -0
- package/dist/storage-workspace.js.map +1 -0
- package/dist/swappable-python-bridge.d.ts +83 -0
- package/dist/swappable-python-bridge.d.ts.map +1 -0
- package/dist/swappable-python-bridge.js +246 -0
- package/dist/swappable-python-bridge.js.map +1 -0
- package/dist/telemetry.d.ts +16 -3
- package/dist/telemetry.d.ts.map +1 -1
- package/dist/telemetry.js +76 -20
- package/dist/telemetry.js.map +1 -1
- package/dist/testing.d.ts +81 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +130 -0
- package/dist/testing.js.map +1 -0
- package/dist/token-counter.d.ts +30 -0
- package/dist/token-counter.d.ts.map +1 -0
- package/dist/token-counter.js +156 -0
- package/dist/token-counter.js.map +1 -0
- package/dist/trace-exporters.d.ts +11 -28
- package/dist/trace-exporters.d.ts.map +1 -1
- package/dist/trace-exporters.js +69 -22
- package/dist/trace-exporters.js.map +1 -1
- package/dist/tracing-helpers.d.ts +60 -26
- package/dist/tracing-helpers.d.ts.map +1 -1
- package/dist/tracing-helpers.js +100 -25
- package/dist/tracing-helpers.js.map +1 -1
- package/dist/trim-video-window.d.ts +8 -0
- package/dist/trim-video-window.d.ts.map +1 -0
- package/dist/trim-video-window.js +50 -0
- package/dist/trim-video-window.js.map +1 -0
- package/dist/turn-budget.d.ts +278 -0
- package/dist/turn-budget.d.ts.map +1 -0
- package/dist/turn-budget.js +365 -0
- package/dist/turn-budget.js.map +1 -0
- package/dist/variable-channel.d.ts +48 -0
- package/dist/variable-channel.d.ts.map +1 -0
- package/dist/variable-channel.js +110 -0
- package/dist/variable-channel.js.map +1 -0
- package/dist/workspace.d.ts +119 -0
- package/dist/workspace.d.ts.map +1 -0
- package/dist/workspace.js +112 -0
- package/dist/workspace.js.map +1 -0
- package/package.json +121 -19
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-login.d.ts","sourceRoot":"","sources":["../../../src/providers/oauth/claude-code-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeCodeLogin — orchestration for signing in with a Claude subscription,
|
|
3
|
+
* exactly as the `claude` CLI does it, and persisting the result where the
|
|
4
|
+
* Claude Agent SDK will find it.
|
|
5
|
+
*
|
|
6
|
+
* Two completion paths share one authorization request:
|
|
7
|
+
*
|
|
8
|
+
* - **Loopback** — the browser is redirected to an ephemeral `127.0.0.1`
|
|
9
|
+
* listener this process binds. Works when the browser runs on the same
|
|
10
|
+
* machine as the server (desktop, local dev).
|
|
11
|
+
* - **Manual** — the console shows a `<code>#<state>` string the user pastes
|
|
12
|
+
* back. The only option on a headless or remote host.
|
|
13
|
+
*
|
|
14
|
+
* The two differ only in `redirect_uri`, which must match between the
|
|
15
|
+
* authorization request and the token exchange — hence the two URLs handed back
|
|
16
|
+
* from {@link ClaudeCodeLogin.begin} and the `manual` flag carried through to
|
|
17
|
+
* completion.
|
|
18
|
+
*/
|
|
19
|
+
import { createLogger } from "@nodetool-ai/config";
|
|
20
|
+
import { CLAUDE_CODE_CALLBACK_PATH, CLAUDE_CODE_CALLBACK_PORT, CLAUDE_CODE_OAUTH_MANUAL_REDIRECT_URL } from "@nodetool-ai/protocol";
|
|
21
|
+
import { ClaudeCodeCredentialsStore, isExpired } from "./claude-code-credentials.js";
|
|
22
|
+
import { ClaudeCodeOAuthClient } from "./claude-code-oauth-client.js";
|
|
23
|
+
import { NotAuthenticatedError, OAuthError, StateMismatchError } from "./errors.js";
|
|
24
|
+
import { LocalCallbackServer } from "./local-callback-server.js";
|
|
25
|
+
import { PKCEHelper } from "./pkce-helper.js";
|
|
26
|
+
import { systemClock } from "./types.js";
|
|
27
|
+
/** How long a started login stays completable before the listener is torn down. */
|
|
28
|
+
export const CLAUDE_LOGIN_TIMEOUT_MS = 10 * 60 * 1000;
|
|
29
|
+
export class ClaudeCodeLogin {
|
|
30
|
+
client;
|
|
31
|
+
credentials;
|
|
32
|
+
pkce;
|
|
33
|
+
callbackServerFactory;
|
|
34
|
+
clock;
|
|
35
|
+
logger;
|
|
36
|
+
constructor(deps = {}) {
|
|
37
|
+
this.logger =
|
|
38
|
+
deps.logger ?? createLogger("nodetool.runtime.oauth.claude-login");
|
|
39
|
+
this.client =
|
|
40
|
+
deps.client ?? new ClaudeCodeOAuthClient({ logger: this.logger });
|
|
41
|
+
this.credentials =
|
|
42
|
+
deps.credentials ??
|
|
43
|
+
new ClaudeCodeCredentialsStore({ logger: this.logger });
|
|
44
|
+
this.pkce = deps.pkce ?? new PKCEHelper();
|
|
45
|
+
this.callbackServerFactory =
|
|
46
|
+
deps.callbackServerFactory ??
|
|
47
|
+
(() => new LocalCallbackServer({
|
|
48
|
+
host: "127.0.0.1",
|
|
49
|
+
port: CLAUDE_CODE_CALLBACK_PORT,
|
|
50
|
+
path: CLAUDE_CODE_CALLBACK_PATH,
|
|
51
|
+
logger: this.logger
|
|
52
|
+
}));
|
|
53
|
+
this.clock = deps.clock ?? systemClock;
|
|
54
|
+
}
|
|
55
|
+
/** Where the credentials the SDK reads are stored. */
|
|
56
|
+
get credentialsPath() {
|
|
57
|
+
return this.credentials.path;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Start an authorization request. Binds the loopback listener (unless
|
|
61
|
+
* `manualOnly`) and returns both authorization URLs plus the handles to
|
|
62
|
+
* finish the flow. The caller owns teardown via `cancel()`.
|
|
63
|
+
*/
|
|
64
|
+
async begin(options = {}) {
|
|
65
|
+
const { verifier, challenge } = await this.pkce.createPkcePair();
|
|
66
|
+
const state = await this.pkce.createState();
|
|
67
|
+
const timeoutMs = options.timeoutMs ?? CLAUDE_LOGIN_TIMEOUT_MS;
|
|
68
|
+
let server = null;
|
|
69
|
+
let loopbackRedirectUri = null;
|
|
70
|
+
if (!options.manualOnly) {
|
|
71
|
+
server = this.callbackServerFactory();
|
|
72
|
+
let port;
|
|
73
|
+
try {
|
|
74
|
+
({ port } = await server.listen());
|
|
75
|
+
}
|
|
76
|
+
catch (err) {
|
|
77
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
78
|
+
throw new OAuthError("token_exchange_failed", `Could not bind the loopback listener on port ${CLAUDE_CODE_CALLBACK_PORT} (is a \`claude login\` already waiting?): ${message}`);
|
|
79
|
+
}
|
|
80
|
+
// The listener binds 127.0.0.1, but the registered redirect uses the
|
|
81
|
+
// `localhost` spelling the authorization server expects from the CLI.
|
|
82
|
+
loopbackRedirectUri = `http://localhost:${port}${CLAUDE_CODE_CALLBACK_PATH}`;
|
|
83
|
+
}
|
|
84
|
+
const manualAuthUrl = this.client.buildAuthorizationUrl({
|
|
85
|
+
codeChallenge: challenge,
|
|
86
|
+
state,
|
|
87
|
+
redirectUri: CLAUDE_CODE_OAUTH_MANUAL_REDIRECT_URL,
|
|
88
|
+
loginMethod: options.loginMethod
|
|
89
|
+
});
|
|
90
|
+
const authUrl = loopbackRedirectUri
|
|
91
|
+
? this.client.buildAuthorizationUrl({
|
|
92
|
+
codeChallenge: challenge,
|
|
93
|
+
state,
|
|
94
|
+
redirectUri: loopbackRedirectUri,
|
|
95
|
+
loginMethod: options.loginMethod
|
|
96
|
+
})
|
|
97
|
+
: null;
|
|
98
|
+
const cancel = async () => {
|
|
99
|
+
const current = server;
|
|
100
|
+
server = null;
|
|
101
|
+
await current?.close().catch(() => { });
|
|
102
|
+
};
|
|
103
|
+
return {
|
|
104
|
+
authUrl,
|
|
105
|
+
redirectUri: loopbackRedirectUri,
|
|
106
|
+
manualAuthUrl,
|
|
107
|
+
state,
|
|
108
|
+
waitForRedirect: async (signal) => {
|
|
109
|
+
if (!server || !loopbackRedirectUri) {
|
|
110
|
+
throw new OAuthError("callback_timeout", "This login was started without a loopback listener; paste the code instead");
|
|
111
|
+
}
|
|
112
|
+
try {
|
|
113
|
+
const result = await server.waitForCode({
|
|
114
|
+
expectedState: state,
|
|
115
|
+
timeoutMs,
|
|
116
|
+
signal
|
|
117
|
+
});
|
|
118
|
+
return await this.exchangeAndStore({
|
|
119
|
+
code: result.code,
|
|
120
|
+
state,
|
|
121
|
+
codeVerifier: verifier,
|
|
122
|
+
redirectUri: loopbackRedirectUri,
|
|
123
|
+
signal
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
finally {
|
|
127
|
+
await cancel();
|
|
128
|
+
}
|
|
129
|
+
},
|
|
130
|
+
completeWithPastedCode: async (input) => {
|
|
131
|
+
const parsed = parsePastedCode(input, state);
|
|
132
|
+
try {
|
|
133
|
+
return await this.exchangeAndStore({
|
|
134
|
+
code: parsed.code,
|
|
135
|
+
state: parsed.state,
|
|
136
|
+
codeVerifier: verifier,
|
|
137
|
+
redirectUri: CLAUDE_CODE_OAUTH_MANUAL_REDIRECT_URL
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
finally {
|
|
141
|
+
await cancel();
|
|
142
|
+
}
|
|
143
|
+
},
|
|
144
|
+
cancel
|
|
145
|
+
};
|
|
146
|
+
}
|
|
147
|
+
/** Non-secret summary of the stored login. */
|
|
148
|
+
async status() {
|
|
149
|
+
const stored = await this.credentials.read();
|
|
150
|
+
if (!stored) {
|
|
151
|
+
return {
|
|
152
|
+
connected: false,
|
|
153
|
+
expiresAt: null,
|
|
154
|
+
expired: false,
|
|
155
|
+
scopes: [],
|
|
156
|
+
subscriptionType: null,
|
|
157
|
+
rateLimitTier: null,
|
|
158
|
+
credentialsPath: this.credentials.path
|
|
159
|
+
};
|
|
160
|
+
}
|
|
161
|
+
return {
|
|
162
|
+
connected: true,
|
|
163
|
+
expiresAt: stored.expiresAt,
|
|
164
|
+
expired: isExpired(stored, this.clock.now()),
|
|
165
|
+
scopes: stored.scopes ?? [],
|
|
166
|
+
subscriptionType: stored.subscriptionType ?? null,
|
|
167
|
+
rateLimitTier: stored.rateLimitTier ?? null,
|
|
168
|
+
credentialsPath: this.credentials.path
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Refresh the stored access token. Returns the credentials unchanged when
|
|
173
|
+
* they are still valid, unless `force` is set.
|
|
174
|
+
*
|
|
175
|
+
* The `claude` CLI refreshes on its own, so this is for callers that need a
|
|
176
|
+
* usable token *outside* the SDK (status display, `CLAUDE_CODE_OAUTH_TOKEN`)
|
|
177
|
+
* rather than a prerequisite for running the provider.
|
|
178
|
+
*/
|
|
179
|
+
async refresh(options = {}) {
|
|
180
|
+
const stored = await this.credentials.read();
|
|
181
|
+
if (!stored)
|
|
182
|
+
throw new NotAuthenticatedError("No stored Claude credentials");
|
|
183
|
+
if (!options.force && !isExpired(stored, this.clock.now()))
|
|
184
|
+
return stored;
|
|
185
|
+
if (!stored.refreshToken) {
|
|
186
|
+
throw new NotAuthenticatedError("Stored Claude credentials have no refresh token; sign in again");
|
|
187
|
+
}
|
|
188
|
+
const tokens = await this.client.refreshAccessToken(stored.refreshToken, options.signal);
|
|
189
|
+
return this.credentials.save({ tokens });
|
|
190
|
+
}
|
|
191
|
+
/** Remove the stored login. Returns false when there was nothing to remove. */
|
|
192
|
+
async logout() {
|
|
193
|
+
return this.credentials.clear();
|
|
194
|
+
}
|
|
195
|
+
async exchangeAndStore(params) {
|
|
196
|
+
const tokens = await this.client.exchangeAuthorizationCode(params);
|
|
197
|
+
const profile = await this.client.fetchProfile(tokens.accessToken, params.signal);
|
|
198
|
+
const saved = await this.credentials.save({
|
|
199
|
+
tokens,
|
|
200
|
+
subscriptionType: profile?.subscriptionType ?? null,
|
|
201
|
+
rateLimitTier: profile?.rateLimitTier ?? null
|
|
202
|
+
});
|
|
203
|
+
this.logger.info("Claude Code login completed", {
|
|
204
|
+
subscriptionType: saved.subscriptionType,
|
|
205
|
+
scopes: saved.scopes,
|
|
206
|
+
credentialsPath: this.credentials.path
|
|
207
|
+
});
|
|
208
|
+
return saved;
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* Parse what the console shows after a manual authorization: `<code>#<state>`.
|
|
213
|
+
* A bare code is accepted too, falling back to the state of the login it is
|
|
214
|
+
* completing — but a mismatched state is a CSRF signal and always rejected.
|
|
215
|
+
*/
|
|
216
|
+
export function parsePastedCode(input, expectedState) {
|
|
217
|
+
const trimmed = input.trim();
|
|
218
|
+
if (!trimmed) {
|
|
219
|
+
throw new OAuthError("authorization_denied", "No authorization code provided");
|
|
220
|
+
}
|
|
221
|
+
const [code, state] = trimmed.split("#", 2);
|
|
222
|
+
if (!code) {
|
|
223
|
+
throw new OAuthError("authorization_denied", "No authorization code provided");
|
|
224
|
+
}
|
|
225
|
+
if (state !== undefined && state !== expectedState) {
|
|
226
|
+
throw new StateMismatchError();
|
|
227
|
+
}
|
|
228
|
+
return { code, state: expectedState };
|
|
229
|
+
}
|
|
230
|
+
//# sourceMappingURL=claude-code-login.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-login.js","sourceRoot":"","sources":["../../../src/providers/oauth/claude-code-login.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeCodeOAuthClient — the protocol layer for the Claude Code login.
|
|
3
|
+
*
|
|
4
|
+
* Anthropic's OAuth server does not follow RFC 6749's form-encoded token
|
|
5
|
+
* endpoint: the `claude` CLI posts a JSON body and echoes the CSRF `state` back
|
|
6
|
+
* in the code exchange, and the authorization URL carries an extra `code=true`
|
|
7
|
+
* flag. Those three deviations are why this is a sibling of {@link OAuthClient}
|
|
8
|
+
* rather than a configuration of it; everything else (typed errors, redaction,
|
|
9
|
+
* injected fetch/clock, never logging token material) is shared.
|
|
10
|
+
*/
|
|
11
|
+
import { type Logger } from "@nodetool-ai/config";
|
|
12
|
+
import { type Clock } from "./types.js";
|
|
13
|
+
/** Minimal `fetch` surface this client needs — satisfied by global `fetch`. */
|
|
14
|
+
export type JsonFetchLike = (input: string, init: {
|
|
15
|
+
method: string;
|
|
16
|
+
headers: Record<string, string>;
|
|
17
|
+
body?: string;
|
|
18
|
+
signal?: AbortSignal;
|
|
19
|
+
}) => Promise<{
|
|
20
|
+
ok: boolean;
|
|
21
|
+
status: number;
|
|
22
|
+
/** Decode the body as the caller's named response type. */
|
|
23
|
+
json<TBody>(): Promise<TBody>;
|
|
24
|
+
}>;
|
|
25
|
+
/** Which sign-in page the authorization URL points at. */
|
|
26
|
+
export type ClaudeCodeLoginMethod = "claude-ai" | "console";
|
|
27
|
+
/**
|
|
28
|
+
* A Claude Code token set. Shaped like the credential file's `claudeAiOauth`
|
|
29
|
+
* entry rather than {@link OAuthTokens}, because that file — not an in-memory
|
|
30
|
+
* session — is the thing this flow exists to produce.
|
|
31
|
+
*/
|
|
32
|
+
export interface ClaudeCodeTokens {
|
|
33
|
+
readonly accessToken: string;
|
|
34
|
+
readonly refreshToken: string | null;
|
|
35
|
+
/** Absolute expiry in epoch ms, or null when the server sends no expiry. */
|
|
36
|
+
readonly expiresAt: number | null;
|
|
37
|
+
readonly scopes: readonly string[];
|
|
38
|
+
/** Account/organization identity echoed by the token endpoint, if any. */
|
|
39
|
+
readonly account: ClaudeCodeTokenAccount | null;
|
|
40
|
+
}
|
|
41
|
+
export interface ClaudeCodeTokenAccount {
|
|
42
|
+
readonly uuid: string | null;
|
|
43
|
+
readonly emailAddress: string | null;
|
|
44
|
+
readonly organizationUuid: string | null;
|
|
45
|
+
}
|
|
46
|
+
/** Non-secret account metadata used to label the connection in the UI. */
|
|
47
|
+
export interface ClaudeCodeProfile {
|
|
48
|
+
/** "max" | "pro" | "team" | "enterprise", or null for API-billed orgs. */
|
|
49
|
+
readonly subscriptionType: string | null;
|
|
50
|
+
readonly rateLimitTier: string | null;
|
|
51
|
+
readonly emailAddress: string | null;
|
|
52
|
+
readonly displayName: string | null;
|
|
53
|
+
readonly organizationName: string | null;
|
|
54
|
+
}
|
|
55
|
+
export interface AuthorizationUrlOptions {
|
|
56
|
+
readonly codeChallenge: string;
|
|
57
|
+
readonly state: string;
|
|
58
|
+
/**
|
|
59
|
+
* Loopback redirect the browser is sent back to. Omit for the manual flow,
|
|
60
|
+
* where the console displays a `code#state` string for the user to paste.
|
|
61
|
+
*/
|
|
62
|
+
readonly redirectUri: string;
|
|
63
|
+
/** claude.ai (subscription) or the console (API billing). Default claude.ai. */
|
|
64
|
+
readonly loginMethod?: ClaudeCodeLoginMethod;
|
|
65
|
+
}
|
|
66
|
+
interface ClaudeCodeOAuthClientOptions {
|
|
67
|
+
/** Override the published Claude Code client id. */
|
|
68
|
+
readonly clientId?: string;
|
|
69
|
+
readonly tokenEndpoint?: string;
|
|
70
|
+
readonly profileEndpoint?: string;
|
|
71
|
+
/** Injected fetch. Defaults to the global. */
|
|
72
|
+
readonly fetchFn?: JsonFetchLike;
|
|
73
|
+
readonly clock?: Clock;
|
|
74
|
+
readonly logger?: Logger;
|
|
75
|
+
}
|
|
76
|
+
export declare class ClaudeCodeOAuthClient {
|
|
77
|
+
private readonly clientId;
|
|
78
|
+
private readonly tokenEndpoint;
|
|
79
|
+
private readonly profileEndpoint;
|
|
80
|
+
private readonly fetchFn;
|
|
81
|
+
private readonly clock;
|
|
82
|
+
private readonly logger;
|
|
83
|
+
constructor(options?: ClaudeCodeOAuthClientOptions);
|
|
84
|
+
/** Build the authorization-endpoint URL the browser should open. */
|
|
85
|
+
buildAuthorizationUrl(options: AuthorizationUrlOptions): string;
|
|
86
|
+
/**
|
|
87
|
+
* Exchange an authorization code for a token set. `redirectUri` must be the
|
|
88
|
+
* exact value used in the authorization request, and `state` is echoed back
|
|
89
|
+
* in the body — Anthropic's token endpoint rejects the exchange without it.
|
|
90
|
+
*/
|
|
91
|
+
exchangeAuthorizationCode(params: {
|
|
92
|
+
code: string;
|
|
93
|
+
state: string;
|
|
94
|
+
codeVerifier: string;
|
|
95
|
+
redirectUri: string;
|
|
96
|
+
signal?: AbortSignal;
|
|
97
|
+
}): Promise<ClaudeCodeTokens>;
|
|
98
|
+
/** Exchange a refresh token for a fresh access token. */
|
|
99
|
+
refreshAccessToken(refreshToken: string, signal?: AbortSignal): Promise<ClaudeCodeTokens>;
|
|
100
|
+
/**
|
|
101
|
+
* Best-effort account lookup for a friendly label. Returns null when the
|
|
102
|
+
* endpoint is unreachable or the token lacks `user:profile` — a missing
|
|
103
|
+
* label must never fail a login.
|
|
104
|
+
*/
|
|
105
|
+
fetchProfile(accessToken: string, signal?: AbortSignal): Promise<ClaudeCodeProfile | null>;
|
|
106
|
+
private tokenRequest;
|
|
107
|
+
private mapErrorResponse;
|
|
108
|
+
private normalizeTokens;
|
|
109
|
+
}
|
|
110
|
+
export {};
|
|
111
|
+
//# sourceMappingURL=claude-code-oauth-client.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-oauth-client.d.ts","sourceRoot":"","sources":["../../../src/providers/oauth/claude-code-oauth-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ClaudeCodeOAuthClient — the protocol layer for the Claude Code login.
|
|
3
|
+
*
|
|
4
|
+
* Anthropic's OAuth server does not follow RFC 6749's form-encoded token
|
|
5
|
+
* endpoint: the `claude` CLI posts a JSON body and echoes the CSRF `state` back
|
|
6
|
+
* in the code exchange, and the authorization URL carries an extra `code=true`
|
|
7
|
+
* flag. Those three deviations are why this is a sibling of {@link OAuthClient}
|
|
8
|
+
* rather than a configuration of it; everything else (typed errors, redaction,
|
|
9
|
+
* injected fetch/clock, never logging token material) is shared.
|
|
10
|
+
*/
|
|
11
|
+
import { createLogger } from "@nodetool-ai/config";
|
|
12
|
+
import { CLAUDE_CODE_OAUTH_AUTHORIZATION_URL, CLAUDE_CODE_OAUTH_CLIENT_ID, CLAUDE_CODE_OAUTH_CONSOLE_AUTHORIZATION_URL, CLAUDE_CODE_OAUTH_PROFILE_URL, CLAUDE_CODE_OAUTH_REFRESH_SCOPES, CLAUDE_CODE_OAUTH_SCOPES, CLAUDE_CODE_OAUTH_TOKEN_URL, isNonEmptyString, isNumber } from "@nodetool-ai/protocol";
|
|
13
|
+
import { CredentialsRevokedError, InvalidRefreshTokenError, OAuthNetworkError, TokenExchangeError } from "./errors.js";
|
|
14
|
+
import { redactObject } from "./redaction.js";
|
|
15
|
+
import { systemClock } from "./types.js";
|
|
16
|
+
const REQUEST_TIMEOUT_MS = 30_000;
|
|
17
|
+
export class ClaudeCodeOAuthClient {
|
|
18
|
+
clientId;
|
|
19
|
+
tokenEndpoint;
|
|
20
|
+
profileEndpoint;
|
|
21
|
+
fetchFn;
|
|
22
|
+
clock;
|
|
23
|
+
logger;
|
|
24
|
+
constructor(options = {}) {
|
|
25
|
+
this.clientId = options.clientId ?? CLAUDE_CODE_OAUTH_CLIENT_ID;
|
|
26
|
+
this.tokenEndpoint = options.tokenEndpoint ?? CLAUDE_CODE_OAUTH_TOKEN_URL;
|
|
27
|
+
this.profileEndpoint =
|
|
28
|
+
options.profileEndpoint ?? CLAUDE_CODE_OAUTH_PROFILE_URL;
|
|
29
|
+
this.fetchFn = options.fetchFn ?? globalThis.fetch;
|
|
30
|
+
this.clock = options.clock ?? systemClock;
|
|
31
|
+
this.logger =
|
|
32
|
+
options.logger ?? createLogger("nodetool.runtime.oauth.claude-code");
|
|
33
|
+
}
|
|
34
|
+
/** Build the authorization-endpoint URL the browser should open. */
|
|
35
|
+
buildAuthorizationUrl(options) {
|
|
36
|
+
const base = options.loginMethod === "console"
|
|
37
|
+
? CLAUDE_CODE_OAUTH_CONSOLE_AUTHORIZATION_URL
|
|
38
|
+
: CLAUDE_CODE_OAUTH_AUTHORIZATION_URL;
|
|
39
|
+
const url = new URL(base);
|
|
40
|
+
const q = url.searchParams;
|
|
41
|
+
// `code=true` asks the server for the paste-able code display in addition
|
|
42
|
+
// to the redirect — the CLI sets it on both variants of the URL.
|
|
43
|
+
q.set("code", "true");
|
|
44
|
+
q.set("client_id", this.clientId);
|
|
45
|
+
q.set("response_type", "code");
|
|
46
|
+
q.set("redirect_uri", options.redirectUri);
|
|
47
|
+
q.set("scope", CLAUDE_CODE_OAUTH_SCOPES.join(" "));
|
|
48
|
+
q.set("code_challenge", options.codeChallenge);
|
|
49
|
+
q.set("code_challenge_method", "S256");
|
|
50
|
+
q.set("state", options.state);
|
|
51
|
+
return url.toString();
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Exchange an authorization code for a token set. `redirectUri` must be the
|
|
55
|
+
* exact value used in the authorization request, and `state` is echoed back
|
|
56
|
+
* in the body — Anthropic's token endpoint rejects the exchange without it.
|
|
57
|
+
*/
|
|
58
|
+
async exchangeAuthorizationCode(params) {
|
|
59
|
+
return this.tokenRequest({
|
|
60
|
+
grant_type: "authorization_code",
|
|
61
|
+
code: params.code,
|
|
62
|
+
redirect_uri: params.redirectUri,
|
|
63
|
+
client_id: this.clientId,
|
|
64
|
+
code_verifier: params.codeVerifier,
|
|
65
|
+
state: params.state
|
|
66
|
+
}, params.signal, "exchange");
|
|
67
|
+
}
|
|
68
|
+
/** Exchange a refresh token for a fresh access token. */
|
|
69
|
+
async refreshAccessToken(refreshToken, signal) {
|
|
70
|
+
const tokens = await this.tokenRequest({
|
|
71
|
+
grant_type: "refresh_token",
|
|
72
|
+
refresh_token: refreshToken,
|
|
73
|
+
client_id: this.clientId,
|
|
74
|
+
scope: CLAUDE_CODE_OAUTH_REFRESH_SCOPES.join(" ")
|
|
75
|
+
}, signal, "refresh");
|
|
76
|
+
// The server may omit `refresh_token` on refresh; the old one stays valid.
|
|
77
|
+
return tokens.refreshToken ? tokens : { ...tokens, refreshToken };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Best-effort account lookup for a friendly label. Returns null when the
|
|
81
|
+
* endpoint is unreachable or the token lacks `user:profile` — a missing
|
|
82
|
+
* label must never fail a login.
|
|
83
|
+
*/
|
|
84
|
+
async fetchProfile(accessToken, signal) {
|
|
85
|
+
try {
|
|
86
|
+
const res = await this.fetchFn(this.profileEndpoint, {
|
|
87
|
+
method: "GET",
|
|
88
|
+
headers: {
|
|
89
|
+
authorization: `Bearer ${accessToken}`,
|
|
90
|
+
accept: "application/json"
|
|
91
|
+
},
|
|
92
|
+
signal: signal ?? AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
93
|
+
});
|
|
94
|
+
if (!res.ok)
|
|
95
|
+
return null;
|
|
96
|
+
const body = await res.json();
|
|
97
|
+
return {
|
|
98
|
+
subscriptionType: subscriptionTypeOf(body.organization?.organization_type),
|
|
99
|
+
rateLimitTier: str(body.organization?.rate_limit_tier),
|
|
100
|
+
emailAddress: str(body.account?.email_address),
|
|
101
|
+
displayName: str(body.account?.display_name),
|
|
102
|
+
organizationName: str(body.organization?.name)
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
catch (err) {
|
|
106
|
+
this.logger.debug("Claude Code profile lookup failed", {
|
|
107
|
+
error: err instanceof Error ? err.message : String(err)
|
|
108
|
+
});
|
|
109
|
+
return null;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
async tokenRequest(body, signal, kind) {
|
|
113
|
+
let res;
|
|
114
|
+
try {
|
|
115
|
+
res = await this.fetchFn(this.tokenEndpoint, {
|
|
116
|
+
method: "POST",
|
|
117
|
+
headers: {
|
|
118
|
+
"content-type": "application/json",
|
|
119
|
+
accept: "application/json"
|
|
120
|
+
},
|
|
121
|
+
body: JSON.stringify(body),
|
|
122
|
+
signal: signal ?? AbortSignal.timeout(REQUEST_TIMEOUT_MS)
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
catch (err) {
|
|
126
|
+
throw new OAuthNetworkError(`Network error during token ${kind}`, {
|
|
127
|
+
cause: err
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
let payload;
|
|
131
|
+
try {
|
|
132
|
+
payload = await res.json();
|
|
133
|
+
}
|
|
134
|
+
catch {
|
|
135
|
+
payload = {};
|
|
136
|
+
}
|
|
137
|
+
if (!res.ok)
|
|
138
|
+
throw this.mapErrorResponse(res.status, payload, kind);
|
|
139
|
+
return this.normalizeTokens(payload, kind);
|
|
140
|
+
}
|
|
141
|
+
mapErrorResponse(status, payload, kind) {
|
|
142
|
+
const code = str(payload.error);
|
|
143
|
+
// Never include the raw body in the message; log a redacted copy instead.
|
|
144
|
+
this.logger.warn("Claude token endpoint returned an error", {
|
|
145
|
+
status,
|
|
146
|
+
kind,
|
|
147
|
+
error: code,
|
|
148
|
+
body: redactObject(payload)
|
|
149
|
+
});
|
|
150
|
+
const message = `Token ${kind} failed: ${code ?? status}`;
|
|
151
|
+
if (code === "invalid_grant" || status === 401) {
|
|
152
|
+
return kind === "refresh"
|
|
153
|
+
? new InvalidRefreshTokenError(message)
|
|
154
|
+
: new TokenExchangeError("Authentication failed: invalid or expired authorization code");
|
|
155
|
+
}
|
|
156
|
+
if (code === "access_denied" || code === "invalid_client") {
|
|
157
|
+
return new CredentialsRevokedError(message);
|
|
158
|
+
}
|
|
159
|
+
if (status >= 500) {
|
|
160
|
+
return new OAuthNetworkError(`Token ${kind} failed: server error ${status}`);
|
|
161
|
+
}
|
|
162
|
+
return new TokenExchangeError(message);
|
|
163
|
+
}
|
|
164
|
+
normalizeTokens(payload, kind) {
|
|
165
|
+
const accessToken = str(payload.access_token);
|
|
166
|
+
if (!accessToken) {
|
|
167
|
+
throw new TokenExchangeError(`Token ${kind} response missing access_token`);
|
|
168
|
+
}
|
|
169
|
+
const expiresIn = isNumber(payload.expires_in) ? payload.expires_in : null;
|
|
170
|
+
const scope = str(payload.scope);
|
|
171
|
+
const accountUuid = str(payload.account?.uuid);
|
|
172
|
+
const email = str(payload.account?.email_address);
|
|
173
|
+
const orgUuid = str(payload.organization?.uuid);
|
|
174
|
+
return {
|
|
175
|
+
accessToken,
|
|
176
|
+
refreshToken: str(payload.refresh_token),
|
|
177
|
+
expiresAt: expiresIn != null ? this.clock.now() + expiresIn * 1000 : null,
|
|
178
|
+
scopes: scope ? scope.split(" ").filter(Boolean) : [],
|
|
179
|
+
account: accountUuid || email || orgUuid
|
|
180
|
+
? {
|
|
181
|
+
uuid: accountUuid,
|
|
182
|
+
emailAddress: email,
|
|
183
|
+
organizationUuid: orgUuid
|
|
184
|
+
}
|
|
185
|
+
: null
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
/** Map the API's organization type onto the plan label the CLI displays. */
|
|
190
|
+
function subscriptionTypeOf(organizationType) {
|
|
191
|
+
switch (organizationType) {
|
|
192
|
+
case "claude_max":
|
|
193
|
+
return "max";
|
|
194
|
+
case "claude_pro":
|
|
195
|
+
return "pro";
|
|
196
|
+
case "claude_team":
|
|
197
|
+
return "team";
|
|
198
|
+
case "claude_enterprise":
|
|
199
|
+
return "enterprise";
|
|
200
|
+
default:
|
|
201
|
+
return null;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
function str(value) {
|
|
205
|
+
return isNonEmptyString(value) ? value : null;
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=claude-code-oauth-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-oauth-client.js","sourceRoot":"","sources":["../../../src/providers/oauth/claude-code-oauth-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Typed error hierarchy for the OAuth subsystem.
|
|
3
|
+
*
|
|
4
|
+
* Every failure mode in the spec maps to a concrete subclass so callers can
|
|
5
|
+
* branch on `instanceof` (or on the stable `code`) rather than string-matching
|
|
6
|
+
* messages. Error messages NEVER contain token material — see `redaction.ts`.
|
|
7
|
+
*/
|
|
8
|
+
export type OAuthErrorCode = "invalid_refresh_token" | "session_expired" | "browser_launch_failed" | "callback_timeout" | "network_error" | "credentials_revoked" | "state_mismatch" | "authorization_denied" | "token_exchange_failed" | "not_authenticated";
|
|
9
|
+
/** Base class for everything thrown by the OAuth subsystem. */
|
|
10
|
+
export declare class OAuthError extends Error {
|
|
11
|
+
readonly code: OAuthErrorCode;
|
|
12
|
+
constructor(code: OAuthErrorCode, message: string, options?: ErrorOptions);
|
|
13
|
+
}
|
|
14
|
+
/** The stored refresh token was rejected by the server (invalid_grant). */
|
|
15
|
+
export declare class InvalidRefreshTokenError extends OAuthError {
|
|
16
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
17
|
+
}
|
|
18
|
+
/** No usable credentials in the store / access token expired with no refresh. */
|
|
19
|
+
export declare class SessionExpiredError extends OAuthError {
|
|
20
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
21
|
+
}
|
|
22
|
+
/** The default browser could not be launched for the authorization request. */
|
|
23
|
+
export declare class BrowserLaunchError extends OAuthError {
|
|
24
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
25
|
+
}
|
|
26
|
+
/** The user did not complete the browser flow within the allotted time. */
|
|
27
|
+
export declare class CallbackTimeoutError extends OAuthError {
|
|
28
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
29
|
+
}
|
|
30
|
+
/** A network-level failure (DNS, TLS, connection reset) talking to the server. */
|
|
31
|
+
export declare class OAuthNetworkError extends OAuthError {
|
|
32
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
33
|
+
}
|
|
34
|
+
/** The credentials were revoked server-side (access_denied / revoked grant). */
|
|
35
|
+
export declare class CredentialsRevokedError extends OAuthError {
|
|
36
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
37
|
+
}
|
|
38
|
+
/** CSRF guard: the `state` returned to the callback did not match. */
|
|
39
|
+
export declare class StateMismatchError extends OAuthError {
|
|
40
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
41
|
+
}
|
|
42
|
+
/** The user denied the authorization request in the browser. */
|
|
43
|
+
export declare class AuthorizationDeniedError extends OAuthError {
|
|
44
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
45
|
+
}
|
|
46
|
+
/** The authorization-code → token exchange failed for a non-network reason. */
|
|
47
|
+
export declare class TokenExchangeError extends OAuthError {
|
|
48
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
49
|
+
}
|
|
50
|
+
/** A request requiring authentication was made before login completed. */
|
|
51
|
+
export declare class NotAuthenticatedError extends OAuthError {
|
|
52
|
+
constructor(message?: string, options?: ErrorOptions);
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../../../src/providers/oauth/errors.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,cAAc,GACtB,uBAAuB,GACvB,iBAAiB,GACjB,uBAAuB,GACvB,kBAAkB,GAClB,eAAe,GACf,qBAAqB,GACrB,gBAAgB,GAChB,sBAAsB,GACtB,uBAAuB,GACvB,mBAAmB,CAAC;AAExB,+DAA+D;AAC/D,qBAAa,UAAW,SAAQ,KAAK;IACnC,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAE9B,YAAY,IAAI,EAAE,cAAc,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAMxE;CACF;AAED,2EAA2E;AAC3E,qBAAa,wBAAyB,SAAQ,UAAU;IACtD,YAAY,OAAO,SAAwC,EAAE,OAAO,CAAC,EAAE,YAAY,EAElF;CACF;AAED,iFAAiF;AACjF,qBAAa,mBAAoB,SAAQ,UAAU;IACjD,YAAY,OAAO,SAAgD,EAAE,OAAO,CAAC,EAAE,YAAY,EAE1F;CACF;AAED,+EAA+E;AAC/E,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,SAAkD,EAAE,OAAO,CAAC,EAAE,YAAY,EAE5F;CACF;AAED,2EAA2E;AAC3E,qBAAa,oBAAqB,SAAQ,UAAU;IAClD,YAAY,OAAO,SAA6C,EAAE,OAAO,CAAC,EAAE,YAAY,EAEvF;CACF;AAED,kFAAkF;AAClF,qBAAa,iBAAkB,SAAQ,UAAU;IAC/C,YAAY,OAAO,SAAuC,EAAE,OAAO,CAAC,EAAE,YAAY,EAEjF;CACF;AAED,gFAAgF;AAChF,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,YAAY,OAAO,SAA6B,EAAE,OAAO,CAAC,EAAE,YAAY,EAEvE;CACF;AAED,sEAAsE;AACtE,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,SAAyC,EAAE,OAAO,CAAC,EAAE,YAAY,EAEnF;CACF;AAED,gEAAgE;AAChE,qBAAa,wBAAyB,SAAQ,UAAU;IACtD,YAAY,OAAO,SAA6B,EAAE,OAAO,CAAC,EAAE,YAAY,EAEvE;CACF;AAED,+EAA+E;AAC/E,qBAAa,kBAAmB,SAAQ,UAAU;IAChD,YAAY,OAAO,SAAqD,EAAE,OAAO,CAAC,EAAE,YAAY,EAE/F;CACF;AAED,0EAA0E;AAC1E,qBAAa,qBAAsB,SAAQ,UAAU;IACnD,YAAY,OAAO,SAA0C,EAAE,OAAO,CAAC,EAAE,YAAY,EAEpF;CACF"}
|