@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,21 @@
|
|
|
1
|
+
import type { AssistantMessage, Context } from "../types.js";
|
|
2
|
+
import { AssistantMessageEventStream } from "./event-stream.js";
|
|
3
|
+
export declare const MAX_EMPTY_COMPLETION_RETRIES = 2;
|
|
4
|
+
export declare const EMPTY_COMPLETION_BASE_DELAY_MS = 500;
|
|
5
|
+
/**
|
|
6
|
+
* Whether a completed assistant message carries content worth delivering: an
|
|
7
|
+
* image, tool call, or any non-whitespace text. An empty/whitespace-only message
|
|
8
|
+
* — or one that only ever produced thinking — is the "empty response" failure.
|
|
9
|
+
*/
|
|
10
|
+
export declare function hasVisibleAssistantContent(message: AssistantMessage): boolean;
|
|
11
|
+
interface EmptyCompletionRetryOptions {
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
providerRetryWait?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Wrap a single-attempt provider stream with bounded empty-completion retries.
|
|
17
|
+
* `attempt` MUST create a fresh request (and its own output message) on each
|
|
18
|
+
* call so a retry never inherits stale metadata from an empty attempt.
|
|
19
|
+
*/
|
|
20
|
+
export declare function withEmptyCompletionRetry<M, O extends EmptyCompletionRetryOptions>(model: M, context: Context, options: O | undefined, attempt: (model: M, context: Context, options?: O) => AssistantMessageEventStream): AssistantMessageEventStream;
|
|
21
|
+
export {};
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { AssistantMessage, AssistantMessageEvent } from "../types.js";
|
|
2
|
+
export declare class EventStream<T, R = T> implements AsyncIterable<T> {
|
|
3
|
+
#private;
|
|
4
|
+
queue: T[];
|
|
5
|
+
waiting: Array<{
|
|
6
|
+
resolve: (value: IteratorResult<T>) => void;
|
|
7
|
+
reject: (err: unknown) => void;
|
|
8
|
+
}>;
|
|
9
|
+
done: boolean;
|
|
10
|
+
/** True once finalResultPromise has been resolved or rejected. */
|
|
11
|
+
resultSettled: boolean;
|
|
12
|
+
finalResultPromise: Promise<R>;
|
|
13
|
+
resolveFinalResult: (result: R) => void;
|
|
14
|
+
rejectFinalResult: (err: unknown) => void;
|
|
15
|
+
isComplete: (event: T) => boolean;
|
|
16
|
+
extractResult: (event: T) => R;
|
|
17
|
+
constructor(isComplete: (event: T) => boolean, extractResult: (event: T) => R);
|
|
18
|
+
push(event: T): void;
|
|
19
|
+
deliver(event: T): void;
|
|
20
|
+
end(result?: R): void;
|
|
21
|
+
endWaiting(): void;
|
|
22
|
+
fail(err: unknown): void;
|
|
23
|
+
[Symbol.asyncIterator](): AsyncIterator<T>;
|
|
24
|
+
result(): Promise<R>;
|
|
25
|
+
/** True while local work tracked via {@link trackLocalWork} is pending. */
|
|
26
|
+
get hasPendingLocalWork(): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Track a local-work promise so idle watchdogs on this stream do not treat
|
|
29
|
+
* the event silence while it is pending as a provider stall.
|
|
30
|
+
*/
|
|
31
|
+
trackLocalWork<TWork>(work: Promise<TWork>): Promise<TWork>;
|
|
32
|
+
}
|
|
33
|
+
export declare class AssistantMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {
|
|
34
|
+
constructor();
|
|
35
|
+
push(event: AssistantMessageEvent): void;
|
|
36
|
+
end(result?: AssistantMessage): void;
|
|
37
|
+
}
|
|
38
|
+
/** Create an assistant-message event stream for legacy extension providers. */
|
|
39
|
+
export declare function createAssistantMessageEventStream(): AssistantMessageEventStream;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isFoundryEnabled(): boolean;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
import type { AssistantMessage, Model, ToolCall } from "../types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Escape reserved Harmony control tokens in arbitrary text so it can be
|
|
4
|
+
* transported as data to a harmony-dialect model. Returns the input unchanged
|
|
5
|
+
* when it carries no reserved spelling.
|
|
6
|
+
*
|
|
7
|
+
* Callers MUST gate on a harmony target and escape only the transport copy —
|
|
8
|
+
* the persisted transcript keeps the byte-for-byte original.
|
|
9
|
+
*/
|
|
10
|
+
export declare function escapeHarmonyControlTokens(text: string): string;
|
|
11
|
+
/**
|
|
12
|
+
* Escape reserved Harmony control tokens inside a JSON document string (e.g.
|
|
13
|
+
* `function_call.arguments`). Doubles the backslash so the document remains
|
|
14
|
+
* valid JSON whose *decoded* strings carry the inert `<\|token\|>` spelling.
|
|
15
|
+
* `<|` cannot occur outside a string literal in valid JSON, so the blanket
|
|
16
|
+
* replace never corrupts structure; malformed documents are escaped
|
|
17
|
+
* best-effort.
|
|
18
|
+
*/
|
|
19
|
+
export declare function escapeHarmonyControlTokensInJson(text: string): string;
|
|
20
|
+
/**
|
|
21
|
+
* Whether requests to `model` are served by a Harmony-dialect backend
|
|
22
|
+
* (gpt-5.x / gpt-oss), which rejects reserved control-token spellings appearing
|
|
23
|
+
* as data in the request. Resolves the wire model id (`requestModelId ?? id`)
|
|
24
|
+
* so deployment/catalog aliases — e.g. an Azure alias whose `requestModelId` is
|
|
25
|
+
* `gpt-5.4` — are detected even when the local id is opaque.
|
|
26
|
+
*/
|
|
27
|
+
export declare function isHarmonyDialectModel(model: Model): boolean;
|
|
28
|
+
declare const SIGNAL_ORDER: readonly ["M", "C", "G", "S", "B", "R", "T"];
|
|
29
|
+
export type HarmonySignalClass = "H" | (typeof SIGNAL_ORDER)[number];
|
|
30
|
+
export type HarmonySurface = "assistant_text" | "assistant_thinking" | "tool_arg";
|
|
31
|
+
export interface HarmonySignal {
|
|
32
|
+
classes: HarmonySignalClass[];
|
|
33
|
+
start: number;
|
|
34
|
+
end: number;
|
|
35
|
+
text: string;
|
|
36
|
+
}
|
|
37
|
+
export interface HarmonyDetection {
|
|
38
|
+
surface: HarmonySurface;
|
|
39
|
+
contentIndex?: number;
|
|
40
|
+
toolName?: string;
|
|
41
|
+
toolCallId?: string;
|
|
42
|
+
signals: HarmonySignal[];
|
|
43
|
+
}
|
|
44
|
+
export interface HarmonyAuditEvent {
|
|
45
|
+
action: "truncate_resume" | "abort_retry" | "escalated";
|
|
46
|
+
surface: HarmonySurface;
|
|
47
|
+
signal: string;
|
|
48
|
+
retryN: number;
|
|
49
|
+
model: string;
|
|
50
|
+
provider: string;
|
|
51
|
+
toolName?: string;
|
|
52
|
+
removedLen: number;
|
|
53
|
+
removedSha8: string;
|
|
54
|
+
removedPreview: string;
|
|
55
|
+
removedBlob?: string;
|
|
56
|
+
}
|
|
57
|
+
export interface HarmonyRecoveredToolCall {
|
|
58
|
+
message: AssistantMessage;
|
|
59
|
+
removed: string;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Whether to run leak detection on responses from this model. We default-on
|
|
63
|
+
* for every openai-codex model rather than enumerating ids, so a future
|
|
64
|
+
* gpt-5.6 (or whatever) doesn't silently bypass the mitigation. Detection
|
|
65
|
+
* itself is cheap; the cost of missing a leak on a new model is not.
|
|
66
|
+
*/
|
|
67
|
+
export declare function isHarmonyLeakMitigationTarget(model: Model): boolean;
|
|
68
|
+
export declare function signalListLabel(signals: readonly HarmonySignal[]): string;
|
|
69
|
+
/**
|
|
70
|
+
* Detect harmony-protocol leakage in `text`. Returns undefined if clean.
|
|
71
|
+
*
|
|
72
|
+
* Trip rule: `H` alone, or `M` paired with at least one co-signal
|
|
73
|
+
* (`C`/`G`/`S`/`B`/`R`/`T`). Bare `M` does not trip — this document, its
|
|
74
|
+
* tests, and bug reports legitimately carry the marker.
|
|
75
|
+
*
|
|
76
|
+
* The `tool_arg` surface is held to a stricter rule. A tool argument is
|
|
77
|
+
* arbitrary file/data content that can legitimately carry the marker, a
|
|
78
|
+
* channel word, harmony control tokens, or a non-Latin script run (editing
|
|
79
|
+
* these very fixtures does exactly that). The only robust leak signal there
|
|
80
|
+
* is content trailing the structurally-valid parse, so a `tool_arg` detection
|
|
81
|
+
* additionally requires the `T` co-signal. Absent a `parsedEnd` boundary `T`
|
|
82
|
+
* is never set, so `tool_arg` scanning stays inert and a legitimate codex tool
|
|
83
|
+
* call is never hard-aborted. `assistant_text`/`assistant_thinking` keep the
|
|
84
|
+
* base rule.
|
|
85
|
+
*
|
|
86
|
+
* `parsedEnd`, when supplied, marks the byte at which a structurally valid
|
|
87
|
+
* tool-argument parse ends; markers at or past it set the `T` co-signal.
|
|
88
|
+
* `contentIndex`/`toolName`/`toolCallId` flow through to the returned
|
|
89
|
+
* detection for downstream auditing.
|
|
90
|
+
*/
|
|
91
|
+
export declare function detectHarmonyLeak(text: string, surface: HarmonySurface, options?: {
|
|
92
|
+
parsedEnd?: number;
|
|
93
|
+
contentIndex?: number;
|
|
94
|
+
toolName?: string;
|
|
95
|
+
toolCallId?: string;
|
|
96
|
+
}): HarmonyDetection | undefined;
|
|
97
|
+
/**
|
|
98
|
+
* Scan an assistant message's content blocks; return the first detection.
|
|
99
|
+
*
|
|
100
|
+
* `toolArgParseEnd`, when supplied, resolves the byte offset at which a tool
|
|
101
|
+
* call's structurally-valid argument parse ends (the `T` co-signal in
|
|
102
|
+
* {@link detectHarmonyLeak}). Callers that can parse a tool's argument DSL pass
|
|
103
|
+
* it to enable `tool_arg` leak detection; omitting it keeps that surface inert
|
|
104
|
+
* — the safe default the agent loop relies on, since it cannot bound a streamed
|
|
105
|
+
* tool DSL and must never hard-abort a legitimate tool call.
|
|
106
|
+
*/
|
|
107
|
+
export declare function detectHarmonyLeakInAssistantMessage(message: AssistantMessage, toolArgParseEnd?: (toolCall: ToolCall) => number | undefined): HarmonyDetection | undefined;
|
|
108
|
+
/**
|
|
109
|
+
* Truncate a contaminated tool call at the start of the contaminated line and
|
|
110
|
+
* append the tool's recovery sentinel. Returns a recovered AssistantMessage
|
|
111
|
+
* (containing only the cleaned tool call), a synthetic continuation user
|
|
112
|
+
* message asking the model to re-issue the rest, and the removed substring
|
|
113
|
+
* for auditing. Returns undefined when the tool is not recovery-eligible or
|
|
114
|
+
* the truncation would leave nothing meaningful to dispatch.
|
|
115
|
+
*
|
|
116
|
+
* `providerPayload` is dropped from the recovered message: for Codex the
|
|
117
|
+
* encrypted reasoning blob is opaque/signed and we cannot validate that it is
|
|
118
|
+
* uncontaminated. The model re-reasons on the next turn.
|
|
119
|
+
*/
|
|
120
|
+
export declare function recoverHarmonyToolCall(message: AssistantMessage, detection: HarmonyDetection): HarmonyRecoveredToolCall | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Return the contaminated substring from `message` for audit purposes when
|
|
123
|
+
* recovery is not applicable (abort path). Walks from the first detected
|
|
124
|
+
* signal to end-of-content within the relevant block. Returns "" if the
|
|
125
|
+
* detection cannot be resolved against the message.
|
|
126
|
+
*/
|
|
127
|
+
export declare function extractHarmonyRemoved(message: AssistantMessage, detection: HarmonyDetection): string;
|
|
128
|
+
export declare function createHarmonyAuditEvent(params: {
|
|
129
|
+
action: HarmonyAuditEvent["action"];
|
|
130
|
+
detection: HarmonyDetection;
|
|
131
|
+
model: Model;
|
|
132
|
+
retryN: number;
|
|
133
|
+
removed: string;
|
|
134
|
+
}): HarmonyAuditEvent;
|
|
135
|
+
export {};
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
export type RawHttpRequestDump = {
|
|
2
|
+
provider: string;
|
|
3
|
+
api: string;
|
|
4
|
+
model: string;
|
|
5
|
+
method?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
body?: unknown;
|
|
9
|
+
};
|
|
10
|
+
export type CapturedHttpErrorResponse = {
|
|
11
|
+
status: number;
|
|
12
|
+
headers?: Headers;
|
|
13
|
+
bodyText?: string;
|
|
14
|
+
bodyJson?: unknown;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* Build the JSON persisted for a rejected request. Request fields stay at the
|
|
18
|
+
* top level (so existing dump parsers still read `body`); the provider's error
|
|
19
|
+
* is added under `errorResponse` so a failed request is diagnosable from the
|
|
20
|
+
* dump file rather than the request alone.
|
|
21
|
+
*/
|
|
22
|
+
export declare function buildHttp400DumpPayload(dump: RawHttpRequestDump, error: unknown, message: string): RawHttpRequestDump & {
|
|
23
|
+
errorResponse: {
|
|
24
|
+
status: number | undefined;
|
|
25
|
+
message: string;
|
|
26
|
+
};
|
|
27
|
+
};
|
|
28
|
+
/** HTTP statuses whose rejected request we persist for post-hoc diagnosis: the
|
|
29
|
+
* request-content rejections that wedge a session. 400 (bad request) and 413
|
|
30
|
+
* (payload too large — an oversized image / snapcompact frame payload that 413s
|
|
31
|
+
* and empties the turn). Auth (401/403), not-found (404), rate limits and 5xx
|
|
32
|
+
* are excluded: 429/5xx are retried, so persisting them here would write one
|
|
33
|
+
* dump per attempt. */
|
|
34
|
+
export declare function shouldDumpRejectedRequest(error: unknown): boolean;
|
|
35
|
+
export declare function appendRawHttpRequestDumpFor400(message: string, error: unknown, dump: RawHttpRequestDump | undefined): Promise<string>;
|
|
36
|
+
export declare function finalizeErrorMessage(error: unknown, rawRequestDump: RawHttpRequestDump | undefined, capturedErrorResponse?: CapturedHttpErrorResponse): Promise<string>;
|
|
37
|
+
/**
|
|
38
|
+
* Rewrite error message for GitHub Copilot request failures.
|
|
39
|
+
* Must run AFTER finalizeErrorMessage since it replaces the message entirely.
|
|
40
|
+
*
|
|
41
|
+
* 400 `model_not_supported` = Copilot fleet skew. A model that `/models`
|
|
42
|
+
* advertises can flap between 200 and 400 because only part of
|
|
43
|
+
* Copilot's fleet has it in the integrator allowlist. After the
|
|
44
|
+
* in-request retry exhausts, surface guidance rather than the raw error.
|
|
45
|
+
* 401 = token invalid/expired → credential removal is safe, prompt re-login.
|
|
46
|
+
* 403 = token valid but access denied (plan, model policy, org restriction) →
|
|
47
|
+
* do NOT reuse the auth-failed string (which triggers credential removal).
|
|
48
|
+
*/
|
|
49
|
+
export declare function rewriteCopilotError(errorMessage: string, error: unknown, provider: string): string;
|
|
@@ -0,0 +1,149 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the idle timeout used for provider streaming transports.
|
|
3
|
+
*
|
|
4
|
+
* `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` is accepted as a backward-compatible alias.
|
|
5
|
+
* Set `PI_STREAM_IDLE_TIMEOUT_MS=0` to disable the watchdog.
|
|
6
|
+
*
|
|
7
|
+
* Providers that legitimately stream much slower than the global default can pass
|
|
8
|
+
* `fallbackMs` to widen the floor used when neither env var nor caller option is set.
|
|
9
|
+
* Caller options still take precedence; env overrides still trump the fallback.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getStreamIdleTimeoutMs(fallbackMs?: number): number | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the idle timeout used for OpenAI-family streaming transports.
|
|
14
|
+
*
|
|
15
|
+
* `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` takes precedence over the generic
|
|
16
|
+
* `PI_STREAM_IDLE_TIMEOUT_MS` because some deployments tune OpenAI-compatible
|
|
17
|
+
* backends separately from Anthropic/Gemini-style transports.
|
|
18
|
+
*
|
|
19
|
+
* Set `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS=0` to disable the watchdog.
|
|
20
|
+
*/
|
|
21
|
+
export declare function getOpenAIStreamIdleTimeoutMs(fallbackMs?: number): number | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Returns the timeout used while waiting for the first stream event.
|
|
24
|
+
* The first token can legitimately take longer than later inter-event gaps,
|
|
25
|
+
* so the default never undershoots the steady-state idle timeout.
|
|
26
|
+
*
|
|
27
|
+
* Set `PI_STREAM_FIRST_EVENT_TIMEOUT_MS=0` to disable the watchdog.
|
|
28
|
+
*
|
|
29
|
+
* Providers whose first response can legitimately take longer (heavy reasoning,
|
|
30
|
+
* slow cold-start proxies) can pass `fallbackMs` to widen the floor used when
|
|
31
|
+
* neither env var nor caller option is set. Caller options still take precedence;
|
|
32
|
+
* env overrides still trump the fallback.
|
|
33
|
+
*/
|
|
34
|
+
export declare function getStreamFirstEventTimeoutMs(idleTimeoutMs?: number, fallbackMs?: number): number | undefined;
|
|
35
|
+
/**
|
|
36
|
+
* Returns the first-event timeout used for OpenAI-family streaming transports.
|
|
37
|
+
*
|
|
38
|
+
* Precedence: explicit `PI_OPENAI_STREAM_FIRST_EVENT_TIMEOUT_MS` (including a
|
|
39
|
+
* `"0"` disable) wins outright. Otherwise the resolved idle (caller-supplied
|
|
40
|
+
* `idleTimeoutMs` — which itself already encompasses per-call
|
|
41
|
+
* `streamIdleTimeoutMs` or `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` resolved
|
|
42
|
+
* upstream) floors the first-event budget so slow OpenAI-compatible servers
|
|
43
|
+
* are not undercut by a shorter `PI_STREAM_FIRST_EVENT_TIMEOUT_MS` or the
|
|
44
|
+
* global default during prompt processing. A zero per-provider fallback
|
|
45
|
+
* disables the first-event watchdog unless an environment override is set.
|
|
46
|
+
*
|
|
47
|
+
* Returns `0` when an explicit env knob or per-provider fallback disables the
|
|
48
|
+
* watchdog, preserving the sentinel through iterator timeout resolution.
|
|
49
|
+
*/
|
|
50
|
+
export declare function getOpenAIStreamFirstEventTimeoutMs(idleTimeoutMs?: number, fallbackMs?: number): number | undefined;
|
|
51
|
+
/**
|
|
52
|
+
* Arms a clearable pre-response (time-to-first-byte) abort guard for a streaming
|
|
53
|
+
* fetch, combined with the caller's signal.
|
|
54
|
+
*
|
|
55
|
+
* `AbortSignal.timeout(ms)` is an *absolute* wall-clock deadline: once handed to
|
|
56
|
+
* `fetch` it keeps governing the request after the response headers arrive, so
|
|
57
|
+
* it aborts an actively-streaming body the moment it fires — not just a stalled
|
|
58
|
+
* pre-response request (issue #2422 regression: large `write` tool-call streams
|
|
59
|
+
* died at the budget with `TimeoutError: The operation timed out.` despite
|
|
60
|
+
* deltas actively flowing). This arms a `clearTimeout`-able timer instead;
|
|
61
|
+
* callers MUST `clear()` as soon as the guarded transport attempt settles so
|
|
62
|
+
* the body stream is left to the iterator-level idle watchdog.
|
|
63
|
+
*
|
|
64
|
+
* Retrying callers MUST arm a fresh guard for each transport attempt and keep
|
|
65
|
+
* the retry loop's base signal reserved for caller cancellation. Reusing the
|
|
66
|
+
* guard as the loop signal makes its timeout indistinguishable from cancellation.
|
|
67
|
+
*
|
|
68
|
+
* Returns the caller signal unchanged (and a no-op `clear`) when no positive
|
|
69
|
+
* timeout is configured.
|
|
70
|
+
*/
|
|
71
|
+
export declare function armPreResponseTimeout(callerSignal: AbortSignal | undefined, timeoutMs: number | undefined): {
|
|
72
|
+
signal: AbortSignal | undefined;
|
|
73
|
+
clear: () => void;
|
|
74
|
+
};
|
|
75
|
+
export interface IdleTimeoutIteratorOptions {
|
|
76
|
+
idleTimeoutMs?: number;
|
|
77
|
+
firstItemTimeoutMs?: number;
|
|
78
|
+
errorMessage: string;
|
|
79
|
+
firstItemErrorMessage?: string;
|
|
80
|
+
onIdle?: () => void;
|
|
81
|
+
onFirstItemTimeout?: () => void;
|
|
82
|
+
/**
|
|
83
|
+
* Optional semantic-progress predicate. Non-progress items are still yielded,
|
|
84
|
+
* but they do not reset the idle deadline. This prevents provider
|
|
85
|
+
* keepalive/no-op events from keeping a stalled tool call alive forever.
|
|
86
|
+
*/
|
|
87
|
+
isProgressItem?: (item: unknown) => boolean;
|
|
88
|
+
/**
|
|
89
|
+
* Reports consumer-side local work in flight for the stream: the provider
|
|
90
|
+
* transport is waiting on a server-requested local tool bridge (e.g. the
|
|
91
|
+
* Cursor exec channel) before anything can flow upstream again. While it
|
|
92
|
+
* returns true, an expired idle / first-item deadline slides forward
|
|
93
|
+
* instead of aborting — the silence is ours, not a provider stall. The
|
|
94
|
+
* watchdog re-arms with a full budget once the local work completes, so a
|
|
95
|
+
* provider that stalls afterwards is still caught.
|
|
96
|
+
*/
|
|
97
|
+
hasPendingLocalWork?: () => boolean;
|
|
98
|
+
/**
|
|
99
|
+
* Cancel iteration as soon as this signal aborts. Required for caller-driven
|
|
100
|
+
* cancellation (ESC) when the underlying transport does not surface signal
|
|
101
|
+
* aborts to the iterator (HTTP/2 proxies, native sockets, mocked fetch).
|
|
102
|
+
* Without this, the consumer sleeps on iterator.next() until the idle/first
|
|
103
|
+
* -event watchdog fires — observable as the issue #912 "Working… forever"
|
|
104
|
+
* symptom on the github-copilot provider.
|
|
105
|
+
*/
|
|
106
|
+
abortSignal?: AbortSignal;
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* Yields items from an async iterable while enforcing a maximum idle gap between items.
|
|
110
|
+
*
|
|
111
|
+
* The first item may use a shorter timeout so stuck requests can be aborted and retried
|
|
112
|
+
* before any user-visible content has streamed.
|
|
113
|
+
*/
|
|
114
|
+
export declare function iterateWithIdleTimeout<T>(iterable: AsyncIterable<T>, options: IdleTimeoutIteratorOptions): AsyncGenerator<T>;
|
|
115
|
+
export interface TerminalGraceIteratorOptions {
|
|
116
|
+
/**
|
|
117
|
+
* Epoch-ms timestamp at which the consumer observed a logically terminal
|
|
118
|
+
* item (e.g. a chat-completions chunk carrying `finish_reason`), or
|
|
119
|
+
* `undefined` while the stream is still mid-response. Read before every
|
|
120
|
+
* pull, so the consumer can flip it between yields.
|
|
121
|
+
*/
|
|
122
|
+
finishedAtMs: () => number | undefined;
|
|
123
|
+
/**
|
|
124
|
+
* Post-terminal budget: how long after `finishedAtMs()` to keep draining
|
|
125
|
+
* trailing items (e.g. a usage-only chunk or the `[DONE]` sentinel) before
|
|
126
|
+
* ending the iteration cleanly. The deadline is fixed at
|
|
127
|
+
* `finishedAtMs() + graceMs`; trailing items do not extend it, so
|
|
128
|
+
* keepalive-only servers cannot hold the stream open.
|
|
129
|
+
*/
|
|
130
|
+
graceMs: number;
|
|
131
|
+
/**
|
|
132
|
+
* Invoked when the grace window closes with the source still open. Use it
|
|
133
|
+
* to abort the underlying request: the source generator is typically parked
|
|
134
|
+
* mid-`next()` (not at a yield), so a queued `.return()` alone cannot reach
|
|
135
|
+
* the transport until that pending read settles.
|
|
136
|
+
*/
|
|
137
|
+
onGraceEnd?: () => void;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Yields items from an async iterable until the consumer marks the stream
|
|
141
|
+
* logically finished AND the source stays silent past a short grace window.
|
|
142
|
+
*
|
|
143
|
+
* Misbehaving OpenAI-compatible servers deliver the terminal chunk but never
|
|
144
|
+
* send `[DONE]` nor close the connection; without this guard the consumer
|
|
145
|
+
* hangs on `iterator.next()` until the idle watchdog converts an
|
|
146
|
+
* already-successful turn into a timeout error. Grace expiry is a clean end
|
|
147
|
+
* of iteration, never an error.
|
|
148
|
+
*/
|
|
149
|
+
export declare function iterateWithTerminalGrace<T>(iterable: AsyncIterable<T>, options: TerminalGraceIteratorOptions): AsyncGenerator<T>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Central live healing for leaked reasoning markup in the visible text channel.
|
|
3
|
+
*
|
|
4
|
+
* Some providers emit their canonical reasoning idioms (` ```thinking `,
|
|
5
|
+
* `<think>`, Gemma/Harmony channels, …) into the *visible* text stream instead
|
|
6
|
+
* of a structured thinking part. {@link wrapLeakedThinkingStream} re-projects a
|
|
7
|
+
* provider stream into a fresh {@link AssistantMessageEventStream}, splitting the
|
|
8
|
+
* leaked fences out into proper `thinking` blocks *live* as deltas arrive.
|
|
9
|
+
*
|
|
10
|
+
* Applied to every provider stream *except* official first-party endpoints
|
|
11
|
+
* (the official Anthropic API and the official OpenAI / OpenAI-Codex endpoints),
|
|
12
|
+
* which return structured thinking and never leak — `healLeakedThinking` in
|
|
13
|
+
* `../stream.ts` gates the wrap so the healer cannot misfire on legitimate
|
|
14
|
+
* fenced content those models emit as visible text.
|
|
15
|
+
*
|
|
16
|
+
* The healing is idempotent: a second pass over already-clean text finds no
|
|
17
|
+
* fences, so wrapping a provider that already heals (or wrapping twice) is a
|
|
18
|
+
* harmless pass-through. Signatures are load-bearing for Google/Gemini/Vertex
|
|
19
|
+
* thought round-tripping, so text sub-blocks carry the source `textSignature`,
|
|
20
|
+
* forwarded thinking blocks their `thinkingSignature`, and forwarded tool calls
|
|
21
|
+
* their `thoughtSignature`.
|
|
22
|
+
*
|
|
23
|
+
* Modeled on {@link wrapInbandToolStream} / `InbandStreamProjector` in
|
|
24
|
+
* `../dialect/owned-stream.ts`, minus all in-band tool-call grammar: tool-call
|
|
25
|
+
* events are forwarded verbatim.
|
|
26
|
+
*/
|
|
27
|
+
import { AssistantMessageEventStream } from "./event-stream.js";
|
|
28
|
+
/**
|
|
29
|
+
* Wrap a provider stream so leaked reasoning fences are healed into thinking
|
|
30
|
+
* blocks live, for every provider. Returns a new stream that re-projects the
|
|
31
|
+
* inner one; the inner stream is fully consumed.
|
|
32
|
+
*/
|
|
33
|
+
export declare function wrapLeakedThinkingStream(inner: AssistantMessageEventStream): AssistantMessageEventStream;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JSON-POST → SSE transport for OpenAI-wire streaming endpoints (chat
|
|
3
|
+
* completions, responses, azure responses). Replaces the `openai` SDK client:
|
|
4
|
+
*
|
|
5
|
+
* - Retries: `fetchWithRetry` (Retry-After/quota-hint aware; 5xx/408/429 and
|
|
6
|
+
* transient network errors). Default 6 total attempts — parity with the
|
|
7
|
+
* SDK's former `maxRetries: 5`.
|
|
8
|
+
* - SSE decode: `readSseJson` (spec-compliant framing, `[DONE]`-aware).
|
|
9
|
+
* `onSseEvent` observers now receive real wire frames instead of events
|
|
10
|
+
* re-synthesized from decoded SDK objects.
|
|
11
|
+
* - Errors: {@link OpenAIHttpError} exposes `status`/`headers`/`code`
|
|
12
|
+
* structurally (ProviderHttpError contract — `extractHttpStatusFromError`,
|
|
13
|
+
* retry-after extraction, copilot transient classification) and carries the
|
|
14
|
+
* captured response body for the strict-tools fallback and the responses
|
|
15
|
+
* chain-state detectors, which regex over `error.message`.
|
|
16
|
+
*/
|
|
17
|
+
import { type SseEventObserver } from "@linxiraos/pi-utils";
|
|
18
|
+
import * as AIError from "../error/index.js";
|
|
19
|
+
import { OpenAIHttpError } from "../error/index.js";
|
|
20
|
+
export { OpenAIHttpError };
|
|
21
|
+
import type { FetchImpl } from "../types.js";
|
|
22
|
+
export interface OpenAIStreamRequestInit {
|
|
23
|
+
url: string;
|
|
24
|
+
headers: Record<string, string>;
|
|
25
|
+
/** JSON request body; serialized once per call (retries resend the same bytes). */
|
|
26
|
+
body: unknown;
|
|
27
|
+
signal: AbortSignal;
|
|
28
|
+
fetch?: FetchImpl;
|
|
29
|
+
/** Raw wire-frame observer (`onSseEvent` debug pipeline). */
|
|
30
|
+
onSseEvent?: SseEventObserver;
|
|
31
|
+
}
|
|
32
|
+
export interface OpenAIStreamHandle<TEvent> {
|
|
33
|
+
/** Decoded `data:` payloads; terminates on `[DONE]` or stream end. */
|
|
34
|
+
events: AsyncGenerator<TEvent>;
|
|
35
|
+
response: Response;
|
|
36
|
+
/** `x-request-id` response header (the SDK's former `request_id`). */
|
|
37
|
+
requestId: string | null;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* POST a JSON body and stream back decoded SSE events.
|
|
41
|
+
*
|
|
42
|
+
* Throws {@link OpenAIHttpError} on a non-2xx terminal response. Aborts on
|
|
43
|
+
* `signal` propagate from `fetchWithRetry`/`readSseJson`; callers own the
|
|
44
|
+
* watchdog timers and abort-reason bookkeeping.
|
|
45
|
+
*/
|
|
46
|
+
export declare function postOpenAIStream<TEvent>(init: OpenAIStreamRequestInit): Promise<OpenAIStreamHandle<TEvent>>;
|
|
47
|
+
/** Decode a non-2xx response into an {@link OpenAIHttpError} without consuming it twice. */
|
|
48
|
+
export declare function captureOpenAIHttpError(response: Response): Promise<AIError.OpenAIHttpError>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function getOpenRouterHeaders(): Record<string, string>;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared `host:port` parser used by the auth-broker and auth-gateway boot
|
|
3
|
+
* paths. Centralized so the two servers can't drift on what they accept (the
|
|
4
|
+
* gateway used to silently allow empty hostnames; this fixes it).
|
|
5
|
+
*/
|
|
6
|
+
export interface ParsedBind {
|
|
7
|
+
hostname: string;
|
|
8
|
+
port: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Parse a `host:port` (or bare `port`, which assumes loopback) string.
|
|
12
|
+
*
|
|
13
|
+
* Accepts:
|
|
14
|
+
* - `"4000"` → `127.0.0.1:4000`
|
|
15
|
+
* - `"0.0.0.0:4000"` → as written
|
|
16
|
+
* - `"[::1]:4000"` → as written (brackets retained, Bun handles them)
|
|
17
|
+
*
|
|
18
|
+
* Rejects:
|
|
19
|
+
* - empty input
|
|
20
|
+
* - empty hostname (`":4000"`)
|
|
21
|
+
* - non-integer / out-of-range port
|
|
22
|
+
*/
|
|
23
|
+
export declare function parseBind(raw: string): ParsedBind;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { Api, Model, ProviderResponseMetadata, StreamOptions } from "../types.js";
|
|
2
|
+
export declare function normalizeProviderResponse(response: Response, requestId?: string | null, metadata?: Record<string, unknown>): ProviderResponseMetadata;
|
|
3
|
+
export declare function notifyProviderResponse(options: Pick<StreamOptions, "onResponse"> | undefined, response: Response, model?: Model<Api>, requestId?: string | null, metadata?: Record<string, unknown>): Promise<void>;
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as tls from "node:tls";
|
|
2
|
+
import type { FetchImpl } from "../types.js";
|
|
3
|
+
/**
|
|
4
|
+
* Checks if a host is local or cloud metadata, which should always bypass the proxy
|
|
5
|
+
* (e.g. localhost, 127/8, ::1, 169.254.169.254, metadata.google.internal).
|
|
6
|
+
*/
|
|
7
|
+
export declare function isLocalOrMetadataHost(host: string): boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Check if the url should bypass the proxy due to hard-coded localhost/metadata checks
|
|
10
|
+
* or custom NO_PROXY/no_proxy environment variables rules.
|
|
11
|
+
*/
|
|
12
|
+
export declare function shouldBypassProxy(urlObj: URL): boolean;
|
|
13
|
+
/** Test seam: clears the provider proxy cache. */
|
|
14
|
+
export declare function __resetProxyCache(): void;
|
|
15
|
+
/**
|
|
16
|
+
* Normalizes provider id (e.g. github-copilot -> PI_PROXY_GITHUB_COPILOT) and looks it up.
|
|
17
|
+
* If not found, falls back to PI_PROXY. Results are memoized because env values are static
|
|
18
|
+
* for the lifetime of the process and this function is called for every outgoing request.
|
|
19
|
+
*/
|
|
20
|
+
export declare function getProxyForProvider(provider: string): string | undefined;
|
|
21
|
+
/** Resolves provider-specific and standard proxy variables for a target URL, honoring NO_PROXY. */
|
|
22
|
+
export declare function getProxyForUrl(provider: string, url: URL): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* Wraps a fetch implementation to inject proxy options for non-local hosts.
|
|
25
|
+
*/
|
|
26
|
+
export declare function wrapFetchForProxy(fetchImpl: FetchImpl, provider: string): FetchImpl;
|
|
27
|
+
export interface ConnectProxiedSocketOptions {
|
|
28
|
+
/** Caller cancellation for the proxy TCP/TLS handshake and CONNECT tunnel. */
|
|
29
|
+
signal?: AbortSignal;
|
|
30
|
+
/** Maximum wall-clock time to establish the final TLS tunnel. Disabled when absent or non-positive. */
|
|
31
|
+
timeoutMs?: number;
|
|
32
|
+
/** Target TLS profile. Cursor defaults to HTTP/2 when this is absent. */
|
|
33
|
+
tls?: tls.ConnectionOptions;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Tunnel a socket connection through an HTTP CONNECT proxy.
|
|
37
|
+
* This is used specifically to wrap Node's `http2.connect(baseUrl, { createConnection })` for Cursor.
|
|
38
|
+
*/
|
|
39
|
+
export declare function connectProxiedSocket(proxyUrlStr: string, targetUrlStr: string, options?: ConnectProxiedSocketOptions): Promise<tls.TLSSocket>;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { FetchImpl } from "../types.js";
|
|
2
|
+
export type RequestDebugHeaders = Headers | Record<string, string | string[] | number | undefined | null> | undefined;
|
|
3
|
+
export interface RequestDebugPayload {
|
|
4
|
+
method: string;
|
|
5
|
+
url: string;
|
|
6
|
+
headers?: RequestDebugHeaders;
|
|
7
|
+
body?: unknown;
|
|
8
|
+
bodyText?: string;
|
|
9
|
+
bodyBase64?: string;
|
|
10
|
+
bodyUnavailable?: string;
|
|
11
|
+
protocol?: string;
|
|
12
|
+
}
|
|
13
|
+
export interface RequestDebugResponseLog {
|
|
14
|
+
write(chunk: Uint8Array | string): void;
|
|
15
|
+
close(): Promise<void>;
|
|
16
|
+
}
|
|
17
|
+
export interface RequestDebugSession {
|
|
18
|
+
readonly id: number;
|
|
19
|
+
readonly requestPath: string;
|
|
20
|
+
readonly responsePath: string;
|
|
21
|
+
openResponseLog(statusLine: string, headers?: RequestDebugHeaders): Promise<RequestDebugResponseLog>;
|
|
22
|
+
wrapResponse(response: Response): Promise<Response>;
|
|
23
|
+
}
|
|
24
|
+
export declare function isRequestDebugEnabled(): boolean;
|
|
25
|
+
export declare function wrapFetchForRequestDebug(fetchImpl: FetchImpl): FetchImpl;
|
|
26
|
+
export declare function withRequestDebugFetch<T extends {
|
|
27
|
+
fetch?: FetchImpl;
|
|
28
|
+
} | undefined>(options: T): T;
|
|
29
|
+
export declare function createRequestDebugSession(payload: RequestDebugPayload): Promise<RequestDebugSession>;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type HeadersLike = Headers | Record<string, string | undefined> | undefined | null;
|
|
2
|
+
export declare function formatErrorMessageWithRetryAfter(error: unknown, headers?: HeadersLike): string;
|
|
3
|
+
export declare function getRetryAfterMsFromHeaders(headers: HeadersLike): number | undefined;
|
|
4
|
+
export declare function getHeadersFromError(error: unknown): HeadersLike;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { isCopilotTransientModelError } from "../error/flags.js";
|
|
2
|
+
export { isCopilotTransientModelError };
|
|
3
|
+
/**
|
|
4
|
+
* Wrap an initial Copilot request so transient `model_not_supported` 400s are
|
|
5
|
+
* retried a small number of times. No-op for non-Copilot providers.
|
|
6
|
+
*
|
|
7
|
+
* The callback **MUST** create a fresh in-flight request each invocation — a
|
|
8
|
+
* once-consumed AsyncIterable cannot be re-iterated.
|
|
9
|
+
*/
|
|
10
|
+
export declare function callWithCopilotModelRetry<T>(fn: () => Promise<T>, options: {
|
|
11
|
+
provider: string;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
retryBaseDelayMs?: number;
|
|
14
|
+
}): Promise<T>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Set when callers want to globally bypass OpenAI strict-mode enforcement
|
|
3
|
+
* (e.g. for debugging a provider that misreports strict support, or when
|
|
4
|
+
* comparing strict vs non-strict outputs).
|
|
5
|
+
*
|
|
6
|
+
* Honored by every provider that emits `strict: true` on its function tools —
|
|
7
|
+
* see `openai-completions`, `openai-responses`, `openai-codex-responses`, and
|
|
8
|
+
* the strict candidate selection in `anthropic`.
|
|
9
|
+
*/
|
|
10
|
+
export declare const NO_STRICT: boolean;
|
|
11
|
+
/**
|
|
12
|
+
* Consolidated helper for OpenAI-style strict schema enforcement.
|
|
13
|
+
*
|
|
14
|
+
* Each provider computes its own `strict` boolean (logic differs), then calls
|
|
15
|
+
* this to handle the tryEnforceStrictSchema dance uniformly:
|
|
16
|
+
* - Draft-07-shaped inputs are upgraded to draft 2020-12 first.
|
|
17
|
+
* - If `strict` is false, passes the upgraded schema through unchanged.
|
|
18
|
+
* - If `strict` is true, attempts to enforce strict mode; falls back to
|
|
19
|
+
* non-strict if the schema isn't representable.
|
|
20
|
+
*/
|
|
21
|
+
export declare function adaptSchemaForStrict(schema: Record<string, unknown>, strict: boolean): {
|
|
22
|
+
schema: Record<string, unknown>;
|
|
23
|
+
strict: boolean;
|
|
24
|
+
};
|