atom-lite 0.0.0-stage → 0.1.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.
Files changed (175) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/LICENSE +21 -0
  3. package/README.md +265 -2
  4. package/dist/agent/loop.d.ts +30 -0
  5. package/dist/agent/loop.js +199 -0
  6. package/dist/agent/loop.js.map +1 -0
  7. package/dist/agent/types.d.ts +85 -0
  8. package/dist/agent/types.js +2 -0
  9. package/dist/agent/types.js.map +1 -0
  10. package/dist/cli/app.d.ts +1 -0
  11. package/dist/cli/app.js +1060 -0
  12. package/dist/cli/app.js.map +1 -0
  13. package/dist/cli/approvals.d.ts +1 -0
  14. package/dist/cli/approvals.js +2 -0
  15. package/dist/cli/approvals.js.map +1 -0
  16. package/dist/cli/banner.d.ts +8 -0
  17. package/dist/cli/banner.js +29 -0
  18. package/dist/cli/banner.js.map +1 -0
  19. package/dist/cli/commands.d.ts +19 -0
  20. package/dist/cli/commands.js +61 -0
  21. package/dist/cli/commands.js.map +1 -0
  22. package/dist/cli/main.d.ts +2 -0
  23. package/dist/cli/main.js +22 -0
  24. package/dist/cli/main.js.map +1 -0
  25. package/dist/cli/picker.d.ts +26 -0
  26. package/dist/cli/picker.js +175 -0
  27. package/dist/cli/picker.js.map +1 -0
  28. package/dist/cli/renderer.d.ts +1 -0
  29. package/dist/cli/renderer.js +5 -0
  30. package/dist/cli/renderer.js.map +1 -0
  31. package/dist/cli/secret-input.d.ts +21 -0
  32. package/dist/cli/secret-input.js +101 -0
  33. package/dist/cli/secret-input.js.map +1 -0
  34. package/dist/cli/status-line.d.ts +18 -0
  35. package/dist/cli/status-line.js +35 -0
  36. package/dist/cli/status-line.js.map +1 -0
  37. package/dist/cli/stream-text.d.ts +22 -0
  38. package/dist/cli/stream-text.js +50 -0
  39. package/dist/cli/stream-text.js.map +1 -0
  40. package/dist/cli/transcript.d.ts +17 -0
  41. package/dist/cli/transcript.js +40 -0
  42. package/dist/cli/transcript.js.map +1 -0
  43. package/dist/config/credentials.d.ts +26 -0
  44. package/dist/config/credentials.js +79 -0
  45. package/dist/config/credentials.js.map +1 -0
  46. package/dist/config/defaults.d.ts +24 -0
  47. package/dist/config/defaults.js +25 -0
  48. package/dist/config/defaults.js.map +1 -0
  49. package/dist/config/load.d.ts +7 -0
  50. package/dist/config/load.js +105 -0
  51. package/dist/config/load.js.map +1 -0
  52. package/dist/config/paths.d.ts +4 -0
  53. package/dist/config/paths.js +14 -0
  54. package/dist/config/paths.js.map +1 -0
  55. package/dist/config/schema.d.ts +83 -0
  56. package/dist/config/schema.js +52 -0
  57. package/dist/config/schema.js.map +1 -0
  58. package/dist/config/write.d.ts +18 -0
  59. package/dist/config/write.js +61 -0
  60. package/dist/config/write.js.map +1 -0
  61. package/dist/context/budget.d.ts +2 -0
  62. package/dist/context/budget.js +13 -0
  63. package/dist/context/budget.js.map +1 -0
  64. package/dist/context/compaction.d.ts +1 -0
  65. package/dist/context/compaction.js +5 -0
  66. package/dist/context/compaction.js.map +1 -0
  67. package/dist/context/instructions.d.ts +3 -0
  68. package/dist/context/instructions.js +30 -0
  69. package/dist/context/instructions.js.map +1 -0
  70. package/dist/context/manager.d.ts +29 -0
  71. package/dist/context/manager.js +122 -0
  72. package/dist/context/manager.js.map +1 -0
  73. package/dist/index.d.ts +16 -0
  74. package/dist/index.js +16 -0
  75. package/dist/index.js.map +1 -0
  76. package/dist/providers/catalog.d.ts +60 -0
  77. package/dist/providers/catalog.js +289 -0
  78. package/dist/providers/catalog.js.map +1 -0
  79. package/dist/providers/context-window.d.ts +11 -0
  80. package/dist/providers/context-window.js +87 -0
  81. package/dist/providers/context-window.js.map +1 -0
  82. package/dist/providers/factory.d.ts +2 -0
  83. package/dist/providers/factory.js +54 -0
  84. package/dist/providers/factory.js.map +1 -0
  85. package/dist/providers/fake.d.ts +14 -0
  86. package/dist/providers/fake.js +23 -0
  87. package/dist/providers/fake.js.map +1 -0
  88. package/dist/providers/gemini.d.ts +24 -0
  89. package/dist/providers/gemini.js +228 -0
  90. package/dist/providers/gemini.js.map +1 -0
  91. package/dist/providers/index.d.ts +5 -0
  92. package/dist/providers/index.js +4 -0
  93. package/dist/providers/index.js.map +1 -0
  94. package/dist/providers/ollama.d.ts +64 -0
  95. package/dist/providers/ollama.js +433 -0
  96. package/dist/providers/ollama.js.map +1 -0
  97. package/dist/providers/openai-compatible.d.ts +27 -0
  98. package/dist/providers/openai-compatible.js +282 -0
  99. package/dist/providers/openai-compatible.js.map +1 -0
  100. package/dist/providers/registry.d.ts +7 -0
  101. package/dist/providers/registry.js +13 -0
  102. package/dist/providers/registry.js.map +1 -0
  103. package/dist/providers/tool-calls.d.ts +18 -0
  104. package/dist/providers/tool-calls.js +42 -0
  105. package/dist/providers/tool-calls.js.map +1 -0
  106. package/dist/providers/types.d.ts +16 -0
  107. package/dist/providers/types.js +2 -0
  108. package/dist/providers/types.js.map +1 -0
  109. package/dist/runtime/approvals.d.ts +20 -0
  110. package/dist/runtime/approvals.js +20 -0
  111. package/dist/runtime/approvals.js.map +1 -0
  112. package/dist/runtime/locks.d.ts +13 -0
  113. package/dist/runtime/locks.js +180 -0
  114. package/dist/runtime/locks.js.map +1 -0
  115. package/dist/runtime/scheduler.d.ts +7 -0
  116. package/dist/runtime/scheduler.js +103 -0
  117. package/dist/runtime/scheduler.js.map +1 -0
  118. package/dist/security/paths.d.ts +1 -0
  119. package/dist/security/paths.js +35 -0
  120. package/dist/security/paths.js.map +1 -0
  121. package/dist/security/process.d.ts +1 -0
  122. package/dist/security/process.js +8 -0
  123. package/dist/security/process.js.map +1 -0
  124. package/dist/security/redaction.d.ts +1 -0
  125. package/dist/security/redaction.js +4 -0
  126. package/dist/security/redaction.js.map +1 -0
  127. package/dist/sessions/events.d.ts +21 -0
  128. package/dist/sessions/events.js +87 -0
  129. package/dist/sessions/events.js.map +1 -0
  130. package/dist/sessions/index.d.ts +3 -0
  131. package/dist/sessions/index.js +4 -0
  132. package/dist/sessions/index.js.map +1 -0
  133. package/dist/sessions/recovery.d.ts +6 -0
  134. package/dist/sessions/recovery.js +35 -0
  135. package/dist/sessions/recovery.js.map +1 -0
  136. package/dist/sessions/store.d.ts +91 -0
  137. package/dist/sessions/store.js +356 -0
  138. package/dist/sessions/store.js.map +1 -0
  139. package/dist/skills/registry.d.ts +23 -0
  140. package/dist/skills/registry.js +129 -0
  141. package/dist/skills/registry.js.map +1 -0
  142. package/dist/tools/bash.d.ts +2 -0
  143. package/dist/tools/bash.js +159 -0
  144. package/dist/tools/bash.js.map +1 -0
  145. package/dist/tools/diff.d.ts +7 -0
  146. package/dist/tools/diff.js +40 -0
  147. package/dist/tools/diff.js.map +1 -0
  148. package/dist/tools/edit.d.ts +2 -0
  149. package/dist/tools/edit.js +117 -0
  150. package/dist/tools/edit.js.map +1 -0
  151. package/dist/tools/index.d.ts +8 -0
  152. package/dist/tools/index.js +8 -0
  153. package/dist/tools/index.js.map +1 -0
  154. package/dist/tools/read.d.ts +2 -0
  155. package/dist/tools/read.js +138 -0
  156. package/dist/tools/read.js.map +1 -0
  157. package/dist/tools/registry.d.ts +7 -0
  158. package/dist/tools/registry.js +13 -0
  159. package/dist/tools/registry.js.map +1 -0
  160. package/dist/tools/types.d.ts +27 -0
  161. package/dist/tools/types.js +2 -0
  162. package/dist/tools/types.js.map +1 -0
  163. package/dist/tools/webfetch.d.ts +2 -0
  164. package/dist/tools/webfetch.js +97 -0
  165. package/dist/tools/webfetch.js.map +1 -0
  166. package/dist/tools/websearch.d.ts +2 -0
  167. package/dist/tools/websearch.js +88 -0
  168. package/dist/tools/websearch.js.map +1 -0
  169. package/dist/tools/write.d.ts +2 -0
  170. package/dist/tools/write.js +91 -0
  171. package/dist/tools/write.js.map +1 -0
  172. package/dist/types.d.ts +83 -0
  173. package/dist/types.js +10 -0
  174. package/dist/types.js.map +1 -0
  175. package/package.json +74 -4
