@vib-rato/ai 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +3354 -0
- package/README.md +1194 -0
- package/dist/types/adapter-internals/provider-safety-stop.d.ts +45 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +80 -0
- package/dist/types/auth-broker/index.d.ts +5 -0
- package/dist/types/auth-broker/redact.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +153 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/types.d.ts +132 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +555 -0
- package/dist/types/auth-gateway/http.d.ts +40 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +70 -0
- package/dist/types/auth-gateway/types.d.ts +129 -0
- package/dist/types/auth-storage.d.ts +1074 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/codex-tools.d.ts +4 -0
- package/dist/types/context-cap-policy.d.ts +68 -0
- package/dist/types/core.d.ts +35 -0
- package/dist/types/index.d.ts +55 -0
- package/dist/types/model-cache.d.ts +24 -0
- package/dist/types/model-manager.d.ts +77 -0
- package/dist/types/model-pricing.d.ts +3 -0
- package/dist/types/model-retirements.d.ts +6 -0
- package/dist/types/model-thinking.d.ts +100 -0
- package/dist/types/models.d.ts +21 -0
- package/dist/types/openai-completions-compat.d.ts +34 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/provider-models/bundled-references.d.ts +4 -0
- package/dist/types/provider-models/descriptors.d.ts +48 -0
- package/dist/types/provider-models/google.d.ts +20 -0
- package/dist/types/provider-models/index.d.ts +5 -0
- package/dist/types/provider-models/ollama.d.ts +7 -0
- package/dist/types/provider-models/openai-compat.d.ts +293 -0
- package/dist/types/provider-models/special.d.ts +29 -0
- package/dist/types/providers/amazon-bedrock.d.ts +60 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +450 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic.d.ts +280 -0
- package/dist/types/providers/aws-credential-config.d.ts +19 -0
- package/dist/types/providers/aws-credentials.d.ts +43 -0
- package/dist/types/providers/aws-eventstream.d.ts +38 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +22 -0
- package/dist/types/providers/composer-discipline.d.ts +32 -0
- package/dist/types/providers/cursor/client-version.d.ts +10 -0
- package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +16769 -0
- package/dist/types/providers/cursor-pi-args.d.ts +119 -0
- package/dist/types/providers/cursor.d.ts +72 -0
- package/dist/types/providers/dashscope-token-plan-headers.d.ts +57 -0
- package/dist/types/providers/error-message.d.ts +27 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +26 -0
- package/dist/types/providers/google-gemini-cli.d.ts +75 -0
- package/dist/types/providers/google-gemini-headers.d.ts +43 -0
- package/dist/types/providers/google-shared.d.ts +183 -0
- package/dist/types/providers/google-types.d.ts +138 -0
- package/dist/types/providers/google-vertex.d.ts +11 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/kiro-api-key.d.ts +50 -0
- package/dist/types/providers/kiro-codewhisperer.d.ts +11 -0
- package/dist/types/providers/mock.d.ts +189 -0
- package/dist/types/providers/ollama.d.ts +41 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +31 -0
- package/dist/types/providers/openai-bounded-rate-limits.d.ts +3 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +1733 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-codex/constants.d.ts +26 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +50 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +18 -0
- package/dist/types/providers/openai-codex-responses.d.ts +71 -0
- package/dist/types/providers/openai-completions-compat.d.ts +6 -0
- package/dist/types/providers/openai-completions.d.ts +35 -0
- package/dist/types/providers/openai-opencodex-responses.d.ts +10 -0
- package/dist/types/providers/openai-request-transform.d.ts +4 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +392 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-shared.d.ts +106 -0
- package/dist/types/providers/openai-responses.d.ts +37 -0
- package/dist/types/providers/pi-native-client.d.ts +29 -0
- package/dist/types/providers/pi-native-server.d.ts +60 -0
- package/dist/types/providers/register-builtins.d.ts +59 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +33 -0
- package/dist/types/providers/vision-guard.d.ts +8 -0
- package/dist/types/rate-limit-utils.d.ts +19 -0
- package/dist/types/stream.d.ts +45 -0
- package/dist/types/types.d.ts +1073 -0
- package/dist/types/usage/claude.d.ts +3 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +2 -0
- package/dist/types/usage/grok-cli.d.ts +17 -0
- package/dist/types/usage/kimi.d.ts +4 -0
- package/dist/types/usage/minimax-code.d.ts +2 -0
- package/dist/types/usage/openai-codex.d.ts +3 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/zai.d.ts +2 -0
- package/dist/types/usage.d.ts +264 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/anthropic-auth.d.ts +39 -0
- package/dist/types/utils/block-symbols.d.ts +6 -0
- package/dist/types/utils/discovery/antigravity.d.ts +67 -0
- package/dist/types/utils/discovery/codex.d.ts +38 -0
- package/dist/types/utils/discovery/cursor.d.ts +49 -0
- package/dist/types/utils/discovery/gemini.d.ts +25 -0
- package/dist/types/utils/discovery/index.d.ts +4 -0
- package/dist/types/utils/discovery/openai-compatible.d.ts +81 -0
- package/dist/types/utils/event-stream.d.ts +41 -0
- package/dist/types/utils/fallback-transport.d.ts +110 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +11 -0
- package/dist/types/utils/h2-fetch.d.ts +22 -0
- package/dist/types/utils/http-inspector.d.ts +59 -0
- package/dist/types/utils/idle-iterator.d.ts +122 -0
- package/dist/types/utils/json-parse.d.ts +98 -0
- package/dist/types/utils/oauth/alibaba-token-plan.d.ts +19 -0
- package/dist/types/utils/oauth/anthropic.d.ts +41 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +38 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +39 -0
- package/dist/types/utils/oauth/bizrouter.d.ts +1 -0
- package/dist/types/utils/oauth/callback-server.d.ts +80 -0
- package/dist/types/utils/oauth/cerebras.d.ts +1 -0
- package/dist/types/utils/oauth/cloudflare-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/commandcode.d.ts +1 -0
- package/dist/types/utils/oauth/cursor.d.ts +15 -0
- package/dist/types/utils/oauth/deepinfra.d.ts +1 -0
- package/dist/types/utils/oauth/deepseek.d.ts +10 -0
- package/dist/types/utils/oauth/firepass.d.ts +1 -0
- package/dist/types/utils/oauth/fireworks.d.ts +1 -0
- package/dist/types/utils/oauth/fugu.d.ts +1 -0
- package/dist/types/utils/oauth/github-copilot.d.ts +38 -0
- package/dist/types/utils/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/utils/oauth/glm-zcode.d.ts +71 -0
- package/dist/types/utils/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/utils/oauth/google-gemini-cli.d.ts +10 -0
- package/dist/types/utils/oauth/google-oauth-shared.d.ts +28 -0
- package/dist/types/utils/oauth/huggingface.d.ts +19 -0
- package/dist/types/utils/oauth/index.d.ts +39 -0
- package/dist/types/utils/oauth/kagi.d.ts +17 -0
- package/dist/types/utils/oauth/kilo.d.ts +5 -0
- package/dist/types/utils/oauth/kimi.d.ts +17 -0
- package/dist/types/utils/oauth/kiro.d.ts +71 -0
- package/dist/types/utils/oauth/litellm.d.ts +18 -0
- package/dist/types/utils/oauth/lm-studio.d.ts +17 -0
- package/dist/types/utils/oauth/mara.d.ts +1 -0
- package/dist/types/utils/oauth/minimax-code.d.ts +28 -0
- package/dist/types/utils/oauth/moonshot.d.ts +1 -0
- package/dist/types/utils/oauth/nanogpt.d.ts +1 -0
- package/dist/types/utils/oauth/nvidia.d.ts +18 -0
- package/dist/types/utils/oauth/ollama-cloud.d.ts +2 -0
- package/dist/types/utils/oauth/ollama.d.ts +18 -0
- package/dist/types/utils/oauth/openai-codex.d.ts +21 -0
- package/dist/types/utils/oauth/opencode.d.ts +18 -0
- package/dist/types/utils/oauth/opengateway.d.ts +1 -0
- package/dist/types/utils/oauth/openrouter.d.ts +1 -0
- package/dist/types/utils/oauth/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +4 -0
- package/dist/types/utils/oauth/pkce.d.ts +8 -0
- package/dist/types/utils/oauth/qianfan.d.ts +17 -0
- package/dist/types/utils/oauth/qwen-portal.d.ts +19 -0
- package/dist/types/utils/oauth/sglang.d.ts +16 -0
- package/dist/types/utils/oauth/synthetic.d.ts +1 -0
- package/dist/types/utils/oauth/tavily.d.ts +17 -0
- package/dist/types/utils/oauth/together.d.ts +1 -0
- package/dist/types/utils/oauth/types.d.ts +56 -0
- package/dist/types/utils/oauth/venice.d.ts +18 -0
- package/dist/types/utils/oauth/vercel-ai-gateway.d.ts +18 -0
- package/dist/types/utils/oauth/vllm.d.ts +16 -0
- package/dist/types/utils/oauth/xai.d.ts +30 -0
- package/dist/types/utils/oauth/xiaomi.d.ts +25 -0
- package/dist/types/utils/oauth/zai.d.ts +18 -0
- package/dist/types/utils/oauth/zenmux.d.ts +1 -0
- package/dist/types/utils/overflow.d.ts +14 -0
- package/dist/types/utils/parse-bind.d.ts +26 -0
- package/dist/types/utils/provider-response.d.ts +6 -0
- package/dist/types/utils/provider-safety-stop.d.ts +8 -0
- package/dist/types/utils/proxy.d.ts +7 -0
- package/dist/types/utils/retry-after.d.ts +3 -0
- package/dist/types/utils/retry-budget.d.ts +1 -0
- package/dist/types/utils/retry.d.ts +29 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +49 -0
- package/dist/types/utils/schema/index.d.ts +14 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +12 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +93 -0
- package/dist/types/utils/schema/root-combinator.d.ts +12 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +25 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/wire.d.ts +54 -0
- package/dist/types/utils/schema/zod-decontaminate.d.ts +31 -0
- package/dist/types/utils/sse-debug.d.ts +10 -0
- package/dist/types/utils/tool-call-healing.d.ts +80 -0
- package/dist/types/utils/tool-choice-capability.d.ts +57 -0
- package/dist/types/utils/tool-choice.d.ts +50 -0
- package/dist/types/utils/validation.d.ts +17 -0
- package/dist/types/utils.d.ts +117 -0
- package/package.json +152 -0
- package/src/adapter-internals/provider-safety-stop.d.ts +45 -0
- package/src/adapter-internals/provider-safety-stop.ts +156 -0
- package/src/api-registry.d.ts +30 -0
- package/src/api-registry.ts +96 -0
- package/src/auth-broker/client.ts +444 -0
- package/src/auth-broker/index.ts +5 -0
- package/src/auth-broker/redact.ts +39 -0
- package/src/auth-broker/refresher.ts +130 -0
- package/src/auth-broker/remote-store.ts +1576 -0
- package/src/auth-broker/server.ts +764 -0
- package/src/auth-broker/types.ts +164 -0
- package/src/auth-broker/wire-schemas.ts +261 -0
- package/src/auth-gateway/http.ts +198 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +1315 -0
- package/src/auth-gateway/types.ts +160 -0
- package/src/auth-storage.ts +7312 -0
- package/src/cli.ts +269 -0
- package/src/codex-tools.d.ts +4 -0
- package/src/codex-tools.ts +24 -0
- package/src/context-cap-policy.d.ts +68 -0
- package/src/context-cap-policy.ts +123 -0
- package/src/core.ts +44 -0
- package/src/index.ts +61 -0
- package/src/model-cache.ts +236 -0
- package/src/model-manager.ts +744 -0
- package/src/model-pricing.d.ts +3 -0
- package/src/model-pricing.ts +68 -0
- package/src/model-retirements.d.ts +6 -0
- package/src/model-retirements.ts +19 -0
- package/src/model-thinking.d.ts +100 -0
- package/src/model-thinking.ts +1054 -0
- package/src/models.d.ts +21 -0
- package/src/models.json +94672 -0
- package/src/models.json.d.ts +9 -0
- package/src/models.ts +126 -0
- package/src/openai-completions-compat.d.ts +34 -0
- package/src/openai-completions-compat.ts +383 -0
- package/src/prompts/composer-bash-policy-recovery.md +1 -0
- package/src/prompts/cursor-composer-bash-policy-recovery.md +1 -0
- package/src/prompts/cursor-composer-edit-discipline.md +7 -0
- package/src/prompts/turn-aborted-guidance.md +4 -0
- package/src/provider-details.ts +90 -0
- package/src/provider-models/bundled-references.ts +38 -0
- package/src/provider-models/descriptors.ts +392 -0
- package/src/provider-models/google.ts +92 -0
- package/src/provider-models/index.ts +5 -0
- package/src/provider-models/ollama.ts +159 -0
- package/src/provider-models/openai-compat.ts +2920 -0
- package/src/provider-models/special.ts +185 -0
- package/src/providers/amazon-bedrock.d.ts +60 -0
- package/src/providers/amazon-bedrock.ts +939 -0
- package/src/providers/anthropic-messages-server-schema.ts +229 -0
- package/src/providers/anthropic-messages-server.ts +839 -0
- package/src/providers/anthropic.d.ts +280 -0
- package/src/providers/anthropic.ts +4421 -0
- package/src/providers/aws-credential-config.d.ts +19 -0
- package/src/providers/aws-credential-config.ts +179 -0
- package/src/providers/aws-credentials.d.ts +43 -0
- package/src/providers/aws-credentials.ts +457 -0
- package/src/providers/aws-eventstream.d.ts +38 -0
- package/src/providers/aws-eventstream.ts +185 -0
- package/src/providers/aws-sigv4.d.ts +55 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.d.ts +22 -0
- package/src/providers/azure-openai-responses.ts +447 -0
- package/src/providers/composer-discipline.d.ts +32 -0
- package/src/providers/composer-discipline.ts +95 -0
- package/src/providers/cursor/client-version.d.ts +10 -0
- package/src/providers/cursor/client-version.ts +10 -0
- package/src/providers/cursor/exec-modern.d.ts +98 -0
- package/src/providers/cursor/exec-modern.ts +497 -0
- package/src/providers/cursor/gen/agent_pb.d.ts +16769 -0
- package/src/providers/cursor/gen/agent_pb.ts +19780 -0
- package/src/providers/cursor/proto/agent.proto +4533 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor-pi-args.d.ts +119 -0
- package/src/providers/cursor-pi-args.ts +187 -0
- package/src/providers/cursor.d.ts +72 -0
- package/src/providers/cursor.ts +3396 -0
- package/src/providers/dashscope-token-plan-headers.d.ts +57 -0
- package/src/providers/dashscope-token-plan-headers.ts +84 -0
- package/src/providers/error-message.d.ts +27 -0
- package/src/providers/error-message.ts +21 -0
- package/src/providers/github-copilot-headers.d.ts +40 -0
- package/src/providers/github-copilot-headers.ts +140 -0
- package/src/providers/gitlab-duo.d.ts +27 -0
- package/src/providers/gitlab-duo.ts +393 -0
- package/src/providers/google-auth.d.ts +26 -0
- package/src/providers/google-auth.ts +262 -0
- package/src/providers/google-gemini-cli.d.ts +75 -0
- package/src/providers/google-gemini-cli.ts +969 -0
- package/src/providers/google-gemini-headers.d.ts +43 -0
- package/src/providers/google-gemini-headers.ts +100 -0
- package/src/providers/google-shared.d.ts +183 -0
- package/src/providers/google-shared.ts +1105 -0
- package/src/providers/google-types.d.ts +138 -0
- package/src/providers/google-types.ts +167 -0
- package/src/providers/google-vertex.d.ts +11 -0
- package/src/providers/google-vertex.ts +124 -0
- package/src/providers/google.d.ts +4 -0
- package/src/providers/google.ts +41 -0
- package/src/providers/grammar.d.ts +1 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.d.ts +27 -0
- package/src/providers/kimi.ts +52 -0
- package/src/providers/kiro-api-key.d.ts +50 -0
- package/src/providers/kiro-api-key.ts +786 -0
- package/src/providers/kiro-codewhisperer.d.ts +11 -0
- package/src/providers/kiro-codewhisperer.ts +600 -0
- package/src/providers/mock.ts +526 -0
- package/src/providers/ollama.d.ts +41 -0
- package/src/providers/ollama.ts +645 -0
- package/src/providers/openai-anthropic-shim.d.ts +31 -0
- package/src/providers/openai-anthropic-shim.ts +156 -0
- package/src/providers/openai-bounded-rate-limits.d.ts +3 -0
- package/src/providers/openai-bounded-rate-limits.ts +57 -0
- package/src/providers/openai-chat-server-schema.ts +254 -0
- package/src/providers/openai-chat-server.ts +724 -0
- package/src/providers/openai-codex/constants.d.ts +26 -0
- package/src/providers/openai-codex/constants.ts +43 -0
- package/src/providers/openai-codex/request-transformer.d.ts +50 -0
- package/src/providers/openai-codex/request-transformer.ts +219 -0
- package/src/providers/openai-codex/response-handler.d.ts +18 -0
- package/src/providers/openai-codex/response-handler.ts +111 -0
- package/src/providers/openai-codex-responses.d.ts +71 -0
- package/src/providers/openai-codex-responses.ts +3288 -0
- package/src/providers/openai-completions-compat.d.ts +6 -0
- package/src/providers/openai-completions-compat.ts +6 -0
- package/src/providers/openai-completions.d.ts +35 -0
- package/src/providers/openai-completions.ts +2294 -0
- package/src/providers/openai-opencodex-responses.ts +174 -0
- package/src/providers/openai-request-transform.d.ts +4 -0
- package/src/providers/openai-request-transform.ts +136 -0
- package/src/providers/openai-responses-server-schema.ts +290 -0
- package/src/providers/openai-responses-server.ts +1268 -0
- package/src/providers/openai-responses-shared.d.ts +106 -0
- package/src/providers/openai-responses-shared.ts +1253 -0
- package/src/providers/openai-responses.d.ts +37 -0
- package/src/providers/openai-responses.ts +989 -0
- package/src/providers/pi-native-client.d.ts +29 -0
- package/src/providers/pi-native-client.ts +243 -0
- package/src/providers/pi-native-server.ts +488 -0
- package/src/providers/register-builtins.d.ts +59 -0
- package/src/providers/register-builtins.ts +544 -0
- package/src/providers/synthetic.d.ts +26 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.d.ts +33 -0
- package/src/providers/transform-messages.ts +408 -0
- package/src/providers/vision-guard.d.ts +8 -0
- package/src/providers/vision-guard.ts +31 -0
- package/src/rate-limit-utils.d.ts +19 -0
- package/src/rate-limit-utils.ts +102 -0
- package/src/stream.d.ts +45 -0
- package/src/stream.ts +1306 -0
- package/src/types.d.ts +1073 -0
- package/src/types.ts +1305 -0
- package/src/usage/claude.ts +449 -0
- package/src/usage/gemini.ts +250 -0
- package/src/usage/github-copilot.ts +421 -0
- package/src/usage/google-antigravity.ts +201 -0
- package/src/usage/grok-cli.ts +259 -0
- package/src/usage/kimi.ts +285 -0
- package/src/usage/minimax-code.ts +31 -0
- package/src/usage/openai-codex.ts +503 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/zai.ts +247 -0
- package/src/usage.ts +190 -0
- package/src/utils/abort.d.ts +19 -0
- package/src/utils/abort.ts +51 -0
- package/src/utils/anthropic-auth.ts +95 -0
- package/src/utils/block-symbols.d.ts +6 -0
- package/src/utils/block-symbols.ts +11 -0
- package/src/utils/discovery/antigravity.ts +275 -0
- package/src/utils/discovery/codex.ts +362 -0
- package/src/utils/discovery/cursor.ts +388 -0
- package/src/utils/discovery/gemini.ts +248 -0
- package/src/utils/discovery/index.ts +4 -0
- package/src/utils/discovery/openai-compatible.ts +379 -0
- package/src/utils/event-stream.d.ts +41 -0
- package/src/utils/event-stream.ts +269 -0
- package/src/utils/fallback-transport.d.ts +110 -0
- package/src/utils/fallback-transport.ts +411 -0
- package/src/utils/fireworks-model-id.d.ts +10 -0
- package/src/utils/fireworks-model-id.ts +30 -0
- package/src/utils/foundry.d.ts +11 -0
- package/src/utils/foundry.ts +18 -0
- package/src/utils/h2-fetch.ts +60 -0
- package/src/utils/http-inspector.d.ts +59 -0
- package/src/utils/http-inspector.ts +380 -0
- package/src/utils/idle-iterator.d.ts +122 -0
- package/src/utils/idle-iterator.ts +410 -0
- package/src/utils/json-parse.d.ts +98 -0
- package/src/utils/json-parse.ts +607 -0
- package/src/utils/oauth/alibaba-token-plan.ts +60 -0
- package/src/utils/oauth/anthropic.ts +233 -0
- package/src/utils/oauth/api-key-login.ts +98 -0
- package/src/utils/oauth/api-key-validation.ts +344 -0
- package/src/utils/oauth/bizrouter.ts +15 -0
- package/src/utils/oauth/callback-server.d.ts +80 -0
- package/src/utils/oauth/callback-server.ts +359 -0
- package/src/utils/oauth/cerebras.ts +16 -0
- package/src/utils/oauth/cloudflare-ai-gateway.ts +48 -0
- package/src/utils/oauth/commandcode.ts +17 -0
- package/src/utils/oauth/cursor.ts +157 -0
- package/src/utils/oauth/deepinfra.ts +15 -0
- package/src/utils/oauth/deepseek.ts +53 -0
- package/src/utils/oauth/firepass.ts +24 -0
- package/src/utils/oauth/fireworks.ts +15 -0
- package/src/utils/oauth/fugu.ts +15 -0
- package/src/utils/oauth/github-copilot.d.ts +38 -0
- package/src/utils/oauth/github-copilot.ts +362 -0
- package/src/utils/oauth/gitlab-duo.ts +123 -0
- package/src/utils/oauth/glm-zcode.d.ts +71 -0
- package/src/utils/oauth/glm-zcode.ts +433 -0
- package/src/utils/oauth/google-antigravity.ts +200 -0
- package/src/utils/oauth/google-gemini-cli.ts +256 -0
- package/src/utils/oauth/google-oauth-shared.ts +110 -0
- package/src/utils/oauth/huggingface.ts +62 -0
- package/src/utils/oauth/index.ts +558 -0
- package/src/utils/oauth/kagi.ts +47 -0
- package/src/utils/oauth/kilo.ts +87 -0
- package/src/utils/oauth/kimi.d.ts +17 -0
- package/src/utils/oauth/kimi.ts +275 -0
- package/src/utils/oauth/kiro.ts +448 -0
- package/src/utils/oauth/litellm.ts +47 -0
- package/src/utils/oauth/lm-studio.ts +38 -0
- package/src/utils/oauth/mara.ts +16 -0
- package/src/utils/oauth/minimax-code.ts +78 -0
- package/src/utils/oauth/moonshot.ts +16 -0
- package/src/utils/oauth/nanogpt.ts +15 -0
- package/src/utils/oauth/nvidia.ts +70 -0
- package/src/utils/oauth/oauth.html +199 -0
- package/src/utils/oauth/ollama-cloud.ts +28 -0
- package/src/utils/oauth/ollama.ts +47 -0
- package/src/utils/oauth/openai-codex.ts +299 -0
- package/src/utils/oauth/opencode.ts +49 -0
- package/src/utils/oauth/opengateway.ts +15 -0
- package/src/utils/oauth/openrouter.ts +16 -0
- package/src/utils/oauth/parallel.ts +46 -0
- package/src/utils/oauth/perplexity.ts +225 -0
- package/src/utils/oauth/pkce.ts +18 -0
- package/src/utils/oauth/qianfan.ts +58 -0
- package/src/utils/oauth/qwen-portal.ts +60 -0
- package/src/utils/oauth/sglang.ts +42 -0
- package/src/utils/oauth/synthetic.ts +15 -0
- package/src/utils/oauth/tavily.ts +46 -0
- package/src/utils/oauth/together.ts +16 -0
- package/src/utils/oauth/types.d.ts +56 -0
- package/src/utils/oauth/types.ts +122 -0
- package/src/utils/oauth/venice.ts +59 -0
- package/src/utils/oauth/vercel-ai-gateway.ts +47 -0
- package/src/utils/oauth/vllm.ts +42 -0
- package/src/utils/oauth/xai.ts +246 -0
- package/src/utils/oauth/xiaomi.ts +199 -0
- package/src/utils/oauth/zai.ts +60 -0
- package/src/utils/oauth/zenmux.ts +15 -0
- package/src/utils/overflow.ts +275 -0
- package/src/utils/parse-bind.ts +81 -0
- package/src/utils/provider-response.d.ts +6 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/provider-safety-stop.ts +8 -0
- package/src/utils/proxy.d.ts +7 -0
- package/src/utils/proxy.ts +652 -0
- package/src/utils/retry-after.d.ts +3 -0
- package/src/utils/retry-after.ts +110 -0
- package/src/utils/retry-budget.d.ts +1 -0
- package/src/utils/retry-budget.ts +4 -0
- package/src/utils/retry.d.ts +29 -0
- package/src/utils/retry.ts +67 -0
- package/src/utils/schema/CONSTRAINTS.md +164 -0
- package/src/utils/schema/adapt.d.ts +24 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.d.ts +30 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.d.ts +11 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.d.ts +10 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.d.ts +4 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.d.ts +49 -0
- package/src/utils/schema/fields.ts +190 -0
- package/src/utils/schema/index.d.ts +14 -0
- package/src/utils/schema/index.ts +14 -0
- package/src/utils/schema/json-schema-validator.d.ts +12 -0
- package/src/utils/schema/json-schema-validator.ts +577 -0
- package/src/utils/schema/meta-validator.d.ts +2 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.d.ts +93 -0
- package/src/utils/schema/normalize.ts +1588 -0
- package/src/utils/schema/root-combinator.d.ts +12 -0
- package/src/utils/schema/root-combinator.ts +143 -0
- package/src/utils/schema/spill.d.ts +8 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.d.ts +25 -0
- package/src/utils/schema/stamps.ts +97 -0
- package/src/utils/schema/types.d.ts +4 -0
- package/src/utils/schema/types.ts +11 -0
- package/src/utils/schema/wire.d.ts +54 -0
- package/src/utils/schema/wire.ts +213 -0
- package/src/utils/schema/zod-decontaminate.d.ts +31 -0
- package/src/utils/schema/zod-decontaminate.ts +331 -0
- package/src/utils/sse-debug.d.ts +10 -0
- package/src/utils/sse-debug.ts +289 -0
- package/src/utils/tool-call-healing.d.ts +80 -0
- package/src/utils/tool-call-healing.ts +298 -0
- package/src/utils/tool-choice-capability.d.ts +57 -0
- package/src/utils/tool-choice-capability.ts +633 -0
- package/src/utils/tool-choice.d.ts +50 -0
- package/src/utils/tool-choice.ts +99 -0
- package/src/utils/validation.ts +1080 -0
- package/src/utils.d.ts +117 -0
- package/src/utils.ts +523 -0
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** OpenGateway (by Sionic AI) login flow (API key paste, validated via /v1/models). */
|
|
2
|
+
import { createApiKeyLogin } from "./api-key-login";
|
|
3
|
+
|
|
4
|
+
export const loginOpenGateway = createApiKeyLogin({
|
|
5
|
+
providerLabel: "OpenGateway by Sionic AI",
|
|
6
|
+
authUrl: "https://opengateway.ai/dashboard",
|
|
7
|
+
instructions: "Create or copy your OpenGateway API key",
|
|
8
|
+
promptMessage: "Paste your OpenGateway API key",
|
|
9
|
+
placeholder: "sk-...",
|
|
10
|
+
validation: {
|
|
11
|
+
kind: "models-endpoint",
|
|
12
|
+
provider: "OpenGateway by Sionic AI",
|
|
13
|
+
modelsUrl: "https://apis.opengateway.ai/v1/models",
|
|
14
|
+
},
|
|
15
|
+
});
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** OpenRouter login flow (API key paste against https://openrouter.ai/api/v1). */
|
|
2
|
+
import { createApiKeyLogin } from "./api-key-login";
|
|
3
|
+
|
|
4
|
+
export const loginOpenRouter = createApiKeyLogin({
|
|
5
|
+
providerLabel: "OpenRouter",
|
|
6
|
+
authUrl: "https://openrouter.ai/keys",
|
|
7
|
+
instructions: "Copy your API key from the OpenRouter dashboard",
|
|
8
|
+
promptMessage: "Paste your OpenRouter API key",
|
|
9
|
+
placeholder: "sk-or-v1-...",
|
|
10
|
+
validation: {
|
|
11
|
+
kind: "chat-completions",
|
|
12
|
+
provider: "OpenRouter",
|
|
13
|
+
baseUrl: "https://openrouter.ai/api/v1",
|
|
14
|
+
model: "openrouter/auto",
|
|
15
|
+
},
|
|
16
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Parallel login flow.
|
|
3
|
+
*
|
|
4
|
+
* Parallel uses an API key from the account settings page.
|
|
5
|
+
* This is an API key flow:
|
|
6
|
+
* 1. Open browser to Parallel API key settings
|
|
7
|
+
* 2. User copies API key
|
|
8
|
+
* 3. User pastes key into the CLI/TUI
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { OAuthController } from "./types";
|
|
12
|
+
|
|
13
|
+
const AUTH_URL = "https://platform.parallel.ai/settings?tab=api-keys";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Login to Parallel.
|
|
17
|
+
*
|
|
18
|
+
* Opens browser to the API keys page, prompts the user to paste their API key,
|
|
19
|
+
* and returns the API key directly.
|
|
20
|
+
*/
|
|
21
|
+
export async function loginParallel(options: OAuthController): Promise<string> {
|
|
22
|
+
if (!options.onPrompt) {
|
|
23
|
+
throw new Error("Parallel login requires onPrompt callback");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
options.onAuth?.({
|
|
27
|
+
url: AUTH_URL,
|
|
28
|
+
instructions: "Copy your Parallel API key from the Parallel settings page.",
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const apiKey = await options.onPrompt({
|
|
32
|
+
message: "Paste your Parallel API key",
|
|
33
|
+
placeholder: "sk_...",
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
if (options.signal?.aborted) {
|
|
37
|
+
throw new Error("Login cancelled");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const trimmed = apiKey.trim();
|
|
41
|
+
if (!trimmed) {
|
|
42
|
+
throw new Error("API key is required");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return trimmed;
|
|
46
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Perplexity login and token refresh.
|
|
3
|
+
*
|
|
4
|
+
* Login paths (in priority order):
|
|
5
|
+
* 1. macOS native app: reads JWT from NSUserDefaults (`defaults read ai.perplexity.mac authToken`)
|
|
6
|
+
* 2. HTTP email OTP: `GET /api/auth/csrf` → `POST /api/auth/signin-email` → `POST /api/auth/signin-otp`
|
|
7
|
+
*
|
|
8
|
+
* No browser or manual cookie paste required.
|
|
9
|
+
* Refresh: Socket.IO `refreshJWT` RPC over authenticated WebSocket connection.
|
|
10
|
+
*
|
|
11
|
+
* Protocol: Engine.IO v4 + Socket.IO v4 over WebSocket (bypasses Cloudflare managed challenge).
|
|
12
|
+
* Architecture reverse-engineered from Perplexity macOS app (ai.perplexity.mac).
|
|
13
|
+
*/
|
|
14
|
+
import * as os from "node:os";
|
|
15
|
+
import { $env } from "@vib-rato/utils";
|
|
16
|
+
import { $ } from "bun";
|
|
17
|
+
import type { OAuthController, OAuthCredentials } from "./types";
|
|
18
|
+
|
|
19
|
+
const API_VERSION = "2.18";
|
|
20
|
+
const NATIVE_APP_BUNDLE = "ai.perplexity.mac";
|
|
21
|
+
const APP_USER_AGENT = "Perplexity/641 CFNetwork/1568 Darwin/25.2.0";
|
|
22
|
+
|
|
23
|
+
// ---------------------------------------------------------------------------
|
|
24
|
+
// JWT helpers
|
|
25
|
+
// ---------------------------------------------------------------------------
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Extract expiry from a JWT. Perplexity tokens generally lack an `exp` claim
|
|
29
|
+
* (their sessions are server-side and effectively non-expiring from the client's
|
|
30
|
+
* point of view), so we return a far-future sentinel when no `exp` is present.
|
|
31
|
+
* When `exp` IS present, subtract a 5-minute safety margin.
|
|
32
|
+
*/
|
|
33
|
+
const NEVER_EXPIRES = 8.64e15; // max safe Date value
|
|
34
|
+
function getJwtExpiry(token: string): number {
|
|
35
|
+
try {
|
|
36
|
+
const parts = token.split(".");
|
|
37
|
+
if (parts.length !== 3) return NEVER_EXPIRES;
|
|
38
|
+
const payload = parts[1] ?? "";
|
|
39
|
+
const decoded = JSON.parse(atob(payload.replace(/-/g, "+").replace(/_/g, "/")));
|
|
40
|
+
if (typeof decoded?.exp === "number" && Number.isFinite(decoded.exp)) {
|
|
41
|
+
return decoded.exp * 1000 - 5 * 60_000;
|
|
42
|
+
}
|
|
43
|
+
} catch {
|
|
44
|
+
// Ignore decode errors
|
|
45
|
+
}
|
|
46
|
+
return NEVER_EXPIRES;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Build OAuthCredentials from a Perplexity JWT string. */
|
|
50
|
+
function jwtToCredentials(jwt: string, email?: string): OAuthCredentials {
|
|
51
|
+
return {
|
|
52
|
+
access: jwt,
|
|
53
|
+
refresh: jwt,
|
|
54
|
+
expires: getJwtExpiry(jwt),
|
|
55
|
+
email,
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ---------------------------------------------------------------------------
|
|
60
|
+
// Desktop app extraction
|
|
61
|
+
// ---------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Read the Perplexity JWT from the native macOS Catalyst app's UserDefaults.
|
|
65
|
+
* Tokens are stored in NSUserDefaults (not Keychain), readable by any same-UID process.
|
|
66
|
+
*/
|
|
67
|
+
async function extractFromNativeApp(): Promise<string | null> {
|
|
68
|
+
if (os.platform() !== "darwin") return null;
|
|
69
|
+
|
|
70
|
+
try {
|
|
71
|
+
const result = await $`defaults read ${NATIVE_APP_BUNDLE} authToken`.quiet().nothrow();
|
|
72
|
+
if (result.exitCode !== 0) return null;
|
|
73
|
+
const token = result.text().trim();
|
|
74
|
+
if (!token || token === "(null)") return null;
|
|
75
|
+
return token;
|
|
76
|
+
} catch {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// ---------------------------------------------------------------------------
|
|
82
|
+
// Socket.IO email OTP login
|
|
83
|
+
// ---------------------------------------------------------------------------
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Send email OTP and exchange it for a Perplexity JWT via HTTP endpoints.
|
|
87
|
+
*/
|
|
88
|
+
async function httpEmailLogin(ctrl: OAuthController): Promise<OAuthCredentials> {
|
|
89
|
+
if (!ctrl.onPrompt) {
|
|
90
|
+
throw new Error("Perplexity login requires onPrompt callback");
|
|
91
|
+
}
|
|
92
|
+
const email = await ctrl.onPrompt({
|
|
93
|
+
message: "Enter your Perplexity email address",
|
|
94
|
+
placeholder: "user@example.com",
|
|
95
|
+
});
|
|
96
|
+
const trimmedEmail = email.trim();
|
|
97
|
+
if (!trimmedEmail) throw new Error("Email is required for Perplexity login");
|
|
98
|
+
if (ctrl.signal?.aborted) throw new Error("Login cancelled");
|
|
99
|
+
|
|
100
|
+
ctrl.onProgress?.("Fetching Perplexity CSRF token...");
|
|
101
|
+
const csrfResponse = await fetch("https://www.perplexity.ai/api/auth/csrf", {
|
|
102
|
+
headers: {
|
|
103
|
+
"User-Agent": APP_USER_AGENT,
|
|
104
|
+
"X-App-ApiVersion": API_VERSION,
|
|
105
|
+
},
|
|
106
|
+
signal: ctrl.signal,
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
if (!csrfResponse.ok) {
|
|
110
|
+
throw new Error(`Perplexity CSRF request failed: ${csrfResponse.status}`);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
const csrfData = (await csrfResponse.json()) as { csrfToken?: string };
|
|
114
|
+
if (!csrfData.csrfToken) {
|
|
115
|
+
throw new Error("Perplexity CSRF response missing csrfToken");
|
|
116
|
+
}
|
|
117
|
+
ctrl.onProgress?.("Sending login code to your email...");
|
|
118
|
+
const sendResponse = await fetch("https://www.perplexity.ai/api/auth/signin-email", {
|
|
119
|
+
method: "POST",
|
|
120
|
+
headers: {
|
|
121
|
+
"Content-Type": "application/json",
|
|
122
|
+
"User-Agent": APP_USER_AGENT,
|
|
123
|
+
"X-App-ApiVersion": API_VERSION,
|
|
124
|
+
},
|
|
125
|
+
body: JSON.stringify({
|
|
126
|
+
email: trimmedEmail,
|
|
127
|
+
csrfToken: csrfData.csrfToken,
|
|
128
|
+
}),
|
|
129
|
+
signal: ctrl.signal,
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
if (!sendResponse.ok) {
|
|
133
|
+
const body = await sendResponse.text();
|
|
134
|
+
throw new Error(`Perplexity send login code failed (${sendResponse.status}): ${body}`);
|
|
135
|
+
}
|
|
136
|
+
const otp = await ctrl.onPrompt({
|
|
137
|
+
message: "Enter the code sent to your email",
|
|
138
|
+
placeholder: "123456",
|
|
139
|
+
});
|
|
140
|
+
const trimmedOtp = otp.trim();
|
|
141
|
+
if (!trimmedOtp) throw new Error("OTP code is required");
|
|
142
|
+
if (ctrl.signal?.aborted) throw new Error("Login cancelled");
|
|
143
|
+
ctrl.onProgress?.("Verifying login code...");
|
|
144
|
+
const verifyResponse = await fetch("https://www.perplexity.ai/api/auth/signin-otp", {
|
|
145
|
+
method: "POST",
|
|
146
|
+
headers: {
|
|
147
|
+
"Content-Type": "application/json",
|
|
148
|
+
"User-Agent": APP_USER_AGENT,
|
|
149
|
+
"X-App-ApiVersion": API_VERSION,
|
|
150
|
+
},
|
|
151
|
+
body: JSON.stringify({
|
|
152
|
+
email: trimmedEmail,
|
|
153
|
+
otp: trimmedOtp,
|
|
154
|
+
csrfToken: csrfData.csrfToken,
|
|
155
|
+
}),
|
|
156
|
+
signal: ctrl.signal,
|
|
157
|
+
});
|
|
158
|
+
|
|
159
|
+
const verifyData = (await verifyResponse.json()) as {
|
|
160
|
+
token?: string;
|
|
161
|
+
status?: string;
|
|
162
|
+
error_code?: string;
|
|
163
|
+
text?: string;
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
if (!verifyResponse.ok) {
|
|
167
|
+
const reason = verifyData.text ?? verifyData.error_code ?? verifyData.status ?? "OTP verification failed";
|
|
168
|
+
throw new Error(`Perplexity OTP verification failed: ${reason}`);
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
if (!verifyData.token) {
|
|
172
|
+
throw new Error("Perplexity OTP verification response missing token");
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
return jwtToCredentials(verifyData.token, trimmedEmail);
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// ---------------------------------------------------------------------------
|
|
179
|
+
// Public API
|
|
180
|
+
// ---------------------------------------------------------------------------
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Login to Perplexity.
|
|
184
|
+
*
|
|
185
|
+
* Tries auto-extraction from the desktop app, then runs HTTP email OTP login.
|
|
186
|
+
*
|
|
187
|
+
* No browser/manual token paste fallback is used.
|
|
188
|
+
*/
|
|
189
|
+
/**
|
|
190
|
+
* Whether the operator disabled borrowing a token from the native macOS app.
|
|
191
|
+
*
|
|
192
|
+
* `VIB_AUTH_NO_BORROW` is the documented name; `PI_AUTH_NO_BORROW` is the legacy
|
|
193
|
+
* one that was the only name actually read.
|
|
194
|
+
*/
|
|
195
|
+
function authBorrowDisabled(): boolean {
|
|
196
|
+
return Boolean($env.VIB_AUTH_NO_BORROW || $env.PI_AUTH_NO_BORROW);
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/** Test seam: the resolved native-app borrowing opt-out. */
|
|
200
|
+
export function authBorrowDisabledForTest(): boolean {
|
|
201
|
+
return authBorrowDisabled();
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
export async function loginPerplexity(ctrl: OAuthController): Promise<OAuthCredentials> {
|
|
205
|
+
if (!ctrl.onPrompt) {
|
|
206
|
+
throw new Error("Perplexity login requires onPrompt callback");
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// Path 1: Native macOS app JWT, skipped when the operator opts out.
|
|
210
|
+
//
|
|
211
|
+
// Presence-based on purpose: this is a privacy opt-out, so any set value must
|
|
212
|
+
// disable borrowing. A boolean contract would let `VIB_AUTH_NO_BORROW=0`
|
|
213
|
+
// silently re-enable reading a token out of another application.
|
|
214
|
+
if (!authBorrowDisabled()) {
|
|
215
|
+
ctrl.onProgress?.("Checking for Perplexity desktop app...");
|
|
216
|
+
const nativeJwt = await extractFromNativeApp();
|
|
217
|
+
if (nativeJwt) {
|
|
218
|
+
ctrl.onProgress?.("Found Perplexity JWT from native app");
|
|
219
|
+
return jwtToCredentials(nativeJwt);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// Path 2: HTTP email OTP
|
|
224
|
+
return httpEmailLogin(ctrl);
|
|
225
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate PKCE code verifier and challenge.
|
|
3
|
+
* Uses Web Crypto API for cross-platform compatibility.
|
|
4
|
+
*/
|
|
5
|
+
export async function generatePKCE(): Promise<{ verifier: string; challenge: string }> {
|
|
6
|
+
// Generate random verifier
|
|
7
|
+
const verifierBytes = new Uint8Array(96);
|
|
8
|
+
crypto.getRandomValues(verifierBytes);
|
|
9
|
+
const verifier = Buffer.from(verifierBytes).toString("base64url");
|
|
10
|
+
|
|
11
|
+
// Compute SHA-256 challenge
|
|
12
|
+
const encoder = new TextEncoder();
|
|
13
|
+
const data = encoder.encode(verifier);
|
|
14
|
+
const hashBuffer = await crypto.subtle.digest("SHA-256", data);
|
|
15
|
+
const challenge = Buffer.from(hashBuffer).toString("base64url");
|
|
16
|
+
|
|
17
|
+
return { verifier, challenge };
|
|
18
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qianfan login flow.
|
|
3
|
+
*
|
|
4
|
+
* Qianfan provides an OpenAI-compatible API endpoint.
|
|
5
|
+
* Login is API-key based:
|
|
6
|
+
* 1. Open browser to Qianfan API key console
|
|
7
|
+
* 2. User copies API key
|
|
8
|
+
* 3. User pastes key into CLI prompt
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { validateOpenAICompatibleApiKey } from "./api-key-validation";
|
|
12
|
+
import type { OAuthController } from "./types";
|
|
13
|
+
|
|
14
|
+
const AUTH_URL = "https://console.bce.baidu.com/qianfan/ais/console/apiKey";
|
|
15
|
+
const API_BASE_URL = "https://qianfan.baidubce.com/v2";
|
|
16
|
+
const VALIDATION_MODEL = "deepseek-v3.2";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Login to Qianfan.
|
|
20
|
+
*
|
|
21
|
+
* Opens browser to API key page, prompts user to paste their API key.
|
|
22
|
+
* Returns the API key directly (not OAuthCredentials - this isn't OAuth).
|
|
23
|
+
*/
|
|
24
|
+
export async function loginQianfan(options: OAuthController): Promise<string> {
|
|
25
|
+
if (!options.onPrompt) {
|
|
26
|
+
throw new Error("Qianfan login requires onPrompt callback");
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
options.onAuth?.({
|
|
30
|
+
url: AUTH_URL,
|
|
31
|
+
instructions: "Copy your Qianfan API key from the console",
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
const apiKey = await options.onPrompt({
|
|
35
|
+
message: "Paste your Qianfan API key",
|
|
36
|
+
placeholder: "bce-v3/ALTAK-...",
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
if (options.signal?.aborted) {
|
|
40
|
+
throw new Error("Login cancelled");
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const trimmed = apiKey.trim();
|
|
44
|
+
if (!trimmed) {
|
|
45
|
+
throw new Error("API key is required");
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
options.onProgress?.("Validating API key...");
|
|
49
|
+
await validateOpenAICompatibleApiKey({
|
|
50
|
+
provider: "qianfan",
|
|
51
|
+
apiKey: trimmed,
|
|
52
|
+
baseUrl: API_BASE_URL,
|
|
53
|
+
model: VALIDATION_MODEL,
|
|
54
|
+
signal: options.signal,
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
return trimmed;
|
|
58
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Qwen Portal login flow.
|
|
3
|
+
*
|
|
4
|
+
* Qwen Portal exposes an OpenAI-compatible endpoint at https://portal.qwen.ai/v1
|
|
5
|
+
* and accepts OAuth bearer tokens or API keys.
|
|
6
|
+
*
|
|
7
|
+
* This is a token/API-key flow:
|
|
8
|
+
* 1. Open Qwen Portal
|
|
9
|
+
* 2. Copy either your OAuth token or API key
|
|
10
|
+
* 3. Paste it into the CLI
|
|
11
|
+
*/
|
|
12
|
+
|
|
13
|
+
import { validateOpenAICompatibleApiKey } from "./api-key-validation";
|
|
14
|
+
import type { OAuthController } from "./types";
|
|
15
|
+
|
|
16
|
+
const AUTH_URL = "https://chat.qwen.ai";
|
|
17
|
+
const API_BASE_URL = "https://portal.qwen.ai/v1";
|
|
18
|
+
const VALIDATION_MODEL = "coder-model";
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Login to Qwen Portal.
|
|
22
|
+
*
|
|
23
|
+
* Prompts for either `QWEN_OAUTH_TOKEN` or `QWEN_PORTAL_API_KEY` value.
|
|
24
|
+
* Returns the value directly (stored as api_key credential in auth storage).
|
|
25
|
+
*/
|
|
26
|
+
export async function loginQwenPortal(options: OAuthController): Promise<string> {
|
|
27
|
+
if (!options.onPrompt) {
|
|
28
|
+
throw new Error("Qwen Portal login requires onPrompt callback");
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
options.onAuth?.({
|
|
32
|
+
url: AUTH_URL,
|
|
33
|
+
instructions: "Copy your Qwen OAuth token or API key",
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const token = await options.onPrompt({
|
|
37
|
+
message: "Paste your Qwen OAuth token or API key",
|
|
38
|
+
placeholder: "sk-...",
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
if (options.signal?.aborted) {
|
|
42
|
+
throw new Error("Login cancelled");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const trimmed = token.trim();
|
|
46
|
+
if (!trimmed) {
|
|
47
|
+
throw new Error("Qwen token/API key is required");
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
options.onProgress?.("Validating credentials...");
|
|
51
|
+
await validateOpenAICompatibleApiKey({
|
|
52
|
+
provider: "qwen-portal",
|
|
53
|
+
apiKey: trimmed,
|
|
54
|
+
baseUrl: API_BASE_URL,
|
|
55
|
+
model: VALIDATION_MODEL,
|
|
56
|
+
signal: options.signal,
|
|
57
|
+
});
|
|
58
|
+
|
|
59
|
+
return trimmed;
|
|
60
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SGLang login flow.
|
|
3
|
+
*
|
|
4
|
+
* SGLang is commonly self-hosted with an OpenAI-compatible API at a local base URL.
|
|
5
|
+
* Some deployments require a bearer token, others allow unauthenticated access.
|
|
6
|
+
*
|
|
7
|
+
* This flow stores an API-key-style credential used by `/login` and auth storage.
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import type { OAuthController, OAuthProvider } from "./types";
|
|
11
|
+
|
|
12
|
+
const PROVIDER_ID: OAuthProvider = "sglang";
|
|
13
|
+
const AUTH_URL = "https://docs.sglang.io/docs/advanced_features/server_arguments.html";
|
|
14
|
+
const DEFAULT_LOCAL_BASE_URL = "http://127.0.0.1:30000/v1";
|
|
15
|
+
/**
|
|
16
|
+
* Login to SGLang.
|
|
17
|
+
*
|
|
18
|
+
* Opens SGLang OpenAI-compatible auth docs, prompts for a bearer token,
|
|
19
|
+
* and returns a stored key value. Local no-auth servers need no login.
|
|
20
|
+
*/
|
|
21
|
+
export async function loginSglang(options: OAuthController): Promise<string> {
|
|
22
|
+
if (!options.onPrompt) {
|
|
23
|
+
throw new Error(`${PROVIDER_ID} login requires onPrompt callback`);
|
|
24
|
+
}
|
|
25
|
+
options.onAuth?.({
|
|
26
|
+
url: AUTH_URL,
|
|
27
|
+
instructions: `Paste the API key configured with SGLang's --api-key option. Local no-auth servers at ${DEFAULT_LOCAL_BASE_URL} are discovered automatically and do not need /login.`,
|
|
28
|
+
});
|
|
29
|
+
const apiKey = await options.onPrompt({
|
|
30
|
+
message: "Paste your SGLang API key",
|
|
31
|
+
placeholder: "SGLang API key",
|
|
32
|
+
allowEmpty: false,
|
|
33
|
+
});
|
|
34
|
+
if (options.signal?.aborted) {
|
|
35
|
+
throw new Error("Login cancelled");
|
|
36
|
+
}
|
|
37
|
+
const trimmed = apiKey.trim();
|
|
38
|
+
if (!trimmed) {
|
|
39
|
+
throw new Error("SGLang API key is required; local no-auth servers are discovered automatically");
|
|
40
|
+
}
|
|
41
|
+
return trimmed;
|
|
42
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/** Synthetic login flow (API key paste against https://api.synthetic.new/openai/v1). */
|
|
2
|
+
import { createApiKeyLogin } from "./api-key-login";
|
|
3
|
+
|
|
4
|
+
export const loginSynthetic = createApiKeyLogin({
|
|
5
|
+
providerLabel: "Synthetic",
|
|
6
|
+
authUrl: "https://dev.synthetic.new/docs/api/overview",
|
|
7
|
+
instructions: "Copy your API key from the Synthetic dashboard",
|
|
8
|
+
promptMessage: "Paste your Synthetic API key",
|
|
9
|
+
placeholder: "sk-...",
|
|
10
|
+
validation: {
|
|
11
|
+
kind: "models-endpoint",
|
|
12
|
+
provider: "Synthetic",
|
|
13
|
+
modelsUrl: "https://api.synthetic.new/openai/v1/models",
|
|
14
|
+
},
|
|
15
|
+
});
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tavily login flow.
|
|
3
|
+
*
|
|
4
|
+
* Tavily web search uses an API key from the account settings page.
|
|
5
|
+
* This is an API key flow:
|
|
6
|
+
* 1. Open browser to Tavily settings
|
|
7
|
+
* 2. User copies API key
|
|
8
|
+
* 3. User pastes key into CLI
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { OAuthController } from "./types";
|
|
12
|
+
|
|
13
|
+
const AUTH_URL = "https://app.tavily.com/home";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Login to Tavily.
|
|
17
|
+
*
|
|
18
|
+
* Opens browser to API keys page and prompts user to paste their API key.
|
|
19
|
+
* Returns the API key directly (not OAuthCredentials - this isn't OAuth).
|
|
20
|
+
*/
|
|
21
|
+
export async function loginTavily(options: OAuthController): Promise<string> {
|
|
22
|
+
if (!options.onPrompt) {
|
|
23
|
+
throw new Error("Tavily login requires onPrompt callback");
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
options.onAuth?.({
|
|
27
|
+
url: AUTH_URL,
|
|
28
|
+
instructions: "Copy your Tavily API key from the API Keys page.",
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
const apiKey = await options.onPrompt({
|
|
32
|
+
message: "Paste your Tavily API key",
|
|
33
|
+
placeholder: "tvly-...",
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
if (options.signal?.aborted) {
|
|
37
|
+
throw new Error("Login cancelled");
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
const trimmed = apiKey.trim();
|
|
41
|
+
if (!trimmed) {
|
|
42
|
+
throw new Error("API key is required");
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return trimmed;
|
|
46
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/** Together login flow (API key paste against https://api.together.xyz/v1). */
|
|
2
|
+
import { createApiKeyLogin } from "./api-key-login";
|
|
3
|
+
|
|
4
|
+
export const loginTogether = createApiKeyLogin({
|
|
5
|
+
providerLabel: "Together",
|
|
6
|
+
authUrl: "https://api.together.xyz/settings/api-keys",
|
|
7
|
+
instructions: "Copy your API key from the Together dashboard",
|
|
8
|
+
promptMessage: "Paste your Together API key",
|
|
9
|
+
placeholder: "sk-...",
|
|
10
|
+
validation: {
|
|
11
|
+
kind: "chat-completions",
|
|
12
|
+
provider: "together",
|
|
13
|
+
baseUrl: "https://api.together.xyz/v1",
|
|
14
|
+
model: "moonshotai/Kimi-K2.5",
|
|
15
|
+
},
|
|
16
|
+
});
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
export type OAuthCredentials = {
|
|
2
|
+
refresh: string;
|
|
3
|
+
access: string;
|
|
4
|
+
expires: number;
|
|
5
|
+
enterpriseUrl?: string;
|
|
6
|
+
projectId?: string;
|
|
7
|
+
email?: string;
|
|
8
|
+
accountId?: string;
|
|
9
|
+
};
|
|
10
|
+
export type OAuthProvider = "kiro" | "alibaba-token-plan" | "anthropic" | "bizrouter" | "mara" | "cerebras" | "cloudflare-ai-gateway" | "cursor" | "deepseek" | "deepinfra" | "fireworks" | "firepass" | "fugu" | "github-copilot" | "google-gemini-cli" | "google-antigravity" | "gitlab-duo" | "huggingface" | "kimi-code" | "kilo" | "kagi" | "litellm" | "lm-studio" | "minimax-code" | "minimax-code-cn" | "moonshot" | "nvidia" | "nanogpt" | "ollama" | "ollama-cloud" | "openai-codex" | "openai-codex-device" | "opencode-go" | "opencode-zen" | "commandcode-goat" | "opengateway" | "openrouter" | "parallel" | "perplexity" | "qianfan" | "qwen-portal" | "sglang" | "synthetic" | "tavily" | "together" | "venice" | "vercel-ai-gateway" | "vllm" | "xai" | "glm-zcode" | "xiaomi" | "xiaomi-token-plan-sgp" | "xiaomi-token-plan-ams" | "xiaomi-token-plan-cn" | "zenmux" | "opencodex" | "zai";
|
|
11
|
+
export type OAuthProviderId = OAuthProvider | (string & {});
|
|
12
|
+
export type OAuthPrompt = {
|
|
13
|
+
message: string;
|
|
14
|
+
placeholder?: string;
|
|
15
|
+
allowEmpty?: boolean;
|
|
16
|
+
};
|
|
17
|
+
export type OAuthAuthInfo = {
|
|
18
|
+
url: string;
|
|
19
|
+
instructions?: string;
|
|
20
|
+
};
|
|
21
|
+
export interface OAuthProviderInfo {
|
|
22
|
+
id: OAuthProviderId;
|
|
23
|
+
name: string;
|
|
24
|
+
available: boolean;
|
|
25
|
+
}
|
|
26
|
+
/** Per-login switches that change how the authorization code is delivered. */
|
|
27
|
+
export interface OAuthLoginOptions {
|
|
28
|
+
/**
|
|
29
|
+
* Pair by pasting the authorization code the provider displays instead of
|
|
30
|
+
* waiting on a local loopback callback. Set when the browser completing the
|
|
31
|
+
* login has no network route back to the machine running vib (SSH, remote
|
|
32
|
+
* container, headless host). Providers without a paste-a-code redirect
|
|
33
|
+
* ignore it.
|
|
34
|
+
*/
|
|
35
|
+
manualCode?: boolean;
|
|
36
|
+
}
|
|
37
|
+
export interface OAuthController {
|
|
38
|
+
onAuth?(info: OAuthAuthInfo): void;
|
|
39
|
+
onProgress?(message: string): void;
|
|
40
|
+
onManualCodeInput?(): Promise<string>;
|
|
41
|
+
onPrompt?(prompt: OAuthPrompt): Promise<string>;
|
|
42
|
+
signal?: AbortSignal;
|
|
43
|
+
fetch?: typeof globalThis.fetch;
|
|
44
|
+
}
|
|
45
|
+
export interface OAuthLoginCallbacks extends OAuthController {
|
|
46
|
+
onAuth: (info: OAuthAuthInfo) => void;
|
|
47
|
+
onPrompt: (prompt: OAuthPrompt) => Promise<string>;
|
|
48
|
+
}
|
|
49
|
+
export interface OAuthProviderInterface {
|
|
50
|
+
readonly id: OAuthProviderId;
|
|
51
|
+
readonly name: string;
|
|
52
|
+
readonly sourceId?: string;
|
|
53
|
+
login(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials | string>;
|
|
54
|
+
refreshToken?(credentials: OAuthCredentials): Promise<OAuthCredentials>;
|
|
55
|
+
getApiKey?(credentials: OAuthCredentials): string;
|
|
56
|
+
}
|