jeopi-ai 16.2.13
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/CHANGELOG.md +4347 -0
- package/README.md +1193 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +73 -0
- package/dist/types/auth-broker/discover.d.ts +35 -0
- package/dist/types/auth-broker/index.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +102 -0
- package/dist/types/auth-broker/server.d.ts +43 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +107 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +411 -0
- package/dist/types/auth-gateway/http.d.ts +39 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +36 -0
- package/dist/types/auth-gateway/types.d.ts +123 -0
- package/dist/types/auth-retry.d.ts +124 -0
- package/dist/types/auth-storage.d.ts +1026 -0
- package/dist/types/dialect/anthropic.d.ts +15 -0
- package/dist/types/dialect/catalog.d.ts +3 -0
- package/dist/types/dialect/coercion.d.ts +23 -0
- package/dist/types/dialect/deepseek.d.ts +14 -0
- package/dist/types/dialect/demotion.d.ts +23 -0
- package/dist/types/dialect/examples.d.ts +2 -0
- package/dist/types/dialect/factory.d.ts +3 -0
- package/dist/types/dialect/fenced-thinking.d.ts +53 -0
- package/dist/types/dialect/gemini.d.ts +17 -0
- package/dist/types/dialect/gemma.d.ts +15 -0
- package/dist/types/dialect/glm.d.ts +9 -0
- package/dist/types/dialect/harmony.d.ts +8 -0
- package/dist/types/dialect/hermes.d.ts +9 -0
- package/dist/types/dialect/history.d.ts +3 -0
- package/dist/types/dialect/index.d.ts +11 -0
- package/dist/types/dialect/inventory.d.ts +12 -0
- package/dist/types/dialect/kimi.d.ts +14 -0
- package/dist/types/dialect/minimax.d.ts +3 -0
- package/dist/types/dialect/owned-stream.d.ts +4 -0
- package/dist/types/dialect/qwen3.d.ts +9 -0
- package/dist/types/dialect/rendering.d.ts +45 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +69 -0
- package/dist/types/dialect/xml.d.ts +9 -0
- package/dist/types/error/abort.d.ts +14 -0
- package/dist/types/error/auth-classify.d.ts +16 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +23 -0
- package/dist/types/error/classes.d.ts +102 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +79 -0
- package/dist/types/error/format.d.ts +20 -0
- package/dist/types/error/gateway.d.ts +20 -0
- package/dist/types/error/index.d.ts +13 -0
- package/dist/types/error/oauth.d.ts +43 -0
- package/dist/types/error/provider.d.ts +42 -0
- package/dist/types/error/rate-limit.d.ts +59 -0
- package/dist/types/error/retryable.d.ts +27 -0
- package/dist/types/error/validation.d.ts +32 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/__tests__/google-auth.test.d.ts +1 -0
- package/dist/types/providers/__tests__/kimi-code-thinking.test.d.ts +1 -0
- package/dist/types/providers/__tests__/openai-codex-error.test.d.ts +1 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +94 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +497 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +318 -0
- package/dist/types/providers/anthropic.d.ts +248 -0
- package/dist/types/providers/aws-credentials.d.ts +53 -0
- package/dist/types/providers/aws-eventstream.d.ts +39 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +16 -0
- package/dist/types/providers/cursor.d.ts +91 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +32 -0
- package/dist/types/providers/google-gemini-cli.d.ts +118 -0
- package/dist/types/providers/google-interactions.d.ts +65 -0
- package/dist/types/providers/google-shared.d.ts +203 -0
- package/dist/types/providers/google-types.d.ts +155 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +178 -0
- package/dist/types/providers/ollama.d.ts +7 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +695 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +644 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +54 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +108 -0
- package/dist/types/providers/openai-completions.d.ts +45 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +349 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6065 -0
- package/dist/types/providers/openai-responses.d.ts +126 -0
- package/dist/types/providers/openai-shared.d.ts +506 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +69 -0
- package/dist/types/providers/register-builtins.d.ts +32 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +11 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/registry/aimlapi.d.ts +4 -0
- package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
- package/dist/types/registry/amazon-bedrock.d.ts +5 -0
- package/dist/types/registry/anthropic.d.ts +10 -0
- package/dist/types/registry/api-key-login.d.ts +42 -0
- package/dist/types/registry/api-key-validation.d.ts +43 -0
- package/dist/types/registry/azure.d.ts +4 -0
- package/dist/types/registry/cerebras.d.ts +7 -0
- package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
- package/dist/types/registry/coreweave.d.ts +7 -0
- package/dist/types/registry/cursor.d.ts +7 -0
- package/dist/types/registry/deepseek.d.ts +8 -0
- package/dist/types/registry/derived.d.ts +5 -0
- package/dist/types/registry/devin.d.ts +8 -0
- package/dist/types/registry/firepass.d.ts +16 -0
- package/dist/types/registry/fireworks.d.ts +7 -0
- package/dist/types/registry/github-copilot.d.ts +7 -0
- package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
- package/dist/types/registry/gitlab-duo.d.ts +9 -0
- package/dist/types/registry/google-antigravity.d.ts +9 -0
- package/dist/types/registry/google-gemini-cli.d.ts +9 -0
- package/dist/types/registry/google-vertex.d.ts +5 -0
- package/dist/types/registry/google.d.ts +4 -0
- package/dist/types/registry/groq.d.ts +4 -0
- package/dist/types/registry/huggingface.d.ts +7 -0
- package/dist/types/registry/index.d.ts +4 -0
- package/dist/types/registry/kagi.d.ts +14 -0
- package/dist/types/registry/kilo.d.ts +7 -0
- package/dist/types/registry/kimi-code.d.ts +7 -0
- package/dist/types/registry/litellm.d.ts +13 -0
- package/dist/types/registry/llama-cpp.d.ts +8 -0
- package/dist/types/registry/lm-studio.d.ts +8 -0
- package/dist/types/registry/minimax-code-cn.d.ts +6 -0
- package/dist/types/registry/minimax-code.d.ts +6 -0
- package/dist/types/registry/minimax.d.ts +4 -0
- package/dist/types/registry/mistral.d.ts +4 -0
- package/dist/types/registry/moonshot.d.ts +7 -0
- package/dist/types/registry/nanogpt.d.ts +7 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/__tests__/xai-oauth.test.d.ts +1 -0
- package/dist/types/registry/oauth/anthropic.d.ts +23 -0
- package/dist/types/registry/oauth/callback-server.d.ts +72 -0
- package/dist/types/registry/oauth/cursor.d.ts +15 -0
- package/dist/types/registry/oauth/devin.d.ts +5 -0
- package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
- package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
- package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/registry/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +22 -0
- package/dist/types/registry/oauth/index.d.ts +64 -0
- package/dist/types/registry/oauth/kimi.d.ts +21 -0
- package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
- package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
- package/dist/types/registry/oauth/opencode.d.ts +18 -0
- package/dist/types/registry/oauth/perplexity.d.ts +9 -0
- package/dist/types/registry/oauth/pkce.d.ts +8 -0
- package/dist/types/registry/oauth/types.d.ts +56 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +52 -0
- package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
- package/dist/types/registry/ollama-cloud.d.ts +7 -0
- package/dist/types/registry/ollama.d.ts +12 -0
- package/dist/types/registry/openai-codex-device.d.ts +8 -0
- package/dist/types/registry/openai-codex.d.ts +9 -0
- package/dist/types/registry/openai.d.ts +4 -0
- package/dist/types/registry/opencode-go.d.ts +6 -0
- package/dist/types/registry/opencode-zen.d.ts +6 -0
- package/dist/types/registry/openrouter.d.ts +13 -0
- package/dist/types/registry/parallel.d.ts +14 -0
- package/dist/types/registry/perplexity.d.ts +7 -0
- package/dist/types/registry/qianfan.d.ts +7 -0
- package/dist/types/registry/qwen-portal.d.ts +7 -0
- package/dist/types/registry/registry.d.ts +303 -0
- package/dist/types/registry/sakana.d.ts +7 -0
- package/dist/types/registry/synthetic.d.ts +6 -0
- package/dist/types/registry/tavily.d.ts +14 -0
- package/dist/types/registry/together.d.ts +6 -0
- package/dist/types/registry/types.d.ts +51 -0
- package/dist/types/registry/umans.d.ts +7 -0
- package/dist/types/registry/venice.d.ts +13 -0
- package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
- package/dist/types/registry/vllm.d.ts +7 -0
- package/dist/types/registry/wafer-serverless.d.ts +6 -0
- package/dist/types/registry/xai-oauth.d.ts +7 -0
- package/dist/types/registry/xai.d.ts +4 -0
- package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
- package/dist/types/registry/xiaomi.d.ts +6 -0
- package/dist/types/registry/zai.d.ts +7 -0
- package/dist/types/registry/zenmux.d.ts +7 -0
- package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
- package/dist/types/stream.d.ts +44 -0
- package/dist/types/types.d.ts +715 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +15 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/ollama.d.ts +5 -0
- package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
- package/dist/types/usage/openai-codex-reset.d.ts +79 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +346 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/block-symbols.d.ts +20 -0
- package/dist/types/utils/deterministic-id.d.ts +16 -0
- package/dist/types/utils/empty-completion-retry.d.ts +21 -0
- package/dist/types/utils/event-stream.d.ts +30 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/google-validation.d.ts +2 -0
- package/dist/types/utils/harmony-leak.d.ts +118 -0
- package/dist/types/utils/http-inspector.d.ts +30 -0
- package/dist/types/utils/idle-iterator.d.ts +137 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +29 -0
- package/dist/types/utils/openai-http.d.ts +54 -0
- package/dist/types/utils/openrouter-headers.d.ts +1 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/proxy.d.ts +29 -0
- package/dist/types/utils/request-debug.d.ts +29 -0
- package/dist/types/utils/retry-after.d.ts +4 -0
- package/dist/types/utils/retry.d.ts +14 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +54 -0
- package/dist/types/utils/schema/index.d.ts +15 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +124 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +17 -0
- package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/typescript.d.ts +18 -0
- package/dist/types/utils/schema/wire.d.ts +92 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
- package/dist/types/utils/sse-debug.d.ts +5 -0
- package/dist/types/utils/stream-markup-healing.d.ts +87 -0
- package/dist/types/utils/thinking-loop.d.ts +102 -0
- package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +42 -0
- package/dist/types/utils.d.ts +24 -0
- package/package.json +139 -0
- package/src/api-registry.ts +109 -0
- package/src/auth-broker/client.ts +359 -0
- package/src/auth-broker/discover.ts +222 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +657 -0
- package/src/auth-broker/server.ts +646 -0
- package/src/auth-broker/snapshot-cache.ts +191 -0
- package/src/auth-broker/types.ts +130 -0
- package/src/auth-broker/wire-schemas.ts +249 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +802 -0
- package/src/auth-gateway/types.ts +151 -0
- package/src/auth-retry.ts +250 -0
- package/src/auth-storage.ts +5576 -0
- package/src/dialect/anthropic.md +31 -0
- package/src/dialect/anthropic.ts +608 -0
- package/src/dialect/catalog.ts +29 -0
- package/src/dialect/coercion.ts +136 -0
- package/src/dialect/deepseek.md +24 -0
- package/src/dialect/deepseek.ts +609 -0
- package/src/dialect/demotion.ts +36 -0
- package/src/dialect/examples.ts +33 -0
- package/src/dialect/factory.ts +34 -0
- package/src/dialect/fenced-thinking.ts +184 -0
- package/src/dialect/gemini.md +44 -0
- package/src/dialect/gemini.ts +597 -0
- package/src/dialect/gemma.md +33 -0
- package/src/dialect/gemma.ts +387 -0
- package/src/dialect/glm.md +32 -0
- package/src/dialect/glm.ts +456 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +346 -0
- package/src/dialect/hermes.md +25 -0
- package/src/dialect/hermes.ts +206 -0
- package/src/dialect/history.ts +81 -0
- package/src/dialect/index.ts +15 -0
- package/src/dialect/inventory.ts +73 -0
- package/src/dialect/kimi.md +24 -0
- package/src/dialect/kimi.ts +340 -0
- package/src/dialect/minimax.md +31 -0
- package/src/dialect/minimax.ts +95 -0
- package/src/dialect/owned-stream.ts +470 -0
- package/src/dialect/prompt-template.md +12 -0
- package/src/dialect/qwen3.md +28 -0
- package/src/dialect/qwen3.ts +240 -0
- package/src/dialect/rendering.ts +249 -0
- package/src/dialect/thinking.ts +122 -0
- package/src/dialect/types.ts +57 -0
- package/src/dialect/xml.md +22 -0
- package/src/dialect/xml.ts +90 -0
- package/src/error/abort.ts +18 -0
- package/src/error/auth-classify.ts +30 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +31 -0
- package/src/error/classes.ts +186 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +506 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +13 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +62 -0
- package/src/error/rate-limit.ts +161 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +49 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/__tests__/google-auth.test.ts +144 -0
- package/src/providers/__tests__/kimi-code-thinking.test.ts +112 -0
- package/src/providers/__tests__/openai-codex-error.test.ts +84 -0
- package/src/providers/amazon-bedrock.ts +1042 -0
- package/src/providers/anthropic-client.ts +295 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +756 -0
- package/src/providers/anthropic-wire.ts +318 -0
- package/src/providers/anthropic.ts +4078 -0
- package/src/providers/aws-credentials.ts +586 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +382 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2695 -0
- package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
- package/src/providers/devin/proto/buf.gen.yaml +33 -0
- package/src/providers/devin/proto/buf.yaml +17 -0
- package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
- package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
- package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
- package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
- package/src/providers/devin/proto/cel/expr/value.proto +41 -0
- package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
- package/src/providers/devin/proto/errorspb/errors.proto +56 -0
- package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
- package/src/providers/devin/proto/errorspb/markers.proto +10 -0
- package/src/providers/devin/proto/errorspb/tags.proto +12 -0
- package/src/providers/devin/proto/errorspb/testing.proto +6 -0
- package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
- package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
- package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
- package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
- package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
- package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
- package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
- package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
- package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
- package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
- package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
- package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
- package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
- package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
- package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
- package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
- package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
- package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
- package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
- package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
- package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
- package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
- package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
- package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
- package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
- package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
- package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
- package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
- package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
- package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
- package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
- package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
- package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
- package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
- package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
- package/src/providers/devin.ts +577 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +141 -0
- package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
- package/src/providers/gitlab-duo-workflow.ts +3058 -0
- package/src/providers/gitlab-duo.ts +395 -0
- package/src/providers/google-auth.ts +350 -0
- package/src/providers/google-gemini-cli.ts +1362 -0
- package/src/providers/google-interactions.ts +753 -0
- package/src/providers/google-shared.ts +1103 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +183 -0
- package/src/providers/google.ts +87 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +507 -0
- package/src/providers/ollama.ts +773 -0
- package/src/providers/openai-anthropic-shim.ts +152 -0
- package/src/providers/openai-chat-server-schema.ts +242 -0
- package/src/providers/openai-chat-server.ts +715 -0
- package/src/providers/openai-chat-wire.ts +847 -0
- package/src/providers/openai-codex/request-transformer.ts +295 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +3468 -0
- package/src/providers/openai-completions.ts +2173 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-reasoning-suppression.md +1 -0
- package/src/providers/openai-responses-server-schema.ts +282 -0
- package/src/providers/openai-responses-server.ts +1280 -0
- package/src/providers/openai-responses-wire.ts +6391 -0
- package/src/providers/openai-responses.ts +1022 -0
- package/src/providers/openai-shared.ts +2648 -0
- package/src/providers/pi-native-client.ts +266 -0
- package/src/providers/pi-native-server.ts +242 -0
- package/src/providers/register-builtins.ts +475 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +787 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +95 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +112 -0
- package/src/registry/api-key-validation.ts +161 -0
- package/src/registry/azure.ts +6 -0
- package/src/registry/cerebras.ts +23 -0
- package/src/registry/cloudflare-ai-gateway.ts +45 -0
- package/src/registry/coreweave.ts +40 -0
- package/src/registry/cursor.ts +20 -0
- package/src/registry/deepseek.ts +46 -0
- package/src/registry/derived.ts +9 -0
- package/src/registry/devin.ts +15 -0
- package/src/registry/firepass.ts +32 -0
- package/src/registry/fireworks.ts +28 -0
- package/src/registry/github-copilot.ts +22 -0
- package/src/registry/gitlab-duo-workflow.ts +20 -0
- package/src/registry/gitlab-duo.ts +19 -0
- package/src/registry/google-antigravity.ts +22 -0
- package/src/registry/google-gemini-cli.ts +22 -0
- package/src/registry/google-vertex.ts +38 -0
- package/src/registry/google.ts +6 -0
- package/src/registry/groq.ts +6 -0
- package/src/registry/huggingface.ts +29 -0
- package/src/registry/index.ts +4 -0
- package/src/registry/kagi.ts +46 -0
- package/src/registry/kilo.ts +114 -0
- package/src/registry/kimi-code.ts +17 -0
- package/src/registry/litellm.ts +45 -0
- package/src/registry/llama-cpp.ts +35 -0
- package/src/registry/lm-studio.ts +31 -0
- package/src/registry/minimax-code-cn.ts +12 -0
- package/src/registry/minimax-code.ts +12 -0
- package/src/registry/minimax.ts +6 -0
- package/src/registry/mistral.ts +6 -0
- package/src/registry/moonshot.ts +22 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/__tests__/xai-oauth.test.ts +104 -0
- package/src/registry/oauth/anthropic.ts +311 -0
- package/src/registry/oauth/callback-server.ts +315 -0
- package/src/registry/oauth/cursor.ts +171 -0
- package/src/registry/oauth/devin.ts +124 -0
- package/src/registry/oauth/github-copilot.ts +369 -0
- package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
- package/src/registry/oauth/gitlab-duo.ts +222 -0
- package/src/registry/oauth/google-antigravity.ts +209 -0
- package/src/registry/oauth/google-gemini-cli.ts +273 -0
- package/src/registry/oauth/google-oauth-shared.ts +125 -0
- package/src/registry/oauth/index.ts +269 -0
- package/src/registry/oauth/kimi.ts +289 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +311 -0
- package/src/registry/oauth/openai-codex.ts +364 -0
- package/src/registry/oauth/opencode.ts +50 -0
- package/src/registry/oauth/perplexity.ts +228 -0
- package/src/registry/oauth/pkce.ts +18 -0
- package/src/registry/oauth/types.ts +65 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +394 -0
- package/src/registry/oauth/xiaomi.ts +211 -0
- package/src/registry/ollama-cloud.ts +36 -0
- package/src/registry/ollama.ts +43 -0
- package/src/registry/openai-codex-device.ts +18 -0
- package/src/registry/openai-codex.ts +19 -0
- package/src/registry/openai.ts +6 -0
- package/src/registry/opencode-go.ts +12 -0
- package/src/registry/opencode-zen.ts +12 -0
- package/src/registry/openrouter.ts +28 -0
- package/src/registry/parallel.ts +45 -0
- package/src/registry/perplexity.ts +13 -0
- package/src/registry/qianfan.ts +27 -0
- package/src/registry/qwen-portal.ts +50 -0
- package/src/registry/registry.ts +161 -0
- package/src/registry/sakana.ts +22 -0
- package/src/registry/synthetic.ts +21 -0
- package/src/registry/tavily.ts +45 -0
- package/src/registry/together.ts +22 -0
- package/src/registry/types.ts +56 -0
- package/src/registry/umans.ts +23 -0
- package/src/registry/venice.ts +33 -0
- package/src/registry/vercel-ai-gateway.ts +38 -0
- package/src/registry/vllm.ts +34 -0
- package/src/registry/wafer-serverless.ts +12 -0
- package/src/registry/xai-oauth.ts +17 -0
- package/src/registry/xai.ts +6 -0
- package/src/registry/xiaomi-token-plan-ams.ts +12 -0
- package/src/registry/xiaomi-token-plan-cn.ts +12 -0
- package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
- package/src/registry/xiaomi.ts +12 -0
- package/src/registry/zai.ts +27 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1778 -0
- package/src/types.ts +856 -0
- package/src/usage/claude.ts +485 -0
- package/src/usage/gemini.ts +258 -0
- package/src/usage/github-copilot.ts +424 -0
- package/src/usage/google-antigravity.ts +497 -0
- package/src/usage/kimi.ts +271 -0
- package/src/usage/minimax-code.ts +30 -0
- package/src/usage/ollama.ts +41 -0
- package/src/usage/openai-codex-base-url.ts +35 -0
- package/src/usage/openai-codex-reset.ts +174 -0
- package/src/usage/openai-codex.ts +535 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +321 -0
- package/src/usage.ts +333 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/block-symbols.ts +32 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +159 -0
- package/src/utils/event-stream.ts +171 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +456 -0
- package/src/utils/http-inspector.ts +168 -0
- package/src/utils/idle-iterator.ts +473 -0
- package/src/utils/leaked-thinking-stream.ts +294 -0
- package/src/utils/openai-http.ts +122 -0
- package/src/utils/openrouter-headers.ts +12 -0
- package/src/utils/parse-bind.ts +56 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/proxy.ts +240 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +59 -0
- package/src/utils/schema/CONSTRAINTS.md +166 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +207 -0
- package/src/utils/schema/index.ts +15 -0
- package/src/utils/schema/json-schema-validator.ts +595 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1901 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +109 -0
- package/src/utils/schema/strict-tool-validation.ts +117 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/typescript.ts +198 -0
- package/src/utils/schema/wire.ts +789 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +18 -0
- package/src/utils/stream-markup-healing.ts +247 -0
- package/src/utils/thinking-loop.ts +552 -0
- package/src/utils/tool-call-loop-guard.ts +107 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1507 -0
- package/src/utils.ts +171 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import type { Effort } from "jeopi-catalog/effort";
|
|
2
|
+
import type {
|
|
3
|
+
AssistantMessage,
|
|
4
|
+
AssistantMessageEventStream,
|
|
5
|
+
CacheRetention,
|
|
6
|
+
Context,
|
|
7
|
+
ServiceTier,
|
|
8
|
+
TokenTaskBudget,
|
|
9
|
+
} from "../types";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Wire types for the omp auth-gateway.
|
|
13
|
+
*
|
|
14
|
+
* The gateway sits between unauthenticated clients (containerized omp,
|
|
15
|
+
* llm-git, …) and the broker. It accepts provider-format HTTP requests
|
|
16
|
+
* (OpenAI chat-completions / Anthropic messages / OpenAI Responses),
|
|
17
|
+
* dispatches them through pi-ai's `streamSimple()`, and translates the
|
|
18
|
+
* canonical event stream back to the matching wire format. The gateway
|
|
19
|
+
* injects `Authorization` server-side so clients never see access tokens.
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
/** Default bind. Loopback-only — front with reverse proxy for remote access. */
|
|
23
|
+
export const DEFAULT_AUTH_GATEWAY_BIND = "127.0.0.1:4000";
|
|
24
|
+
|
|
25
|
+
export type AuthGatewayToolChoice = "auto" | "none" | "required" | { name: string };
|
|
26
|
+
|
|
27
|
+
export interface AuthGatewayParsedRequestOptions {
|
|
28
|
+
// ── Sampling ──────────────────────────────────────────────────────────
|
|
29
|
+
maxOutputTokens?: number;
|
|
30
|
+
temperature?: number;
|
|
31
|
+
topP?: number;
|
|
32
|
+
topK?: number;
|
|
33
|
+
/** OpenAI nucleus-min sampling (`min_p`). */
|
|
34
|
+
minP?: number;
|
|
35
|
+
/** Anthropic `stop_sequences` / OpenAI `stop`. */
|
|
36
|
+
stopSequences?: string[];
|
|
37
|
+
/** OpenAI `presence_penalty`. */
|
|
38
|
+
presencePenalty?: number;
|
|
39
|
+
/** OpenAI `frequency_penalty`. */
|
|
40
|
+
frequencyPenalty?: number;
|
|
41
|
+
/** OpenRouter / vLLM `repetition_penalty`. */
|
|
42
|
+
repetitionPenalty?: number;
|
|
43
|
+
/** OpenAI deterministic-sampling `seed`. */
|
|
44
|
+
seed?: number;
|
|
45
|
+
/** OpenAI `logit_bias` map (token id → bias). */
|
|
46
|
+
logitBias?: Record<string, number>;
|
|
47
|
+
/** OpenAI `response_format` (text | json_object | json_schema). Opaque passthrough. */
|
|
48
|
+
responseFormat?: unknown;
|
|
49
|
+
|
|
50
|
+
// ── Tools ─────────────────────────────────────────────────────────────
|
|
51
|
+
toolChoice?: AuthGatewayToolChoice;
|
|
52
|
+
/** OpenAI `parallel_tool_calls`. */
|
|
53
|
+
parallelToolCalls?: boolean;
|
|
54
|
+
|
|
55
|
+
// ── Reasoning ─────────────────────────────────────────────────────────
|
|
56
|
+
/** Effort-level reasoning request (OpenAI Responses / Chat `reasoning_effort`). */
|
|
57
|
+
reasoning?: Effort;
|
|
58
|
+
/** Force-disable reasoning (Anthropic `thinking: { type: "disabled" }`). */
|
|
59
|
+
disableReasoning?: boolean;
|
|
60
|
+
/**
|
|
61
|
+
* Explicit Anthropic `thinking.budget_tokens`. Mirrors Rust's
|
|
62
|
+
* `resolve_thinking_budget`: pins onto whichever effort the client
|
|
63
|
+
* requested (defaulting to High when unspecified). Preferred over the
|
|
64
|
+
* removed legacy single-number `thinkingBudget` for new code.
|
|
65
|
+
*/
|
|
66
|
+
explicitThinkingBudgetTokens?: number;
|
|
67
|
+
/** Per-effort thinking budget map. */
|
|
68
|
+
thinkingBudgets?: Partial<Record<Effort, number>>;
|
|
69
|
+
/** Suppress the provider's reasoning summary stream. */
|
|
70
|
+
hideThinkingSummary?: boolean;
|
|
71
|
+
/** Anthropic `output_config.task_budget` advisory loop budget. */
|
|
72
|
+
taskBudget?: TokenTaskBudget;
|
|
73
|
+
|
|
74
|
+
// ── Service / routing ─────────────────────────────────────────────────
|
|
75
|
+
/** OpenAI service tier (auto|default|flex|scale|priority). */
|
|
76
|
+
serviceTier?: ServiceTier;
|
|
77
|
+
/** Cache retention hint derived from inbound `cache_control` markers. */
|
|
78
|
+
cacheRetention?: CacheRetention;
|
|
79
|
+
/** OpenAI Responses `prompt_cache_key`; also seeds provider routing when no separate session id exists. */
|
|
80
|
+
promptCacheKey?: string;
|
|
81
|
+
/** OpenAI Responses `previous_response_id` for response chaining. */
|
|
82
|
+
previousResponseId?: string;
|
|
83
|
+
/** OpenAI / abuse-tracking `user` field. */
|
|
84
|
+
user?: string;
|
|
85
|
+
|
|
86
|
+
// ── Passthrough ───────────────────────────────────────────────────────
|
|
87
|
+
/**
|
|
88
|
+
* Provider-specific metadata. Anthropic uses `metadata.user_id`; OpenRouter
|
|
89
|
+
* carries routing hints; xAI uses `search_parameters`; OpenAI accepts a
|
|
90
|
+
* free-form bag. The gateway forwards as-is.
|
|
91
|
+
*/
|
|
92
|
+
metadata?: Record<string, unknown>;
|
|
93
|
+
/**
|
|
94
|
+
* Captured allow-listed passthrough headers (anthropic-beta,
|
|
95
|
+
* anthropic-version, openai-organization, openai-project, openai-beta,
|
|
96
|
+
* x-stainless-*). Keys are lowercased.
|
|
97
|
+
*/
|
|
98
|
+
headers?: Record<string, string>;
|
|
99
|
+
/**
|
|
100
|
+
* Escape hatch for provider-specific request controls that don't yet have a
|
|
101
|
+
* first-class field. Prefer adding a typed field over widening this.
|
|
102
|
+
*/
|
|
103
|
+
extra?: Record<string, unknown>;
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export interface AuthGatewayParsedRequest {
|
|
107
|
+
modelId: string;
|
|
108
|
+
context: Context;
|
|
109
|
+
stream: boolean;
|
|
110
|
+
options: AuthGatewayParsedRequestOptions;
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
export interface AuthGatewayStreamControl {
|
|
114
|
+
/** Gateway request signal. Encoders stop producing frames when it aborts. */
|
|
115
|
+
signal?: AbortSignal;
|
|
116
|
+
/** Called when the HTTP response body is cancelled by the client. */
|
|
117
|
+
onCancel?: (reason?: unknown) => void;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export interface AuthGatewayFormatModule {
|
|
121
|
+
parseRequest(body: unknown, headers?: Headers): AuthGatewayParsedRequest;
|
|
122
|
+
encodeResponse(message: AssistantMessage, requestedModelId: string): Record<string, unknown>;
|
|
123
|
+
encodeStream(
|
|
124
|
+
events: AssistantMessageEventStream,
|
|
125
|
+
requestedModelId: string,
|
|
126
|
+
options?: AuthGatewayParsedRequestOptions,
|
|
127
|
+
control?: AuthGatewayStreamControl,
|
|
128
|
+
): ReadableStream<Uint8Array>;
|
|
129
|
+
/**
|
|
130
|
+
* Emit a protocol-specific error envelope. OpenAI returns
|
|
131
|
+
* `{ error: { message, type } }`; Anthropic returns
|
|
132
|
+
* `{ type: "error", error: { type, message } }`.
|
|
133
|
+
*/
|
|
134
|
+
formatError(status: number, type: string, message: string): Response;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
export interface AuthGatewayServerOptions {
|
|
138
|
+
/** Listen address. Default `127.0.0.1:4000`. */
|
|
139
|
+
bind?: string;
|
|
140
|
+
/** Accept any of these bearer tokens. Empty allows unauthenticated calls. */
|
|
141
|
+
bearerTokens: string[];
|
|
142
|
+
/** Version surfaced on `/healthz`. */
|
|
143
|
+
version?: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
export interface AuthGatewayServerHandle {
|
|
147
|
+
url: string;
|
|
148
|
+
port: number;
|
|
149
|
+
hostname: string;
|
|
150
|
+
close(): Promise<void>;
|
|
151
|
+
}
|
|
@@ -0,0 +1,250 @@
|
|
|
1
|
+
import type { OAuthAccess } from "./auth-storage";
|
|
2
|
+
import * as AIError from "./error";
|
|
3
|
+
import { isAuthRetryableError } from "./error/auth-classify";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Context passed to an {@link ApiKeyResolver} on each resolution attempt.
|
|
7
|
+
*
|
|
8
|
+
* The `error`/`lastChance` pair drives the central a/b/c retry policy shared by
|
|
9
|
+
* the streaming ({@link streamSimple}) and non-streaming ({@link withAuth})
|
|
10
|
+
* drivers:
|
|
11
|
+
* - `error === undefined` → **initial resolve** (no force-refresh; cheap, may
|
|
12
|
+
* return a locally-cached not-yet-expired token).
|
|
13
|
+
* - `error !== undefined && !lastChance` → **step (b): refresh the SAME
|
|
14
|
+
* account** (force a token re-mint / await an in-flight broker refresh).
|
|
15
|
+
* - `error !== undefined && lastChance` → **step (c): switch account**
|
|
16
|
+
* (invalidate/usage-limit the current credential and rotate to a sibling).
|
|
17
|
+
*
|
|
18
|
+
* The resolver returns the bearer to send, or `undefined` to stop retrying and
|
|
19
|
+
* surface the last error to the caller.
|
|
20
|
+
*/
|
|
21
|
+
export interface ApiKeyResolveContext {
|
|
22
|
+
/** True on the final retry step — the resolver should rotate to a sibling credential. */
|
|
23
|
+
lastChance: boolean;
|
|
24
|
+
/** The auth error that triggered this re-resolution, or `undefined` on the initial resolve. */
|
|
25
|
+
error: unknown;
|
|
26
|
+
/** Caller cancel signal, threaded into any credential refresh / rotation work. */
|
|
27
|
+
signal?: AbortSignal;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Resolves the API key to send for a request, retried through the a/b/c policy
|
|
32
|
+
* described on {@link ApiKeyResolveContext}.
|
|
33
|
+
*/
|
|
34
|
+
export type ApiKeyResolver = (ctx: ApiKeyResolveContext) => Promise<string | undefined> | string | undefined;
|
|
35
|
+
|
|
36
|
+
/** A static bearer string, or a {@link ApiKeyResolver} that mints/rotates one. */
|
|
37
|
+
export type ApiKey = string | ApiKeyResolver;
|
|
38
|
+
|
|
39
|
+
/** Narrows {@link ApiKey} to its resolver form. */
|
|
40
|
+
export function isApiKeyResolver(key: ApiKey | undefined): key is ApiKeyResolver {
|
|
41
|
+
return typeof key === "function";
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Performs the initial resolve of an {@link ApiKey} (`error: undefined`,
|
|
46
|
+
* `lastChance: false`). Static keys pass through unchanged.
|
|
47
|
+
*/
|
|
48
|
+
export async function resolveApiKeyOnce(key: ApiKey | undefined, signal?: AbortSignal): Promise<string | undefined> {
|
|
49
|
+
if (key === undefined) return undefined;
|
|
50
|
+
if (isApiKeyResolver(key)) return (await key({ lastChance: false, error: undefined, signal })) || undefined;
|
|
51
|
+
return key;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
/**
|
|
55
|
+
* Wraps a resolver with a bearer that was already selected for this request.
|
|
56
|
+
*
|
|
57
|
+
* Callers that preflight credentials can pass the returned resolver to the
|
|
58
|
+
* auth-retry driver without making the driver know about that preflight: the
|
|
59
|
+
* first initial resolution reuses `seed`, and all later resolutions delegate to
|
|
60
|
+
* `resolver`.
|
|
61
|
+
*/
|
|
62
|
+
export function seedApiKeyResolver(seed: string | undefined, resolver: ApiKeyResolver): ApiKeyResolver {
|
|
63
|
+
let seedPending = seed !== undefined;
|
|
64
|
+
return ctx => {
|
|
65
|
+
if (seedPending && ctx.error === undefined) {
|
|
66
|
+
seedPending = false;
|
|
67
|
+
return seed;
|
|
68
|
+
}
|
|
69
|
+
return resolver(ctx);
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Re-exported from the error module (its new home); see error/auth-classify.ts.
|
|
74
|
+
export { isAuthRetryableError };
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* The ordered `lastChance` values for the retry steps after the initial
|
|
78
|
+
* attempt fails: `false` → step (b) refresh-same, `true` → step (c) switch.
|
|
79
|
+
* Shared by {@link withAuth} and the streaming retry driver so both run the
|
|
80
|
+
* same policy.
|
|
81
|
+
*/
|
|
82
|
+
export const AUTH_RETRY_STEPS: readonly boolean[] = [false, true];
|
|
83
|
+
|
|
84
|
+
/** Resolve a single retry step, swallowing resolver failures into `undefined`. */
|
|
85
|
+
export async function resolveRetryKey(
|
|
86
|
+
resolver: ApiKeyResolver,
|
|
87
|
+
lastChance: boolean,
|
|
88
|
+
error: unknown,
|
|
89
|
+
signal?: AbortSignal,
|
|
90
|
+
): Promise<string | undefined> {
|
|
91
|
+
try {
|
|
92
|
+
return (await resolver({ lastChance, error, signal })) || undefined;
|
|
93
|
+
} catch {
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Runs an auth-protected operation through the central a/b/c retry policy.
|
|
100
|
+
*
|
|
101
|
+
* - A static string key (or any non-resolver) → a single `attempt` with no
|
|
102
|
+
* retry (identical to the legacy static-key path).
|
|
103
|
+
* - A resolver → initial `attempt`, then on a retryable auth error up to two
|
|
104
|
+
* more attempts (refresh-same, then switch). A step is skipped when the
|
|
105
|
+
* resolver returns the same key it just tried or `undefined`; non-auth errors
|
|
106
|
+
* propagate immediately.
|
|
107
|
+
*
|
|
108
|
+
* Used by non-streaming consumers (image generation, web search, completion
|
|
109
|
+
* helpers). The streaming driver in `stream.ts` implements the same policy with
|
|
110
|
+
* its replay-safe buffering machinery.
|
|
111
|
+
*/
|
|
112
|
+
export async function withAuth<T>(
|
|
113
|
+
key: ApiKey | undefined,
|
|
114
|
+
attempt: (key: string) => Promise<T>,
|
|
115
|
+
opts?: { isAuthError?: (error: unknown) => boolean; signal?: AbortSignal; missingKeyMessage?: string },
|
|
116
|
+
): Promise<T> {
|
|
117
|
+
const isAuthError = opts?.isAuthError ?? isAuthRetryableError;
|
|
118
|
+
const missingKey = (): Error => new AIError.MissingApiKeyError(undefined, opts?.missingKeyMessage);
|
|
119
|
+
|
|
120
|
+
if (!isApiKeyResolver(key)) {
|
|
121
|
+
if (key === undefined) throw missingKey();
|
|
122
|
+
return attempt(key);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
const resolver = key;
|
|
126
|
+
const signal = opts?.signal;
|
|
127
|
+
let lastKey = await resolveRetryKey(resolver, false, undefined, signal);
|
|
128
|
+
if (lastKey === undefined) throw missingKey();
|
|
129
|
+
|
|
130
|
+
let lastError: unknown;
|
|
131
|
+
try {
|
|
132
|
+
return await attempt(lastKey);
|
|
133
|
+
} catch (error) {
|
|
134
|
+
if (!isAuthError(error)) throw error;
|
|
135
|
+
lastError = error;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
for (let i = 0; i < AUTH_RETRY_STEPS.length; i++) {
|
|
139
|
+
const nextKey = await resolveRetryKey(resolver, AUTH_RETRY_STEPS[i]!, lastError, signal);
|
|
140
|
+
if (nextKey === undefined || nextKey === lastKey) continue;
|
|
141
|
+
lastKey = nextKey;
|
|
142
|
+
try {
|
|
143
|
+
return await attempt(nextKey);
|
|
144
|
+
} catch (error) {
|
|
145
|
+
if (!isAuthError(error)) throw error;
|
|
146
|
+
lastError = error;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
throw lastError;
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
/**
|
|
154
|
+
* Minimal structural slice of `AuthStorage` consumed by {@link withOAuthAccess}.
|
|
155
|
+
* Typed structurally (and importing only the `OAuthAccess` type) so this module
|
|
156
|
+
* never takes a runtime dependency on `./auth-storage`.
|
|
157
|
+
*/
|
|
158
|
+
export interface OAuthAccessSource {
|
|
159
|
+
getOAuthAccess(
|
|
160
|
+
provider: string,
|
|
161
|
+
sessionId?: string,
|
|
162
|
+
options?: { forceRefresh?: boolean; signal?: AbortSignal },
|
|
163
|
+
): Promise<OAuthAccess | undefined>;
|
|
164
|
+
rotateSessionCredential(
|
|
165
|
+
provider: string,
|
|
166
|
+
sessionId: string | undefined,
|
|
167
|
+
options?: { error?: unknown; signal?: AbortSignal },
|
|
168
|
+
): Promise<boolean>;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export interface WithOAuthAccessOptions {
|
|
172
|
+
/** Session id for credential stickiness, threaded into every resolve. */
|
|
173
|
+
sessionId?: string;
|
|
174
|
+
signal?: AbortSignal;
|
|
175
|
+
/** Override the retryable-error classifier (default {@link isAuthRetryableError}). */
|
|
176
|
+
isAuthError?: (error: unknown) => boolean;
|
|
177
|
+
/**
|
|
178
|
+
* Pre-resolved access used for the initial attempt. Callers that already
|
|
179
|
+
* resolved access for an availability gate pass it here so the helper
|
|
180
|
+
* doesn't double-resolve (mirrors the gateway resolver's `initialKey`).
|
|
181
|
+
*/
|
|
182
|
+
seed?: OAuthAccess;
|
|
183
|
+
missingAccessMessage?: string;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* {@link withAuth} for OAuth-access consumers: runs an auth-protected
|
|
188
|
+
* operation through the central a/b/c retry policy, handing the attempt the
|
|
189
|
+
* full {@link OAuthAccess} (bearer + identity metadata: `accountId`,
|
|
190
|
+
* `projectId`, `enterpriseUrl`) instead of bare API-key bytes.
|
|
191
|
+
*
|
|
192
|
+
* - initial → `getOAuthAccess` (or `opts.seed`).
|
|
193
|
+
* - step (b) → `getOAuthAccess` with `forceRefresh: true` (re-mint the SAME
|
|
194
|
+
* account; picks up peer/broker rotations).
|
|
195
|
+
* - step (c) → `rotateSessionCredential` then re-resolve (switch to a sibling).
|
|
196
|
+
*
|
|
197
|
+
* A step is skipped when it yields no access or the same `accessToken` that
|
|
198
|
+
* just failed; non-auth errors propagate immediately. Use this instead of
|
|
199
|
+
* hand-rolled `getOAuthAccess` + fetch flows so 401s and usage-limits rotate
|
|
200
|
+
* credentials instead of failing the call.
|
|
201
|
+
*/
|
|
202
|
+
export async function withOAuthAccess<T>(
|
|
203
|
+
storage: OAuthAccessSource,
|
|
204
|
+
provider: string,
|
|
205
|
+
attempt: (access: OAuthAccess) => Promise<T>,
|
|
206
|
+
opts?: WithOAuthAccessOptions,
|
|
207
|
+
): Promise<T> {
|
|
208
|
+
const isAuthError = opts?.isAuthError ?? isAuthRetryableError;
|
|
209
|
+
const { sessionId, signal } = opts ?? {};
|
|
210
|
+
|
|
211
|
+
let lastAccess = opts?.seed ?? (await storage.getOAuthAccess(provider, sessionId, { signal }));
|
|
212
|
+
if (!lastAccess) {
|
|
213
|
+
throw new AIError.MissingApiKeyError(
|
|
214
|
+
provider,
|
|
215
|
+
opts?.missingAccessMessage ?? `No OAuth credential available for provider: ${provider}`,
|
|
216
|
+
);
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
const resolveStep = async (lastChance: boolean, error: unknown): Promise<OAuthAccess | undefined> => {
|
|
220
|
+
try {
|
|
221
|
+
if (!lastChance) return await storage.getOAuthAccess(provider, sessionId, { forceRefresh: true, signal });
|
|
222
|
+
await storage.rotateSessionCredential(provider, sessionId, { error, signal });
|
|
223
|
+
return await storage.getOAuthAccess(provider, sessionId, { signal });
|
|
224
|
+
} catch {
|
|
225
|
+
return undefined;
|
|
226
|
+
}
|
|
227
|
+
};
|
|
228
|
+
|
|
229
|
+
let lastError: unknown;
|
|
230
|
+
try {
|
|
231
|
+
return await attempt(lastAccess);
|
|
232
|
+
} catch (error) {
|
|
233
|
+
if (!isAuthError(error)) throw error;
|
|
234
|
+
lastError = error;
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
for (const lastChance of AUTH_RETRY_STEPS) {
|
|
238
|
+
const next = await resolveStep(lastChance, lastError);
|
|
239
|
+
if (!next || next.accessToken === lastAccess.accessToken) continue;
|
|
240
|
+
lastAccess = next;
|
|
241
|
+
try {
|
|
242
|
+
return await attempt(next);
|
|
243
|
+
} catch (error) {
|
|
244
|
+
if (!isAuthError(error)) throw error;
|
|
245
|
+
lastError = error;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
throw lastError;
|
|
250
|
+
}
|