@linxiraos/pi-ai 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5066 -0
- package/README.md +1195 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth/sqlite-credential-store.d.ts +117 -0
- package/dist/types/auth-broker/client.d.ts +93 -0
- package/dist/types/auth-broker/discover.d.ts +39 -0
- package/dist/types/auth-broker/index.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +136 -0
- package/dist/types/auth-broker/server.d.ts +48 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +152 -0
- package/dist/types/auth-broker/wire-schema-resource.d.ts +53 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +5 -0
- package/dist/types/auth-gateway/http.d.ts +56 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +36 -0
- package/dist/types/auth-gateway/types.d.ts +127 -0
- package/dist/types/auth-retry.d.ts +150 -0
- package/dist/types/auth-storage.d.ts +1258 -0
- package/dist/types/dialect/anthropic.d.ts +15 -0
- package/dist/types/dialect/catalog.d.ts +3 -0
- package/dist/types/dialect/coercion.d.ts +23 -0
- package/dist/types/dialect/deepseek.d.ts +14 -0
- package/dist/types/dialect/demotion.d.ts +30 -0
- package/dist/types/dialect/examples.d.ts +18 -0
- package/dist/types/dialect/factory.d.ts +3 -0
- package/dist/types/dialect/fenced-thinking.d.ts +53 -0
- package/dist/types/dialect/gemini.d.ts +17 -0
- package/dist/types/dialect/gemma.d.ts +15 -0
- package/dist/types/dialect/glm.d.ts +9 -0
- package/dist/types/dialect/harmony.d.ts +8 -0
- package/dist/types/dialect/hermes.d.ts +9 -0
- package/dist/types/dialect/history.d.ts +3 -0
- package/dist/types/dialect/index.d.ts +11 -0
- package/dist/types/dialect/inventory.d.ts +9 -0
- package/dist/types/dialect/kimi.d.ts +14 -0
- package/dist/types/dialect/minimax.d.ts +3 -0
- package/dist/types/dialect/owned-stream.d.ts +4 -0
- package/dist/types/dialect/qwen3.d.ts +9 -0
- package/dist/types/dialect/rendering.d.ts +54 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +68 -0
- package/dist/types/dialect/xml.d.ts +9 -0
- package/dist/types/error/abort.d.ts +14 -0
- package/dist/types/error/auth-classify.d.ts +20 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +27 -0
- package/dist/types/error/classes.d.ts +106 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +94 -0
- package/dist/types/error/format.d.ts +20 -0
- package/dist/types/error/gateway.d.ts +20 -0
- package/dist/types/error/index.d.ts +14 -0
- package/dist/types/error/oauth.d.ts +43 -0
- package/dist/types/error/provider.d.ts +42 -0
- package/dist/types/error/rate-limit.d.ts +80 -0
- package/dist/types/error/retryable.d.ts +27 -0
- package/dist/types/error/validation.d.ts +32 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +106 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +937 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +345 -0
- package/dist/types/providers/anthropic.d.ts +261 -0
- package/dist/types/providers/aws-credentials.d.ts +48 -0
- package/dist/types/providers/aws-eventstream.d.ts +39 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +16 -0
- package/dist/types/providers/bedrock-mantle.d.ts +13 -0
- package/dist/types/providers/claude-code-fingerprint.d.ts +19 -0
- package/dist/types/providers/cowork-fetch.d.ts +3 -0
- package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
- package/dist/types/providers/cursor-pi-args.d.ts +105 -0
- package/dist/types/providers/cursor.d.ts +221 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +25 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +120 -0
- package/dist/types/providers/google-shared.d.ts +203 -0
- package/dist/types/providers/google-types.d.ts +155 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +179 -0
- package/dist/types/providers/ollama.d.ts +8 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +35 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +1311 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +669 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +109 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +238 -0
- package/dist/types/providers/openai-completions.d.ts +48 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +1314 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6099 -0
- package/dist/types/providers/openai-responses.d.ts +131 -0
- package/dist/types/providers/openai-shared.d.ts +624 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +69 -0
- package/dist/types/providers/register-builtins.d.ts +37 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +32 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/registry/aiand.d.ts +7 -0
- package/dist/types/registry/aimlapi.d.ts +4 -0
- package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
- package/dist/types/registry/alibaba-token-plan.d.ts +18 -0
- package/dist/types/registry/amazon-bedrock.d.ts +5 -0
- package/dist/types/registry/anthropic.d.ts +10 -0
- package/dist/types/registry/api-key-login.d.ts +42 -0
- package/dist/types/registry/api-key-validation.d.ts +43 -0
- package/dist/types/registry/aws.d.ts +13 -0
- package/dist/types/registry/azure.d.ts +4 -0
- package/dist/types/registry/baseten.d.ts +7 -0
- package/dist/types/registry/bedrock-mantle.d.ts +22 -0
- package/dist/types/registry/cerebras.d.ts +7 -0
- package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
- package/dist/types/registry/coreweave.d.ts +7 -0
- package/dist/types/registry/cursor.d.ts +7 -0
- package/dist/types/registry/deepseek.d.ts +8 -0
- package/dist/types/registry/derived.d.ts +5 -0
- package/dist/types/registry/devin.d.ts +8 -0
- package/dist/types/registry/exa.d.ts +8 -0
- package/dist/types/registry/firepass.d.ts +16 -0
- package/dist/types/registry/fireworks.d.ts +7 -0
- package/dist/types/registry/github-copilot.d.ts +7 -0
- package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
- package/dist/types/registry/gitlab-duo.d.ts +9 -0
- package/dist/types/registry/gmi-cloud.d.ts +7 -0
- package/dist/types/registry/google-antigravity.d.ts +9 -0
- package/dist/types/registry/google-gemini-cli.d.ts +9 -0
- package/dist/types/registry/google-vertex.d.ts +5 -0
- package/dist/types/registry/google.d.ts +4 -0
- package/dist/types/registry/groq.d.ts +4 -0
- package/dist/types/registry/huggingface.d.ts +7 -0
- package/dist/types/registry/index.d.ts +4 -0
- package/dist/types/registry/kagi.d.ts +14 -0
- package/dist/types/registry/kilo.d.ts +7 -0
- package/dist/types/registry/kimi-code.d.ts +7 -0
- package/dist/types/registry/litellm.d.ts +13 -0
- package/dist/types/registry/llama-cpp.d.ts +8 -0
- package/dist/types/registry/lm-studio.d.ts +8 -0
- package/dist/types/registry/meta.d.ts +7 -0
- package/dist/types/registry/minimax-code-cn.d.ts +6 -0
- package/dist/types/registry/minimax-code.d.ts +6 -0
- package/dist/types/registry/minimax.d.ts +4 -0
- package/dist/types/registry/mistral.d.ts +4 -0
- package/dist/types/registry/moonshot.d.ts +7 -0
- package/dist/types/registry/nanogpt.d.ts +7 -0
- package/dist/types/registry/novita.d.ts +6 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/anthropic-constants.d.ts +12 -0
- package/dist/types/registry/oauth/anthropic.d.ts +24 -0
- package/dist/types/registry/oauth/callback-server.d.ts +74 -0
- package/dist/types/registry/oauth/cursor.d.ts +16 -0
- package/dist/types/registry/oauth/device-code.d.ts +25 -0
- package/dist/types/registry/oauth/devin.d.ts +5 -0
- package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
- package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
- package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/registry/oauth/google-gemini-cli.d.ts +22 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +56 -0
- package/dist/types/registry/oauth/index.d.ts +45 -0
- package/dist/types/registry/oauth/kimi.d.ts +21 -0
- package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
- package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
- package/dist/types/registry/oauth/opencode.d.ts +18 -0
- package/dist/types/registry/oauth/perplexity.d.ts +9 -0
- package/dist/types/registry/oauth/pkce.d.ts +8 -0
- package/dist/types/registry/oauth/types.d.ts +87 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +46 -0
- package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
- package/dist/types/registry/oauth/zai.d.ts +25 -0
- package/dist/types/registry/ollama-cloud.d.ts +7 -0
- package/dist/types/registry/ollama.d.ts +12 -0
- package/dist/types/registry/openai-codex-device.d.ts +8 -0
- package/dist/types/registry/openai-codex.d.ts +9 -0
- package/dist/types/registry/openai.d.ts +4 -0
- package/dist/types/registry/opencode-go.d.ts +6 -0
- package/dist/types/registry/opencode-zen.d.ts +6 -0
- package/dist/types/registry/openrouter.d.ts +13 -0
- package/dist/types/registry/parallel.d.ts +14 -0
- package/dist/types/registry/perplexity.d.ts +7 -0
- package/dist/types/registry/qianfan.d.ts +7 -0
- package/dist/types/registry/qwen-portal.d.ts +7 -0
- package/dist/types/registry/registry.d.ts +367 -0
- package/dist/types/registry/sakana.d.ts +7 -0
- package/dist/types/registry/siliconflow-cn.d.ts +7 -0
- package/dist/types/registry/siliconflow.d.ts +7 -0
- package/dist/types/registry/synthetic.d.ts +6 -0
- package/dist/types/registry/tavily.d.ts +14 -0
- package/dist/types/registry/together.d.ts +6 -0
- package/dist/types/registry/types.d.ts +75 -0
- package/dist/types/registry/umans.d.ts +7 -0
- package/dist/types/registry/venice.d.ts +13 -0
- package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
- package/dist/types/registry/vllm.d.ts +7 -0
- package/dist/types/registry/wafer-serverless.d.ts +6 -0
- package/dist/types/registry/xai-oauth.d.ts +7 -0
- package/dist/types/registry/xai.d.ts +7 -0
- package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
- package/dist/types/registry/xiaomi.d.ts +6 -0
- package/dist/types/registry/zai.d.ts +15 -0
- package/dist/types/registry/zenmux.d.ts +7 -0
- package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
- package/dist/types/stream.d.ts +46 -0
- package/dist/types/types.d.ts +1064 -0
- package/dist/types/usage/alibaba-token-plan.d.ts +3 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/cursor.d.ts +4 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +15 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +3 -0
- package/dist/types/usage/ollama.d.ts +5 -0
- package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
- package/dist/types/usage/openai-codex-reset.d.ts +88 -0
- package/dist/types/usage/openai-codex.d.ts +10 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/synthetic.d.ts +2 -0
- package/dist/types/usage/umans.d.ts +2 -0
- package/dist/types/usage/xai-oauth.d.ts +12 -0
- package/dist/types/usage/zai.d.ts +3 -0
- package/dist/types/usage.d.ts +527 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/aws-profile.d.ts +17 -0
- package/dist/types/utils/block-symbols.d.ts +62 -0
- package/dist/types/utils/deterministic-id.d.ts +16 -0
- package/dist/types/utils/empty-completion-retry.d.ts +21 -0
- package/dist/types/utils/event-stream.d.ts +39 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/google-validation.d.ts +2 -0
- package/dist/types/utils/harmony-leak.d.ts +135 -0
- package/dist/types/utils/http-inspector.d.ts +49 -0
- package/dist/types/utils/idle-iterator.d.ts +149 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +33 -0
- package/dist/types/utils/openai-http.d.ts +48 -0
- package/dist/types/utils/openrouter-headers.d.ts +1 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/proxy.d.ts +39 -0
- package/dist/types/utils/request-debug.d.ts +29 -0
- package/dist/types/utils/retry-after.d.ts +4 -0
- package/dist/types/utils/retry.d.ts +14 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +54 -0
- package/dist/types/utils/schema/index.d.ts +14 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +153 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +17 -0
- package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/typescript.d.ts +24 -0
- package/dist/types/utils/schema/wire.d.ts +52 -0
- package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
- package/dist/types/utils/sse-debug.d.ts +5 -0
- package/dist/types/utils/stream-markup-healing.d.ts +87 -0
- package/dist/types/utils/thinking-loop.d.ts +102 -0
- package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
- package/dist/types/utils/tool-choice.d.ts +52 -0
- package/dist/types/utils/validation.d.ts +28 -0
- package/dist/types/utils.d.ts +57 -0
- package/package.json +138 -0
- package/src/api-registry.ts +109 -0
- package/src/auth/sqlite-credential-store.ts +2066 -0
- package/src/auth-broker/client.ts +471 -0
- package/src/auth-broker/discover.ts +310 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +1332 -0
- package/src/auth-broker/server.ts +898 -0
- package/src/auth-broker/snapshot-cache.ts +200 -0
- package/src/auth-broker/types.ts +193 -0
- package/src/auth-broker/wire-schema-resource.ts +487 -0
- package/src/auth-broker/wire-schemas.ts +43 -0
- package/src/auth-gateway/http.ts +227 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +836 -0
- package/src/auth-gateway/types.ts +153 -0
- package/src/auth-retry.ts +401 -0
- package/src/auth-storage.ts +6540 -0
- package/src/dialect/anthropic.md +31 -0
- package/src/dialect/anthropic.ts +608 -0
- package/src/dialect/catalog.ts +29 -0
- package/src/dialect/coercion.ts +136 -0
- package/src/dialect/deepseek.md +24 -0
- package/src/dialect/deepseek.ts +609 -0
- package/src/dialect/demotion.ts +40 -0
- package/src/dialect/examples.ts +71 -0
- package/src/dialect/factory.ts +34 -0
- package/src/dialect/fenced-thinking.ts +184 -0
- package/src/dialect/gemini.md +44 -0
- package/src/dialect/gemini.ts +583 -0
- package/src/dialect/gemma.md +33 -0
- package/src/dialect/gemma.ts +387 -0
- package/src/dialect/glm.md +32 -0
- package/src/dialect/glm.ts +579 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +345 -0
- package/src/dialect/hermes.md +25 -0
- package/src/dialect/hermes.ts +206 -0
- package/src/dialect/history.ts +81 -0
- package/src/dialect/index.ts +15 -0
- package/src/dialect/inventory.ts +30 -0
- package/src/dialect/kimi.md +24 -0
- package/src/dialect/kimi.ts +340 -0
- package/src/dialect/minimax.md +31 -0
- package/src/dialect/minimax.ts +95 -0
- package/src/dialect/owned-stream.ts +481 -0
- package/src/dialect/prompt-template.md +12 -0
- package/src/dialect/qwen3.md +28 -0
- package/src/dialect/qwen3.ts +240 -0
- package/src/dialect/rendering.ts +304 -0
- package/src/dialect/thinking.ts +292 -0
- package/src/dialect/types.ts +56 -0
- package/src/dialect/xml.md +22 -0
- package/src/dialect/xml.ts +90 -0
- package/src/error/abort.ts +18 -0
- package/src/error/auth-classify.ts +47 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +35 -0
- package/src/error/classes.ts +281 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +602 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +14 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +63 -0
- package/src/error/rate-limit.ts +303 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +51 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/amazon-bedrock.ts +1064 -0
- package/src/providers/anthropic-client.ts +317 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +818 -0
- package/src/providers/anthropic-wire.ts +359 -0
- package/src/providers/anthropic.ts +4539 -0
- package/src/providers/aws-credentials.ts +772 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +438 -0
- package/src/providers/bedrock-mantle.ts +110 -0
- package/src/providers/claude-code-fingerprint.ts +20 -0
- package/src/providers/cowork-fetch.ts +201 -0
- package/src/providers/cursor/exec-modern.ts +496 -0
- package/src/providers/cursor/proto/agent.proto +4533 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor-pi-args.ts +165 -0
- package/src/providers/cursor.ts +4689 -0
- package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
- package/src/providers/devin/proto/buf.gen.yaml +33 -0
- package/src/providers/devin/proto/buf.yaml +17 -0
- package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
- package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
- package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
- package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
- package/src/providers/devin/proto/cel/expr/value.proto +41 -0
- package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
- package/src/providers/devin/proto/errorspb/errors.proto +56 -0
- package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
- package/src/providers/devin/proto/errorspb/markers.proto +10 -0
- package/src/providers/devin/proto/errorspb/tags.proto +12 -0
- package/src/providers/devin/proto/errorspb/testing.proto +6 -0
- package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
- package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
- package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
- package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
- package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
- package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
- package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
- package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
- package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
- package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
- package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
- package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
- package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
- package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
- package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
- package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
- package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
- package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
- package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
- package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
- package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
- package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
- package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
- package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
- package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
- package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
- package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
- package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
- package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
- package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
- package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
- package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
- package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
- package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
- package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
- package/src/providers/devin.ts +679 -0
- package/src/providers/error-message.ts +23 -0
- package/src/providers/github-copilot-headers.ts +141 -0
- package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
- package/src/providers/gitlab-duo-workflow.ts +3135 -0
- package/src/providers/gitlab-duo.ts +399 -0
- package/src/providers/google-auth.ts +330 -0
- package/src/providers/google-gemini-cli.ts +1370 -0
- package/src/providers/google-shared.ts +1122 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +135 -0
- package/src/providers/google.ts +47 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +51 -0
- package/src/providers/mock.ts +514 -0
- package/src/providers/ollama.ts +776 -0
- package/src/providers/openai-anthropic-shim.ts +166 -0
- package/src/providers/openai-chat-server-schema.ts +243 -0
- package/src/providers/openai-chat-server.ts +752 -0
- package/src/providers/openai-chat-wire.ts +859 -0
- package/src/providers/openai-codex/request-transformer.ts +491 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +4716 -0
- package/src/providers/openai-completions.ts +2389 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-server-schema.ts +397 -0
- package/src/providers/openai-responses-server.ts +1466 -0
- package/src/providers/openai-responses-wire.ts +6416 -0
- package/src/providers/openai-responses.ts +1393 -0
- package/src/providers/openai-shared.ts +3500 -0
- package/src/providers/pi-native-client.ts +275 -0
- package/src/providers/pi-native-server.ts +245 -0
- package/src/providers/register-builtins.ts +503 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +1083 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aiand.ts +22 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +104 -0
- package/src/registry/alibaba-token-plan.ts +125 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +115 -0
- package/src/registry/api-key-validation.ts +145 -0
- package/src/registry/aws.ts +57 -0
- package/src/registry/azure.ts +6 -0
- package/src/registry/baseten.ts +22 -0
- package/src/registry/bedrock-mantle.ts +34 -0
- package/src/registry/cerebras.ts +23 -0
- package/src/registry/cloudflare-ai-gateway.ts +45 -0
- package/src/registry/coreweave.ts +40 -0
- package/src/registry/cursor.ts +20 -0
- package/src/registry/deepseek.ts +46 -0
- package/src/registry/derived.ts +9 -0
- package/src/registry/devin.ts +15 -0
- package/src/registry/exa.ts +19 -0
- package/src/registry/firepass.ts +32 -0
- package/src/registry/fireworks.ts +28 -0
- package/src/registry/github-copilot.ts +22 -0
- package/src/registry/gitlab-duo-workflow.ts +20 -0
- package/src/registry/gitlab-duo.ts +19 -0
- package/src/registry/gmi-cloud.ts +22 -0
- package/src/registry/google-antigravity.ts +22 -0
- package/src/registry/google-gemini-cli.ts +22 -0
- package/src/registry/google-vertex.ts +38 -0
- package/src/registry/google.ts +6 -0
- package/src/registry/groq.ts +6 -0
- package/src/registry/huggingface.ts +29 -0
- package/src/registry/index.ts +4 -0
- package/src/registry/kagi.ts +46 -0
- package/src/registry/kilo.ts +114 -0
- package/src/registry/kimi-code.ts +17 -0
- package/src/registry/litellm.ts +45 -0
- package/src/registry/llama-cpp.ts +35 -0
- package/src/registry/lm-studio.ts +31 -0
- package/src/registry/meta.ts +22 -0
- package/src/registry/minimax-code-cn.ts +12 -0
- package/src/registry/minimax-code.ts +12 -0
- package/src/registry/minimax.ts +6 -0
- package/src/registry/mistral.ts +6 -0
- package/src/registry/moonshot.ts +28 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/novita.ts +25 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/anthropic-constants.ts +12 -0
- package/src/registry/oauth/anthropic.ts +346 -0
- package/src/registry/oauth/callback-server.ts +438 -0
- package/src/registry/oauth/cursor.ts +187 -0
- package/src/registry/oauth/device-code.ts +92 -0
- package/src/registry/oauth/devin.ts +124 -0
- package/src/registry/oauth/github-copilot.ts +369 -0
- package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
- package/src/registry/oauth/gitlab-duo.ts +222 -0
- package/src/registry/oauth/google-antigravity.ts +225 -0
- package/src/registry/oauth/google-gemini-cli.ts +297 -0
- package/src/registry/oauth/google-oauth-shared.ts +211 -0
- package/src/registry/oauth/index.ts +187 -0
- package/src/registry/oauth/kimi.ts +297 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +317 -0
- package/src/registry/oauth/openai-codex.ts +384 -0
- package/src/registry/oauth/opencode.ts +50 -0
- package/src/registry/oauth/perplexity.ts +228 -0
- package/src/registry/oauth/pkce.ts +18 -0
- package/src/registry/oauth/types.ts +96 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +559 -0
- package/src/registry/oauth/xiaomi.ts +211 -0
- package/src/registry/oauth/zai.ts +285 -0
- package/src/registry/ollama-cloud.ts +36 -0
- package/src/registry/ollama.ts +43 -0
- package/src/registry/openai-codex-device.ts +18 -0
- package/src/registry/openai-codex.ts +19 -0
- package/src/registry/openai.ts +6 -0
- package/src/registry/opencode-go.ts +12 -0
- package/src/registry/opencode-zen.ts +12 -0
- package/src/registry/openrouter.ts +28 -0
- package/src/registry/parallel.ts +45 -0
- package/src/registry/perplexity.ts +13 -0
- package/src/registry/qianfan.ts +27 -0
- package/src/registry/qwen-portal.ts +50 -0
- package/src/registry/registry.ts +182 -0
- package/src/registry/sakana.ts +22 -0
- package/src/registry/siliconflow-cn.ts +22 -0
- package/src/registry/siliconflow.ts +22 -0
- package/src/registry/synthetic.ts +21 -0
- package/src/registry/tavily.ts +45 -0
- package/src/registry/together.ts +22 -0
- package/src/registry/types.ts +86 -0
- package/src/registry/umans.ts +23 -0
- package/src/registry/venice.ts +33 -0
- package/src/registry/vercel-ai-gateway.ts +38 -0
- package/src/registry/vllm.ts +34 -0
- package/src/registry/wafer-serverless.ts +12 -0
- package/src/registry/xai-oauth.ts +17 -0
- package/src/registry/xai.ts +22 -0
- package/src/registry/xiaomi-token-plan-ams.ts +12 -0
- package/src/registry/xiaomi-token-plan-cn.ts +12 -0
- package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
- package/src/registry/xiaomi.ts +12 -0
- package/src/registry/zai.ts +41 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1944 -0
- package/src/types.ts +1243 -0
- package/src/usage/alibaba-token-plan.ts +230 -0
- package/src/usage/claude.ts +830 -0
- package/src/usage/cursor.ts +335 -0
- package/src/usage/gemini.ts +258 -0
- package/src/usage/github-copilot.ts +424 -0
- package/src/usage/google-antigravity.ts +497 -0
- package/src/usage/kimi.ts +277 -0
- package/src/usage/minimax-code.ts +291 -0
- package/src/usage/ollama.ts +41 -0
- package/src/usage/openai-codex-base-url.ts +35 -0
- package/src/usage/openai-codex-reset.ts +205 -0
- package/src/usage/openai-codex.ts +627 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/synthetic.ts +180 -0
- package/src/usage/umans.ts +192 -0
- package/src/usage/xai-oauth.ts +414 -0
- package/src/usage/zai.ts +370 -0
- package/src/usage.ts +411 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/aws-profile.ts +88 -0
- package/src/utils/block-symbols.ts +78 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +161 -0
- package/src/utils/event-stream.ts +202 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +500 -0
- package/src/utils/http-inspector.ts +196 -0
- package/src/utils/idle-iterator.ts +531 -0
- package/src/utils/leaked-thinking-stream.ts +483 -0
- package/src/utils/openai-http.ts +119 -0
- package/src/utils/openrouter-headers.ts +12 -0
- package/src/utils/parse-bind.ts +56 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/proxy.ts +314 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +121 -0
- package/src/utils/retry.ts +77 -0
- package/src/utils/schema/CONSTRAINTS.md +168 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +210 -0
- package/src/utils/schema/index.ts +14 -0
- package/src/utils/schema/json-schema-validator.ts +595 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +2314 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +109 -0
- package/src/utils/schema/strict-tool-validation.ts +117 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/typescript.ts +212 -0
- package/src/utils/schema/wire.ts +662 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +18 -0
- package/src/utils/stream-markup-healing.ts +247 -0
- package/src/utils/thinking-loop.ts +552 -0
- package/src/utils/tool-call-loop-guard.ts +107 -0
- package/src/utils/tool-choice.ts +101 -0
- package/src/utils/validation.ts +1932 -0
- package/src/utils.ts +492 -0
|
@@ -0,0 +1,78 @@
|
|
|
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
|
+
/**
|
|
29
|
+
* The Cursor interaction envelope's `call_id` for a streamed tool-call block.
|
|
30
|
+
*
|
|
31
|
+
* Tracked separately from the block's own `id` because they are NOT the same
|
|
32
|
+
* key: MCP and Pi blocks are filed under the id inside the call's `args`, which
|
|
33
|
+
* is what the exec channel pairs its result under, while every streamed
|
|
34
|
+
* `ToolCall*Update` correlates on the envelope's `call_id`. Matching
|
|
35
|
+
* completions against the block id would mis-route every call whose args carry
|
|
36
|
+
* their own id.
|
|
37
|
+
*/
|
|
38
|
+
export const kStreamingEnvelopeId = Symbol("provider.block.envelopeId");
|
|
39
|
+
|
|
40
|
+
/** Marks streamed tool-call arguments that already received an authoritative done payload. */
|
|
41
|
+
export const kStreamingArgumentsDone = Symbol("provider.block.argumentsDone");
|
|
42
|
+
|
|
43
|
+
/** Classifies Cursor's in-flight tool-call kind without leaking provider-private state. */
|
|
44
|
+
export const kStreamingBlockKind = Symbol("provider.block.kind");
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Marks a `toolCall` content block that Cursor's exec channel already
|
|
48
|
+
* executed server-side (via the coding-agent bridge) and whose result is
|
|
49
|
+
* buffered separately for emission via the assistant-loop stream.
|
|
50
|
+
*
|
|
51
|
+
* `agent-loop.ts` MUST skip execution of blocks carrying this marker —
|
|
52
|
+
* treating them as a fresh runnable tool call would run the same
|
|
53
|
+
* side-effecting tool (bash, write, delete, …) a second time. Symbol-keyed
|
|
54
|
+
* so it never persists across the JSONL round-trip, where rebuild instead
|
|
55
|
+
* pairs the block with its already-persisted `toolResult` message by id.
|
|
56
|
+
*/
|
|
57
|
+
export const kCursorExecResolved = Symbol("provider.block.cursorExecResolved");
|
|
58
|
+
|
|
59
|
+
/** Carries the resolved marker without exposing a string-keyed property. */
|
|
60
|
+
export type CursorExecResolvedCarrier = object & { [kCursorExecResolved]?: true };
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Marks a text block synthesized by cross-model thinking demotion in
|
|
64
|
+
* `transformMessages`. Converters that flatten adjacent text blocks into one
|
|
65
|
+
* string (openai-completions) insert a paragraph separator after marked
|
|
66
|
+
* blocks; unmarked adjacent blocks keep their original byte sequence.
|
|
67
|
+
* Symbol-keyed so the marker never persists across the JSONL round-trip and
|
|
68
|
+
* never reaches the wire.
|
|
69
|
+
*/
|
|
70
|
+
export const kDemotedThinking = Symbol("provider.block.demotedThinking");
|
|
71
|
+
|
|
72
|
+
/** Carries the demoted-thinking marker without exposing a string-keyed property. */
|
|
73
|
+
export type DemotedThinkingCarrier = object & { [kDemotedThinking]?: boolean };
|
|
74
|
+
|
|
75
|
+
/** True for text blocks synthesized by cross-model thinking demotion. */
|
|
76
|
+
export function isDemotedThinking(block: DemotedThinkingCarrier | null | undefined): boolean {
|
|
77
|
+
return block?.[kDemotedThinking] === true;
|
|
78
|
+
}
|
|
@@ -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,161 @@
|
|
|
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: an
|
|
31
|
+
* image, tool call, or any non-whitespace text. An empty/whitespace-only message
|
|
32
|
+
* — or one 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 === "image") return true;
|
|
37
|
+
if (block.type === "toolCall") return true;
|
|
38
|
+
if (block.type === "text" && NON_WHITESPACE_RE.test(block.text)) return true;
|
|
39
|
+
}
|
|
40
|
+
return false;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** A streamed event that delivers content worth committing the attempt for. */
|
|
44
|
+
function isMeaningfulCompletionEvent(event: AssistantMessageEvent): boolean {
|
|
45
|
+
switch (event.type) {
|
|
46
|
+
case "text_delta":
|
|
47
|
+
case "thinking_delta":
|
|
48
|
+
case "toolcall_delta":
|
|
49
|
+
return event.delta.length > 0;
|
|
50
|
+
case "text_end":
|
|
51
|
+
case "thinking_end":
|
|
52
|
+
return event.content.length > 0;
|
|
53
|
+
case "image_end":
|
|
54
|
+
return true;
|
|
55
|
+
case "toolcall_start":
|
|
56
|
+
case "toolcall_end":
|
|
57
|
+
return true;
|
|
58
|
+
default:
|
|
59
|
+
return false;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
interface EmptyCompletionRetryOptions {
|
|
64
|
+
signal?: AbortSignal;
|
|
65
|
+
providerRetryWait?: (delayMs: number, signal?: AbortSignal) => Promise<void>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Wrap a single-attempt provider stream with bounded empty-completion retries.
|
|
70
|
+
* `attempt` MUST create a fresh request (and its own output message) on each
|
|
71
|
+
* call so a retry never inherits stale metadata from an empty attempt.
|
|
72
|
+
*/
|
|
73
|
+
export function withEmptyCompletionRetry<M, O extends EmptyCompletionRetryOptions>(
|
|
74
|
+
model: M,
|
|
75
|
+
context: Context,
|
|
76
|
+
options: O | undefined,
|
|
77
|
+
attempt: (model: M, context: Context, options?: O) => AssistantMessageEventStream,
|
|
78
|
+
): AssistantMessageEventStream {
|
|
79
|
+
const outer = new AssistantMessageEventStream();
|
|
80
|
+
const signal = options?.signal;
|
|
81
|
+
void (async () => {
|
|
82
|
+
for (let emptyAttempt = 0; ; emptyAttempt++) {
|
|
83
|
+
const inner = attempt(model, context, options);
|
|
84
|
+
const buffered: AssistantMessageEvent[] = [];
|
|
85
|
+
let committed = false;
|
|
86
|
+
let terminal: AssistantMessageEvent | undefined;
|
|
87
|
+
const flush = (): void => {
|
|
88
|
+
for (const event of buffered) outer.push(event);
|
|
89
|
+
buffered.length = 0;
|
|
90
|
+
};
|
|
91
|
+
try {
|
|
92
|
+
for await (const event of inner) {
|
|
93
|
+
if (event.type === "done" || event.type === "error") {
|
|
94
|
+
terminal = event;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
// Buffer pre-content events (start/*_start) so an empty attempt can
|
|
98
|
+
// be discarded; commit the moment real content streams.
|
|
99
|
+
if (!committed && !isMeaningfulCompletionEvent(event)) {
|
|
100
|
+
buffered.push(event);
|
|
101
|
+
continue;
|
|
102
|
+
}
|
|
103
|
+
committed = true;
|
|
104
|
+
flush();
|
|
105
|
+
outer.push(event);
|
|
106
|
+
if (outer.done) return;
|
|
107
|
+
}
|
|
108
|
+
} catch (error) {
|
|
109
|
+
flush();
|
|
110
|
+
outer.fail(error);
|
|
111
|
+
return;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
// Retry only a genuinely degenerate completion: a normal stop that
|
|
115
|
+
// produced no visible content and reported no generated content tokens.
|
|
116
|
+
// Some providers count the terminal EOS as one output token, so a
|
|
117
|
+
// one-token invisible stop is still the same empty-completion failure.
|
|
118
|
+
const message = terminal?.type === "done" ? terminal.message : undefined;
|
|
119
|
+
const isRetryableEmpty =
|
|
120
|
+
!committed &&
|
|
121
|
+
message !== undefined &&
|
|
122
|
+
message.stopReason === "stop" &&
|
|
123
|
+
!message.errorMessage &&
|
|
124
|
+
(message.usage?.output ?? 0) <= 1 &&
|
|
125
|
+
!hasVisibleAssistantContent(message);
|
|
126
|
+
|
|
127
|
+
if (isRetryableEmpty && emptyAttempt < MAX_EMPTY_COMPLETION_RETRIES && !signal?.aborted) {
|
|
128
|
+
const delayMs = EMPTY_COMPLETION_BASE_DELAY_MS * 2 ** emptyAttempt;
|
|
129
|
+
try {
|
|
130
|
+
if (options?.providerRetryWait) await options.providerRetryWait(delayMs, signal);
|
|
131
|
+
else await scheduler.wait(delayMs, { signal });
|
|
132
|
+
} catch (waitError) {
|
|
133
|
+
// Aborted during backoff: deliver the empty result rather than hang.
|
|
134
|
+
// Any other wait failure is a real error and must surface.
|
|
135
|
+
flush();
|
|
136
|
+
if (signal?.aborted) {
|
|
137
|
+
if (terminal) outer.push(terminal);
|
|
138
|
+
} else {
|
|
139
|
+
outer.fail(waitError);
|
|
140
|
+
}
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
// Discard the buffered `start` from this empty attempt and retry.
|
|
144
|
+
continue;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
flush();
|
|
148
|
+
if (terminal) {
|
|
149
|
+
outer.push(terminal);
|
|
150
|
+
} else if (!outer.done) {
|
|
151
|
+
try {
|
|
152
|
+
outer.end(await inner.result());
|
|
153
|
+
} catch (error) {
|
|
154
|
+
outer.fail(error);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return;
|
|
158
|
+
}
|
|
159
|
+
})();
|
|
160
|
+
return outer;
|
|
161
|
+
}
|
|
@@ -0,0 +1,202 @@
|
|
|
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
|
+
/**
|
|
14
|
+
* Consumer-side local operations currently in flight for this stream — a
|
|
15
|
+
* provider transport waiting on a server-requested local tool bridge
|
|
16
|
+
* (e.g. the Cursor exec channel) before it can send the result upstream.
|
|
17
|
+
* While non-zero, event silence is attributable to our own pending work,
|
|
18
|
+
* not a provider stall; idle watchdogs consult {@link hasPendingLocalWork}.
|
|
19
|
+
*/
|
|
20
|
+
#pendingLocalWork = 0;
|
|
21
|
+
finalResultPromise: Promise<R>;
|
|
22
|
+
resolveFinalResult!: (result: R) => void;
|
|
23
|
+
rejectFinalResult!: (err: unknown) => void;
|
|
24
|
+
isComplete: (event: T) => boolean;
|
|
25
|
+
extractResult: (event: T) => R;
|
|
26
|
+
|
|
27
|
+
constructor(isComplete: (event: T) => boolean, extractResult: (event: T) => R) {
|
|
28
|
+
const { promise, resolve, reject } = Promise.withResolvers<R>();
|
|
29
|
+
// Prevent an unhandled rejection when fail() is called but nobody awaits result().
|
|
30
|
+
// Callers who do await result() still receive the rejection normally.
|
|
31
|
+
promise.catch(() => {});
|
|
32
|
+
this.finalResultPromise = promise;
|
|
33
|
+
this.resolveFinalResult = resolve;
|
|
34
|
+
this.rejectFinalResult = reject;
|
|
35
|
+
this.isComplete = isComplete;
|
|
36
|
+
this.extractResult = extractResult;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
push(event: T): void {
|
|
40
|
+
if (this.done) return;
|
|
41
|
+
|
|
42
|
+
if (this.isComplete(event)) {
|
|
43
|
+
this.done = true;
|
|
44
|
+
this.resultSettled = true;
|
|
45
|
+
this.resolveFinalResult(this.extractResult(event));
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
// Deliver to waiting consumer or queue it
|
|
49
|
+
const waiter = this.waiting.shift();
|
|
50
|
+
if (waiter) {
|
|
51
|
+
waiter.resolve({ value: event, done: false });
|
|
52
|
+
} else {
|
|
53
|
+
this.queue.push(event);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
deliver(event: T): void {
|
|
58
|
+
const waiter = this.waiting.shift();
|
|
59
|
+
if (waiter) {
|
|
60
|
+
waiter.resolve({ value: event, done: false });
|
|
61
|
+
} else {
|
|
62
|
+
this.queue.push(event);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
end(result?: R): void {
|
|
67
|
+
this.done = true;
|
|
68
|
+
if (result !== undefined) {
|
|
69
|
+
this.resultSettled = true;
|
|
70
|
+
this.resolveFinalResult(result);
|
|
71
|
+
} else if (!this.resultSettled) {
|
|
72
|
+
// end() without a terminal value must still settle result() —
|
|
73
|
+
// otherwise complete()/result() awaits hang forever.
|
|
74
|
+
this.resultSettled = true;
|
|
75
|
+
this.rejectFinalResult(
|
|
76
|
+
new AIError.ProviderResponseError("Stream ended without a final result", { kind: "envelope" }),
|
|
77
|
+
);
|
|
78
|
+
}
|
|
79
|
+
// Notify all waiting consumers that we're done
|
|
80
|
+
while (this.waiting.length > 0) {
|
|
81
|
+
const waiter = this.waiting.shift()!;
|
|
82
|
+
waiter.resolve({ value: undefined as any, done: true });
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
endWaiting(): void {
|
|
87
|
+
while (this.waiting.length > 0) {
|
|
88
|
+
const waiter = this.waiting.shift()!;
|
|
89
|
+
waiter.resolve({ value: undefined as any, done: true });
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
fail(err: unknown): void {
|
|
94
|
+
if (this.done) return;
|
|
95
|
+
this.done = true;
|
|
96
|
+
this.#failed = true;
|
|
97
|
+
this.#error = err;
|
|
98
|
+
this.resultSettled = true;
|
|
99
|
+
this.rejectFinalResult(err);
|
|
100
|
+
while (this.waiting.length > 0) {
|
|
101
|
+
const waiter = this.waiting.shift()!;
|
|
102
|
+
waiter.reject(err);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
async *[Symbol.asyncIterator](): AsyncIterator<T> {
|
|
107
|
+
while (true) {
|
|
108
|
+
if (this.queue.length > 0) {
|
|
109
|
+
yield this.queue.shift()!;
|
|
110
|
+
} else if (this.#failed) {
|
|
111
|
+
throw this.#error;
|
|
112
|
+
} else if (this.done) {
|
|
113
|
+
return;
|
|
114
|
+
} else {
|
|
115
|
+
const result = await new Promise<IteratorResult<T>>((resolve, reject) =>
|
|
116
|
+
this.waiting.push({ resolve, reject }),
|
|
117
|
+
);
|
|
118
|
+
if (result.done) return;
|
|
119
|
+
yield result.value;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
result(): Promise<R> {
|
|
125
|
+
return this.finalResultPromise;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
/** True while local work tracked via {@link trackLocalWork} is pending. */
|
|
129
|
+
get hasPendingLocalWork(): boolean {
|
|
130
|
+
return this.#pendingLocalWork > 0;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Track a local-work promise so idle watchdogs on this stream do not treat
|
|
135
|
+
* the event silence while it is pending as a provider stall.
|
|
136
|
+
*/
|
|
137
|
+
async trackLocalWork<TWork>(work: Promise<TWork>): Promise<TWork> {
|
|
138
|
+
this.#pendingLocalWork++;
|
|
139
|
+
try {
|
|
140
|
+
return await work;
|
|
141
|
+
} finally {
|
|
142
|
+
this.#pendingLocalWork--;
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
export class AssistantMessageEventStream extends EventStream<AssistantMessageEvent, AssistantMessage> {
|
|
148
|
+
constructor() {
|
|
149
|
+
super(
|
|
150
|
+
event => event.type === "done" || event.type === "error",
|
|
151
|
+
event => {
|
|
152
|
+
if (event.type === "done") {
|
|
153
|
+
return event.message;
|
|
154
|
+
} else if (event.type === "error") {
|
|
155
|
+
return event.error;
|
|
156
|
+
}
|
|
157
|
+
throw new AIError.ProviderResponseError("Unexpected event type for final result", { kind: "envelope" });
|
|
158
|
+
},
|
|
159
|
+
);
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
override push(event: AssistantMessageEvent): void {
|
|
163
|
+
if (this.done) return;
|
|
164
|
+
|
|
165
|
+
if (event.type === "error" && event.error.stopReason === "error") {
|
|
166
|
+
AIError.classifyMessage(event.error);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
// Completion resolves the final result and still emits the terminal event.
|
|
170
|
+
if (this.isComplete(event)) {
|
|
171
|
+
this.done = true;
|
|
172
|
+
this.resultSettled = true;
|
|
173
|
+
this.resolveFinalResult(this.extractResult(event));
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
this.deliver(event);
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
override end(result?: AssistantMessage): void {
|
|
180
|
+
this.done = true;
|
|
181
|
+
if (result !== undefined) {
|
|
182
|
+
if (result.stopReason === "error") {
|
|
183
|
+
AIError.classifyMessage(result);
|
|
184
|
+
}
|
|
185
|
+
this.resultSettled = true;
|
|
186
|
+
this.resolveFinalResult(result);
|
|
187
|
+
} else if (!this.resultSettled) {
|
|
188
|
+
// Mirror the base class: a result-less end() must not leave
|
|
189
|
+
// result() pending forever.
|
|
190
|
+
this.resultSettled = true;
|
|
191
|
+
this.rejectFinalResult(
|
|
192
|
+
new AIError.ProviderResponseError("Stream ended without a final result", { kind: "envelope" }),
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
this.endWaiting();
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Create an assistant-message event stream for legacy extension providers. */
|
|
200
|
+
export function createAssistantMessageEventStream(): AssistantMessageEventStream {
|
|
201
|
+
return new AssistantMessageEventStream();
|
|
202
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { $env } from "@linxiraos/pi-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
|
+
}
|