ai.matey.wrapper 0.2.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 (63) hide show
  1. package/LICENSE +21 -0
  2. package/dist/cjs/anthropic-sdk.js +203 -0
  3. package/dist/cjs/anthropic-sdk.js.map +1 -0
  4. package/dist/cjs/anymethod.js +167 -0
  5. package/dist/cjs/anymethod.js.map +1 -0
  6. package/dist/cjs/chat.js +513 -0
  7. package/dist/cjs/chat.js.map +1 -0
  8. package/dist/cjs/chrome-ai-legacy.js +168 -0
  9. package/dist/cjs/chrome-ai-legacy.js.map +1 -0
  10. package/dist/cjs/chrome-ai.js +156 -0
  11. package/dist/cjs/chrome-ai.js.map +1 -0
  12. package/dist/cjs/index.js +58 -0
  13. package/dist/cjs/index.js.map +1 -0
  14. package/dist/cjs/ir-index.js +52 -0
  15. package/dist/cjs/ir-index.js.map +1 -0
  16. package/dist/cjs/openai-sdk.js +221 -0
  17. package/dist/cjs/openai-sdk.js.map +1 -0
  18. package/dist/cjs/stream-utils.js +21 -0
  19. package/dist/cjs/stream-utils.js.map +1 -0
  20. package/dist/cjs/types.js +10 -0
  21. package/dist/cjs/types.js.map +1 -0
  22. package/dist/esm/anthropic-sdk.js +196 -0
  23. package/dist/esm/anthropic-sdk.js.map +1 -0
  24. package/dist/esm/anymethod.js +161 -0
  25. package/dist/esm/anymethod.js.map +1 -0
  26. package/dist/esm/chat.js +508 -0
  27. package/dist/esm/chat.js.map +1 -0
  28. package/dist/esm/chrome-ai-legacy.js +163 -0
  29. package/dist/esm/chrome-ai-legacy.js.map +1 -0
  30. package/dist/esm/chrome-ai.js +152 -0
  31. package/dist/esm/chrome-ai.js.map +1 -0
  32. package/dist/esm/index.js +22 -0
  33. package/dist/esm/index.js.map +1 -0
  34. package/dist/esm/ir-index.js +41 -0
  35. package/dist/esm/ir-index.js.map +1 -0
  36. package/dist/esm/openai-sdk.js +213 -0
  37. package/dist/esm/openai-sdk.js.map +1 -0
  38. package/dist/esm/stream-utils.js +14 -0
  39. package/dist/esm/stream-utils.js.map +1 -0
  40. package/dist/esm/types.js +9 -0
  41. package/dist/esm/types.js.map +1 -0
  42. package/dist/types/anthropic-sdk.d.ts +154 -0
  43. package/dist/types/anthropic-sdk.d.ts.map +1 -0
  44. package/dist/types/anymethod.d.ts +45 -0
  45. package/dist/types/anymethod.d.ts.map +1 -0
  46. package/dist/types/chat.d.ts +144 -0
  47. package/dist/types/chat.d.ts.map +1 -0
  48. package/dist/types/chrome-ai-legacy.d.ts +44 -0
  49. package/dist/types/chrome-ai-legacy.d.ts.map +1 -0
  50. package/dist/types/chrome-ai.d.ts +38 -0
  51. package/dist/types/chrome-ai.d.ts.map +1 -0
  52. package/dist/types/index.d.ts +20 -0
  53. package/dist/types/index.d.ts.map +1 -0
  54. package/dist/types/ir-index.d.ts +41 -0
  55. package/dist/types/ir-index.d.ts.map +1 -0
  56. package/dist/types/openai-sdk.d.ts +183 -0
  57. package/dist/types/openai-sdk.d.ts.map +1 -0
  58. package/dist/types/stream-utils.d.ts +9 -0
  59. package/dist/types/stream-utils.d.ts.map +1 -0
  60. package/dist/types/types.d.ts +232 -0
  61. package/dist/types/types.d.ts.map +1 -0
  62. package/package.json +132 -0
  63. package/readme.md +92 -0
