wiggum-cli 0.2.5 → 0.2.6
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.
- package/dist/ai/enhancer.d.ts.map +1 -1
- package/dist/ai/enhancer.js +52 -6
- package/dist/ai/enhancer.js.map +1 -1
- package/package.json +1 -1
- package/src/ai/enhancer.ts +58 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhancer.d.ts","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAY,KAAK,UAAU,EAAgD,MAAM,gBAAgB,CAAC;AAKzG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,kDAAkD;IAClD,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,iCAAiC;IACjC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,wDAAwD;IACxD,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;
|
|
1
|
+
{"version":3,"file":"enhancer.d.ts","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,UAAU,EAAkC,MAAM,qBAAqB,CAAC;AACtF,OAAO,EAAY,KAAK,UAAU,EAAgD,MAAM,gBAAgB,CAAC;AAKzG;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,4BAA4B;IAC5B,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB,+CAA+C;IAC/C,cAAc,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACxC,6CAA6C;IAC7C,iBAAiB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,2CAA2C;IAC3C,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IACrB,2CAA2C;IAC3C,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,oCAAoC;IACpC,cAAc,CAAC,EAAE,cAAc,CAAC;IAChC,0CAA0C;IAC1C,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IAC5B,kDAAkD;IAClD,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAC;IACpC,iCAAiC;IACjC,UAAU,CAAC,EAAE,kBAAkB,CAAC;IAChC,wDAAwD;IACxD,0BAA0B,CAAC,EAAE,MAAM,EAAE,CAAC;CACvC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAC9B,UAAU,EAAE,OAAO,CAAC;IACpB,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,UAAU,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,kEAAkE;IAClE,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAqFD;;;GAGG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,KAAK,CAAC,CAAS;IACvB,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,OAAO,CAAU;gBAEb,OAAO,GAAE,eAAoB;IAOzC;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;OAEG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,kBAAkB,CAAC;IAgElE;;OAEG;YACW,aAAa;IAmB3B;;OAEG;YACW,cAAc;CA+E7B;AAED;;GAEG;AACH,wBAAsB,aAAa,CACjC,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAG7B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,gBAAgB,GAAG,MAAM,CAwEnE"}
|
package/dist/ai/enhancer.js
CHANGED
|
@@ -10,7 +10,13 @@ import { logger } from '../utils/logger.js';
|
|
|
10
10
|
/**
|
|
11
11
|
* Parse AI response JSON safely
|
|
12
12
|
*/
|
|
13
|
-
function parseAIResponse(text) {
|
|
13
|
+
function parseAIResponse(text, verbose = false) {
|
|
14
|
+
if (!text || text.trim() === '') {
|
|
15
|
+
if (verbose) {
|
|
16
|
+
logger.warn('AI response text is empty');
|
|
17
|
+
}
|
|
18
|
+
return null;
|
|
19
|
+
}
|
|
14
20
|
try {
|
|
15
21
|
// Try to extract JSON from the response
|
|
16
22
|
// The AI might wrap it in markdown code blocks
|
|
@@ -20,15 +26,32 @@ function parseAIResponse(text) {
|
|
|
20
26
|
if (jsonMatch) {
|
|
21
27
|
jsonText = jsonMatch[1];
|
|
22
28
|
}
|
|
23
|
-
// Try to find JSON object
|
|
29
|
+
// Try to find JSON object - use greedy match for the outermost braces
|
|
30
|
+
// This handles cases where there's text before/after the JSON
|
|
24
31
|
const objectMatch = jsonText.match(/\{[\s\S]*\}/);
|
|
25
32
|
if (objectMatch) {
|
|
26
33
|
jsonText = objectMatch[0];
|
|
27
34
|
}
|
|
28
|
-
|
|
35
|
+
// Try to parse JSON
|
|
36
|
+
const result = JSON.parse(jsonText);
|
|
37
|
+
// Validate that we got the expected structure
|
|
38
|
+
if (!result || typeof result !== 'object') {
|
|
39
|
+
if (verbose) {
|
|
40
|
+
logger.warn('AI response parsed but is not an object');
|
|
41
|
+
}
|
|
42
|
+
return null;
|
|
43
|
+
}
|
|
44
|
+
return result;
|
|
29
45
|
}
|
|
30
46
|
catch (error) {
|
|
31
|
-
|
|
47
|
+
if (verbose) {
|
|
48
|
+
logger.warn(`Failed to parse AI response as JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
49
|
+
// Log first 500 chars of response for debugging
|
|
50
|
+
logger.warn(`Response preview: ${text.substring(0, 500)}...`);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
logger.warn('Failed to parse AI response as JSON');
|
|
54
|
+
}
|
|
32
55
|
return null;
|
|
33
56
|
}
|
|
34
57
|
}
|
|
@@ -193,7 +216,7 @@ When done exploring, output your final analysis as valid JSON matching this stru
|
|
|
193
216
|
}`;
|
|
194
217
|
// Use agentic loop - AI will call tools until it has enough info
|
|
195
218
|
// stopWhen: stepCountIs(10) allows up to 10 tool-calling steps
|
|
196
|
-
const
|
|
219
|
+
const result = await generateText({
|
|
197
220
|
model,
|
|
198
221
|
system: SYSTEM_PROMPT_AGENTIC,
|
|
199
222
|
prompt,
|
|
@@ -203,7 +226,30 @@ When done exploring, output your final analysis as valid JSON matching this stru
|
|
|
203
226
|
// Reasoning models don't support temperature
|
|
204
227
|
...(isReasoningModel(modelId) ? {} : { temperature: 0.3 }),
|
|
205
228
|
});
|
|
206
|
-
|
|
229
|
+
// Try to get text from the result
|
|
230
|
+
let textToParse = result.text;
|
|
231
|
+
// If text is empty, try to extract from steps
|
|
232
|
+
if (!textToParse || textToParse.trim() === '') {
|
|
233
|
+
if (this.verbose) {
|
|
234
|
+
logger.info(`No direct text output, checking ${result.steps?.length || 0} steps...`);
|
|
235
|
+
}
|
|
236
|
+
// Look through steps for text content (from last to first)
|
|
237
|
+
const steps = result.steps || [];
|
|
238
|
+
for (let i = steps.length - 1; i >= 0; i--) {
|
|
239
|
+
const step = steps[i];
|
|
240
|
+
if (step.text && step.text.trim() !== '') {
|
|
241
|
+
textToParse = step.text;
|
|
242
|
+
if (this.verbose) {
|
|
243
|
+
logger.info(`Found text in step ${i + 1}`);
|
|
244
|
+
}
|
|
245
|
+
break;
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (this.verbose && (!textToParse || textToParse.trim() === '')) {
|
|
250
|
+
logger.warn('No text output found in response or steps');
|
|
251
|
+
}
|
|
252
|
+
return parseAIResponse(textToParse, this.verbose);
|
|
207
253
|
}
|
|
208
254
|
}
|
|
209
255
|
/**
|
package/dist/ai/enhancer.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"enhancer.js","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AAE/C,OAAO,EAAE,QAAQ,EAAmB,SAAS,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AACzG,OAAO,EAAE,aAAa,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAC1F,OAAO,EAAE,sBAAsB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,oBAAoB,CAAC;AAyE5C;;GAEG;AACH,SAAS,eAAe,CAAC,IAAY;
|
|
1
|
+
{"version":3,"file":"enhancer.js","sourceRoot":"","sources":["../../src/ai/enhancer.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
package/src/ai/enhancer.ts
CHANGED
|
@@ -84,7 +84,14 @@ export interface EnhancerOptions {
|
|
|
84
84
|
/**
|
|
85
85
|
* Parse AI response JSON safely
|
|
86
86
|
*/
|
|
87
|
-
function parseAIResponse(text: string): AIAnalysisResult | null {
|
|
87
|
+
function parseAIResponse(text: string, verbose: boolean = false): AIAnalysisResult | null {
|
|
88
|
+
if (!text || text.trim() === '') {
|
|
89
|
+
if (verbose) {
|
|
90
|
+
logger.warn('AI response text is empty');
|
|
91
|
+
}
|
|
92
|
+
return null;
|
|
93
|
+
}
|
|
94
|
+
|
|
88
95
|
try {
|
|
89
96
|
// Try to extract JSON from the response
|
|
90
97
|
// The AI might wrap it in markdown code blocks
|
|
@@ -96,15 +103,33 @@ function parseAIResponse(text: string): AIAnalysisResult | null {
|
|
|
96
103
|
jsonText = jsonMatch[1];
|
|
97
104
|
}
|
|
98
105
|
|
|
99
|
-
// Try to find JSON object
|
|
106
|
+
// Try to find JSON object - use greedy match for the outermost braces
|
|
107
|
+
// This handles cases where there's text before/after the JSON
|
|
100
108
|
const objectMatch = jsonText.match(/\{[\s\S]*\}/);
|
|
101
109
|
if (objectMatch) {
|
|
102
110
|
jsonText = objectMatch[0];
|
|
103
111
|
}
|
|
104
112
|
|
|
105
|
-
|
|
113
|
+
// Try to parse JSON
|
|
114
|
+
const result = JSON.parse(jsonText) as AIAnalysisResult;
|
|
115
|
+
|
|
116
|
+
// Validate that we got the expected structure
|
|
117
|
+
if (!result || typeof result !== 'object') {
|
|
118
|
+
if (verbose) {
|
|
119
|
+
logger.warn('AI response parsed but is not an object');
|
|
120
|
+
}
|
|
121
|
+
return null;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
return result;
|
|
106
125
|
} catch (error) {
|
|
107
|
-
|
|
126
|
+
if (verbose) {
|
|
127
|
+
logger.warn(`Failed to parse AI response as JSON: ${error instanceof Error ? error.message : String(error)}`);
|
|
128
|
+
// Log first 500 chars of response for debugging
|
|
129
|
+
logger.warn(`Response preview: ${text.substring(0, 500)}...`);
|
|
130
|
+
} else {
|
|
131
|
+
logger.warn('Failed to parse AI response as JSON');
|
|
132
|
+
}
|
|
108
133
|
return null;
|
|
109
134
|
}
|
|
110
135
|
}
|
|
@@ -301,7 +326,7 @@ When done exploring, output your final analysis as valid JSON matching this stru
|
|
|
301
326
|
|
|
302
327
|
// Use agentic loop - AI will call tools until it has enough info
|
|
303
328
|
// stopWhen: stepCountIs(10) allows up to 10 tool-calling steps
|
|
304
|
-
const
|
|
329
|
+
const result = await generateText({
|
|
305
330
|
model,
|
|
306
331
|
system: SYSTEM_PROMPT_AGENTIC,
|
|
307
332
|
prompt,
|
|
@@ -312,7 +337,34 @@ When done exploring, output your final analysis as valid JSON matching this stru
|
|
|
312
337
|
...(isReasoningModel(modelId) ? {} : { temperature: 0.3 }),
|
|
313
338
|
});
|
|
314
339
|
|
|
315
|
-
|
|
340
|
+
// Try to get text from the result
|
|
341
|
+
let textToParse = result.text;
|
|
342
|
+
|
|
343
|
+
// If text is empty, try to extract from steps
|
|
344
|
+
if (!textToParse || textToParse.trim() === '') {
|
|
345
|
+
if (this.verbose) {
|
|
346
|
+
logger.info(`No direct text output, checking ${result.steps?.length || 0} steps...`);
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// Look through steps for text content (from last to first)
|
|
350
|
+
const steps = result.steps || [];
|
|
351
|
+
for (let i = steps.length - 1; i >= 0; i--) {
|
|
352
|
+
const step = steps[i];
|
|
353
|
+
if (step.text && step.text.trim() !== '') {
|
|
354
|
+
textToParse = step.text;
|
|
355
|
+
if (this.verbose) {
|
|
356
|
+
logger.info(`Found text in step ${i + 1}`);
|
|
357
|
+
}
|
|
358
|
+
break;
|
|
359
|
+
}
|
|
360
|
+
}
|
|
361
|
+
}
|
|
362
|
+
|
|
363
|
+
if (this.verbose && (!textToParse || textToParse.trim() === '')) {
|
|
364
|
+
logger.warn('No text output found in response or steps');
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
return parseAIResponse(textToParse, this.verbose);
|
|
316
368
|
}
|
|
317
369
|
}
|
|
318
370
|
|