surfcode 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 (117) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +325 -2
  3. package/assets/surfcode-logo.gif +0 -0
  4. package/dist/cli/auth.js +315 -0
  5. package/dist/cli/auth.js.map +1 -0
  6. package/dist/cli/config.js +228 -0
  7. package/dist/cli/config.js.map +1 -0
  8. package/dist/cli/headless.js +355 -0
  9. package/dist/cli/headless.js.map +1 -0
  10. package/dist/cli/inspect.js +462 -0
  11. package/dist/cli/inspect.js.map +1 -0
  12. package/dist/cli/interactive.js +130 -0
  13. package/dist/cli/interactive.js.map +1 -0
  14. package/dist/cli/sessions.js +170 -0
  15. package/dist/cli/sessions.js.map +1 -0
  16. package/dist/cli/sync.js +190 -0
  17. package/dist/cli/sync.js.map +1 -0
  18. package/dist/cli/util.js +345 -0
  19. package/dist/cli/util.js.map +1 -0
  20. package/dist/cli.js +485 -0
  21. package/dist/cli.js.map +1 -0
  22. package/dist/core/agent.js +281 -0
  23. package/dist/core/agent.js.map +1 -0
  24. package/dist/core/agents.js +55 -0
  25. package/dist/core/agents.js.map +1 -0
  26. package/dist/core/auth.js +107 -0
  27. package/dist/core/auth.js.map +1 -0
  28. package/dist/core/catalog.js +306 -0
  29. package/dist/core/catalog.js.map +1 -0
  30. package/dist/core/chat/anthropic.js +222 -0
  31. package/dist/core/chat/anthropic.js.map +1 -0
  32. package/dist/core/chat/common.js +367 -0
  33. package/dist/core/chat/common.js.map +1 -0
  34. package/dist/core/chat/google.js +180 -0
  35. package/dist/core/chat/google.js.map +1 -0
  36. package/dist/core/chat/index.js +80 -0
  37. package/dist/core/chat/index.js.map +1 -0
  38. package/dist/core/chat/openai.js +164 -0
  39. package/dist/core/chat/openai.js.map +1 -0
  40. package/dist/core/chat/types.js +2 -0
  41. package/dist/core/chat/types.js.map +1 -0
  42. package/dist/core/clipboard.js +34 -0
  43. package/dist/core/clipboard.js.map +1 -0
  44. package/dist/core/compact.js +39 -0
  45. package/dist/core/compact.js.map +1 -0
  46. package/dist/core/config.js +211 -0
  47. package/dist/core/config.js.map +1 -0
  48. package/dist/core/delegate.js +184 -0
  49. package/dist/core/delegate.js.map +1 -0
  50. package/dist/core/effort.js +80 -0
  51. package/dist/core/effort.js.map +1 -0
  52. package/dist/core/errors.js +32 -0
  53. package/dist/core/errors.js.map +1 -0
  54. package/dist/core/free.js +21 -0
  55. package/dist/core/free.js.map +1 -0
  56. package/dist/core/github.js +445 -0
  57. package/dist/core/github.js.map +1 -0
  58. package/dist/core/paths.js +51 -0
  59. package/dist/core/paths.js.map +1 -0
  60. package/dist/core/prompt.js +95 -0
  61. package/dist/core/prompt.js.map +1 -0
  62. package/dist/core/provider.js +298 -0
  63. package/dist/core/provider.js.map +1 -0
  64. package/dist/core/session.js +159 -0
  65. package/dist/core/session.js.map +1 -0
  66. package/dist/core/sync.js +126 -0
  67. package/dist/core/sync.js.map +1 -0
  68. package/dist/core/types.js +2 -0
  69. package/dist/core/types.js.map +1 -0
  70. package/dist/core/usage.js +127 -0
  71. package/dist/core/usage.js.map +1 -0
  72. package/dist/core/workspace.js +70 -0
  73. package/dist/core/workspace.js.map +1 -0
  74. package/dist/data/models.json +1 -0
  75. package/dist/sync/server.js +179 -0
  76. package/dist/sync/server.js.map +1 -0
  77. package/dist/tools/diff.js +21 -0
  78. package/dist/tools/diff.js.map +1 -0
  79. package/dist/tools/files.js +227 -0
  80. package/dist/tools/files.js.map +1 -0
  81. package/dist/tools/github.js +238 -0
  82. package/dist/tools/github.js.map +1 -0
  83. package/dist/tools/index.js +34 -0
  84. package/dist/tools/index.js.map +1 -0
  85. package/dist/tools/search.js +231 -0
  86. package/dist/tools/search.js.map +1 -0
  87. package/dist/tools/shell.js +118 -0
  88. package/dist/tools/shell.js.map +1 -0
  89. package/dist/tools/todos.js +50 -0
  90. package/dist/tools/todos.js.map +1 -0
  91. package/dist/tools/webfetch.js +108 -0
  92. package/dist/tools/webfetch.js.map +1 -0
  93. package/dist/tui/App.js +3002 -0
  94. package/dist/tui/App.js.map +1 -0
  95. package/dist/tui/ansi.js +151 -0
  96. package/dist/tui/ansi.js.map +1 -0
  97. package/dist/tui/commands.js +61 -0
  98. package/dist/tui/commands.js.map +1 -0
  99. package/dist/tui/explorer.js +152 -0
  100. package/dist/tui/explorer.js.map +1 -0
  101. package/dist/tui/icons.js +21 -0
  102. package/dist/tui/icons.js.map +1 -0
  103. package/dist/tui/layout.js +324 -0
  104. package/dist/tui/layout.js.map +1 -0
  105. package/dist/tui/markdown.js +335 -0
  106. package/dist/tui/markdown.js.map +1 -0
  107. package/dist/tui/overlays.js +316 -0
  108. package/dist/tui/overlays.js.map +1 -0
  109. package/dist/tui/render.js +234 -0
  110. package/dist/tui/render.js.map +1 -0
  111. package/dist/tui/theme.js +148 -0
  112. package/dist/tui/theme.js.map +1 -0
  113. package/dist/tui/types.js +73 -0
  114. package/dist/tui/types.js.map +1 -0
  115. package/dist/version.js +3 -0
  116. package/dist/version.js.map +1 -0
  117. package/package.json +75 -4
