@linxiraos/pi-ai 1.0.0
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 +5066 -0
- package/README.md +1195 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth/sqlite-credential-store.d.ts +117 -0
- package/dist/types/auth-broker/client.d.ts +93 -0
- package/dist/types/auth-broker/discover.d.ts +39 -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 +136 -0
- package/dist/types/auth-broker/server.d.ts +48 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +152 -0
- package/dist/types/auth-broker/wire-schema-resource.d.ts +53 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +5 -0
- package/dist/types/auth-gateway/http.d.ts +56 -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 +127 -0
- package/dist/types/auth-retry.d.ts +150 -0
- package/dist/types/auth-storage.d.ts +1258 -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 +30 -0
- package/dist/types/dialect/examples.d.ts +18 -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 +9 -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 +54 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +68 -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 +20 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +27 -0
- package/dist/types/error/classes.d.ts +106 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +94 -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 +14 -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 +80 -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 +51 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +106 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +937 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +345 -0
- package/dist/types/providers/anthropic.d.ts +261 -0
- package/dist/types/providers/aws-credentials.d.ts +48 -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/bedrock-mantle.d.ts +13 -0
- package/dist/types/providers/claude-code-fingerprint.d.ts +19 -0
- package/dist/types/providers/cowork-fetch.d.ts +3 -0
- package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
- package/dist/types/providers/cursor-pi-args.d.ts +105 -0
- package/dist/types/providers/cursor.d.ts +221 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +25 -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 +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +120 -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 +179 -0
- package/dist/types/providers/ollama.d.ts +8 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +35 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +1311 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +669 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +109 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +238 -0
- package/dist/types/providers/openai-completions.d.ts +48 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +1314 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6099 -0
- package/dist/types/providers/openai-responses.d.ts +131 -0
- package/dist/types/providers/openai-shared.d.ts +624 -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 +37 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +32 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/registry/aiand.d.ts +7 -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/alibaba-token-plan.d.ts +18 -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/aws.d.ts +13 -0
- package/dist/types/registry/azure.d.ts +4 -0
- package/dist/types/registry/baseten.d.ts +7 -0
- package/dist/types/registry/bedrock-mantle.d.ts +22 -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/exa.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/gmi-cloud.d.ts +7 -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/meta.d.ts +7 -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/novita.d.ts +6 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/anthropic-constants.d.ts +12 -0
- package/dist/types/registry/oauth/anthropic.d.ts +24 -0
- package/dist/types/registry/oauth/callback-server.d.ts +74 -0
- package/dist/types/registry/oauth/cursor.d.ts +16 -0
- package/dist/types/registry/oauth/device-code.d.ts +25 -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 +22 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +56 -0
- package/dist/types/registry/oauth/index.d.ts +45 -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 +87 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +46 -0
- package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
- package/dist/types/registry/oauth/zai.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 +367 -0
- package/dist/types/registry/sakana.d.ts +7 -0
- package/dist/types/registry/siliconflow-cn.d.ts +7 -0
- package/dist/types/registry/siliconflow.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 +75 -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 +7 -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 +15 -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 +46 -0
- package/dist/types/types.d.ts +1064 -0
- package/dist/types/usage/alibaba-token-plan.d.ts +3 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/cursor.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 +3 -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 +88 -0
- package/dist/types/usage/openai-codex.d.ts +10 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/synthetic.d.ts +2 -0
- package/dist/types/usage/umans.d.ts +2 -0
- package/dist/types/usage/xai-oauth.d.ts +12 -0
- package/dist/types/usage/zai.d.ts +3 -0
- package/dist/types/usage.d.ts +527 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/aws-profile.d.ts +17 -0
- package/dist/types/utils/block-symbols.d.ts +62 -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 +39 -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 +135 -0
- package/dist/types/utils/http-inspector.d.ts +49 -0
- package/dist/types/utils/idle-iterator.d.ts +149 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +33 -0
- package/dist/types/utils/openai-http.d.ts +48 -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 +39 -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 +14 -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 +153 -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 +24 -0
- package/dist/types/utils/schema/wire.d.ts +52 -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 +52 -0
- package/dist/types/utils/validation.d.ts +28 -0
- package/dist/types/utils.d.ts +57 -0
- package/package.json +138 -0
- package/src/api-registry.ts +109 -0
- package/src/auth/sqlite-credential-store.ts +2066 -0
- package/src/auth-broker/client.ts +471 -0
- package/src/auth-broker/discover.ts +310 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +1332 -0
- package/src/auth-broker/server.ts +898 -0
- package/src/auth-broker/snapshot-cache.ts +200 -0
- package/src/auth-broker/types.ts +193 -0
- package/src/auth-broker/wire-schema-resource.ts +487 -0
- package/src/auth-broker/wire-schemas.ts +43 -0
- package/src/auth-gateway/http.ts +227 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +836 -0
- package/src/auth-gateway/types.ts +153 -0
- package/src/auth-retry.ts +401 -0
- package/src/auth-storage.ts +6540 -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 +40 -0
- package/src/dialect/examples.ts +71 -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 +583 -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 +579 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +345 -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 +30 -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 +481 -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 +304 -0
- package/src/dialect/thinking.ts +292 -0
- package/src/dialect/types.ts +56 -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 +47 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +35 -0
- package/src/error/classes.ts +281 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +602 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +14 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +63 -0
- package/src/error/rate-limit.ts +303 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +51 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/amazon-bedrock.ts +1064 -0
- package/src/providers/anthropic-client.ts +317 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +818 -0
- package/src/providers/anthropic-wire.ts +359 -0
- package/src/providers/anthropic.ts +4539 -0
- package/src/providers/aws-credentials.ts +772 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +438 -0
- package/src/providers/bedrock-mantle.ts +110 -0
- package/src/providers/claude-code-fingerprint.ts +20 -0
- package/src/providers/cowork-fetch.ts +201 -0
- package/src/providers/cursor/exec-modern.ts +496 -0
- package/src/providers/cursor/proto/agent.proto +4533 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor-pi-args.ts +165 -0
- package/src/providers/cursor.ts +4689 -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 +679 -0
- package/src/providers/error-message.ts +23 -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 +3135 -0
- package/src/providers/gitlab-duo.ts +399 -0
- package/src/providers/google-auth.ts +330 -0
- package/src/providers/google-gemini-cli.ts +1370 -0
- package/src/providers/google-shared.ts +1122 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +135 -0
- package/src/providers/google.ts +47 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +51 -0
- package/src/providers/mock.ts +514 -0
- package/src/providers/ollama.ts +776 -0
- package/src/providers/openai-anthropic-shim.ts +166 -0
- package/src/providers/openai-chat-server-schema.ts +243 -0
- package/src/providers/openai-chat-server.ts +752 -0
- package/src/providers/openai-chat-wire.ts +859 -0
- package/src/providers/openai-codex/request-transformer.ts +491 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +4716 -0
- package/src/providers/openai-completions.ts +2389 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-server-schema.ts +397 -0
- package/src/providers/openai-responses-server.ts +1466 -0
- package/src/providers/openai-responses-wire.ts +6416 -0
- package/src/providers/openai-responses.ts +1393 -0
- package/src/providers/openai-shared.ts +3500 -0
- package/src/providers/pi-native-client.ts +275 -0
- package/src/providers/pi-native-server.ts +245 -0
- package/src/providers/register-builtins.ts +503 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +1083 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aiand.ts +22 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +104 -0
- package/src/registry/alibaba-token-plan.ts +125 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +115 -0
- package/src/registry/api-key-validation.ts +145 -0
- package/src/registry/aws.ts +57 -0
- package/src/registry/azure.ts +6 -0
- package/src/registry/baseten.ts +22 -0
- package/src/registry/bedrock-mantle.ts +34 -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/exa.ts +19 -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/gmi-cloud.ts +22 -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/meta.ts +22 -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 +28 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/novita.ts +25 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/anthropic-constants.ts +12 -0
- package/src/registry/oauth/anthropic.ts +346 -0
- package/src/registry/oauth/callback-server.ts +438 -0
- package/src/registry/oauth/cursor.ts +187 -0
- package/src/registry/oauth/device-code.ts +92 -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 +225 -0
- package/src/registry/oauth/google-gemini-cli.ts +297 -0
- package/src/registry/oauth/google-oauth-shared.ts +211 -0
- package/src/registry/oauth/index.ts +187 -0
- package/src/registry/oauth/kimi.ts +297 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +317 -0
- package/src/registry/oauth/openai-codex.ts +384 -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 +96 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +559 -0
- package/src/registry/oauth/xiaomi.ts +211 -0
- package/src/registry/oauth/zai.ts +285 -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 +182 -0
- package/src/registry/sakana.ts +22 -0
- package/src/registry/siliconflow-cn.ts +22 -0
- package/src/registry/siliconflow.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 +86 -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 +22 -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 +41 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1944 -0
- package/src/types.ts +1243 -0
- package/src/usage/alibaba-token-plan.ts +230 -0
- package/src/usage/claude.ts +830 -0
- package/src/usage/cursor.ts +335 -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 +277 -0
- package/src/usage/minimax-code.ts +291 -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 +205 -0
- package/src/usage/openai-codex.ts +627 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/synthetic.ts +180 -0
- package/src/usage/umans.ts +192 -0
- package/src/usage/xai-oauth.ts +414 -0
- package/src/usage/zai.ts +370 -0
- package/src/usage.ts +411 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/aws-profile.ts +88 -0
- package/src/utils/block-symbols.ts +78 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +161 -0
- package/src/utils/event-stream.ts +202 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +500 -0
- package/src/utils/http-inspector.ts +196 -0
- package/src/utils/idle-iterator.ts +531 -0
- package/src/utils/leaked-thinking-stream.ts +483 -0
- package/src/utils/openai-http.ts +119 -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 +314 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +121 -0
- package/src/utils/retry.ts +77 -0
- package/src/utils/schema/CONSTRAINTS.md +168 -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 +210 -0
- package/src/utils/schema/index.ts +14 -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 +2314 -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 +212 -0
- package/src/utils/schema/wire.ts +662 -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 +101 -0
- package/src/utils/validation.ts +1932 -0
- package/src/utils.ts +492 -0
|
@@ -0,0 +1,152 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wire types shared between the auth-broker server and clients.
|
|
3
|
+
*
|
|
4
|
+
* The broker holds OAuth refresh tokens and exposes a redacted snapshot;
|
|
5
|
+
* clients use `access` tokens directly and call back to the broker when a
|
|
6
|
+
* credential expires or a 401 surfaces on a supposedly-fresh credential.
|
|
7
|
+
*/
|
|
8
|
+
import type { AuthCredential, AuthCredentialSnapshot, AuthCredentialSnapshotEntry, DisabledCredentialSummary, StoredCredentialBlock } from "../auth-storage.js";
|
|
9
|
+
import type { ClientUsageClientSummary, ClientUsageReport, UsageHistoryEntry, UsageReport } from "../usage.js";
|
|
10
|
+
/** GET /v1/healthz response body. */
|
|
11
|
+
export interface HealthzResponse {
|
|
12
|
+
ok: boolean;
|
|
13
|
+
version?: string;
|
|
14
|
+
}
|
|
15
|
+
export interface RefresherSchedule {
|
|
16
|
+
enabled: boolean;
|
|
17
|
+
intervalMs: number;
|
|
18
|
+
skewMs: number;
|
|
19
|
+
nextSweepInMs: number;
|
|
20
|
+
}
|
|
21
|
+
export type CredentialBlockSnapshot = Omit<StoredCredentialBlock, "credentialId">;
|
|
22
|
+
export type SnapshotEntry = AuthCredentialSnapshotEntry & {
|
|
23
|
+
rotatesInMs: number | null;
|
|
24
|
+
blocks?: CredentialBlockSnapshot[];
|
|
25
|
+
};
|
|
26
|
+
/** GET /v1/snapshot response body. */
|
|
27
|
+
export interface SnapshotResponse extends Omit<AuthCredentialSnapshot, "credentials"> {
|
|
28
|
+
serverNowMs: number;
|
|
29
|
+
refresher: RefresherSchedule;
|
|
30
|
+
credentials: SnapshotEntry[];
|
|
31
|
+
}
|
|
32
|
+
/** GET /v1/usage response body — matches the local `AuthStorage.fetchUsageReports` shape. */
|
|
33
|
+
export interface UsageResponse {
|
|
34
|
+
generatedAt: number;
|
|
35
|
+
reports: UsageReport[];
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* GET /v1/usage/history response body. Entries come from the broker host's
|
|
39
|
+
* durable `usage_history` — the broker performs every upstream usage fetch in
|
|
40
|
+
* broker deployments, so this is the only complete utilization record.
|
|
41
|
+
*/
|
|
42
|
+
export interface UsageHistoryResponse {
|
|
43
|
+
generatedAt: number;
|
|
44
|
+
entries: UsageHistoryEntry[];
|
|
45
|
+
}
|
|
46
|
+
/** POST /v1/usage/observed request body — one client's batched observed usage. */
|
|
47
|
+
export type ClientUsageReportRequest = ClientUsageReport;
|
|
48
|
+
/** POST /v1/usage/observed response body. */
|
|
49
|
+
export interface ClientUsageReportResponse {
|
|
50
|
+
ok: boolean;
|
|
51
|
+
}
|
|
52
|
+
/** GET /v1/usage/clients response body — per-client token burn aggregates. */
|
|
53
|
+
export interface ClientUsageSummaryResponse {
|
|
54
|
+
generatedAt: number;
|
|
55
|
+
clients: ClientUsageClientSummary[];
|
|
56
|
+
}
|
|
57
|
+
/** POST /v1/credential/:id/refresh response body. */
|
|
58
|
+
export interface CredentialRefreshResponse {
|
|
59
|
+
entry: AuthCredentialSnapshotEntry;
|
|
60
|
+
}
|
|
61
|
+
/** POST /v1/credential/:id/disable request body. */
|
|
62
|
+
export interface CredentialDisableRequest {
|
|
63
|
+
cause: string;
|
|
64
|
+
}
|
|
65
|
+
/** POST /v1/credential/:id/disable response body. */
|
|
66
|
+
export interface CredentialDisableResponse {
|
|
67
|
+
ok: boolean;
|
|
68
|
+
}
|
|
69
|
+
/** GET /v1/credentials/disabled response body — tombstones of auto-disabled rows. */
|
|
70
|
+
export interface DisabledCredentialsResponse {
|
|
71
|
+
generatedAt: number;
|
|
72
|
+
disabled: DisabledCredentialSummary[];
|
|
73
|
+
}
|
|
74
|
+
/** POST /v1/credential/:id/block request body. */
|
|
75
|
+
export type CredentialBlockRequest = CredentialBlockSnapshot;
|
|
76
|
+
/** POST /v1/credential/:id/block response body. */
|
|
77
|
+
export interface CredentialBlockResponse {
|
|
78
|
+
ok: boolean;
|
|
79
|
+
}
|
|
80
|
+
/** DELETE /v1/credential/:id/blocks response body. */
|
|
81
|
+
export interface CredentialBlocksDeleteResponse {
|
|
82
|
+
ok: boolean;
|
|
83
|
+
}
|
|
84
|
+
/** POST /v1/usage/stale response body. */
|
|
85
|
+
export interface UsageStaleResponse {
|
|
86
|
+
ok: boolean;
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* POST /v1/credential request body. The OAuth `refresh` must be the *real*
|
|
90
|
+
* refresh token (not the sentinel) — the broker is the canonical writer.
|
|
91
|
+
*/
|
|
92
|
+
export interface CredentialUploadRequest {
|
|
93
|
+
provider: string;
|
|
94
|
+
credential: AuthCredential;
|
|
95
|
+
}
|
|
96
|
+
/** POST /v1/credential response body — redacted snapshot of the provider's rows after upsert. */
|
|
97
|
+
export interface CredentialUploadResponse {
|
|
98
|
+
entries: AuthCredentialSnapshotEntry[];
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* SSE event kinds emitted on `GET /v1/snapshot/stream`. The same value is set
|
|
102
|
+
* as the SSE `event:` name (load-bearing for clients) **and** embedded as a
|
|
103
|
+
* `kind` field inside the JSON body so a Zod discriminated union can validate
|
|
104
|
+
* the payload without consulting the line metadata.
|
|
105
|
+
*/
|
|
106
|
+
export type SnapshotStreamEventKind = "snapshot" | "entry" | "removed";
|
|
107
|
+
/** Initial frame emitted on connect — the full {@link SnapshotResponse}. */
|
|
108
|
+
export interface SnapshotStreamSnapshotEvent extends SnapshotResponse {
|
|
109
|
+
kind: "snapshot";
|
|
110
|
+
}
|
|
111
|
+
/** Single credential added/changed (upsert or refresh). */
|
|
112
|
+
export interface SnapshotStreamEntryEvent {
|
|
113
|
+
kind: "entry";
|
|
114
|
+
generation: number;
|
|
115
|
+
serverNowMs: number;
|
|
116
|
+
refresher: RefresherSchedule;
|
|
117
|
+
entry: SnapshotEntry;
|
|
118
|
+
}
|
|
119
|
+
/** Single credential disabled/deleted. */
|
|
120
|
+
export interface SnapshotStreamRemovedEvent {
|
|
121
|
+
kind: "removed";
|
|
122
|
+
generation: number;
|
|
123
|
+
serverNowMs: number;
|
|
124
|
+
refresher: RefresherSchedule;
|
|
125
|
+
id: number;
|
|
126
|
+
}
|
|
127
|
+
/** Discriminated union of every event the snapshot stream emits. */
|
|
128
|
+
export type SnapshotStreamEvent = SnapshotStreamSnapshotEvent | SnapshotStreamEntryEvent | SnapshotStreamRemovedEvent;
|
|
129
|
+
/**
|
|
130
|
+
* Default bearer-protected route prefix. The broker exposes `/v1/healthz`
|
|
131
|
+
* unauthenticated for liveness probes; everything else requires a bearer.
|
|
132
|
+
*/
|
|
133
|
+
export declare const AUTH_BROKER_API_PREFIX = "/v1";
|
|
134
|
+
/** Request header used by clients to advertise optional auth-broker protocol features. */
|
|
135
|
+
export declare const AUTH_BROKER_CAPABILITIES_HEADER = "OMP-Auth-Broker-Capabilities";
|
|
136
|
+
/** Client understands independent Codex `chat` and `spark` credential-block scopes. */
|
|
137
|
+
export declare const AUTH_BROKER_CAPABILITY_CODEX_METER_BLOCK_SCOPES = "codex-meter-block-scopes";
|
|
138
|
+
/** Default port when none is configured. Loopback-only, no external exposure. */
|
|
139
|
+
export declare const DEFAULT_AUTH_BROKER_BIND = "127.0.0.1:8765";
|
|
140
|
+
/** Default broker→provider refresh skew. Refresh credentials this close to expiry. */
|
|
141
|
+
export declare const DEFAULT_REFRESH_SKEW_MS: number;
|
|
142
|
+
/** Default broker refresh-loop cadence. */
|
|
143
|
+
export declare const DEFAULT_REFRESH_INTERVAL_MS = 60000;
|
|
144
|
+
/** Default freshness window for the encrypted local broker snapshot cache. */
|
|
145
|
+
export declare const DEFAULT_SNAPSHOT_CACHE_TTL_MS: number;
|
|
146
|
+
/** Keepalive cadence for `GET /v1/snapshot/stream` SSE comments. */
|
|
147
|
+
export declare const DEFAULT_STREAM_KEEPALIVE_MS = 20000;
|
|
148
|
+
/**
|
|
149
|
+
* Bun.serve `idleTimeout` (seconds) used by the broker. Default Bun idle
|
|
150
|
+
* timeout (10s) would close long-lived SSE connections between keepalives.
|
|
151
|
+
*/
|
|
152
|
+
export declare const DEFAULT_SERVER_IDLE_TIMEOUT_S = 255;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ArkType schemas for the auth-broker wire protocol.
|
|
3
|
+
*
|
|
4
|
+
* Shared between the server (validates inbound request bodies) and the client
|
|
5
|
+
* (validates responses from the broker). Schemas mirror the TypeScript types
|
|
6
|
+
* in `./types.ts` 1:1; the types remain the source of truth for static typing,
|
|
7
|
+
* and `Type` is asserted-compatible with them where possible.
|
|
8
|
+
*
|
|
9
|
+
* Envelope and fixed-shape schemas use `"+": "reject"` so unknown keys are
|
|
10
|
+
* rejected — the previous implementation used a hand-rolled `hasOnlyFields`
|
|
11
|
+
* allowlist for the same effect. The OAuth credential schema is the deliberate
|
|
12
|
+
* exception (standard type keeps extra keys): it preserves provider-specific extension fields so
|
|
13
|
+
* they round-trip through the broker instead of being dropped (see below).
|
|
14
|
+
*/
|
|
15
|
+
import { type Type } from "@linxiraos/pi-omptype";
|
|
16
|
+
import { type ApiKeyCredential, type AuthCredential, type AuthCredentialSnapshotEntry, type DisabledCredentialSummary, type OAuthCredential, type RemoteOAuthCredential, type SnapshotCredential } from "../auth-storage.js";
|
|
17
|
+
import type { ClientUsageReportRequest, ClientUsageReportResponse, ClientUsageSummaryResponse, CredentialBlockRequest, CredentialBlockResponse, CredentialBlockSnapshot, CredentialBlocksDeleteResponse, CredentialDisableResponse, CredentialRefreshResponse, CredentialUploadRequest, CredentialUploadResponse, DisabledCredentialsResponse, HealthzResponse, RefresherSchedule, SnapshotEntry, SnapshotResponse, SnapshotStreamEntryEvent, SnapshotStreamEvent, SnapshotStreamRemovedEvent, SnapshotStreamSnapshotEvent, UsageHistoryResponse, UsageResponse, UsageStaleResponse } from "./types.js";
|
|
18
|
+
export interface AuthBrokerWireSchemas {
|
|
19
|
+
readonly oauthCredentialSchema: Type<OAuthCredential>;
|
|
20
|
+
readonly remoteOauthCredentialSchema: Type<RemoteOAuthCredential>;
|
|
21
|
+
readonly apiKeyCredentialSchema: Type<ApiKeyCredential>;
|
|
22
|
+
readonly writableAuthCredentialSchema: Type<AuthCredential>;
|
|
23
|
+
readonly snapshotCredentialSchema: Type<SnapshotCredential>;
|
|
24
|
+
readonly credentialSnapshotEntrySchema: Type<AuthCredentialSnapshotEntry>;
|
|
25
|
+
readonly credentialBlockSnapshotSchema: Type<CredentialBlockSnapshot>;
|
|
26
|
+
readonly snapshotEntrySchema: Type<SnapshotEntry>;
|
|
27
|
+
readonly refresherScheduleSchema: Type<RefresherSchedule>;
|
|
28
|
+
readonly snapshotResponseSchema: Type<SnapshotResponse>;
|
|
29
|
+
readonly snapshotStreamSnapshotEventSchema: Type<SnapshotStreamSnapshotEvent>;
|
|
30
|
+
readonly snapshotStreamEntryEventSchema: Type<SnapshotStreamEntryEvent>;
|
|
31
|
+
readonly snapshotStreamRemovedEventSchema: Type<SnapshotStreamRemovedEvent>;
|
|
32
|
+
readonly snapshotStreamEventSchema: Type<SnapshotStreamEvent>;
|
|
33
|
+
readonly healthzResponseSchema: Type<HealthzResponse>;
|
|
34
|
+
readonly usageResponseSchema: Type<UsageResponse>;
|
|
35
|
+
readonly usageHistoryResponseSchema: Type<UsageHistoryResponse>;
|
|
36
|
+
readonly clientUsageReportRequestSchema: Type<ClientUsageReportRequest>;
|
|
37
|
+
readonly clientUsageReportResponseSchema: Type<ClientUsageReportResponse>;
|
|
38
|
+
readonly clientUsageSummaryResponseSchema: Type<ClientUsageSummaryResponse>;
|
|
39
|
+
readonly credentialRefreshResponseSchema: Type<CredentialRefreshResponse>;
|
|
40
|
+
readonly credentialDisableRequestSchema: Type<{
|
|
41
|
+
cause?: string;
|
|
42
|
+
}>;
|
|
43
|
+
readonly credentialDisableResponseSchema: Type<CredentialDisableResponse>;
|
|
44
|
+
readonly disabledCredentialSummarySchema: Type<DisabledCredentialSummary>;
|
|
45
|
+
readonly disabledCredentialsResponseSchema: Type<DisabledCredentialsResponse>;
|
|
46
|
+
readonly credentialBlockRequestSchema: Type<CredentialBlockRequest>;
|
|
47
|
+
readonly credentialBlockResponseSchema: Type<CredentialBlockResponse>;
|
|
48
|
+
readonly credentialBlocksDeleteResponseSchema: Type<CredentialBlocksDeleteResponse>;
|
|
49
|
+
readonly usageStaleResponseSchema: Type<UsageStaleResponse>;
|
|
50
|
+
readonly credentialUploadRequestSchema: Type<CredentialUploadRequest>;
|
|
51
|
+
readonly credentialUploadResponseSchema: Type<CredentialUploadResponse>;
|
|
52
|
+
}
|
|
53
|
+
export declare function getAuthBrokerWireSchemas(): AuthBrokerWireSchemas;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const oauthCredentialSchema: import("@linxiraos/pi-omptype").Type<import("../index.js").OAuthCredential, import("../index.js").OAuthCredential>, remoteOauthCredentialSchema: import("@linxiraos/pi-omptype").Type<import("../index.js").RemoteOAuthCredential, import("../index.js").RemoteOAuthCredential>, apiKeyCredentialSchema: import("@linxiraos/pi-omptype").Type<import("../index.js").ApiKeyCredential, import("../index.js").ApiKeyCredential>, writableAuthCredentialSchema: import("@linxiraos/pi-omptype").Type<import("../index.js").AuthCredential, import("../index.js").AuthCredential>, snapshotCredentialSchema: import("@linxiraos/pi-omptype").Type<import("../index.js").SnapshotCredential, import("../index.js").SnapshotCredential>, credentialSnapshotEntrySchema: import("@linxiraos/pi-omptype").Type<import("../index.js").AuthCredentialSnapshotEntry, import("../index.js").AuthCredentialSnapshotEntry>, credentialBlockSnapshotSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialBlockSnapshot, import("./types.js").CredentialBlockSnapshot>, snapshotEntrySchema: import("@linxiraos/pi-omptype").Type<import("./types.js").SnapshotEntry, import("./types.js").SnapshotEntry>, refresherScheduleSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").RefresherSchedule, import("./types.js").RefresherSchedule>, snapshotResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").SnapshotResponse, import("./types.js").SnapshotResponse>, snapshotStreamSnapshotEventSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").SnapshotStreamSnapshotEvent, import("./types.js").SnapshotStreamSnapshotEvent>, snapshotStreamEntryEventSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").SnapshotStreamEntryEvent, import("./types.js").SnapshotStreamEntryEvent>, snapshotStreamRemovedEventSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").SnapshotStreamRemovedEvent, import("./types.js").SnapshotStreamRemovedEvent>, snapshotStreamEventSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").SnapshotStreamEvent, import("./types.js").SnapshotStreamEvent>, healthzResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").HealthzResponse, import("./types.js").HealthzResponse>, usageResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").UsageResponse, import("./types.js").UsageResponse>, usageHistoryResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").UsageHistoryResponse, import("./types.js").UsageHistoryResponse>, clientUsageReportRequestSchema: import("@linxiraos/pi-omptype").Type<import("../index.js").ClientUsageReport, import("../index.js").ClientUsageReport>, clientUsageReportResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").ClientUsageReportResponse, import("./types.js").ClientUsageReportResponse>, clientUsageSummaryResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").ClientUsageSummaryResponse, import("./types.js").ClientUsageSummaryResponse>, credentialRefreshResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialRefreshResponse, import("./types.js").CredentialRefreshResponse>, credentialDisableRequestSchema: import("@linxiraos/pi-omptype").Type<{
|
|
2
|
+
cause?: string;
|
|
3
|
+
}, {
|
|
4
|
+
cause?: string;
|
|
5
|
+
}>, credentialDisableResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialDisableResponse, import("./types.js").CredentialDisableResponse>, disabledCredentialSummarySchema: import("@linxiraos/pi-omptype").Type<import("../index.js").DisabledCredentialSummary, import("../index.js").DisabledCredentialSummary>, disabledCredentialsResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").DisabledCredentialsResponse, import("./types.js").DisabledCredentialsResponse>, credentialBlockRequestSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialBlockSnapshot, import("./types.js").CredentialBlockSnapshot>, credentialBlockResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialBlockResponse, import("./types.js").CredentialBlockResponse>, credentialBlocksDeleteResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialBlocksDeleteResponse, import("./types.js").CredentialBlocksDeleteResponse>, usageStaleResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").UsageStaleResponse, import("./types.js").UsageStaleResponse>, credentialUploadRequestSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialUploadRequest, import("./types.js").CredentialUploadRequest>, credentialUploadResponseSchema: import("@linxiraos/pi-omptype").Type<import("./types.js").CredentialUploadResponse, import("./types.js").CredentialUploadResponse>;
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import type { Api, AssistantMessage, Model } from "../types.js";
|
|
2
|
+
export declare function json(status: number, body: unknown, headers?: Record<string, string>): Response;
|
|
3
|
+
/**
|
|
4
|
+
* Diagnostic response headers for translated inference requests, mirroring the
|
|
5
|
+
* names existing gateway-aware clients already parse: `x-request-id` /
|
|
6
|
+
* `request-id` (surfaced as `_request_id` by the OpenAI and Anthropic SDKs,
|
|
7
|
+
* matches the gateway log line), LiteLLM's model-resolution and cost headers,
|
|
8
|
+
* and OpenAI's `openai-processing-ms`. Model/request-id headers are always
|
|
9
|
+
* present; `message` — the final assistant message, available only on
|
|
10
|
+
* non-streaming responses — adds the computed cost, and `startedAt` the wall
|
|
11
|
+
* time. Streaming responses send headers before usage exists, so they carry
|
|
12
|
+
* only the identity headers.
|
|
13
|
+
*/
|
|
14
|
+
export declare function gatewayResponseHeaders(model: Model<Api>, info: {
|
|
15
|
+
requestId: string;
|
|
16
|
+
message?: AssistantMessage;
|
|
17
|
+
startedAt?: number;
|
|
18
|
+
}): Record<string, string>;
|
|
19
|
+
export declare function resolvePeer(req: Request): string;
|
|
20
|
+
/**
|
|
21
|
+
* Constant-time byte comparison. Falls back to a manual XOR accumulator if
|
|
22
|
+
* `node:crypto.timingSafeEqual` isn't available. Always processes every byte
|
|
23
|
+
* of the longer input so length itself doesn't leak via timing.
|
|
24
|
+
*/
|
|
25
|
+
export declare function timingSafeEqual(a: Uint8Array, b: Uint8Array): boolean;
|
|
26
|
+
export declare function isAuthorized(req: Request, tokens: ReadonlySet<string>): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Extract allow-listed passthrough headers from an inbound request. Keys are
|
|
29
|
+
* lowercased; empty values are dropped. Called once per request in
|
|
30
|
+
* `handleFormatEndpoint`; parsers then read `options.headers`.
|
|
31
|
+
*/
|
|
32
|
+
export declare function captureRequestHeaders(headers: Headers): Record<string, string>;
|
|
33
|
+
/**
|
|
34
|
+
* Resolve a prompt-cache identity from inbound request body + headers.
|
|
35
|
+
* Order of precedence (first wins):
|
|
36
|
+
* 1. Body `prompt_cache_key`
|
|
37
|
+
* 2. Body `metadata.{prompt_cache_key,session_id,conversation_id}`
|
|
38
|
+
* 3. Header `x-prompt-cache-key`
|
|
39
|
+
* 4. Header `session_id` / `conversation_id` (Codex / ChatGPT-OAuth surface)
|
|
40
|
+
* 5. Header `x-session-id` / `x-conversation-id` (common informal)
|
|
41
|
+
* Returns undefined when none present; the gateway then derives a stable
|
|
42
|
+
* UUID from the request's stable parts.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolvePromptCacheKey(body: unknown, headers?: Headers): string | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* CORS headers for the auth-gateway. Currently echoes a wildcard origin; the
|
|
47
|
+
* request is accepted so future tightening can mirror `Origin` without
|
|
48
|
+
* threading the request through every caller.
|
|
49
|
+
*/
|
|
50
|
+
export declare function corsHeaders(_req: Request): Record<string, string>;
|
|
51
|
+
/**
|
|
52
|
+
* Re-emit `response` with CORS headers merged. The original response body is
|
|
53
|
+
* passed through unchanged. Used by the gateway wrapper so every outbound
|
|
54
|
+
* format-endpoint response carries the same CORS surface as the preflight.
|
|
55
|
+
*/
|
|
56
|
+
export declare function withCors(response: Response, req: Request): Response;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* omp auth-gateway HTTP server.
|
|
3
|
+
*
|
|
4
|
+
* Accepts any provider-format request (OpenAI chat-completions, Anthropic
|
|
5
|
+
* messages, OpenAI Responses) and dispatches through pi-ai's `streamSimple()`
|
|
6
|
+
* — which handles credential injection, anthropic-beta headers, codex
|
|
7
|
+
* websocket transport, and all the per-provider intricacies. The gateway is
|
|
8
|
+
* pure protocol translation: foreign wire → omp Context → pi-ai stream() →
|
|
9
|
+
* omp events → foreign wire.
|
|
10
|
+
*
|
|
11
|
+
* Endpoints:
|
|
12
|
+
* GET /healthz → unauth; ok + version
|
|
13
|
+
* GET /v1/usage → aggregated provider usage (5-min per-credential cache via AuthStorage)
|
|
14
|
+
* GET /v1/credentials/check → per-credential auth probe (diagnose 401s in a multi-account pool)
|
|
15
|
+
* GET /v1/models → list known models from the registry
|
|
16
|
+
* POST /v1/chat/completions → OpenAI chat-completions in/out
|
|
17
|
+
* POST /v1/messages → Anthropic messages in/out
|
|
18
|
+
* POST /v1/responses → OpenAI Responses in/out
|
|
19
|
+
*/
|
|
20
|
+
import type { AuthStorage } from "../auth-storage.js";
|
|
21
|
+
import type { Api, Model } from "../types.js";
|
|
22
|
+
import type { AuthGatewayServerHandle, AuthGatewayServerOptions } from "./types.js";
|
|
23
|
+
export type ModelResolver = (modelId: string) => Model<Api> | undefined;
|
|
24
|
+
export interface AuthGatewayBootOptions extends AuthGatewayServerOptions {
|
|
25
|
+
/** Source of credentials. Caller wires this to a broker-backed AuthStorage. */
|
|
26
|
+
storage: AuthStorage;
|
|
27
|
+
/**
|
|
28
|
+
* Resolve a client-requested model id to a pi-ai Model. Caller supplies
|
|
29
|
+
* this from a ModelRegistry (lives in `coding-agent` to avoid an inverse
|
|
30
|
+
* dependency in `pi-ai`).
|
|
31
|
+
*/
|
|
32
|
+
resolveModel: ModelResolver;
|
|
33
|
+
/** Optional supplier for `/v1/models` listing. Returns the full model array. */
|
|
34
|
+
listModels?: () => Iterable<Model<Api>>;
|
|
35
|
+
}
|
|
36
|
+
export declare function startAuthGateway(opts: AuthGatewayBootOptions): AuthGatewayServerHandle;
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
import type { Effort } from "@linxiraos/pi-catalog/effort";
|
|
2
|
+
import type { AssistantMessage, AssistantMessageEventStream, CacheRetention, Context, OpenAIResponseInclude, ServiceTier, TokenTaskBudget } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Wire types for the omp auth-gateway.
|
|
5
|
+
*
|
|
6
|
+
* The gateway sits between unauthenticated clients (containerized omp,
|
|
7
|
+
* llm-git, …) and the broker. It accepts provider-format HTTP requests
|
|
8
|
+
* (OpenAI chat-completions / Anthropic messages / OpenAI Responses),
|
|
9
|
+
* dispatches them through pi-ai's `streamSimple()`, and translates the
|
|
10
|
+
* canonical event stream back to the matching wire format. The gateway
|
|
11
|
+
* injects `Authorization` server-side so clients never see access tokens.
|
|
12
|
+
*/
|
|
13
|
+
/** Default bind. Loopback-only — front with reverse proxy for remote access. */
|
|
14
|
+
export declare const DEFAULT_AUTH_GATEWAY_BIND = "127.0.0.1:4000";
|
|
15
|
+
export type AuthGatewayToolChoice = "auto" | "none" | "required" | {
|
|
16
|
+
name: string;
|
|
17
|
+
} | {
|
|
18
|
+
type: "computer";
|
|
19
|
+
};
|
|
20
|
+
export interface AuthGatewayParsedRequestOptions {
|
|
21
|
+
maxOutputTokens?: number;
|
|
22
|
+
temperature?: number;
|
|
23
|
+
topP?: number;
|
|
24
|
+
topK?: number;
|
|
25
|
+
/** OpenAI nucleus-min sampling (`min_p`). */
|
|
26
|
+
minP?: number;
|
|
27
|
+
/** Anthropic `stop_sequences` / OpenAI `stop`. */
|
|
28
|
+
stopSequences?: string[];
|
|
29
|
+
/** OpenAI `presence_penalty`. */
|
|
30
|
+
presencePenalty?: number;
|
|
31
|
+
/** OpenAI `frequency_penalty`. */
|
|
32
|
+
frequencyPenalty?: number;
|
|
33
|
+
/** OpenRouter / vLLM `repetition_penalty`. */
|
|
34
|
+
repetitionPenalty?: number;
|
|
35
|
+
/** OpenAI deterministic-sampling `seed`. */
|
|
36
|
+
seed?: number;
|
|
37
|
+
/** OpenAI `logit_bias` map (token id → bias). */
|
|
38
|
+
logitBias?: Record<string, number>;
|
|
39
|
+
/** OpenAI `response_format` (text | json_object | json_schema). Opaque passthrough. */
|
|
40
|
+
responseFormat?: unknown;
|
|
41
|
+
toolChoice?: AuthGatewayToolChoice;
|
|
42
|
+
/** OpenAI `parallel_tool_calls`. */
|
|
43
|
+
parallelToolCalls?: boolean;
|
|
44
|
+
/** OpenAI Responses fields requested in the response payload. */
|
|
45
|
+
include?: OpenAIResponseInclude[];
|
|
46
|
+
/** Effort-level reasoning request (OpenAI Responses / Chat `reasoning_effort`). */
|
|
47
|
+
reasoning?: Effort;
|
|
48
|
+
/** Force-disable reasoning (Anthropic `thinking: { type: "disabled" }`). */
|
|
49
|
+
disableReasoning?: boolean;
|
|
50
|
+
/**
|
|
51
|
+
* Explicit Anthropic `thinking.budget_tokens`. Mirrors Rust's
|
|
52
|
+
* `resolve_thinking_budget`: pins onto whichever effort the client
|
|
53
|
+
* requested (defaulting to High when unspecified). Preferred over the
|
|
54
|
+
* removed legacy single-number `thinkingBudget` for new code.
|
|
55
|
+
*/
|
|
56
|
+
explicitThinkingBudgetTokens?: number;
|
|
57
|
+
/** Per-effort thinking budget map. */
|
|
58
|
+
thinkingBudgets?: Partial<Record<Effort, number>>;
|
|
59
|
+
/** Suppress the provider's reasoning summary stream. */
|
|
60
|
+
hideThinkingSummary?: boolean;
|
|
61
|
+
/** Anthropic `output_config.task_budget` advisory loop budget. */
|
|
62
|
+
taskBudget?: TokenTaskBudget;
|
|
63
|
+
/** OpenAI service tier (auto|default|flex|scale|priority). */
|
|
64
|
+
serviceTier?: ServiceTier;
|
|
65
|
+
/** Cache retention hint derived from inbound `cache_control` markers. */
|
|
66
|
+
cacheRetention?: CacheRetention;
|
|
67
|
+
/** OpenAI Responses `prompt_cache_key`; also seeds provider routing when no separate session id exists. */
|
|
68
|
+
promptCacheKey?: string;
|
|
69
|
+
/** OpenAI Responses `previous_response_id` for response chaining. */
|
|
70
|
+
previousResponseId?: string;
|
|
71
|
+
/** OpenAI / abuse-tracking `user` field. */
|
|
72
|
+
user?: string;
|
|
73
|
+
/**
|
|
74
|
+
* Provider-specific metadata. Anthropic uses `metadata.user_id`; OpenRouter
|
|
75
|
+
* carries routing hints; xAI uses `search_parameters`; OpenAI accepts a
|
|
76
|
+
* free-form bag. The gateway forwards as-is.
|
|
77
|
+
*/
|
|
78
|
+
metadata?: Record<string, unknown>;
|
|
79
|
+
/**
|
|
80
|
+
* Captured allow-listed passthrough headers (anthropic-beta,
|
|
81
|
+
* anthropic-version, openai-organization, openai-project, openai-beta,
|
|
82
|
+
* x-stainless-*). Keys are lowercased.
|
|
83
|
+
*/
|
|
84
|
+
headers?: Record<string, string>;
|
|
85
|
+
/**
|
|
86
|
+
* Escape hatch for provider-specific request controls that don't yet have a
|
|
87
|
+
* first-class field. Prefer adding a typed field over widening this.
|
|
88
|
+
*/
|
|
89
|
+
extra?: Record<string, unknown>;
|
|
90
|
+
}
|
|
91
|
+
export interface AuthGatewayParsedRequest {
|
|
92
|
+
modelId: string;
|
|
93
|
+
context: Context;
|
|
94
|
+
stream: boolean;
|
|
95
|
+
options: AuthGatewayParsedRequestOptions;
|
|
96
|
+
}
|
|
97
|
+
export interface AuthGatewayStreamControl {
|
|
98
|
+
/** Gateway request signal. Encoders stop producing frames when it aborts. */
|
|
99
|
+
signal?: AbortSignal;
|
|
100
|
+
/** Called when the HTTP response body is cancelled by the client. */
|
|
101
|
+
onCancel?: (reason?: unknown) => void;
|
|
102
|
+
}
|
|
103
|
+
export interface AuthGatewayFormatModule {
|
|
104
|
+
parseRequest(body: unknown, headers?: Headers): AuthGatewayParsedRequest;
|
|
105
|
+
encodeResponse(message: AssistantMessage, requestedModelId: string): Record<string, unknown>;
|
|
106
|
+
encodeStream(events: AssistantMessageEventStream, requestedModelId: string, options?: AuthGatewayParsedRequestOptions, control?: AuthGatewayStreamControl): ReadableStream<Uint8Array>;
|
|
107
|
+
/**
|
|
108
|
+
* Emit a protocol-specific error envelope. OpenAI returns
|
|
109
|
+
* `{ error: { message, type } }`; Anthropic returns
|
|
110
|
+
* `{ type: "error", error: { type, message } }`.
|
|
111
|
+
*/
|
|
112
|
+
formatError(status: number, type: string, message: string): Response;
|
|
113
|
+
}
|
|
114
|
+
export interface AuthGatewayServerOptions {
|
|
115
|
+
/** Listen address. Default `127.0.0.1:4000`. */
|
|
116
|
+
bind?: string;
|
|
117
|
+
/** Accept any of these bearer tokens. Empty allows unauthenticated calls. */
|
|
118
|
+
bearerTokens: string[];
|
|
119
|
+
/** Version surfaced on `/healthz`. */
|
|
120
|
+
version?: string;
|
|
121
|
+
}
|
|
122
|
+
export interface AuthGatewayServerHandle {
|
|
123
|
+
url: string;
|
|
124
|
+
port: number;
|
|
125
|
+
hostname: string;
|
|
126
|
+
close(): Promise<void>;
|
|
127
|
+
}
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
import type { OAuthAccess } from "./auth-storage.js";
|
|
2
|
+
import { isAuthRetryableError } from "./error/auth-classify.js";
|
|
3
|
+
/**
|
|
4
|
+
* Context passed to an {@link ApiKeyResolver} on each resolution attempt.
|
|
5
|
+
*
|
|
6
|
+
* The `error`/`lastChance` pair preserves the legacy a/b/c resolver contract
|
|
7
|
+
* shared by streaming ({@link streamSimple}) and non-streaming ({@link withAuth})
|
|
8
|
+
* drivers:
|
|
9
|
+
* - `error === undefined` → **initial resolve** (no force-refresh; cheap, may
|
|
10
|
+
* return a locally-cached not-yet-expired token).
|
|
11
|
+
* - `error !== undefined && !lastChance` → **step (b): refresh the SAME
|
|
12
|
+
* account** (force a token re-mint / await an in-flight broker refresh).
|
|
13
|
+
* - `error !== undefined && lastChance` → **step (c): switch account**
|
|
14
|
+
* (invalidate/usage-limit the current credential and rotate to a sibling).
|
|
15
|
+
*
|
|
16
|
+
* Current drivers preserve that bounded a/b/c sequence for ordinary 401/auth
|
|
17
|
+
* failures. 403/usage-limit failures skip refresh and may repeat step (c)
|
|
18
|
+
* until the resolver returns `undefined`, cycles, or hits
|
|
19
|
+
* {@link AUTH_RETRY_MAX_ATTEMPTS}.
|
|
20
|
+
*/
|
|
21
|
+
export interface ApiKeyResolveContext {
|
|
22
|
+
/** True when 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
|
+
/** Bearer used by the failed attempt, when the caller can expose it. */
|
|
27
|
+
previousKey?: string;
|
|
28
|
+
/** Caller cancel signal, threaded into any credential refresh / rotation work. */
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Resolves the API key to send for a request, retried through the a/b/c policy
|
|
33
|
+
* described on {@link ApiKeyResolveContext}.
|
|
34
|
+
*/
|
|
35
|
+
export type ApiKeyResolver = (ctx: ApiKeyResolveContext) => Promise<string | undefined> | string | undefined;
|
|
36
|
+
/** A static bearer string, or a {@link ApiKeyResolver} that mints/rotates one. */
|
|
37
|
+
export type ApiKey = string | ApiKeyResolver;
|
|
38
|
+
/** Narrows {@link ApiKey} to its resolver form. */
|
|
39
|
+
export declare function isApiKeyResolver(key: ApiKey | undefined): key is ApiKeyResolver;
|
|
40
|
+
/**
|
|
41
|
+
* Performs the initial resolve of an {@link ApiKey} (`error: undefined`,
|
|
42
|
+
* `lastChance: false`). Static keys pass through unchanged.
|
|
43
|
+
*/
|
|
44
|
+
export declare function resolveApiKeyOnce(key: ApiKey | undefined, signal?: AbortSignal): Promise<string | undefined>;
|
|
45
|
+
/**
|
|
46
|
+
* Wraps a resolver with a bearer that was already selected for this request.
|
|
47
|
+
*
|
|
48
|
+
* Callers that preflight credentials can pass the returned resolver to the
|
|
49
|
+
* auth-retry driver without making the driver know about that preflight: the
|
|
50
|
+
* first initial resolution reuses `seed`, and all later resolutions delegate to
|
|
51
|
+
* `resolver`.
|
|
52
|
+
*/
|
|
53
|
+
export declare function seedApiKeyResolver(seed: string | undefined, resolver: ApiKeyResolver): ApiKeyResolver;
|
|
54
|
+
export { isAuthRetryableError };
|
|
55
|
+
/**
|
|
56
|
+
* Legacy bounded a/b/c retry sequence retained for public compatibility:
|
|
57
|
+
* `false` → refresh-same, `true` → rotate/switch. Current drivers consume it
|
|
58
|
+
* once for ordinary 401/auth failures; usage/account-limit failures may repeat
|
|
59
|
+
* sibling rotation until a termination guard fires.
|
|
60
|
+
*/
|
|
61
|
+
export declare const AUTH_RETRY_STEPS: readonly boolean[];
|
|
62
|
+
export declare const AUTH_RETRY_MAX_ATTEMPTS = 64;
|
|
63
|
+
/** Resolve a single retry step, swallowing resolver failures into `undefined`. */
|
|
64
|
+
export declare function resolveRetryKey(resolver: ApiKeyResolver, lastChance: boolean, error: unknown, signal?: AbortSignal, previousKey?: string): Promise<string | undefined>;
|
|
65
|
+
export interface AuthRetryKeyState {
|
|
66
|
+
/** Bearer strings already sent during this logical operation. */
|
|
67
|
+
attemptedKeys: Set<string>;
|
|
68
|
+
/** Bearer used by the most recent failed attempt. */
|
|
69
|
+
lastKey: string;
|
|
70
|
+
/** Whether the current credential already consumed its 401 refresh-same retry. */
|
|
71
|
+
refreshedCurrent: boolean;
|
|
72
|
+
/** Whether the legacy non-usage auth path already switched to one sibling. */
|
|
73
|
+
legacyAuthSwitchUsed: boolean;
|
|
74
|
+
/** Total outbound attempts accepted for this logical operation, including the initial request. */
|
|
75
|
+
attempts: number;
|
|
76
|
+
}
|
|
77
|
+
export declare function createAuthRetryKeyState(initialKey: string): AuthRetryKeyState;
|
|
78
|
+
export declare function resolveNextAuthRetryKey(state: AuthRetryKeyState, resolver: ApiKeyResolver, error: unknown, signal?: AbortSignal): Promise<string | undefined>;
|
|
79
|
+
/**
|
|
80
|
+
* Runs an auth-protected operation through the central a/b/c retry policy.
|
|
81
|
+
*
|
|
82
|
+
* - A static string key (or any non-resolver) → a single `attempt` with no
|
|
83
|
+
* retry (identical to the legacy static-key path).
|
|
84
|
+
* - A resolver → initial `attempt`, then resolver-driven retries until the
|
|
85
|
+
* applicable policy is exhausted, the resolver declines or cycles, or the
|
|
86
|
+
* operation reaches {@link AUTH_RETRY_MAX_ATTEMPTS}. Ordinary 401/auth
|
|
87
|
+
* failures retain one refresh-same plus one sibling switch; 403/usage-limit
|
|
88
|
+
* failures rotate directly through distinct siblings.
|
|
89
|
+
*
|
|
90
|
+
* Used by non-streaming consumers (image generation, web search, completion
|
|
91
|
+
* helpers). The streaming driver in `stream.ts` implements the same policy with
|
|
92
|
+
* its replay-safe buffering machinery.
|
|
93
|
+
*/
|
|
94
|
+
export declare function withAuth<T>(key: ApiKey | undefined, attempt: (key: string) => Promise<T>, opts?: {
|
|
95
|
+
isAuthError?: (error: unknown) => boolean;
|
|
96
|
+
signal?: AbortSignal;
|
|
97
|
+
missingKeyMessage?: string;
|
|
98
|
+
}): Promise<T>;
|
|
99
|
+
/**
|
|
100
|
+
* Minimal structural slice of `AuthStorage` consumed by {@link withOAuthAccess}.
|
|
101
|
+
* Typed structurally (and importing only the `OAuthAccess` type) so this module
|
|
102
|
+
* never takes a runtime dependency on `./auth-storage`.
|
|
103
|
+
*/
|
|
104
|
+
export interface OAuthAccessSource {
|
|
105
|
+
getOAuthAccess(provider: string, sessionId?: string, options?: {
|
|
106
|
+
forceRefresh?: boolean;
|
|
107
|
+
signal?: AbortSignal;
|
|
108
|
+
}): Promise<OAuthAccess | undefined>;
|
|
109
|
+
rotateSessionCredential(provider: string, sessionId: string | undefined, options?: {
|
|
110
|
+
error?: unknown;
|
|
111
|
+
signal?: AbortSignal;
|
|
112
|
+
apiKey?: string;
|
|
113
|
+
credentialId?: number;
|
|
114
|
+
}): Promise<boolean>;
|
|
115
|
+
}
|
|
116
|
+
export interface WithOAuthAccessOptions {
|
|
117
|
+
/** Session id for credential stickiness, threaded into every resolve. */
|
|
118
|
+
sessionId?: string;
|
|
119
|
+
signal?: AbortSignal;
|
|
120
|
+
/** Override the retryable-error classifier (default {@link isAuthRetryableError}). */
|
|
121
|
+
isAuthError?: (error: unknown) => boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Pre-resolved access used for the initial attempt. Callers that already
|
|
124
|
+
* resolved access for an availability gate pass it here so the helper
|
|
125
|
+
* doesn't double-resolve (mirrors the gateway resolver's `initialKey`).
|
|
126
|
+
*/
|
|
127
|
+
seed?: OAuthAccess;
|
|
128
|
+
missingAccessMessage?: string;
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* {@link withAuth} for OAuth-access consumers: runs an auth-protected
|
|
132
|
+
* operation through the central a/b/c retry policy, handing the attempt the
|
|
133
|
+
* full {@link OAuthAccess} (bearer + identity metadata: `accountId`,
|
|
134
|
+
* `projectId`, `enterpriseUrl`) instead of bare API-key bytes.
|
|
135
|
+
*
|
|
136
|
+
* - initial → `getOAuthAccess` (or `opts.seed`).
|
|
137
|
+
* - 401/auth failure → one `getOAuthAccess` with `forceRefresh: true` for the
|
|
138
|
+
* current account, then sibling rotation.
|
|
139
|
+
* - 403/usage-limit failure → `rotateSessionCredential` directly, without a
|
|
140
|
+
* force-refresh detour.
|
|
141
|
+
*
|
|
142
|
+
* A refresh-same step may retry a new bearer for the same credential identity;
|
|
143
|
+
* sibling rotation stops when it yields a credential identity
|
|
144
|
+
* (`credentialId ?? accessToken`) or bearer already attempted in this turn.
|
|
145
|
+
* All OAuth attempts share the {@link AUTH_RETRY_MAX_ATTEMPTS} ceiling.
|
|
146
|
+
* Non-auth errors propagate immediately. Use this instead of hand-rolled
|
|
147
|
+
* `getOAuthAccess` + fetch flows so 401s and usage-limits rotate credentials
|
|
148
|
+
* instead of failing the call.
|
|
149
|
+
*/
|
|
150
|
+
export declare function withOAuthAccess<T>(storage: OAuthAccessSource, provider: string, attempt: (access: OAuthAccess) => Promise<T>, opts?: WithOAuthAccessOptions): Promise<T>;
|