@vib-rato/ai 0.16.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 +3354 -0
- package/README.md +1194 -0
- package/dist/types/adapter-internals/provider-safety-stop.d.ts +45 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +80 -0
- package/dist/types/auth-broker/index.d.ts +5 -0
- package/dist/types/auth-broker/redact.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +153 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/types.d.ts +132 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +555 -0
- package/dist/types/auth-gateway/http.d.ts +40 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +70 -0
- package/dist/types/auth-gateway/types.d.ts +129 -0
- package/dist/types/auth-storage.d.ts +1074 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/codex-tools.d.ts +4 -0
- package/dist/types/context-cap-policy.d.ts +68 -0
- package/dist/types/core.d.ts +35 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/model-cache.d.ts +24 -0
- package/dist/types/model-manager.d.ts +77 -0
- package/dist/types/model-pricing.d.ts +3 -0
- package/dist/types/model-retirements.d.ts +6 -0
- package/dist/types/model-thinking.d.ts +100 -0
- package/dist/types/models.d.ts +21 -0
- package/dist/types/openai-completions-compat.d.ts +34 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/provider-models/bundled-references.d.ts +4 -0
- package/dist/types/provider-models/descriptors.d.ts +48 -0
- package/dist/types/provider-models/google.d.ts +20 -0
- package/dist/types/provider-models/index.d.ts +5 -0
- package/dist/types/provider-models/ollama.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +293 -0
- package/dist/types/provider-models/special.d.ts +29 -0
- package/dist/types/providers/amazon-bedrock.d.ts +60 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic.d.ts +280 -0
- package/dist/types/providers/aws-credential-config.d.ts +19 -0
- package/dist/types/providers/aws-credentials.d.ts +43 -0
- package/dist/types/providers/aws-eventstream.d.ts +38 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +22 -0
- package/dist/types/providers/composer-discipline.d.ts +32 -0
- package/dist/types/providers/cursor/client-version.d.ts +10 -0
- package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +16769 -0
- package/dist/types/providers/cursor-pi-args.d.ts +119 -0
- package/dist/types/providers/cursor.d.ts +72 -0
- package/dist/types/providers/dashscope-token-plan-headers.d.ts +57 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +26 -0
- package/dist/types/providers/google-gemini-cli.d.ts +75 -0
- package/dist/types/providers/google-gemini-headers.d.ts +43 -0
- package/dist/types/providers/google-shared.d.ts +183 -0
- package/dist/types/providers/google-types.d.ts +138 -0
- package/dist/types/providers/google-vertex.d.ts +11 -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/kiro-api-key.d.ts +50 -0
- package/dist/types/providers/kiro-codewhisperer.d.ts +11 -0
- package/dist/types/providers/mock.d.ts +189 -0
- package/dist/types/providers/ollama.d.ts +41 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-bounded-rate-limits.d.ts +3 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +1733 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-codex/constants.d.ts +26 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +50 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +18 -0
- package/dist/types/providers/openai-codex-responses.d.ts +71 -0
- package/dist/types/providers/openai-completions-compat.d.ts +6 -0
- package/dist/types/providers/openai-completions.d.ts +35 -0
- package/dist/types/providers/openai-opencodex-responses.d.ts +10 -0
- package/dist/types/providers/openai-request-transform.d.ts +4 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-shared.d.ts +106 -0
- package/dist/types/providers/openai-responses.d.ts +37 -0
- package/dist/types/providers/pi-native-client.d.ts +29 -0
- package/dist/types/providers/pi-native-server.d.ts +60 -0
- package/dist/types/providers/register-builtins.d.ts +59 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +33 -0
- package/dist/types/providers/vision-guard.d.ts +8 -0
- package/dist/types/rate-limit-utils.d.ts +19 -0
- package/dist/types/stream.d.ts +45 -0
- package/dist/types/types.d.ts +1073 -0
- package/dist/types/usage/claude.d.ts +3 -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 +2 -0
- package/dist/types/usage/grok-cli.d.ts +17 -0
- package/dist/types/usage/kimi.d.ts +4 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +264 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/anthropic-auth.d.ts +39 -0
- package/dist/types/utils/block-symbols.d.ts +6 -0
- package/dist/types/utils/discovery/antigravity.d.ts +67 -0
- package/dist/types/utils/discovery/codex.d.ts +38 -0
- package/dist/types/utils/discovery/cursor.d.ts +49 -0
- package/dist/types/utils/discovery/gemini.d.ts +25 -0
- package/dist/types/utils/discovery/index.d.ts +4 -0
- package/dist/types/utils/discovery/openai-compatible.d.ts +81 -0
- package/dist/types/utils/event-stream.d.ts +41 -0
- package/dist/types/utils/fallback-transport.d.ts +110 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +11 -0
- package/dist/types/utils/h2-fetch.d.ts +22 -0
- package/dist/types/utils/http-inspector.d.ts +59 -0
- package/dist/types/utils/idle-iterator.d.ts +122 -0
- package/dist/types/utils/json-parse.d.ts +98 -0
- package/dist/types/utils/oauth/alibaba-token-plan.d.ts +19 -0
- package/dist/types/utils/oauth/anthropic.d.ts +41 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +38 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +39 -0
- package/dist/types/utils/oauth/bizrouter.d.ts +1 -0
- package/dist/types/utils/oauth/callback-server.d.ts +80 -0
- package/dist/types/utils/oauth/cerebras.d.ts +1 -0
- package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/commandcode.d.ts +1 -0
- package/dist/types/utils/oauth/cursor.d.ts +15 -0
- package/dist/types/utils/oauth/deepinfra.d.ts +1 -0
- package/dist/types/utils/oauth/deepseek.d.ts +10 -0
- package/dist/types/utils/oauth/firepass.d.ts +1 -0
- package/dist/types/utils/oauth/fireworks.d.ts +1 -0
- package/dist/types/utils/oauth/fugu.d.ts +1 -0
- package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
- package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/utils/oauth/glm-zcode.d.ts +71 -0
- package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
- package/dist/types/utils/oauth/huggingface.d.ts +19 -0
- package/dist/types/utils/oauth/index.d.ts +39 -0
- package/dist/types/utils/oauth/kagi.d.ts +17 -0
- package/dist/types/utils/oauth/kilo.d.ts +5 -0
- package/dist/types/utils/oauth/kimi.d.ts +17 -0
- package/dist/types/utils/oauth/kiro.d.ts +71 -0
- package/dist/types/utils/oauth/litellm.d.ts +18 -0
- package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
- package/dist/types/utils/oauth/mara.d.ts +1 -0
- package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
- package/dist/types/utils/oauth/moonshot.d.ts +1 -0
- package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
- package/dist/types/utils/oauth/nvidia.d.ts +18 -0
- package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
- package/dist/types/utils/oauth/ollama.d.ts +18 -0
- package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
- package/dist/types/utils/oauth/opencode.d.ts +18 -0
- package/dist/types/utils/oauth/opengateway.d.ts +1 -0
- package/dist/types/utils/oauth/openrouter.d.ts +1 -0
- package/dist/types/utils/oauth/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +4 -0
- package/dist/types/utils/oauth/pkce.d.ts +8 -0
- package/dist/types/utils/oauth/qianfan.d.ts +17 -0
- package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
- package/dist/types/utils/oauth/sglang.d.ts +16 -0
- package/dist/types/utils/oauth/synthetic.d.ts +1 -0
- package/dist/types/utils/oauth/tavily.d.ts +17 -0
- package/dist/types/utils/oauth/together.d.ts +1 -0
- package/dist/types/utils/oauth/types.d.ts +56 -0
- package/dist/types/utils/oauth/venice.d.ts +18 -0
- package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/vllm.d.ts +16 -0
- package/dist/types/utils/oauth/xai.d.ts +30 -0
- package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
- package/dist/types/utils/oauth/zai.d.ts +18 -0
- package/dist/types/utils/oauth/zenmux.d.ts +1 -0
- package/dist/types/utils/overflow.d.ts +14 -0
- package/dist/types/utils/parse-bind.d.ts +26 -0
- package/dist/types/utils/provider-response.d.ts +6 -0
- package/dist/types/utils/provider-safety-stop.d.ts +8 -0
- package/dist/types/utils/proxy.d.ts +7 -0
- package/dist/types/utils/retry-after.d.ts +3 -0
- package/dist/types/utils/retry-budget.d.ts +1 -0
- package/dist/types/utils/retry.d.ts +29 -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 +49 -0
- package/dist/types/utils/schema/index.d.ts +14 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +93 -0
- package/dist/types/utils/schema/root-combinator.d.ts +12 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +25 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/wire.d.ts +54 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sse-debug.d.ts +10 -0
- package/dist/types/utils/tool-call-healing.d.ts +80 -0
- package/dist/types/utils/tool-choice-capability.d.ts +57 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +17 -0
- package/dist/types/utils.d.ts +117 -0
- package/package.json +152 -0
- package/src/adapter-internals/provider-safety-stop.d.ts +45 -0
- package/src/adapter-internals/provider-safety-stop.ts +156 -0
- package/src/api-registry.d.ts +30 -0
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +444 -0
- package/src/auth-broker/index.ts +5 -0
- package/src/auth-broker/redact.ts +39 -0
- package/src/auth-broker/refresher.ts +130 -0
- package/src/auth-broker/remote-store.ts +1576 -0
- package/src/auth-broker/server.ts +764 -0
- package/src/auth-broker/types.ts +164 -0
- package/src/auth-broker/wire-schemas.ts +261 -0
- package/src/auth-gateway/http.ts +198 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +1315 -0
- package/src/auth-gateway/types.ts +160 -0
- package/src/auth-storage.ts +7312 -0
- package/src/cli.ts +269 -0
- package/src/codex-tools.d.ts +4 -0
- package/src/codex-tools.ts +24 -0
- package/src/context-cap-policy.d.ts +68 -0
- package/src/context-cap-policy.ts +123 -0
- package/src/core.ts +44 -0
- package/src/index.ts +61 -0
- package/src/model-cache.ts +236 -0
- package/src/model-manager.ts +744 -0
- package/src/model-pricing.d.ts +3 -0
- package/src/model-pricing.ts +68 -0
- package/src/model-retirements.d.ts +6 -0
- package/src/model-retirements.ts +19 -0
- package/src/model-thinking.d.ts +100 -0
- package/src/model-thinking.ts +1054 -0
- package/src/models.d.ts +21 -0
- package/src/models.json +94672 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +126 -0
- package/src/openai-completions-compat.d.ts +34 -0
- package/src/openai-completions-compat.ts +383 -0
- package/src/prompts/composer-bash-policy-recovery.md +1 -0
- package/src/prompts/cursor-composer-bash-policy-recovery.md +1 -0
- package/src/prompts/cursor-composer-edit-discipline.md +7 -0
- package/src/prompts/turn-aborted-guidance.md +4 -0
- package/src/provider-details.ts +90 -0
- package/src/provider-models/bundled-references.ts +38 -0
- package/src/provider-models/descriptors.ts +392 -0
- package/src/provider-models/google.ts +92 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +159 -0
- package/src/provider-models/openai-compat.ts +2920 -0
- package/src/provider-models/special.ts +185 -0
- package/src/providers/amazon-bedrock.d.ts +60 -0
- package/src/providers/amazon-bedrock.ts +939 -0
- package/src/providers/anthropic-messages-server-schema.ts +229 -0
- package/src/providers/anthropic-messages-server.ts +839 -0
- package/src/providers/anthropic.d.ts +280 -0
- package/src/providers/anthropic.ts +4421 -0
- package/src/providers/aws-credential-config.d.ts +19 -0
- package/src/providers/aws-credential-config.ts +179 -0
- package/src/providers/aws-credentials.d.ts +43 -0
- package/src/providers/aws-credentials.ts +457 -0
- package/src/providers/aws-eventstream.d.ts +38 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.d.ts +55 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.d.ts +22 -0
- package/src/providers/azure-openai-responses.ts +447 -0
- package/src/providers/composer-discipline.d.ts +32 -0
- package/src/providers/composer-discipline.ts +95 -0
- package/src/providers/cursor/client-version.d.ts +10 -0
- package/src/providers/cursor/client-version.ts +10 -0
- package/src/providers/cursor/exec-modern.d.ts +98 -0
- package/src/providers/cursor/exec-modern.ts +497 -0
- package/src/providers/cursor/gen/agent_pb.d.ts +16769 -0
- package/src/providers/cursor/gen/agent_pb.ts +19780 -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.d.ts +119 -0
- package/src/providers/cursor-pi-args.ts +187 -0
- package/src/providers/cursor.d.ts +72 -0
- package/src/providers/cursor.ts +3396 -0
- package/src/providers/dashscope-token-plan-headers.d.ts +57 -0
- package/src/providers/dashscope-token-plan-headers.ts +84 -0
- package/src/providers/error-message.d.ts +27 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.d.ts +40 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.d.ts +27 -0
- package/src/providers/gitlab-duo.ts +393 -0
- package/src/providers/google-auth.d.ts +26 -0
- package/src/providers/google-auth.ts +262 -0
- package/src/providers/google-gemini-cli.d.ts +75 -0
- package/src/providers/google-gemini-cli.ts +969 -0
- package/src/providers/google-gemini-headers.d.ts +43 -0
- package/src/providers/google-gemini-headers.ts +100 -0
- package/src/providers/google-shared.d.ts +183 -0
- package/src/providers/google-shared.ts +1105 -0
- package/src/providers/google-types.d.ts +138 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.d.ts +11 -0
- package/src/providers/google-vertex.ts +124 -0
- package/src/providers/google.d.ts +4 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.d.ts +1 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.d.ts +27 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/kiro-api-key.d.ts +50 -0
- package/src/providers/kiro-api-key.ts +786 -0
- package/src/providers/kiro-codewhisperer.d.ts +11 -0
- package/src/providers/kiro-codewhisperer.ts +600 -0
- package/src/providers/mock.ts +526 -0
- package/src/providers/ollama.d.ts +41 -0
- package/src/providers/ollama.ts +645 -0
- package/src/providers/openai-anthropic-shim.d.ts +31 -0
- package/src/providers/openai-anthropic-shim.ts +156 -0
- package/src/providers/openai-bounded-rate-limits.d.ts +3 -0
- package/src/providers/openai-bounded-rate-limits.ts +57 -0
- package/src/providers/openai-chat-server-schema.ts +254 -0
- package/src/providers/openai-chat-server.ts +724 -0
- package/src/providers/openai-codex/constants.d.ts +26 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.d.ts +50 -0
- package/src/providers/openai-codex/request-transformer.ts +219 -0
- package/src/providers/openai-codex/response-handler.d.ts +18 -0
- package/src/providers/openai-codex/response-handler.ts +111 -0
- package/src/providers/openai-codex-responses.d.ts +71 -0
- package/src/providers/openai-codex-responses.ts +3288 -0
- package/src/providers/openai-completions-compat.d.ts +6 -0
- package/src/providers/openai-completions-compat.ts +6 -0
- package/src/providers/openai-completions.d.ts +35 -0
- package/src/providers/openai-completions.ts +2294 -0
- package/src/providers/openai-opencodex-responses.ts +174 -0
- package/src/providers/openai-request-transform.d.ts +4 -0
- package/src/providers/openai-request-transform.ts +136 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1268 -0
- package/src/providers/openai-responses-shared.d.ts +106 -0
- package/src/providers/openai-responses-shared.ts +1253 -0
- package/src/providers/openai-responses.d.ts +37 -0
- package/src/providers/openai-responses.ts +989 -0
- package/src/providers/pi-native-client.d.ts +29 -0
- package/src/providers/pi-native-client.ts +243 -0
- package/src/providers/pi-native-server.ts +488 -0
- package/src/providers/register-builtins.d.ts +59 -0
- package/src/providers/register-builtins.ts +544 -0
- package/src/providers/synthetic.d.ts +26 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.d.ts +33 -0
- package/src/providers/transform-messages.ts +408 -0
- package/src/providers/vision-guard.d.ts +8 -0
- package/src/providers/vision-guard.ts +31 -0
- package/src/rate-limit-utils.d.ts +19 -0
- package/src/rate-limit-utils.ts +102 -0
- package/src/stream.d.ts +45 -0
- package/src/stream.ts +1306 -0
- package/src/types.d.ts +1073 -0
- package/src/types.ts +1305 -0
- package/src/usage/claude.ts +449 -0
- package/src/usage/gemini.ts +250 -0
- package/src/usage/github-copilot.ts +421 -0
- package/src/usage/google-antigravity.ts +201 -0
- package/src/usage/grok-cli.ts +259 -0
- package/src/usage/kimi.ts +285 -0
- package/src/usage/minimax-code.ts +31 -0
- package/src/usage/openai-codex.ts +503 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +247 -0
- package/src/usage.ts +190 -0
- package/src/utils/abort.d.ts +19 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/anthropic-auth.ts +95 -0
- package/src/utils/block-symbols.d.ts +6 -0
- package/src/utils/block-symbols.ts +11 -0
- package/src/utils/discovery/antigravity.ts +275 -0
- package/src/utils/discovery/codex.ts +362 -0
- package/src/utils/discovery/cursor.ts +388 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +379 -0
- package/src/utils/event-stream.d.ts +41 -0
- package/src/utils/event-stream.ts +269 -0
- package/src/utils/fallback-transport.d.ts +110 -0
- package/src/utils/fallback-transport.ts +411 -0
- package/src/utils/fireworks-model-id.d.ts +10 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.d.ts +11 -0
- package/src/utils/foundry.ts +18 -0
- package/src/utils/h2-fetch.ts +60 -0
- package/src/utils/http-inspector.d.ts +59 -0
- package/src/utils/http-inspector.ts +380 -0
- package/src/utils/idle-iterator.d.ts +122 -0
- package/src/utils/idle-iterator.ts +410 -0
- package/src/utils/json-parse.d.ts +98 -0
- package/src/utils/json-parse.ts +607 -0
- package/src/utils/oauth/alibaba-token-plan.ts +60 -0
- package/src/utils/oauth/anthropic.ts +233 -0
- package/src/utils/oauth/api-key-login.ts +98 -0
- package/src/utils/oauth/api-key-validation.ts +344 -0
- package/src/utils/oauth/bizrouter.ts +15 -0
- package/src/utils/oauth/callback-server.d.ts +80 -0
- package/src/utils/oauth/callback-server.ts +359 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/commandcode.ts +17 -0
- package/src/utils/oauth/cursor.ts +157 -0
- package/src/utils/oauth/deepinfra.ts +15 -0
- package/src/utils/oauth/deepseek.ts +53 -0
- package/src/utils/oauth/firepass.ts +24 -0
- package/src/utils/oauth/fireworks.ts +15 -0
- package/src/utils/oauth/fugu.ts +15 -0
- package/src/utils/oauth/github-copilot.d.ts +38 -0
- package/src/utils/oauth/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -0
- package/src/utils/oauth/glm-zcode.d.ts +71 -0
- package/src/utils/oauth/glm-zcode.ts +433 -0
- package/src/utils/oauth/google-antigravity.ts +200 -0
- package/src/utils/oauth/google-gemini-cli.ts +256 -0
- package/src/utils/oauth/google-oauth-shared.ts +110 -0
- package/src/utils/oauth/huggingface.ts +62 -0
- package/src/utils/oauth/index.ts +558 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.d.ts +17 -0
- package/src/utils/oauth/kimi.ts +275 -0
- package/src/utils/oauth/kiro.ts +448 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/mara.ts +16 -0
- package/src/utils/oauth/minimax-code.ts +78 -0
- package/src/utils/oauth/moonshot.ts +16 -0
- package/src/utils/oauth/nanogpt.ts +15 -0
- package/src/utils/oauth/nvidia.ts +70 -0
- package/src/utils/oauth/oauth.html +199 -0
- package/src/utils/oauth/ollama-cloud.ts +28 -0
- package/src/utils/oauth/ollama.ts +47 -0
- package/src/utils/oauth/openai-codex.ts +299 -0
- package/src/utils/oauth/opencode.ts +49 -0
- package/src/utils/oauth/opengateway.ts +15 -0
- package/src/utils/oauth/openrouter.ts +16 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +225 -0
- package/src/utils/oauth/pkce.ts +18 -0
- package/src/utils/oauth/qianfan.ts +58 -0
- package/src/utils/oauth/qwen-portal.ts +60 -0
- package/src/utils/oauth/sglang.ts +42 -0
- package/src/utils/oauth/synthetic.ts +15 -0
- package/src/utils/oauth/tavily.ts +46 -0
- package/src/utils/oauth/together.ts +16 -0
- package/src/utils/oauth/types.d.ts +56 -0
- package/src/utils/oauth/types.ts +122 -0
- package/src/utils/oauth/venice.ts +59 -0
- package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
- package/src/utils/oauth/vllm.ts +42 -0
- package/src/utils/oauth/xai.ts +246 -0
- package/src/utils/oauth/xiaomi.ts +199 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/overflow.ts +275 -0
- package/src/utils/parse-bind.ts +81 -0
- package/src/utils/provider-response.d.ts +6 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/provider-safety-stop.ts +8 -0
- package/src/utils/proxy.d.ts +7 -0
- package/src/utils/proxy.ts +652 -0
- package/src/utils/retry-after.d.ts +3 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry-budget.d.ts +1 -0
- package/src/utils/retry-budget.ts +4 -0
- package/src/utils/retry.d.ts +29 -0
- package/src/utils/retry.ts +67 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -0
- package/src/utils/schema/adapt.d.ts +24 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.d.ts +30 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.d.ts +11 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.d.ts +10 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.d.ts +4 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.d.ts +49 -0
- package/src/utils/schema/fields.ts +190 -0
- package/src/utils/schema/index.d.ts +14 -0
- package/src/utils/schema/index.ts +14 -0
- package/src/utils/schema/json-schema-validator.d.ts +12 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.d.ts +2 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.d.ts +93 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/root-combinator.d.ts +12 -0
- package/src/utils/schema/root-combinator.ts +143 -0
- package/src/utils/schema/spill.d.ts +8 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.d.ts +25 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.d.ts +4 -0
- package/src/utils/schema/types.ts +11 -0
- package/src/utils/schema/wire.d.ts +54 -0
- package/src/utils/schema/wire.ts +213 -0
- package/src/utils/schema/zod-decontaminate.d.ts +31 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sse-debug.d.ts +10 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/tool-call-healing.d.ts +80 -0
- package/src/utils/tool-call-healing.ts +298 -0
- package/src/utils/tool-choice-capability.d.ts +57 -0
- package/src/utils/tool-choice-capability.ts +633 -0
- package/src/utils/tool-choice.d.ts +50 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1080 -0
- package/src/utils.d.ts +117 -0
- package/src/utils.ts +523 -0
|
@@ -0,0 +1,410 @@
|
|
|
1
|
+
import { $env } from "@vib-rato/utils";
|
|
2
|
+
import { STREAM_FIRST_EVENT_TIMEOUT_PROVIDER_CODE } from "./fallback-transport";
|
|
3
|
+
|
|
4
|
+
const DEFAULT_STREAM_IDLE_TIMEOUT_MS = 120_000;
|
|
5
|
+
const DEFAULT_STREAM_FIRST_EVENT_TIMEOUT_MS = 100_000;
|
|
6
|
+
const ALIBABA_TOKEN_PLAN_FIRST_EVENT_TIMEOUT_MS = 600_000;
|
|
7
|
+
const KIMI_CODE_FIRST_EVENT_TIMEOUT_MS = 300_000;
|
|
8
|
+
// Local LM Studio models can spend several minutes loading weights and filling
|
|
9
|
+
// the prompt before emitting their first SSE event. Keep the shared default
|
|
10
|
+
// for other OpenAI-compatible providers, but avoid aborting legitimate local
|
|
11
|
+
// inference during that startup window.
|
|
12
|
+
const LM_STUDIO_FIRST_EVENT_TIMEOUT_MS = 300_000;
|
|
13
|
+
// Ollama Cloud is a hosted proxy where queueing/cold-start plus long prefill
|
|
14
|
+
// (thinking-mode requests over 1M-context sessions) routinely exceeds 120s before
|
|
15
|
+
// the first streamed token; 300s matches kimi-code's floor for long-reasoning silence.
|
|
16
|
+
const OLLAMA_CLOUD_FIRST_EVENT_TIMEOUT_MS = 300_000;
|
|
17
|
+
|
|
18
|
+
const ANTHROPIC_STREAM_IDLE_TIMEOUT_MS = 300_000;
|
|
19
|
+
|
|
20
|
+
export function getProviderStreamIdleTimeoutFallbackMs(provider: string): number | undefined {
|
|
21
|
+
if (provider === "anthropic" || provider === "xai" || provider === "grok-build") {
|
|
22
|
+
return ANTHROPIC_STREAM_IDLE_TIMEOUT_MS;
|
|
23
|
+
}
|
|
24
|
+
return undefined;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Grok models behind OpenAI-compatible hosts keep the model id (or an
|
|
28
|
+
// `x-ai/`-prefixed OpenRouter id) even when `provider` is openrouter, kilo,
|
|
29
|
+
// litellm, zenmux, venice, and similar. The long-reasoning silence that
|
|
30
|
+
// motivates the 300s floor is a property of the model, not the account
|
|
31
|
+
// used to reach it, so the floor keys on the model when the provider alone
|
|
32
|
+
// does not already grant it (#4797).
|
|
33
|
+
const GROK_MODEL_ID_PATTERN = /(?:^|[/._-])grok(?:[/._-]|$)/i;
|
|
34
|
+
|
|
35
|
+
export function isGrokModelId(modelId: string | undefined): boolean {
|
|
36
|
+
if (!modelId) return false;
|
|
37
|
+
return GROK_MODEL_ID_PATTERN.test(modelId);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export function getProviderFirstEventTimeoutFallbackMs(provider: string): number | undefined {
|
|
41
|
+
if (provider === "alibaba-token-plan") return ALIBABA_TOKEN_PLAN_FIRST_EVENT_TIMEOUT_MS;
|
|
42
|
+
if (provider === "lm-studio") return LM_STUDIO_FIRST_EVENT_TIMEOUT_MS;
|
|
43
|
+
if (provider === "ollama-cloud") return OLLAMA_CLOUD_FIRST_EVENT_TIMEOUT_MS;
|
|
44
|
+
return provider === "kimi-code" ? KIMI_CODE_FIRST_EVENT_TIMEOUT_MS : undefined;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
function normalizeIdleTimeoutMs(value: string | undefined, fallback: number): number | undefined {
|
|
48
|
+
if (value === undefined) return fallback;
|
|
49
|
+
const parsed = Number(value);
|
|
50
|
+
if (!Number.isFinite(parsed)) return fallback;
|
|
51
|
+
if (parsed <= 0) return undefined;
|
|
52
|
+
return Math.trunc(parsed);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Returns the idle timeout used for provider streaming transports.
|
|
57
|
+
*
|
|
58
|
+
* `VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS` is honored first; `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` is a backward-compatible alias.
|
|
59
|
+
* Set `PI_STREAM_IDLE_TIMEOUT_MS=0` to disable the watchdog.
|
|
60
|
+
*
|
|
61
|
+
* Providers that legitimately stream much slower than the global default can pass
|
|
62
|
+
* `fallbackMs` to widen the floor used when neither env var nor caller option is set.
|
|
63
|
+
* Caller options still take precedence; env overrides still trump the fallback.
|
|
64
|
+
*/
|
|
65
|
+
export function getStreamIdleTimeoutMs(fallbackMs: number = DEFAULT_STREAM_IDLE_TIMEOUT_MS): number | undefined {
|
|
66
|
+
return normalizeIdleTimeoutMs(
|
|
67
|
+
$env.VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_OPENAI_STREAM_IDLE_TIMEOUT_MS,
|
|
68
|
+
fallbackMs,
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Returns the idle timeout used for OpenAI-family streaming transports.
|
|
74
|
+
*
|
|
75
|
+
* Honors `VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS` first (`PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` is the legacy alias). Set `=0` to disable.
|
|
76
|
+
* When `provider` is given, long-reasoning hosts (xAI Grok and Grok Build) use that floor instead of the 120s default.
|
|
77
|
+
* Grok models reached through other OpenAI-compatible hosts (`openrouter/x-ai/grok-*`, kilo, litellm, …) get the
|
|
78
|
+
* same floor keyed on the model id, because long-reasoning silence is a property of the model (#4797).
|
|
79
|
+
*/
|
|
80
|
+
export function getOpenAIStreamIdleTimeoutMs(provider?: string, modelId?: string): number | undefined {
|
|
81
|
+
return normalizeIdleTimeoutMs(
|
|
82
|
+
$env.VIB_OPENAI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_STREAM_IDLE_TIMEOUT_MS ?? $env.PI_OPENAI_STREAM_IDLE_TIMEOUT_MS,
|
|
83
|
+
getProviderStreamIdleTimeoutFallbackMs(provider ?? "") ??
|
|
84
|
+
(isGrokModelId(modelId) ? ANTHROPIC_STREAM_IDLE_TIMEOUT_MS : undefined) ??
|
|
85
|
+
DEFAULT_STREAM_IDLE_TIMEOUT_MS,
|
|
86
|
+
);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Returns the timeout used while waiting for the first stream event.
|
|
91
|
+
* The first token can legitimately take longer than later inter-event gaps,
|
|
92
|
+
* so the default never undershoots the steady-state idle timeout.
|
|
93
|
+
*
|
|
94
|
+
* Set `PI_STREAM_FIRST_EVENT_TIMEOUT_MS=0` to disable the watchdog.
|
|
95
|
+
*
|
|
96
|
+
* Providers whose first response can legitimately take longer (heavy reasoning,
|
|
97
|
+
* slow cold-start proxies) can pass `fallbackMs` to widen the floor used when
|
|
98
|
+
* neither env var nor caller option is set. Caller options still take precedence;
|
|
99
|
+
* env overrides still trump the fallback.
|
|
100
|
+
*/
|
|
101
|
+
export function getStreamFirstEventTimeoutMs(
|
|
102
|
+
idleTimeoutMs?: number,
|
|
103
|
+
fallbackMs: number = DEFAULT_STREAM_FIRST_EVENT_TIMEOUT_MS,
|
|
104
|
+
): number | undefined {
|
|
105
|
+
const fallback = idleTimeoutMs === undefined ? fallbackMs : Math.max(fallbackMs, idleTimeoutMs);
|
|
106
|
+
return normalizeIdleTimeoutMs($env.PI_STREAM_FIRST_EVENT_TIMEOUT_MS, fallback);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Resolves the OpenAI SDK client `timeout` so stalled-before-headers requests are
|
|
111
|
+
* bounded by the same first-event window the transport watchdog uses after
|
|
112
|
+
* `create()` returns. Without this, providers that only arm
|
|
113
|
+
* `iterateWithIdleTimeout` post-setup can wait the full SDK default (10 minutes
|
|
114
|
+
* per attempt) before any provider-owned watchdog exists.
|
|
115
|
+
*
|
|
116
|
+
* - Explicit `0` disables the request timeout (the SDK treats `timeout: 0` as an
|
|
117
|
+
* immediate failure, so callers that disable the first-event watchdog must not
|
|
118
|
+
* pass a timeout).
|
|
119
|
+
* - Providers with a first-event fallback (Alibaba, Kimi) honor an explicit
|
|
120
|
+
* nonzero override as-is, even when shorter than the fallback.
|
|
121
|
+
* - Other providers floor an explicit override at the env/default first-event
|
|
122
|
+
* window so a short post-connect first-event budget cannot kill legitimate
|
|
123
|
+
* slow setup.
|
|
124
|
+
*/
|
|
125
|
+
export function resolveOpenAISdkRequestTimeoutMs(
|
|
126
|
+
provider: string,
|
|
127
|
+
streamFirstEventTimeoutOverride?: number,
|
|
128
|
+
modelId?: string,
|
|
129
|
+
): number | undefined {
|
|
130
|
+
const providerFirstEventFallbackMs = getProviderFirstEventTimeoutFallbackMs(provider);
|
|
131
|
+
const envSdkTimeoutMs = getStreamFirstEventTimeoutMs(
|
|
132
|
+
getOpenAIStreamIdleTimeoutMs(provider, modelId),
|
|
133
|
+
providerFirstEventFallbackMs,
|
|
134
|
+
);
|
|
135
|
+
if (streamFirstEventTimeoutOverride === 0) return undefined;
|
|
136
|
+
if (streamFirstEventTimeoutOverride !== undefined) {
|
|
137
|
+
return providerFirstEventFallbackMs !== undefined
|
|
138
|
+
? streamFirstEventTimeoutOverride
|
|
139
|
+
: Math.max(envSdkTimeoutMs ?? 0, streamFirstEventTimeoutOverride);
|
|
140
|
+
}
|
|
141
|
+
return envSdkTimeoutMs;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Resolves the Anthropic SDK client `timeout` so stalled-before-headers requests
|
|
146
|
+
* are bounded. The Anthropic first-event watchdog deliberately arms only once
|
|
147
|
+
* response headers have arrived (setup latency must not consume the first-event
|
|
148
|
+
* budget), which left the connect/headers phase governed solely by the SDK
|
|
149
|
+
* default of 10 minutes per attempt — multiplied by SDK-internal retries, a
|
|
150
|
+
* connection that silently died right after a completed tool call could spin
|
|
151
|
+
* with no user-visible error for the better part of an hour.
|
|
152
|
+
*
|
|
153
|
+
* - Explicit `0` disables the request timeout, matching a disabled first-event
|
|
154
|
+
* watchdog.
|
|
155
|
+
* - An explicit nonzero override is floored at the env/default first-event
|
|
156
|
+
* window (which itself never undershoots the provider idle window) so a short
|
|
157
|
+
* post-connect first-event budget cannot kill legitimate slow setup.
|
|
158
|
+
*/
|
|
159
|
+
export function resolveAnthropicSdkRequestTimeoutMs(
|
|
160
|
+
provider: string,
|
|
161
|
+
streamFirstEventTimeoutOverride?: number,
|
|
162
|
+
streamIdleTimeoutOverride?: number,
|
|
163
|
+
): number | undefined {
|
|
164
|
+
const idleTimeoutMs =
|
|
165
|
+
streamIdleTimeoutOverride ?? getStreamIdleTimeoutMs(getProviderStreamIdleTimeoutFallbackMs(provider));
|
|
166
|
+
const envSdkTimeoutMs = getStreamFirstEventTimeoutMs(
|
|
167
|
+
idleTimeoutMs,
|
|
168
|
+
getProviderFirstEventTimeoutFallbackMs(provider),
|
|
169
|
+
);
|
|
170
|
+
if (streamFirstEventTimeoutOverride === 0) return undefined;
|
|
171
|
+
if (streamFirstEventTimeoutOverride !== undefined) {
|
|
172
|
+
return Math.max(envSdkTimeoutMs ?? 0, streamFirstEventTimeoutOverride);
|
|
173
|
+
}
|
|
174
|
+
return envSdkTimeoutMs;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export type Watchdog = NodeJS.Timeout | undefined;
|
|
178
|
+
export interface FirstEventTimeoutFacts {
|
|
179
|
+
requestBytes?: number;
|
|
180
|
+
firstEventElapsedMs?: number;
|
|
181
|
+
firstEventTimeoutMs?: number;
|
|
182
|
+
endpointClass?: "canonical" | "custom";
|
|
183
|
+
retryMaxAttempts?: number;
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
export class FirstEventTimeoutError extends Error {
|
|
187
|
+
readonly providerCode = STREAM_FIRST_EVENT_TIMEOUT_PROVIDER_CODE;
|
|
188
|
+
readonly requestBytes?: number;
|
|
189
|
+
readonly firstEventElapsedMs?: number;
|
|
190
|
+
readonly firstEventTimeoutMs?: number;
|
|
191
|
+
readonly endpointClass?: "canonical" | "custom";
|
|
192
|
+
readonly retryMaxAttempts?: number;
|
|
193
|
+
|
|
194
|
+
constructor(message: string, facts: FirstEventTimeoutFacts = {}) {
|
|
195
|
+
super(message);
|
|
196
|
+
this.name = "FirstEventTimeoutError";
|
|
197
|
+
this.requestBytes = facts.requestBytes;
|
|
198
|
+
this.firstEventElapsedMs = facts.firstEventElapsedMs;
|
|
199
|
+
this.firstEventTimeoutMs = facts.firstEventTimeoutMs;
|
|
200
|
+
this.endpointClass = facts.endpointClass;
|
|
201
|
+
this.retryMaxAttempts = facts.retryMaxAttempts;
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
const dummyWatchdog = setTimeout(() => {}, 1);
|
|
206
|
+
clearTimeout(dummyWatchdog);
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Starts a watchdog that aborts a request if no first stream event arrives in time.
|
|
210
|
+
* Call `markFirstEventReceived()` as soon as the first event is observed.
|
|
211
|
+
*/
|
|
212
|
+
export function createWatchdog(timeoutMs: number | undefined, onTimeout: () => void): Watchdog {
|
|
213
|
+
if (timeoutMs !== undefined && timeoutMs > 0) {
|
|
214
|
+
return setTimeout(onTimeout, timeoutMs);
|
|
215
|
+
}
|
|
216
|
+
return undefined;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
export interface IdleTimeoutIteratorOptions {
|
|
220
|
+
watchdog?: Watchdog;
|
|
221
|
+
idleTimeoutMs?: number;
|
|
222
|
+
firstItemTimeoutMs?: number;
|
|
223
|
+
errorMessage: string;
|
|
224
|
+
firstItemErrorMessage?: string;
|
|
225
|
+
onIdle?: () => void;
|
|
226
|
+
onFirstItemTimeout?: () => void;
|
|
227
|
+
/**
|
|
228
|
+
* Optional semantic-progress predicate. Non-progress items are still yielded,
|
|
229
|
+
* but they do not reset the idle deadline. This prevents provider
|
|
230
|
+
* keepalive/no-op events from keeping a stalled tool call alive forever.
|
|
231
|
+
*/
|
|
232
|
+
isProgressItem?: (item: unknown) => boolean;
|
|
233
|
+
/**
|
|
234
|
+
* Cancel iteration as soon as this signal aborts. Required for caller-driven
|
|
235
|
+
* cancellation (ESC) when the underlying transport does not surface signal
|
|
236
|
+
* aborts to the iterator (HTTP/2 proxies, native sockets, mocked fetch).
|
|
237
|
+
* Without this, the consumer sleeps on iterator.next() until the idle/first
|
|
238
|
+
* -event watchdog fires — observable as the issue #912 "Working… forever"
|
|
239
|
+
* symptom on the github-copilot provider.
|
|
240
|
+
*/
|
|
241
|
+
abortSignal?: AbortSignal;
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Yields items from an async iterable while enforcing a maximum idle gap between items.
|
|
246
|
+
*
|
|
247
|
+
* The first item may use a shorter timeout so stuck requests can be aborted and retried
|
|
248
|
+
* before any user-visible content has streamed.
|
|
249
|
+
*/
|
|
250
|
+
export async function* iterateWithIdleTimeout<T>(
|
|
251
|
+
iterable: AsyncIterable<T>,
|
|
252
|
+
options: IdleTimeoutIteratorOptions,
|
|
253
|
+
): AsyncGenerator<T> {
|
|
254
|
+
let watchdog = options.watchdog;
|
|
255
|
+
const firstItemTimeoutMs = options.firstItemTimeoutMs ?? options.idleTimeoutMs;
|
|
256
|
+
const abortSignal = options.abortSignal;
|
|
257
|
+
const iterator = iterable[Symbol.asyncIterator]();
|
|
258
|
+
|
|
259
|
+
const closeIterator = (): void => {
|
|
260
|
+
const returnPromise = iterator.return?.();
|
|
261
|
+
if (returnPromise) {
|
|
262
|
+
void returnPromise.catch(() => {});
|
|
263
|
+
}
|
|
264
|
+
};
|
|
265
|
+
|
|
266
|
+
if (abortSignal?.aborted) {
|
|
267
|
+
closeIterator();
|
|
268
|
+
throw abortReason(abortSignal);
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
const withRacy = <T>(promise: Promise<T>) =>
|
|
272
|
+
promise.then(
|
|
273
|
+
result => ({ kind: "next" as const, result }),
|
|
274
|
+
error => ({ kind: "error" as const, error }),
|
|
275
|
+
);
|
|
276
|
+
|
|
277
|
+
let awaitingFirstItem = true;
|
|
278
|
+
const markFirstItemReceived = () => {
|
|
279
|
+
watchdog && clearTimeout(watchdog);
|
|
280
|
+
watchdog = undefined;
|
|
281
|
+
awaitingFirstItem = false;
|
|
282
|
+
};
|
|
283
|
+
const isProgressItem = (item: T): boolean => {
|
|
284
|
+
if (!options.isProgressItem) return true;
|
|
285
|
+
try {
|
|
286
|
+
return options.isProgressItem(item);
|
|
287
|
+
} catch {
|
|
288
|
+
return true;
|
|
289
|
+
}
|
|
290
|
+
};
|
|
291
|
+
let lastProgressAt = Date.now();
|
|
292
|
+
const firstItemDeadlineAt =
|
|
293
|
+
firstItemTimeoutMs !== undefined && firstItemTimeoutMs > 0 ? Date.now() + firstItemTimeoutMs : undefined;
|
|
294
|
+
|
|
295
|
+
const noTimeoutEnforced =
|
|
296
|
+
(firstItemTimeoutMs === undefined || firstItemTimeoutMs <= 0) &&
|
|
297
|
+
(options.idleTimeoutMs === undefined || options.idleTimeoutMs <= 0);
|
|
298
|
+
|
|
299
|
+
while (true) {
|
|
300
|
+
let activeTimeoutMs: number | undefined;
|
|
301
|
+
if (awaitingFirstItem) {
|
|
302
|
+
activeTimeoutMs =
|
|
303
|
+
firstItemDeadlineAt === undefined ? undefined : Math.max(0, firstItemDeadlineAt - Date.now());
|
|
304
|
+
} else if (options.idleTimeoutMs !== undefined && options.idleTimeoutMs > 0) {
|
|
305
|
+
activeTimeoutMs = options.idleTimeoutMs - (Date.now() - lastProgressAt);
|
|
306
|
+
// The idle deadline may already have elapsed because the *consumer*
|
|
307
|
+
// was slow, not because the provider stalled — and the next item may
|
|
308
|
+
// already be buffered and ready to deliver. Clamp to 0 instead of
|
|
309
|
+
// throwing eagerly so the next() race below still gets a chance to
|
|
310
|
+
// win (it settles on a microtask, ahead of the 0ms timer). Only a
|
|
311
|
+
// genuinely hung iterator loses that race and surfaces as a stall.
|
|
312
|
+
if (activeTimeoutMs < 0) {
|
|
313
|
+
activeTimeoutMs = 0;
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const racers: Array<
|
|
318
|
+
Promise<
|
|
319
|
+
| { kind: "next"; result: IteratorResult<T> }
|
|
320
|
+
| { kind: "error"; error: unknown }
|
|
321
|
+
| { kind: "timeout" }
|
|
322
|
+
| { kind: "abort" }
|
|
323
|
+
>
|
|
324
|
+
> = [];
|
|
325
|
+
|
|
326
|
+
let timer: NodeJS.Timeout | undefined;
|
|
327
|
+
let resolveTimeout: ((value: { kind: "timeout" }) => void) | undefined;
|
|
328
|
+
const enforceTimeout = !noTimeoutEnforced && activeTimeoutMs !== undefined && activeTimeoutMs >= 0;
|
|
329
|
+
if (enforceTimeout) {
|
|
330
|
+
const { promise, resolve } = Promise.withResolvers<{ kind: "timeout" }>();
|
|
331
|
+
resolveTimeout = resolve;
|
|
332
|
+
timer = setTimeout(() => resolve({ kind: "timeout" }), activeTimeoutMs);
|
|
333
|
+
racers.push(promise);
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
let abortListener: (() => void) | undefined;
|
|
337
|
+
let resolveAbort: ((value: { kind: "abort" }) => void) | undefined;
|
|
338
|
+
if (abortSignal) {
|
|
339
|
+
const { promise, resolve } = Promise.withResolvers<{ kind: "abort" }>();
|
|
340
|
+
resolveAbort = resolve;
|
|
341
|
+
abortListener = () => resolve({ kind: "abort" });
|
|
342
|
+
abortSignal.addEventListener("abort", abortListener, { once: true });
|
|
343
|
+
racers.push(promise);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Arm timeout/abort races before asking the source for its next item. A
|
|
347
|
+
// periodic keepalive iterator commonly registers its own timer inside
|
|
348
|
+
// `next()`; registering that first lets equal-deadline keepalives win every
|
|
349
|
+
// race and extend the idle window forever. Already-buffered items still
|
|
350
|
+
// settle as microtasks before a 0ms watchdog.
|
|
351
|
+
racers.unshift(withRacy(iterator.next()));
|
|
352
|
+
|
|
353
|
+
try {
|
|
354
|
+
const outcome = await Promise.race(racers);
|
|
355
|
+
if (outcome.kind === "abort") {
|
|
356
|
+
closeIterator();
|
|
357
|
+
throw abortReason(abortSignal!);
|
|
358
|
+
}
|
|
359
|
+
if (outcome.kind === "timeout") {
|
|
360
|
+
if (!awaitingFirstItem) {
|
|
361
|
+
options.onIdle?.();
|
|
362
|
+
} else {
|
|
363
|
+
options.onFirstItemTimeout?.();
|
|
364
|
+
}
|
|
365
|
+
closeIterator();
|
|
366
|
+
throw awaitingFirstItem
|
|
367
|
+
? new FirstEventTimeoutError(options.firstItemErrorMessage ?? options.errorMessage)
|
|
368
|
+
: new Error(options.errorMessage);
|
|
369
|
+
}
|
|
370
|
+
if (outcome.kind === "error") {
|
|
371
|
+
throw outcome.error;
|
|
372
|
+
}
|
|
373
|
+
if (awaitingFirstItem && firstItemDeadlineAt !== undefined && Date.now() >= firstItemDeadlineAt) {
|
|
374
|
+
options.onFirstItemTimeout?.();
|
|
375
|
+
closeIterator();
|
|
376
|
+
throw new FirstEventTimeoutError(options.firstItemErrorMessage ?? options.errorMessage);
|
|
377
|
+
}
|
|
378
|
+
if (outcome.result.done) {
|
|
379
|
+
markFirstItemReceived();
|
|
380
|
+
return;
|
|
381
|
+
}
|
|
382
|
+
const item = outcome.result.value;
|
|
383
|
+
// Non-progress items (e.g. provider keepalives, synthetic `start` events that
|
|
384
|
+
// arrive before the model has produced any tokens) MUST NOT flip us out of
|
|
385
|
+
// `awaitingFirstItem`. Otherwise the next iteration switches from the (longer)
|
|
386
|
+
// first-item watchdog to the (shorter) idle watchdog while we're still waiting
|
|
387
|
+
// on the model's first real output.
|
|
388
|
+
if (isProgressItem(item)) {
|
|
389
|
+
markFirstItemReceived();
|
|
390
|
+
lastProgressAt = Date.now();
|
|
391
|
+
}
|
|
392
|
+
yield item;
|
|
393
|
+
} finally {
|
|
394
|
+
if (timer !== undefined) clearTimeout(timer);
|
|
395
|
+
// Resolve dangling promises so the racers don't leak (Promise.race is one-shot).
|
|
396
|
+
resolveTimeout?.({ kind: "timeout" });
|
|
397
|
+
if (abortListener && abortSignal) {
|
|
398
|
+
abortSignal.removeEventListener("abort", abortListener);
|
|
399
|
+
}
|
|
400
|
+
resolveAbort?.({ kind: "abort" });
|
|
401
|
+
}
|
|
402
|
+
}
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
function abortReason(signal: AbortSignal): Error {
|
|
406
|
+
const reason = signal.reason;
|
|
407
|
+
if (reason instanceof Error) return reason;
|
|
408
|
+
if (typeof reason === "string") return new Error(reason);
|
|
409
|
+
return new Error("Request was aborted");
|
|
410
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
export interface UnicodeEscapePositionEvidence {
|
|
2
|
+
/** UTF-16 offset of the escape's leading backslash in the raw JSON. */
|
|
3
|
+
readonly offset: number;
|
|
4
|
+
/** Process-keyed tag of the encoded scalar; never the recoverable character. */
|
|
5
|
+
readonly scalarTag: string;
|
|
6
|
+
/** Process-keyed tag of the unambiguous array-index-free path; never raw field names. */
|
|
7
|
+
readonly pathTag: string;
|
|
8
|
+
/** Escapes in object keys are structural and can never be display-safe. */
|
|
9
|
+
readonly location: "key" | "value";
|
|
10
|
+
/** Ordinal of this string among values sharing the array-index-free path. */
|
|
11
|
+
readonly valueOrdinal: number;
|
|
12
|
+
/** UTF-16 offset of the decoded scalar inside that string value. */
|
|
13
|
+
readonly valueOffset: number;
|
|
14
|
+
}
|
|
15
|
+
export interface UnicodeEscapeEvidence {
|
|
16
|
+
readonly positions: readonly UnicodeEscapePositionEvidence[];
|
|
17
|
+
/** Total qualifying escapes observed, including positions omitted by the cap. */
|
|
18
|
+
readonly totalPositions: number;
|
|
19
|
+
/** More qualifying escapes existed than the bounded evidence can carry. */
|
|
20
|
+
readonly truncated: boolean;
|
|
21
|
+
/** The raw JSON could not be mapped exactly and unambiguously; validation must fail closed. */
|
|
22
|
+
readonly malformed: boolean;
|
|
23
|
+
/** Process-local HMAC binding the complete collector-produced envelope. */
|
|
24
|
+
readonly integrity: string;
|
|
25
|
+
}
|
|
26
|
+
interface UnicodeEscapeEvidenceTarget {
|
|
27
|
+
escapedNonAsciiArguments?: boolean;
|
|
28
|
+
escapedUnicodeArgumentEvidence?: UnicodeEscapeEvidence;
|
|
29
|
+
}
|
|
30
|
+
/** Stable, payload-free identity for an unambiguous array-index-free argument path. */
|
|
31
|
+
export declare function unicodeEscapePathTag(path: readonly string[]): string;
|
|
32
|
+
/** Process-keyed scalar identity used without retaining recoverable argument text. */
|
|
33
|
+
export declare function unicodeEscapeScalarTag(codePoint: number): string;
|
|
34
|
+
/** Verify that an evidence envelope is complete and was produced in this process. */
|
|
35
|
+
export declare function verifyUnicodeEscapeEvidence(evidence: UnicodeEscapeEvidence): boolean;
|
|
36
|
+
export declare function repairJson(json: string): string;
|
|
37
|
+
/**
|
|
38
|
+
* First unnecessary `\uXXXX` escape in a JSON document, or `undefined` when the
|
|
39
|
+
* document contains none.
|
|
40
|
+
*
|
|
41
|
+
* "Unnecessary" means the escape encodes a printable character JSON can carry
|
|
42
|
+
* literally, including ASCII. ASCII must remain observable because one mistyped
|
|
43
|
+
* nibble can move a non-ASCII escape into ASCII (`\u00b7` → `\u0077`). Control
|
|
44
|
+
* characters (< U+0020), DEL, and unpaired surrogates are excluded. A `\\uXXXX`
|
|
45
|
+
* sequence is a literal backslash followed by `u` — the
|
|
46
|
+
* intended source syntax when the model is writing code or a nested JSON
|
|
47
|
+
* document — and is skipped, which is why this scans the raw text with the same
|
|
48
|
+
* string/escape state machine as {@link repairJson} instead of using a regex.
|
|
49
|
+
*
|
|
50
|
+
* Models that spell text as hand-written hex instead of literal characters
|
|
51
|
+
* mistype the digits, and every mistyped nibble silently decodes to a different
|
|
52
|
+
* but perfectly valid character (`\uc7a5` vs `\uc7a4`). The resulting arguments
|
|
53
|
+
* parse cleanly and cannot be repaired after the fact, so the escape itself is
|
|
54
|
+
* the only observable evidence that the payload is untrustworthy.
|
|
55
|
+
*/
|
|
56
|
+
export declare function findUnnecessaryUnicodeEscape(json: string): string | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Bounded raw-position/scalar evidence for every suspicious `\uXXXX` escape.
|
|
59
|
+
*
|
|
60
|
+
* Scalars and paths are carried only as process-keyed HMAC tags, so terminal
|
|
61
|
+
* validation can match them against decoded arguments without retaining
|
|
62
|
+
* recoverable characters, keys, or values in messages, diagnostics, or durable
|
|
63
|
+
* session artifacts. Array indices are
|
|
64
|
+
* intentionally omitted to preserve `questions.question`-style field matching.
|
|
65
|
+
*/
|
|
66
|
+
export declare function collectUnicodeEscapeEvidence(json: string): UnicodeEscapeEvidence | undefined;
|
|
67
|
+
/**
|
|
68
|
+
* Return evidence only when decoded tool arguments are unsafe to execute.
|
|
69
|
+
*
|
|
70
|
+
* Valid JSON escapes and literal UTF-8 have the same canonical decoded value,
|
|
71
|
+
* including a valid scalar whose hex digits differ from what a caller intended:
|
|
72
|
+
* runtime syntax validation cannot infer author intent after decoding.
|
|
73
|
+
* Malformed escape-bearing JSON, duplicate/deep suspicious escape evidence, and
|
|
74
|
+
* unpaired UTF-16 surrogates keep the fail-closed path.
|
|
75
|
+
*/
|
|
76
|
+
export declare function collectUnsafeUnicodeEscapeEvidence(json: string): UnicodeEscapeEvidence | undefined;
|
|
77
|
+
/** Attach unsafe raw evidence while preserving the existing call-level guard flag. */
|
|
78
|
+
export declare function captureUnicodeEscapeEvidence(target: UnicodeEscapeEvidenceTarget, json: string): boolean;
|
|
79
|
+
/** Attach evidence as transient, non-enumerable metadata excluded from serialization. */
|
|
80
|
+
export declare function attachUnicodeEscapeEvidence(target: UnicodeEscapeEvidenceTarget, evidence: UnicodeEscapeEvidence): void;
|
|
81
|
+
export declare function parseJsonWithRepair<T>(json: string): T;
|
|
82
|
+
/**
|
|
83
|
+
* Attempts to parse potentially incomplete JSON during streaming.
|
|
84
|
+
* Always returns a valid object, even if the JSON is incomplete.
|
|
85
|
+
*
|
|
86
|
+
* @param partialJson The partial JSON string from streaming
|
|
87
|
+
* @returns Parsed object or empty object if parsing fails
|
|
88
|
+
*/
|
|
89
|
+
export declare function parseStreamingJson<T = Record<string, unknown>>(partialJson: string | undefined): T;
|
|
90
|
+
/**
|
|
91
|
+
* Whether a string is a complete, well-formed JSON document (strict parse, no
|
|
92
|
+
* repair). Used to distinguish a tool-call argument blob that finished cleanly
|
|
93
|
+
* from one that was cut off mid-stream (truncation). An empty / whitespace-only
|
|
94
|
+
* string is treated as complete: a tool invoked with no arguments legitimately
|
|
95
|
+
* streams an empty buffer and must not be flagged as truncated.
|
|
96
|
+
*/
|
|
97
|
+
export declare function isCompleteJson(text: string | undefined): boolean;
|
|
98
|
+
export {};
|