@@ -0,0 +1,367 @@
1
+ import { SurfError } from '../errors.js';
2
+ export const DEFAULT_TIMEOUT = 10 * 60 * 1000;
3
+ // 429 is deliberately absent: quota/rate-limit responses will not succeed by
4
+ // waiting a few seconds, and retrying them made provider errors feel silent.
5
+ export const RETRYABLE_STATUS = new Set([408, 409, 425, 500, 502, 503, 504]);
6
+ export function requestSignal(options) {
7
+ const timeout = AbortSignal.timeout(options.timeout ?? DEFAULT_TIMEOUT);
8
+ return AbortSignal.any([options.signal, timeout]);
9
+ }
10
+ export async function fetchWithRetry(url, init, signal, attempts = 3, baseDelay = 600) {
11
+ let lastError;
12
+ const tries = Math.max(1, attempts);
13
+ for (let attempt = 0; attempt < tries; attempt += 1) {
14
+ if (signal.aborted)
15
+ throw signal.reason ?? new Error('Aborted');
16
+ let response;
17
+ try {
18
+ response = await fetch(url, { ...init, signal });
19
+ }
20
+ catch (error) {
21
+ if (signal.aborted)
22
+ throw error;
23
+ lastError = error;
24
+ if (attempt === tries - 1)
25
+ break;
26
+ await sleepWithSignal(backoffMs(attempt, baseDelay), signal);
27
+ continue;
28
+ }
29
+ if (response.ok)
30
+ return response;
31
+ if (!RETRYABLE_STATUS.has(response.status) || attempt === tries - 1) {
32
+ await throwResponseError(response);
33
+ }
34
+ const wait = retryAfterMs(response.headers.get('retry-after')) ?? backoffMs(attempt, baseDelay);
35
+ await response.body?.cancel();
36
+ await sleepWithSignal(Math.min(wait, 30_000), signal);
37
+ }
38
+ throw new SurfError(`Request failed: ${errorText(lastError)}`, {
39
+ hint: 'Check your network connection and provider status.',
40
+ cause: lastError,
41
+ retryable: true
42
+ });
43
+ }
44
+ export async function throwResponseError(response) {
45
+ let body = '';
46
+ try {
47
+ body = (await response.text()).slice(0, 4_000);
48
+ }
49
+ catch {
50
+ // Ignore body read errors.
51
+ }
52
+ let message = body.trim();
53
+ try {
54
+ const parsed = JSON.parse(body);
55
+ message =
56
+ parsed?.error?.message ??
57
+ parsed?.error?.toString?.() ??
58
+ parsed?.message ??
59
+ parsed?.detail ??
60
+ parsed?.errors?.[0]?.message ??
61
+ message;
62
+ }
63
+ catch {
64
+ // Keep raw body.
65
+ }
66
+ const status = response.status;
67
+ const quota = status === 429 &&
68
+ /quota|resource_exhausted|rate.?limit|billing|exceeded/i.test(`${message} ${response.statusText}`);
69
+ // Some providers return whole paragraphs (and even HTML) for quota errors.
70
+ // Keep the first useful sentence so one failure does not flood the timeline.
71
+ message = compactErrorText(message);
72
+ let hint;
73
+ if (status === 401 || status === 403)
74
+ hint = 'Your API key may be invalid or lack access. Run `surf auth <provider>`.';
75
+ if (status === 404)
76
+ hint = 'The model or endpoint may not exist. Check /model or your baseURL.';
77
+ if (status === 429) {
78
+ hint = quota
79
+ ? 'Quota or rate limit reached. Switch models with /model, or check the provider billing/quota.'
80
+ : 'Rate limited. Switch models with /model, then try again.';
81
+ }
82
+ if (status >= 500)
83
+ hint = 'The provider had a server error. Try again or switch models.';
84
+ throw new SurfError(`${response.status} ${response.statusText}${message ? ` — ${message}` : ''}`, {
85
+ hint,
86
+ status,
87
+ retryable: RETRYABLE_STATUS.has(status)
88
+ });
89
+ }
90
+ export async function* readSse(response) {
91
+ if (!response.body)
92
+ throw new SurfError('Provider returned an empty response body.');
93
+ const decoder = new TextDecoder();
94
+ let buffer = '';
95
+ let event;
96
+ let data = [];
97
+ for await (const chunk of response.body) {
98
+ buffer += decoder.decode(chunk, { stream: true });
99
+ let newline = buffer.indexOf('\n');
100
+ while (newline !== -1) {
101
+ let line = buffer.slice(0, newline);
102
+ buffer = buffer.slice(newline + 1);
103
+ if (line.endsWith('\r'))
104
+ line = line.slice(0, -1);
105
+ if (line === '') {
106
+ if (data.length > 0) {
107
+ yield { event, data: data.join('\n') };
108
+ data = [];
109
+ }
110
+ event = undefined;
111
+ }
112
+ else if (line.startsWith(':')) {
113
+ // comment / keepalive
114
+ }
115
+ else if (line.startsWith('event:')) {
116
+ event = line.slice(6).trim();
117
+ }
118
+ else if (line.startsWith('data:')) {
119
+ data.push(line.slice(5).trimStart());
120
+ }
121
+ newline = buffer.indexOf('\n');
122
+ }
123
+ }
124
+ buffer += decoder.decode();
125
+ if (buffer.startsWith('data:'))
126
+ data.push(buffer.slice(5).trimStart());
127
+ if (data.length > 0)
128
+ yield { event, data: data.join('\n') };
129
+ }
130
+ export function tryParseJson(value) {
131
+ try {
132
+ return JSON.parse(value);
133
+ }
134
+ catch {
135
+ return undefined;
136
+ }
137
+ }
138
+ export function generateToolCallId(prefix = 'call') {
139
+ return `${prefix}_${Date.now().toString(36)}${Math.random().toString(36).slice(2, 8)}`;
140
+ }
141
+ export function parseToolArguments(raw, value) {
142
+ if (value && typeof value === 'object' && !Array.isArray(value))
143
+ return value;
144
+ if (!raw?.trim())
145
+ return {};
146
+ try {
147
+ const parsed = JSON.parse(raw);
148
+ if (parsed && typeof parsed === 'object' && !Array.isArray(parsed))
149
+ return parsed;
150
+ }
151
+ catch {
152
+ // Leave rawArguments for the agent to report.
153
+ }
154
+ return {};
155
+ }
156
+ export function emptyResult() {
157
+ return { text: '', reasoning: '', toolCalls: [], usage: {} };
158
+ }
159
+ export function usageFromOpenAi(usage) {
160
+ if (!usage || typeof usage !== 'object')
161
+ return {};
162
+ const input = tokenNumber(usage.prompt_tokens ??
163
+ usage.input_tokens ??
164
+ usage.total_input_tokens ??
165
+ usage.prompt_tokens_total);
166
+ const output = tokenNumber(usage.completion_tokens ??
167
+ usage.output_tokens ??
168
+ usage.total_output_tokens ??
169
+ usage.completion_tokens_total);
170
+ const cached = tokenNumber(usage.prompt_tokens_details?.cached_tokens ??
171
+ usage.input_tokens_details?.cached_tokens ??
172
+ usage.input_tokens_details?.cache_read_tokens ??
173
+ usage.prompt_cache_hit_tokens ??
174
+ usage.cache_read_input_tokens ??
175
+ usage.cached_tokens);
176
+ const cacheWrite = tokenNumber(usage.prompt_tokens_details?.cache_creation_tokens ??
177
+ usage.input_tokens_details?.cache_write_tokens ??
178
+ usage.cache_creation_input_tokens);
179
+ const reasoning = tokenNumber(usage.completion_tokens_details?.reasoning_tokens ??
180
+ usage.output_tokens_details?.reasoning_tokens ??
181
+ usage.reasoning_tokens);
182
+ return {
183
+ ...(input !== undefined ? { inputTokens: input } : {}),
184
+ ...(output !== undefined ? { outputTokens: output } : {}),
185
+ ...(cached !== undefined ? { cacheReadTokens: cached } : {}),
186
+ ...(cacheWrite !== undefined ? { cacheWriteTokens: cacheWrite } : {}),
187
+ ...(reasoning !== undefined ? { reasoningTokens: reasoning } : {})
188
+ };
189
+ }
190
+ /** Usage fields arrive cumulatively; never let a late sparse chunk erase a prior value. */
191
+ export function mergeUsage(base, patch) {
192
+ for (const key of [
193
+ 'inputTokens',
194
+ 'outputTokens',
195
+ 'reasoningTokens',
196
+ 'cacheReadTokens',
197
+ 'cacheWriteTokens',
198
+ 'cost',
199
+ 'requests'
200
+ ]) {
201
+ const value = patch[key];
202
+ if (typeof value !== 'number' || !Number.isFinite(value))
203
+ continue;
204
+ base[key] = Math.max(base[key] ?? 0, value);
205
+ }
206
+ return base;
207
+ }
208
+ export function isRetryableError(error) {
209
+ if (!error)
210
+ return false;
211
+ if (error instanceof SurfError) {
212
+ if (error.retryable !== undefined)
213
+ return error.retryable;
214
+ if (error.status !== undefined)
215
+ return RETRYABLE_STATUS.has(error.status);
216
+ }
217
+ if (error instanceof Error && error.name === 'TimeoutError')
218
+ return true;
219
+ return true;
220
+ }
221
+ export async function sleepWithSignal(ms, signal) {
222
+ if (signal.aborted)
223
+ throw signal.reason ?? new Error('Aborted');
224
+ if (ms <= 0)
225
+ return;
226
+ await new Promise((resolve, reject) => {
227
+ const timer = setTimeout(() => {
228
+ signal.removeEventListener('abort', onAbort);
229
+ resolve();
230
+ }, ms);
231
+ const onAbort = () => {
232
+ clearTimeout(timer);
233
+ reject(signal.reason ?? new Error('Aborted'));
234
+ };
235
+ signal.addEventListener('abort', onAbort, { once: true });
236
+ });
237
+ }
238
+ export function toolCallFromDelta(calls, entry, indexFallback = 0) {
239
+ const index = Number.isInteger(entry?.index) ? entry.index : indexFallback;
240
+ const current = calls.get(index) ?? { id: '', name: '', raw: '' };
241
+ if (typeof entry?.id === 'string' && entry.id)
242
+ current.id = entry.id;
243
+ const fn = entry?.function ?? entry;
244
+ if (typeof fn?.name === 'string' && fn.name)
245
+ current.name = current.name ? current.name + fn.name : fn.name;
246
+ const args = fn?.arguments;
247
+ if (typeof args === 'string')
248
+ current.raw += args;
249
+ else if (args && typeof args === 'object')
250
+ current.raw = JSON.stringify(args);
251
+ calls.set(index, current);
252
+ }
253
+ export function thinkingText(value) {
254
+ if (typeof value === 'string')
255
+ return value;
256
+ if (Array.isArray(value)) {
257
+ return value
258
+ .map((entry) => {
259
+ if (typeof entry === 'string')
260
+ return entry;
261
+ if (entry && typeof entry === 'object') {
262
+ const item = entry;
263
+ return item.text ?? item.content ?? '';
264
+ }
265
+ return '';
266
+ })
267
+ .join('');
268
+ }
269
+ if (value && typeof value === 'object') {
270
+ const item = value;
271
+ return item.text ?? item.content ?? '';
272
+ }
273
+ return '';
274
+ }
275
+ export function textContent(value) {
276
+ if (typeof value === 'string')
277
+ return value;
278
+ if (Array.isArray(value)) {
279
+ return value
280
+ .map((part) => {
281
+ if (typeof part === 'string')
282
+ return part;
283
+ if (part && typeof part === 'object') {
284
+ const item = part;
285
+ return item.text ?? item.content ?? '';
286
+ }
287
+ return '';
288
+ })
289
+ .join('');
290
+ }
291
+ return '';
292
+ }
293
+ export function messageText(message) {
294
+ return message.role === 'tool' ? message.content : message.content;
295
+ }
296
+ export function baseHeaders(extra) {
297
+ return {
298
+ 'content-type': 'application/json',
299
+ accept: 'text/event-stream',
300
+ 'cache-control': 'no-cache',
301
+ 'user-agent': 'surfcode/0.1',
302
+ ...extra
303
+ };
304
+ }
305
+ export function streamHeaders(headers, idempotencyKey) {
306
+ return {
307
+ ...headers,
308
+ ...(idempotencyKey ? { 'idempotency-key': idempotencyKey } : {})
309
+ };
310
+ }
311
+ export function retryAttempts(settings) {
312
+ return Math.max(1, Math.min(11, (settings?.retries ?? 2) + 1));
313
+ }
314
+ export function retryBaseDelay(settings) {
315
+ return Math.max(0, Math.min(60_000, settings?.retryDelay ?? 600));
316
+ }
317
+ export function sanitizeToolSchemas(tools) {
318
+ return tools.map((tool) => ({
319
+ name: tool.name,
320
+ description: tool.description,
321
+ parameters: tool.parameters
322
+ }));
323
+ }
324
+ function backoffMs(attempt, baseDelay) {
325
+ const exponential = Math.max(0, baseDelay) * 2 ** attempt;
326
+ const jitter = 0.85 + Math.random() * 0.3;
327
+ return Math.round(Math.min(30_000, exponential * jitter));
328
+ }
329
+ function retryAfterMs(value) {
330
+ if (!value)
331
+ return undefined;
332
+ const seconds = Number(value);
333
+ if (Number.isFinite(seconds))
334
+ return Math.max(0, seconds * 1000);
335
+ const date = Date.parse(value);
336
+ if (Number.isFinite(date))
337
+ return Math.max(0, date - Date.now());
338
+ return undefined;
339
+ }
340
+ function tokenNumber(value) {
341
+ if (value === undefined || value === null)
342
+ return undefined;
343
+ const number = Number(value);
344
+ return Number.isFinite(number) && number >= 0 ? number : undefined;
345
+ }
346
+ function compactErrorText(value, limit = 240) {
347
+ const compact = value.replace(/\s+/g, ' ').trim();
348
+ if (compact.length <= limit)
349
+ return compact;
350
+ const window = compact.slice(0, limit);
351
+ const sentence = Math.max(window.lastIndexOf('. '), window.lastIndexOf('! '), window.lastIndexOf('? '));
352
+ const cut = sentence >= Math.floor(limit * 0.45)
353
+ ? sentence + 1
354
+ : Math.max(0, window.lastIndexOf(' '));
355
+ return `${(cut > 0 ? compact.slice(0, cut) : window).trimEnd()}…`;
356
+ }
357
+ function errorText(error) {
358
+ if (!error)
359
+ return 'unknown error';
360
+ if (error instanceof Error) {
361
+ if (error.name === 'TimeoutError')
362
+ return 'request timed out';
363
+ return error.message;
364
+ }
365
+ return String(error);
366
+ }
367
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"common.js","sourceRoot":"","sources":["../../../src/core/chat/common.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,180 @@
1
+ import { googleThinkingControl } from '../effort.js';
2
+ import { SurfError } from '../errors.js';
3
+ import { baseHeaders, emptyResult, fetchWithRetry, generateToolCallId, mergeUsage, readSse, requestSignal, retryAttempts, retryBaseDelay, streamHeaders } from './common.js';
4
+ export async function streamGoogle(request) {
5
+ const { provider, model, options, callbacks } = request;
6
+ const result = emptyResult();
7
+ const signal = requestSignal(options);
8
+ const thinking = options.effort && model.meta?.reasoning === true
9
+ ? googleThinkingControl(model.id, options.effort, options.maxTokens)
10
+ : undefined;
11
+ const generationConfig = {
12
+ maxOutputTokens: options.maxTokens,
13
+ ...(options.temperature !== undefined ? { temperature: options.temperature } : {}),
14
+ ...(thinking !== undefined
15
+ ? {
16
+ thinkingConfig: {
17
+ ...thinking,
18
+ // Thought summaries cost bandwidth and rendering work. Only ask
19
+ // for them when the user explicitly wants reasoning visible.
20
+ ...(options.showReasoning ? { includeThoughts: true } : {})
21
+ }
22
+ }
23
+ : {})
24
+ };
25
+ const body = {
26
+ ...(provider.settings.extraBody ?? {}),
27
+ contents: toGoogleContents(request.messages),
28
+ generationConfig
29
+ };
30
+ if (request.system)
31
+ body.systemInstruction = { parts: [{ text: request.system }] };
32
+ if (request.tools.length > 0 && model.meta?.tool_call !== false) {
33
+ body.tools = [
34
+ {
35
+ functionDeclarations: request.tools.map((tool) => ({
36
+ name: tool.name,
37
+ description: tool.description,
38
+ parameters: cleanSchema(tool.parameters)
39
+ }))
40
+ }
41
+ ];
42
+ }
43
+ const url = googleStreamUrl(provider.baseURL, model.id);
44
+ const response = await fetchWithRetry(url, {
45
+ method: 'POST',
46
+ headers: baseHeaders(streamHeaders(provider.headers, request.idempotencyKey)),
47
+ body: JSON.stringify(body)
48
+ }, signal, retryAttempts(provider.settings), retryBaseDelay(provider.settings));
49
+ for await (const event of readSse(response)) {
50
+ const payload = parseJson(event.data);
51
+ if (!payload)
52
+ continue;
53
+ if (payload.error) {
54
+ throw new SurfError(`${provider.name}: ${payload.error.message ?? 'stream error'}`, {
55
+ hint: payload.error.status ? `Provider error status: ${payload.error.status}` : undefined,
56
+ retryable: false
57
+ });
58
+ }
59
+ if (payload.promptFeedback?.blockReason) {
60
+ throw new SurfError(`Request blocked by ${provider.name}: ${payload.promptFeedback.blockReason}`, {
61
+ hint: 'Rephrase the prompt or adjust the provider safety settings.',
62
+ retryable: false
63
+ });
64
+ }
65
+ const candidate = payload.candidates?.[0];
66
+ if (candidate?.content?.parts) {
67
+ for (const part of candidate.content.parts) {
68
+ const text = typeof part.text === 'string' ? part.text : '';
69
+ if (text) {
70
+ if (part.thought === true) {
71
+ result.reasoning += text;
72
+ callbacks.onReasoning(text);
73
+ }
74
+ else {
75
+ result.text += text;
76
+ callbacks.onText(text);
77
+ }
78
+ }
79
+ if (part.functionCall?.name) {
80
+ const call = {
81
+ id: part.functionCall.id || generateToolCallId('gcall'),
82
+ name: part.functionCall.name,
83
+ arguments: part.functionCall.args && typeof part.functionCall.args === 'object'
84
+ ? part.functionCall.args
85
+ : {},
86
+ signature: part.thoughtSignature || part.functionCall.thoughtSignature
87
+ };
88
+ result.toolCalls.push(call);
89
+ }
90
+ }
91
+ }
92
+ if (candidate?.finishReason)
93
+ result.finishReason = candidate.finishReason;
94
+ const usage = payload.usageMetadata;
95
+ if (usage) {
96
+ const parsed = {
97
+ inputTokens: Number(usage.promptTokenCount ?? 0),
98
+ outputTokens: Number(usage.candidatesTokenCount ?? 0),
99
+ reasoningTokens: Number(usage.thoughtsTokenCount ?? 0),
100
+ cacheReadTokens: Number(usage.cachedContentTokenCount ?? 0)
101
+ };
102
+ result.usage = mergeUsage(result.usage, parsed);
103
+ }
104
+ }
105
+ return result;
106
+ }
107
+ function toGoogleContents(messages) {
108
+ const contents = [];
109
+ let functionResponses = [];
110
+ const flushResponses = () => {
111
+ if (functionResponses.length > 0) {
112
+ contents.push({ role: 'user', parts: functionResponses });
113
+ functionResponses = [];
114
+ }
115
+ };
116
+ for (const message of messages) {
117
+ if (message.role === 'tool') {
118
+ functionResponses.push({
119
+ functionResponse: {
120
+ name: message.name,
121
+ response: message.isError ? { error: message.content } : { result: message.content }
122
+ }
123
+ });
124
+ continue;
125
+ }
126
+ flushResponses();
127
+ if (message.role === 'user') {
128
+ if (message.content)
129
+ contents.push({ role: 'user', parts: [{ text: message.content }] });
130
+ continue;
131
+ }
132
+ const parts = [];
133
+ if (message.content)
134
+ parts.push({ text: message.content });
135
+ for (const call of message.toolCalls ?? []) {
136
+ parts.push({
137
+ functionCall: { name: call.name, args: call.arguments },
138
+ ...(call.signature ? { thoughtSignature: call.signature } : {})
139
+ });
140
+ }
141
+ if (parts.length > 0)
142
+ contents.push({ role: 'model', parts });
143
+ }
144
+ flushResponses();
145
+ return contents;
146
+ }
147
+ function googleStreamUrl(baseURL, modelId) {
148
+ const base = baseURL.replace(/\/+$/, '');
149
+ if (/:streamGenerateContent/.test(base))
150
+ return base;
151
+ if (/\/models$/.test(base))
152
+ return `${base}/${encodeURIComponent(modelId)}:streamGenerateContent?alt=sse`;
153
+ return `${base}/models/${encodeURIComponent(modelId)}:streamGenerateContent?alt=sse`;
154
+ }
155
+ export function cleanSchema(value) {
156
+ if (Array.isArray(value))
157
+ return value.map(cleanSchema);
158
+ if (!value || typeof value !== 'object')
159
+ return value;
160
+ const output = {};
161
+ for (const [key, entry] of Object.entries(value)) {
162
+ if (key === '$schema' || key === 'additionalProperties' || key === 'strict')
163
+ continue;
164
+ if (key === 'type' && typeof entry === 'string') {
165
+ output.type = entry.toUpperCase();
166
+ continue;
167
+ }
168
+ output[key] = cleanSchema(entry);
169
+ }
170
+ return output;
171
+ }
172
+ function parseJson(value) {
173
+ try {
174
+ return JSON.parse(value);
175
+ }
176
+ catch {
177
+ return undefined;
178
+ }
179
+ }
180
+ //# sourceMappingURL=google.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"google.js","sourceRoot":"","sources":["../../../src/core/chat/google.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,80 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import { streamOpenAi } from './openai.js';
3
+ import { streamAnthropic } from './anthropic.js';
4
+ import { streamGoogle } from './google.js';
5
+ import { isAbortError } from '../errors.js';
6
+ import { isRetryableError, retryBaseDelay, sleepWithSignal } from './common.js';
7
+ /**
8
+ * Stream a chat completion with one transparent retry layer.
9
+ *
10
+ * The HTTP layer already retries before a response body is consumed. This
11
+ * wrapper covers the remaining failure mode: a connection that disappears
12
+ * after headers but before the provider has emitted any content. Once text or
13
+ * reasoning reaches the UI we never replay the request, because that would
14
+ * duplicate tokens on screen and in the conversation.
15
+ */
16
+ export async function streamChat(request) {
17
+ const idempotencyKey = request.idempotencyKey ?? randomUUID();
18
+ const retries = Math.max(0, Math.min(5, request.provider.settings.retries ?? 2));
19
+ const baseDelay = retryBaseDelay(request.provider.settings);
20
+ let lastError;
21
+ for (let attempt = 0; attempt <= retries; attempt += 1) {
22
+ let emitted = false;
23
+ try {
24
+ return await streamChatOnce({
25
+ ...request,
26
+ idempotencyKey,
27
+ callbacks: {
28
+ onText: (delta) => {
29
+ emitted = true;
30
+ request.callbacks.onText(delta);
31
+ },
32
+ onReasoning: (delta) => {
33
+ emitted = true;
34
+ request.callbacks.onReasoning(delta);
35
+ }
36
+ }
37
+ });
38
+ }
39
+ catch (error) {
40
+ lastError = error;
41
+ if (request.options.signal.aborted ||
42
+ isAbortError(error) ||
43
+ emitted ||
44
+ attempt === retries ||
45
+ !isRetryableError(error)) {
46
+ throw error;
47
+ }
48
+ await sleepWithSignal(Math.round(baseDelay * 2 ** attempt * (0.85 + Math.random() * 0.3)), request.options.signal);
49
+ }
50
+ }
51
+ throw lastError;
52
+ }
53
+ async function streamChatOnce(request) {
54
+ switch (request.provider.dialect) {
55
+ case 'openai':
56
+ return streamOpenAi(request);
57
+ case 'anthropic':
58
+ return streamAnthropic(request);
59
+ case 'google':
60
+ case 'google-vertex':
61
+ return streamGoogle(request);
62
+ case 'azure':
63
+ return streamOpenAi(request, azureChatUrl(request));
64
+ default:
65
+ throw new Error(`Unsupported provider dialect: ${request.provider.dialect}`);
66
+ }
67
+ }
68
+ export function azureChatUrl(request) {
69
+ const base = request.provider.baseURL.replace(/\/+$/, '');
70
+ const apiVersion = request.provider.settings.apiVersion || '2024-10-21';
71
+ if (/\/chat\/completions/.test(base)) {
72
+ if (/[?&]api-version=/.test(base))
73
+ return base;
74
+ return `${base}${base.includes('?') ? '&' : '?'}api-version=${encodeURIComponent(apiVersion)}`;
75
+ }
76
+ const deployment = request.provider.settings.deployment || request.model.id;
77
+ const root = /\/openai$/.test(base) ? base : `${base}/openai`;
78
+ return `${root}/deployments/${encodeURIComponent(deployment)}/chat/completions?api-version=${encodeURIComponent(apiVersion)}`;
79
+ }
80
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/chat/index.ts"],"names":[],"mappings":"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"}