@wengine-ai/llms 2.3.2414 → 2.3.2415

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.
@@ -0,0 +1,11 @@
1
+ /**
2
+ * The canonical POST-/api-config runtime reload sequence, owned by the core
3
+ * and handed to plugins via PluginContext.host.reloadRuntime. Before this
4
+ * existed, every managed subscription provider carried its own
5
+ * copy — the plugin API exists to end exactly that kind of duplication.
6
+ */
7
+ export declare function reloadProviderRuntime(server: any, config: any, log: {
8
+ info(msg: string): void;
9
+ warn(msg: string): void;
10
+ error(msg: string): void;
11
+ }): void;
@@ -0,0 +1,33 @@
1
+ import { dirname } from "node:path";
2
+ import { type PluginRegistry } from "./registry";
3
+ export interface PluginLoadResult {
4
+ loaded: string[];
5
+ failed: Array<{
6
+ name: string;
7
+ error: string;
8
+ }>;
9
+ skipped: Array<{
10
+ name: string;
11
+ reason: string;
12
+ }>;
13
+ }
14
+ /** Reject symlinked directories, not just lexical traversal. */
15
+ export declare function resolvePluginDir(configDir: string, name: string): string | null;
16
+ /** Resolve the subscription-plugin dispatcher for one server instance: the
17
+ * explicit SUBSCRIPTION_PROXY_URL from the live config when a server/config
18
+ * service exists, else the initConfig env mirror (host-less loaders). Exported
19
+ * for tests — this is the exact closure the plugin host hands out. */
20
+ export declare function resolveSubscriptionDispatcher(server: unknown): unknown;
21
+ export declare function loadInstalledPlugins(deps: {
22
+ configDir: string;
23
+ log: {
24
+ info(msg: string): void;
25
+ warn(msg: string): void;
26
+ error(msg: string): void;
27
+ };
28
+ getServer: () => any;
29
+ registry?: PluginRegistry;
30
+ }): Promise<PluginLoadResult>;
31
+ /** Production must pass the host registry; default retained only for isolated loader tests. */
32
+ export declare function describeInstalledPlugins(configDir: string, registry?: PluginRegistry): Array<Record<string, unknown>>;
33
+ export { dirname };
@@ -0,0 +1,39 @@
1
+ import { type FastifyInstance } from "fastify";
2
+ import type { TransformerService } from "../services/transformer";
3
+ import type { LoadedPluginInfo, ManagedRuntime, PluginClassifiedError, PluginContext, PluginHostCapabilities, PluginManifest } from "./types";
4
+ import { PLUGIN_CORE_API } from "./types";
5
+ type PluginLog = PluginContext["log"];
6
+ /** One registry per Server. No production lookup falls back to the test registry. */
7
+ export declare class PluginRegistry {
8
+ private plugins;
9
+ private transformerServices;
10
+ private disposed;
11
+ private revision;
12
+ attachTransformerService(service: TransformerService): void;
13
+ beginActivation(manifest: PluginManifest, log: PluginLog, host: PluginHostCapabilities, directory?: string): {
14
+ context: PluginContext;
15
+ commit: (card?: Buffer, routeHost?: FastifyInstance) => Promise<void>;
16
+ readonly cardPath: string | undefined;
17
+ abort: () => void;
18
+ };
19
+ getManagedRuntimeFor(provider: any): ManagedRuntime | undefined;
20
+ getRegisteredRuntimes(): ManagedRuntime[];
21
+ applyConfigProtectors(next: any, prev: any): void;
22
+ listLoadedPlugins(): LoadedPluginInfo[];
23
+ getPublicCard(name: string, file: string): Buffer | undefined;
24
+ private prepareRoutes;
25
+ registerAllRoutes(app: FastifyInstance): Promise<void>;
26
+ dispose(): void;
27
+ private assertOpen;
28
+ }
29
+ export declare const getTestPluginRegistry: () => PluginRegistry;
30
+ export declare function clearPluginRegistry(): void;
31
+ export declare const getManagedRuntimeFor: (provider: any, registry?: PluginRegistry) => ManagedRuntime | undefined;
32
+ export declare const getRegisteredRuntimes: () => ManagedRuntime[];
33
+ export declare const listLoadedPlugins: () => LoadedPluginInfo[];
34
+ export declare const applyPluginConfigProtectors: (next: any, prev: any) => void;
35
+ export declare const registerAllPluginRoutes: (app: FastifyInstance) => Promise<void>;
36
+ /** Build the core-side thrown error from a plugin classification. */
37
+ export declare function pluginErrorFrom(runtimeName: string, info: PluginClassifiedError): Error & Record<string, any>;
38
+ export declare function isPluginClassifiedError(error: any): boolean;
39
+ export { PLUGIN_CORE_API };
@@ -0,0 +1,3 @@
1
+ import type { PluginContext } from "./types";
2
+ /** Explicit activation context; never a process-wide pointer to a live server. */
3
+ export declare function registerTransformerFromPlugin(context: PluginContext, cls: new () => any): void;
@@ -0,0 +1,182 @@
1
+ import type { FastifyInstance } from "fastify";
2
+ import type { LLMProvider } from "../types/llm";
3
+ /**
4
+ * Provider plugin API (docs/design/provider-plugins.md).
5
+ *
6
+ * A plugin ships subscription-provider code out of the main package: a
7
+ * transformer, a managed runtime (upstream lock, token injection, error
8
+ * taxonomy), admin routes, a config protector and a UI card. The core only
9
+ * knows this interface — never the provider internals.
10
+ *
11
+ * Lives in `src/provider-plugins/` deliberately: `src/plugins/` is the older
12
+ * output-plugin system (token-speed) and must not mix namespaces.
13
+ *
14
+ * `coreApi` is a semver-ish compatibility marker. The core refuses plugins
15
+ * whose major does not match its own, so the public contract can evolve
16
+ * without silently breaking third parties.
17
+ */
18
+ export declare const PLUGIN_CORE_API = "1";
19
+ export interface PluginManifest {
20
+ name: string;
21
+ version: string;
22
+ coreApi: string;
23
+ description?: string;
24
+ }
25
+ /** A classified upstream error, shared shape across providers (contract §1.6). */
26
+ export interface PluginClassifiedError {
27
+ code: string;
28
+ message: string;
29
+ httpStatus: number;
30
+ cooldownMs?: number;
31
+ validationUrl?: string;
32
+ retryable?: boolean;
33
+ }
34
+ /**
35
+ * Input for a runtime-owned bounded dispatch wrapper (`dispatchRequest`). The
36
+ * core supplies its ordinary single-attempt dispatch as `attempt()` — every
37
+ * generic seam (ensureUsable/lockUpstream/signRequest/classifyError/
38
+ * noteUpstreamError, the 401-once refresh budget, response-error
39
+ * confidentiality) runs INSIDE each attempt; the wrapper only owns the loop
40
+ * around it (e.g. rotating local credentials). The generic same-model retry
41
+ * and fallback chains stay in the core and are never re-implemented by a
42
+ * wrapper.
43
+ */
44
+ export interface PluginDispatchInput {
45
+ /** One ordinary core dispatch attempt. May be called several times, always
46
+ * within the runtime's own hard bound (≤ its credential count and ≤ a
47
+ * constant cap). */
48
+ attempt(): Promise<Response>;
49
+ /** Finalized request body (body-derived account selection works). */
50
+ requestBody: any;
51
+ /** The per-provider request config; a wrapper may attach per-attempt state
52
+ * that lockUpstream/signRequest read back on the same object. */
53
+ config: any;
54
+ provider: LLMProvider;
55
+ /** The originating request object (shared identity across retry/fallback
56
+ * spreads) for per-request wrapper state. */
57
+ req?: any;
58
+ }
59
+ /**
60
+ * Managed-subscription semantics for one provider family. Everything the data
61
+ * plane needs to talk to a subscription upstream without the core knowing it:
62
+ * fixed upstream, token injection, error taxonomy, cooling circuit breaker.
63
+ */
64
+ export interface ManagedRuntime {
65
+ /** Provider family name, e.g. "codex". Used for logging and 401 bookkeeping keys. */
66
+ name: string;
67
+ isManaged(provider: LLMProvider): boolean;
68
+ /** Circuit breaker before any network touch (Gemini lesson: must run BEFORE token refresh). */
69
+ ensureUsable?(): Promise<void>;
70
+ /** Lock the upstream: mutate config.url / redirect / dispatcher. Runs once per attempt. */
71
+ lockUpstream?(config: any, provider: LLMProvider): Promise<void>;
72
+ /**
73
+ * Final header injection — called AFTER the request body is finalized, so
74
+ * body-derived headers (e.g. Codex session-id from prompt_cache_key) work.
75
+ * Returns the headers object to send. `config` is the per-attempt request
76
+ * config (optional for backward compatibility): a dispatch wrapper can
77
+ * select per-attempt credential material on it and the final header
78
+ * injection reads it back; hosts that predate the field leave wrappers to
79
+ * their own lockUpstream-saved state.
80
+ */
81
+ signRequest(input: {
82
+ headers: Record<string, string>;
83
+ requestBody: any;
84
+ provider: LLMProvider;
85
+ config?: any;
86
+ }): Promise<Record<string, string>>;
87
+ /**
88
+ * Classify an upstream failure into the shared taxonomy. Return null to let
89
+ * the next handler (built-in branches, then generic) deal with it.
90
+ */
91
+ classifyError?(status: number, body: unknown, systemText: string): PluginClassifiedError | null;
92
+ /** Persist a classified error (cooldown, lastError). Must never throw into the response path. */
93
+ noteUpstreamError?(info: PluginClassifiedError): Promise<void>;
94
+ /**
95
+ * Generic HTTP-200 hidden-error-envelope detector. When present, the core
96
+ * runs it against every parsed JSON 200 body and throws through the shared
97
+ * classification seam when it returns true — BEFORE the generic `error`
98
+ * field check, because some upstreams carry `{code,msg,data}` envelopes
99
+ * without an `error` key. This is a SECONDARY safety net for runtimes with
100
+ * a dispatch wrapper: rotation on such envelopes must happen inside the
101
+ * wrapper (before the response is returned); this hook only catches bodies
102
+ * a wrapper has already returned.
103
+ */
104
+ isErrorEnvelope?(body: unknown): boolean;
105
+ /**
106
+ * Optional bounded multi-attempt dispatcher (see PluginDispatchInput). When
107
+ * present the core calls it instead of performing its single attempt and
108
+ * forwards the returned response to the client. The wrapper MUST enforce a
109
+ * hard attempt bound and must never swallow client aborts.
110
+ */
111
+ dispatchRequest?(input: PluginDispatchInput): Promise<Response>;
112
+ /**
113
+ * Opt-in 401 handling: when set, the core performs ONE forced refresh and
114
+ * re-dispatch on 401 before classifying. `refresh` must persist rotated
115
+ * refresh tokens before the in-memory identity switches.
116
+ */
117
+ authRefresh?: {
118
+ forceRefresh(): Promise<void>;
119
+ };
120
+ /** Suppress the request/response debug logs for this provider (token hygiene). */
121
+ suppressDebugLog?: boolean;
122
+ }
123
+ /**
124
+ * Host capabilities handed to a plugin at activation. Plugins must use THESE
125
+ * for anything stateful (config reads/writes, runtime reload, directories) —
126
+ * bundling a copy of a core module would fork its in-process state.
127
+ */
128
+ export interface PluginHostCapabilities {
129
+ /** CCR config dir ($CCR_CONFIG_DIR), for the plugin's private credential file. */
130
+ configDir: string;
131
+ readConfig(): Promise<any>;
132
+ writeConfig(next: any): Promise<void>;
133
+ /**
134
+ * Read config WITHOUT env-var interpolation. Managed providers must do their
135
+ * read-modify-write against this: `readConfig` interpolates $VAR placeholders,
136
+ * so writing it back would bake env values into config.json. Optional for
137
+ * backward compatibility; hosts that predate it only offer `readConfig`.
138
+ */
139
+ readRawConfig?(): Promise<any>;
140
+ /**
141
+ * Re-resolve providers/transformers after a config write (server reload).
142
+ * The config argument is the JUST-WRITTEN config; passing it avoids a reread
143
+ * race between write and reload. Optional parameter for backward compat.
144
+ */
145
+ reloadRuntime(config?: any): Promise<void>;
146
+ /** undici Agent that bypasses CCR/proxy env routing (for fixed subscription origins). */
147
+ getDirectDispatcher(): unknown;
148
+ /**
149
+ * Dispatcher for fixed subscription origins honoring the explicit
150
+ * SUBSCRIPTION_PROXY_URL opt-in: the direct agent when unset, a ProxyAgent
151
+ * for the configured URL otherwise. Optional for backward compatibility —
152
+ * hosts that predate it only offer getDirectDispatcher (fully direct).
153
+ */
154
+ getSubscriptionDispatcher?(): unknown;
155
+ }
156
+ export interface PluginContext {
157
+ readonly manifest: PluginManifest;
158
+ readonly log: {
159
+ info(msg: string): void;
160
+ warn(msg: string): void;
161
+ error(msg: string): void;
162
+ };
163
+ readonly host: PluginHostCapabilities;
164
+ registerTransformer(cls: new () => any): void;
165
+ registerManagedRuntime(rt: ManagedRuntime): void;
166
+ registerAdminRoutes(fn: (app: FastifyInstance) => void): void;
167
+ registerConfigProtector(fn: (next: any, prev: any) => void): void;
168
+ /** Path to the prebuilt card chunk, relative to the plugin directory. */
169
+ registerUiCard(def: {
170
+ cardPath: string;
171
+ }): void;
172
+ registerLocales(bundle: Record<string, Record<string, unknown>>): void;
173
+ }
174
+ export interface LoadedPluginInfo {
175
+ name: string;
176
+ version: string;
177
+ enabled: true;
178
+ /** Served by the core at this URL for the UI to dynamic-import. */
179
+ cardUrl?: string;
180
+ locales?: Record<string, Record<string, unknown>>;
181
+ error?: string;
182
+ }
package/dist/server.d.ts CHANGED
@@ -6,6 +6,7 @@ import { TokenizerService } from "./services/tokenizer";
6
6
  import { router, calculateTokenCount, searchProjectBySession } from "./utils/router";
