@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,43 @@
|
|
|
1
|
+
import type { JsonObject } from "./types";
|
|
2
|
+
|
|
3
|
+
export type DescriptionSpillFormat = "spill" | "paren";
|
|
4
|
+
|
|
5
|
+
function formatSpillValue(value: unknown): string {
|
|
6
|
+
return JSON.stringify(value);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
function formatParenValue(value: unknown): string {
|
|
10
|
+
return typeof value === "string" ? value : JSON.stringify(value);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Demote stripped JSON Schema keywords into a node's `description` so the model
|
|
15
|
+
* still receives the constraint as natural-language context after the wire
|
|
16
|
+
* schema drops it.
|
|
17
|
+
*/
|
|
18
|
+
export function spillToDescription(
|
|
19
|
+
node: JsonObject,
|
|
20
|
+
entries: ReadonlyArray<readonly [string, unknown]>,
|
|
21
|
+
format: DescriptionSpillFormat = "spill",
|
|
22
|
+
): void {
|
|
23
|
+
let spilled: Array<readonly [string, unknown]> | undefined;
|
|
24
|
+
for (const entry of entries) {
|
|
25
|
+
if (entry[1] === undefined) continue;
|
|
26
|
+
if (spilled === undefined) spilled = [];
|
|
27
|
+
spilled.push(entry);
|
|
28
|
+
}
|
|
29
|
+
if (spilled === undefined || spilled.length === 0) return;
|
|
30
|
+
|
|
31
|
+
const existing = typeof node.description === "string" ? node.description : "";
|
|
32
|
+
if (format === "paren") {
|
|
33
|
+
let suffix = "";
|
|
34
|
+
for (const [key, value] of spilled) {
|
|
35
|
+
suffix += ` (${key}: ${formatParenValue(value)})`;
|
|
36
|
+
}
|
|
37
|
+
node.description = `${existing}${suffix}`;
|
|
38
|
+
return;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const formatted = `{${spilled.map(([key, value]) => `${key}: ${formatSpillValue(value)}`).join(", ")}}`;
|
|
42
|
+
node.description = existing ? `${existing}\n\n${formatted}` : formatted;
|
|
43
|
+
}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Symbol-keyed lazy memoization stamped directly onto the host object.
|
|
3
|
+
*
|
|
4
|
+
* Faster than a module-level `WeakMap` in V8/JSC because the symbol slot is
|
|
5
|
+
* resolved through the object's hidden class instead of a side-table hash
|
|
6
|
+
* lookup. The slot is defined as a non-enumerable property so the stamp
|
|
7
|
+
* does not leak through `{...spread}`, `Object.keys`, `JSON.stringify`, or
|
|
8
|
+
* `toEqual`-style deep equality.
|
|
9
|
+
*
|
|
10
|
+
* Caveats: the stamp lives as long as the host object, even after callers
|
|
11
|
+
* release their references to the cached value — only use this for caches
|
|
12
|
+
* whose lifetime should match the host. Frozen hosts cannot be stamped;
|
|
13
|
+
* `define` silently skips them, so memoization/visit-tracking degrades to
|
|
14
|
+
* best-effort (recompute on every call, no cycle protection) instead of
|
|
15
|
+
* throwing.
|
|
16
|
+
*/
|
|
17
|
+
function define<T extends object>(target: T, key: symbol, value: unknown): void {
|
|
18
|
+
if (Object.isFrozen(target)) return;
|
|
19
|
+
Object.defineProperty(target, key, { value, writable: true, configurable: true });
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export function stamp<T extends object, V>(target: T, key: symbol, compute: (target: T) => V): V {
|
|
23
|
+
const slot = target as Record<symbol, V | undefined>;
|
|
24
|
+
const existing = slot[key];
|
|
25
|
+
if (existing !== undefined) return existing;
|
|
26
|
+
const value = compute(target);
|
|
27
|
+
define(target, key, value);
|
|
28
|
+
return value;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Epoch-keyed cycle guard. Cheaper than `WeakSet` for recursive traversal
|
|
33
|
+
* because the marker is a single property slot on the host object, written
|
|
34
|
+
* once and overwritten in place on every subsequent traversal — the hidden
|
|
35
|
+
* class transitions once per object lifetime, not per traversal.
|
|
36
|
+
*
|
|
37
|
+
* Usage:
|
|
38
|
+
* function walk(node, epoch = epochNext()) {
|
|
39
|
+
* if (!once(node, epoch)) return; // cycle
|
|
40
|
+
* for (const child of node.children) walk(child, epoch);
|
|
41
|
+
* }
|
|
42
|
+
*/
|
|
43
|
+
const kEpoch = Symbol("pi.schema.epoch");
|
|
44
|
+
let __epoch = 0;
|
|
45
|
+
|
|
46
|
+
export function epochNext(): number {
|
|
47
|
+
return ++__epoch;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Marks `target` as visited for this `epoch`. Returns `true` the first time
|
|
52
|
+
* it is called for a given (target, epoch) pair and `false` on every
|
|
53
|
+
* subsequent call within the same epoch.
|
|
54
|
+
*/
|
|
55
|
+
export function once<T extends object>(target: T, epoch: number): boolean {
|
|
56
|
+
const slot = target as Record<symbol, number | undefined>;
|
|
57
|
+
const cur = slot[kEpoch];
|
|
58
|
+
if (cur !== undefined && cur >= epoch) return false;
|
|
59
|
+
if (cur === undefined) define(target, kEpoch, epoch);
|
|
60
|
+
else slot[kEpoch] = epoch;
|
|
61
|
+
return true;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Counter-based path tracker. Use when a traversal needs to distinguish
|
|
66
|
+
* "currently on the recursion path" from "previously visited" — i.e. cycle
|
|
67
|
+
* detection that throws while still allowing DAG sharing. Increment on
|
|
68
|
+
* entry, decrement on exit; the slot returns to 0 after a balanced walk so
|
|
69
|
+
* subsequent top-level calls see a fresh state without any reset.
|
|
70
|
+
*
|
|
71
|
+
* Unlike a `WeakSet` with `seen.delete(...)`, the property is never deleted
|
|
72
|
+
* — only incremented and decremented — so the host object's hidden class
|
|
73
|
+
* is never invalidated.
|
|
74
|
+
*
|
|
75
|
+
* Usage:
|
|
76
|
+
* function walk(node) {
|
|
77
|
+
* if (!enter(node)) throw new Error("cycle");
|
|
78
|
+
* try { for (const c of node.children) walk(c); }
|
|
79
|
+
* finally { exit(node); }
|
|
80
|
+
* }
|
|
81
|
+
*/
|
|
82
|
+
const kDepth = Symbol("pi.schema.depth");
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Returns `true` on first entry, `false` if `target` is already on the
|
|
86
|
+
* current path. A `false` return does NOT deepen the counter — callers pair
|
|
87
|
+
* `exit` only with successful enters (`if (!enter(n)) bail; try {…} finally
|
|
88
|
+
* { exit(n); }`), so incrementing on the cycle branch would leak depth and
|
|
89
|
+
* make every later top-level walk of the same object misreport a cycle.
|
|
90
|
+
*/
|
|
91
|
+
export function enter<T extends object>(target: T): boolean {
|
|
92
|
+
const slot = target as Record<symbol, number | undefined>;
|
|
93
|
+
const cur = slot[kDepth];
|
|
94
|
+
if (cur === undefined) {
|
|
95
|
+
define(target, kDepth, 1);
|
|
96
|
+
return true;
|
|
97
|
+
}
|
|
98
|
+
if (cur !== 0) return false;
|
|
99
|
+
slot[kDepth] = 1;
|
|
100
|
+
return true;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export function exit<T extends object>(target: T): void {
|
|
104
|
+
const slot = target as Record<symbol, number | undefined>;
|
|
105
|
+
const cur = slot[kDepth];
|
|
106
|
+
// Frozen targets never received the kDepth stamp in `enter` — nothing to unwind.
|
|
107
|
+
if (cur === undefined) return;
|
|
108
|
+
slot[kDepth] = cur - 1;
|
|
109
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects tool-parameter schemas that pass structural JSON-Schema validation
|
|
3
|
+
* (so {@link isValidJsonSchema} accepts them) yet make OpenAI-style providers
|
|
4
|
+
* reject the whole request with HTTP 400 — namely an `enum`/`const` whose
|
|
5
|
+
* value(s) cannot satisfy the node's declared `type`. MCP servers emit these
|
|
6
|
+
* when a nullable/array branch is built incorrectly (e.g. a non-null `enum`
|
|
7
|
+
* copied onto a `type: "null"` branch, or an `enum` placed on an `array`
|
|
8
|
+
* schema instead of its `items`). One such tool 400s the entire turn, so
|
|
9
|
+
* callers quarantine just the offending tool. See issue #2652.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
type JsonRecord = Record<string, unknown>;
|
|
13
|
+
|
|
14
|
+
const SCHEMA_TYPE_NAMES: Record<string, true> = {
|
|
15
|
+
string: true,
|
|
16
|
+
number: true,
|
|
17
|
+
integer: true,
|
|
18
|
+
boolean: true,
|
|
19
|
+
object: true,
|
|
20
|
+
array: true,
|
|
21
|
+
null: true,
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
function jsonValueMatchesType(value: unknown, type: string): boolean {
|
|
25
|
+
switch (type) {
|
|
26
|
+
case "string":
|
|
27
|
+
return typeof value === "string";
|
|
28
|
+
case "number":
|
|
29
|
+
return typeof value === "number";
|
|
30
|
+
case "integer":
|
|
31
|
+
return typeof value === "number" && Number.isInteger(value);
|
|
32
|
+
case "boolean":
|
|
33
|
+
return typeof value === "boolean";
|
|
34
|
+
case "null":
|
|
35
|
+
return value === null;
|
|
36
|
+
case "object":
|
|
37
|
+
return typeof value === "object" && value !== null && !Array.isArray(value);
|
|
38
|
+
case "array":
|
|
39
|
+
return Array.isArray(value);
|
|
40
|
+
default:
|
|
41
|
+
// Unknown type keyword — don't flag (forward compatibility).
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
function declaredTypes(node: JsonRecord): string[] {
|
|
47
|
+
const t = node.type;
|
|
48
|
+
if (typeof t === "string") return t in SCHEMA_TYPE_NAMES ? [t] : [];
|
|
49
|
+
if (Array.isArray(t)) return t.filter((x): x is string => typeof x === "string" && x in SCHEMA_TYPE_NAMES);
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
const CHILD_MAP_KEYS = ["properties", "patternProperties", "$defs", "definitions", "dependentSchemas"] as const;
|
|
54
|
+
const CHILD_SCHEMA_KEYS = [
|
|
55
|
+
"items",
|
|
56
|
+
"contains",
|
|
57
|
+
"not",
|
|
58
|
+
"if",
|
|
59
|
+
"then",
|
|
60
|
+
"else",
|
|
61
|
+
"propertyNames",
|
|
62
|
+
"additionalProperties",
|
|
63
|
+
"unevaluatedProperties",
|
|
64
|
+
"unevaluatedItems",
|
|
65
|
+
] as const;
|
|
66
|
+
const CHILD_ARRAY_KEYS = ["anyOf", "oneOf", "allOf", "prefixItems"] as const;
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* Walk a tool parameter schema for OpenAI-strict `enum`/`const`-vs-`type`
|
|
70
|
+
* contradictions. Returns a JSON-pointer-ish path to the first offending node,
|
|
71
|
+
* or `null` when the schema is safe to emit.
|
|
72
|
+
*/
|
|
73
|
+
export function findStrictToolSchemaViolation(schema: unknown, path = "#"): string | null {
|
|
74
|
+
if (Array.isArray(schema)) {
|
|
75
|
+
for (let i = 0; i < schema.length; i++) {
|
|
76
|
+
const hit = findStrictToolSchemaViolation(schema[i], `${path}/${i}`);
|
|
77
|
+
if (hit) return hit;
|
|
78
|
+
}
|
|
79
|
+
return null;
|
|
80
|
+
}
|
|
81
|
+
if (typeof schema !== "object" || schema === null) return null;
|
|
82
|
+
const node = schema as JsonRecord;
|
|
83
|
+
|
|
84
|
+
const types = declaredTypes(node);
|
|
85
|
+
if (types.length > 0) {
|
|
86
|
+
if (Array.isArray(node.enum) && node.enum.some(v => !types.some(t => jsonValueMatchesType(v, t)))) {
|
|
87
|
+
return `${path}/enum`;
|
|
88
|
+
}
|
|
89
|
+
if ("const" in node && !types.some(t => jsonValueMatchesType(node.const, t))) {
|
|
90
|
+
return `${path}/const`;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
for (const key of CHILD_MAP_KEYS) {
|
|
95
|
+
const sub = node[key];
|
|
96
|
+
if (sub && typeof sub === "object" && !Array.isArray(sub)) {
|
|
97
|
+
for (const k of Object.keys(sub as JsonRecord)) {
|
|
98
|
+
const hit = findStrictToolSchemaViolation((sub as JsonRecord)[k], `${path}/${key}/${k}`);
|
|
99
|
+
if (hit) return hit;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
for (const key of CHILD_SCHEMA_KEYS) {
|
|
104
|
+
if (key in node) {
|
|
105
|
+
const hit = findStrictToolSchemaViolation(node[key], `${path}/${key}`);
|
|
106
|
+
if (hit) return hit;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
for (const key of CHILD_ARRAY_KEYS) {
|
|
110
|
+
const arr = node[key];
|
|
111
|
+
if (Array.isArray(arr)) {
|
|
112
|
+
const hit = findStrictToolSchemaViolation(arr, `${path}/${key}`);
|
|
113
|
+
if (hit) return hit;
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type JsonObject = Record<string, unknown>;
|
|
2
|
+
|
|
3
|
+
export function isJsonObject(value: unknown): value is JsonObject {
|
|
4
|
+
return !!value && typeof value === "object" && !Array.isArray(value);
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
/** True when `value` is a plain JSON object with no own enumerable keys. */
|
|
8
|
+
export function isJsonObjectEmpty(value: JsonObject): boolean {
|
|
9
|
+
return Object.keys(value).length === 0;
|
|
10
|
+
}
|
|
@@ -0,0 +1,212 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Render a JSON Schema as a simplified, human-readable TypeScript type.
|
|
3
|
+
*
|
|
4
|
+
* This is a *display* conversion, not a faithful TS codegen: it surfaces the
|
|
5
|
+
* shape (objects, arrays, unions, enums, records) and property descriptions so
|
|
6
|
+
* a model — or a human reading `/dump` — can grasp a tool's parameters at a
|
|
7
|
+
* glance, far more legibly than raw JSON Schema. Refinement keywords
|
|
8
|
+
* (min/max/pattern/format) are intentionally dropped; only type structure,
|
|
9
|
+
* literal enums/consts, and descriptions survive.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import { isJsonObject } from "./types";
|
|
13
|
+
|
|
14
|
+
export interface JsonSchemaToTsOptions {
|
|
15
|
+
/** Indentation unit for nested object bodies. Default two spaces (none in `harmony` style). */
|
|
16
|
+
readonly indent?: string;
|
|
17
|
+
/** Emit `description` keywords as comments on object properties. Default true. */
|
|
18
|
+
readonly comments?: boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Output flavor. `default` renders JSDoc comments, `;` delimiters, and
|
|
21
|
+
* indented bodies; `harmony` renders the flat OpenAI-Harmony convention —
|
|
22
|
+
* `//` line comments, `,` delimiters, no indentation.
|
|
23
|
+
*/
|
|
24
|
+
readonly style?: "default" | "harmony";
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
interface Ctx {
|
|
28
|
+
readonly indent: string;
|
|
29
|
+
readonly comments: boolean;
|
|
30
|
+
readonly harmony: boolean;
|
|
31
|
+
readonly defs: Record<string, unknown> | undefined;
|
|
32
|
+
readonly seen: Set<unknown>;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const SAFE_KEY = /^[A-Za-z_$][A-Za-z0-9_$]*$/;
|
|
36
|
+
const LOCAL_REF = /^#\/(?:\$defs|definitions)\/(.+)$/;
|
|
37
|
+
/** Inline an array item as `T[]` only while it stays a short single token. */
|
|
38
|
+
const INLINE_ARRAY_LIMIT = 40;
|
|
39
|
+
|
|
40
|
+
function literal(value: unknown): string {
|
|
41
|
+
if (typeof value === "string") return JSON.stringify(value);
|
|
42
|
+
if (typeof value === "number" || typeof value === "boolean" || value === null) return String(value);
|
|
43
|
+
return JSON.stringify(value) ?? "unknown";
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Join member types into a TS union, deduping structurally identical renders. */
|
|
47
|
+
function joinUnion(parts: readonly string[]): string {
|
|
48
|
+
const seen = new Set<string>();
|
|
49
|
+
const unique: string[] = [];
|
|
50
|
+
for (const part of parts) {
|
|
51
|
+
if (seen.has(part)) continue;
|
|
52
|
+
seen.add(part);
|
|
53
|
+
unique.push(part);
|
|
54
|
+
}
|
|
55
|
+
return unique.length > 0 ? unique.join(" | ") : "never";
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function emitDescription(lines: string[], description: string, ctx: Ctx, pad: string): void {
|
|
59
|
+
if (ctx.harmony) {
|
|
60
|
+
for (const line of description.split("\n")) lines.push(`${pad}// ${line}`.trimEnd());
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
// `* /` keeps a stray closing token inside the description from ending the comment.
|
|
64
|
+
const safe = description.replace(/\*\//g, "* /");
|
|
65
|
+
if (!safe.includes("\n")) {
|
|
66
|
+
lines.push(`${pad}/** ${safe} */`);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
lines.push(`${pad}/**`);
|
|
70
|
+
for (const line of safe.split("\n")) lines.push(`${pad} * ${line}`);
|
|
71
|
+
lines.push(`${pad} */`);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function convertArray(node: Record<string, unknown>, ctx: Ctx, pad: string): string {
|
|
75
|
+
const prefixItems = node.prefixItems;
|
|
76
|
+
if (Array.isArray(prefixItems)) {
|
|
77
|
+
return `[${prefixItems.map(item => convert(item, ctx, pad)).join(", ")}]`;
|
|
78
|
+
}
|
|
79
|
+
const items = node.items;
|
|
80
|
+
if (items === undefined || items === true) return "unknown[]";
|
|
81
|
+
if (items === false) return "never[]";
|
|
82
|
+
const inner = convert(items, ctx, pad);
|
|
83
|
+
if (inner.includes("\n") || inner.includes(" | ") || inner.length > INLINE_ARRAY_LIMIT) {
|
|
84
|
+
return `Array<${inner}>`;
|
|
85
|
+
}
|
|
86
|
+
return `${inner}[]`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function convertObject(node: Record<string, unknown>, ctx: Ctx, pad: string): string {
|
|
90
|
+
const properties = isJsonObject(node.properties) ? node.properties : undefined;
|
|
91
|
+
const additional = node.additionalProperties;
|
|
92
|
+
const childPad = pad + ctx.indent;
|
|
93
|
+
|
|
94
|
+
const body: string[] = [];
|
|
95
|
+
if (properties) {
|
|
96
|
+
const required = new Set(
|
|
97
|
+
Array.isArray(node.required) ? node.required.filter((key): key is string => typeof key === "string") : [],
|
|
98
|
+
);
|
|
99
|
+
const delimiter = ctx.harmony ? "," : ";";
|
|
100
|
+
for (const key in properties) {
|
|
101
|
+
const value = properties[key];
|
|
102
|
+
if (
|
|
103
|
+
ctx.comments &&
|
|
104
|
+
isJsonObject(value) &&
|
|
105
|
+
typeof value.description === "string" &&
|
|
106
|
+
value.description.length > 0
|
|
107
|
+
) {
|
|
108
|
+
emitDescription(body, value.description, ctx, childPad);
|
|
109
|
+
}
|
|
110
|
+
const optional = required.has(key) ? "" : "?";
|
|
111
|
+
const name = SAFE_KEY.test(key) ? key : JSON.stringify(key);
|
|
112
|
+
body.push(`${childPad}${name}${optional}: ${convert(value, ctx, childPad)}${delimiter}`);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// No named properties: pure record / open / empty object.
|
|
117
|
+
if (body.length === 0) {
|
|
118
|
+
if (isJsonObject(additional)) return `Record<string, ${convert(additional, ctx, pad)}>`;
|
|
119
|
+
if (additional === true) return "Record<string, unknown>";
|
|
120
|
+
return "{}";
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Named properties alongside a free-form value schema → index signature.
|
|
124
|
+
if (isJsonObject(additional)) {
|
|
125
|
+
body.push(`${childPad}[key: string]: ${convert(additional, ctx, childPad)}${ctx.harmony ? "," : ";"}`);
|
|
126
|
+
}
|
|
127
|
+
return `{\n${body.join("\n")}\n${pad}}`;
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
function convertType(type: string, node: Record<string, unknown>, ctx: Ctx, pad: string): string {
|
|
131
|
+
switch (type) {
|
|
132
|
+
case "string":
|
|
133
|
+
return "string";
|
|
134
|
+
case "integer":
|
|
135
|
+
case "number":
|
|
136
|
+
return "number";
|
|
137
|
+
case "boolean":
|
|
138
|
+
return "boolean";
|
|
139
|
+
case "null":
|
|
140
|
+
return "null";
|
|
141
|
+
case "array":
|
|
142
|
+
return convertArray(node, ctx, pad);
|
|
143
|
+
case "object":
|
|
144
|
+
return convertObject(node, ctx, pad);
|
|
145
|
+
default:
|
|
146
|
+
return "unknown";
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
function convert(node: unknown, ctx: Ctx, pad: string): string {
|
|
151
|
+
if (node === true) return "unknown";
|
|
152
|
+
if (node === false) return "never";
|
|
153
|
+
if (!isJsonObject(node)) return "unknown";
|
|
154
|
+
|
|
155
|
+
const ref = node.$ref;
|
|
156
|
+
if (typeof ref === "string") {
|
|
157
|
+
const match = LOCAL_REF.exec(ref);
|
|
158
|
+
const resolved = match && ctx.defs ? ctx.defs[match[1]] : undefined;
|
|
159
|
+
if (isJsonObject(resolved) && !ctx.seen.has(resolved)) {
|
|
160
|
+
ctx.seen.add(resolved);
|
|
161
|
+
const out = convert(resolved, ctx, pad);
|
|
162
|
+
ctx.seen.delete(resolved);
|
|
163
|
+
return out;
|
|
164
|
+
}
|
|
165
|
+
return ref.slice(ref.lastIndexOf("/") + 1);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
if ("const" in node) return literal(node.const);
|
|
169
|
+
|
|
170
|
+
if (Array.isArray(node.enum)) {
|
|
171
|
+
return node.enum.length > 0 ? joinUnion(node.enum.map(literal)) : "never";
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const union = Array.isArray(node.anyOf) ? node.anyOf : Array.isArray(node.oneOf) ? node.oneOf : undefined;
|
|
175
|
+
if (union) return joinUnion(union.map(variant => convert(variant, ctx, pad)));
|
|
176
|
+
|
|
177
|
+
if (Array.isArray(node.allOf)) {
|
|
178
|
+
return node.allOf.map(variant => convert(variant, ctx, pad)).join(" & ");
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const type = node.type;
|
|
182
|
+
if (Array.isArray(type)) {
|
|
183
|
+
return joinUnion(type.map(entry => convertType(String(entry), node, ctx, pad)));
|
|
184
|
+
}
|
|
185
|
+
if (typeof type === "string") return convertType(type, node, ctx, pad);
|
|
186
|
+
|
|
187
|
+
return "unknown";
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/** Convert a JSON Schema object into a simplified TypeScript type string. */
|
|
191
|
+
export function jsonSchemaToTypeScript(schema: unknown, options?: JsonSchemaToTsOptions): string {
|
|
192
|
+
const root = isJsonObject(schema) ? schema : undefined;
|
|
193
|
+
let defs: Record<string, unknown> | undefined;
|
|
194
|
+
if (root) {
|
|
195
|
+
for (const key of ["definitions", "$defs"] as const) {
|
|
196
|
+
const value = root[key];
|
|
197
|
+
if (isJsonObject(value)) {
|
|
198
|
+
defs ??= {};
|
|
199
|
+
Object.assign(defs, value);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
const harmony = options?.style === "harmony";
|
|
204
|
+
const ctx: Ctx = {
|
|
205
|
+
indent: options?.indent ?? (harmony ? "" : " "),
|
|
206
|
+
comments: options?.comments ?? true,
|
|
207
|
+
harmony,
|
|
208
|
+
defs,
|
|
209
|
+
seen: new Set(),
|
|
210
|
+
};
|
|
211
|
+
return convert(schema, ctx, "");
|
|
212
|
+
}
|