@@ -0,0 +1,289 @@
1
+ import { loadCredentials } from "../config/credentials.js";
2
+ import { createProvider } from "./factory.js";
3
+ const GPT_FALLBACKS = [
4
+ "gpt-4o-mini",
5
+ "gpt-4o",
6
+ "gpt-4.1-mini",
7
+ "gpt-4.1",
8
+ "o4-mini",
9
+ "o3",
10
+ ];
11
+ const CLAUDE_FALLBACKS = [
12
+ "claude-sonnet-4-20250514",
13
+ "claude-3-7-sonnet-latest",
14
+ "claude-3-5-haiku-latest",
15
+ ];
16
+ const GEMINI_FALLBACKS = ["gemini-2.5-flash", "gemini-2.5-pro", "gemini-2.0-flash"];
17
+ /**
18
+ * Curated provider catalog. Hosted providers use the OpenAI-compatible adapter
19
+ * (Anthropic exposes an OpenAI-compatible endpoint); Gemini uses its native
20
+ * adapter; local runtimes are keyless.
21
+ */
22
+ export const PROVIDER_PRESETS = [
23
+ {
24
+ id: "kilo",
25
+ label: "Kilo Gateway",
26
+ description: "Free hosted gateway (no key required)",
27
+ type: "openai-compatible",
28
+ baseUrl: "https://api.kilo.ai/api/gateway",
29
+ model: "kilo-auto/free",
30
+ requiresKey: false,
31
+ fallbackModels: ["kilo-auto/free"],
32
+ },
33
+ {
34
+ id: "openai",
35
+ label: "OpenAI",
36
+ description: "Official OpenAI API",
37
+ type: "openai-compatible",
38
+ baseUrl: "https://api.openai.com/v1",
39
+ model: "gpt-4o-mini",
40
+ requiresKey: true,
41
+ keyEnv: "OPENAI_API_KEY",
42
+ keyUrl: "https://platform.openai.com/api-keys",
43
+ fallbackModels: GPT_FALLBACKS,
44
+ },
45
+ {
46
+ id: "anthropic",
47
+ label: "Anthropic",
48
+ description: "Claude via Anthropic's OpenAI-compatible endpoint",
49
+ type: "openai-compatible",
50
+ baseUrl: "https://api.anthropic.com/v1",
51
+ model: "claude-sonnet-4-20250514",
52
+ requiresKey: true,
53
+ keyEnv: "ANTHROPIC_API_KEY",
54
+ keyUrl: "https://console.anthropic.com/settings/keys",
55
+ headers: { "anthropic-version": "2023-06-01" },
56
+ fallbackModels: CLAUDE_FALLBACKS,
57
+ },
58
+ {
59
+ id: "google",
60
+ label: "Google Gemini",
61
+ description: "Official Gemini API",
62
+ type: "gemini",
63
+ baseUrl: "https://generativelanguage.googleapis.com",
64
+ model: "gemini-2.5-flash",
65
+ requiresKey: true,
66
+ keyEnv: "GEMINI_API_KEY",
67
+ keyUrl: "https://aistudio.google.com/app/apikey",
68
+ fallbackModels: GEMINI_FALLBACKS,
69
+ },
70
+ {
71
+ id: "openrouter",
72
+ label: "OpenRouter",
73
+ description: "Many hosted models through one key",
74
+ type: "openai-compatible",
75
+ baseUrl: "https://openrouter.ai/api/v1",
76
+ model: "openai/gpt-4o-mini",
77
+ requiresKey: true,
78
+ keyEnv: "OPENROUTER_API_KEY",
79
+ keyUrl: "https://openrouter.ai/keys",
80
+ fallbackModels: ["openai/gpt-4o-mini", "anthropic/claude-sonnet-4", "google/gemini-2.5-flash"],
81
+ },
82
+ {
83
+ id: "groq",
84
+ label: "Groq",
85
+ description: "Fast hosted inference",
86
+ type: "openai-compatible",
87
+ baseUrl: "https://api.groq.com/openai/v1",
88
+ model: "llama-3.3-70b-versatile",
89
+ requiresKey: true,
90
+ keyEnv: "GROQ_API_KEY",
91
+ keyUrl: "https://console.groq.com/keys",
92
+ fallbackModels: ["llama-3.3-70b-versatile", "llama-3.1-8b-instant"],
93
+ },
94
+ {
95
+ id: "mistral",
96
+ label: "Mistral",
97
+ description: "Official Mistral API",
98
+ type: "openai-compatible",
99
+ baseUrl: "https://api.mistral.ai/v1",
100
+ model: "mistral-large-latest",
101
+ requiresKey: true,
102
+ keyEnv: "MISTRAL_API_KEY",
103
+ keyUrl: "https://console.mistral.ai/api-keys",
104
+ fallbackModels: ["mistral-large-latest", "mistral-small-latest", "codestral-latest"],
105
+ },
106
+ {
107
+ id: "xai",
108
+ label: "xAI",
109
+ description: "Grok models",
110
+ type: "openai-compatible",
111
+ baseUrl: "https://api.x.ai/v1",
112
+ model: "grok-3-mini",
113
+ requiresKey: true,
114
+ keyEnv: "XAI_API_KEY",
115
+ keyUrl: "https://console.x.ai",
116
+ fallbackModels: ["grok-3-mini", "grok-3", "grok-2-latest"],
117
+ },
118
+ {
119
+ id: "ollama",
120
+ label: "Ollama",
121
+ description: "Local Ollama runtime",
122
+ type: "ollama",
123
+ baseUrl: "http://127.0.0.1:11434",
124
+ model: "qwen2.5-coder:7b",
125
+ requiresKey: false,
126
+ local: true,
127
+ fallbackModels: ["qwen2.5-coder:7b", "llama3.2:3b"],
128
+ },
129
+ {
130
+ id: "lmstudio",
131
+ label: "LM Studio",
132
+ description: "Local OpenAI-compatible server",
133
+ type: "openai-compatible",
134
+ baseUrl: "http://127.0.0.1:1234/v1",
135
+ model: "local-model",
136
+ requiresKey: false,
137
+ local: true,
138
+ fallbackModels: ["local-model"],
139
+ },
140
+ {
141
+ id: "llamacpp",
142
+ label: "llama.cpp",
143
+ description: "Local llama-server endpoint",
144
+ type: "openai-compatible",
145
+ baseUrl: "http://127.0.0.1:8080/v1",
146
+ model: "local-model",
147
+ requiresKey: false,
148
+ local: true,
149
+ fallbackModels: ["local-model"],
150
+ },
151
+ ];
152
+ export function getPreset(id) {
153
+ return PROVIDER_PRESETS.find((p) => p.id === id);
154
+ }
155
+ /**
156
+ * Build the provider profile stored in config from a preset, preserving any
157
+ * model the user already chose.
158
+ */
159
+ export function materializeProviderConfig(preset, existing) {
160
+ const out = {
161
+ type: preset.type,
162
+ model: existing?.model ??
163
+ preset.model,
164
+ apiKeyEnv: preset.keyEnv ?? null,
165
+ };
166
+ if (preset.baseUrl)
167
+ out.baseUrl = existing?.baseUrl ?? preset.baseUrl;
168
+ if (preset.headers)
169
+ out.headers = { ...preset.headers, ...(existing?.headers ?? {}) };
170
+ return out;
171
+ }
172
+ /**
173
+ * Provider profiles that should appear in `/model`: explicitly configured
174
+ * profiles, profiles with a stored credential, and presets whose key is in the
175
+ * environment.
176
+ */
177
+ export function availableProviderNames(config, credentialsPath) {
178
+ const names = new Set();
179
+ for (const [name, profile] of Object.entries(config.providers)) {
180
+ if (profile && typeof profile === "object")
181
+ names.add(name);
182
+ }
183
+ const creds = loadCredentials(credentialsPath);
184
+ for (const name of Object.keys(creds.apiKeys)) {
185
+ if (getPreset(name))
186
+ names.add(name);
187
+ }
188
+ for (const preset of PROVIDER_PRESETS) {
189
+ if (preset.keyEnv && process.env[preset.keyEnv])
190
+ names.add(preset.id);
191
+ }
192
+ return [...names];
193
+ }
194
+ export function providerLabel(id) {
195
+ return getPreset(id)?.label ?? id;
196
+ }
197
+ /** Filter out models that clearly cannot be used for a chat/tool call. */
198
+ export function isLikelyChatModel(id) {
199
+ return !/embedding|embed-|whisper|tts|dall-e|moderation|imagen|veo|audio|realtime|transcribe/i.test(id);
200
+ }
201
+ export async function withTimeout(promise, ms) {
202
+ let timer;
203
+ try {
204
+ return await Promise.race([
205
+ promise,
206
+ new Promise((_, reject) => {
207
+ timer = setTimeout(() => reject(new Error("TIMEOUT")), ms);
208
+ }),
209
+ ]);
210
+ }
211
+ finally {
212
+ if (timer)
213
+ clearTimeout(timer);
214
+ }
215
+ }
216
+ /**
217
+ * Ask a configured provider for its models. Failures are returned as an empty
218
+ * list so callers can fall back to the configured model.
219
+ */
220
+ export async function listModelsForProvider(config, profile, timeoutMs = 8000) {
221
+ try {
222
+ const adapter = createProvider(config, profile);
223
+ if (typeof adapter.listModels !== "function")
224
+ return [];
225
+ const models = (await withTimeout(adapter.listModels(), timeoutMs));
226
+ return models.filter((m) => typeof m === "string" && m && isLikelyChatModel(m));
227
+ }
228
+ catch {
229
+ return [];
230
+ }
231
+ }
232
+ /**
233
+ * Validate an API key before persisting it. Reaches the provider's model list
234
+ * endpoint directly so auth failures are visible (the adapters intentionally
235
+ * swallow list errors and fall back to the configured model).
236
+ */
237
+ export async function probeApiKey(preset, apiKey, timeoutMs = 10000) {
238
+ const controller = new AbortController();
239
+ const timer = setTimeout(() => controller.abort(), timeoutMs);
240
+ try {
241
+ if (preset.type === "gemini") {
242
+ const base = (preset.baseUrl ?? "https://generativelanguage.googleapis.com").replace(/\/$/, "");
243
+ const res = await fetch(`${base}/v1beta/models?key=${encodeURIComponent(apiKey)}`, { signal: controller.signal });
244
+ if (res.status === 401 || res.status === 403) {
245
+ return { ok: false, invalid: true, models: [], error: `HTTP ${res.status}` };
246
+ }
247
+ if (!res.ok) {
248
+ return { ok: false, invalid: false, models: [], error: `HTTP ${res.status}` };
249
+ }
250
+ const json = (await res.json());
251
+ const models = (json.models ?? [])
252
+ .map((m) => String(m.name ?? "").replace(/^models\//, ""))
253
+ .filter((m) => m && isLikelyChatModel(m));
254
+ return { ok: true, invalid: false, models };
255
+ }
256
+ const base = (preset.baseUrl ?? "").replace(/\/$/, "");
257
+ const res = await fetch(`${base}/models`, {
258
+ headers: {
259
+ Authorization: `Bearer ${apiKey}`,
260
+ ...(preset.headers ?? {}),
261
+ },
262
+ signal: controller.signal,
263
+ });
264
+ if (res.status === 401 || res.status === 403) {
265
+ return { ok: false, invalid: true, models: [], error: `HTTP ${res.status}` };
266
+ }
267
+ if (!res.ok) {
268
+ return { ok: false, invalid: false, models: [], error: `HTTP ${res.status}` };
269
+ }
270
+ const json = (await res.json());
271
+ const data = json.data ?? json.models ?? [];
272
+ const models = data
273
+ .map((m) => String(m.id ?? m.name ?? ""))
274
+ .filter((m) => m && isLikelyChatModel(m));
275
+ return { ok: true, invalid: false, models };
276
+ }
277
+ catch (err) {
278
+ return {
279
+ ok: false,
280
+ invalid: false,
281
+ models: [],
282
+ error: err instanceof Error ? err.message : String(err),
283
+ };
284
+ }
285
+ finally {
286
+ clearTimeout(timer);
287
+ }
288
+ }
289
+ //# sourceMappingURL=catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../src/providers/catalog.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,0BAA0B,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAuB9C,MAAM,aAAa,GAAG;IACpB,aAAa;IACb,QAAQ;IACR,cAAc;IACd,SAAS;IACT,SAAS;IACT,IAAI;CACL,CAAC;AAEF,MAAM,gBAAgB,GAAG;IACvB,0BAA0B;IAC1B,0BAA0B;IAC1B,yBAAyB;CAC1B,CAAC;AAEF,MAAM,gBAAgB,GAAG,CAAC,kBAAkB,EAAE,gBAAgB,EAAE,kBAAkB,CAAC,CAAC;AAEpF;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAqB;IAChD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,cAAc;QACrB,WAAW,EAAE,uCAAuC;QACpD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,iCAAiC;QAC1C,KAAK,EAAE,gBAAgB;QACvB,WAAW,EAAE,KAAK;QAClB,cAAc,EAAE,CAAC,gBAAgB,CAAC;KACnC;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,qBAAqB;QAClC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,2BAA2B;QACpC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,sCAAsC;QAC9C,cAAc,EAAE,aAAa;KAC9B;IACD;QACE,EAAE,EAAE,WAAW;QACf,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,mDAAmD;QAChE,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,8BAA8B;QACvC,KAAK,EAAE,0BAA0B;QACjC,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,mBAAmB;QAC3B,MAAM,EAAE,6CAA6C;QACrD,OAAO,EAAE,EAAE,mBAAmB,EAAE,YAAY,EAAE;QAC9C,cAAc,EAAE,gBAAgB;KACjC;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,eAAe;QACtB,WAAW,EAAE,qBAAqB;QAClC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,2CAA2C;QACpD,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,gBAAgB;QACxB,MAAM,EAAE,wCAAwC;QAChD,cAAc,EAAE,gBAAgB;KACjC;IACD;QACE,EAAE,EAAE,YAAY;QAChB,KAAK,EAAE,YAAY;QACnB,WAAW,EAAE,oCAAoC;QACjD,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,8BAA8B;QACvC,KAAK,EAAE,oBAAoB;QAC3B,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,oBAAoB;QAC5B,MAAM,EAAE,4BAA4B;QACpC,cAAc,EAAE,CAAC,oBAAoB,EAAE,2BAA2B,EAAE,yBAAyB,CAAC;KAC/F;IACD;QACE,EAAE,EAAE,MAAM;QACV,KAAK,EAAE,MAAM;QACb,WAAW,EAAE,uBAAuB;QACpC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,gCAAgC;QACzC,KAAK,EAAE,yBAAyB;QAChC,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,cAAc;QACtB,MAAM,EAAE,+BAA+B;QACvC,cAAc,EAAE,CAAC,yBAAyB,EAAE,sBAAsB,CAAC;KACpE;IACD;QACE,EAAE,EAAE,SAAS;QACb,KAAK,EAAE,SAAS;QAChB,WAAW,EAAE,sBAAsB;QACnC,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,2BAA2B;QACpC,KAAK,EAAE,sBAAsB;QAC7B,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,iBAAiB;QACzB,MAAM,EAAE,qCAAqC;QAC7C,cAAc,EAAE,CAAC,sBAAsB,EAAE,sBAAsB,EAAE,kBAAkB,CAAC;KACrF;IACD;QACE,EAAE,EAAE,KAAK;QACT,KAAK,EAAE,KAAK;QACZ,WAAW,EAAE,aAAa;QAC1B,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,qBAAqB;QAC9B,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,IAAI;QACjB,MAAM,EAAE,aAAa;QACrB,MAAM,EAAE,sBAAsB;QAC9B,cAAc,EAAE,CAAC,aAAa,EAAE,QAAQ,EAAE,eAAe,CAAC;KAC3D;IACD;QACE,EAAE,EAAE,QAAQ;QACZ,KAAK,EAAE,QAAQ;QACf,WAAW,EAAE,sBAAsB;QACnC,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,wBAAwB;QACjC,KAAK,EAAE,kBAAkB;QACzB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,CAAC,kBAAkB,EAAE,aAAa,CAAC;KACpD;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,gCAAgC;QAC7C,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC;IACD;QACE,EAAE,EAAE,UAAU;QACd,KAAK,EAAE,WAAW;QAClB,WAAW,EAAE,6BAA6B;QAC1C,IAAI,EAAE,mBAAmB;QACzB,OAAO,EAAE,0BAA0B;QACnC,KAAK,EAAE,aAAa;QACpB,WAAW,EAAE,KAAK;QAClB,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,CAAC,aAAa,CAAC;KAChC;CACF,CAAC;AAEF,MAAM,UAAU,SAAS,CAAC,EAAU;IAClC,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;AACnD,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAAsB,EACtB,QAAkC;IAElC,MAAM,GAAG,GAA4B;QACnC,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,KAAK,EACF,QAAQ,EAAE,KAA4B;YACvC,MAAM,CAAC,KAAK;QACd,SAAS,EAAE,MAAM,CAAC,MAAM,IAAI,IAAI;KACjC,CAAC;IACF,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,QAAQ,EAAE,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC;IACtE,IAAI,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,OAAO,GAAG,EAAE,GAAG,MAAM,CAAC,OAAO,EAAE,GAAG,CAAC,QAAQ,EAAE,OAAiB,IAAI,EAAE,CAAC,EAAE,CAAC;IAChG,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAc,EACd,eAAwB;IAExB,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,EAAE,CAAC;QAC/D,IAAI,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC9D,CAAC;IACD,MAAM,KAAK,GAAG,eAAe,CAAC,eAAe,CAAC,CAAC;IAC/C,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9C,IAAI,SAAS,CAAC,IAAI,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACvC,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACtC,IAAI,MAAM,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,EAAU;IACtC,OAAO,SAAS,CAAC,EAAE,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC;AACpC,CAAC;AAED,0EAA0E;AAC1E,MAAM,UAAU,iBAAiB,CAAC,EAAU;IAC1C,OAAO,CAAC,sFAAsF,CAAC,IAAI,CACjG,EAAE,CACH,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,OAAmB,EACnB,EAAU;IAEV,IAAI,KAAgD,CAAC;IACrD,IAAI,CAAC;QACH,OAAO,MAAM,OAAO,CAAC,IAAI,CAAC;YACxB,OAAO;YACP,IAAI,OAAO,CAAI,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;gBAC3B,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC7D,CAAC,CAAC;SACH,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,IAAI,KAAK;YAAE,YAAY,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,qBAAqB,CACzC,MAAc,EACd,OAAe,EACf,SAAS,GAAG,IAAI;IAEhB,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,cAAc,CAAC,MAAM,EAAE,OAAO,CAAQ,CAAC;QACvD,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,UAAU;YAAE,OAAO,EAAE,CAAC;QACxD,MAAM,MAAM,GAAG,CAAC,MAAM,WAAW,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAa,CAAC;QAChF,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAUD;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAC/B,MAAsB,EACtB,MAAc,EACd,SAAS,GAAG,KAAK;IAEjB,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,SAAS,CAAC,CAAC;IAC9D,IAAI,CAAC;QACH,IAAI,MAAM,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAC7B,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,2CAA2C,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAChG,MAAM,GAAG,GAAG,MAAM,KAAK,CACrB,GAAG,IAAI,sBAAsB,kBAAkB,CAAC,MAAM,CAAC,EAAE,EACzD,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAC9B,CAAC;YACF,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/E,CAAC;YACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;gBACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;YAChF,CAAC;YACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAQ,CAAC;YACvC,MAAM,MAAM,GAAG,CAAC,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;iBAC/B,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;iBAC9D,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;YACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;QAC9C,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QACvD,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,IAAI,SAAS,EAAE;YACxC,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,MAAM,EAAE;gBACjC,GAAG,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC;aAC1B;YACD,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QACH,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;YAC7C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAC/E,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;YACZ,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,EAAE,EAAE,KAAK,EAAE,QAAQ,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC;QAChF,CAAC;QACD,MAAM,IAAI,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,CAAQ,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,IAAI,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAG,IAAI;aAChB,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;aAC7C,MAAM,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,IAAI,iBAAiB,CAAC,CAAC,CAAC,CAAC,CAAC;QACpD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,OAAO;YACL,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,KAAK;YACd,MAAM,EAAE,EAAE;YACV,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;SACxD,CAAC;IACJ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /** Extract a context window from an OpenAI-compatible /models entry. */
2
+ export declare function contextWindowFromModelEntry(entry: unknown): number | undefined;
3
+ /** Compact token count used by the status line: 999, 1.2k, 256k, 1M. */
4
+ export declare function formatTokenCount(count: number): string;
5
+ /**
6
+ * Render `used/window`, matching the compact peer style (`1.2k/256k`).
7
+ * Unknown values are shown as `?` rather than a fake number.
8
+ */
9
+ export declare function formatContextUsage(used: number | undefined, window: number | undefined): string;
10
+ /** Guess a context window from the model id when no metadata is available. */
11
+ export declare function knownContextWindow(model: string | undefined): number | undefined;
@@ -0,0 +1,87 @@
1
+ // Context-window metadata helpers. A model's window is resolved from (in
2
+ // order): an explicit provider config override, live provider metadata, or the
3
+ // known-model table below.
4
+ /** Extract a context window from an OpenAI-compatible /models entry. */
5
+ export function contextWindowFromModelEntry(entry) {
6
+ if (!entry || typeof entry !== "object")
7
+ return undefined;
8
+ const e = entry;
9
+ const candidates = [
10
+ e.context_length,
11
+ e.context_window,
12
+ e.contextWindow,
13
+ e.max_context_length,
14
+ e.max_context_window,
15
+ e.limits?.context,
16
+ e.top_provider?.context_length,
17
+ e.top_provider?.context_window,
18
+ ];
19
+ for (const value of candidates) {
20
+ if (typeof value === "number" && Number.isFinite(value) && value > 0) {
21
+ return Math.floor(value);
22
+ }
23
+ }
24
+ return undefined;
25
+ }
26
+ /**
27
+ * Best-effort context windows for models whose provider does not expose one.
28
+ * Most specific patterns come first. These are display/compaction defaults and
29
+ * are always overridden by live provider metadata when available.
30
+ */
31
+ const KNOWN_WINDOWS = [
32
+ [/gpt-4\.1/, 1_047_576],
33
+ [/gpt-4o|gpt-4-turbo|gpt-4-0125|gpt-4-1106/, 128_000],
34
+ [/o3|o4-mini/, 200_000],
35
+ [/gpt-3\.5/, 16_385],
36
+ [/claude/, 200_000],
37
+ [/gemini-1\.5-pro/, 2_097_152],
38
+ [/gemini-1\.5|gemini-2/, 1_048_576],
39
+ [/grok/, 131_072],
40
+ [/codestral/, 256_000],
41
+ [/mistral-large/, 128_000],
42
+ [/llama-3|llama3|llama-4|mixtral|deepseek|qwen/, 131_072],
43
+ [/kilo-auto\/free/, 256_000],
44
+ [/kilo-auto\/efficient/, 1_000_000],
45
+ ];
46
+ /** Compact token count used by the status line: 999, 1.2k, 256k, 1M. */
47
+ export function formatTokenCount(count) {
48
+ if (!Number.isFinite(count) || count < 0)
49
+ return "0";
50
+ const n = Math.floor(count);
51
+ if (n < 1000)
52
+ return String(n);
53
+ if (n < 1_000_000) {
54
+ if (n < 10_000) {
55
+ const k = (n / 1000).toFixed(1).replace(/\.0$/, "");
56
+ return `${k}k`;
57
+ }
58
+ const rounded = Math.round(n / 1000);
59
+ return rounded >= 1000 ? "1M" : `${rounded}k`;
60
+ }
61
+ if (n < 10_000_000) {
62
+ return `${(n / 1_000_000).toFixed(1).replace(/\.0$/, "")}M`;
63
+ }
64
+ return `${Math.round(n / 1_000_000)}M`;
65
+ }
66
+ /**
67
+ * Render `used/window`, matching the compact peer style (`1.2k/256k`).
68
+ * Unknown values are shown as `?` rather than a fake number.
69
+ */
70
+ export function formatContextUsage(used, window) {
71
+ const usedText = used !== undefined && used > 0 ? formatTokenCount(used) : used === 0 ? "0" : "?";
72
+ if (window === undefined || window <= 0)
73
+ return usedText;
74
+ return `${usedText}/${formatTokenCount(window)}`;
75
+ }
76
+ /** Guess a context window from the model id when no metadata is available. */
77
+ export function knownContextWindow(model) {
78
+ if (!model)
79
+ return undefined;
80
+ const id = model.toLowerCase();
81
+ for (const [pattern, window] of KNOWN_WINDOWS) {
82
+ if (pattern.test(id))
83
+ return window;
84
+ }
85
+ return undefined;
86
+ }
87
+ //# sourceMappingURL=context-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-window.js","sourceRoot":"","sources":["../../src/providers/context-window.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Config } from "../config/schema.js";
2
+ export declare function createProvider(config: Config, profileName?: string, modelOverride?: string): any;
@@ -0,0 +1,54 @@
1
+ import { resolveApiKey } from "../config/credentials.js";
2
+ import { OpenAICompatibleAdapter } from "./openai-compatible.js";
3
+ import { OllamaAdapter } from "./ollama.js";
4
+ import { GeminiAdapter } from "./gemini.js";
5
+ import { FakeProvider } from "./fake.js";
6
+ export function createProvider(config, profileName, modelOverride) {
7
+ const name = profileName ?? config.defaultProvider;
8
+ const pcfg = config.providers[name];
9
+ if (!pcfg)
10
+ return new FakeProvider([{ text: "No provider configured; using fake." }]);
11
+ if (pcfg.type === "openai-compatible") {
12
+ const apiKey = resolveApiKey(name, {
13
+ apiKeyEnv: pcfg.apiKeyEnv,
14
+ inline: pcfg.apiKey,
15
+ });
16
+ return new OpenAICompatibleAdapter({
17
+ id: name,
18
+ baseUrl: pcfg.baseUrl ?? "http://127.0.0.1:1234/v1",
19
+ model: modelOverride ?? pcfg.model,
20
+ apiKey,
21
+ headers: pcfg.headers,
22
+ contextWindow: pcfg.contextWindow,
23
+ });
24
+ }
25
+ if (pcfg.type === "ollama") {
26
+ return new OllamaAdapter({
27
+ id: name,
28
+ baseUrl: pcfg.baseUrl ?? "http://127.0.0.1:11434",
29
+ model: modelOverride ?? pcfg.model,
30
+ headers: pcfg.headers,
31
+ keepAlive: pcfg.keepAlive,
32
+ options: pcfg.options,
33
+ contextWindow: pcfg.contextWindow,
34
+ });
35
+ }
36
+ if (pcfg.type === "gemini") {
37
+ const apiKey = resolveApiKey(name, {
38
+ apiKeyEnv: pcfg.apiKeyEnv,
39
+ inline: pcfg.apiKey,
40
+ });
41
+ return new GeminiAdapter({
42
+ id: name,
43
+ baseUrl: pcfg.baseUrl,
44
+ model: modelOverride ?? pcfg.model,
45
+ apiKey,
46
+ headers: pcfg.headers,
47
+ contextWindow: pcfg.contextWindow,
48
+ });
49
+ }
50
+ return new FakeProvider([
51
+ { text: `Provider type ${pcfg.type} not implemented yet.` },
52
+ ]);
53
+ }
54
+ //# sourceMappingURL=factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"factory.js","sourceRoot":"","sources":["../../src/providers/factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAC5C,OAAO,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,UAAU,cAAc,CAC5B,MAAc,EACd,WAAoB,EACpB,aAAsB;IAEtB,MAAM,IAAI,GAAG,WAAW,IAAI,MAAM,CAAC,eAAe,CAAC;IACnD,MAAM,IAAI,GAAI,MAAM,CAAC,SAAiC,CAAC,IAAI,CAAC,CAAC;IAC7D,IAAI,CAAC,IAAI;QACP,OAAO,IAAI,YAAY,CAAC,CAAC,EAAE,IAAI,EAAE,qCAAqC,EAAE,CAAC,CAAC,CAAC;IAC7E,IAAI,IAAI,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;QACtC,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,OAAO,IAAI,uBAAuB,CAAC;YACjC,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,0BAA0B;YACnD,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC,KAAK;YAClC,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,OAAO,IAAI,aAAa,CAAC;YACvB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,wBAAwB;YACjD,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC,KAAK;YAClC,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC3B,MAAM,MAAM,GAAG,aAAa,CAAC,IAAI,EAAE;YACjC,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QACH,OAAO,IAAI,aAAa,CAAC;YACvB,EAAE,EAAE,IAAI;YACR,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,KAAK,EAAE,aAAa,IAAI,IAAI,CAAC,KAAK;YAClC,MAAM;YACN,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,aAAa,EAAE,IAAI,CAAC,aAAa;SAClC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,YAAY,CAAC;QACtB,EAAE,IAAI,EAAE,iBAAiB,IAAI,CAAC,IAAI,uBAAuB,EAAE;KAC5D,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ModelRequest, ModelResponse, TokenUsage, ToolCall } from "../types.js";
2
+ import type { ProviderAdapter } from "./types.js";
3
+ export interface FakeResponse {
4
+ text?: string;
5
+ toolCalls?: ToolCall[];
6
+ usage?: TokenUsage;
7
+ }
8
+ export declare class FakeProvider implements ProviderAdapter {
9
+ readonly id = "fake";
10
+ private responses;
11
+ private index;
12
+ constructor(responses: FakeResponse[]);
13
+ generate(_request: ModelRequest): Promise<ModelResponse>;
14
+ }
@@ -0,0 +1,23 @@
1
+ export class FakeProvider {
2
+ id = "fake";
3
+ responses;
4
+ index = 0;
5
+ constructor(responses) {
6
+ this.responses = responses;
7
+ }
8
+ async generate(_request) {
9
+ const r = this.responses[this.index++] ?? { text: "" };
10
+ const toolCalls = r.toolCalls ?? [];
11
+ return {
12
+ message: {
13
+ role: "assistant",
14
+ content: r.text ? [{ type: "text", text: r.text }] : undefined,
15
+ toolCalls: toolCalls.length ? toolCalls : undefined,
16
+ },
17
+ toolCalls,
18
+ finishReason: toolCalls.length ? "tool_calls" : "stop",
19
+ usage: r.usage,
20
+ };
21
+ }
22
+ }
23
+ //# sourceMappingURL=fake.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fake.js","sourceRoot":"","sources":["../../src/providers/fake.ts"],"names":[],"mappings":"AASA,MAAM,OAAO,YAAY;IACd,EAAE,GAAG,MAAM,CAAC;IACb,SAAS,CAAiB;IAC1B,KAAK,GAAG,CAAC,CAAC;IAElB,YAAY,SAAyB;QACnC,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,QAAsB;QACnC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;QACvD,MAAM,SAAS,GAAG,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE;gBACP,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS;gBAC9D,SAAS,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;aACpD;YACD,SAAS;YACT,YAAY,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM;YACtD,KAAK,EAAE,CAAC,CAAC,KAAK;SACf,CAAC;IACJ,CAAC;CACF"}
@@ -0,0 +1,24 @@
1
+ import type { ModelRequest, ModelResponse, ModelStreamEvent } from "../types.js";
2
+ import type { ProviderAdapter } from "./types.js";
3
+ export interface GeminiConfig {
4
+ id: string;
5
+ model: string;
6
+ apiKey?: string | null;
7
+ baseUrl?: string;
8
+ headers?: Record<string, string>;
9
+ contextWindow?: number;
10
+ }
11
+ export declare class GeminiAdapter implements ProviderAdapter {
12
+ readonly id: string;
13
+ model: string;
14
+ private apiKey;
15
+ private baseUrl;
16
+ private contextWindowOverride;
17
+ private modelList?;
18
+ constructor(config: GeminiConfig);
19
+ private fetchModelList;
20
+ listModels(): Promise<string[]>;
21
+ getModelInfo(): Promise<import("../types.js").ModelInfo | undefined>;
22
+ generate(request: ModelRequest): Promise<ModelResponse>;
23
+ stream(request: ModelRequest): AsyncIterable<ModelStreamEvent>;
24
+ }