@linxiraos/pi-ai 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +5066 -0
- package/README.md +1195 -0
- package/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth/sqlite-credential-store.d.ts +117 -0
- package/dist/types/auth-broker/client.d.ts +93 -0
- package/dist/types/auth-broker/discover.d.ts +39 -0
- package/dist/types/auth-broker/index.d.ts +7 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +136 -0
- package/dist/types/auth-broker/server.d.ts +48 -0
- package/dist/types/auth-broker/snapshot-cache.d.ts +17 -0
- package/dist/types/auth-broker/types.d.ts +152 -0
- package/dist/types/auth-broker/wire-schema-resource.d.ts +53 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +5 -0
- package/dist/types/auth-gateway/http.d.ts +56 -0
- package/dist/types/auth-gateway/index.d.ts +3 -0
- package/dist/types/auth-gateway/server.d.ts +36 -0
- package/dist/types/auth-gateway/types.d.ts +127 -0
- package/dist/types/auth-retry.d.ts +150 -0
- package/dist/types/auth-storage.d.ts +1258 -0
- package/dist/types/dialect/anthropic.d.ts +15 -0
- package/dist/types/dialect/catalog.d.ts +3 -0
- package/dist/types/dialect/coercion.d.ts +23 -0
- package/dist/types/dialect/deepseek.d.ts +14 -0
- package/dist/types/dialect/demotion.d.ts +30 -0
- package/dist/types/dialect/examples.d.ts +18 -0
- package/dist/types/dialect/factory.d.ts +3 -0
- package/dist/types/dialect/fenced-thinking.d.ts +53 -0
- package/dist/types/dialect/gemini.d.ts +17 -0
- package/dist/types/dialect/gemma.d.ts +15 -0
- package/dist/types/dialect/glm.d.ts +9 -0
- package/dist/types/dialect/harmony.d.ts +8 -0
- package/dist/types/dialect/hermes.d.ts +9 -0
- package/dist/types/dialect/history.d.ts +3 -0
- package/dist/types/dialect/index.d.ts +11 -0
- package/dist/types/dialect/inventory.d.ts +9 -0
- package/dist/types/dialect/kimi.d.ts +14 -0
- package/dist/types/dialect/minimax.d.ts +3 -0
- package/dist/types/dialect/owned-stream.d.ts +4 -0
- package/dist/types/dialect/qwen3.d.ts +9 -0
- package/dist/types/dialect/rendering.d.ts +54 -0
- package/dist/types/dialect/thinking.d.ts +6 -0
- package/dist/types/dialect/types.d.ts +68 -0
- package/dist/types/dialect/xml.d.ts +9 -0
- package/dist/types/error/abort.d.ts +14 -0
- package/dist/types/error/auth-classify.d.ts +20 -0
- package/dist/types/error/auth.d.ts +27 -0
- package/dist/types/error/aws.d.ts +27 -0
- package/dist/types/error/classes.d.ts +106 -0
- package/dist/types/error/finalize.d.ts +39 -0
- package/dist/types/error/flags.d.ts +94 -0
- package/dist/types/error/format.d.ts +20 -0
- package/dist/types/error/gateway.d.ts +20 -0
- package/dist/types/error/index.d.ts +14 -0
- package/dist/types/error/oauth.d.ts +43 -0
- package/dist/types/error/provider.d.ts +42 -0
- package/dist/types/error/rate-limit.d.ts +80 -0
- package/dist/types/error/retryable.d.ts +27 -0
- package/dist/types/error/validation.d.ts +32 -0
- package/dist/types/index.d.ts +51 -0
- package/dist/types/provider-details.d.ts +24 -0
- package/dist/types/providers/amazon-bedrock.d.ts +39 -0
- package/dist/types/providers/anthropic-client.d.ts +106 -0
- package/dist/types/providers/anthropic-messages-server-schema.d.ts +937 -0
- package/dist/types/providers/anthropic-messages-server.d.ts +17 -0
- package/dist/types/providers/anthropic-wire.d.ts +345 -0
- package/dist/types/providers/anthropic.d.ts +261 -0
- package/dist/types/providers/aws-credentials.d.ts +48 -0
- package/dist/types/providers/aws-eventstream.d.ts +39 -0
- package/dist/types/providers/aws-sigv4.d.ts +55 -0
- package/dist/types/providers/azure-openai-responses.d.ts +16 -0
- package/dist/types/providers/bedrock-mantle.d.ts +13 -0
- package/dist/types/providers/claude-code-fingerprint.d.ts +19 -0
- package/dist/types/providers/cowork-fetch.d.ts +3 -0
- package/dist/types/providers/cursor/exec-modern.d.ts +98 -0
- package/dist/types/providers/cursor-pi-args.d.ts +105 -0
- package/dist/types/providers/cursor.d.ts +221 -0
- package/dist/types/providers/devin.d.ts +12 -0
- package/dist/types/providers/error-message.d.ts +25 -0
- package/dist/types/providers/github-copilot-headers.d.ts +40 -0
- package/dist/types/providers/gitlab-duo-workflow.d.ts +254 -0
- package/dist/types/providers/gitlab-duo.d.ts +27 -0
- package/dist/types/providers/google-auth.d.ts +24 -0
- package/dist/types/providers/google-gemini-cli.d.ts +120 -0
- package/dist/types/providers/google-shared.d.ts +203 -0
- package/dist/types/providers/google-types.d.ts +155 -0
- package/dist/types/providers/google-vertex.d.ts +7 -0
- package/dist/types/providers/google.d.ts +4 -0
- package/dist/types/providers/grammar.d.ts +1 -0
- package/dist/types/providers/kimi.d.ts +27 -0
- package/dist/types/providers/mock.d.ts +179 -0
- package/dist/types/providers/ollama.d.ts +8 -0
- package/dist/types/providers/openai-anthropic-shim.d.ts +35 -0
- package/dist/types/providers/openai-chat-server-schema.d.ts +1311 -0
- package/dist/types/providers/openai-chat-server.d.ts +16 -0
- package/dist/types/providers/openai-chat-wire.d.ts +669 -0
- package/dist/types/providers/openai-codex/request-transformer.d.ts +109 -0
- package/dist/types/providers/openai-codex/response-handler.d.ts +26 -0
- package/dist/types/providers/openai-codex-responses.d.ts +238 -0
- package/dist/types/providers/openai-completions.d.ts +48 -0
- package/dist/types/providers/openai-reasoning-fallback.d.ts +25 -0
- package/dist/types/providers/openai-responses-server-schema.d.ts +1314 -0
- package/dist/types/providers/openai-responses-server.d.ts +17 -0
- package/dist/types/providers/openai-responses-wire.d.ts +6099 -0
- package/dist/types/providers/openai-responses.d.ts +131 -0
- package/dist/types/providers/openai-shared.d.ts +624 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +69 -0
- package/dist/types/providers/register-builtins.d.ts +37 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +32 -0
- package/dist/types/providers/vision-guard.d.ts +20 -0
- package/dist/types/registry/aiand.d.ts +7 -0
- package/dist/types/registry/aimlapi.d.ts +4 -0
- package/dist/types/registry/alibaba-coding-plan.d.ts +8 -0
- package/dist/types/registry/alibaba-token-plan.d.ts +18 -0
- package/dist/types/registry/amazon-bedrock.d.ts +5 -0
- package/dist/types/registry/anthropic.d.ts +10 -0
- package/dist/types/registry/api-key-login.d.ts +42 -0
- package/dist/types/registry/api-key-validation.d.ts +43 -0
- package/dist/types/registry/aws.d.ts +13 -0
- package/dist/types/registry/azure.d.ts +4 -0
- package/dist/types/registry/baseten.d.ts +7 -0
- package/dist/types/registry/bedrock-mantle.d.ts +22 -0
- package/dist/types/registry/cerebras.d.ts +7 -0
- package/dist/types/registry/cloudflare-ai-gateway.d.ts +13 -0
- package/dist/types/registry/coreweave.d.ts +7 -0
- package/dist/types/registry/cursor.d.ts +7 -0
- package/dist/types/registry/deepseek.d.ts +8 -0
- package/dist/types/registry/derived.d.ts +5 -0
- package/dist/types/registry/devin.d.ts +8 -0
- package/dist/types/registry/exa.d.ts +8 -0
- package/dist/types/registry/firepass.d.ts +16 -0
- package/dist/types/registry/fireworks.d.ts +7 -0
- package/dist/types/registry/github-copilot.d.ts +7 -0
- package/dist/types/registry/gitlab-duo-workflow.d.ts +10 -0
- package/dist/types/registry/gitlab-duo.d.ts +9 -0
- package/dist/types/registry/gmi-cloud.d.ts +7 -0
- package/dist/types/registry/google-antigravity.d.ts +9 -0
- package/dist/types/registry/google-gemini-cli.d.ts +9 -0
- package/dist/types/registry/google-vertex.d.ts +5 -0
- package/dist/types/registry/google.d.ts +4 -0
- package/dist/types/registry/groq.d.ts +4 -0
- package/dist/types/registry/huggingface.d.ts +7 -0
- package/dist/types/registry/index.d.ts +4 -0
- package/dist/types/registry/kagi.d.ts +14 -0
- package/dist/types/registry/kilo.d.ts +7 -0
- package/dist/types/registry/kimi-code.d.ts +7 -0
- package/dist/types/registry/litellm.d.ts +13 -0
- package/dist/types/registry/llama-cpp.d.ts +8 -0
- package/dist/types/registry/lm-studio.d.ts +8 -0
- package/dist/types/registry/meta.d.ts +7 -0
- package/dist/types/registry/minimax-code-cn.d.ts +6 -0
- package/dist/types/registry/minimax-code.d.ts +6 -0
- package/dist/types/registry/minimax.d.ts +4 -0
- package/dist/types/registry/mistral.d.ts +4 -0
- package/dist/types/registry/moonshot.d.ts +7 -0
- package/dist/types/registry/nanogpt.d.ts +7 -0
- package/dist/types/registry/novita.d.ts +6 -0
- package/dist/types/registry/nvidia.d.ts +7 -0
- package/dist/types/registry/oauth/anthropic-constants.d.ts +12 -0
- package/dist/types/registry/oauth/anthropic.d.ts +24 -0
- package/dist/types/registry/oauth/callback-server.d.ts +74 -0
- package/dist/types/registry/oauth/cursor.d.ts +16 -0
- package/dist/types/registry/oauth/device-code.d.ts +25 -0
- package/dist/types/registry/oauth/devin.d.ts +5 -0
- package/dist/types/registry/oauth/github-copilot.d.ts +30 -0
- package/dist/types/registry/oauth/gitlab-duo-workflow.d.ts +6 -0
- package/dist/types/registry/oauth/gitlab-duo.d.ts +3 -0
- package/dist/types/registry/oauth/google-antigravity.d.ts +11 -0
- package/dist/types/registry/oauth/google-gemini-cli.d.ts +22 -0
- package/dist/types/registry/oauth/google-oauth-shared.d.ts +56 -0
- package/dist/types/registry/oauth/index.d.ts +45 -0
- package/dist/types/registry/oauth/kimi.d.ts +21 -0
- package/dist/types/registry/oauth/minimax-code.d.ts +27 -0
- package/dist/types/registry/oauth/openai-codex.d.ts +33 -0
- package/dist/types/registry/oauth/opencode.d.ts +18 -0
- package/dist/types/registry/oauth/perplexity.d.ts +9 -0
- package/dist/types/registry/oauth/pkce.d.ts +8 -0
- package/dist/types/registry/oauth/types.d.ts +87 -0
- package/dist/types/registry/oauth/wafer.d.ts +1 -0
- package/dist/types/registry/oauth/xai-oauth.d.ts +46 -0
- package/dist/types/registry/oauth/xiaomi.d.ts +25 -0
- package/dist/types/registry/oauth/zai.d.ts +25 -0
- package/dist/types/registry/ollama-cloud.d.ts +7 -0
- package/dist/types/registry/ollama.d.ts +12 -0
- package/dist/types/registry/openai-codex-device.d.ts +8 -0
- package/dist/types/registry/openai-codex.d.ts +9 -0
- package/dist/types/registry/openai.d.ts +4 -0
- package/dist/types/registry/opencode-go.d.ts +6 -0
- package/dist/types/registry/opencode-zen.d.ts +6 -0
- package/dist/types/registry/openrouter.d.ts +13 -0
- package/dist/types/registry/parallel.d.ts +14 -0
- package/dist/types/registry/perplexity.d.ts +7 -0
- package/dist/types/registry/qianfan.d.ts +7 -0
- package/dist/types/registry/qwen-portal.d.ts +7 -0
- package/dist/types/registry/registry.d.ts +367 -0
- package/dist/types/registry/sakana.d.ts +7 -0
- package/dist/types/registry/siliconflow-cn.d.ts +7 -0
- package/dist/types/registry/siliconflow.d.ts +7 -0
- package/dist/types/registry/synthetic.d.ts +6 -0
- package/dist/types/registry/tavily.d.ts +14 -0
- package/dist/types/registry/together.d.ts +6 -0
- package/dist/types/registry/types.d.ts +75 -0
- package/dist/types/registry/umans.d.ts +7 -0
- package/dist/types/registry/venice.d.ts +13 -0
- package/dist/types/registry/vercel-ai-gateway.d.ts +7 -0
- package/dist/types/registry/vllm.d.ts +7 -0
- package/dist/types/registry/wafer-serverless.d.ts +6 -0
- package/dist/types/registry/xai-oauth.d.ts +7 -0
- package/dist/types/registry/xai.d.ts +7 -0
- package/dist/types/registry/xiaomi-token-plan-ams.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-cn.d.ts +6 -0
- package/dist/types/registry/xiaomi-token-plan-sgp.d.ts +6 -0
- package/dist/types/registry/xiaomi.d.ts +6 -0
- package/dist/types/registry/zai.d.ts +15 -0
- package/dist/types/registry/zenmux.d.ts +7 -0
- package/dist/types/registry/zhipu-coding-plan.d.ts +7 -0
- package/dist/types/stream.d.ts +46 -0
- package/dist/types/types.d.ts +1064 -0
- package/dist/types/usage/alibaba-token-plan.d.ts +3 -0
- package/dist/types/usage/claude.d.ts +4 -0
- package/dist/types/usage/cursor.d.ts +4 -0
- package/dist/types/usage/gemini.d.ts +2 -0
- package/dist/types/usage/github-copilot.d.ts +7 -0
- package/dist/types/usage/google-antigravity.d.ts +15 -0
- package/dist/types/usage/kimi.d.ts +2 -0
- package/dist/types/usage/minimax-code.d.ts +3 -0
- package/dist/types/usage/ollama.d.ts +5 -0
- package/dist/types/usage/openai-codex-base-url.d.ts +18 -0
- package/dist/types/usage/openai-codex-reset.d.ts +88 -0
- package/dist/types/usage/openai-codex.d.ts +10 -0
- package/dist/types/usage/opencode-go.d.ts +2 -0
- package/dist/types/usage/shared.d.ts +1 -0
- package/dist/types/usage/synthetic.d.ts +2 -0
- package/dist/types/usage/umans.d.ts +2 -0
- package/dist/types/usage/xai-oauth.d.ts +12 -0
- package/dist/types/usage/zai.d.ts +3 -0
- package/dist/types/usage.d.ts +527 -0
- package/dist/types/utils/abort.d.ts +25 -0
- package/dist/types/utils/anthropic-auth.d.ts +35 -0
- package/dist/types/utils/aws-profile.d.ts +17 -0
- package/dist/types/utils/block-symbols.d.ts +62 -0
- package/dist/types/utils/deterministic-id.d.ts +16 -0
- package/dist/types/utils/empty-completion-retry.d.ts +21 -0
- package/dist/types/utils/event-stream.d.ts +39 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/google-validation.d.ts +2 -0
- package/dist/types/utils/harmony-leak.d.ts +135 -0
- package/dist/types/utils/http-inspector.d.ts +49 -0
- package/dist/types/utils/idle-iterator.d.ts +149 -0
- package/dist/types/utils/leaked-thinking-stream.d.ts +33 -0
- package/dist/types/utils/openai-http.d.ts +48 -0
- package/dist/types/utils/openrouter-headers.d.ts +1 -0
- package/dist/types/utils/parse-bind.d.ts +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -0
- package/dist/types/utils/proxy.d.ts +39 -0
- package/dist/types/utils/request-debug.d.ts +29 -0
- package/dist/types/utils/retry-after.d.ts +4 -0
- package/dist/types/utils/retry.d.ts +14 -0
- package/dist/types/utils/schema/adapt.d.ts +24 -0
- package/dist/types/utils/schema/compatibility.d.ts +30 -0
- package/dist/types/utils/schema/dereference.d.ts +11 -0
- package/dist/types/utils/schema/draft.d.ts +10 -0
- package/dist/types/utils/schema/equality.d.ts +4 -0
- package/dist/types/utils/schema/fields.d.ts +54 -0
- package/dist/types/utils/schema/index.d.ts +14 -0
- package/dist/types/utils/schema/json-schema-validator.d.ts +20 -0
- package/dist/types/utils/schema/meta-validator.d.ts +2 -0
- package/dist/types/utils/schema/normalize.d.ts +153 -0
- package/dist/types/utils/schema/spill.d.ts +8 -0
- package/dist/types/utils/schema/stamps.d.ts +17 -0
- package/dist/types/utils/schema/strict-tool-validation.d.ts +16 -0
- package/dist/types/utils/schema/types.d.ts +4 -0
- package/dist/types/utils/schema/typescript.d.ts +24 -0
- package/dist/types/utils/schema/wire.d.ts +52 -0
- package/dist/types/utils/sdk-stream-timeout.d.ts +33 -0
- package/dist/types/utils/sse-debug.d.ts +5 -0
- package/dist/types/utils/stream-markup-healing.d.ts +87 -0
- package/dist/types/utils/thinking-loop.d.ts +102 -0
- package/dist/types/utils/tool-call-loop-guard.d.ts +26 -0
- package/dist/types/utils/tool-choice.d.ts +52 -0
- package/dist/types/utils/validation.d.ts +28 -0
- package/dist/types/utils.d.ts +57 -0
- package/package.json +138 -0
- package/src/api-registry.ts +109 -0
- package/src/auth/sqlite-credential-store.ts +2066 -0
- package/src/auth-broker/client.ts +471 -0
- package/src/auth-broker/discover.ts +310 -0
- package/src/auth-broker/index.ts +7 -0
- package/src/auth-broker/refresher.ts +117 -0
- package/src/auth-broker/remote-store.ts +1332 -0
- package/src/auth-broker/server.ts +898 -0
- package/src/auth-broker/snapshot-cache.ts +200 -0
- package/src/auth-broker/types.ts +193 -0
- package/src/auth-broker/wire-schema-resource.ts +487 -0
- package/src/auth-broker/wire-schemas.ts +43 -0
- package/src/auth-gateway/http.ts +227 -0
- package/src/auth-gateway/index.ts +3 -0
- package/src/auth-gateway/server.ts +836 -0
- package/src/auth-gateway/types.ts +153 -0
- package/src/auth-retry.ts +401 -0
- package/src/auth-storage.ts +6540 -0
- package/src/dialect/anthropic.md +31 -0
- package/src/dialect/anthropic.ts +608 -0
- package/src/dialect/catalog.ts +29 -0
- package/src/dialect/coercion.ts +136 -0
- package/src/dialect/deepseek.md +24 -0
- package/src/dialect/deepseek.ts +609 -0
- package/src/dialect/demotion.ts +40 -0
- package/src/dialect/examples.ts +71 -0
- package/src/dialect/factory.ts +34 -0
- package/src/dialect/fenced-thinking.ts +184 -0
- package/src/dialect/gemini.md +44 -0
- package/src/dialect/gemini.ts +583 -0
- package/src/dialect/gemma.md +33 -0
- package/src/dialect/gemma.ts +387 -0
- package/src/dialect/glm.md +32 -0
- package/src/dialect/glm.ts +579 -0
- package/src/dialect/harmony.md +31 -0
- package/src/dialect/harmony.ts +345 -0
- package/src/dialect/hermes.md +25 -0
- package/src/dialect/hermes.ts +206 -0
- package/src/dialect/history.ts +81 -0
- package/src/dialect/index.ts +15 -0
- package/src/dialect/inventory.ts +30 -0
- package/src/dialect/kimi.md +24 -0
- package/src/dialect/kimi.ts +340 -0
- package/src/dialect/minimax.md +31 -0
- package/src/dialect/minimax.ts +95 -0
- package/src/dialect/owned-stream.ts +481 -0
- package/src/dialect/prompt-template.md +12 -0
- package/src/dialect/qwen3.md +28 -0
- package/src/dialect/qwen3.ts +240 -0
- package/src/dialect/rendering.ts +304 -0
- package/src/dialect/thinking.ts +292 -0
- package/src/dialect/types.ts +56 -0
- package/src/dialect/xml.md +22 -0
- package/src/dialect/xml.ts +90 -0
- package/src/error/abort.ts +18 -0
- package/src/error/auth-classify.ts +47 -0
- package/src/error/auth.ts +48 -0
- package/src/error/aws.ts +35 -0
- package/src/error/classes.ts +281 -0
- package/src/error/finalize.ts +69 -0
- package/src/error/flags.ts +602 -0
- package/src/error/format.ts +45 -0
- package/src/error/gateway.ts +96 -0
- package/src/error/index.ts +14 -0
- package/src/error/oauth.ts +58 -0
- package/src/error/provider.ts +63 -0
- package/src/error/rate-limit.ts +303 -0
- package/src/error/retryable.ts +70 -0
- package/src/error/validation.ts +44 -0
- package/src/index.ts +51 -0
- package/src/provider-details.ts +90 -0
- package/src/providers/amazon-bedrock.ts +1064 -0
- package/src/providers/anthropic-client.ts +317 -0
- package/src/providers/anthropic-messages-server-schema.ts +252 -0
- package/src/providers/anthropic-messages-server.ts +818 -0
- package/src/providers/anthropic-wire.ts +359 -0
- package/src/providers/anthropic.ts +4539 -0
- package/src/providers/aws-credentials.ts +772 -0
- package/src/providers/aws-eventstream.ts +181 -0
- package/src/providers/aws-sigv4.ts +218 -0
- package/src/providers/azure-openai-responses.ts +438 -0
- package/src/providers/bedrock-mantle.ts +110 -0
- package/src/providers/claude-code-fingerprint.ts +20 -0
- package/src/providers/cowork-fetch.ts +201 -0
- package/src/providers/cursor/exec-modern.ts +496 -0
- package/src/providers/cursor/proto/agent.proto +4533 -0
- package/src/providers/cursor/proto/buf.gen.yaml +6 -0
- package/src/providers/cursor/proto/buf.yaml +17 -0
- package/src/providers/cursor-pi-args.ts +165 -0
- package/src/providers/cursor.ts +4689 -0
- package/src/providers/devin/proto/buf/validate/validate.proto +468 -0
- package/src/providers/devin/proto/buf.gen.yaml +33 -0
- package/src/providers/devin/proto/buf.yaml +17 -0
- package/src/providers/devin/proto/cel/expr/checked.proto +103 -0
- package/src/providers/devin/proto/cel/expr/eval.proto +38 -0
- package/src/providers/devin/proto/cel/expr/explain.proto +15 -0
- package/src/providers/devin/proto/cel/expr/syntax.proto +113 -0
- package/src/providers/devin/proto/cel/expr/value.proto +41 -0
- package/src/providers/devin/proto/connectext/grpc/status/v1/status.proto +11 -0
- package/src/providers/devin/proto/errorspb/errors.proto +56 -0
- package/src/providers/devin/proto/errorspb/hintdetail.proto +7 -0
- package/src/providers/devin/proto/errorspb/markers.proto +10 -0
- package/src/providers/devin/proto/errorspb/tags.proto +12 -0
- package/src/providers/devin/proto/errorspb/testing.proto +6 -0
- package/src/providers/devin/proto/exa/analytics_pb/analytics.proto +188 -0
- package/src/providers/devin/proto/exa/api_server_pb/api_server.proto +2461 -0
- package/src/providers/devin/proto/exa/auth_pb/auth.proto +19 -0
- package/src/providers/devin/proto/exa/auto_cascade_common_pb/auto_cascade_common.proto +79 -0
- package/src/providers/devin/proto/exa/browser_preview_pb/browser_preview.proto +32 -0
- package/src/providers/devin/proto/exa/bug_checker_pb/bug_checker.proto +22 -0
- package/src/providers/devin/proto/exa/cascade_plugins_pb/cascade_plugins.proto +262 -0
- package/src/providers/devin/proto/exa/chat_client_server_pb/chat_client_server.proto +57 -0
- package/src/providers/devin/proto/exa/chat_pb/chat.proto +449 -0
- package/src/providers/devin/proto/exa/code_edit/code_edit_pb/code_edit.proto +186 -0
- package/src/providers/devin/proto/exa/codeium_common_pb/codeium_common.proto +4157 -0
- package/src/providers/devin/proto/exa/context_module_pb/context_module.proto +175 -0
- package/src/providers/devin/proto/exa/cortex_pb/cortex.proto +3268 -0
- package/src/providers/devin/proto/exa/dev_pb/dev.proto +26 -0
- package/src/providers/devin/proto/exa/diff_action_pb/diff_action.proto +75 -0
- package/src/providers/devin/proto/exa/eval/pr_eval/datasets_pb/datasets.proto +103 -0
- package/src/providers/devin/proto/exa/eval_pb/eval.proto +1315 -0
- package/src/providers/devin/proto/exa/extension_server_pb/extension_server.proto +556 -0
- package/src/providers/devin/proto/exa/file_system_provider_pb/file_system_provider.proto +75 -0
- package/src/providers/devin/proto/exa/index_pb/index.proto +461 -0
- package/src/providers/devin/proto/exa/knowledge_base_pb/knowledge_base.proto +144 -0
- package/src/providers/devin/proto/exa/language_server_pb/language_server.proto +2385 -0
- package/src/providers/devin/proto/exa/model_management_pb/model_management.proto +186 -0
- package/src/providers/devin/proto/exa/opensearch_clients_pb/opensearch_clients.proto +503 -0
- package/src/providers/devin/proto/exa/product_analytics_pb/product_analytics.proto +37 -0
- package/src/providers/devin/proto/exa/prompt_pb/prompt.proto +92 -0
- package/src/providers/devin/proto/exa/reactive_component_pb/reactive_component.proto +96 -0
- package/src/providers/devin/proto/exa/seat_management_pb/seat_management.proto +2680 -0
- package/src/providers/devin/proto/exa/tokenizer_pb/tokenizer.proto +37 -0
- package/src/providers/devin/proto/exa/trainer_pb/config.proto +647 -0
- package/src/providers/devin/proto/exa/tree_sitter/language_data_pb/language_data.proto +14 -0
- package/src/providers/devin/proto/exa/trust_pb/trust.proto +157 -0
- package/src/providers/devin/proto/exa/user_analytics_pb/user_analytics.proto +519 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/base/api_base.proto +28 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/datastore/datastore_v3.proto +484 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/log/log_service.proto +136 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/remote_api/remote_api.proto +42 -0
- package/src/providers/devin/proto/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +61 -0
- package/src/providers/devin/proto/grpc/binlog/v1/binarylog.proto +84 -0
- package/src/providers/devin/proto/io/prometheus/client/metrics.proto +98 -0
- package/src/providers/devin.ts +679 -0
- package/src/providers/error-message.ts +23 -0
- package/src/providers/github-copilot-headers.ts +141 -0
- package/src/providers/gitlab-duo-workflow-chatml-note.md +1 -0
- package/src/providers/gitlab-duo-workflow.ts +3135 -0
- package/src/providers/gitlab-duo.ts +399 -0
- package/src/providers/google-auth.ts +330 -0
- package/src/providers/google-gemini-cli.ts +1370 -0
- package/src/providers/google-shared.ts +1122 -0
- package/src/providers/google-types.ts +180 -0
- package/src/providers/google-vertex.ts +135 -0
- package/src/providers/google.ts +47 -0
- package/src/providers/grammar.ts +70 -0
- package/src/providers/kimi.ts +51 -0
- package/src/providers/mock.ts +514 -0
- package/src/providers/ollama.ts +776 -0
- package/src/providers/openai-anthropic-shim.ts +166 -0
- package/src/providers/openai-chat-server-schema.ts +243 -0
- package/src/providers/openai-chat-server.ts +752 -0
- package/src/providers/openai-chat-wire.ts +859 -0
- package/src/providers/openai-codex/request-transformer.ts +491 -0
- package/src/providers/openai-codex/response-handler.ts +102 -0
- package/src/providers/openai-codex-responses.ts +4716 -0
- package/src/providers/openai-completions.ts +2389 -0
- package/src/providers/openai-reasoning-fallback.ts +269 -0
- package/src/providers/openai-responses-server-schema.ts +397 -0
- package/src/providers/openai-responses-server.ts +1466 -0
- package/src/providers/openai-responses-wire.ts +6416 -0
- package/src/providers/openai-responses.ts +1393 -0
- package/src/providers/openai-shared.ts +3500 -0
- package/src/providers/pi-native-client.ts +275 -0
- package/src/providers/pi-native-server.ts +245 -0
- package/src/providers/register-builtins.ts +503 -0
- package/src/providers/synthetic.ts +50 -0
- package/src/providers/transform-messages.ts +1083 -0
- package/src/providers/vision-guard.ts +54 -0
- package/src/registry/aiand.ts +22 -0
- package/src/registry/aimlapi.ts +6 -0
- package/src/registry/alibaba-coding-plan.ts +104 -0
- package/src/registry/alibaba-token-plan.ts +125 -0
- package/src/registry/amazon-bedrock.ts +22 -0
- package/src/registry/anthropic.ts +26 -0
- package/src/registry/api-key-login.ts +115 -0
- package/src/registry/api-key-validation.ts +145 -0
- package/src/registry/aws.ts +57 -0
- package/src/registry/azure.ts +6 -0
- package/src/registry/baseten.ts +22 -0
- package/src/registry/bedrock-mantle.ts +34 -0
- package/src/registry/cerebras.ts +23 -0
- package/src/registry/cloudflare-ai-gateway.ts +45 -0
- package/src/registry/coreweave.ts +40 -0
- package/src/registry/cursor.ts +20 -0
- package/src/registry/deepseek.ts +46 -0
- package/src/registry/derived.ts +9 -0
- package/src/registry/devin.ts +15 -0
- package/src/registry/exa.ts +19 -0
- package/src/registry/firepass.ts +32 -0
- package/src/registry/fireworks.ts +28 -0
- package/src/registry/github-copilot.ts +22 -0
- package/src/registry/gitlab-duo-workflow.ts +20 -0
- package/src/registry/gitlab-duo.ts +19 -0
- package/src/registry/gmi-cloud.ts +22 -0
- package/src/registry/google-antigravity.ts +22 -0
- package/src/registry/google-gemini-cli.ts +22 -0
- package/src/registry/google-vertex.ts +38 -0
- package/src/registry/google.ts +6 -0
- package/src/registry/groq.ts +6 -0
- package/src/registry/huggingface.ts +29 -0
- package/src/registry/index.ts +4 -0
- package/src/registry/kagi.ts +46 -0
- package/src/registry/kilo.ts +114 -0
- package/src/registry/kimi-code.ts +17 -0
- package/src/registry/litellm.ts +45 -0
- package/src/registry/llama-cpp.ts +35 -0
- package/src/registry/lm-studio.ts +31 -0
- package/src/registry/meta.ts +22 -0
- package/src/registry/minimax-code-cn.ts +12 -0
- package/src/registry/minimax-code.ts +12 -0
- package/src/registry/minimax.ts +6 -0
- package/src/registry/mistral.ts +6 -0
- package/src/registry/moonshot.ts +28 -0
- package/src/registry/nanogpt.ts +22 -0
- package/src/registry/novita.ts +25 -0
- package/src/registry/nvidia.ts +61 -0
- package/src/registry/oauth/anthropic-constants.ts +12 -0
- package/src/registry/oauth/anthropic.ts +346 -0
- package/src/registry/oauth/callback-server.ts +438 -0
- package/src/registry/oauth/cursor.ts +187 -0
- package/src/registry/oauth/device-code.ts +92 -0
- package/src/registry/oauth/devin.ts +124 -0
- package/src/registry/oauth/github-copilot.ts +369 -0
- package/src/registry/oauth/gitlab-duo-workflow.ts +146 -0
- package/src/registry/oauth/gitlab-duo.ts +222 -0
- package/src/registry/oauth/google-antigravity.ts +225 -0
- package/src/registry/oauth/google-gemini-cli.ts +297 -0
- package/src/registry/oauth/google-oauth-shared.ts +211 -0
- package/src/registry/oauth/index.ts +187 -0
- package/src/registry/oauth/kimi.ts +297 -0
- package/src/registry/oauth/minimax-code.ts +53 -0
- package/src/registry/oauth/oauth.html +317 -0
- package/src/registry/oauth/openai-codex.ts +384 -0
- package/src/registry/oauth/opencode.ts +50 -0
- package/src/registry/oauth/perplexity.ts +228 -0
- package/src/registry/oauth/pkce.ts +18 -0
- package/src/registry/oauth/types.ts +96 -0
- package/src/registry/oauth/wafer.ts +24 -0
- package/src/registry/oauth/xai-oauth.ts +559 -0
- package/src/registry/oauth/xiaomi.ts +211 -0
- package/src/registry/oauth/zai.ts +285 -0
- package/src/registry/ollama-cloud.ts +36 -0
- package/src/registry/ollama.ts +43 -0
- package/src/registry/openai-codex-device.ts +18 -0
- package/src/registry/openai-codex.ts +19 -0
- package/src/registry/openai.ts +6 -0
- package/src/registry/opencode-go.ts +12 -0
- package/src/registry/opencode-zen.ts +12 -0
- package/src/registry/openrouter.ts +28 -0
- package/src/registry/parallel.ts +45 -0
- package/src/registry/perplexity.ts +13 -0
- package/src/registry/qianfan.ts +27 -0
- package/src/registry/qwen-portal.ts +50 -0
- package/src/registry/registry.ts +182 -0
- package/src/registry/sakana.ts +22 -0
- package/src/registry/siliconflow-cn.ts +22 -0
- package/src/registry/siliconflow.ts +22 -0
- package/src/registry/synthetic.ts +21 -0
- package/src/registry/tavily.ts +45 -0
- package/src/registry/together.ts +22 -0
- package/src/registry/types.ts +86 -0
- package/src/registry/umans.ts +23 -0
- package/src/registry/venice.ts +33 -0
- package/src/registry/vercel-ai-gateway.ts +38 -0
- package/src/registry/vllm.ts +34 -0
- package/src/registry/wafer-serverless.ts +12 -0
- package/src/registry/xai-oauth.ts +17 -0
- package/src/registry/xai.ts +22 -0
- package/src/registry/xiaomi-token-plan-ams.ts +12 -0
- package/src/registry/xiaomi-token-plan-cn.ts +12 -0
- package/src/registry/xiaomi-token-plan-sgp.ts +12 -0
- package/src/registry/xiaomi.ts +12 -0
- package/src/registry/zai.ts +41 -0
- package/src/registry/zenmux.ts +22 -0
- package/src/registry/zhipu-coding-plan.ts +27 -0
- package/src/stream.ts +1944 -0
- package/src/types.ts +1243 -0
- package/src/usage/alibaba-token-plan.ts +230 -0
- package/src/usage/claude.ts +830 -0
- package/src/usage/cursor.ts +335 -0
- package/src/usage/gemini.ts +258 -0
- package/src/usage/github-copilot.ts +424 -0
- package/src/usage/google-antigravity.ts +497 -0
- package/src/usage/kimi.ts +277 -0
- package/src/usage/minimax-code.ts +291 -0
- package/src/usage/ollama.ts +41 -0
- package/src/usage/openai-codex-base-url.ts +35 -0
- package/src/usage/openai-codex-reset.ts +205 -0
- package/src/usage/openai-codex.ts +627 -0
- package/src/usage/opencode-go.ts +89 -0
- package/src/usage/shared.ts +10 -0
- package/src/usage/synthetic.ts +180 -0
- package/src/usage/umans.ts +192 -0
- package/src/usage/xai-oauth.ts +414 -0
- package/src/usage/zai.ts +370 -0
- package/src/usage.ts +411 -0
- package/src/utils/abort.ts +67 -0
- package/src/utils/anthropic-auth.ts +93 -0
- package/src/utils/aws-profile.ts +88 -0
- package/src/utils/block-symbols.ts +78 -0
- package/src/utils/deterministic-id.ts +20 -0
- package/src/utils/empty-completion-retry.ts +161 -0
- package/src/utils/event-stream.ts +202 -0
- package/src/utils/foundry.ts +8 -0
- package/src/utils/google-validation.ts +25 -0
- package/src/utils/harmony-leak.ts +500 -0
- package/src/utils/http-inspector.ts +196 -0
- package/src/utils/idle-iterator.ts +531 -0
- package/src/utils/leaked-thinking-stream.ts +483 -0
- package/src/utils/openai-http.ts +119 -0
- package/src/utils/openrouter-headers.ts +12 -0
- package/src/utils/parse-bind.ts +56 -0
- package/src/utils/provider-response.ts +30 -0
- package/src/utils/proxy.ts +314 -0
- package/src/utils/request-debug.ts +351 -0
- package/src/utils/retry-after.ts +121 -0
- package/src/utils/retry.ts +77 -0
- package/src/utils/schema/CONSTRAINTS.md +168 -0
- package/src/utils/schema/adapt.ts +36 -0
- package/src/utils/schema/compatibility.ts +435 -0
- package/src/utils/schema/dereference.ts +98 -0
- package/src/utils/schema/draft.ts +341 -0
- package/src/utils/schema/equality.ts +97 -0
- package/src/utils/schema/fields.ts +210 -0
- package/src/utils/schema/index.ts +14 -0
- package/src/utils/schema/json-schema-validator.ts +595 -0
- package/src/utils/schema/meta-validator.ts +167 -0
- package/src/utils/schema/normalize.ts +2314 -0
- package/src/utils/schema/spill.ts +43 -0
- package/src/utils/schema/stamps.ts +109 -0
- package/src/utils/schema/strict-tool-validation.ts +117 -0
- package/src/utils/schema/types.ts +10 -0
- package/src/utils/schema/typescript.ts +212 -0
- package/src/utils/schema/wire.ts +662 -0
- package/src/utils/sdk-stream-timeout.ts +43 -0
- package/src/utils/sse-debug.ts +18 -0
- package/src/utils/stream-markup-healing.ts +247 -0
- package/src/utils/thinking-loop.ts +552 -0
- package/src/utils/tool-call-loop-guard.ts +107 -0
- package/src/utils/tool-choice.ts +101 -0
- package/src/utils/validation.ts +1932 -0
- package/src/utils.ts +492 -0
|
@@ -0,0 +1,310 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Broker-aware auth-storage discovery used by both the coding-agent runtime and
|
|
3
|
+
* the catalog model generator. Keeps the precedence logic (env → config.yml/config.yaml →
|
|
4
|
+
* token file → local SQLite) in one place so build-time tooling sees the same
|
|
5
|
+
* credentials as the TUI.
|
|
6
|
+
*/
|
|
7
|
+
import * as path from "node:path";
|
|
8
|
+
import {
|
|
9
|
+
$envExact,
|
|
10
|
+
getAgentDbPath,
|
|
11
|
+
getAgentDir,
|
|
12
|
+
getAuthBrokerSnapshotCachePath,
|
|
13
|
+
getConfigRootDir,
|
|
14
|
+
isEnoent,
|
|
15
|
+
logger,
|
|
16
|
+
MAIN_CONFIG_FILENAMES,
|
|
17
|
+
} from "@linxiraos/pi-utils";
|
|
18
|
+
import { YAML } from "bun";
|
|
19
|
+
import { AuthStorage } from "../auth-storage";
|
|
20
|
+
import * as AIError from "../error";
|
|
21
|
+
import { AuthBrokerClient, AuthBrokerError } from "./client";
|
|
22
|
+
import { type AuthBrokerAccountPool, RemoteAuthCredentialStore } from "./remote-store";
|
|
23
|
+
import { readAuthBrokerSnapshotCache, writeAuthBrokerSnapshotCache } from "./snapshot-cache";
|
|
24
|
+
import { DEFAULT_SNAPSHOT_CACHE_TTL_MS, type SnapshotResponse } from "./types";
|
|
25
|
+
|
|
26
|
+
export interface AuthBrokerClientConfig {
|
|
27
|
+
url: string;
|
|
28
|
+
token: string;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface ResolveAuthBrokerConfigOptions {
|
|
32
|
+
agentDir?: string;
|
|
33
|
+
configValueResolver?: (config: string) => Promise<string | undefined>;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export interface DiscoverAuthStorageOptions {
|
|
37
|
+
agentDir?: string;
|
|
38
|
+
configValueResolver?: (config: string) => Promise<string | undefined>;
|
|
39
|
+
cachePath?: string;
|
|
40
|
+
sourceLabel?: string;
|
|
41
|
+
/** Programmatic pool for SDK hosts. Takes precedence over the environment file. */
|
|
42
|
+
accountPool?: AuthBrokerAccountPool;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const SNAPSHOT_CACHE_REVALIDATION_TIMEOUT_MS = 500;
|
|
46
|
+
|
|
47
|
+
/** Path to the local bearer token file. Created by `omp auth-broker token`. */
|
|
48
|
+
export function getAuthBrokerTokenFilePath(): string {
|
|
49
|
+
return path.join(getConfigRootDir(), "auth-broker.token");
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Default resolver for config values: checks `process.env` first, then treats
|
|
54
|
+
* the value as a literal. Does NOT execute `!command` syntax; such values are
|
|
55
|
+
* left unresolved so the caller can fall back to the token file.
|
|
56
|
+
*/
|
|
57
|
+
async function defaultResolveConfigValue(config: string): Promise<string | undefined> {
|
|
58
|
+
if (config.startsWith("!")) return undefined;
|
|
59
|
+
const envValue = $envExact(config);
|
|
60
|
+
return envValue || config;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function readTokenFile(): Promise<string | null> {
|
|
64
|
+
try {
|
|
65
|
+
const raw = await Bun.file(getAuthBrokerTokenFilePath()).text();
|
|
66
|
+
const trimmed = raw.trim();
|
|
67
|
+
return trimmed.length > 0 ? trimmed : null;
|
|
68
|
+
} catch (err) {
|
|
69
|
+
if (isEnoent(err)) return null;
|
|
70
|
+
logger.warn("auth-broker token file unreadable", { error: String(err) });
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
interface ConfigSnapshot {
|
|
76
|
+
url?: string;
|
|
77
|
+
token?: string;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Resolve a dotted config key (e.g. `auth.broker.url`) against a parsed YAML
|
|
82
|
+
* record, accepting both nested form (`auth: { broker: { url } }`) and the
|
|
83
|
+
* legacy flat literal-dot key (`"auth.broker.url": ...`). Nested wins when both
|
|
84
|
+
* are present. Returns the value only when it is a string.
|
|
85
|
+
*/
|
|
86
|
+
function readDottedString(record: Record<string, unknown>, dottedKey: string): string | undefined {
|
|
87
|
+
let current: unknown = record;
|
|
88
|
+
for (const segment of dottedKey.split(".")) {
|
|
89
|
+
if (current === null || typeof current !== "object" || Array.isArray(current)) {
|
|
90
|
+
current = undefined;
|
|
91
|
+
break;
|
|
92
|
+
}
|
|
93
|
+
current = (current as Record<string, unknown>)[segment];
|
|
94
|
+
}
|
|
95
|
+
if (typeof current === "string") return current;
|
|
96
|
+
const flat = record[dottedKey];
|
|
97
|
+
return typeof flat === "string" ? flat : undefined;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
async function readConfigYaml(agentDir: string): Promise<ConfigSnapshot> {
|
|
101
|
+
for (const filename of MAIN_CONFIG_FILENAMES) {
|
|
102
|
+
const configPath = path.join(agentDir, filename);
|
|
103
|
+
try {
|
|
104
|
+
const raw = await Bun.file(configPath).text();
|
|
105
|
+
const parsed = YAML.parse(raw);
|
|
106
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return {};
|
|
107
|
+
const record = parsed as Record<string, unknown>;
|
|
108
|
+
const url = readDottedString(record, "auth.broker.url");
|
|
109
|
+
const token = readDottedString(record, "auth.broker.token");
|
|
110
|
+
return { url, token };
|
|
111
|
+
} catch (err) {
|
|
112
|
+
if (isEnoent(err)) continue;
|
|
113
|
+
logger.warn("auth-broker config unreadable", { path: configPath, error: String(err) });
|
|
114
|
+
return {};
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
return {};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
export async function loadAuthBrokerAccountPool(): Promise<AuthBrokerAccountPool | undefined> {
|
|
121
|
+
const filePath = process.env.OMP_AUTH_BROKER_ACCOUNT_POOL_FILE?.trim();
|
|
122
|
+
if (!filePath) return undefined;
|
|
123
|
+
|
|
124
|
+
let parsed: unknown;
|
|
125
|
+
try {
|
|
126
|
+
parsed = await Bun.file(filePath).json();
|
|
127
|
+
} catch (error) {
|
|
128
|
+
throw new AIError.ConfigurationError(`Unable to read OMP_AUTH_BROKER_ACCOUNT_POOL_FILE at ${filePath}`, {
|
|
129
|
+
cause: error,
|
|
130
|
+
});
|
|
131
|
+
}
|
|
132
|
+
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
133
|
+
throw new AIError.ConfigurationError("OMP_AUTH_BROKER_ACCOUNT_POOL_FILE must contain a JSON object");
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
const accountPool = new Map<string, ReadonlySet<string>>();
|
|
137
|
+
for (const [provider, value] of Object.entries(parsed)) {
|
|
138
|
+
const normalizedProvider = provider.trim();
|
|
139
|
+
if (normalizedProvider.length === 0) {
|
|
140
|
+
throw new AIError.ConfigurationError("OMP_AUTH_BROKER_ACCOUNT_POOL_FILE contains an empty provider id");
|
|
141
|
+
}
|
|
142
|
+
if (provider !== normalizedProvider) {
|
|
143
|
+
throw new AIError.ConfigurationError(
|
|
144
|
+
"OMP_AUTH_BROKER_ACCOUNT_POOL_FILE contains a provider id with surrounding whitespace",
|
|
145
|
+
);
|
|
146
|
+
}
|
|
147
|
+
if (!Array.isArray(value)) {
|
|
148
|
+
throw new AIError.ConfigurationError(
|
|
149
|
+
`OMP_AUTH_BROKER_ACCOUNT_POOL_FILE entry for ${provider} must be an array of identity keys`,
|
|
150
|
+
);
|
|
151
|
+
}
|
|
152
|
+
const identities = new Set<string>();
|
|
153
|
+
for (const identity of value) {
|
|
154
|
+
if (typeof identity !== "string" || identity.length === 0) {
|
|
155
|
+
throw new AIError.ConfigurationError(
|
|
156
|
+
`OMP_AUTH_BROKER_ACCOUNT_POOL_FILE entry for ${provider} contains an invalid identity key`,
|
|
157
|
+
);
|
|
158
|
+
}
|
|
159
|
+
if (identity !== identity.trim()) {
|
|
160
|
+
throw new AIError.ConfigurationError(
|
|
161
|
+
`OMP_AUTH_BROKER_ACCOUNT_POOL_FILE entry for ${provider} contains an identity key with surrounding whitespace`,
|
|
162
|
+
);
|
|
163
|
+
}
|
|
164
|
+
identities.add(identity);
|
|
165
|
+
}
|
|
166
|
+
accountPool.set(provider, identities);
|
|
167
|
+
}
|
|
168
|
+
return accountPool;
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
function resolveSnapshotTtlMs(): number {
|
|
172
|
+
const raw = process.env.OMP_AUTH_BROKER_SNAPSHOT_TTL_MS;
|
|
173
|
+
if (raw === undefined) return DEFAULT_SNAPSHOT_CACHE_TTL_MS;
|
|
174
|
+
const value = raw.trim();
|
|
175
|
+
if (value === "") return DEFAULT_SNAPSHOT_CACHE_TTL_MS;
|
|
176
|
+
const ttlMs = Number(value);
|
|
177
|
+
if (Number.isFinite(ttlMs) && ttlMs >= 0) return ttlMs;
|
|
178
|
+
logger.warn("Invalid OMP_AUTH_BROKER_SNAPSHOT_TTL_MS; using default", { value: raw });
|
|
179
|
+
return DEFAULT_SNAPSHOT_CACHE_TTL_MS;
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
/**
|
|
183
|
+
* Resolve broker connection configuration using the same precedence as the TUI:
|
|
184
|
+
*
|
|
185
|
+
* 1. `OMP_AUTH_BROKER_URL` / `OMP_AUTH_BROKER_TOKEN` env vars.
|
|
186
|
+
* 2. `auth.broker.url` / `auth.broker.token` in `<agentDir>/config.yml` or `<agentDir>/config.yaml`.
|
|
187
|
+
* 3. `<config-root>/auth-broker.token` file (paired with a URL from env/config).
|
|
188
|
+
*
|
|
189
|
+
* Returns `null` when no broker URL is configured — callers should fall back to
|
|
190
|
+
* the local SQLite store. Throws when a URL is configured but no token is
|
|
191
|
+
* available, matching the TUI behavior.
|
|
192
|
+
*/
|
|
193
|
+
export async function resolveAuthBrokerConfig(
|
|
194
|
+
options: ResolveAuthBrokerConfigOptions = {},
|
|
195
|
+
): Promise<AuthBrokerClientConfig | null> {
|
|
196
|
+
const agentDir = options.agentDir ?? getAgentDir();
|
|
197
|
+
const resolveConfig = options.configValueResolver ?? defaultResolveConfigValue;
|
|
198
|
+
|
|
199
|
+
const envUrl = process.env.OMP_AUTH_BROKER_URL;
|
|
200
|
+
const envToken = process.env.OMP_AUTH_BROKER_TOKEN;
|
|
201
|
+
|
|
202
|
+
let url = envUrl && envUrl.length > 0 ? envUrl : undefined;
|
|
203
|
+
let configToken: string | undefined;
|
|
204
|
+
if (!url || !envToken) {
|
|
205
|
+
const fromConfig = await readConfigYaml(agentDir);
|
|
206
|
+
if (!url && fromConfig.url) {
|
|
207
|
+
const resolved = await resolveConfig(fromConfig.url);
|
|
208
|
+
if (resolved && resolved.length > 0) url = resolved;
|
|
209
|
+
}
|
|
210
|
+
if (fromConfig.token) {
|
|
211
|
+
const resolved = await resolveConfig(fromConfig.token);
|
|
212
|
+
if (resolved && resolved.length > 0) configToken = resolved;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
if (!url) return null;
|
|
216
|
+
|
|
217
|
+
const token =
|
|
218
|
+
(envToken && envToken.length > 0 ? envToken : undefined) ?? configToken ?? (await readTokenFile()) ?? undefined;
|
|
219
|
+
if (!token) {
|
|
220
|
+
throw new AIError.MissingApiKeyError(
|
|
221
|
+
undefined,
|
|
222
|
+
`OMP_AUTH_BROKER_URL is set (${url}) but no bearer token is available. ` +
|
|
223
|
+
`Set OMP_AUTH_BROKER_TOKEN, the \`auth.broker.token\` config entry, or place one at ${getAuthBrokerTokenFilePath()}.`,
|
|
224
|
+
);
|
|
225
|
+
}
|
|
226
|
+
return { url, token };
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Create an AuthStorage instance, using the broker when configured and falling
|
|
231
|
+
* back to the local SQLite store otherwise. This is the single source of truth
|
|
232
|
+
* for the TUI and the catalog generator.
|
|
233
|
+
*/
|
|
234
|
+
export async function discoverAuthStorage(options: DiscoverAuthStorageOptions = {}): Promise<AuthStorage> {
|
|
235
|
+
const agentDir = options.agentDir ?? getAgentDir();
|
|
236
|
+
const brokerConfig = await resolveAuthBrokerConfig({
|
|
237
|
+
agentDir,
|
|
238
|
+
configValueResolver: options.configValueResolver,
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
if (brokerConfig) {
|
|
242
|
+
const accountPool = options.accountPool ?? (await loadAuthBrokerAccountPool());
|
|
243
|
+
const client = new AuthBrokerClient({ url: brokerConfig.url, token: brokerConfig.token });
|
|
244
|
+
const cachePath = options.cachePath ?? getAuthBrokerSnapshotCachePath();
|
|
245
|
+
const ttlMs = resolveSnapshotTtlMs();
|
|
246
|
+
const persist =
|
|
247
|
+
ttlMs > 0
|
|
248
|
+
? (snapshot: SnapshotResponse): void => {
|
|
249
|
+
void writeAuthBrokerSnapshotCache({
|
|
250
|
+
path: cachePath,
|
|
251
|
+
token: brokerConfig.token,
|
|
252
|
+
url: brokerConfig.url,
|
|
253
|
+
snapshot,
|
|
254
|
+
}).catch(error => {
|
|
255
|
+
logger.debug("auth-broker snapshot cache write failed", { error: String(error) });
|
|
256
|
+
});
|
|
257
|
+
}
|
|
258
|
+
: undefined;
|
|
259
|
+
|
|
260
|
+
let cachedSnapshot: SnapshotResponse | undefined;
|
|
261
|
+
if (ttlMs > 0) {
|
|
262
|
+
cachedSnapshot =
|
|
263
|
+
(await readAuthBrokerSnapshotCache({
|
|
264
|
+
path: cachePath,
|
|
265
|
+
token: brokerConfig.token,
|
|
266
|
+
url: brokerConfig.url,
|
|
267
|
+
ttlMs,
|
|
268
|
+
}).catch(error => {
|
|
269
|
+
logger.debug("auth-broker snapshot cache read failed", { error: String(error) });
|
|
270
|
+
return null;
|
|
271
|
+
})) ?? undefined;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
let initialSnapshot = cachedSnapshot;
|
|
275
|
+
try {
|
|
276
|
+
const initialResult = await client.fetchSnapshot({
|
|
277
|
+
signal: cachedSnapshot ? AbortSignal.timeout(SNAPSHOT_CACHE_REVALIDATION_TIMEOUT_MS) : undefined,
|
|
278
|
+
});
|
|
279
|
+
if (initialResult.status !== 200)
|
|
280
|
+
throw new AuthBrokerError("Auth broker returned no initial snapshot", {
|
|
281
|
+
status: initialResult.status,
|
|
282
|
+
});
|
|
283
|
+
initialSnapshot = initialResult.snapshot;
|
|
284
|
+
persist?.(initialSnapshot);
|
|
285
|
+
} catch (error) {
|
|
286
|
+
if (!cachedSnapshot || (error instanceof AuthBrokerError && [401, 403].includes(error.status ?? 0)))
|
|
287
|
+
throw error;
|
|
288
|
+
}
|
|
289
|
+
const store = new RemoteAuthCredentialStore({
|
|
290
|
+
client,
|
|
291
|
+
initialSnapshot,
|
|
292
|
+
onSnapshot: persist,
|
|
293
|
+
accountPool,
|
|
294
|
+
});
|
|
295
|
+
const storage = new AuthStorage(store, {
|
|
296
|
+
configValueResolver: options.configValueResolver,
|
|
297
|
+
sourceLabel: options.sourceLabel ?? `broker ${brokerConfig.url}`,
|
|
298
|
+
});
|
|
299
|
+
await storage.reload();
|
|
300
|
+
return storage;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
const dbPath = getAgentDbPath(agentDir);
|
|
304
|
+
const storage = await AuthStorage.create(dbPath, {
|
|
305
|
+
configValueResolver: options.configValueResolver,
|
|
306
|
+
sourceLabel: options.sourceLabel ?? `local ${dbPath}`,
|
|
307
|
+
});
|
|
308
|
+
await storage.reload();
|
|
309
|
+
return storage;
|
|
310
|
+
}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Background OAuth refresh loop for the auth-broker server.
|
|
3
|
+
*
|
|
4
|
+
* Iterates active OAuth credentials at `refreshIntervalMs` cadence, refreshing
|
|
5
|
+
* any whose `expires - Date.now() < refreshSkewMs`. Refresh single-flight
|
|
6
|
+
* lives in {@link AuthStorage} so manual and background refreshes share the
|
|
7
|
+
* same upstream attempt.
|
|
8
|
+
* Definitively-failed credentials (invalid_grant / bare 401, not a network
|
|
9
|
+
* blip) are torn down inside {@link AuthStorage.refreshCredentialById} via a
|
|
10
|
+
* compare-and-set disable — only when no peer/login rotated the row first — so
|
|
11
|
+
* the next snapshot pull surfaces a clean delete on the client.
|
|
12
|
+
*/
|
|
13
|
+
import { logger } from "@linxiraos/pi-utils";
|
|
14
|
+
import { type AuthStorage, isDefinitiveOAuthFailure } from "../auth-storage";
|
|
15
|
+
import { DEFAULT_REFRESH_INTERVAL_MS, DEFAULT_REFRESH_SKEW_MS } from "./types";
|
|
16
|
+
|
|
17
|
+
export interface AuthBrokerRefresherOptions {
|
|
18
|
+
storage: AuthStorage;
|
|
19
|
+
/** Refresh credentials expiring within this window. Default 5 min. */
|
|
20
|
+
refreshSkewMs?: number;
|
|
21
|
+
/** Loop cadence. Default 60s. */
|
|
22
|
+
refreshIntervalMs?: number;
|
|
23
|
+
/** Override clock (tests). */
|
|
24
|
+
now?: () => number;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export interface AuthBrokerRefresherSchedule {
|
|
28
|
+
enabled: boolean;
|
|
29
|
+
intervalMs: number;
|
|
30
|
+
skewMs: number;
|
|
31
|
+
nextSweepAt: number;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class AuthBrokerRefresher {
|
|
35
|
+
readonly #storage: AuthStorage;
|
|
36
|
+
readonly #refreshSkewMs: number;
|
|
37
|
+
readonly #refreshIntervalMs: number;
|
|
38
|
+
readonly #now: () => number;
|
|
39
|
+
#timer: NodeJS.Timeout | undefined;
|
|
40
|
+
#running = false;
|
|
41
|
+
#nextSweepAt: number;
|
|
42
|
+
constructor(opts: AuthBrokerRefresherOptions) {
|
|
43
|
+
this.#storage = opts.storage;
|
|
44
|
+
this.#refreshSkewMs = opts.refreshSkewMs ?? DEFAULT_REFRESH_SKEW_MS;
|
|
45
|
+
this.#refreshIntervalMs = opts.refreshIntervalMs ?? DEFAULT_REFRESH_INTERVAL_MS;
|
|
46
|
+
this.#now = opts.now ?? Date.now;
|
|
47
|
+
this.#nextSweepAt = this.#now();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
start(): void {
|
|
51
|
+
if (this.#timer !== undefined) return;
|
|
52
|
+
// Refresh sweep is best-effort; kick once immediately so freshly-booted
|
|
53
|
+
// brokers don't hand out near-expired tokens for the first interval.
|
|
54
|
+
this.#nextSweepAt = this.#now();
|
|
55
|
+
void this.tick();
|
|
56
|
+
this.#timer = setInterval(() => {
|
|
57
|
+
void this.tick();
|
|
58
|
+
}, this.#refreshIntervalMs);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
stop(): void {
|
|
62
|
+
if (this.#timer !== undefined) {
|
|
63
|
+
clearInterval(this.#timer);
|
|
64
|
+
this.#timer = undefined;
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
getSchedule(): AuthBrokerRefresherSchedule {
|
|
69
|
+
return {
|
|
70
|
+
enabled: true,
|
|
71
|
+
intervalMs: this.#refreshIntervalMs,
|
|
72
|
+
skewMs: this.#refreshSkewMs,
|
|
73
|
+
nextSweepAt: this.#nextSweepAt,
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** Run one sweep. Exposed for tests. */
|
|
78
|
+
async tick(): Promise<void> {
|
|
79
|
+
if (this.#running) return;
|
|
80
|
+
this.#running = true;
|
|
81
|
+
this.#nextSweepAt = this.#now();
|
|
82
|
+
try {
|
|
83
|
+
await this.#storage.reload();
|
|
84
|
+
const snapshot = this.#storage.exportSnapshot();
|
|
85
|
+
const now = this.#now();
|
|
86
|
+
const deadline = now + this.#refreshSkewMs;
|
|
87
|
+
const targets: number[] = [];
|
|
88
|
+
for (const entry of snapshot.credentials) {
|
|
89
|
+
if (entry.credential.type !== "oauth") continue;
|
|
90
|
+
const expires = entry.credential.expires;
|
|
91
|
+
if (typeof expires !== "number" || !Number.isFinite(expires)) continue;
|
|
92
|
+
if (expires > deadline) continue;
|
|
93
|
+
targets.push(entry.id);
|
|
94
|
+
}
|
|
95
|
+
await Promise.all(targets.map(id => this.#refreshOne(id)));
|
|
96
|
+
} finally {
|
|
97
|
+
this.#running = false;
|
|
98
|
+
this.#nextSweepAt = this.#now() + this.#refreshIntervalMs;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
async #refreshOne(id: number): Promise<void> {
|
|
103
|
+
try {
|
|
104
|
+
await this.#storage.refreshCredentialById(id);
|
|
105
|
+
} catch (error) {
|
|
106
|
+
const errorMsg = String(error);
|
|
107
|
+
if (isDefinitiveOAuthFailure(errorMsg)) {
|
|
108
|
+
// AuthStorage.refreshCredentialById already CAS-disabled the row
|
|
109
|
+
// (unless a peer/login rotated it first, in which case the live
|
|
110
|
+
// credential is intentionally kept). Nothing to do here but record it.
|
|
111
|
+
logger.warn("auth-broker refresh failed definitively", { id, error: errorMsg });
|
|
112
|
+
} else {
|
|
113
|
+
logger.debug("auth-broker refresh failed (transient)", { id, error: errorMsg });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|