7
7
  import { sessionUsageCache } from "./utils/cache";
8
8
  import { ActiveProbeService } from "./services/active-probe";
9
+ import { PluginRegistry } from "./provider-plugins/registry";
9
10
  import type { CcrPreHandlerCallbacks } from "./ccr/request-pipeline";
10
11
  declare module "fastify" {
11
12
  interface FastifyRequest {
@@ -27,11 +28,18 @@ export interface ServerOptions extends FastifyServerOptions {
27
28
  }
28
29
  declare class Server {
29
30
  app: FastifyInstance;
31
+ readonly pluginRegistry: PluginRegistry;
32
+ private namespaceProviders;
33
+ /** Reload in place: registered namespaces must not retain stale provider maps. */
34
+ reloadProviders(config: any): void;
35
+ /** Explicit namespace-owned config update; never merge root provider authority. */
36
+ reloadNamespaceProviders(name: string, providers: any[]): void;
30
37
  configService: ConfigService;
31
38
  providerService: ProviderService;
32
39
  transformerService: TransformerService;
33
40
  tokenizerService: TokenizerService;
34
41
  activeProbeService?: ActiveProbeService;
42
+ /** Gemini OAuth (Antigravity) managed-provider auth service. */
35
43
  recordUsage?: (data: any) => void;
36
44
  private readonly readiness;
37
45
  private mainNamespaceRegistered;
@@ -20,7 +20,7 @@ export interface ActiveProbeConfig {
20
20
  /** Providers to exclude from active probing (e.g., providers without models endpoint) */
21
21
  excludeProviders?: string[];
22
22
  }
23
- export type ProviderProbeStatus = 'healthy' | 'slow' | 'error' | 'timeout';
23
+ export type ProviderProbeStatus = 'healthy' | 'slow' | 'error' | 'timeout' | 'skipped';
24
24
  export type ProviderProbeErrorKind = 'timeout' | 'network' | 'http';
25
25
  export type ProviderProbeSource = 'health' | 'manual' | 'rate-limit-headers';
26
26
  export interface ProviderProbeTelemetry {
@@ -36,6 +36,7 @@ export interface ProviderProbeTelemetry {
36
36
  }
37
37
  export interface ManualProbeResult {
38
38
  success: boolean;
39
+ skipped?: boolean;
39
40
  latencyMs: number;
40
41
  status: ProviderProbeStatus;
41
42
  isSlow: boolean;
@@ -62,7 +62,7 @@ export declare class ProviderHealthStore {
62
62
  * Check if a provider/model is available for routing
63
63
  * closed = available, half-open = available (lower priority), open = unavailable
64
64
  */
65
- isAvailable(provider: string, model: string): boolean;
65
+ isAvailable(provider: string, model: string, allowRecoveryProbe?: boolean): boolean;
66
66
  /**
67
67
  * Get health status priority for sorting
68
68
  * Returns: 0 = closed (best), 1 = half-open (ok), 2 = open (worst)
@@ -8,6 +8,8 @@ export declare class ProviderService {
8
8
  private providers;
9
9
  private modelRoutes;
10
10
  constructor(configService: ConfigService, transformerService: TransformerService, logger: any);
11
+ /** Preserve the object decorated into every Fastify namespace. */
12
+ reload(): void;
11
13
  private initializeCustomProviders;
12
14
  private initializeFromProvidersArray;
13
15
  registerProvider(request: RegisterProviderRequest): LLMProvider;
@@ -1,10 +1,16 @@
1
- import { ProxyAgent } from "undici";
1
+ import { Agent, ProxyAgent } from "undici";
2
2
  import type { ConfigService } from "./config";
3
3
  export interface ProxyAwareProvider {
4
4
  proxyEnabled?: boolean;
5
5
  proxy_enabled?: boolean;
6
6
  }
7
7
  export declare const PROXY_URL_KEYS: readonly ["HTTPS_PROXY", "https_proxy", "httpsProxy", "PROXY_URL"];
8
+ /** Explicit opt-in proxy for the subscription plugins' fixed origins (codex,
9
+ * gemini-oauth). Unlike PROXY_URL this is never applied implicitly and never
10
+ * read from the environment: unset keeps those plugins fully direct (the
11
+ * supported no-config deployment is an OS-level transparent proxy, e.g. TUN
12
+ * mode). Same http(s)-only contract as PROXY_URL. */
13
+ export declare const SUBSCRIPTION_PROXY_URL_KEY = "SUBSCRIPTION_PROXY_URL";
8
14
  export type ProxyUrlValidation = {
9
15
  ok: true;
10
16
  } | {
@@ -34,6 +40,18 @@ export declare function findInvalidProxyUrls(config: Record<string, unknown>): A
34
40
  key: string;
35
41
  error: string;
36
42
  }>;
43
+ /** A process-wide direct dispatcher, used by fixed-origin providers that must ignore configured proxies. */
44
+ export declare function getDirectDispatcher(): Agent;
45
+ /** Resolve the explicit subscription-proxy opt-in from live config. Only a
46
+ * string value counts: non-string config values (hand-edited booleans,
47
+ * numbers) mean "unset" — they must never become garbage proxy URLs. */
48
+ export declare function getSubscriptionProxyUrl(configService: Pick<ConfigService, "get">): string | undefined;
49
+ /** Dispatcher for the subscription plugins' fixed-origin calls: the shared
50
+ * direct agent when SUBSCRIPTION_PROXY_URL is unset, else the cached
51
+ * ProxyAgent for it. Unsupported protocols throw (same contract as
52
+ * getProxyDispatcher) so a typo fails loudly instead of silently sending
53
+ * subscription traffic directly. */
54
+ export declare function getSubscriptionDispatcher(proxyUrl: string | undefined): Agent | ProxyAgent;
37
55
  /**
38
56
  * Resolve the configured proxy URL using the compatibility key priority.
39
57
  */
@@ -5,6 +5,8 @@ export declare class TransformerService {
5
5
  private readonly logger;
6
6
  private transformers;
7
7
  constructor(configService: ConfigService, logger: any);
8
+ /** Construct without mutation so plugin activation can validate every service first. */
9
+ preparePluginTransformer(cls: new () => any): Transformer | TransformerConstructor;
8
10
  registerTransformer(name: string, transformer: Transformer): void;
9
11
  getTransformer(name: string): Transformer | TransformerConstructor | undefined;
10
12
  getAllTransformers(): Map<string, Transformer | TransformerConstructor>;
@@ -10,12 +10,6 @@ export declare class OpenAIResponsesTransformer implements Transformer {
10
10
  transformResponseOut(response: Response): Promise<Response>;
11
11
  private normalizeRequestContent;
12
12
  transformResponseIn(response: Response, context?: any): Promise<Response>;
13
- /**
14
- * Prepend a string chunk to the beginning of an existing ReadableStream.
15
- * Used when we've peeked at the first chunk and need to feed it back into
16
- * the converter along with the rest of the stream.
17
- */
18
- private prependToStream;
19
13
  /**
20
14
  * Convert an OpenAI Chat SSE stream to Responses API SSE events.
21
15
  * Handles choices[0].delta.content, choices[0].delta.tool_calls, and finish_reason.
@@ -199,6 +199,10 @@ export interface LLMProvider {
199
199
  wakeupEnabled?: boolean;
200
200
  wakeupTime?: string;
201
201
  wakeupModel?: string;
202
+ /** Set for CCR-managed subscription providers (config `ccr_managed`) so
203
+ * provider plugins can recognize their managed entries as one of their
204
+ * managed-provider signals (fixed upstream lock, own auth headers). */
205
+ pluginManaged?: boolean;
202
206
  }
203
207
  export type RegisterProviderRequest = LLMProvider;
204
208
  export interface ModelRoute {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wengine-ai/llms",
3
- "version": "2.3.2414",
3
+ "version": "2.3.2415",
4
4
  "description": "A universal LLM API transformation server",
5
5
  "main": "dist/cjs/server.cjs",
6
6
  "module": "dist/esm/server.mjs",
@@ -64,7 +64,7 @@
64
64
  "uuid": "^11.1.0",
65
65
  "@fastify/multipart": "^9.0.0",
66
66
  "@fastify/static": "^8.2.0",
67
- "@wengine-ai/claude-code-router-shared": "^2.3.2414",
67
+ "@wengine-ai/claude-code-router-shared": "^2.3.2415",
68
68
  "adm-zip": "^0.5.16",
69
69
  "better-sqlite3": "^12.10.0",
70
70
  "rotating-file-stream": "^3.2.7"
@@ -1 +0,0 @@
1
- {"root":["./src/server.ts","./src/api/middleware.ts","./src/api/routes.ts","./src/plugins/index.ts","./src/plugins/plugin-manager.ts","./src/plugins/token-speed.ts","./src/plugins/types.ts","./src/plugins/output/console-handler.ts","./src/plugins/output/index.ts","./src/plugins/output/output-manager.ts","./src/plugins/output/temp-file-handler.ts","./src/plugins/output/types.ts","./src/plugins/output/webhook-handler.ts","./src/services/active-probe.ts","./src/services/config.ts","./src/services/provider-health.ts","./src/services/provider.ts","./src/services/quota-adapters.ts","./src/services/quota-store.ts","./src/services/rate-limit.ts","./src/services/tokenizer.ts","./src/services/transformer.ts","./src/tokenizer/api-tokenizer.ts","./src/tokenizer/huggingface-tokenizer.ts","./src/tokenizer/tiktoken-tokenizer.ts","./src/transformer/anthropic.transformer.ts","./src/transformer/cerebras.transformer.ts","./src/transformer/cleancache.transformer.ts","./src/transformer/customparams.transformer.ts","./src/transformer/deepseek.transformer.ts","./src/transformer/enhancetool.transformer.ts","./src/transformer/forcereasoning.transformer.ts","./src/transformer/gemini.transformer.ts","./src/transformer/groq.transformer.ts","./src/transformer/index.ts","./src/transformer/kimi.transformer.ts","./src/transformer/maxcompletiontokens.transformer.ts","./src/transformer/maxtoken.transformer.ts","./src/transformer/openai.responses.transformer.ts","./src/transformer/openai.transformer.ts","./src/transformer/openrouter.transformer.ts","./src/transformer/reasoning.transformer.ts","./src/transformer/sampling.transformer.ts","./src/transformer/streamoptions.transformer.ts","./src/transformer/tooluse.transformer.ts","./src/transformer/vercel.transformer.ts","./src/transformer/vertex-claude.transformer.ts","./src/transformer/vertex-gemini.transformer.ts","./src/types/llm.ts","./src/types/tokenizer.d.ts","./src/types/transformer.ts","./src/utils/cache.ts","./src/utils/converter.ts","./src/utils/gemini.util.ts","./src/utils/image.ts","./src/utils/request.ts","./src/utils/router.ts","./src/utils/thinking.ts","./src/utils/toolargumentsparser.ts","./src/utils/vertex-claude.util.ts","./src/utils/sse/sseparser.transform.ts","./src/utils/sse/sseserializer.transform.ts","./src/utils/sse/index.ts","./src/utils/sse/rewritestream.ts"],"errors":true,"version":"5.9.3"}