jeopi-ai 16.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4347 -0
- package/README.md +1193 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +73 -0
- package/dist/types/auth-broker/discover.d.ts +35 -0
- package/dist/types/auth-broker/index.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +102 -0
- package/dist/types/auth-broker/server.d.ts +43 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +107 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +411 -0
- package/dist/types/auth-gateway/http.d.ts +39 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +36 -0
- package/dist/types/auth-gateway/types.d.ts +123 -0
- package/dist/types/auth-retry.d.ts +124 -0
- package/dist/types/auth-storage.d.ts +1026 -0
- package/dist/types/dialect/anthropic.d.ts +15 -0
- package/dist/types/dialect/catalog.d.ts +3 -0
- package/dist/types/dialect/coercion.d.ts +23 -0
- package/dist/types/dialect/deepseek.d.ts +14 -0
- package/dist/types/dialect/demotion.d.ts +23 -0
- package/dist/types/dialect/examples.d.ts +2 -0
- package/dist/types/dialect/factory.d.ts +3 -0
- package/dist/types/dialect/fenced-thinking.d.ts +53 -0
- package/dist/types/dialect/gemini.d.ts +17 -0
- package/dist/types/dialect/gemma.d.ts +15 -0
- package/dist/types/dialect/glm.d.ts +9 -0
- package/dist/types/dialect/harmony.d.ts +8 -0
- package/dist/types/dialect/hermes.d.ts +9 -0
- package/dist/types/dialect/history.d.ts +3 -0
- package/dist/types/dialect/index.d.ts +11 -0
- package/dist/types/dialect/inventory.d.ts +12 -0
- package/dist/types/dialect/kimi.d.ts +14 -0
- package/dist/types/dialect/minimax.d.ts +3 -0
- package/dist/types/dialect/owned-stream.d.ts +4 -0
- package/dist/types/dialect/qwen3.d.ts +9 -0
- package/dist/types/dialect/rendering.d.ts +45 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +69 -0
- package/dist/types/dialect/xml.d.ts +9 -0
- package/dist/types/error/abort.d.ts +14 -0
- package/dist/types/error/auth-classify.d.ts +16 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +23 -0
- package/dist/types/error/classes.d.ts +102 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +79 -0
- package/dist/types/error/format.d.ts +20 -0
- package/dist/types/error/gateway.d.ts +20 -0
- package/dist/types/error/index.d.ts +13 -0
- package/dist/types/error/oauth.d.ts +43 -0
- package/dist/types/error/provider.d.ts +42 -0
- package/dist/types/error/rate-limit.d.ts +59 -0
- package/dist/types/error/retryable.d.ts +27 -0
- package/dist/types/error/validation.d.ts +32 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/__tests__/google-auth.test.d.ts +1 -0
- package/dist/types/providers/__tests__/kimi-code-thinking.test.d.ts +1 -0
- package/dist/types/providers/__tests__/openai-codex-error.test.d.ts +1 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +94 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +497 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +318 -0
- package/dist/types/providers/anthropic.d.ts +248 -0
- package/dist/types/providers/aws-credentials.d.ts +53 -0
- package/dist/types/providers/aws-eventstream.d.ts +39 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +16 -0
- package/dist/types/providers/cursor.d.ts +91 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +32 -0
- package/dist/types/providers/google-gemini-cli.d.ts +118 -0
- package/dist/types/providers/google-interactions.d.ts +65 -0
- package/dist/types/providers/google-shared.d.ts +203 -0
- package/dist/types/providers/google-types.d.ts +155 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +178 -0
- package/dist/types/providers/ollama.d.ts +7 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +695 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +644 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +54 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +108 -0
- package/dist/types/providers/openai-completions.d.ts +45 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +349 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6065 -0
- package/dist/types/providers/openai-responses.d.ts +126 -0
- package/dist/types/providers/openai-shared.d.ts +506 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +69 -0
- package/dist/types/providers/register-builtins.d.ts +32 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +11 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/registry/aimlapi.d.ts +4 -0
- package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
- package/dist/types/registry/amazon-bedrock.d.ts +5 -0
- package/dist/types/registry/anthropic.d.ts +10 -0
- package/dist/types/registry/api-key-login.d.ts +42 -0
- package/dist/types/registry/api-key-validation.d.ts +43 -0
- package/dist/types/registry/azure.d.ts +4 -0
- package/dist/types/registry/cerebras.d.ts +7 -0
- package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
- package/dist/types/registry/coreweave.d.ts +7 -0
- package/dist/types/registry/cursor.d.ts +7 -0
- package/dist/types/registry/deepseek.d.ts +8 -0
- package/dist/types/registry/derived.d.ts +5 -0
- package/dist/types/registry/devin.d.ts +8 -0
- package/dist/types/registry/firepass.d.ts +16 -0
- package/dist/types/registry/fireworks.d.ts +7 -0
- package/dist/types/registry/github-copilot.d.ts +7 -0
- package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
- package/dist/types/registry/gitlab-duo.d.ts +9 -0
- package/dist/types/registry/google-antigravity.d.ts +9 -0
- package/dist/types/registry/google-gemini-cli.d.ts +9 -0
- package/dist/types/registry/google-vertex.d.ts +5 -0
- package/dist/types/registry/google.d.ts +4 -0
- package/dist/types/registry/groq.d.ts +4 -0
- package/dist/types/registry/huggingface.d.ts +7 -0
- package/dist/types/registry/index.d.ts +4 -0
- package/dist/types/registry/kagi.d.ts +14 -0
- package/dist/types/registry/kilo.d.ts +7 -0
- package/dist/types/registry/kimi-code.d.ts +7 -0
- package/dist/types/registry/litellm.d.ts +13 -0
- package/dist/types/registry/llama-cpp.d.ts +8 -0
- package/dist/types/registry/lm-studio.d.ts +8 -0
- package/dist/types/registry/minimax-code-cn.d.ts +6 -0
- package/dist/types/registry/minimax-code.d.ts +6 -0
- package/dist/types/registry/minimax.d.ts +4 -0
- package/dist/types/registry/mistral.d.ts +4 -0
- package/dist/types/registry/moonshot.d.ts +7 -0
- package/dist/types/registry/nanogpt.d.ts +7 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/__tests__/xai-oauth.test.d.ts +1 -0
- package/dist/types/registry/oauth/anthropic.d.ts +23 -0
- package/dist/types/registry/oauth/callback-server.d.ts +72 -0
- package/dist/types/registry/oauth/cursor.d.ts +15 -0
- package/dist/types/registry/oauth/devin.d.ts +5 -0
- package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
- package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
- package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/registry/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +22 -0
- package/dist/types/registry/oauth/index.d.ts +64 -0
- package/dist/types/registry/oauth/kimi.d.ts +21 -0
- package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
- package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
- package/dist/types/registry/oauth/opencode.d.ts +18 -0
- package/dist/types/registry/oauth/perplexity.d.ts +9 -0
- package/dist/types/registry/oauth/pkce.d.ts +8 -0
- package/dist/types/registry/oauth/types.d.ts +56 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +52 -0
- package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
- package/dist/types/registry/ollama-cloud.d.ts +7 -0
- package/dist/types/registry/ollama.d.ts +12 -0
- package/dist/types/registry/openai-codex-device.d.ts +8 -0
- package/dist/types/registry/openai-codex.d.ts +9 -0
- package/dist/types/registry/openai.d.ts +4 -0
- package/dist/types/registry/opencode-go.d.ts +6 -0
- package/dist/types/registry/opencode-zen.d.ts +6 -0
- package/dist/types/registry/openrouter.d.ts +13 -0
- package/dist/types/registry/parallel.d.ts +14 -0
- package/dist/types/registry/perplexity.d.ts +7 -0
- package/dist/types/registry/qianfan.d.ts +7 -0
- package/dist/types/registry/qwen-portal.d.ts +7 -0
- package/dist/types/registry/registry.d.ts +303 -0
- package/dist/types/registry/sakana.d.ts +7 -0
- package/dist/types/registry/synthetic.d.ts +6 -0
- package/dist/types/registry/tavily.d.ts +14 -0
- package/dist/types/registry/together.d.ts +6 -0
- package/dist/types/registry/types.d.ts +51 -0
- package/dist/types/registry/umans.d.ts +7 -0
- package/dist/types/registry/venice.d.ts +13 -0
- package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
- package/dist/types/registry/vllm.d.ts +7 -0
- package/dist/types/registry/wafer-serverless.d.ts +6 -0
- package/dist/types/registry/xai-oauth.d.ts +7 -0
- package/dist/types/registry/xai.d.ts +4 -0
- package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
- package/dist/types/registry/xiaomi.d.ts +6 -0
- package/dist/types/registry/zai.d.ts +7 -0
- package/dist/types/registry/zenmux.d.ts +7 -0
- package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
- package/dist/types/stream.d.ts +44 -0
- package/dist/types/types.d.ts +715 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +15 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/ollama.d.ts +5 -0
- package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
- package/dist/types/usage/openai-codex-reset.d.ts +79 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +346 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/block-symbols.d.ts +20 -0
- package/dist/types/utils/deterministic-id.d.ts +16 -0
- package/dist/types/utils/empty-completion-retry.d.ts +21 -0
- package/dist/types/utils/event-stream.d.ts +30 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/google-validation.d.ts +2 -0
- package/dist/types/utils/harmony-leak.d.ts +118 -0
- package/dist/types/utils/http-inspector.d.ts +30 -0
- package/dist/types/utils/idle-iterator.d.ts +137 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +29 -0
- package/dist/types/utils/openai-http.d.ts +54 -0
- package/dist/types/utils/openrouter-headers.d.ts +1 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/proxy.d.ts +29 -0
- package/dist/types/utils/request-debug.d.ts +29 -0
- package/dist/types/utils/retry-after.d.ts +4 -0
- package/dist/types/utils/retry.d.ts +14 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +54 -0
- package/dist/types/utils/schema/index.d.ts +15 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +124 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +17 -0
- package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/typescript.d.ts +18 -0
- package/dist/types/utils/schema/wire.d.ts +92 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
- package/dist/types/utils/sse-debug.d.ts +5 -0
- package/dist/types/utils/stream-markup-healing.d.ts +87 -0
- package/dist/types/utils/thinking-loop.d.ts +102 -0
- package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +42 -0
- package/dist/types/utils.d.ts +24 -0
- package/package.json +139 -0
- package/src/api-registry.ts +109 -0
- package/src/auth-broker/client.ts +359 -0
- package/src/auth-broker/discover.ts +222 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +657 -0
- package/src/auth-broker/server.ts +646 -0
- package/src/auth-broker/snapshot-cache.ts +191 -0
- package/src/auth-broker/types.ts +130 -0
- package/src/auth-broker/wire-schemas.ts +249 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +802 -0
- package/src/auth-gateway/types.ts +151 -0
- package/src/auth-retry.ts +250 -0
- package/src/auth-storage.ts +5576 -0
- package/src/dialect/anthropic.md +31 -0
- package/src/dialect/anthropic.ts +608 -0
- package/src/dialect/catalog.ts +29 -0
- package/src/dialect/coercion.ts +136 -0
- package/src/dialect/deepseek.md +24 -0
- package/src/dialect/deepseek.ts +609 -0
- package/src/dialect/demotion.ts +36 -0
- package/src/dialect/examples.ts +33 -0
- package/src/dialect/factory.ts +34 -0
- package/src/dialect/fenced-thinking.ts +184 -0
- package/src/dialect/gemini.md +44 -0
- package/src/dialect/gemini.ts +597 -0
- package/src/dialect/gemma.md +33 -0
- package/src/dialect/gemma.ts +387 -0
- package/src/dialect/glm.md +32 -0
- package/src/dialect/glm.ts +456 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +346 -0
- package/src/dialect/hermes.md +25 -0
- package/src/dialect/hermes.ts +206 -0
- package/src/dialect/history.ts +81 -0
- package/src/dialect/index.ts +15 -0
- package/src/dialect/inventory.ts +73 -0
- package/src/dialect/kimi.md +24 -0
- package/src/dialect/kimi.ts +340 -0
- package/src/dialect/minimax.md +31 -0
- package/src/dialect/minimax.ts +95 -0
- package/src/dialect/owned-stream.ts +470 -0
- package/src/dialect/prompt-template.md +12 -0
- package/src/dialect/qwen3.md +28 -0
- package/src/dialect/qwen3.ts +240 -0
- package/src/dialect/rendering.ts +249 -0
- package/src/dialect/thinking.ts +122 -0
- package/src/dialect/types.ts +57 -0
- package/src/dialect/xml.md +22 -0
- package/src/dialect/xml.ts +90 -0
- package/src/error/abort.ts +18 -0
- package/src/error/auth-classify.ts +30 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +31 -0
- package/src/error/classes.ts +186 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +506 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +13 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +62 -0
- package/src/error/rate-limit.ts +161 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +49 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/__tests__/google-auth.test.ts +144 -0
- package/src/providers/__tests__/kimi-code-thinking.test.ts +112 -0
- package/src/providers/__tests__/openai-codex-error.test.ts +84 -0
- package/src/providers/amazon-bedrock.ts +1042 -0
- package/src/providers/anthropic-client.ts +295 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +756 -0
- package/src/providers/anthropic-wire.ts +318 -0
- package/src/providers/anthropic.ts +4078 -0
- package/src/providers/aws-credentials.ts +586 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +382 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2695 -0
- package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
- package/src/providers/devin/proto/buf.gen.yaml +33 -0
- package/src/providers/devin/proto/buf.yaml +17 -0
- package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
- package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
- package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
- package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
- package/src/providers/devin/proto/cel/expr/value.proto +41 -0
- package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
- package/src/providers/devin/proto/errorspb/errors.proto +56 -0
- package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
- package/src/providers/devin/proto/errorspb/markers.proto +10 -0
- package/src/providers/devin/proto/errorspb/tags.proto +12 -0
- package/src/providers/devin/proto/errorspb/testing.proto +6 -0
- package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
- package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
- package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
- package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
- package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
- package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
- package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
- package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
- package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
- package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
- package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
- package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
- package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
- package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
- package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
- package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
- package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
- package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
- package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
- package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
- package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
- package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
- package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
- package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
- package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
- package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
- package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
- package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
- package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
- package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
- package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
- package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
- package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
- package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
- package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
- package/src/providers/devin.ts +577 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +141 -0
- package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
- package/src/providers/gitlab-duo-workflow.ts +3058 -0
- package/src/providers/gitlab-duo.ts +395 -0
- package/src/providers/google-auth.ts +350 -0
- package/src/providers/google-gemini-cli.ts +1362 -0
- package/src/providers/google-interactions.ts +753 -0
- package/src/providers/google-shared.ts +1103 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +183 -0
- package/src/providers/google.ts +87 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +507 -0
- package/src/providers/ollama.ts +773 -0
- package/src/providers/openai-anthropic-shim.ts +152 -0
- package/src/providers/openai-chat-server-schema.ts +242 -0
- package/src/providers/openai-chat-server.ts +715 -0
- package/src/providers/openai-chat-wire.ts +847 -0
- package/src/providers/openai-codex/request-transformer.ts +295 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +3468 -0
- package/src/providers/openai-completions.ts +2173 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-reasoning-suppression.md +1 -0
- package/src/providers/openai-responses-server-schema.ts +282 -0
- package/src/providers/openai-responses-server.ts +1280 -0
- package/src/providers/openai-responses-wire.ts +6391 -0
- package/src/providers/openai-responses.ts +1022 -0
- package/src/providers/openai-shared.ts +2648 -0
- package/src/providers/pi-native-client.ts +266 -0
- package/src/providers/pi-native-server.ts +242 -0
- package/src/providers/register-builtins.ts +475 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +787 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +95 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +112 -0
- package/src/registry/api-key-validation.ts +161 -0
- package/src/registry/azure.ts +6 -0
- package/src/registry/cerebras.ts +23 -0
- package/src/registry/cloudflare-ai-gateway.ts +45 -0
- package/src/registry/coreweave.ts +40 -0
- package/src/registry/cursor.ts +20 -0
- package/src/registry/deepseek.ts +46 -0
- package/src/registry/derived.ts +9 -0
- package/src/registry/devin.ts +15 -0
- package/src/registry/firepass.ts +32 -0
- package/src/registry/fireworks.ts +28 -0
- package/src/registry/github-copilot.ts +22 -0
- package/src/registry/gitlab-duo-workflow.ts +20 -0
- package/src/registry/gitlab-duo.ts +19 -0
- package/src/registry/google-antigravity.ts +22 -0
- package/src/registry/google-gemini-cli.ts +22 -0
- package/src/registry/google-vertex.ts +38 -0
- package/src/registry/google.ts +6 -0
- package/src/registry/groq.ts +6 -0
- package/src/registry/huggingface.ts +29 -0
- package/src/registry/index.ts +4 -0
- package/src/registry/kagi.ts +46 -0
- package/src/registry/kilo.ts +114 -0
- package/src/registry/kimi-code.ts +17 -0
- package/src/registry/litellm.ts +45 -0
- package/src/registry/llama-cpp.ts +35 -0
- package/src/registry/lm-studio.ts +31 -0
- package/src/registry/minimax-code-cn.ts +12 -0
- package/src/registry/minimax-code.ts +12 -0
- package/src/registry/minimax.ts +6 -0
- package/src/registry/mistral.ts +6 -0
- package/src/registry/moonshot.ts +22 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/__tests__/xai-oauth.test.ts +104 -0
- package/src/registry/oauth/anthropic.ts +311 -0
- package/src/registry/oauth/callback-server.ts +315 -0
- package/src/registry/oauth/cursor.ts +171 -0
- package/src/registry/oauth/devin.ts +124 -0
- package/src/registry/oauth/github-copilot.ts +369 -0
- package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
- package/src/registry/oauth/gitlab-duo.ts +222 -0
- package/src/registry/oauth/google-antigravity.ts +209 -0
- package/src/registry/oauth/google-gemini-cli.ts +273 -0
- package/src/registry/oauth/google-oauth-shared.ts +125 -0
- package/src/registry/oauth/index.ts +269 -0
- package/src/registry/oauth/kimi.ts +289 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +311 -0
- package/src/registry/oauth/openai-codex.ts +364 -0
- package/src/registry/oauth/opencode.ts +50 -0
- package/src/registry/oauth/perplexity.ts +228 -0
- package/src/registry/oauth/pkce.ts +18 -0
- package/src/registry/oauth/types.ts +65 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +394 -0
- package/src/registry/oauth/xiaomi.ts +211 -0
- package/src/registry/ollama-cloud.ts +36 -0
- package/src/registry/ollama.ts +43 -0
- package/src/registry/openai-codex-device.ts +18 -0
- package/src/registry/openai-codex.ts +19 -0
- package/src/registry/openai.ts +6 -0
- package/src/registry/opencode-go.ts +12 -0
- package/src/registry/opencode-zen.ts +12 -0
- package/src/registry/openrouter.ts +28 -0
- package/src/registry/parallel.ts +45 -0
- package/src/registry/perplexity.ts +13 -0
- package/src/registry/qianfan.ts +27 -0
- package/src/registry/qwen-portal.ts +50 -0
- package/src/registry/registry.ts +161 -0
- package/src/registry/sakana.ts +22 -0
- package/src/registry/synthetic.ts +21 -0
- package/src/registry/tavily.ts +45 -0
- package/src/registry/together.ts +22 -0
- package/src/registry/types.ts +56 -0
- package/src/registry/umans.ts +23 -0
- package/src/registry/venice.ts +33 -0
- package/src/registry/vercel-ai-gateway.ts +38 -0
- package/src/registry/vllm.ts +34 -0
- package/src/registry/wafer-serverless.ts +12 -0
- package/src/registry/xai-oauth.ts +17 -0
- package/src/registry/xai.ts +6 -0
- package/src/registry/xiaomi-token-plan-ams.ts +12 -0
- package/src/registry/xiaomi-token-plan-cn.ts +12 -0
- package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
- package/src/registry/xiaomi.ts +12 -0
- package/src/registry/zai.ts +27 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1778 -0
- package/src/types.ts +856 -0
- package/src/usage/claude.ts +485 -0
- package/src/usage/gemini.ts +258 -0
- package/src/usage/github-copilot.ts +424 -0
- package/src/usage/google-antigravity.ts +497 -0
- package/src/usage/kimi.ts +271 -0
- package/src/usage/minimax-code.ts +30 -0
- package/src/usage/ollama.ts +41 -0
- package/src/usage/openai-codex-base-url.ts +35 -0
- package/src/usage/openai-codex-reset.ts +174 -0
- package/src/usage/openai-codex.ts +535 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +321 -0
- package/src/usage.ts +333 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/block-symbols.ts +32 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +159 -0
- package/src/utils/event-stream.ts +171 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +456 -0
- package/src/utils/http-inspector.ts +168 -0
- package/src/utils/idle-iterator.ts +473 -0
- package/src/utils/leaked-thinking-stream.ts +294 -0
- package/src/utils/openai-http.ts +122 -0
- package/src/utils/openrouter-headers.ts +12 -0
- package/src/utils/parse-bind.ts +56 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/proxy.ts +240 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +59 -0
- package/src/utils/schema/CONSTRAINTS.md +166 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +207 -0
- package/src/utils/schema/index.ts +15 -0
- package/src/utils/schema/json-schema-validator.ts +595 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1901 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +109 -0
- package/src/utils/schema/strict-tool-validation.ts +117 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/typescript.ts +198 -0
- package/src/utils/schema/wire.ts +789 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +18 -0
- package/src/utils/stream-markup-healing.ts +247 -0
- package/src/utils/thinking-loop.ts +552 -0
- package/src/utils/tool-call-loop-guard.ts +107 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1507 -0
- package/src/utils.ts +171 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import * as AIError from "../error";
|
|
2
|
+
|
|
3
|
+
export interface AbortSourceTracker {
|
|
4
|
+
requestAbortController: AbortController;
|
|
5
|
+
requestSignal: AbortSignal;
|
|
6
|
+
abortLocally(reason: Error): Error;
|
|
7
|
+
getLocalAbortReason(): Error | undefined;
|
|
8
|
+
wasCallerAbort(): boolean;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Tracks whether a merged request signal was aborted by the caller or by provider-local logic.
|
|
13
|
+
*
|
|
14
|
+
* Caller aborts always take priority. When both the caller and a local watchdog fire near
|
|
15
|
+
* each other, the merged `requestSignal.reason` reflects whichever AbortController called
|
|
16
|
+
* `.abort()` first — but ordering is racy and not meaningful for upstream consumers. What
|
|
17
|
+
* matters is intent: if the caller's signal aborted, the request was cancelled by the
|
|
18
|
+
* caller, and any local watchdog reason is incidental and **MUST NOT** be surfaced as a
|
|
19
|
+
* retryable transient error (which would cause auto-retry to re-enter streaming and leave
|
|
20
|
+
* the UI showing a spinner the user already tried to cancel).
|
|
21
|
+
*/
|
|
22
|
+
export function createAbortSourceTracker(callerSignal?: AbortSignal): AbortSourceTracker {
|
|
23
|
+
const requestAbortController = new AbortController();
|
|
24
|
+
const requestSignal = callerSignal
|
|
25
|
+
? AbortSignal.any([callerSignal, requestAbortController.signal])
|
|
26
|
+
: requestAbortController.signal;
|
|
27
|
+
let localAbortReason: Error | undefined;
|
|
28
|
+
|
|
29
|
+
return {
|
|
30
|
+
requestAbortController,
|
|
31
|
+
requestSignal,
|
|
32
|
+
abortLocally(reason) {
|
|
33
|
+
localAbortReason = reason;
|
|
34
|
+
requestAbortController.abort(reason);
|
|
35
|
+
return reason;
|
|
36
|
+
},
|
|
37
|
+
getLocalAbortReason() {
|
|
38
|
+
// Caller intent dominates. Surface a local reason only when the caller did not
|
|
39
|
+
// abort, so timeout/idle-watchdog errors don't masquerade as the user's cancel.
|
|
40
|
+
if (!localAbortReason || callerSignal?.aborted) return undefined;
|
|
41
|
+
return requestSignal.reason === localAbortReason ? localAbortReason : undefined;
|
|
42
|
+
},
|
|
43
|
+
wasCallerAbort() {
|
|
44
|
+
// If the caller signal aborted, treat it as a caller abort regardless of which
|
|
45
|
+
// AbortController won the race to set `requestSignal.reason`. The previous
|
|
46
|
+
// `requestSignal.reason !== localAbortReason` heuristic flipped the result to
|
|
47
|
+
// `false` when a local watchdog fired microseconds before the user's ESC, which
|
|
48
|
+
// then routed user-initiated cancels through the auto-retry transient-error
|
|
49
|
+
// path.
|
|
50
|
+
return callerSignal?.aborted === true;
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Race a shared promise against a caller's AbortSignal without coupling the
|
|
57
|
+
* underlying work to that signal. The shared promise keeps running (and caches
|
|
58
|
+
* its result) even when an individual caller bails out.
|
|
59
|
+
*/
|
|
60
|
+
export function raceWithSignal<T>(promise: Promise<T>, signal: AbortSignal | undefined): Promise<T> {
|
|
61
|
+
if (!signal) return promise;
|
|
62
|
+
if (signal.aborted) return Promise.reject(signal.reason ?? new AIError.AbortError());
|
|
63
|
+
const { promise: aborted, reject } = Promise.withResolvers<never>();
|
|
64
|
+
const onAbort = () => reject(signal.reason ?? new AIError.AbortError());
|
|
65
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
66
|
+
return Promise.race([promise, aborted]).finally(() => signal.removeEventListener("abort", onAbort));
|
|
67
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic Authentication
|
|
3
|
+
*
|
|
4
|
+
* Thin helper for turning an already-resolved API key into the request-shaping
|
|
5
|
+
* config consumed by {@link buildAnthropicSearchHeaders} / {@link buildAnthropicUrl}.
|
|
6
|
+
*
|
|
7
|
+
* Credential storage and refresh live in `AuthStorage` — call
|
|
8
|
+
* `authStorage.getApiKey("anthropic", sessionId)` first, then pass the result
|
|
9
|
+
* through {@link buildAnthropicAuthConfig} for header/URL shaping.
|
|
10
|
+
*/
|
|
11
|
+
import { $env } from "jeopi-utils";
|
|
12
|
+
import {
|
|
13
|
+
buildAnthropicHeaders as buildProviderAnthropicHeaders,
|
|
14
|
+
normalizeAnthropicBaseUrl,
|
|
15
|
+
resolveAnthropicCustomHeadersForBaseUrl,
|
|
16
|
+
} from "../providers/anthropic";
|
|
17
|
+
import { isFoundryEnabled } from "./foundry";
|
|
18
|
+
|
|
19
|
+
/** Auth configuration for Anthropic */
|
|
20
|
+
export interface AnthropicAuthConfig {
|
|
21
|
+
apiKey: string;
|
|
22
|
+
baseUrl: string;
|
|
23
|
+
isOAuth: boolean;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
const DEFAULT_BASE_URL = "https://api.anthropic.com";
|
|
27
|
+
|
|
28
|
+
function normalizeBaseUrl(baseUrl: string | undefined): string | undefined {
|
|
29
|
+
const trimmed = baseUrl?.trim();
|
|
30
|
+
return trimmed ? trimmed.replace(/\/+$/, "") : undefined;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
export function resolveAnthropicBaseUrlFromEnv(): string | undefined {
|
|
34
|
+
if (isFoundryEnabled()) {
|
|
35
|
+
const foundryBaseUrl = normalizeBaseUrl($env.FOUNDRY_BASE_URL);
|
|
36
|
+
if (foundryBaseUrl) return foundryBaseUrl;
|
|
37
|
+
}
|
|
38
|
+
const anthropicBaseUrl = normalizeBaseUrl($env.ANTHROPIC_BASE_URL);
|
|
39
|
+
return anthropicBaseUrl || undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Checks if a token is an OAuth token by looking for sk-ant-oat prefix.
|
|
44
|
+
*/
|
|
45
|
+
export function isOAuthToken(apiKey: string): boolean {
|
|
46
|
+
return apiKey.includes("sk-ant-oat");
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* Build an {@link AnthropicAuthConfig} from an already-resolved API key.
|
|
51
|
+
*
|
|
52
|
+
* `apiKey` is whatever the caller chose for `Authorization`/`x-api-key` —
|
|
53
|
+
* usually `authStorage.getApiKey("anthropic")`. `baseUrl` overrides the
|
|
54
|
+
* env-derived base; pass `undefined` to fall back to FOUNDRY/ANTHROPIC env
|
|
55
|
+
* resolution and finally `DEFAULT_BASE_URL`.
|
|
56
|
+
*
|
|
57
|
+
* `isOAuth` is derived from the token prefix so the helper stays pure: callers
|
|
58
|
+
* never have to thread the OAuth flag through their own resolution logic.
|
|
59
|
+
*/
|
|
60
|
+
export function buildAnthropicAuthConfig(apiKey: string, baseUrl?: string): AnthropicAuthConfig {
|
|
61
|
+
return {
|
|
62
|
+
apiKey,
|
|
63
|
+
baseUrl: normalizeBaseUrl(baseUrl) ?? resolveAnthropicBaseUrlFromEnv() ?? DEFAULT_BASE_URL,
|
|
64
|
+
isOAuth: isOAuthToken(apiKey),
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Builds HTTP headers for Anthropic API requests (search variant).
|
|
70
|
+
*
|
|
71
|
+
* Forwards `ANTHROPIC_CUSTOM_HEADERS` when the resolver deems them applicable
|
|
72
|
+
* (Foundry mode, or a non-Anthropic base URL — typically an enterprise
|
|
73
|
+
* gateway), matching the streaming path so web search behaves identically.
|
|
74
|
+
*/
|
|
75
|
+
export function buildAnthropicSearchHeaders(auth: AnthropicAuthConfig): Record<string, string> {
|
|
76
|
+
return buildProviderAnthropicHeaders({
|
|
77
|
+
apiKey: auth.apiKey,
|
|
78
|
+
baseUrl: auth.baseUrl,
|
|
79
|
+
isOAuth: auth.isOAuth,
|
|
80
|
+
extraBetas: ["web-search-2025-03-05"],
|
|
81
|
+
stream: false,
|
|
82
|
+
modelHeaders: resolveAnthropicCustomHeadersForBaseUrl(auth.baseUrl),
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Builds the full API URL for Anthropic messages endpoint.
|
|
88
|
+
*/
|
|
89
|
+
export function buildAnthropicUrl(auth: AnthropicAuthConfig): string {
|
|
90
|
+
const normalizedBaseUrl = normalizeAnthropicBaseUrl(auth.baseUrl);
|
|
91
|
+
const base = `${normalizedBaseUrl}/v1/messages`;
|
|
92
|
+
return `${base}?beta=true`;
|
|
93
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/** Stores streamed tool-call argument JSON for live renderers and parser recovery. */
|
|
2
|
+
export const kStreamingPartialJson = Symbol("provider.block.partialJson");
|
|
3
|
+
|
|
4
|
+
/** Carries streamed tool-call argument JSON without exposing a string-keyed property. */
|
|
5
|
+
export type StreamingPartialJsonCarrier = object & { [kStreamingPartialJson]?: string };
|
|
6
|
+
|
|
7
|
+
/** Reads streamed tool-call argument JSON from a block or event snapshot. */
|
|
8
|
+
export function getStreamingPartialJson(block: StreamingPartialJsonCarrier | null | undefined): string | undefined {
|
|
9
|
+
return block?.[kStreamingPartialJson];
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
/** Writes streamed tool-call argument JSON to a block or clears it with `undefined`. */
|
|
13
|
+
export function setStreamingPartialJson(block: StreamingPartialJsonCarrier, value: string | undefined): void {
|
|
14
|
+
block[kStreamingPartialJson] = value;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/** Clears streamed tool-call argument JSON without deleting or changing object shape. */
|
|
18
|
+
export function clearStreamingPartialJson(block: StreamingPartialJsonCarrier): void {
|
|
19
|
+
if (Object.hasOwn(block, kStreamingPartialJson)) block[kStreamingPartialJson] = undefined;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/** Stores a provider-local stream block index without exposing a string-keyed property. */
|
|
23
|
+
export const kStreamingBlockIndex = Symbol("provider.block.index");
|
|
24
|
+
|
|
25
|
+
/** Stores the last parsed argument prefix length for throttled streaming JSON parsing. */
|
|
26
|
+
export const kStreamingLastParseLen = Symbol("provider.block.lastParseLen");
|
|
27
|
+
|
|
28
|
+
/** Marks streamed tool-call arguments that already received an authoritative done payload. */
|
|
29
|
+
export const kStreamingArgumentsDone = Symbol("provider.block.argumentsDone");
|
|
30
|
+
|
|
31
|
+
/** Classifies Cursor's in-flight tool-call kind without leaking provider-private state. */
|
|
32
|
+
export const kStreamingBlockKind = Symbol("provider.block.kind");
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A UUID-shaped string: five hex groups in the canonical 8-4-4-4-12 layout.
|
|
3
|
+
*
|
|
4
|
+
* NOT a spec-compliant RFC 4122 UUID — the version/variant nibbles are left as
|
|
5
|
+
* raw hash output — but the shape passes everywhere a UUID string is expected.
|
|
6
|
+
*/
|
|
7
|
+
export type DeterministicUuid = `${string}-${string}-${string}-${string}-${string}`;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Format the leading 128 bits of `seed`'s SHA-256 digest as a v4-shape UUID
|
|
11
|
+
* (8-4-4-4-12 hex groups).
|
|
12
|
+
*
|
|
13
|
+
* Deterministic: identical seeds always map to the same id, so callers get
|
|
14
|
+
* stable ids across requests / conversation turns (reusing message-blob ids,
|
|
15
|
+
* keying prompt caches) without persisting a seed→id mapping.
|
|
16
|
+
*/
|
|
17
|
+
export function deterministicUuid(seed: string): DeterministicUuid {
|
|
18
|
+
const hex = new Bun.CryptoHasher("sha256").update(seed).digest("hex");
|
|
19
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20, 32)}`;
|
|
20
|
+
}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bounded retries for an empty assistant completion.
|
|
3
|
+
*
|
|
4
|
+
* Some providers — and especially flaky OpenAI-/Anthropic-compatible gateways —
|
|
5
|
+
* intermittently return a benign terminal stop carrying no content and no usage
|
|
6
|
+
* (e.g. a single OpenAI `delta: {}` + `finish_reason: "stop"` chunk). Delivered
|
|
7
|
+
* as-is the agent loop has nothing to act on and silently halts mid-task, so the
|
|
8
|
+
* request must be retried instead of surfaced.
|
|
9
|
+
*
|
|
10
|
+
* This wraps a single-attempt provider stream and re-invokes it (a fresh request
|
|
11
|
+
* with its own message state) when an attempt produces no meaningful content.
|
|
12
|
+
* Only a stream that streamed nothing meaningful is retried: the moment any
|
|
13
|
+
* text/thinking/tool delta is forwarded the attempt is committed, so live
|
|
14
|
+
* streaming (including thinking) is never delayed, retried, or duplicated.
|
|
15
|
+
*
|
|
16
|
+
* Mirrors the Gemini empty-response policy in `google-shared` (which keeps its
|
|
17
|
+
* own integrated loop) and is shared by the OpenAI-completions and
|
|
18
|
+
* Anthropic-messages providers.
|
|
19
|
+
*/
|
|
20
|
+
import { scheduler } from "node:timers/promises";
|
|
21
|
+
import type { AssistantMessage, AssistantMessageEvent, Context } from "../types";
|
|
22
|
+
import { AssistantMessageEventStream } from "./event-stream";
|
|
23
|
+
|
|
24
|
+
export const MAX_EMPTY_COMPLETION_RETRIES = 2;
|
|
25
|
+
export const EMPTY_COMPLETION_BASE_DELAY_MS = 500;
|
|
26
|
+
|
|
27
|
+
const NON_WHITESPACE_RE = /\S/;
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Whether a completed assistant message carries content worth delivering: a tool
|
|
31
|
+
* call or any non-whitespace text. An empty/whitespace-only message — or one
|
|
32
|
+
* that only ever produced thinking — is the "empty response" failure.
|
|
33
|
+
*/
|
|
34
|
+
export function hasVisibleAssistantContent(message: AssistantMessage): boolean {
|
|
35
|
+
for (const block of message.content) {
|
|
36
|
+
if (block.type === "toolCall") return true;
|
|
37
|
+
if (block.type === "text" && NON_WHITESPACE_RE.test(block.text)) return true;
|
|
38
|
+
}
|
|
39
|
+
return false;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/** A streamed event that delivers content worth committing the attempt for. */
|
|
43
|
+
function isMeaningfulCompletionEvent(event: AssistantMessageEvent): boolean {
|
|
44
|
+
switch (event.type) {
|
|
45
|
+
case "text_delta":
|
|
46
|
+
case "thinking_delta":
|
|
47
|
+
case "toolcall_delta":
|
|
48
|
+
return event.delta.length > 0;
|
|
49
|
+
case "text_end":
|
|
50
|
+
case "thinking_end":
|
|
51
|
+
return event.content.length > 0;
|
|
52
|
+
case "toolcall_start":
|
|
53
|
+
case "toolcall_end":
|
|
54
|
+
return true;
|
|
55
|
+
default:
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
interface EmptyCompletionRetryOptions {
|
|
61
|
+
signal?: AbortSignal;
|
|
62
|
+
providerRetryWait?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Wrap a single-attempt provider stream with bounded empty-completion retries.
|
|
67
|
+
* `attempt` MUST create a fresh request (and its own output message) on each
|
|
68
|
+
* call so a retry never inherits stale metadata from an empty attempt.
|
|
69
|
+
*/
|
|
70
|
+
export function withEmptyCompletionRetry<M, O extends EmptyCompletionRetryOptions>(
|
|
71
|
+
model: M,
|
|
72
|
+
context: Context,
|
|
73
|
+
options: O | undefined,
|
|
74
|
+
attempt: (model: M, context: Context, options?: O) => AssistantMessageEventStream,
|
|
75
|
+
): AssistantMessageEventStream {
|
|
76
|
+
const outer = new AssistantMessageEventStream();
|
|
77
|
+
const signal = options?.signal;
|
|
78
|
+
void (async () => {
|
|
79
|
+
for (let emptyAttempt = 0; ; emptyAttempt++) {
|
|
80
|
+
const inner = attempt(model, context, options);
|
|
81
|
+
const buffered: AssistantMessageEvent[] = [];
|
|
82
|
+
let committed = false;
|
|
83
|
+
let terminal: AssistantMessageEvent | undefined;
|
|
84
|
+
const flush = (): void => {
|
|
85
|
+
for (const event of buffered) outer.push(event);
|
|
86
|
+
buffered.length = 0;
|
|
87
|
+
};
|
|
88
|
+
try {
|
|
89
|
+
for await (const event of inner) {
|
|
90
|
+
if (event.type === "done" || event.type === "error") {
|
|
91
|
+
terminal = event;
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
// Buffer pre-content events (start/*_start) so an empty attempt can
|
|
95
|
+
// be discarded; commit the moment real content streams.
|
|
96
|
+
if (!committed && !isMeaningfulCompletionEvent(event)) {
|
|
97
|
+
buffered.push(event);
|
|
98
|
+
continue;
|
|
99
|
+
}
|
|
100
|
+
committed = true;
|
|
101
|
+
flush();
|
|
102
|
+
outer.push(event);
|
|
103
|
+
if (outer.done) return;
|
|
104
|
+
}
|
|
105
|
+
} catch (error) {
|
|
106
|
+
flush();
|
|
107
|
+
outer.fail(error);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// Retry only a genuinely degenerate completion: a normal stop that
|
|
112
|
+
// produced no visible content AND billed no output tokens (the flaky
|
|
113
|
+
// gateway signature — charged nothing, returned nothing). A stop that
|
|
114
|
+
// reports output tokens spent its budget somewhere (e.g. thinking) and
|
|
115
|
+
// is left alone.
|
|
116
|
+
const message = terminal?.type === "done" ? terminal.message : undefined;
|
|
117
|
+
const isRetryableEmpty =
|
|
118
|
+
!committed &&
|
|
119
|
+
message !== undefined &&
|
|
120
|
+
message.stopReason === "stop" &&
|
|
121
|
+
!message.errorMessage &&
|
|
122
|
+
(message.usage?.output ?? 0) <= 0 &&
|
|
123
|
+
!hasVisibleAssistantContent(message);
|
|
124
|
+
|
|
125
|
+
if (isRetryableEmpty && emptyAttempt < MAX_EMPTY_COMPLETION_RETRIES && !signal?.aborted) {
|
|
126
|
+
const delayMs = EMPTY_COMPLETION_BASE_DELAY_MS * 2 ** emptyAttempt;
|
|
127
|
+
try {
|
|
128
|
+
if (options?.providerRetryWait) await options.providerRetryWait(delayMs, signal);
|
|
129
|
+
else await scheduler.wait(delayMs, { signal });
|
|
130
|
+
} catch (waitError) {
|
|
131
|
+
// Aborted during backoff: deliver the empty result rather than hang.
|
|
132
|
+
// Any other wait failure is a real error and must surface.
|
|
133
|
+
flush();
|
|
134
|
+
if (signal?.aborted) {
|
|
135
|
+
if (terminal) outer.push(terminal);
|
|
136
|
+
} else {
|
|
137
|
+
outer.fail(waitError);
|
|
138
|
+
}
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
// Discard the buffered `start` from this empty attempt and retry.
|
|
142
|
+
continue;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
flush();
|
|
146
|
+
if (terminal) {
|
|
147
|
+
outer.push(terminal);
|
|
148
|
+
} else if (!outer.done) {
|
|
149
|
+
try {
|
|
150
|
+
outer.end(await inner.result());
|
|
151
|
+
} catch (error) {
|
|
152
|
+
outer.fail(error);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
})();
|
|
158
|
+
return outer;
|
|
159
|
+
}
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
import * as AIError from "../error";
|
|
2
|
+
import type { AssistantMessage, AssistantMessageEvent } from "../types";
|
|
3
|
+
|
|
4
|
+
// Generic event stream class for async iteration
|
|
5
|
+
export class EventStream<T, R = T> implements AsyncIterable<T> {
|
|
6
|
+
queue: T[] = [];
|
|
7
|
+
waiting: Array<{ resolve: (value: IteratorResult<T>) => void; reject: (err: unknown) => void }> = [];
|
|
8
|
+
done = false;
|
|
9
|
+
/** True once finalResultPromise has been resolved or rejected. */
|
|
10
|
+
resultSettled = false;
|
|
11
|
+
#failed = false;
|
|
12
|
+
#error: unknown = undefined;
|
|
13
|
+
finalResultPromise: Promise<R>;
|
|
14
|
+
resolveFinalResult!: (result: R) => void;
|
|
15
|
+
rejectFinalResult!: (err: unknown) => void;
|
|
16
|
+
isComplete: (event: T) => boolean;
|
|
17
|
+
extractResult: (event: T) => R;
|
|
18
|
+
|
|
19
|
+
constructor(isComplete: (event: T) => boolean, extractResult: (event: T) => R) {
|
|
20
|
+
const { promise, resolve, reject } = Promise.withResolvers<R>();
|
|
21
|
+
// Prevent an unhandled rejection when fail() is called but nobody awaits result().
|
|
22
|
+
// Callers who do await result() still receive the rejection normally.
|
|
23
|
+
promise.catch(() => {});
|
|
24
|
+
this.finalResultPromise = promise;
|
|
25
|
+
this.resolveFinalResult = resolve;
|
|
26
|
+
this.rejectFinalResult = reject;
|
|
27
|
+
this.isComplete = isComplete;
|
|
28
|
+
this.extractResult = extractResult;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
push(event: T): void {
|
|
32
|
+
if (this.done) return;
|
|
33
|
+
|
|
34
|
+
if (this.isComplete(event)) {
|
|
35
|
+
this.done = true;
|
|
36
|
+
this.resultSettled = true;
|
|
37
|
+
this.resolveFinalResult(this.extractResult(event));
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Deliver to waiting consumer or queue it
|
|
41
|
+
const waiter = this.waiting.shift();
|
|
42
|
+
if (waiter) {
|
|
43
|
+
waiter.resolve({ value: event, done: false });
|
|
44
|
+
} else {
|
|
45
|
+
this.queue.push(event);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
deliver(event: T): void {
|
|
50
|
+
const waiter = this.waiting.shift();
|
|
51
|
+
if (waiter) {
|
|
52
|
+
waiter.resolve({ value: event, done: false });
|
|
53
|
+
} else {
|
|
54
|
+
this.queue.push(event);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
end(result?: R): void {
|
|
59
|
+
this.done = true;
|
|
60
|
+
if (result !== undefined) {
|
|
61
|
+
this.resultSettled = true;
|
|
62
|
+
this.resolveFinalResult(result);
|
|
63
|
+
} else if (!this.resultSettled) {
|
|
64
|
+
// end() without a terminal value must still settle result() —
|
|
65
|
+
// otherwise complete()/result() awaits hang forever.
|
|
66
|
+
this.resultSettled = true;
|
|
67
|
+
this.rejectFinalResult(
|
|
68
|
+
new AIError.ProviderResponseError("Stream ended without a final result", { kind: "envelope" }),
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
// Notify all waiting consumers that we're done
|
|
72
|
+
while (this.waiting.length > 0) {
|
|
73
|
+
const waiter = this.waiting.shift()!;
|
|
74
|
+
waiter.resolve({ value: undefined as any, done: true });
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
endWaiting(): void {
|
|
79
|
+
while (this.waiting.length > 0) {
|
|
80
|
+
const waiter = this.waiting.shift()!;
|
|
81
|
+
waiter.resolve({ value: undefined as any, done: true });
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
fail(err: unknown): void {
|
|
86
|
+
if (this.done) return;
|
|
87
|
+
this.done = true;
|
|
88
|
+
this.#failed = true;
|
|
89
|
+
this.#error = err;
|
|
90
|
+
this.resultSettled = true;
|
|
91
|
+
this.rejectFinalResult(err);
|
|
92
|
+
while (this.waiting.length > 0) {
|
|
93
|
+
const waiter = this.waiting.shift()!;
|
|
94
|
+
waiter.reject(err);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
async *[Symbol.asyncIterator](): AsyncIterator<T> {
|
|
99
|
+
while (true) {
|
|
100
|
+
if (this.queue.length > 0) {
|
|
101
|
+
yield this.queue.shift()!;
|
|
102
|
+
} else if (this.#failed) {
|
|
103
|
+
throw this.#error;
|
|
104
|
+
} else if (this.done) {
|
|
105
|
+
return;
|
|
106
|
+
} else {
|
|
107
|
+
const result = await new Promise<IteratorResult<T>>((resolve, reject) =>
|
|
108
|
+
this.waiting.push({ resolve, reject }),
|
|
109
|
+
);
|
|
110
|
+
if (result.done) return;
|
|
111
|
+
yield result.value;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
result(): Promise<R> {
|
|
117
|
+
return this.finalResultPromise;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
export class AssistantMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {
|
|
122
|
+
constructor() {
|
|
123
|
+
super(
|
|
124
|
+
event => event.type === "done" || event.type === "error",
|
|
125
|
+
event => {
|
|
126
|
+
if (event.type === "done") {
|
|
127
|
+
return event.message;
|
|
128
|
+
} else if (event.type === "error") {
|
|
129
|
+
return event.error;
|
|
130
|
+
}
|
|
131
|
+
throw new AIError.ProviderResponseError("Unexpected event type for final result", { kind: "envelope" });
|
|
132
|
+
},
|
|
133
|
+
);
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
override push(event: AssistantMessageEvent): void {
|
|
137
|
+
if (this.done) return;
|
|
138
|
+
|
|
139
|
+
if (event.type === "error" && event.error.stopReason === "error") {
|
|
140
|
+
AIError.classifyMessage(event.error);
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// Completion resolves the final result and still emits the terminal event.
|
|
144
|
+
if (this.isComplete(event)) {
|
|
145
|
+
this.done = true;
|
|
146
|
+
this.resultSettled = true;
|
|
147
|
+
this.resolveFinalResult(this.extractResult(event));
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
this.deliver(event);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
override end(result?: AssistantMessage): void {
|
|
154
|
+
this.done = true;
|
|
155
|
+
if (result !== undefined) {
|
|
156
|
+
if (result.stopReason === "error") {
|
|
157
|
+
AIError.classifyMessage(result);
|
|
158
|
+
}
|
|
159
|
+
this.resultSettled = true;
|
|
160
|
+
this.resolveFinalResult(result);
|
|
161
|
+
} else if (!this.resultSettled) {
|
|
162
|
+
// Mirror the base class: a result-less end() must not leave
|
|
163
|
+
// result() pending forever.
|
|
164
|
+
this.resultSettled = true;
|
|
165
|
+
this.rejectFinalResult(
|
|
166
|
+
new AIError.ProviderResponseError("Stream ended without a final result", { kind: "envelope" }),
|
|
167
|
+
);
|
|
168
|
+
}
|
|
169
|
+
this.endWaiting();
|
|
170
|
+
}
|
|
171
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { $env } from "jeopi-utils";
|
|
2
|
+
|
|
3
|
+
export function isFoundryEnabled(): boolean {
|
|
4
|
+
const value = $env.CLAUDE_CODE_USE_FOUNDRY;
|
|
5
|
+
if (!value) return false;
|
|
6
|
+
const normalized = value.trim().toLowerCase();
|
|
7
|
+
return normalized === "1" || normalized === "true" || normalized === "yes" || normalized === "on";
|
|
8
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export function extractGoogleValidationUrl(errorBody: string): string | undefined {
|
|
2
|
+
if (!errorBody.includes("VALIDATION_REQUIRED")) return undefined;
|
|
3
|
+
const start = errorBody.indexOf("{");
|
|
4
|
+
if (start === -1) return undefined;
|
|
5
|
+
try {
|
|
6
|
+
const parsed = JSON.parse(errorBody.slice(start)) as {
|
|
7
|
+
error?: { details?: Array<{ reason?: string; metadata?: { validation_url?: string } }> };
|
|
8
|
+
};
|
|
9
|
+
const detail = parsed.error?.details?.find(
|
|
10
|
+
d => d.reason === "VALIDATION_REQUIRED" && typeof d.metadata?.validation_url === "string",
|
|
11
|
+
);
|
|
12
|
+
return detail?.metadata?.validation_url;
|
|
13
|
+
} catch {
|
|
14
|
+
return undefined;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function formatGoogleValidationRequiredMessage(
|
|
19
|
+
validationUrl: string,
|
|
20
|
+
nextAction: string,
|
|
21
|
+
email?: string,
|
|
22
|
+
): string {
|
|
23
|
+
const account = email ? ` for ${email}` : "";
|
|
24
|
+
return `Account verification required${account}. Visit ${validationUrl} to continue, then ${nextAction}.`;
|
|
25
|
+
}
|