@alexnetrebskii/hive-agent 2.40.0 → 2.42.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.
@@ -0,0 +1,507 @@
1
+ import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
2
+ import { OpenAIProvider } from './openai.js';
3
+ import { isTransientError } from './fallback.js';
4
+ function jsonResponse(body, status = 200) {
5
+ return new Response(JSON.stringify(body), {
6
+ status,
7
+ headers: { 'Content-Type': 'application/json' }
8
+ });
9
+ }
10
+ function textResponse(body, status, statusText = '') {
11
+ return new Response(body, {
12
+ status,
13
+ statusText,
14
+ headers: { 'Content-Type': 'text/plain' }
15
+ });
16
+ }
17
+ function okChoice(opts = {}) {
18
+ const promptTokens = opts.prompt_tokens ?? 100;
19
+ const completionTokens = opts.completion_tokens ?? 20;
20
+ const usage = {
21
+ prompt_tokens: promptTokens,
22
+ completion_tokens: completionTokens,
23
+ total_tokens: promptTokens + completionTokens
24
+ };
25
+ if (opts.cached_tokens !== undefined || opts.cache_write_tokens !== undefined) {
26
+ usage.prompt_tokens_details = {
27
+ cached_tokens: opts.cached_tokens ?? 0,
28
+ cache_write_tokens: opts.cache_write_tokens ?? 0
29
+ };
30
+ }
31
+ return {
32
+ id: 'resp',
33
+ choices: [
34
+ {
35
+ message: {
36
+ role: 'assistant',
37
+ content: opts.content ?? null,
38
+ tool_calls: opts.tool_calls?.map(tc => ({
39
+ id: tc.id,
40
+ type: 'function',
41
+ function: { name: tc.name, arguments: JSON.stringify(tc.args ?? {}) }
42
+ }))
43
+ },
44
+ finish_reason: opts.finish_reason
45
+ ?? (opts.tool_calls && opts.tool_calls.length > 0 ? 'tool_calls' : 'stop')
46
+ }
47
+ ],
48
+ usage
49
+ };
50
+ }
51
+ const dummyTool = {
52
+ name: 'search',
53
+ description: 'search things',
54
+ input_schema: { type: 'object', properties: { q: { type: 'string' } } }
55
+ };
56
+ describe('OpenAIProvider — construction', () => {
57
+ it('throws when apiKey is missing and OPENAI_API_KEY is unset', () => {
58
+ const prev = process.env.OPENAI_API_KEY;
59
+ delete process.env.OPENAI_API_KEY;
60
+ try {
61
+ expect(() => new OpenAIProvider()).toThrow(/openai API key is required/);
62
+ }
63
+ finally {
64
+ if (prev !== undefined)
65
+ process.env.OPENAI_API_KEY = prev;
66
+ }
67
+ });
68
+ it('error message includes the vendor name', () => {
69
+ expect(() => new OpenAIProvider({ vendor: 'groq' })).toThrow(/groq API key is required/);
70
+ });
71
+ it('reads apiKey from process.env.OPENAI_API_KEY', () => {
72
+ const prev = process.env.OPENAI_API_KEY;
73
+ process.env.OPENAI_API_KEY = 'env-key';
74
+ try {
75
+ const p = new OpenAIProvider();
76
+ expect(p.getModelId()).toBe('openai:gpt-4o');
77
+ }
78
+ finally {
79
+ if (prev !== undefined)
80
+ process.env.OPENAI_API_KEY = prev;
81
+ else
82
+ delete process.env.OPENAI_API_KEY;
83
+ }
84
+ });
85
+ });
86
+ describe('OpenAIProvider — getModelId', () => {
87
+ it('default vendor is openai', () => {
88
+ const p = new OpenAIProvider({ apiKey: 'k', model: 'gpt-4o-mini' });
89
+ expect(p.getModelId()).toBe('openai:gpt-4o-mini');
90
+ });
91
+ it('returns ${vendor}:${model}', () => {
92
+ const p = new OpenAIProvider({ apiKey: 'k', model: 'm', vendor: 'groq' });
93
+ expect(p.getModelId()).toBe('groq:m');
94
+ });
95
+ });
96
+ describe('OpenAIProvider — vendor presets', () => {
97
+ it('groq preset sets baseURL, vendor, default model', () => {
98
+ const p = OpenAIProvider.groq({ apiKey: 'k' });
99
+ expect(p.getModelId()).toBe('groq:llama-3.3-70b-versatile');
100
+ });
101
+ it('together preset', () => {
102
+ const p = OpenAIProvider.together({ apiKey: 'k' });
103
+ expect(p.getModelId()).toMatch(/^together:/);
104
+ });
105
+ it('fireworks preset', () => {
106
+ const p = OpenAIProvider.fireworks({ apiKey: 'k' });
107
+ expect(p.getModelId()).toMatch(/^fireworks:/);
108
+ });
109
+ it('deepseek preset', () => {
110
+ const p = OpenAIProvider.deepseek({ apiKey: 'k' });
111
+ expect(p.getModelId()).toBe('deepseek:deepseek-chat');
112
+ });
113
+ it('xai preset', () => {
114
+ const p = OpenAIProvider.xai({ apiKey: 'k' });
115
+ expect(p.getModelId()).toBe('xai:grok-2');
116
+ });
117
+ it('preset apiKey falls back to vendor-specific env var', () => {
118
+ const prev = process.env.GROQ_API_KEY;
119
+ process.env.GROQ_API_KEY = 'groq-env';
120
+ try {
121
+ const p = OpenAIProvider.groq();
122
+ expect(p.getModelId()).toBe('groq:llama-3.3-70b-versatile');
123
+ }
124
+ finally {
125
+ if (prev !== undefined)
126
+ process.env.GROQ_API_KEY = prev;
127
+ else
128
+ delete process.env.GROQ_API_KEY;
129
+ }
130
+ });
131
+ it('explicit model overrides preset default', () => {
132
+ const p = OpenAIProvider.groq({ apiKey: 'k', model: 'mixtral-8x7b' });
133
+ expect(p.getModelId()).toBe('groq:mixtral-8x7b');
134
+ });
135
+ });
136
+ describe('OpenAIProvider.ollama', () => {
137
+ beforeEach(() => {
138
+ vi.stubGlobal('fetch', vi.fn());
139
+ });
140
+ afterEach(() => {
141
+ vi.unstubAllGlobals();
142
+ });
143
+ it('does not require an explicit apiKey', () => {
144
+ expect(() => OpenAIProvider.ollama({ model: 'llama3.2' })).not.toThrow();
145
+ });
146
+ it('sets vendor and namespaces getModelId', () => {
147
+ const p = OpenAIProvider.ollama({ model: 'llama3.2' });
148
+ expect(p.getModelId()).toBe('ollama:llama3.2');
149
+ });
150
+ it('hits localhost:11434/v1 by default', async () => {
151
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
152
+ const p = OpenAIProvider.ollama({ model: 'llama3.2' });
153
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
154
+ const url = vi.mocked(fetch).mock.calls[0][0];
155
+ expect(url).toBe('http://localhost:11434/v1/chat/completions');
156
+ });
157
+ it('appends /v1 when OLLAMA_HOST is set without it', async () => {
158
+ const prev = process.env.OLLAMA_HOST;
159
+ process.env.OLLAMA_HOST = 'http://192.168.1.5:11434';
160
+ try {
161
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
162
+ const p = OpenAIProvider.ollama({ model: 'llama3.2' });
163
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
164
+ const url = vi.mocked(fetch).mock.calls[0][0];
165
+ expect(url).toBe('http://192.168.1.5:11434/v1/chat/completions');
166
+ }
167
+ finally {
168
+ if (prev !== undefined)
169
+ process.env.OLLAMA_HOST = prev;
170
+ else
171
+ delete process.env.OLLAMA_HOST;
172
+ }
173
+ });
174
+ it('does NOT double-append /v1 when OLLAMA_HOST already includes it', async () => {
175
+ const prev = process.env.OLLAMA_HOST;
176
+ process.env.OLLAMA_HOST = 'http://localhost:11434/v1';
177
+ try {
178
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
179
+ const p = OpenAIProvider.ollama({ model: 'qwen2.5' });
180
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
181
+ const url = vi.mocked(fetch).mock.calls[0][0];
182
+ expect(url).toBe('http://localhost:11434/v1/chat/completions');
183
+ }
184
+ finally {
185
+ if (prev !== undefined)
186
+ process.env.OLLAMA_HOST = prev;
187
+ else
188
+ delete process.env.OLLAMA_HOST;
189
+ }
190
+ });
191
+ it('explicit baseURL overrides OLLAMA_HOST', async () => {
192
+ const prev = process.env.OLLAMA_HOST;
193
+ process.env.OLLAMA_HOST = 'http://wrong:11434';
194
+ try {
195
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
196
+ const p = OpenAIProvider.ollama({ model: 'llama3.2', baseURL: 'http://right:9000/v1' });
197
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
198
+ const url = vi.mocked(fetch).mock.calls[0][0];
199
+ expect(url).toBe('http://right:9000/v1/chat/completions');
200
+ }
201
+ finally {
202
+ if (prev !== undefined)
203
+ process.env.OLLAMA_HOST = prev;
204
+ else
205
+ delete process.env.OLLAMA_HOST;
206
+ }
207
+ });
208
+ });
209
+ describe('OpenAIProvider — chat success path', () => {
210
+ beforeEach(() => {
211
+ vi.stubGlobal('fetch', vi.fn());
212
+ });
213
+ afterEach(() => {
214
+ vi.unstubAllGlobals();
215
+ });
216
+ it('returns text content for a plain assistant reply', async () => {
217
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'hello' })));
218
+ const p = new OpenAIProvider({ apiKey: 'k' });
219
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
220
+ expect(result.stopReason).toBe('end_turn');
221
+ expect(result.content).toEqual([{ type: 'text', text: 'hello' }]);
222
+ expect(result.usage).toEqual({ inputTokens: 100, outputTokens: 20 });
223
+ });
224
+ it('maps finish_reason=tool_calls to stopReason=tool_use and emits tool_use blocks', async () => {
225
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
226
+ tool_calls: [{ id: 't1', name: 'search', args: { q: 'milk' } }]
227
+ })));
228
+ const p = new OpenAIProvider({ apiKey: 'k' });
229
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], [dummyTool]);
230
+ expect(result.stopReason).toBe('tool_use');
231
+ expect(result.content).toEqual([
232
+ { type: 'tool_use', id: 't1', name: 'search', input: { q: 'milk' } }
233
+ ]);
234
+ });
235
+ it('maps finish_reason=length to stopReason=max_tokens', async () => {
236
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
237
+ content: 'truncated...',
238
+ finish_reason: 'length'
239
+ })));
240
+ const p = new OpenAIProvider({ apiKey: 'k' });
241
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
242
+ expect(result.stopReason).toBe('max_tokens');
243
+ });
244
+ it('plumbs cached_tokens and cache_write_tokens into LLMResponse.cacheUsage and excludes them from inputTokens', async () => {
245
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
246
+ content: 'ok',
247
+ prompt_tokens: 1000,
248
+ completion_tokens: 50,
249
+ cached_tokens: 800,
250
+ cache_write_tokens: 100
251
+ })));
252
+ const p = new OpenAIProvider({ apiKey: 'k' });
253
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
254
+ expect(result.cacheUsage).toEqual({
255
+ cacheReadInputTokens: 800,
256
+ cacheCreationInputTokens: 100
257
+ });
258
+ expect(result.usage).toEqual({ inputTokens: 100, outputTokens: 50 });
259
+ });
260
+ it('does not emit cacheUsage when prompt_tokens_details is absent', async () => {
261
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
262
+ const p = new OpenAIProvider({ apiKey: 'k' });
263
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
264
+ expect(result.cacheUsage).toBeUndefined();
265
+ });
266
+ });
267
+ describe('OpenAIProvider — request body shape', () => {
268
+ beforeEach(() => {
269
+ vi.stubGlobal('fetch', vi.fn());
270
+ });
271
+ afterEach(() => {
272
+ vi.unstubAllGlobals();
273
+ });
274
+ function lastBody() {
275
+ const fetchMock = vi.mocked(fetch);
276
+ const call = fetchMock.mock.calls[fetchMock.mock.calls.length - 1];
277
+ const init = call[1];
278
+ return JSON.parse(init.body);
279
+ }
280
+ function lastHeaders() {
281
+ const fetchMock = vi.mocked(fetch);
282
+ const call = fetchMock.mock.calls[fetchMock.mock.calls.length - 1];
283
+ const init = call[1];
284
+ return init.headers;
285
+ }
286
+ it('forwards options.temperature, options.topP, options.stopSequences', async () => {
287
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
288
+ const p = new OpenAIProvider({ apiKey: 'k' });
289
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], [], {
290
+ temperature: 0.3,
291
+ topP: 0.9,
292
+ stopSequences: ['\n\n', 'STOP']
293
+ });
294
+ const body = lastBody();
295
+ expect(body.temperature).toBe(0.3);
296
+ expect(body.top_p).toBe(0.9);
297
+ expect(body.stop).toEqual(['\n\n', 'STOP']);
298
+ });
299
+ it('omits sampling params when not provided', async () => {
300
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
301
+ const p = new OpenAIProvider({ apiKey: 'k' });
302
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
303
+ const body = lastBody();
304
+ expect(body.temperature).toBeUndefined();
305
+ expect(body.top_p).toBeUndefined();
306
+ expect(body.stop).toBeUndefined();
307
+ });
308
+ it('options.model overrides the constructor default', async () => {
309
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
310
+ const p = new OpenAIProvider({ apiKey: 'k', model: 'gpt-4o' });
311
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], [], { model: 'gpt-4o-mini' });
312
+ expect(lastBody().model).toBe('gpt-4o-mini');
313
+ });
314
+ it('attaches Authorization header and merges defaultHeaders', async () => {
315
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
316
+ const p = new OpenAIProvider({
317
+ apiKey: 'secret',
318
+ defaultHeaders: { 'X-Custom': 'yes' }
319
+ });
320
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
321
+ const headers = lastHeaders();
322
+ expect(headers['Authorization']).toBe('Bearer secret');
323
+ expect(headers['Content-Type']).toBe('application/json');
324
+ expect(headers['X-Custom']).toBe('yes');
325
+ });
326
+ it('hits the configured baseURL', async () => {
327
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
328
+ const p = OpenAIProvider.groq({ apiKey: 'k' });
329
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
330
+ const fetchMock = vi.mocked(fetch);
331
+ const url = fetchMock.mock.calls[0][0];
332
+ expect(url).toBe('https://api.groq.com/openai/v1/chat/completions');
333
+ });
334
+ });
335
+ describe('OpenAIProvider — message conversion', () => {
336
+ beforeEach(() => {
337
+ vi.stubGlobal('fetch', vi.fn());
338
+ });
339
+ afterEach(() => {
340
+ vi.unstubAllGlobals();
341
+ });
342
+ function lastMessages() {
343
+ const fetchMock = vi.mocked(fetch);
344
+ const call = fetchMock.mock.calls[fetchMock.mock.calls.length - 1];
345
+ const body = JSON.parse(call[1].body);
346
+ return body.messages;
347
+ }
348
+ it('prepends the system prompt as the first message', async () => {
349
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
350
+ const p = new OpenAIProvider({ apiKey: 'k' });
351
+ await p.chat('be helpful', [{ role: 'user', content: 'hi' }], []);
352
+ const msgs = lastMessages();
353
+ expect(msgs[0]).toEqual({ role: 'system', content: 'be helpful' });
354
+ expect(msgs[1]).toEqual({ role: 'user', content: 'hi' });
355
+ });
356
+ it('roundtrips assistant tool_use → tool_call and tool_result → tool role', async () => {
357
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'done' })));
358
+ const messages = [
359
+ { role: 'user', content: 'find milk' },
360
+ {
361
+ role: 'assistant',
362
+ content: [
363
+ { type: 'text', text: 'searching' },
364
+ { type: 'tool_use', id: 't1', name: 'search', input: { q: 'milk' } }
365
+ ]
366
+ },
367
+ {
368
+ role: 'user',
369
+ content: [
370
+ { type: 'tool_result', tool_use_id: 't1', content: '[{"name":"milk"}]' }
371
+ ]
372
+ }
373
+ ];
374
+ const p = new OpenAIProvider({ apiKey: 'k' });
375
+ await p.chat('sys', messages, [dummyTool]);
376
+ const msgs = lastMessages();
377
+ // [system, user, assistant-with-tool_calls, tool]
378
+ expect(msgs).toHaveLength(4);
379
+ expect(msgs[2].role).toBe('assistant');
380
+ expect(msgs[2].content).toBe('searching');
381
+ expect(msgs[2].tool_calls).toEqual([
382
+ { id: 't1', type: 'function', function: { name: 'search', arguments: JSON.stringify({ q: 'milk' }) } }
383
+ ]);
384
+ expect(msgs[3]).toEqual({
385
+ role: 'tool',
386
+ content: '[{"name":"milk"}]',
387
+ tool_call_id: 't1'
388
+ });
389
+ });
390
+ it('converts tool schemas to OpenAI function form', async () => {
391
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
392
+ const p = new OpenAIProvider({ apiKey: 'k' });
393
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], [dummyTool]);
394
+ const fetchMock = vi.mocked(fetch);
395
+ const body = JSON.parse(fetchMock.mock.calls[0][1].body);
396
+ expect(body.tools).toEqual([
397
+ {
398
+ type: 'function',
399
+ function: {
400
+ name: 'search',
401
+ description: 'search things',
402
+ parameters: { type: 'object', properties: { q: { type: 'string' } } }
403
+ }
404
+ }
405
+ ]);
406
+ });
407
+ it('omits the tools field when no tools are provided', async () => {
408
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({ content: 'ok' })));
409
+ const p = new OpenAIProvider({ apiKey: 'k' });
410
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
411
+ const fetchMock = vi.mocked(fetch);
412
+ const body = JSON.parse(fetchMock.mock.calls[0][1].body);
413
+ expect(body.tools).toBeUndefined();
414
+ });
415
+ });
416
+ describe('OpenAIProvider — reasoning stripping', () => {
417
+ beforeEach(() => {
418
+ vi.stubGlobal('fetch', vi.fn());
419
+ });
420
+ afterEach(() => {
421
+ vi.unstubAllGlobals();
422
+ });
423
+ it('strips harmony channel markers from text content by default', async () => {
424
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
425
+ content: '<|channel|>analysis<|message|>Plain answer here.'
426
+ })));
427
+ const p = new OpenAIProvider({ apiKey: 'k' });
428
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
429
+ expect(result.content).toEqual([{ type: 'text', text: 'Plain answer here.' }]);
430
+ });
431
+ it('strips a leading `thought` preamble', async () => {
432
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
433
+ content: 'thought\nThe real answer.'
434
+ })));
435
+ const p = new OpenAIProvider({ apiKey: 'k' });
436
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
437
+ expect(result.content).toEqual([{ type: 'text', text: 'The real answer.' }]);
438
+ });
439
+ it('preserves the raw text when stripReasoning is false', async () => {
440
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse(okChoice({
441
+ content: '<|channel|>analysis<|message|>Plain answer here.'
442
+ })));
443
+ const p = new OpenAIProvider({ apiKey: 'k', stripReasoning: false });
444
+ const result = await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
445
+ expect(result.content).toEqual([
446
+ { type: 'text', text: '<|channel|>analysis<|message|>Plain answer here.' }
447
+ ]);
448
+ });
449
+ });
450
+ describe('OpenAIProvider — error handling', () => {
451
+ beforeEach(() => {
452
+ vi.stubGlobal('fetch', vi.fn());
453
+ });
454
+ afterEach(() => {
455
+ vi.unstubAllGlobals();
456
+ });
457
+ it('throws with vendor name and HTTP status on a non-2xx', async () => {
458
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({ error: { message: 'bad key' } }, 401));
459
+ const p = new OpenAIProvider({ apiKey: 'k', vendor: 'groq' });
460
+ await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/groq API error \(HTTP 401\): bad key/);
461
+ });
462
+ it('throws on a 503 in a way that isTransientError classifies as transient', async () => {
463
+ vi.mocked(fetch).mockResolvedValueOnce(textResponse('upstream busy', 503, 'Service Unavailable'));
464
+ const p = new OpenAIProvider({ apiKey: 'k', vendor: 'groq' });
465
+ let caught;
466
+ try {
467
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
468
+ }
469
+ catch (err) {
470
+ caught = err;
471
+ }
472
+ expect(caught).toBeInstanceOf(Error);
473
+ expect(isTransientError(caught)).toBe(true);
474
+ });
475
+ it('throws on a 401 in a way that isTransientError rejects', async () => {
476
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({ error: { message: 'bad key' } }, 401));
477
+ const p = new OpenAIProvider({ apiKey: 'k' });
478
+ let caught;
479
+ try {
480
+ await p.chat('sys', [{ role: 'user', content: 'hi' }], []);
481
+ }
482
+ catch (err) {
483
+ caught = err;
484
+ }
485
+ expect(isTransientError(caught)).toBe(false);
486
+ });
487
+ it('throws when the response body is not JSON', async () => {
488
+ vi.mocked(fetch).mockResolvedValueOnce(textResponse('not-json', 200));
489
+ const p = new OpenAIProvider({ apiKey: 'k' });
490
+ await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/openai API error: response was not valid JSON/);
491
+ });
492
+ it('throws when 200 OK carries an error body', async () => {
493
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({ error: { message: 'rate limited' } }));
494
+ const p = new OpenAIProvider({ apiKey: 'k' });
495
+ await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/openai API error: rate limited/);
496
+ });
497
+ it('throws when no choices are returned', async () => {
498
+ vi.mocked(fetch).mockResolvedValueOnce(jsonResponse({
499
+ id: 'r',
500
+ choices: [],
501
+ usage: { prompt_tokens: 0, completion_tokens: 0, total_tokens: 0 }
502
+ }));
503
+ const p = new OpenAIProvider({ apiKey: 'k' });
504
+ await expect(p.chat('sys', [{ role: 'user', content: 'hi' }], [])).rejects.toThrow(/empty response/);
505
+ });
506
+ });
507
+ //# sourceMappingURL=openai.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"openai.test.js","sourceRoot":"","sources":["../../../src/providers/llm/openai.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAA;AACxE,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5C,OAAO,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAGhD,SAAS,YAAY,CAAC,IAAa,EAAE,MAAM,GAAG,GAAG;IAC/C,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE;QACxC,MAAM;QACN,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;KAChD,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,IAAY,EAAE,MAAc,EAAE,UAAU,GAAG,EAAE;IACjE,OAAO,IAAI,QAAQ,CAAC,IAAI,EAAE;QACxB,MAAM;QACN,UAAU;QACV,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE;KAC1C,CAAC,CAAA;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,OAQd,EAAE;IACJ,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,IAAI,GAAG,CAAA;IAC9C,MAAM,gBAAgB,GAAG,IAAI,CAAC,iBAAiB,IAAI,EAAE,CAAA;IACrD,MAAM,KAAK,GAA4B;QACrC,aAAa,EAAE,YAAY;QAC3B,iBAAiB,EAAE,gBAAgB;QACnC,YAAY,EAAE,YAAY,GAAG,gBAAgB;KAC9C,CAAA;IACD,IAAI,IAAI,CAAC,aAAa,KAAK,SAAS,IAAI,IAAI,CAAC,kBAAkB,KAAK,SAAS,EAAE,CAAC;QAC9E,KAAK,CAAC,qBAAqB,GAAG;YAC5B,aAAa,EAAE,IAAI,CAAC,aAAa,IAAI,CAAC;YACtC,kBAAkB,EAAE,IAAI,CAAC,kBAAkB,IAAI,CAAC;SACjD,CAAA;IACH,CAAC;IACD,OAAO;QACL,EAAE,EAAE,MAAM;QACV,OAAO,EAAE;YACP;gBACE,OAAO,EAAE;oBACP,IAAI,EAAE,WAAoB;oBAC1B,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,IAAI;oBAC7B,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;wBACtC,EAAE,EAAE,EAAE,CAAC,EAAE;wBACT,IAAI,EAAE,UAAmB;wBACzB,QAAQ,EAAE,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE;qBACtE,CAAC,CAAC;iBACJ;gBACD,aAAa,EAAE,IAAI,CAAC,aAAa;uBAC5B,CAAC,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC;aAC7E;SACF;QACD,KAAK;KACN,CAAA;AACH,CAAC;AAED,MAAM,SAAS,GAAe;IAC5B,IAAI,EAAE,QAAQ;IACd,WAAW,EAAE,eAAe;IAC5B,YAAY,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;CACxE,CAAA;AAED,QAAQ,CAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,EAAE,CAAC,2DAA2D,EAAE,GAAG,EAAE;QACnE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QACvC,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QACjC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAA;QAC1E,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAA;QAC3D,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,CAAC,GAAG,EAAE,CAAC,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,0BAA0B,CAAC,CAAA;IAC1F,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,8CAA8C,EAAE,GAAG,EAAE;QACtD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QACvC,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,SAAS,CAAA;QACtC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,IAAI,cAAc,EAAE,CAAA;YAC9B,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QAC9C,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,cAAc,GAAG,IAAI,CAAA;;gBACpD,OAAO,OAAO,CAAC,GAAG,CAAC,cAAc,CAAA;QACxC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,6BAA6B,EAAE,GAAG,EAAE;IAC3C,EAAE,CAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;QACnE,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAA;IACnD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;QACpC,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QACzE,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;IACvC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACzD,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9C,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;IAC7D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAClD,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kBAAkB,EAAE,GAAG,EAAE;QAC1B,MAAM,CAAC,GAAG,cAAc,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QACnD,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC,CAAA;IAC/C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iBAAiB,EAAE,GAAG,EAAE;QACzB,MAAM,CAAC,GAAG,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAClD,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAA;IACvD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,YAAY,EAAE,GAAG,EAAE;QACpB,MAAM,CAAC,GAAG,cAAc,CAAC,GAAG,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC3C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,GAAG,EAAE;QAC7D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;QACrC,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,UAAU,CAAA;QACrC,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAA;YAC/B,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAA;QAC7D,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,IAAI,CAAA;;gBAClD,OAAO,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;QACtC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,GAAG,EAAE;QACjD,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,cAAc,EAAE,CAAC,CAAA;QACrE,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAA;IAClD,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;IACrC,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,GAAG,EAAE,CAAC,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,CAAA;IAC1E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;QACtD,MAAM,CAAC,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oCAAoC,EAAE,KAAK,IAAI,EAAE;QAClD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;QACtD,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1D,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;QACvD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;IAChE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;QAC9D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,0BAA0B,CAAA;QACpD,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAEjF,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,CAAC,CAAA;YACtD,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAE1D,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YACvD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,8CAA8C,CAAC,CAAA;QAClE,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAA;;gBACjD,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QACrC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iEAAiE,EAAE,KAAK,IAAI,EAAE;QAC/E,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,2BAA2B,CAAA;QACrD,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAEjF,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAA;YACrD,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAE1D,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YACvD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAA;QAChE,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAA;;gBACjD,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QACrC,CAAC;IACH,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wCAAwC,EAAE,KAAK,IAAI,EAAE;QACtD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QACpC,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,oBAAoB,CAAA;QAC9C,IAAI,CAAC;YACH,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;YAEjF,MAAM,CAAC,GAAG,cAAc,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,sBAAsB,EAAE,CAAC,CAAA;YACvF,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;YAE1D,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;YACvD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAA;QAC3D,CAAC;gBAAS,CAAC;YACT,IAAI,IAAI,KAAK,SAAS;gBAAE,OAAO,CAAC,GAAG,CAAC,WAAW,GAAG,IAAI,CAAA;;gBACjD,OAAO,OAAO,CAAC,GAAG,CAAC,WAAW,CAAA;QACrC,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,oCAAoC,EAAE,GAAG,EAAE;IAClD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC,CAAA;QAEpF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAA;QACjE,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,gFAAgF,EAAE,KAAK,IAAI,EAAE;QAC9F,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3D,UAAU,EAAE,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC;SAChE,CAAC,CAAC,CAAC,CAAA;QAEJ,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;QAElF,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAA;QAC1C,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC7B,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE;SACrE,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,oDAAoD,EAAE,KAAK,IAAI,EAAE;QAClE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3D,OAAO,EAAE,cAAc;YACvB,aAAa,EAAE,QAAQ;SACxB,CAAC,CAAC,CAAC,CAAA;QAEJ,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,4GAA4G,EAAE,KAAK,IAAI,EAAE;QAC1H,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3D,OAAO,EAAE,IAAI;YACb,aAAa,EAAE,IAAI;YACnB,iBAAiB,EAAE,EAAE;YACrB,aAAa,EAAE,GAAG;YAClB,kBAAkB,EAAE,GAAG;SACxB,CAAC,CAAC,CAAC,CAAA;QAEJ,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;YAChC,oBAAoB,EAAE,GAAG;YACzB,wBAAwB,EAAE,GAAG;SAC9B,CAAC,CAAA;QACF,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,EAAE,WAAW,EAAE,GAAG,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAA;IACtE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;QAC7E,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,aAAa,EAAE,CAAA;IAC3C,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,SAAS,QAAQ;QACf,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAgB,CAAA;QACnC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAc,CAA4B,CAAA;IACnE,CAAC;IAED,SAAS,WAAW;QAClB,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,CAAgB,CAAA;QACnC,OAAO,IAAI,CAAC,OAAiC,CAAA;IAC/C,CAAC;IAED,EAAE,CAAC,mEAAmE,EAAE,KAAK,IAAI,EAAE;QACjF,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE;YACzD,WAAW,EAAE,GAAG;YAChB,IAAI,EAAE,GAAG;YACT,aAAa,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;SAChC,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAA;QACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAA;QAC5B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;QACvD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1D,MAAM,IAAI,GAAG,QAAQ,EAAE,CAAA;QACvB,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,aAAa,EAAE,CAAA;QACxC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAA;QAClC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,aAAa,EAAE,CAAA;IACnC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;QAC9D,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,KAAK,EAAE,aAAa,EAAE,CAAC,CAAA;QAEpF,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,yDAAyD,EAAE,KAAK,IAAI,EAAE;QACvE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC;YAC3B,MAAM,EAAE,QAAQ;YAChB,cAAc,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE;SACtC,CAAC,CAAA;QACF,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1D,MAAM,OAAO,GAAG,WAAW,EAAE,CAAA;QAC7B,MAAM,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAA;QACtD,MAAM,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAA;QACxD,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IACzC,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6BAA6B,EAAE,KAAK,IAAI,EAAE;QAC3C,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC9C,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1D,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAW,CAAA;QAChD,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAA;IACrE,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,qCAAqC,EAAE,GAAG,EAAE;IACnD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,SAAS,YAAY;QACnB,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAA;QAClE,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,IAAI,CAAC,CAAC,CAAiB,CAAC,IAAc,CAA4B,CAAA;QAC3F,OAAO,IAAI,CAAC,QAA0C,CAAA;IACxD,CAAC;IAED,EAAE,CAAC,iDAAiD,EAAE,KAAK,IAAI,EAAE;QAC/D,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEjE,MAAM,IAAI,GAAG,YAAY,EAAE,CAAA;QAC3B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC,CAAA;QAClE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACrF,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAA;QAEnF,MAAM,QAAQ,GAAc;YAC1B,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,EAAE;YACtC;gBACE,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE;oBACnC,EAAE,IAAI,EAAE,UAAU,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE;iBACrE;aACF;YACD;gBACE,IAAI,EAAE,MAAM;gBACZ,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,mBAAmB,EAAE;iBACzE;aACF;SACF,CAAA;QAED,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;QAE1C,MAAM,IAAI,GAAG,YAAY,EAAE,CAAA;QAC3B,kDAAkD;QAClD,MAAM,CAAC,IAAI,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAA;QAC5B,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACtC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACzC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC;YACjC,EAAE,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE;SACvG,CAAC,CAAA;QACF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;YACtB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,mBAAmB;YAC5B,YAAY,EAAE,IAAI;SACnB,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;QAC7D,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,SAAS,CAAC,CAAC,CAAA;QAEnE,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAiB,CAAC,IAAc,CAA4B,CAAA;QAC9G,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC;YACzB;gBACE,IAAI,EAAE,UAAU;gBAChB,QAAQ,EAAE;oBACR,IAAI,EAAE,QAAQ;oBACd,WAAW,EAAE,eAAe;oBAC5B,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,EAAE,EAAE;iBACtE;aACF;SACF,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,kDAAkD,EAAE,KAAK,IAAI,EAAE;QAChE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAA;QAEjF,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAE1D,MAAM,SAAS,GAAG,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAE,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAiB,CAAC,IAAc,CAA4B,CAAA;QAC9G,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,CAAA;IACpC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,sCAAsC,EAAE,GAAG,EAAE;IACpD,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,6DAA6D,EAAE,KAAK,IAAI,EAAE;QAC3E,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3D,OAAO,EAAE,kDAAkD;SAC5D,CAAC,CAAC,CAAC,CAAA;QAEJ,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAA;IAChF,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3D,OAAO,EAAE,2BAA2B;SACrC,CAAC,CAAC,CAAC,CAAA;QAEJ,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kBAAkB,EAAE,CAAC,CAAC,CAAA;IAC9E,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qDAAqD,EAAE,KAAK,IAAI,EAAE;QACnE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,QAAQ,CAAC;YAC3D,OAAO,EAAE,kDAAkD;SAC5D,CAAC,CAAC,CAAC,CAAA;QAEJ,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,cAAc,EAAE,KAAK,EAAE,CAAC,CAAA;QACpE,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAEzE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC;YAC7B,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,kDAAkD,EAAE;SAC3E,CAAC,CAAA;IACJ,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAEF,QAAQ,CAAC,iCAAiC,EAAE,GAAG,EAAE;IAC/C,UAAU,CAAC,GAAG,EAAE;QACd,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,SAAS,CAAC,GAAG,EAAE;QACb,EAAE,CAAC,gBAAgB,EAAE,CAAA;IACvB,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,sDAAsD,EAAE,KAAK,IAAI,EAAE;QACpE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CACpC,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CACrD,CAAA;QAED,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QAC7D,MAAM,MAAM,CACV,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrD,CAAC,OAAO,CAAC,OAAO,CAAC,sCAAsC,CAAC,CAAA;IAC3D,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wEAAwE,EAAE,KAAK,IAAI,EAAE;QACtF,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CACpC,YAAY,CAAC,eAAe,EAAE,GAAG,EAAE,qBAAqB,CAAC,CAC1D,CAAA;QAED,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAA;QAE7D,IAAI,MAAe,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,CAAA;QACd,CAAC;QACD,MAAM,CAAC,MAAM,CAAC,CAAC,cAAc,CAAC,KAAK,CAAC,CAAA;QACpC,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;QACtE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CACpC,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAAE,GAAG,CAAC,CACrD,CAAA;QAED,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAE7C,IAAI,MAAe,CAAA;QACnB,IAAI,CAAC;YACH,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAAA;QAC5D,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,GAAG,GAAG,CAAA;QACd,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;IAC9C,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;QACzD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,UAAU,EAAE,GAAG,CAAC,CAAC,CAAA;QAErE,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,CACV,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrD,CAAC,OAAO,CAAC,OAAO,CAAC,+CAA+C,CAAC,CAAA;IACpE,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,0CAA0C,EAAE,KAAK,IAAI,EAAE;QACxD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,EAAE,cAAc,EAAE,EAAE,CAAC,CAAC,CAAA;QAE5F,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,CACV,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrD,CAAC,OAAO,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAA;IACrD,CAAC,CAAC,CAAA;IAEF,EAAE,CAAC,qCAAqC,EAAE,KAAK,IAAI,EAAE;QACnD,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,qBAAqB,CAAC,YAAY,CAAC;YAClD,EAAE,EAAE,GAAG;YACP,OAAO,EAAE,EAAE;YACX,KAAK,EAAE,EAAE,aAAa,EAAE,CAAC,EAAE,iBAAiB,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE;SACnE,CAAC,CAAC,CAAA;QAEH,MAAM,CAAC,GAAG,IAAI,cAAc,CAAC,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;QAC7C,MAAM,MAAM,CACV,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrD,CAAC,OAAO,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAA;IACrC,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["../../src/tools/tasks.ts"],"names":[],"mappings":"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"}
@@ -505,16 +505,36 @@ function notifyTaskUpdate(manager, action, options) {
505
505
  export function createTaskCreateTool(manager, options = {}) {
506
506
  return {
507
507
  name: "TaskCreate",
508
- description: `Create a task in the task list. Duplicates are automatically rejected.
508
+ description: `Create a task in the task list. Use this to track progress on multi-step work. Duplicates are automatically rejected.
509
+
510
+ ## When to Use
511
+
512
+ Use proactively when:
513
+ - The request requires 3+ distinct steps
514
+ - The user provides multiple items to accomplish
515
+ - You are starting work after receiving new instructions — capture requirements as tasks BEFORE starting
516
+ - After completing a task — add follow-up tasks discovered during implementation
517
+
518
+ Do NOT use when:
519
+ - Single, trivial task (just do it)
520
+ - Purely informational or conversational request
521
+ - Less than 3 steps needed
522
+
523
+ ## Creating Good Tasks
524
+
525
+ - Create ALL tasks upfront before starting any work
526
+ - Each task = one logical unit of work, not one per file
527
+ - Include implicit steps: testing, building, verification
528
+ - Provide both subject (imperative) and activeForm (present continuous)
529
+ - Include enough context in description for the task to be self-contained
509
530
 
510
531
  ## Fields
511
532
 
512
- - **subject**: Brief, actionable title in imperative form (e.g., "Fix authentication bug")
533
+ - **subject**: Brief, actionable title in imperative form (e.g., "Fix authentication bug in login flow")
513
534
  - **description**: What needs to be done, including context and acceptance criteria
514
- - **activeForm**: Present continuous form shown in spinner when in_progress (e.g., "Fixing authentication bug")
535
+ - **activeForm**: Present continuous form shown in spinner when in_progress (e.g., "Fixing authentication bug"). Always provide this.
515
536
 
516
- Always provide activeForm. Tasks are created with status \`pending\` (first task auto-starts).
517
- `,
537
+ Tasks start as \`pending\`. First task auto-starts as \`in_progress\`. Duplicates are rejected.`,
518
538
  parameters: {
519
539
  type: "object",
520
540
  properties: {
@@ -733,14 +753,22 @@ Only mark completed when fully done. If blocked, keep as in_progress.
733
753
  if (status === 'completed') {
734
754
  message = `Completed task #${taskId}: "${result.task.subject}"`;
735
755
  if (result.next) {
736
- message += `. Next: #${result.next.id} "${result.next.subject}"`;
756
+ message += `\nNext task: #${result.next.id} "${result.next.subject}" (auto-started). Begin working on it now.`;
737
757
  }
738
758
  else if (manager.isAllCompleted()) {
739
- message += `. All tasks completed!`;
759
+ const allTasks = manager.getAll();
760
+ const hasVerification = allTasks.some(t => /verif|test|build|lint|check|run.*test/i.test(t.subject));
761
+ if (allTasks.length >= 3 && !hasVerification) {
762
+ message += `\nAll tasks completed — but none was a verification step. Create a verification task (run tests, build, or lint) before responding to the user.`;
763
+ }
764
+ else {
765
+ message += `\nAll tasks completed! Respond to the user with a summary of what was done.`;
766
+ }
740
767
  }
741
768
  }
742
769
  else if (status === 'in_progress') {
743
770
  message = `Started task #${taskId}: "${result.task.subject}"`;
771
+ message += `\nDo the work, then mark this task completed with TaskUpdate before moving on.`;
744
772
  }
745
773
  return {
746
774
  success: true,
@@ -792,7 +820,17 @@ export function createTaskGetTool(manager, _options = {}) {
792
820
  export function createTaskListTool(manager, options = {}) {
793
821
  return {
794
822
  name: "TaskList",
795
- description: `List all tasks with their ID, subject, status, and owner. Use after completing a task to find the next one.`,
823
+ description: `List all tasks with ID, subject, status, owner, and blockers.
824
+
825
+ Use after completing a task to find the next available one.
826
+ Prefer tasks in ID order (lowest first) — earlier tasks often set up context for later ones.
827
+
828
+ ## Output
829
+ - id: Task identifier
830
+ - subject: Brief description
831
+ - status: pending, in_progress, or completed
832
+ - owner: Agent name if assigned, empty if available
833
+ - blockedBy: Open task IDs that must complete first (resolved blockers are hidden)`,
796
834
  parameters: {
797
835
  type: "object",
798
836
  properties: {},