@sayknow-cli/ai 0.4.2 → 0.4.3
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/dist/types/api-registry.d.ts +30 -0
- package/dist/types/auth-broker/client.d.ts +67 -0
- package/dist/types/auth-broker/index.d.ts +5 -0
- package/dist/types/auth-broker/refresher.d.ts +25 -0
- package/dist/types/auth-broker/remote-store.d.ts +99 -0
- package/dist/types/auth-broker/server.d.ts +32 -0
- package/dist/types/auth-broker/types.d.ts +110 -0
- package/dist/types/auth-broker/wire-schemas.d.ts +443 -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 +36 -0
- package/dist/types/auth-gateway/types.d.ts +115 -0
- package/dist/types/auth-storage.d.ts +699 -0
- package/dist/types/cli.d.ts +2 -0
- package/dist/types/context-cap-policy.d.ts +10 -0
- package/dist/types/index.d.ts +53 -0
- package/dist/types/model-cache.d.ts +19 -0
- package/dist/types/model-manager.d.ts +64 -0
- package/dist/types/model-retirements.d.ts +6 -0
- package/dist/types/model-thinking.d.ts +74 -0
- package/dist/types/models.d.ts +21 -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 +256 -0
- package/dist/types/provider-models/special.d.ts +19 -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 +209 -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 +15 -0
- package/dist/types/providers/composer-discipline.d.ts +26 -0
- package/dist/types/providers/cursor/client-version.d.ts +10 -0
- package/dist/types/providers/cursor/gen/agent_pb.d.ts +13022 -0
- package/dist/types/providers/cursor.d.ts +45 -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 +24 -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 +179 -0
- package/dist/types/providers/google-types.d.ts +138 -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 +177 -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 +815 -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 +68 -0
- package/dist/types/providers/openai-completions-compat.d.ts +27 -0
- package/dist/types/providers/openai-completions.d.ts +33 -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 +104 -0
- package/dist/types/providers/openai-responses.d.ts +32 -0
- package/dist/types/providers/pi-native-client.d.ts +13 -0
- package/dist/types/providers/pi-native-server.d.ts +60 -0
- package/dist/types/providers/register-builtins.d.ts +31 -0
- package/dist/types/providers/synthetic.d.ts +26 -0
- package/dist/types/providers/transform-messages.d.ts +14 -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 +43 -0
- package/dist/types/types.d.ts +882 -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 +10 -0
- package/dist/types/usage/kimi.d.ts +2 -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 +258 -0
- package/dist/types/utils/abort.d.ts +19 -0
- package/dist/types/utils/anthropic-auth.d.ts +31 -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 +23 -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 +74 -0
- package/dist/types/utils/event-stream.d.ts +39 -0
- package/dist/types/utils/fallback-transport.d.ts +66 -0
- package/dist/types/utils/fireworks-model-id.d.ts +10 -0
- package/dist/types/utils/foundry.d.ts +1 -0
- package/dist/types/utils/h2-fetch.d.ts +22 -0
- package/dist/types/utils/http-inspector.d.ts +35 -0
- package/dist/types/utils/idle-iterator.d.ts +67 -0
- package/dist/types/utils/json-parse.d.ts +18 -0
- package/dist/types/utils/oauth/alibaba-coding-plan.d.ts +18 -0
- package/dist/types/utils/oauth/anthropic.d.ts +22 -0
- package/dist/types/utils/oauth/api-key-login.d.ts +35 -0
- package/dist/types/utils/oauth/api-key-validation.d.ts +27 -0
- package/dist/types/utils/oauth/callback-server.d.ts +60 -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/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 +21 -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/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/parallel.d.ts +17 -0
- package/dist/types/utils/oauth/perplexity.d.ts +9 -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/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 +45 -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 +23 -0
- package/dist/types/utils/provider-response.d.ts +3 -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 +27 -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 +71 -0
- package/dist/types/utils/tool-choice-capability.d.ts +41 -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 +89 -0
- package/package.json +25 -24
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
export type FallbackTriggerClass = "rate_limit" | "quota" | "auth" | "server" | "unknown" | "other";
|
|
2
|
+
export interface FallbackTrigger {
|
|
3
|
+
class: FallbackTriggerClass;
|
|
4
|
+
retryAfterMs?: number;
|
|
5
|
+
}
|
|
6
|
+
export type TransportHeaders = Headers | Record<string, string | undefined>;
|
|
7
|
+
/**
|
|
8
|
+
* Structured facts from an upstream HTTP or transport failure. Retry decisions
|
|
9
|
+
* must use these facts rather than provider- or application-owned error text.
|
|
10
|
+
*
|
|
11
|
+
* `headers` is always a plain record limited to the retained retry-signal
|
|
12
|
+
* entries: facts travel on persisted `AssistantMessage`s and through
|
|
13
|
+
* `structuredClone` snapshots (managed fallback attempt staging), so they must
|
|
14
|
+
* never carry a live `Headers` instance — cloning one throws `DataCloneError`
|
|
15
|
+
* ("The object can not be cloned.") and masks the real provider failure.
|
|
16
|
+
*/
|
|
17
|
+
export interface TransportFailureFacts {
|
|
18
|
+
kind: "transport";
|
|
19
|
+
status?: number;
|
|
20
|
+
/** Canonical provider error code used for fallback classification. */
|
|
21
|
+
providerCode?: string;
|
|
22
|
+
/** Anthropic's typed `error.type`, preserved separately at the transport boundary. */
|
|
23
|
+
anthropicErrorType?: string;
|
|
24
|
+
/** OpenAI's typed `error.code`, preserved separately at the transport boundary. */
|
|
25
|
+
openaiErrorCode?: string;
|
|
26
|
+
headers?: Record<string, string>;
|
|
27
|
+
}
|
|
28
|
+
/** Opaque per-invocation marker required by managed fallback transport calls. */
|
|
29
|
+
export interface FallbackAttemptToken {
|
|
30
|
+
readonly modelKey: string;
|
|
31
|
+
readonly attemptId: string | number;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Marks a single outer fallback invocation. Accounting belongs to the caller;
|
|
35
|
+
* this token prevents managed transport calls from silently bypassing it.
|
|
36
|
+
*/
|
|
37
|
+
export declare function beginAttempt(modelKey: string, attemptId: string | number): FallbackAttemptToken;
|
|
38
|
+
export declare function assertManagedAttempt(options: {
|
|
39
|
+
fallbackManaged?: boolean;
|
|
40
|
+
fallbackAttempt?: FallbackAttemptToken;
|
|
41
|
+
} | undefined): void;
|
|
42
|
+
/**
|
|
43
|
+
* Compatibility input for callers that have not yet wrapped their HTTP facts
|
|
44
|
+
* in the discriminated form. Only its structured fields are inspected.
|
|
45
|
+
*/
|
|
46
|
+
export interface FallbackTriggerInput {
|
|
47
|
+
status?: number;
|
|
48
|
+
providerCode?: string;
|
|
49
|
+
code?: string;
|
|
50
|
+
headers?: TransportHeaders;
|
|
51
|
+
response?: {
|
|
52
|
+
status?: number;
|
|
53
|
+
headers?: TransportHeaders;
|
|
54
|
+
};
|
|
55
|
+
error?: {
|
|
56
|
+
code?: string;
|
|
57
|
+
type?: string;
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
/** Extracts only explicit HTTP/transport metadata; it never parses error text. */
|
|
61
|
+
export declare function transportFailureFacts(error: unknown, capturedResponse?: {
|
|
62
|
+
status?: number;
|
|
63
|
+
headers?: TransportHeaders;
|
|
64
|
+
}): TransportFailureFacts | undefined;
|
|
65
|
+
/** Classifies only typed upstream transport facts without consuming response bodies. */
|
|
66
|
+
export declare function classifyFallbackTrigger(errorOrFacts: TransportFailureFacts | FallbackTriggerInput | unknown): FallbackTrigger;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export declare function toFireworksPublicModelId(modelId: string): string;
|
|
2
|
+
export declare function toFireworksWireModelId(modelId: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* Fire Pass exposes its Kimi K2.6 Turbo subscription through a dedicated router
|
|
5
|
+
* endpoint at `accounts/fireworks/routers/<id>` rather than the `models/` namespace.
|
|
6
|
+
* We keep a friendly public id (e.g. `kimi-k2.6-turbo`) in the catalog and translate
|
|
7
|
+
* to the wire form (`accounts/fireworks/routers/kimi-k2p6-turbo`) at request time.
|
|
8
|
+
*/
|
|
9
|
+
export declare function toFirepassPublicModelId(modelId: string): string;
|
|
10
|
+
export declare function toFirepassWireModelId(modelId: string): string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function isFoundryEnabled(): boolean;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Patch `globalThis.fetch` to advertise HTTP/2 in TLS ALPN, with transparent
|
|
3
|
+
* HTTP/1.1 fallback when the server doesn't negotiate `h2`.
|
|
4
|
+
*
|
|
5
|
+
* Bun's HTTP/2 client is gated on `BUN_FEATURE_FLAG_EXPERIMENTAL_HTTP2_CLIENT`,
|
|
6
|
+
* read by the native runtime before any JS executes; assigning to
|
|
7
|
+
* `process.env` from inside JS is a no-op. Per-request `protocol: "http2"`
|
|
8
|
+
* activates h2 over TLS ALPN and rejects with `error.code === "HTTP2Unsupported"`
|
|
9
|
+
* if the server picks anything else, so we catch and retry without the hint.
|
|
10
|
+
*
|
|
11
|
+
* Some HTTPS endpoints (e.g. corporate API gateways behind reverse proxies)
|
|
12
|
+
* advertise h2 via ALPN but then refuse or reset the connection at the HTTP/2
|
|
13
|
+
* framing layer. Bun surfaces these as `ConnectionRefused`, `ConnectionReset`,
|
|
14
|
+
* or `ConnectionClosed` rather than `HTTP2Unsupported`, so we treat those
|
|
15
|
+
* codes as h2-fallback triggers as well.
|
|
16
|
+
*
|
|
17
|
+
* Bun negotiates h2 via ALPN over TLS only (no h2c), so plain `http://` URLs
|
|
18
|
+
* skip the attempt entirely — avoids the throw/retry round-trip for localhost.
|
|
19
|
+
*
|
|
20
|
+
* Idempotent.
|
|
21
|
+
*/
|
|
22
|
+
export declare function installH2Fetch(): void;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export type RawHttpRequestDump = {
|
|
2
|
+
provider: string;
|
|
3
|
+
api: string;
|
|
4
|
+
model: string;
|
|
5
|
+
method?: string;
|
|
6
|
+
url?: string;
|
|
7
|
+
headers?: Record<string, string>;
|
|
8
|
+
body?: unknown;
|
|
9
|
+
};
|
|
10
|
+
export type CapturedHttpErrorResponse = {
|
|
11
|
+
status: number;
|
|
12
|
+
headers?: Headers;
|
|
13
|
+
bodyText?: string;
|
|
14
|
+
bodyJson?: unknown;
|
|
15
|
+
};
|
|
16
|
+
/** Whether `message` (from a 400 response) signals an unavailable/unknown model. */
|
|
17
|
+
export declare function isModelUnavailableError(message: string, error: unknown): boolean;
|
|
18
|
+
/** Actionable guidance for selecting an available model/provider. */
|
|
19
|
+
export declare function formatModelUnavailableGuidance(dump: RawHttpRequestDump | undefined): string;
|
|
20
|
+
export declare function appendRawHttpRequestDumpFor400(message: string, error: unknown, dump: RawHttpRequestDump | undefined): Promise<string>;
|
|
21
|
+
export declare function finalizeErrorMessage(error: unknown, rawRequestDump: RawHttpRequestDump | undefined, capturedErrorResponse?: CapturedHttpErrorResponse): Promise<string>;
|
|
22
|
+
export declare function withHttpStatus(error: unknown, status: number): Error;
|
|
23
|
+
/**
|
|
24
|
+
* Rewrite error message for GitHub Copilot request failures.
|
|
25
|
+
* Must run AFTER finalizeErrorMessage since it replaces the message entirely.
|
|
26
|
+
*
|
|
27
|
+
* 400 `model_not_supported` = Copilot routing rollout gap for our OAuth client.
|
|
28
|
+
* A preview model (gpt-5.3-OpenAI code backend, gpt-5.4*, ...) flaps between 200 and
|
|
29
|
+
* 400 because only some of Copilot's backends have the model. After the
|
|
30
|
+
* in-request retry exhausts, surface guidance rather than the raw error.
|
|
31
|
+
* 401 = token invalid/expired → credential removal is safe, prompt re-login.
|
|
32
|
+
* 403 = token valid but access denied (plan, model policy, org restriction) →
|
|
33
|
+
* do NOT reuse the auth-failed string (which triggers credential removal).
|
|
34
|
+
*/
|
|
35
|
+
export declare function rewriteCopilotError(errorMessage: string, error: unknown, provider: string): string;
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Returns the idle timeout used for provider streaming transports.
|
|
3
|
+
*
|
|
4
|
+
* `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS` is accepted as a backward-compatible alias.
|
|
5
|
+
* Set `PI_STREAM_IDLE_TIMEOUT_MS=0` to disable the watchdog.
|
|
6
|
+
*
|
|
7
|
+
* Providers that legitimately stream much slower than the global default can pass
|
|
8
|
+
* `fallbackMs` to widen the floor used when neither env var nor caller option is set.
|
|
9
|
+
* Caller options still take precedence; env overrides still trump the fallback.
|
|
10
|
+
*/
|
|
11
|
+
export declare function getStreamIdleTimeoutMs(fallbackMs?: number): number | undefined;
|
|
12
|
+
/**
|
|
13
|
+
* Returns the idle timeout used for OpenAI-family streaming transports.
|
|
14
|
+
*
|
|
15
|
+
* Set `PI_OPENAI_STREAM_IDLE_TIMEOUT_MS=0` to disable the watchdog.
|
|
16
|
+
*/
|
|
17
|
+
export declare function getOpenAIStreamIdleTimeoutMs(): number | undefined;
|
|
18
|
+
/**
|
|
19
|
+
* Returns the timeout used while waiting for the first stream event.
|
|
20
|
+
* The first token can legitimately take longer than later inter-event gaps,
|
|
21
|
+
* so the default never undershoots the steady-state idle timeout.
|
|
22
|
+
*
|
|
23
|
+
* Set `PI_STREAM_FIRST_EVENT_TIMEOUT_MS=0` to disable the watchdog.
|
|
24
|
+
*
|
|
25
|
+
* Providers whose first response can legitimately take longer (heavy reasoning,
|
|
26
|
+
* slow cold-start proxies) can pass `fallbackMs` to widen the floor used when
|
|
27
|
+
* neither env var nor caller option is set. Caller options still take precedence;
|
|
28
|
+
* env overrides still trump the fallback.
|
|
29
|
+
*/
|
|
30
|
+
export declare function getStreamFirstEventTimeoutMs(idleTimeoutMs?: number, fallbackMs?: number): number | undefined;
|
|
31
|
+
export type Watchdog = NodeJS.Timeout | undefined;
|
|
32
|
+
/**
|
|
33
|
+
* Starts a watchdog that aborts a request if no first stream event arrives in time.
|
|
34
|
+
* Call `markFirstEventReceived()` as soon as the first event is observed.
|
|
35
|
+
*/
|
|
36
|
+
export declare function createWatchdog(timeoutMs: number | undefined, onTimeout: () => void): Watchdog;
|
|
37
|
+
export interface IdleTimeoutIteratorOptions {
|
|
38
|
+
watchdog?: Watchdog;
|
|
39
|
+
idleTimeoutMs?: number;
|
|
40
|
+
firstItemTimeoutMs?: number;
|
|
41
|
+
errorMessage: string;
|
|
42
|
+
firstItemErrorMessage?: string;
|
|
43
|
+
onIdle?: () => void;
|
|
44
|
+
onFirstItemTimeout?: () => void;
|
|
45
|
+
/**
|
|
46
|
+
* Optional semantic-progress predicate. Non-progress items are still yielded,
|
|
47
|
+
* but they do not reset the idle deadline. This prevents provider
|
|
48
|
+
* keepalive/no-op events from keeping a stalled tool call alive forever.
|
|
49
|
+
*/
|
|
50
|
+
isProgressItem?: (item: unknown) => boolean;
|
|
51
|
+
/**
|
|
52
|
+
* Cancel iteration as soon as this signal aborts. Required for caller-driven
|
|
53
|
+
* cancellation (ESC) when the underlying transport does not surface signal
|
|
54
|
+
* aborts to the iterator (HTTP/2 proxies, native sockets, mocked fetch).
|
|
55
|
+
* Without this, the consumer sleeps on iterator.next() until the idle/first
|
|
56
|
+
* -event watchdog fires — observable as the issue #912 "Working… forever"
|
|
57
|
+
* symptom on the github-copilot provider.
|
|
58
|
+
*/
|
|
59
|
+
abortSignal?: AbortSignal;
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Yields items from an async iterable while enforcing a maximum idle gap between items.
|
|
63
|
+
*
|
|
64
|
+
* The first item may use a shorter timeout so stuck requests can be aborted and retried
|
|
65
|
+
* before any user-visible content has streamed.
|
|
66
|
+
*/
|
|
67
|
+
export declare function iterateWithIdleTimeout<T>(iterable: AsyncIterable<T>, options: IdleTimeoutIteratorOptions): AsyncGenerator<T>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export declare function repairJson(json: string): string;
|
|
2
|
+
export declare function parseJsonWithRepair<T>(json: string): T;
|
|
3
|
+
/**
|
|
4
|
+
* Attempts to parse potentially incomplete JSON during streaming.
|
|
5
|
+
* Always returns a valid object, even if the JSON is incomplete.
|
|
6
|
+
*
|
|
7
|
+
* @param partialJson The partial JSON string from streaming
|
|
8
|
+
* @returns Parsed object or empty object if parsing fails
|
|
9
|
+
*/
|
|
10
|
+
export declare function parseStreamingJson<T = Record<string, unknown>>(partialJson: string | undefined): T;
|
|
11
|
+
/**
|
|
12
|
+
* Whether a string is a complete, well-formed JSON document (strict parse, no
|
|
13
|
+
* repair). Used to distinguish a tool-call argument blob that finished cleanly
|
|
14
|
+
* from one that was cut off mid-stream (truncation). An empty / whitespace-only
|
|
15
|
+
* string is treated as complete: a tool invoked with no arguments legitimately
|
|
16
|
+
* streams an empty buffer and must not be flagged as truncated.
|
|
17
|
+
*/
|
|
18
|
+
export declare function isCompleteJson(text: string | undefined): boolean;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Alibaba Coding Plan login flow.
|
|
3
|
+
*
|
|
4
|
+
* Alibaba Coding Plan provides OpenAI-compatible models via https://coding-intl.dashscope.aliyuncs.com/v1.
|
|
5
|
+
*
|
|
6
|
+
* This is not OAuth - it's a simple API key flow:
|
|
7
|
+
* 1. Open browser to Alibaba Cloud DashScope API key settings
|
|
8
|
+
* 2. User copies their API key
|
|
9
|
+
* 3. User pastes the API key into the CLI
|
|
10
|
+
*/
|
|
11
|
+
import type { OAuthController } from "./types";
|
|
12
|
+
/**
|
|
13
|
+
* Login to Alibaba Coding Plan.
|
|
14
|
+
*
|
|
15
|
+
* Opens browser to API keys page, prompts user to paste their API key.
|
|
16
|
+
* Returns the API key directly (not OAuthCredentials - this isn't OAuth).
|
|
17
|
+
*/
|
|
18
|
+
export declare function loginAlibabaCodingPlan(options: OAuthController): Promise<string>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Anthropic OAuth flow (Anthropic model Pro/Max)
|
|
3
|
+
*/
|
|
4
|
+
import { OAuthCallbackFlow } from "./callback-server";
|
|
5
|
+
import type { OAuthController, OAuthCredentials } from "./types";
|
|
6
|
+
export declare class AnthropicOAuthFlow extends OAuthCallbackFlow {
|
|
7
|
+
#private;
|
|
8
|
+
constructor(ctrl: OAuthController);
|
|
9
|
+
generateAuthUrl(state: string, redirectUri: string): Promise<{
|
|
10
|
+
url: string;
|
|
11
|
+
instructions?: string;
|
|
12
|
+
}>;
|
|
13
|
+
exchangeToken(code: string, state: string, redirectUri: string): Promise<OAuthCredentials>;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Login with Anthropic OAuth
|
|
17
|
+
*/
|
|
18
|
+
export declare function loginAnthropic(ctrl: OAuthController): Promise<OAuthCredentials>;
|
|
19
|
+
/**
|
|
20
|
+
* Refresh Anthropic OAuth token
|
|
21
|
+
*/
|
|
22
|
+
export declare function refreshAnthropicToken(refreshToken: string): Promise<OAuthCredentials>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared factory for API-key-paste "login" flows.
|
|
3
|
+
*
|
|
4
|
+
* Several providers (Cerebras, Synthetic, Moonshot, Together, NanoGPT, ZenMux)
|
|
5
|
+
* don't actually implement OAuth — they just ask the user to paste an API key,
|
|
6
|
+
* optionally validate it, and return the trimmed key.
|
|
7
|
+
*/
|
|
8
|
+
import type { OAuthController } from "./types";
|
|
9
|
+
type ChatCompletionsValidation = {
|
|
10
|
+
kind: "chat-completions";
|
|
11
|
+
provider: string;
|
|
12
|
+
baseUrl: string;
|
|
13
|
+
model: string;
|
|
14
|
+
};
|
|
15
|
+
type ModelsEndpointValidation = {
|
|
16
|
+
kind: "models-endpoint";
|
|
17
|
+
provider: string;
|
|
18
|
+
modelsUrl: string;
|
|
19
|
+
};
|
|
20
|
+
export type ApiKeyLoginConfig = {
|
|
21
|
+
/** Display name used in error messages, e.g. "Cerebras", "NanoGPT". */
|
|
22
|
+
providerLabel: string;
|
|
23
|
+
/** URL opened in browser for the user to grab their key. */
|
|
24
|
+
authUrl: string;
|
|
25
|
+
/** Instructions shown with the onAuth callback. */
|
|
26
|
+
instructions: string;
|
|
27
|
+
/** Prompt message shown when asking for the key paste. */
|
|
28
|
+
promptMessage: string;
|
|
29
|
+
/** Placeholder string for the prompt (e.g. "sk-...", "csk-..."). */
|
|
30
|
+
placeholder: string;
|
|
31
|
+
/** Validation strategy, or `null` to skip validation. */
|
|
32
|
+
validation: ChatCompletionsValidation | ModelsEndpointValidation | null;
|
|
33
|
+
};
|
|
34
|
+
export declare function createApiKeyLogin(config: ApiKeyLoginConfig): (options: OAuthController) => Promise<string>;
|
|
35
|
+
export {};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
type OpenAICompatibleValidationOptions = {
|
|
2
|
+
provider: string;
|
|
3
|
+
apiKey: string;
|
|
4
|
+
baseUrl: string;
|
|
5
|
+
model: string;
|
|
6
|
+
signal?: AbortSignal;
|
|
7
|
+
};
|
|
8
|
+
type ModelListValidationOptions = {
|
|
9
|
+
provider: string;
|
|
10
|
+
apiKey: string;
|
|
11
|
+
modelsUrl: string;
|
|
12
|
+
signal?: AbortSignal;
|
|
13
|
+
};
|
|
14
|
+
/**
|
|
15
|
+
* Validate an API key against an OpenAI-compatible chat completions endpoint.
|
|
16
|
+
*
|
|
17
|
+
* Performs a minimal request to verify credentials and endpoint access.
|
|
18
|
+
*/
|
|
19
|
+
export declare function validateOpenAICompatibleApiKey(options: OpenAICompatibleValidationOptions): Promise<void>;
|
|
20
|
+
/**
|
|
21
|
+
* Validate an API key against a provider models endpoint.
|
|
22
|
+
*
|
|
23
|
+
* Useful for providers where access to specific models may vary by plan and
|
|
24
|
+
* should not block key validation.
|
|
25
|
+
*/
|
|
26
|
+
export declare function validateApiKeyAgainstModelsEndpoint(options: ModelListValidationOptions): Promise<void>;
|
|
27
|
+
export {};
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { OAuthController, OAuthCredentials } from "./types";
|
|
2
|
+
export type CallbackResult = {
|
|
3
|
+
code: string;
|
|
4
|
+
state: string;
|
|
5
|
+
};
|
|
6
|
+
export interface OAuthCallbackFlowOptions {
|
|
7
|
+
preferredPort: number;
|
|
8
|
+
callbackPath?: string;
|
|
9
|
+
callbackHostname?: string;
|
|
10
|
+
/** Local listener hostname; defaults to callbackHostname when omitted. */
|
|
11
|
+
callbackBindHostname?: string;
|
|
12
|
+
/** Exact redirect URI advertised to the provider; disables port fallback. */
|
|
13
|
+
redirectUri?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Abstract base class for OAuth flows with local callback servers.
|
|
17
|
+
*/
|
|
18
|
+
export declare abstract class OAuthCallbackFlow {
|
|
19
|
+
#private;
|
|
20
|
+
ctrl: OAuthController;
|
|
21
|
+
preferredPort: number;
|
|
22
|
+
callbackPath: string;
|
|
23
|
+
callbackHostname: string;
|
|
24
|
+
callbackBindHostname: string;
|
|
25
|
+
redirectUri?: string;
|
|
26
|
+
constructor(ctrl: OAuthController, preferredPortOrOptions: number | OAuthCallbackFlowOptions, callbackPath?: string);
|
|
27
|
+
/**
|
|
28
|
+
* Generate provider-specific authorization URL.
|
|
29
|
+
* @param state - CSRF state token
|
|
30
|
+
* @param redirectUri - The actual redirect URI to use (may differ from expected if port fallback occurred)
|
|
31
|
+
* @returns Authorization URL and optional instructions
|
|
32
|
+
*/
|
|
33
|
+
abstract generateAuthUrl(state: string, redirectUri: string): Promise<{
|
|
34
|
+
url: string;
|
|
35
|
+
instructions?: string;
|
|
36
|
+
}>;
|
|
37
|
+
/**
|
|
38
|
+
* Exchange authorization code for OAuth tokens.
|
|
39
|
+
* @param code - Authorization code from callback
|
|
40
|
+
* @param state - CSRF state token
|
|
41
|
+
* @param redirectUri - The actual redirect URI used (must match authorization request)
|
|
42
|
+
* @returns OAuth credentials
|
|
43
|
+
*/
|
|
44
|
+
abstract exchangeToken(code: string, state: string, redirectUri: string): Promise<OAuthCredentials>;
|
|
45
|
+
/**
|
|
46
|
+
* Generate CSRF state token. Override if provider needs custom state generation.
|
|
47
|
+
*/
|
|
48
|
+
generateState(): string;
|
|
49
|
+
/**
|
|
50
|
+
* Execute the OAuth login flow.
|
|
51
|
+
*/
|
|
52
|
+
login(): Promise<OAuthCredentials>;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Parse a redirect URL or code string to extract code and state.
|
|
56
|
+
*/
|
|
57
|
+
export declare function parseCallbackInput(input: string): {
|
|
58
|
+
code?: string;
|
|
59
|
+
state?: string;
|
|
60
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const loginCerebras: (options: import("./types").OAuthController) => Promise<string>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Cloudflare AI Gateway login flow.
|
|
3
|
+
*
|
|
4
|
+
* Cloudflare AI Gateway proxies upstream model providers.
|
|
5
|
+
*
|
|
6
|
+
* This is not OAuth - it's a simple API key flow:
|
|
7
|
+
* 1. Open Cloudflare AI Gateway docs/dashboard
|
|
8
|
+
* 2. User copies their Cloudflare AI Gateway token/API key
|
|
9
|
+
* 3. User pastes the API key into the CLI
|
|
10
|
+
*/
|
|
11
|
+
import type { OAuthController } from "./types";
|
|
12
|
+
/**
|
|
13
|
+
* Login to Cloudflare AI Gateway.
|
|
14
|
+
*
|
|
15
|
+
* Opens browser to Cloudflare AI Gateway authentication docs and prompts for a gateway token/API key.
|
|
16
|
+
* Returns the API key directly (not OAuthCredentials - this isn't OAuth).
|
|
17
|
+
*/
|
|
18
|
+
export declare function loginCloudflareAiGateway(options: OAuthController): Promise<string>;
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { OAuthCredentials } from "./types";
|
|
2
|
+
export interface CursorAuthParams {
|
|
3
|
+
verifier: string;
|
|
4
|
+
challenge: string;
|
|
5
|
+
uuid: string;
|
|
6
|
+
loginUrl: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function generateCursorAuthParams(): Promise<CursorAuthParams>;
|
|
9
|
+
export declare function pollCursorAuth(uuid: string, verifier: string): Promise<{
|
|
10
|
+
accessToken: string;
|
|
11
|
+
refreshToken: string;
|
|
12
|
+
}>;
|
|
13
|
+
export declare function loginCursor(onAuthUrl: (url: string) => void, onPollStart?: () => void): Promise<OAuthCredentials>;
|
|
14
|
+
export declare function refreshCursorToken(apiKeyOrRefreshToken: string): Promise<OAuthCredentials>;
|
|
15
|
+
export declare function isCursorTokenExpiringSoon(token: string, thresholdSeconds?: number): boolean;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const loginDeepInfra: (options: import("./types").OAuthController) => Promise<string>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { OAuthController } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Normalize a pasted DeepSeek API key.
|
|
4
|
+
*
|
|
5
|
+
* Users frequently copy keys out of `curl` snippets that include the
|
|
6
|
+
* `Authorization: Bearer …` prefix. Strip it so validation does not fail
|
|
7
|
+
* with a confusing 401, and reject obviously empty input early.
|
|
8
|
+
*/
|
|
9
|
+
export declare function normalizeDeepSeekApiKey(raw: string): string;
|
|
10
|
+
export declare const loginDeepSeek: (options: OAuthController) => Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const loginFirepass: (options: import("./types").OAuthController) => Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const loginFireworks: (options: import("./types").OAuthController) => Promise<string>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const loginFugu: (options: import("./types").OAuthController) => Promise<string>;
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { OAuthCredentials } from "./types";
|
|
2
|
+
export declare const COPILOT_USER_AGENT: "opencode/1.3.15";
|
|
3
|
+
export declare const OPENCODE_HEADERS: {
|
|
4
|
+
readonly "User-Agent": "opencode/1.3.15";
|
|
5
|
+
};
|
|
6
|
+
export type ParsedGitHubCopilotApiKey = {
|
|
7
|
+
accessToken: string;
|
|
8
|
+
enterpriseUrl?: string;
|
|
9
|
+
};
|
|
10
|
+
export declare function normalizeGitHubCopilotEnterpriseDomain(input: string | undefined): string | undefined;
|
|
11
|
+
export declare function parseGitHubCopilotApiKey(apiKeyRaw: string): ParsedGitHubCopilotApiKey;
|
|
12
|
+
export declare function normalizeDomain(input: string): string | null;
|
|
13
|
+
export declare function getGitHubCopilotBaseUrl(enterpriseDomain?: string): string;
|
|
14
|
+
/**
|
|
15
|
+
* Refresh GitHub Copilot token.
|
|
16
|
+
* With the opencode OAuth flow, the GitHub token is used directly — no JWT exchange needed.
|
|
17
|
+
*/
|
|
18
|
+
export declare function refreshGitHubCopilotToken(refreshToken: string, enterpriseDomain?: string): OAuthCredentials;
|
|
19
|
+
/**
|
|
20
|
+
* Login with GitHub Copilot OAuth (device code flow)
|
|
21
|
+
*
|
|
22
|
+
* @param options.onAuth - Callback with URL and optional instructions (user code)
|
|
23
|
+
* @param options.onPrompt - Callback to prompt user for input
|
|
24
|
+
* @param options.onProgress - Optional progress callback
|
|
25
|
+
* @param options.signal - Optional AbortSignal for cancellation
|
|
26
|
+
*/
|
|
27
|
+
export declare function loginGitHubCopilot(options: {
|
|
28
|
+
onAuth: (url: string, instructions?: string) => void;
|
|
29
|
+
onPrompt: (prompt: {
|
|
30
|
+
message: string;
|
|
31
|
+
placeholder?: string;
|
|
32
|
+
allowEmpty?: boolean;
|
|
33
|
+
}) => Promise<string>;
|
|
34
|
+
onProgress?: (message: string) => void;
|
|
35
|
+
signal?: AbortSignal;
|
|
36
|
+
pollIntervalFloorMs?: number;
|
|
37
|
+
pollIntervalScaleMs?: number;
|
|
38
|
+
}): Promise<OAuthCredentials>;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import type { OAuthCredentials, OAuthLoginCallbacks } from "./types";
|
|
2
|
+
export declare function loginGitLabDuo(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
|
|
3
|
+
export declare function refreshGitLabDuoToken(credentials: OAuthCredentials): Promise<OAuthCredentials>;
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GLM ZCode OAuth flow (UNOFFICIAL, opt-in).
|
|
3
|
+
*
|
|
4
|
+
* Replicates how the ZCode desktop app turns a Z.AI login into usable GLM model
|
|
5
|
+
* access. This is NOT an official Z.AI OAuth client: it reuses ZCode's authorize
|
|
6
|
+
* page, broker, and a custom-protocol redirect. It may break at any time and may
|
|
7
|
+
* violate ZCode/Z.AI Terms of Service. Endpoints/client id are overridable via
|
|
8
|
+
* `ZCODE_OAUTH_*` environment variables.
|
|
9
|
+
*
|
|
10
|
+
* Verified end-to-end against the ZCode host bundle (`resolveZaiApiKey` /
|
|
11
|
+
* `resolveBizApiKey`) and live traffic:
|
|
12
|
+
* 1. Authorize: GET {authorize}?redirect_uri=zcode://oauth/callback&response_type=code&client_id=...&state=...
|
|
13
|
+
* (custom-protocol redirect → a CLI cannot catch it, so the user pastes the code/redirect URL)
|
|
14
|
+
* 2. Broker: POST {broker} { provider:"zai", code, redirect_uri, state }
|
|
15
|
+
* → { data: { token: <ZCode JWT>, zai: { access_token: <upstream Z.AI token> } } }
|
|
16
|
+
* 3. Business: POST {z/login} { token: <upstream Z.AI token> } → { data: { access_token: <business token> } }
|
|
17
|
+
* 4. Provision: with the business token, GET getCustomerInfo → default org/project,
|
|
18
|
+
* GET/POST .../api_keys (find/create a key named "zcode-api-key"),
|
|
19
|
+
* GET .../api_keys/copy/{id} → secretKey ⇒ a real Z.AI API key "{id}.{secret}".
|
|
20
|
+
*
|
|
21
|
+
* Credential mapping:
|
|
22
|
+
* - `access` = the provisioned **Z.AI API key** ("{id}.{secret}"). Model requests go to
|
|
23
|
+
* `https://api.z.ai/api/anthropic/v1/messages` with `Authorization: Bearer <key>`
|
|
24
|
+
* (exactly like a dashboard key) — NO zcode.z.ai gateway, NO captcha.
|
|
25
|
+
* - `refresh` = the upstream Z.AI OAuth access token (used to re-provision the key).
|
|
26
|
+
* The API key is long-lived, so `expires` is set far in the future.
|
|
27
|
+
*
|
|
28
|
+
* This provider must NEVER force `isOAuth=true`: the key is a plain Z.AI API key, and
|
|
29
|
+
* api.z.ai is not api.anthropic.com, so the Anthropic path already emits a plain bearer.
|
|
30
|
+
*/
|
|
31
|
+
import { OAuthCallbackFlow } from "./callback-server";
|
|
32
|
+
import type { OAuthController, OAuthCredentials } from "./types";
|
|
33
|
+
export declare const GLM_ZCODE_REFRESH_SKEW_MS: number;
|
|
34
|
+
/** Default endpoints / client id. Override via the matching `ZCODE_OAUTH_*` env vars. */
|
|
35
|
+
export declare const GLM_ZCODE_OAUTH_AUTHORIZE_URL = "https://chat.z.ai/api/oauth/authorize";
|
|
36
|
+
export declare const GLM_ZCODE_OAUTH_CLIENT_ID = "client_P8X5CMWmlaRO9gyO-KSqtg";
|
|
37
|
+
export declare const GLM_ZCODE_OAUTH_REDIRECT_URI = "zcode://oauth/callback";
|
|
38
|
+
export declare const GLM_ZCODE_OAUTH_BROKER_TOKEN_URL = "https://zcode.z.ai/api/v1/oauth/token";
|
|
39
|
+
export declare const GLM_ZCODE_ZAI_LOGIN_URL = "https://api.z.ai/api/auth/z/login";
|
|
40
|
+
export declare const GLM_ZCODE_USERINFO_URL = "https://chat.z.ai/api/oauth/userinfo";
|
|
41
|
+
/** Z.AI business API base (customer/org/project/api-key management). */
|
|
42
|
+
export declare const GLM_ZCODE_ZAI_API_BASE = "https://api.z.ai";
|
|
43
|
+
/** Model API base — the provisioned key is used here, exactly like a dashboard key. */
|
|
44
|
+
export declare const GLM_ZCODE_ANTHROPIC_BASE_URL = "https://api.z.ai/api/anthropic";
|
|
45
|
+
type FetchImpl = typeof globalThis.fetch;
|
|
46
|
+
/** Configured whenever a client id is available; the real ZCode client id ships as default. */
|
|
47
|
+
export declare function isGlmZcodeOAuthConfigured(): boolean;
|
|
48
|
+
export interface GlmZcodeOAuthFlowOptions {
|
|
49
|
+
fetch?: FetchImpl;
|
|
50
|
+
}
|
|
51
|
+
export declare class GlmZcodeOAuthFlow extends OAuthCallbackFlow {
|
|
52
|
+
#private;
|
|
53
|
+
constructor(ctrl: OAuthController, options?: GlmZcodeOAuthFlowOptions);
|
|
54
|
+
generateAuthUrl(state: string, redirectUri: string): Promise<{
|
|
55
|
+
url: string;
|
|
56
|
+
instructions?: string;
|
|
57
|
+
}>;
|
|
58
|
+
exchangeToken(code: string, state: string, redirectUri: string): Promise<OAuthCredentials>;
|
|
59
|
+
}
|
|
60
|
+
export declare function loginGlmZcode(ctrl: OAuthController, options?: GlmZcodeOAuthFlowOptions): Promise<OAuthCredentials>;
|
|
61
|
+
export interface GlmZcodeRefreshOptions {
|
|
62
|
+
signal?: AbortSignal;
|
|
63
|
+
fetch?: FetchImpl;
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Re-provision the Z.AI API key from the stored upstream token. The key itself is
|
|
67
|
+
* long-lived, so this is rarely needed; if the upstream token has expired it fails
|
|
68
|
+
* loudly and the user must re-login.
|
|
69
|
+
*/
|
|
70
|
+
export declare function refreshGlmZcodeToken(credentials: OAuthCredentials, options?: AbortSignal | GlmZcodeRefreshOptions): Promise<OAuthCredentials>;
|
|
71
|
+
export {};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { OAuthController, OAuthCredentials } from "./types";
|
|
2
|
+
export declare const ANTIGRAVITY_LOAD_CODE_ASSIST_METADATA: Readonly<{
|
|
3
|
+
ideType: "ANTIGRAVITY";
|
|
4
|
+
platform: "PLATFORM_UNSPECIFIED";
|
|
5
|
+
pluginType: "GEMINI";
|
|
6
|
+
}>;
|
|
7
|
+
export declare function loginAntigravity(ctrl: OAuthController): Promise<OAuthCredentials>;
|
|
8
|
+
/**
|
|
9
|
+
* Refresh Antigravity token
|
|
10
|
+
*/
|
|
11
|
+
export declare function refreshAntigravityToken(refreshToken: string, projectId: string): Promise<OAuthCredentials>;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Gemini CLI OAuth flow (Google Cloud Code Assist)
|
|
3
|
+
* Standard Gemini models only (gemini-2.0-flash, gemini-2.5-*)
|
|
4
|
+
*/
|
|
5
|
+
import type { OAuthController, OAuthCredentials } from "./types";
|
|
6
|
+
export declare function loginGeminiCli(ctrl: OAuthController): Promise<OAuthCredentials>;
|
|
7
|
+
/**
|
|
8
|
+
* Refresh Google Cloud Code Assist token
|
|
9
|
+
*/
|
|
10
|
+
export declare function refreshGoogleCloudToken(refreshToken: string, projectId: string): Promise<OAuthCredentials>;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared OAuth flow for Google-style providers (Gemini CLI, Antigravity).
|
|
3
|
+
*
|
|
4
|
+
* Both providers use the same authorization-code flow shape; only the client
|
|
5
|
+
* credentials, scopes, endpoint constants, and project-discovery logic differ.
|
|
6
|
+
*/
|
|
7
|
+
import { OAuthCallbackFlow } from "./callback-server";
|
|
8
|
+
import type { OAuthController, OAuthCredentials } from "./types";
|
|
9
|
+
export interface GoogleOAuthFlowConfig {
|
|
10
|
+
clientId: string;
|
|
11
|
+
clientSecret: string;
|
|
12
|
+
authUrl: string;
|
|
13
|
+
tokenUrl: string;
|
|
14
|
+
scopes: string[];
|
|
15
|
+
callbackPort: number;
|
|
16
|
+
callbackPath: string;
|
|
17
|
+
discoverProject: (accessToken: string, onProgress?: (message: string) => void) => Promise<string>;
|
|
18
|
+
}
|
|
19
|
+
export declare class GoogleOAuthFlow extends OAuthCallbackFlow {
|
|
20
|
+
private readonly config;
|
|
21
|
+
constructor(ctrl: OAuthController, config: GoogleOAuthFlowConfig);
|
|
22
|
+
generateAuthUrl(state: string, redirectUri: string): Promise<{
|
|
23
|
+
url: string;
|
|
24
|
+
instructions?: string;
|
|
25
|
+
}>;
|
|
26
|
+
exchangeToken(code: string, _state: string, redirectUri: string): Promise<OAuthCredentials>;
|
|
27
|
+
}
|
|
28
|
+
export declare function runGoogleOAuthLogin(ctrl: OAuthController, config: GoogleOAuthFlowConfig): Promise<OAuthCredentials>;
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hugging Face Inference login flow.
|
|
3
|
+
*
|
|
4
|
+
* Hugging Face Inference Providers expose an OpenAI-compatible endpoint via
|
|
5
|
+
* https://router.huggingface.co/v1.
|
|
6
|
+
*
|
|
7
|
+
* This is an API key flow:
|
|
8
|
+
* 1. Open browser to Hugging Face token settings
|
|
9
|
+
* 2. User creates/copies a token with Inference Providers permission
|
|
10
|
+
* 3. User pastes the token into the CLI
|
|
11
|
+
*/
|
|
12
|
+
import type { OAuthController } from "./types";
|
|
13
|
+
/**
|
|
14
|
+
* Login to Hugging Face Inference Providers.
|
|
15
|
+
*
|
|
16
|
+
* Opens browser to token settings, prompts user to paste their API key.
|
|
17
|
+
* Returns the API key directly (not OAuthCredentials - this isn't OAuth).
|
|
18
|
+
*/
|
|
19
|
+
export declare function loginHuggingface(options: OAuthController): Promise<string>;
|