@@ -0,0 +1,508 @@
1
+ /**
2
+ * IR Chat Client
3
+ *
4
+ * An IR-native chat client that wraps the Bridge/BackendAdapter
5
+ * with conversation state management, streaming helpers, and tool support.
6
+ *
7
+ * @module
8
+ */
9
+ // ============================================================================
10
+ // Chat Class
11
+ // ============================================================================
12
+ /**
13
+ * Headless chat client with conversation state management.
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { Chat } from 'ai.matey.wrapper/ir';
18
+ * import { AnthropicBackend } from 'ai.matey.backend/anthropic';
19
+ *
20
+ * const chat = new Chat({
21
+ * backend: new AnthropicBackend({ apiKey: process.env.ANTHROPIC_API_KEY }),
22
+ * systemPrompt: 'You are a helpful assistant.',
23
+ * historyLimit: 50,
24
+ * });
25
+ *
26
+ * // Non-streaming
27
+ * const response = await chat.send('Hello!');
28
+ * console.log(response.content);
29
+ *
30
+ * // Streaming
31
+ * await chat.stream('Tell me a story', {
32
+ * onChunk: ({ delta }) => process.stdout.write(delta),
33
+ * onDone: (response) => console.log('\n[Done]'),
34
+ * });
35
+ *
36
+ * // Access state
37
+ * console.log(chat.messages);
38
+ * console.log(chat.totalUsage);
39
+ * ```
40
+ */
41
+ export class Chat {
42
+ config;
43
+ backend;
44
+ // Conversation state
45
+ _messages = [];
46
+ _isLoading = false;
47
+ _error = null;
48
+ _totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
49
+ _requestCount = 0;
50
+ // Event listeners
51
+ _listeners = new Map();
52
+ // Request counter for generating IDs
53
+ _requestIdCounter = 0;
54
+ /**
55
+ * Create a new Chat instance.
56
+ */
57
+ constructor(config) {
58
+ this.config = {
59
+ ...config,
60
+ historyLimit: config.historyLimit ?? 100,
61
+ autoExecuteTools: config.autoExecuteTools ?? false,
62
+ maxToolRounds: config.maxToolRounds ?? 10,
63
+ };
64
+ this.backend = config.backend;
65
+ }
66
+ // ==========================================================================
67
+ // Public Getters
68
+ // ==========================================================================
69
+ /**
70
+ * Get all messages in the conversation.
71
+ */
72
+ get messages() {
73
+ return this._messages;
74
+ }
75
+ /**
76
+ * Get whether a request is in progress.
77
+ */
78
+ get isLoading() {
79
+ return this._isLoading;
80
+ }
81
+ /**
82
+ * Get the current error, if any.
83
+ */
84
+ get error() {
85
+ return this._error;
86
+ }
87
+ /**
88
+ * Get cumulative token usage.
89
+ */
90
+ get totalUsage() {
91
+ return this._totalUsage;
92
+ }
93
+ /**
94
+ * Get the number of requests made.
95
+ */
96
+ get requestCount() {
97
+ return this._requestCount;
98
+ }
99
+ /**
100
+ * Get a snapshot of the conversation state.
101
+ */
102
+ get state() {
103
+ return {
104
+ messages: this._messages,
105
+ isLoading: this._isLoading,
106
+ error: this._error,
107
+ totalUsage: { ...this._totalUsage },
108
+ requestCount: this._requestCount,
109
+ };
110
+ }
111
+ // ==========================================================================
112
+ // Core Methods
113
+ // ==========================================================================
114
+ /**
115
+ * Send a message and get a response (non-streaming).
116
+ *
117
+ * @param content - The message content (string or structured content)
118
+ * @param options - Request options
119
+ * @returns The assistant's response
120
+ */
121
+ async send(content, options) {
122
+ this.setLoading(true);
123
+ this.setError(null);
124
+ try {
125
+ // Add user message to history
126
+ const userMessage = this.createUserMessage(content);
127
+ this.addMessage(userMessage);
128
+ // Execute request with potential tool loop
129
+ const response = await this.executeWithToolLoop(options);
130
+ this.setLoading(false);
131
+ return response;
132
+ }
133
+ catch (error) {
134
+ const err = error instanceof Error ? error : new Error(String(error));
135
+ this.setError(err);
136
+ this.setLoading(false);
137
+ throw err;
138
+ }
139
+ }
140
+ /**
141
+ * Send a message and stream the response.
142
+ *
143
+ * @param content - The message content
144
+ * @param options - Streaming options with callbacks
145
+ * @returns The final response after streaming completes
146
+ */
147
+ async stream(content, options) {
148
+ this.setLoading(true);
149
+ this.setError(null);
150
+ try {
151
+ // Add user message to history
152
+ const userMessage = this.createUserMessage(content);
153
+ this.addMessage(userMessage);
154
+ // Execute streaming request with potential tool loop
155
+ const response = await this.executeStreamWithToolLoop(options);
156
+ this.setLoading(false);
157
+ return response;
158
+ }
159
+ catch (error) {
160
+ const err = error instanceof Error ? error : new Error(String(error));
161
+ this.setError(err);
162
+ this.setLoading(false);
163
+ options?.onError?.(err);
164
+ throw err;
165
+ }
166
+ }
167
+ /**
168
+ * Add a message to the conversation without sending a request.
169
+ * Useful for restoring conversation history or injecting context.
170
+ */
171
+ addMessage(message) {
172
+ this._messages.push(message);
173
+ this.trimHistory();
174
+ this.emitStateChange();
175
+ }
176
+ /**
177
+ * Clear the conversation history.
178
+ */
179
+ clear() {
180
+ this._messages = [];
181
+ this._error = null;
182
+ this._totalUsage = { promptTokens: 0, completionTokens: 0, totalTokens: 0 };
183
+ this._requestCount = 0;
184
+ this.emitStateChange();
185
+ }
186
+ /**
187
+ * Remove the last N messages from the conversation.
188
+ */
189
+ removeLastMessages(count = 1) {
190
+ const removed = this._messages.splice(-count, count);
191
+ this.emitStateChange();
192
+ return removed;
193
+ }
194
+ // ==========================================================================
195
+ // Event Handling
196
+ // ==========================================================================
197
+ /**
198
+ * Subscribe to chat events.
199
+ */
200
+ on(event, listener) {
201
+ if (!this._listeners.has(event)) {
202
+ this._listeners.set(event, new Set());
203
+ }
204
+ this._listeners.get(event).add(listener);
205
+ // Return unsubscribe function
206
+ return () => {
207
+ this._listeners.get(event)?.delete(listener);
208
+ };
209
+ }
210
+ /**
211
+ * Unsubscribe from chat events.
212
+ */
213
+ off(event, listener) {
214
+ this._listeners.get(event)?.delete(listener);
215
+ }
216
+ // ==========================================================================
217
+ // Private Methods
218
+ // ==========================================================================
219
+ async executeWithToolLoop(options) {
220
+ let rounds = 0;
221
+ while (rounds < this.config.maxToolRounds) {
222
+ rounds++;
223
+ const request = await this.buildRequest(options);
224
+ const irResponse = await this.backend.execute(request, options?.signal);
225
+ const response = this.processResponse(irResponse);
226
+ // Add assistant message to history
227
+ this.addMessage(irResponse.message);
228
+ this.emit('message', { message: irResponse.message, response });
229
+ // Check for tool calls
230
+ if (response.toolCalls &&
231
+ response.toolCalls.length > 0 &&
232
+ this.config.autoExecuteTools &&
233
+ this.config.onToolCall) {
234
+ // Execute tools and add results to history
235
+ await this.executeToolCalls(response.toolCalls);
236
+ // Continue the loop to get the next response
237
+ continue;
238
+ }
239
+ return response;
240
+ }
241
+ throw new Error(`Max tool rounds (${this.config.maxToolRounds}) exceeded`);
242
+ }
243
+ async executeStreamWithToolLoop(options) {
244
+ let rounds = 0;
245
+ while (rounds < this.config.maxToolRounds) {
246
+ rounds++;
247
+ const request = await this.buildRequest(options);
248
+ // Check if backend supports streaming
249
+ if (!this.backend.executeStream) {
250
+ // Fall back to non-streaming
251
+ const irResponse = await this.backend.execute(request, options?.signal);
252
+ const response = this.processResponse(irResponse);
253
+ this.addMessage(irResponse.message);
254
+ options?.onDone?.(response);
255
+ return response;
256
+ }
257
+ const requestId = request.metadata.requestId;
258
+ options?.onStart?.({ requestId });
259
+ this.emit('stream-start', { requestId });
260
+ let accumulated = '';
261
+ let sequence = 0;
262
+ let finalResponse = null;
263
+ const toolInputs = new Map();
264
+ const stream = this.backend.executeStream(request, options?.signal);
265
+ for await (const chunk of stream) {
266
+ switch (chunk.type) {
267
+ case 'content': {
268
+ accumulated += chunk.delta;
269
+ sequence = chunk.sequence;
270
+ const event = {
271
+ delta: chunk.delta,
272
+ accumulated,
273
+ sequence,
274
+ };
275
+ options?.onChunk?.(event);
276
+ this.emit('stream-chunk', event);
277
+ break;
278
+ }
279
+ case 'tool_use': {
280
+ if (chunk.inputDelta) {
281
+ const current = toolInputs.get(chunk.id) ?? '';
282
+ toolInputs.set(chunk.id, current + chunk.inputDelta);
283
+ }
284
+ options?.onToolUse?.({
285
+ id: chunk.id,
286
+ name: chunk.name,
287
+ input: toolInputs.get(chunk.id) ?? '',
288
+ });
289
+ break;
290
+ }
291
+ case 'done': {
292
+ const message = chunk.message ?? {
293
+ role: 'assistant',
294
+ content: accumulated,
295
+ };
296
+ finalResponse = {
297
+ content: accumulated,
298
+ message,
299
+ finishReason: chunk.finishReason,
300
+ usage: chunk.usage,
301
+ toolCalls: this.extractToolCalls(message),
302
+ requestId,
303
+ };
304
+ if (chunk.usage) {
305
+ this.updateUsage(chunk.usage);
306
+ }
307
+ break;
308
+ }
309
+ case 'error': {
310
+ throw new Error(chunk.error.message);
311
+ }
312
+ }
313
+ }
314
+ if (!finalResponse) {
315
+ // Stream ended without done chunk - construct response from accumulated
316
+ finalResponse = {
317
+ content: accumulated,
318
+ message: { role: 'assistant', content: accumulated },
319
+ finishReason: 'stop',
320
+ requestId,
321
+ };
322
+ }
323
+ // Add assistant message to history
324
+ this.addMessage(finalResponse.message);
325
+ options?.onDone?.(finalResponse);
326
+ this.emit('stream-done', { response: finalResponse });
327
+ this.emit('message', { message: finalResponse.message, response: finalResponse });
328
+ // Check for tool calls
329
+ if (finalResponse.toolCalls &&
330
+ finalResponse.toolCalls.length > 0 &&
331
+ this.config.autoExecuteTools &&
332
+ this.config.onToolCall) {
333
+ await this.executeToolCalls(finalResponse.toolCalls);
334
+ continue;
335
+ }
336
+ return finalResponse;
337
+ }
338
+ throw new Error(`Max tool rounds (${this.config.maxToolRounds}) exceeded`);
339
+ }
340
+ async executeToolCalls(toolCalls) {
341
+ if (!this.config.onToolCall) {
342
+ return;
343
+ }
344
+ for (const tool of toolCalls) {
345
+ const result = await this.config.onToolCall(tool.name, tool.input, tool.id);
346
+ const content = typeof result === 'string' ? result : result.content;
347
+ const isError = typeof result === 'object' ? result.isError : false;
348
+ // Add tool result message
349
+ const toolResultMessage = {
350
+ role: 'tool',
351
+ content: [
352
+ {
353
+ type: 'tool_result',
354
+ toolUseId: tool.id,
355
+ content,
356
+ isError,
357
+ },
358
+ ],
359
+ };
360
+ this.addMessage(toolResultMessage);
361
+ }
362
+ }
363
+ async buildRequest(options) {
364
+ const messages = await this.getMessagesWithSystem();
365
+ return {
366
+ messages,
367
+ parameters: {
368
+ ...this.config.defaultParameters,
369
+ ...options?.parameters,
370
+ },
371
+ tools: this.config.tools,
372
+ metadata: {
373
+ requestId: this.generateRequestId(),
374
+ timestamp: Date.now(),
375
+ custom: options?.metadata,
376
+ provenance: {},
377
+ },
378
+ };
379
+ }
380
+ async getMessagesWithSystem() {
381
+ const messages = [...this._messages];
382
+ if (this.config.systemPrompt) {
383
+ const systemContent = typeof this.config.systemPrompt === 'function'
384
+ ? await this.config.systemPrompt()
385
+ : this.config.systemPrompt;
386
+ // Prepend system message if not already present
387
+ const firstMessage = messages[0];
388
+ if (firstMessage?.role !== 'system') {
389
+ messages.unshift({
390
+ role: 'system',
391
+ content: systemContent,
392
+ });
393
+ }
394
+ }
395
+ return messages;
396
+ }
397
+ processResponse(irResponse) {
398
+ this._requestCount++;
399
+ if (irResponse.usage) {
400
+ this.updateUsage(irResponse.usage);
401
+ }
402
+ const content = this.extractTextContent(irResponse.message);
403
+ const toolCalls = this.extractToolCalls(irResponse.message);
404
+ return {
405
+ content,
406
+ message: irResponse.message,
407
+ finishReason: irResponse.finishReason,
408
+ usage: irResponse.usage,
409
+ toolCalls: toolCalls.length > 0 ? toolCalls : undefined,
410
+ requestId: irResponse.metadata.requestId,
411
+ };
412
+ }
413
+ extractTextContent(message) {
414
+ if (typeof message.content === 'string') {
415
+ return message.content;
416
+ }
417
+ return message.content
418
+ .filter((c) => c.type === 'text')
419
+ .map((c) => c.text)
420
+ .join('');
421
+ }
422
+ extractToolCalls(message) {
423
+ if (typeof message.content === 'string') {
424
+ return [];
425
+ }
426
+ return message.content
427
+ .filter((c) => c.type === 'tool_use')
428
+ .map((c) => ({
429
+ id: c.id,
430
+ name: c.name,
431
+ input: c.input,
432
+ }));
433
+ }
434
+ createUserMessage(content) {
435
+ return {
436
+ role: 'user',
437
+ content: typeof content === 'string' ? content : [...content],
438
+ };
439
+ }
440
+ updateUsage(usage) {
441
+ this._totalUsage.promptTokens += usage.promptTokens;
442
+ this._totalUsage.completionTokens += usage.completionTokens;
443
+ this._totalUsage.totalTokens += usage.totalTokens;
444
+ }
445
+ trimHistory() {
446
+ const limit = this.config.historyLimit;
447
+ if (this._messages.length > limit) {
448
+ // Keep system message if present
449
+ const systemMessage = this._messages[0]?.role === 'system' ? this._messages[0] : null;
450
+ const excess = this._messages.length - limit;
451
+ if (systemMessage) {
452
+ // Remove messages after system, keeping system
453
+ this._messages.splice(1, excess);
454
+ }
455
+ else {
456
+ this._messages.splice(0, excess);
457
+ }
458
+ }
459
+ }
460
+ generateRequestId() {
461
+ return `chat_${Date.now()}_${++this._requestIdCounter}`;
462
+ }
463
+ setLoading(loading) {
464
+ this._isLoading = loading;
465
+ this.emitStateChange();
466
+ }
467
+ setError(error) {
468
+ this._error = error;
469
+ if (error) {
470
+ this.emit('error', { error });
471
+ }
472
+ this.emitStateChange();
473
+ }
474
+ emit(event, data) {
475
+ const listeners = this._listeners.get(event);
476
+ if (listeners) {
477
+ for (const listener of listeners) {
478
+ try {
479
+ listener(data);
480
+ }
481
+ catch {
482
+ // Ignore listener errors
483
+ }
484
+ }
485
+ }
486
+ }
487
+ emitStateChange() {
488
+ this.emit('state-change', { state: this.state });
489
+ }
490
+ }
491
+ // ============================================================================
492
+ // Factory Function
493
+ // ============================================================================
494
+ /**
495
+ * Create a new Chat instance.
496
+ *
497
+ * @example
498
+ * ```typescript
499
+ * const chat = createChat({
500
+ * backend: myBackend,
501
+ * systemPrompt: 'You are helpful.',
502
+ * });
503
+ * ```
504
+ */
505
+ export function createChat(config) {
506
+ return new Chat(config);
507
+ }
508
+ //# sourceMappingURL=chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chat.js","sourceRoot":"","sources":["../../src/chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Legacy Chrome AI Language Model Wrapper
3
+ *
4
+ * Mimics the ORIGINAL Chrome AI (window.ai.languageModel) API before recent changes.
5
+ *
6
+ * @module
7
+ */
8
+ import { trimHistory } from 'ai.matey.utils';
9
+ // ============================================================================
10
+ // Session Implementation
11
+ // ============================================================================
12
+ class LegacyChromeAISessionImpl {
13
+ backend;
14
+ conversationHistory;
15
+ options;
16
+ destroyed = false;
17
+ _tokensSoFar = 0;
18
+ constructor(backend, options) {
19
+ this.backend = backend;
20
+ this.options = options;
21
+ this.conversationHistory =
22
+ options.initialPrompts?.map((prompt) => ({
23
+ role: prompt.role,
24
+ content: prompt.content,
25
+ })) || [];
26
+ }
27
+ get tokensSoFar() {
28
+ return this._tokensSoFar;
29
+ }
30
+ get maxTokens() {
31
+ return this.options.maxTokens || 1024;
32
+ }
33
+ get tokensLeft() {
34
+ return Math.max(0, this.maxTokens - this._tokensSoFar);
35
+ }
36
+ async prompt(input) {
37
+ if (this.destroyed) {
38
+ throw new Error('Session has been destroyed');
39
+ }
40
+ const userMessage = { role: 'user', content: input };
41
+ this.conversationHistory.push(userMessage);
42
+ const request = {
43
+ messages: [...this.conversationHistory],
44
+ parameters: {
45
+ model: this.options.model,
46
+ temperature: this.options.temperature,
47
+ topK: this.options.topK,
48
+ maxTokens: this.options.maxTokens,
49
+ },
50
+ stream: false,
51
+ metadata: {
52
+ requestId: crypto.randomUUID(),
53
+ timestamp: Date.now(),
54
+ provenance: { frontend: 'chrome-ai-legacy-wrapper' },
55
+ },
56
+ };
57
+ const response = await this.backend.execute(request);
58
+ this.conversationHistory.push(response.message);
59
+ if (this.options.maxHistorySize !== undefined && this.options.maxHistorySize !== -1) {
60
+ this.conversationHistory = trimHistory(this.conversationHistory, this.options.maxHistorySize, 'smart');
61
+ }
62
+ if (response.usage) {
63
+ this._tokensSoFar = response.usage.totalTokens;
64
+ }
65
+ else {
66
+ this._tokensSoFar += Math.ceil(input.length / 4);
67
+ const responseText = typeof response.message.content === 'string'
68
+ ? response.message.content
69
+ : response.message.content.map((c) => (c.type === 'text' ? c.text : '')).join('');
70
+ this._tokensSoFar += Math.ceil(responseText.length / 4);
71
+ }
72
+ return typeof response.message.content === 'string'
73
+ ? response.message.content
74
+ : response.message.content.map((c) => (c.type === 'text' ? c.text : '')).join('');
75
+ }
76
+ async *promptStreaming(input) {
77
+ if (this.destroyed) {
78
+ throw new Error('Session has been destroyed');
79
+ }
80
+ const userMessage = { role: 'user', content: input };
81
+ this.conversationHistory.push(userMessage);
82
+ const request = {
83
+ messages: [...this.conversationHistory],
84
+ parameters: {
85
+ model: this.options.model,
86
+ temperature: this.options.temperature,
87
+ topK: this.options.topK,
88
+ maxTokens: this.options.maxTokens,
89
+ },
90
+ stream: true,
91
+ metadata: {
92
+ requestId: crypto.randomUUID(),
93
+ timestamp: Date.now(),
94
+ provenance: { frontend: 'chrome-ai-legacy-wrapper' },
95
+ },
96
+ };
97
+ let fullContent = '';
98
+ const stream = this.backend.executeStream(request);
99
+ for await (const chunk of stream) {
100
+ if (chunk.type === 'content') {
101
+ fullContent += chunk.delta;
102
+ yield chunk.delta;
103
+ }
104
+ else if (chunk.type === 'done') {
105
+ if (chunk.message) {
106
+ this.conversationHistory.push(chunk.message);
107
+ }
108
+ if (this.options.maxHistorySize !== undefined && this.options.maxHistorySize !== -1) {
109
+ this.conversationHistory = trimHistory(this.conversationHistory, this.options.maxHistorySize, 'smart');
110
+ }
111
+ if (chunk.usage) {
112
+ this._tokensSoFar = chunk.usage.totalTokens;
113
+ }
114
+ else {
115
+ this._tokensSoFar += Math.ceil(input.length / 4);
116
+ this._tokensSoFar += Math.ceil(fullContent.length / 4);
117
+ }
118
+ }
119
+ else if (chunk.type === 'error') {
120
+ throw new Error(chunk.error.message);
121
+ }
122
+ }
123
+ }
124
+ destroy() {
125
+ this.destroyed = true;
126
+ this.conversationHistory = [];
127
+ this._tokensSoFar = 0;
128
+ }
129
+ clone() {
130
+ return new LegacyChromeAISessionImpl(this.backend, {
131
+ ...this.options,
132
+ initialPrompts: this.options.initialPrompts,
133
+ });
134
+ }
135
+ }
136
+ // ============================================================================
137
+ // Language Model Implementation
138
+ // ============================================================================
139
+ export function LegacyChromeAILanguageModel(backend) {
140
+ return {
141
+ create(options = {}) {
142
+ return new LegacyChromeAISessionImpl(backend, options);
143
+ },
144
+ async capabilities() {
145
+ const isHealthy = backend.healthCheck ? await backend.healthCheck() : true;
146
+ return {
147
+ available: isHealthy ? 'yes' : 'no',
148
+ defaultTemperature: 0.7,
149
+ defaultTopK: 40,
150
+ maxTopK: 100,
151
+ };
152
+ },
153
+ };
154
+ }
155
+ export function createLegacyWindowAI(backend) {
156
+ return { languageModel: LegacyChromeAILanguageModel(backend) };
157
+ }
158
+ export function polyfillLegacyWindowAI(backend) {
159
+ if (typeof globalThis !== 'undefined') {
160
+ globalThis.ai = createLegacyWindowAI(backend);
161
+ }
162
+ }
163
+ //# sourceMappingURL=chrome-ai-legacy.js.map