jeopi-ai 16.2.13
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4347 -0
- package/README.md +1193 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +73 -0
- package/dist/types/auth-broker/discover.d.ts +35 -0
- package/dist/types/auth-broker/index.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +102 -0
- package/dist/types/auth-broker/server.d.ts +43 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +107 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +411 -0
- package/dist/types/auth-gateway/http.d.ts +39 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +36 -0
- package/dist/types/auth-gateway/types.d.ts +123 -0
- package/dist/types/auth-retry.d.ts +124 -0
- package/dist/types/auth-storage.d.ts +1026 -0
- package/dist/types/dialect/anthropic.d.ts +15 -0
- package/dist/types/dialect/catalog.d.ts +3 -0
- package/dist/types/dialect/coercion.d.ts +23 -0
- package/dist/types/dialect/deepseek.d.ts +14 -0
- package/dist/types/dialect/demotion.d.ts +23 -0
- package/dist/types/dialect/examples.d.ts +2 -0
- package/dist/types/dialect/factory.d.ts +3 -0
- package/dist/types/dialect/fenced-thinking.d.ts +53 -0
- package/dist/types/dialect/gemini.d.ts +17 -0
- package/dist/types/dialect/gemma.d.ts +15 -0
- package/dist/types/dialect/glm.d.ts +9 -0
- package/dist/types/dialect/harmony.d.ts +8 -0
- package/dist/types/dialect/hermes.d.ts +9 -0
- package/dist/types/dialect/history.d.ts +3 -0
- package/dist/types/dialect/index.d.ts +11 -0
- package/dist/types/dialect/inventory.d.ts +12 -0
- package/dist/types/dialect/kimi.d.ts +14 -0
- package/dist/types/dialect/minimax.d.ts +3 -0
- package/dist/types/dialect/owned-stream.d.ts +4 -0
- package/dist/types/dialect/qwen3.d.ts +9 -0
- package/dist/types/dialect/rendering.d.ts +45 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +69 -0
- package/dist/types/dialect/xml.d.ts +9 -0
- package/dist/types/error/abort.d.ts +14 -0
- package/dist/types/error/auth-classify.d.ts +16 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +23 -0
- package/dist/types/error/classes.d.ts +102 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +79 -0
- package/dist/types/error/format.d.ts +20 -0
- package/dist/types/error/gateway.d.ts +20 -0
- package/dist/types/error/index.d.ts +13 -0
- package/dist/types/error/oauth.d.ts +43 -0
- package/dist/types/error/provider.d.ts +42 -0
- package/dist/types/error/rate-limit.d.ts +59 -0
- package/dist/types/error/retryable.d.ts +27 -0
- package/dist/types/error/validation.d.ts +32 -0
- package/dist/types/index.d.ts +49 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/__tests__/google-auth.test.d.ts +1 -0
- package/dist/types/providers/__tests__/kimi-code-thinking.test.d.ts +1 -0
- package/dist/types/providers/__tests__/openai-codex-error.test.d.ts +1 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +94 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +497 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +318 -0
- package/dist/types/providers/anthropic.d.ts +248 -0
- package/dist/types/providers/aws-credentials.d.ts +53 -0
- package/dist/types/providers/aws-eventstream.d.ts +39 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +16 -0
- package/dist/types/providers/cursor.d.ts +91 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +32 -0
- package/dist/types/providers/google-gemini-cli.d.ts +118 -0
- package/dist/types/providers/google-interactions.d.ts +65 -0
- package/dist/types/providers/google-shared.d.ts +203 -0
- package/dist/types/providers/google-types.d.ts +155 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +178 -0
- package/dist/types/providers/ollama.d.ts +7 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +695 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +644 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +54 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +108 -0
- package/dist/types/providers/openai-completions.d.ts +45 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +349 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6065 -0
- package/dist/types/providers/openai-responses.d.ts +126 -0
- package/dist/types/providers/openai-shared.d.ts +506 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +69 -0
- package/dist/types/providers/register-builtins.d.ts +32 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +11 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/registry/aimlapi.d.ts +4 -0
- package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
- package/dist/types/registry/amazon-bedrock.d.ts +5 -0
- package/dist/types/registry/anthropic.d.ts +10 -0
- package/dist/types/registry/api-key-login.d.ts +42 -0
- package/dist/types/registry/api-key-validation.d.ts +43 -0
- package/dist/types/registry/azure.d.ts +4 -0
- package/dist/types/registry/cerebras.d.ts +7 -0
- package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
- package/dist/types/registry/coreweave.d.ts +7 -0
- package/dist/types/registry/cursor.d.ts +7 -0
- package/dist/types/registry/deepseek.d.ts +8 -0
- package/dist/types/registry/derived.d.ts +5 -0
- package/dist/types/registry/devin.d.ts +8 -0
- package/dist/types/registry/firepass.d.ts +16 -0
- package/dist/types/registry/fireworks.d.ts +7 -0
- package/dist/types/registry/github-copilot.d.ts +7 -0
- package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
- package/dist/types/registry/gitlab-duo.d.ts +9 -0
- package/dist/types/registry/google-antigravity.d.ts +9 -0
- package/dist/types/registry/google-gemini-cli.d.ts +9 -0
- package/dist/types/registry/google-vertex.d.ts +5 -0
- package/dist/types/registry/google.d.ts +4 -0
- package/dist/types/registry/groq.d.ts +4 -0
- package/dist/types/registry/huggingface.d.ts +7 -0
- package/dist/types/registry/index.d.ts +4 -0
- package/dist/types/registry/kagi.d.ts +14 -0
- package/dist/types/registry/kilo.d.ts +7 -0
- package/dist/types/registry/kimi-code.d.ts +7 -0
- package/dist/types/registry/litellm.d.ts +13 -0
- package/dist/types/registry/llama-cpp.d.ts +8 -0
- package/dist/types/registry/lm-studio.d.ts +8 -0
- package/dist/types/registry/minimax-code-cn.d.ts +6 -0
- package/dist/types/registry/minimax-code.d.ts +6 -0
- package/dist/types/registry/minimax.d.ts +4 -0
- package/dist/types/registry/mistral.d.ts +4 -0
- package/dist/types/registry/moonshot.d.ts +7 -0
- package/dist/types/registry/nanogpt.d.ts +7 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/__tests__/xai-oauth.test.d.ts +1 -0
- package/dist/types/registry/oauth/anthropic.d.ts +23 -0
- package/dist/types/registry/oauth/callback-server.d.ts +72 -0
- package/dist/types/registry/oauth/cursor.d.ts +15 -0
- package/dist/types/registry/oauth/devin.d.ts +5 -0
- package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
- package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
- package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/registry/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +22 -0
- package/dist/types/registry/oauth/index.d.ts +64 -0
- package/dist/types/registry/oauth/kimi.d.ts +21 -0
- package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
- package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
- package/dist/types/registry/oauth/opencode.d.ts +18 -0
- package/dist/types/registry/oauth/perplexity.d.ts +9 -0
- package/dist/types/registry/oauth/pkce.d.ts +8 -0
- package/dist/types/registry/oauth/types.d.ts +56 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +52 -0
- package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
- package/dist/types/registry/ollama-cloud.d.ts +7 -0
- package/dist/types/registry/ollama.d.ts +12 -0
- package/dist/types/registry/openai-codex-device.d.ts +8 -0
- package/dist/types/registry/openai-codex.d.ts +9 -0
- package/dist/types/registry/openai.d.ts +4 -0
- package/dist/types/registry/opencode-go.d.ts +6 -0
- package/dist/types/registry/opencode-zen.d.ts +6 -0
- package/dist/types/registry/openrouter.d.ts +13 -0
- package/dist/types/registry/parallel.d.ts +14 -0
- package/dist/types/registry/perplexity.d.ts +7 -0
- package/dist/types/registry/qianfan.d.ts +7 -0
- package/dist/types/registry/qwen-portal.d.ts +7 -0
- package/dist/types/registry/registry.d.ts +303 -0
- package/dist/types/registry/sakana.d.ts +7 -0
- package/dist/types/registry/synthetic.d.ts +6 -0
- package/dist/types/registry/tavily.d.ts +14 -0
- package/dist/types/registry/together.d.ts +6 -0
- package/dist/types/registry/types.d.ts +51 -0
- package/dist/types/registry/umans.d.ts +7 -0
- package/dist/types/registry/venice.d.ts +13 -0
- package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
- package/dist/types/registry/vllm.d.ts +7 -0
- package/dist/types/registry/wafer-serverless.d.ts +6 -0
- package/dist/types/registry/xai-oauth.d.ts +7 -0
- package/dist/types/registry/xai.d.ts +4 -0
- package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
- package/dist/types/registry/xiaomi.d.ts +6 -0
- package/dist/types/registry/zai.d.ts +7 -0
- package/dist/types/registry/zenmux.d.ts +7 -0
- package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
- package/dist/types/stream.d.ts +44 -0
- package/dist/types/types.d.ts +715 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +15 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/ollama.d.ts +5 -0
- package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
- package/dist/types/usage/openai-codex-reset.d.ts +79 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +346 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/block-symbols.d.ts +20 -0
- package/dist/types/utils/deterministic-id.d.ts +16 -0
- package/dist/types/utils/empty-completion-retry.d.ts +21 -0
- package/dist/types/utils/event-stream.d.ts +30 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/google-validation.d.ts +2 -0
- package/dist/types/utils/harmony-leak.d.ts +118 -0
- package/dist/types/utils/http-inspector.d.ts +30 -0
- package/dist/types/utils/idle-iterator.d.ts +137 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +29 -0
- package/dist/types/utils/openai-http.d.ts +54 -0
- package/dist/types/utils/openrouter-headers.d.ts +1 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/proxy.d.ts +29 -0
- package/dist/types/utils/request-debug.d.ts +29 -0
- package/dist/types/utils/retry-after.d.ts +4 -0
- package/dist/types/utils/retry.d.ts +14 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +54 -0
- package/dist/types/utils/schema/index.d.ts +15 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +124 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +17 -0
- package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/typescript.d.ts +18 -0
- package/dist/types/utils/schema/wire.d.ts +92 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
- package/dist/types/utils/sse-debug.d.ts +5 -0
- package/dist/types/utils/stream-markup-healing.d.ts +87 -0
- package/dist/types/utils/thinking-loop.d.ts +102 -0
- package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +42 -0
- package/dist/types/utils.d.ts +24 -0
- package/package.json +139 -0
- package/src/api-registry.ts +109 -0
- package/src/auth-broker/client.ts +359 -0
- package/src/auth-broker/discover.ts +222 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +657 -0
- package/src/auth-broker/server.ts +646 -0
- package/src/auth-broker/snapshot-cache.ts +191 -0
- package/src/auth-broker/types.ts +130 -0
- package/src/auth-broker/wire-schemas.ts +249 -0
- package/src/auth-gateway/http.ts +194 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +802 -0
- package/src/auth-gateway/types.ts +151 -0
- package/src/auth-retry.ts +250 -0
- package/src/auth-storage.ts +5576 -0
- package/src/dialect/anthropic.md +31 -0
- package/src/dialect/anthropic.ts +608 -0
- package/src/dialect/catalog.ts +29 -0
- package/src/dialect/coercion.ts +136 -0
- package/src/dialect/deepseek.md +24 -0
- package/src/dialect/deepseek.ts +609 -0
- package/src/dialect/demotion.ts +36 -0
- package/src/dialect/examples.ts +33 -0
- package/src/dialect/factory.ts +34 -0
- package/src/dialect/fenced-thinking.ts +184 -0
- package/src/dialect/gemini.md +44 -0
- package/src/dialect/gemini.ts +597 -0
- package/src/dialect/gemma.md +33 -0
- package/src/dialect/gemma.ts +387 -0
- package/src/dialect/glm.md +32 -0
- package/src/dialect/glm.ts +456 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +346 -0
- package/src/dialect/hermes.md +25 -0
- package/src/dialect/hermes.ts +206 -0
- package/src/dialect/history.ts +81 -0
- package/src/dialect/index.ts +15 -0
- package/src/dialect/inventory.ts +73 -0
- package/src/dialect/kimi.md +24 -0
- package/src/dialect/kimi.ts +340 -0
- package/src/dialect/minimax.md +31 -0
- package/src/dialect/minimax.ts +95 -0
- package/src/dialect/owned-stream.ts +470 -0
- package/src/dialect/prompt-template.md +12 -0
- package/src/dialect/qwen3.md +28 -0
- package/src/dialect/qwen3.ts +240 -0
- package/src/dialect/rendering.ts +249 -0
- package/src/dialect/thinking.ts +122 -0
- package/src/dialect/types.ts +57 -0
- package/src/dialect/xml.md +22 -0
- package/src/dialect/xml.ts +90 -0
- package/src/error/abort.ts +18 -0
- package/src/error/auth-classify.ts +30 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +31 -0
- package/src/error/classes.ts +186 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +506 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +13 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +62 -0
- package/src/error/rate-limit.ts +161 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +49 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/__tests__/google-auth.test.ts +144 -0
- package/src/providers/__tests__/kimi-code-thinking.test.ts +112 -0
- package/src/providers/__tests__/openai-codex-error.test.ts +84 -0
- package/src/providers/amazon-bedrock.ts +1042 -0
- package/src/providers/anthropic-client.ts +295 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +756 -0
- package/src/providers/anthropic-wire.ts +318 -0
- package/src/providers/anthropic.ts +4078 -0
- package/src/providers/aws-credentials.ts +586 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +382 -0
- package/src/providers/cursor/proto/agent.proto +3526 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor.ts +2695 -0
- package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
- package/src/providers/devin/proto/buf.gen.yaml +33 -0
- package/src/providers/devin/proto/buf.yaml +17 -0
- package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
- package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
- package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
- package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
- package/src/providers/devin/proto/cel/expr/value.proto +41 -0
- package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
- package/src/providers/devin/proto/errorspb/errors.proto +56 -0
- package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
- package/src/providers/devin/proto/errorspb/markers.proto +10 -0
- package/src/providers/devin/proto/errorspb/tags.proto +12 -0
- package/src/providers/devin/proto/errorspb/testing.proto +6 -0
- package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
- package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
- package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
- package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
- package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
- package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
- package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
- package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
- package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
- package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
- package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
- package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
- package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
- package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
- package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
- package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
- package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
- package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
- package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
- package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
- package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
- package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
- package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
- package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
- package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
- package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
- package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
- package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
- package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
- package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
- package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
- package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
- package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
- package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
- package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
- package/src/providers/devin.ts +577 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.ts +141 -0
- package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
- package/src/providers/gitlab-duo-workflow.ts +3058 -0
- package/src/providers/gitlab-duo.ts +395 -0
- package/src/providers/google-auth.ts +350 -0
- package/src/providers/google-gemini-cli.ts +1362 -0
- package/src/providers/google-interactions.ts +753 -0
- package/src/providers/google-shared.ts +1103 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +183 -0
- package/src/providers/google.ts +87 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/mock.ts +507 -0
- package/src/providers/ollama.ts +773 -0
- package/src/providers/openai-anthropic-shim.ts +152 -0
- package/src/providers/openai-chat-server-schema.ts +242 -0
- package/src/providers/openai-chat-server.ts +715 -0
- package/src/providers/openai-chat-wire.ts +847 -0
- package/src/providers/openai-codex/request-transformer.ts +295 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +3468 -0
- package/src/providers/openai-completions.ts +2173 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-reasoning-suppression.md +1 -0
- package/src/providers/openai-responses-server-schema.ts +282 -0
- package/src/providers/openai-responses-server.ts +1280 -0
- package/src/providers/openai-responses-wire.ts +6391 -0
- package/src/providers/openai-responses.ts +1022 -0
- package/src/providers/openai-shared.ts +2648 -0
- package/src/providers/pi-native-client.ts +266 -0
- package/src/providers/pi-native-server.ts +242 -0
- package/src/providers/register-builtins.ts +475 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +787 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +95 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +112 -0
- package/src/registry/api-key-validation.ts +161 -0
- package/src/registry/azure.ts +6 -0
- package/src/registry/cerebras.ts +23 -0
- package/src/registry/cloudflare-ai-gateway.ts +45 -0
- package/src/registry/coreweave.ts +40 -0
- package/src/registry/cursor.ts +20 -0
- package/src/registry/deepseek.ts +46 -0
- package/src/registry/derived.ts +9 -0
- package/src/registry/devin.ts +15 -0
- package/src/registry/firepass.ts +32 -0
- package/src/registry/fireworks.ts +28 -0
- package/src/registry/github-copilot.ts +22 -0
- package/src/registry/gitlab-duo-workflow.ts +20 -0
- package/src/registry/gitlab-duo.ts +19 -0
- package/src/registry/google-antigravity.ts +22 -0
- package/src/registry/google-gemini-cli.ts +22 -0
- package/src/registry/google-vertex.ts +38 -0
- package/src/registry/google.ts +6 -0
- package/src/registry/groq.ts +6 -0
- package/src/registry/huggingface.ts +29 -0
- package/src/registry/index.ts +4 -0
- package/src/registry/kagi.ts +46 -0
- package/src/registry/kilo.ts +114 -0
- package/src/registry/kimi-code.ts +17 -0
- package/src/registry/litellm.ts +45 -0
- package/src/registry/llama-cpp.ts +35 -0
- package/src/registry/lm-studio.ts +31 -0
- package/src/registry/minimax-code-cn.ts +12 -0
- package/src/registry/minimax-code.ts +12 -0
- package/src/registry/minimax.ts +6 -0
- package/src/registry/mistral.ts +6 -0
- package/src/registry/moonshot.ts +22 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/__tests__/xai-oauth.test.ts +104 -0
- package/src/registry/oauth/anthropic.ts +311 -0
- package/src/registry/oauth/callback-server.ts +315 -0
- package/src/registry/oauth/cursor.ts +171 -0
- package/src/registry/oauth/devin.ts +124 -0
- package/src/registry/oauth/github-copilot.ts +369 -0
- package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
- package/src/registry/oauth/gitlab-duo.ts +222 -0
- package/src/registry/oauth/google-antigravity.ts +209 -0
- package/src/registry/oauth/google-gemini-cli.ts +273 -0
- package/src/registry/oauth/google-oauth-shared.ts +125 -0
- package/src/registry/oauth/index.ts +269 -0
- package/src/registry/oauth/kimi.ts +289 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +311 -0
- package/src/registry/oauth/openai-codex.ts +364 -0
- package/src/registry/oauth/opencode.ts +50 -0
- package/src/registry/oauth/perplexity.ts +228 -0
- package/src/registry/oauth/pkce.ts +18 -0
- package/src/registry/oauth/types.ts +65 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +394 -0
- package/src/registry/oauth/xiaomi.ts +211 -0
- package/src/registry/ollama-cloud.ts +36 -0
- package/src/registry/ollama.ts +43 -0
- package/src/registry/openai-codex-device.ts +18 -0
- package/src/registry/openai-codex.ts +19 -0
- package/src/registry/openai.ts +6 -0
- package/src/registry/opencode-go.ts +12 -0
- package/src/registry/opencode-zen.ts +12 -0
- package/src/registry/openrouter.ts +28 -0
- package/src/registry/parallel.ts +45 -0
- package/src/registry/perplexity.ts +13 -0
- package/src/registry/qianfan.ts +27 -0
- package/src/registry/qwen-portal.ts +50 -0
- package/src/registry/registry.ts +161 -0
- package/src/registry/sakana.ts +22 -0
- package/src/registry/synthetic.ts +21 -0
- package/src/registry/tavily.ts +45 -0
- package/src/registry/together.ts +22 -0
- package/src/registry/types.ts +56 -0
- package/src/registry/umans.ts +23 -0
- package/src/registry/venice.ts +33 -0
- package/src/registry/vercel-ai-gateway.ts +38 -0
- package/src/registry/vllm.ts +34 -0
- package/src/registry/wafer-serverless.ts +12 -0
- package/src/registry/xai-oauth.ts +17 -0
- package/src/registry/xai.ts +6 -0
- package/src/registry/xiaomi-token-plan-ams.ts +12 -0
- package/src/registry/xiaomi-token-plan-cn.ts +12 -0
- package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
- package/src/registry/xiaomi.ts +12 -0
- package/src/registry/zai.ts +27 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1778 -0
- package/src/types.ts +856 -0
- package/src/usage/claude.ts +485 -0
- package/src/usage/gemini.ts +258 -0
- package/src/usage/github-copilot.ts +424 -0
- package/src/usage/google-antigravity.ts +497 -0
- package/src/usage/kimi.ts +271 -0
- package/src/usage/minimax-code.ts +30 -0
- package/src/usage/ollama.ts +41 -0
- package/src/usage/openai-codex-base-url.ts +35 -0
- package/src/usage/openai-codex-reset.ts +174 -0
- package/src/usage/openai-codex.ts +535 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +321 -0
- package/src/usage.ts +333 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/block-symbols.ts +32 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +159 -0
- package/src/utils/event-stream.ts +171 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +456 -0
- package/src/utils/http-inspector.ts +168 -0
- package/src/utils/idle-iterator.ts +473 -0
- package/src/utils/leaked-thinking-stream.ts +294 -0
- package/src/utils/openai-http.ts +122 -0
- package/src/utils/openrouter-headers.ts +12 -0
- package/src/utils/parse-bind.ts +56 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/proxy.ts +240 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry.ts +59 -0
- package/src/utils/schema/CONSTRAINTS.md +166 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +207 -0
- package/src/utils/schema/index.ts +15 -0
- package/src/utils/schema/json-schema-validator.ts +595 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +1901 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +109 -0
- package/src/utils/schema/strict-tool-validation.ts +117 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/typescript.ts +198 -0
- package/src/utils/schema/wire.ts +789 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +18 -0
- package/src/utils/stream-markup-healing.ts +247 -0
- package/src/utils/thinking-loop.ts +552 -0
- package/src/utils/tool-call-loop-guard.ts +107 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1507 -0
- package/src/utils.ts +171 -0
|
@@ -0,0 +1,271 @@
|
|
|
1
|
+
import { $env } from "jeopi-utils";
|
|
2
|
+
import { getKimiCommonHeaders } from "../registry/oauth/kimi";
|
|
3
|
+
import type {
|
|
4
|
+
UsageAmount,
|
|
5
|
+
UsageFetchContext,
|
|
6
|
+
UsageFetchParams,
|
|
7
|
+
UsageLimit,
|
|
8
|
+
UsageProvider,
|
|
9
|
+
UsageReport,
|
|
10
|
+
UsageStatus,
|
|
11
|
+
UsageWindow,
|
|
12
|
+
} from "../usage";
|
|
13
|
+
import { isRecord } from "../utils";
|
|
14
|
+
// (Refresh is the sole responsibility of AuthStorage; no provider-direct refresh here.)
|
|
15
|
+
import { toNumber } from "./shared";
|
|
16
|
+
|
|
17
|
+
const DEFAULT_BASE_URL = "https://api.kimi.com/coding/v1";
|
|
18
|
+
const USAGE_PATH = "usages";
|
|
19
|
+
|
|
20
|
+
interface KimiUsagePayload {
|
|
21
|
+
usage?: unknown;
|
|
22
|
+
limits?: unknown;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
type KimiUsageRow = {
|
|
26
|
+
label: string;
|
|
27
|
+
used?: number;
|
|
28
|
+
limit?: number;
|
|
29
|
+
remaining?: number;
|
|
30
|
+
resetsAt?: number;
|
|
31
|
+
window?: UsageWindow;
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
function normalizeBaseUrl(baseUrl?: string): string {
|
|
35
|
+
const envBase = $env.KIMI_CODE_BASE_URL?.trim();
|
|
36
|
+
const candidate = baseUrl?.trim() || envBase || DEFAULT_BASE_URL;
|
|
37
|
+
return candidate.replace(/\/+$/, "");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
function buildUsageUrl(baseUrl: string): string {
|
|
41
|
+
const normalized = baseUrl.endsWith("/") ? baseUrl : `${baseUrl}/`;
|
|
42
|
+
return `${normalized}${USAGE_PATH}`;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
function parseResetTime(data: Record<string, unknown>, nowMs: number): number | undefined {
|
|
46
|
+
const timeKeys = ["reset_at", "resetAt", "reset_time", "resetTime"] as const;
|
|
47
|
+
for (const key of timeKeys) {
|
|
48
|
+
const value = data[key];
|
|
49
|
+
if (typeof value === "string" && value.trim()) {
|
|
50
|
+
const parsed = Date.parse(value);
|
|
51
|
+
if (Number.isFinite(parsed)) return parsed;
|
|
52
|
+
}
|
|
53
|
+
if (typeof value === "number" && Number.isFinite(value)) {
|
|
54
|
+
return value > 1_000_000_000_000 ? value : value * 1000;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
const secondsKeys = ["reset_in", "resetIn", "ttl", "window"] as const;
|
|
59
|
+
for (const key of secondsKeys) {
|
|
60
|
+
const seconds = toNumber(data[key]);
|
|
61
|
+
if (seconds !== undefined) return nowMs + seconds * 1000;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
return undefined;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function formatDurationLabel(duration: number, timeUnit: string): string | undefined {
|
|
68
|
+
const upper = timeUnit.toUpperCase();
|
|
69
|
+
if (upper.includes("MINUTE")) {
|
|
70
|
+
if (duration >= 60 && duration % 60 === 0) return `${duration / 60}h limit`;
|
|
71
|
+
return `${duration}m limit`;
|
|
72
|
+
}
|
|
73
|
+
if (upper.includes("HOUR")) return `${duration}h limit`;
|
|
74
|
+
if (upper.includes("DAY")) return `${duration}d limit`;
|
|
75
|
+
if (upper.includes("SECOND")) return `${duration}s limit`;
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function buildWindow(windowData: Record<string, unknown>, nowMs: number): UsageWindow | undefined {
|
|
80
|
+
const duration = toNumber(windowData.duration);
|
|
81
|
+
const timeUnit = typeof windowData.timeUnit === "string" ? windowData.timeUnit : "";
|
|
82
|
+
const label = duration !== undefined && timeUnit ? formatDurationLabel(duration, timeUnit) : undefined;
|
|
83
|
+
const resetsAt = parseResetTime(windowData, nowMs);
|
|
84
|
+
|
|
85
|
+
if (duration === undefined && !label && !resetsAt) return undefined;
|
|
86
|
+
let durationMs: number | undefined;
|
|
87
|
+
if (duration !== undefined) {
|
|
88
|
+
if (timeUnit.toUpperCase().includes("MINUTE")) durationMs = duration * 60_000;
|
|
89
|
+
else if (timeUnit.toUpperCase().includes("HOUR")) durationMs = duration * 3_600_000;
|
|
90
|
+
else if (timeUnit.toUpperCase().includes("DAY")) durationMs = duration * 86_400_000;
|
|
91
|
+
else if (timeUnit.toUpperCase().includes("SECOND")) durationMs = duration * 1000;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
return {
|
|
95
|
+
id: duration !== undefined && timeUnit ? `${duration}${timeUnit.toLowerCase()}` : "default",
|
|
96
|
+
label: label ?? "Usage window",
|
|
97
|
+
durationMs,
|
|
98
|
+
resetsAt,
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function buildUsageRow(data: Record<string, unknown>, defaultLabel: string, nowMs: number): KimiUsageRow | null {
|
|
103
|
+
const limit = toNumber(data.limit);
|
|
104
|
+
let used = toNumber(data.used);
|
|
105
|
+
const remaining = toNumber(data.remaining);
|
|
106
|
+
if (used === undefined && remaining !== undefined && limit !== undefined) {
|
|
107
|
+
used = limit - remaining;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
if (used === undefined && limit === undefined) return null;
|
|
111
|
+
const resetsAt = parseResetTime(data, nowMs);
|
|
112
|
+
return {
|
|
113
|
+
label:
|
|
114
|
+
typeof data.name === "string" && data.name
|
|
115
|
+
? data.name
|
|
116
|
+
: typeof data.title === "string" && data.title
|
|
117
|
+
? data.title
|
|
118
|
+
: defaultLabel,
|
|
119
|
+
used,
|
|
120
|
+
limit,
|
|
121
|
+
remaining,
|
|
122
|
+
resetsAt,
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function buildUsageAmount(row: KimiUsageRow): UsageAmount {
|
|
127
|
+
const amount: UsageAmount = { unit: "unknown" };
|
|
128
|
+
if (row.limit !== undefined) amount.limit = row.limit;
|
|
129
|
+
if (row.used !== undefined) amount.used = row.used;
|
|
130
|
+
if (row.remaining !== undefined) amount.remaining = row.remaining;
|
|
131
|
+
if (row.limit !== undefined && row.used !== undefined && row.limit > 0) {
|
|
132
|
+
amount.usedFraction = Math.min(Math.max(row.used / row.limit, 0), 1);
|
|
133
|
+
amount.remainingFraction = Math.min(Math.max((row.limit - row.used) / row.limit, 0), 1);
|
|
134
|
+
amount.remaining = amount.remaining ?? row.limit - row.used;
|
|
135
|
+
}
|
|
136
|
+
return amount;
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
function buildUsageStatus(amount: UsageAmount): UsageStatus {
|
|
140
|
+
if (amount.usedFraction === undefined) return "unknown";
|
|
141
|
+
if (amount.usedFraction >= 1) return "exhausted";
|
|
142
|
+
if (amount.usedFraction >= 0.9) return "warning";
|
|
143
|
+
return "ok";
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function toUsageLimit(row: KimiUsageRow, provider: string, index: number, accountId?: string): UsageLimit {
|
|
147
|
+
const window: UsageWindow | undefined =
|
|
148
|
+
row.window ??
|
|
149
|
+
(row.resetsAt
|
|
150
|
+
? {
|
|
151
|
+
id: "default",
|
|
152
|
+
label: "Usage window",
|
|
153
|
+
resetsAt: row.resetsAt,
|
|
154
|
+
}
|
|
155
|
+
: undefined);
|
|
156
|
+
|
|
157
|
+
const amount = buildUsageAmount(row);
|
|
158
|
+
return {
|
|
159
|
+
id: `${provider}:${index}`,
|
|
160
|
+
label: row.label,
|
|
161
|
+
scope: {
|
|
162
|
+
provider,
|
|
163
|
+
accountId,
|
|
164
|
+
windowId: window?.id,
|
|
165
|
+
shared: true,
|
|
166
|
+
},
|
|
167
|
+
window,
|
|
168
|
+
amount,
|
|
169
|
+
status: buildUsageStatus(amount),
|
|
170
|
+
};
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function parseUsagePayload(payload: unknown, nowMs: number): { rows: KimiUsageRow[]; raw: KimiUsagePayload } | null {
|
|
174
|
+
if (!isRecord(payload)) return null;
|
|
175
|
+
const data = payload as KimiUsagePayload;
|
|
176
|
+
const rows: KimiUsageRow[] = [];
|
|
177
|
+
|
|
178
|
+
if (isRecord(data.usage)) {
|
|
179
|
+
const summary = buildUsageRow(data.usage, "Total quota", nowMs);
|
|
180
|
+
if (summary) rows.push(summary);
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
if (Array.isArray(data.limits)) {
|
|
184
|
+
data.limits.forEach((item, idx) => {
|
|
185
|
+
if (!isRecord(item)) return;
|
|
186
|
+
const detail = isRecord(item.detail) ? item.detail : item;
|
|
187
|
+
const windowData = isRecord(item.window) ? item.window : {};
|
|
188
|
+
const label =
|
|
189
|
+
(typeof item.name === "string" && item.name) ||
|
|
190
|
+
(typeof item.title === "string" && item.title) ||
|
|
191
|
+
(typeof item.scope === "string" && item.scope) ||
|
|
192
|
+
(typeof detail.name === "string" && detail.name) ||
|
|
193
|
+
(typeof detail.title === "string" && detail.title) ||
|
|
194
|
+
formatDurationLabel(toNumber(windowData.duration) ?? 0, String(windowData.timeUnit || "")) ||
|
|
195
|
+
`Limit #${idx + 1}`;
|
|
196
|
+
const row = buildUsageRow(detail, label, nowMs);
|
|
197
|
+
if (row) {
|
|
198
|
+
row.window = buildWindow(windowData, nowMs);
|
|
199
|
+
rows.push(row);
|
|
200
|
+
}
|
|
201
|
+
});
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
return { rows, raw: data };
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
export const kimiUsageProvider: UsageProvider = {
|
|
208
|
+
id: "kimi-code",
|
|
209
|
+
supports(params: UsageFetchParams): boolean {
|
|
210
|
+
return params.provider === "kimi-code" && params.credential.type === "oauth";
|
|
211
|
+
},
|
|
212
|
+
async fetchUsage(params: UsageFetchParams, ctx: UsageFetchContext): Promise<UsageReport | null> {
|
|
213
|
+
if (params.provider !== "kimi-code") return null;
|
|
214
|
+
const { credential } = params;
|
|
215
|
+
if (credential.type !== "oauth") return null;
|
|
216
|
+
|
|
217
|
+
const accessToken = credential.accessToken;
|
|
218
|
+
if (!accessToken) return null;
|
|
219
|
+
|
|
220
|
+
const nowMs = Date.now();
|
|
221
|
+
// AuthStorage refreshes OAuth credentials pre-emptively (60s skew). If the
|
|
222
|
+
// usage probe lands with an expired token, short-circuit rather than POST
|
|
223
|
+
// the broker sentinel back to Kimi — the next cycle will carry a freshly
|
|
224
|
+
// refreshed credential.
|
|
225
|
+
if (credential.expiresAt !== undefined && credential.expiresAt <= nowMs) {
|
|
226
|
+
ctx.logger?.debug("Kimi usage token expired; skipping probe", { provider: params.provider });
|
|
227
|
+
return null;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const baseUrl = normalizeBaseUrl(params.baseUrl);
|
|
231
|
+
const url = buildUsageUrl(baseUrl);
|
|
232
|
+
let payload: unknown;
|
|
233
|
+
try {
|
|
234
|
+
const response = await ctx.fetch(url, {
|
|
235
|
+
headers: {
|
|
236
|
+
...getKimiCommonHeaders(),
|
|
237
|
+
Authorization: `Bearer ${accessToken}`,
|
|
238
|
+
},
|
|
239
|
+
signal: params.signal,
|
|
240
|
+
});
|
|
241
|
+
if (!response.ok) {
|
|
242
|
+
ctx.logger?.warn("Kimi usage request failed", { status: response.status, provider: params.provider });
|
|
243
|
+
return null;
|
|
244
|
+
}
|
|
245
|
+
payload = await response.json();
|
|
246
|
+
} catch (error) {
|
|
247
|
+
ctx.logger?.warn("Kimi usage request error", { provider: params.provider, error: String(error) });
|
|
248
|
+
return null;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
const parsed = parseUsagePayload(payload, nowMs);
|
|
252
|
+
if (!parsed || parsed.rows.length === 0) {
|
|
253
|
+
ctx.logger?.warn("Kimi usage response invalid", { provider: params.provider });
|
|
254
|
+
return null;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
const limits = parsed.rows.map((row, index) => toUsageLimit(row, params.provider, index, credential.accountId));
|
|
258
|
+
|
|
259
|
+
const report: UsageReport = {
|
|
260
|
+
provider: params.provider,
|
|
261
|
+
fetchedAt: nowMs,
|
|
262
|
+
limits,
|
|
263
|
+
metadata: {
|
|
264
|
+
endpoint: url,
|
|
265
|
+
},
|
|
266
|
+
raw: parsed.raw,
|
|
267
|
+
};
|
|
268
|
+
|
|
269
|
+
return report;
|
|
270
|
+
},
|
|
271
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { UsageFetchContext, UsageFetchParams, UsageProvider, UsageReport } from "../usage";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* MiniMax Token Plan usage provider.
|
|
5
|
+
*
|
|
6
|
+
* MiniMax Token Plan is a subscription-based service with a rolling quota system.
|
|
7
|
+
*
|
|
8
|
+
* Currently, MiniMax does not expose a usage/quota API endpoint for the Token Plan.
|
|
9
|
+
* Usage is tracked via the web dashboard at https://platform.minimax.io/user-center/payment/token-plan
|
|
10
|
+
*
|
|
11
|
+
* This provider exists to register support for the minimax-code provider in the
|
|
12
|
+
* usage system. When MiniMax adds a usage API, this can be implemented.
|
|
13
|
+
*/
|
|
14
|
+
async function fetchMiniMaxCodeUsage(params: UsageFetchParams, _ctx: UsageFetchContext): Promise<UsageReport | null> {
|
|
15
|
+
if (params.provider !== "minimax-code" && params.provider !== "minimax-code-cn") {
|
|
16
|
+
return null;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// MiniMax Token Plan does not currently expose a usage API
|
|
20
|
+
// Users can check their usage via the web dashboard
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export const minimaxCodeUsageProvider: UsageProvider = {
|
|
25
|
+
id: "minimax-code",
|
|
26
|
+
fetchUsage: fetchMiniMaxCodeUsage,
|
|
27
|
+
supports: (params: UsageFetchParams) =>
|
|
28
|
+
(params.provider === "minimax-code" || params.provider === "minimax-code-cn") &&
|
|
29
|
+
params.credential.type === "api_key",
|
|
30
|
+
};
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { UsageFetchContext, UsageFetchParams, UsageProvider, UsageReport } from "../usage";
|
|
2
|
+
|
|
3
|
+
const OLLAMA_PROVIDER = "ollama";
|
|
4
|
+
const OLLAMA_CLOUD_PROVIDER = "ollama-cloud";
|
|
5
|
+
|
|
6
|
+
async function fetchOllamaUsage(params: UsageFetchParams, _ctx: UsageFetchContext): Promise<UsageReport | null> {
|
|
7
|
+
if (params.provider !== OLLAMA_PROVIDER && params.provider !== OLLAMA_CLOUD_PROVIDER) {
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
const metadata: Record<string, unknown> = {};
|
|
12
|
+
if (params.credential.email) metadata.email = params.credential.email;
|
|
13
|
+
if (params.credential.accountId) metadata.accountId = params.credential.accountId;
|
|
14
|
+
if (params.credential.projectId) metadata.projectId = params.credential.projectId;
|
|
15
|
+
|
|
16
|
+
return {
|
|
17
|
+
provider: params.provider,
|
|
18
|
+
fetchedAt: Date.now(),
|
|
19
|
+
limits: [],
|
|
20
|
+
notes: [
|
|
21
|
+
"Ollama does not expose a standalone quota usage API; per-response token usage is reported during requests.",
|
|
22
|
+
],
|
|
23
|
+
metadata: Object.keys(metadata).length > 0 ? metadata : undefined,
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
/** Registers Ollama accounts with usage views even though no quota endpoint is exposed. */
|
|
28
|
+
export const ollamaUsageProvider: UsageProvider = {
|
|
29
|
+
id: OLLAMA_PROVIDER,
|
|
30
|
+
fetchUsage: fetchOllamaUsage,
|
|
31
|
+
supports: params => params.provider === OLLAMA_PROVIDER,
|
|
32
|
+
validatesCredentials: false,
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
/** Registers Ollama Cloud accounts with usage views until a quota endpoint is available. */
|
|
36
|
+
export const ollamaCloudUsageProvider: UsageProvider = {
|
|
37
|
+
id: OLLAMA_CLOUD_PROVIDER,
|
|
38
|
+
fetchUsage: fetchOllamaUsage,
|
|
39
|
+
supports: params => params.provider === OLLAMA_CLOUD_PROVIDER,
|
|
40
|
+
validatesCredentials: false,
|
|
41
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { CODEX_BASE_URL } from "jeopi-catalog/wire/codex";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Resolve the base URL for ChatGPT account-API requests (`wham/usage`,
|
|
5
|
+
* `wham/rate-limit-reset-credits`).
|
|
6
|
+
*
|
|
7
|
+
* These endpoints live on the canonical ChatGPT origin and authenticate with
|
|
8
|
+
* the Codex OAuth bearer minted for that origin. They are NOT part of the
|
|
9
|
+
* `/responses` API surface that streaming proxies (Headroom, 9router, etc.)
|
|
10
|
+
* forward, so a `providers.openai-codex.baseUrl` override pointed at such a
|
|
11
|
+
* proxy MUST NOT be used here — doing so 404s and silently breaks
|
|
12
|
+
* `/usage show` (issue #3679).
|
|
13
|
+
*
|
|
14
|
+
* Accepted overrides are the canonical `chatgpt.com` / `chat.openai.com`
|
|
15
|
+
* origins. Any extra path (e.g. a streaming override like
|
|
16
|
+
* `/backend-api/codex/responses`) is normalized to `${origin}/backend-api`,
|
|
17
|
+
* since the account endpoints always live directly under `/backend-api`. Any
|
|
18
|
+
* other host falls back to {@link CODEX_BASE_URL}.
|
|
19
|
+
*/
|
|
20
|
+
export function normalizeCodexBaseUrl(baseUrl?: string): string {
|
|
21
|
+
const trimmed = baseUrl?.trim().replace(/\/+$/, "");
|
|
22
|
+
if (!trimmed) return CODEX_BASE_URL;
|
|
23
|
+
let parsed: URL;
|
|
24
|
+
try {
|
|
25
|
+
parsed = new URL(trimmed);
|
|
26
|
+
} catch {
|
|
27
|
+
return CODEX_BASE_URL;
|
|
28
|
+
}
|
|
29
|
+
const host = parsed.host.toLowerCase();
|
|
30
|
+
if (host !== "chatgpt.com" && host !== "chat.openai.com") return CODEX_BASE_URL;
|
|
31
|
+
// wham/usage always lives at `${origin}/backend-api/...` on the canonical
|
|
32
|
+
// ChatGPT origin, so ignore any extra path (e.g. `/backend-api/codex/responses`
|
|
33
|
+
// from a streaming baseUrl) — otherwise we'd build `.../codex/responses/wham/usage`.
|
|
34
|
+
return `${parsed.origin}/backend-api`;
|
|
35
|
+
}
|
|
@@ -0,0 +1,174 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* OpenAI Codex "saved rate limit reset" redemption client.
|
|
3
|
+
*
|
|
4
|
+
* OpenAI lets paid Codex accounts bank a usage-window reset and spend it on
|
|
5
|
+
* demand (announced 2026-06-11). The count is surfaced on `/wham/usage` as
|
|
6
|
+
* `rate_limit_reset_credits.available_count` (see `./openai-codex.ts`), but the
|
|
7
|
+
* actual credit objects and the redeem action live on two dedicated routes:
|
|
8
|
+
*
|
|
9
|
+
* GET /wham/rate-limit-reset-credits → list redeemable credits
|
|
10
|
+
* POST /wham/rate-limit-reset-credits/consume → spend one credit
|
|
11
|
+
* body: { credit_id, redeem_request_id }
|
|
12
|
+
*
|
|
13
|
+
* `redeem_request_id` is a client-generated idempotency key (UUID). The consume
|
|
14
|
+
* response carries a `code`: `"reset"` on success, otherwise a business reason
|
|
15
|
+
* (`already_redeemed`, `no_credit`, `nothing_to_reset`).
|
|
16
|
+
*
|
|
17
|
+
* These are thin, dependency-light functions so both the interactive session
|
|
18
|
+
* (the `/usage reset` command + auto-redeem) and any out-of-band tooling can
|
|
19
|
+
* share one wire contract.
|
|
20
|
+
*/
|
|
21
|
+
import type { FetchImpl } from "../types";
|
|
22
|
+
import { isRecord } from "../utils";
|
|
23
|
+
import { normalizeCodexBaseUrl } from "./openai-codex-base-url";
|
|
24
|
+
import { toNumber } from "./shared";
|
|
25
|
+
|
|
26
|
+
const RESET_CREDITS_PATH = "wham/rate-limit-reset-credits";
|
|
27
|
+
const RESET_CREDITS_CONSUME_PATH = "wham/rate-limit-reset-credits/consume";
|
|
28
|
+
|
|
29
|
+
/** A single redeemable (or already-spent) saved reset. */
|
|
30
|
+
export interface CodexResetCredit {
|
|
31
|
+
/** Opaque credit id, e.g. `RateLimitResetCredit_…`. Pass to {@link consumeCodexResetCredit}. */
|
|
32
|
+
id: string;
|
|
33
|
+
/** Backend reset family, e.g. `codex_rate_limits`. */
|
|
34
|
+
resetType?: string;
|
|
35
|
+
/** `available`, `redeemed`, … */
|
|
36
|
+
status?: string;
|
|
37
|
+
grantedAt?: string;
|
|
38
|
+
expiresAt?: string;
|
|
39
|
+
redeemStartedAt?: string | null;
|
|
40
|
+
redeemedAt?: string | null;
|
|
41
|
+
/** Human-facing card title, e.g. "One free rate limit reset". */
|
|
42
|
+
title?: string;
|
|
43
|
+
description?: string;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** Result of listing an account's saved resets. */
|
|
47
|
+
export interface CodexResetCreditList {
|
|
48
|
+
credits: CodexResetCredit[];
|
|
49
|
+
/** Backend-reported count of credits redeemable right now. */
|
|
50
|
+
availableCount: number;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Consume outcome `code`. `reset` means a window was actually reset; the others
|
|
55
|
+
* are no-op business outcomes the caller should surface verbatim-ish to the user.
|
|
56
|
+
*/
|
|
57
|
+
export type CodexResetConsumeCode =
|
|
58
|
+
| "reset"
|
|
59
|
+
| "already_redeemed"
|
|
60
|
+
| "no_credit"
|
|
61
|
+
| "nothing_to_reset"
|
|
62
|
+
// Forward-compatible: unknown future codes pass through.
|
|
63
|
+
| (string & {});
|
|
64
|
+
|
|
65
|
+
export interface CodexResetConsumeResult {
|
|
66
|
+
/** `true` only when `code === "reset"` (a reset was applied). */
|
|
67
|
+
ok: boolean;
|
|
68
|
+
code: CodexResetConsumeCode;
|
|
69
|
+
/** HTTP status of the consume call (for diagnostics). */
|
|
70
|
+
status: number;
|
|
71
|
+
raw?: unknown;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
interface CodexResetAuth {
|
|
75
|
+
accessToken: string;
|
|
76
|
+
accountId?: string;
|
|
77
|
+
/** Provider base URL override; defaults to the Codex backend. */
|
|
78
|
+
baseUrl?: string;
|
|
79
|
+
fetch: FetchImpl;
|
|
80
|
+
signal?: AbortSignal;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
function buildUrl(baseUrl: string | undefined, routePath: string): string {
|
|
84
|
+
const base = normalizeCodexBaseUrl(baseUrl);
|
|
85
|
+
const normalized = base.endsWith("/") ? base : `${base}/`;
|
|
86
|
+
return `${normalized}${routePath}`;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function buildHeaders(auth: CodexResetAuth, json: boolean): Record<string, string> {
|
|
90
|
+
const headers: Record<string, string> = {
|
|
91
|
+
Authorization: `Bearer ${auth.accessToken}`,
|
|
92
|
+
"User-Agent": "OpenCode-Status-Plugin/1.0",
|
|
93
|
+
};
|
|
94
|
+
if (auth.accountId) headers["ChatGPT-Account-Id"] = auth.accountId;
|
|
95
|
+
if (json) headers["Content-Type"] = "application/json";
|
|
96
|
+
return headers;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
function parseCredit(value: unknown): CodexResetCredit | null {
|
|
100
|
+
if (!isRecord(value)) return null;
|
|
101
|
+
const id = typeof value.id === "string" ? value.id : undefined;
|
|
102
|
+
if (!id) return null;
|
|
103
|
+
const str = (key: string): string | undefined =>
|
|
104
|
+
typeof value[key] === "string" ? (value[key] as string) : undefined;
|
|
105
|
+
const nullableStr = (key: string): string | null | undefined => {
|
|
106
|
+
const raw = value[key];
|
|
107
|
+
if (raw === null) return null;
|
|
108
|
+
return typeof raw === "string" ? raw : undefined;
|
|
109
|
+
};
|
|
110
|
+
return {
|
|
111
|
+
id,
|
|
112
|
+
resetType: str("reset_type"),
|
|
113
|
+
status: str("status"),
|
|
114
|
+
grantedAt: str("granted_at"),
|
|
115
|
+
expiresAt: str("expires_at"),
|
|
116
|
+
redeemStartedAt: nullableStr("redeem_started_at"),
|
|
117
|
+
redeemedAt: nullableStr("redeemed_at"),
|
|
118
|
+
title: str("title"),
|
|
119
|
+
description: str("description"),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
/**
|
|
124
|
+
* List the account's saved rate-limit resets. Returns `null` on transport/auth
|
|
125
|
+
* failure (non-2xx or thrown), letting callers treat it the same as "no data".
|
|
126
|
+
*/
|
|
127
|
+
export async function listCodexResetCredits(auth: CodexResetAuth): Promise<CodexResetCreditList | null> {
|
|
128
|
+
const url = buildUrl(auth.baseUrl, RESET_CREDITS_PATH);
|
|
129
|
+
let payload: unknown;
|
|
130
|
+
try {
|
|
131
|
+
const response = await auth.fetch(url, { headers: buildHeaders(auth, false), signal: auth.signal });
|
|
132
|
+
if (!response.ok) return null;
|
|
133
|
+
payload = await response.json();
|
|
134
|
+
} catch {
|
|
135
|
+
return null;
|
|
136
|
+
}
|
|
137
|
+
if (!isRecord(payload)) return null;
|
|
138
|
+
const credits = Array.isArray(payload.credits)
|
|
139
|
+
? payload.credits.map(parseCredit).filter((c): c is CodexResetCredit => c !== null)
|
|
140
|
+
: [];
|
|
141
|
+
const reported = toNumber(payload.available_count);
|
|
142
|
+
const availableCount =
|
|
143
|
+
reported !== undefined
|
|
144
|
+
? Math.max(0, Math.trunc(reported))
|
|
145
|
+
: credits.filter(c => (c.status ?? "available") === "available").length;
|
|
146
|
+
return { credits, availableCount };
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Spend one saved reset. `redeemRequestId` is the idempotency key; one is
|
|
151
|
+
* generated when omitted, so retrying with the SAME id is safe and won't
|
|
152
|
+
* double-spend. The returned `code` is `"reset"` on success.
|
|
153
|
+
*/
|
|
154
|
+
export async function consumeCodexResetCredit(
|
|
155
|
+
auth: CodexResetAuth & { creditId: string; redeemRequestId?: string },
|
|
156
|
+
): Promise<CodexResetConsumeResult> {
|
|
157
|
+
const redeemRequestId = auth.redeemRequestId ?? crypto.randomUUID();
|
|
158
|
+
const url = buildUrl(auth.baseUrl, RESET_CREDITS_CONSUME_PATH);
|
|
159
|
+
const response = await auth.fetch(url, {
|
|
160
|
+
method: "POST",
|
|
161
|
+
headers: buildHeaders(auth, true),
|
|
162
|
+
body: JSON.stringify({ credit_id: auth.creditId, redeem_request_id: redeemRequestId }),
|
|
163
|
+
signal: auth.signal,
|
|
164
|
+
});
|
|
165
|
+
let body: unknown;
|
|
166
|
+
try {
|
|
167
|
+
body = await response.json();
|
|
168
|
+
} catch {
|
|
169
|
+
body = undefined;
|
|
170
|
+
}
|
|
171
|
+
const code =
|
|
172
|
+
isRecord(body) && typeof body.code === "string" ? body.code : response.ok ? "reset" : `http_${response.status}`;
|
|
173
|
+
return { ok: code === "reset", code, status: response.status, raw: body };
|
|
174
|
+
}
|