erosolar-cli 1.6.2 → 1.6.4
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/core/resultVerification.d.ts +113 -0
- package/dist/core/resultVerification.d.ts.map +1 -0
- package/dist/core/resultVerification.js +359 -0
- package/dist/core/resultVerification.js.map +1 -0
- package/dist/tools/bashTools.d.ts.map +1 -1
- package/dist/tools/bashTools.js +22 -8
- package/dist/tools/bashTools.js.map +1 -1
- package/dist/tools/cloudTools.d.ts.map +1 -1
- package/dist/tools/cloudTools.js +380 -25
- package/dist/tools/cloudTools.js.map +1 -1
- package/dist/ui/persistentPrompt.d.ts +32 -0
- package/dist/ui/persistentPrompt.d.ts.map +1 -1
- package/dist/ui/persistentPrompt.js +182 -57
- package/dist/ui/persistentPrompt.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result Verification Framework
|
|
3
|
+
*
|
|
4
|
+
* Prevents erosolar-cli from hallucinating success by requiring explicit
|
|
5
|
+
* verification of tool operation outcomes. All critical operations must
|
|
6
|
+
* return structured results with verification status.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: LLMs can misinterpret ambiguous output as success.
|
|
9
|
+
* This module ensures clear, unambiguous success/failure signals.
|
|
10
|
+
*
|
|
11
|
+
* @license MIT
|
|
12
|
+
* @author Bo Shang
|
|
13
|
+
*/
|
|
14
|
+
export type VerificationStatus = 'VERIFIED_SUCCESS' | 'VERIFIED_FAILURE' | 'UNVERIFIED' | 'PARTIAL_SUCCESS' | 'REQUIRES_USER_ACTION';
|
|
15
|
+
export interface VerifiedResult {
|
|
16
|
+
/** Clear status for LLM to interpret */
|
|
17
|
+
status: VerificationStatus;
|
|
18
|
+
/** Human-readable summary (first line must state success/failure clearly) */
|
|
19
|
+
summary: string;
|
|
20
|
+
/** Detailed output from the operation */
|
|
21
|
+
details: string;
|
|
22
|
+
/** Specific verification checks that were performed */
|
|
23
|
+
verificationChecks?: VerificationCheck[];
|
|
24
|
+
/** Suggested next steps if operation failed or requires action */
|
|
25
|
+
suggestedActions?: string[];
|
|
26
|
+
/** Timestamp of verification */
|
|
27
|
+
verifiedAt: string;
|
|
28
|
+
/** Time elapsed for operation in ms */
|
|
29
|
+
durationMs?: number;
|
|
30
|
+
}
|
|
31
|
+
export interface VerificationCheck {
|
|
32
|
+
/** What was checked */
|
|
33
|
+
check: string;
|
|
34
|
+
/** Did it pass */
|
|
35
|
+
passed: boolean;
|
|
36
|
+
/** Details about the check result */
|
|
37
|
+
details?: string;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Format a verified result into a clear, unambiguous string for LLM consumption.
|
|
41
|
+
* The format is designed to prevent misinterpretation.
|
|
42
|
+
*/
|
|
43
|
+
export declare function formatVerifiedResult(result: VerifiedResult): string;
|
|
44
|
+
/**
|
|
45
|
+
* Create a verified success result
|
|
46
|
+
*/
|
|
47
|
+
export declare function verifiedSuccess(summary: string, details: string, checks?: VerificationCheck[], durationMs?: number): string;
|
|
48
|
+
/**
|
|
49
|
+
* Create a verified failure result
|
|
50
|
+
*/
|
|
51
|
+
export declare function verifiedFailure(summary: string, details: string, suggestedActions?: string[], checks?: VerificationCheck[], durationMs?: number): string;
|
|
52
|
+
/**
|
|
53
|
+
* Create an unverified result (when we can't confirm success)
|
|
54
|
+
*/
|
|
55
|
+
export declare function unverifiedResult(summary: string, details: string, suggestedActions?: string[], durationMs?: number): string;
|
|
56
|
+
/**
|
|
57
|
+
* Create a partial success result
|
|
58
|
+
*/
|
|
59
|
+
export declare function partialSuccess(summary: string, details: string, checks: VerificationCheck[], suggestedActions?: string[], durationMs?: number): string;
|
|
60
|
+
/**
|
|
61
|
+
* Create a result requiring user action
|
|
62
|
+
*/
|
|
63
|
+
export declare function requiresUserAction(summary: string, details: string, requiredActions: string[], durationMs?: number): string;
|
|
64
|
+
/**
|
|
65
|
+
* Verification patterns for common outputs
|
|
66
|
+
*/
|
|
67
|
+
export declare const OutputPatterns: {
|
|
68
|
+
firebase: {
|
|
69
|
+
success: RegExp[];
|
|
70
|
+
failure: RegExp[];
|
|
71
|
+
authRequired: RegExp[];
|
|
72
|
+
};
|
|
73
|
+
command: {
|
|
74
|
+
success: RegExp[];
|
|
75
|
+
failure: RegExp[];
|
|
76
|
+
};
|
|
77
|
+
npm: {
|
|
78
|
+
success: RegExp[];
|
|
79
|
+
failure: RegExp[];
|
|
80
|
+
};
|
|
81
|
+
git: {
|
|
82
|
+
success: RegExp[];
|
|
83
|
+
failure: RegExp[];
|
|
84
|
+
};
|
|
85
|
+
};
|
|
86
|
+
/**
|
|
87
|
+
* Analyze output against patterns to determine success/failure
|
|
88
|
+
*/
|
|
89
|
+
export declare function analyzeOutput(output: string, patterns: {
|
|
90
|
+
success: RegExp[];
|
|
91
|
+
failure: RegExp[];
|
|
92
|
+
}, exitCode?: number): {
|
|
93
|
+
isSuccess: boolean;
|
|
94
|
+
isFailure: boolean;
|
|
95
|
+
matchedPattern?: string;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* Create a verification check from a command result
|
|
99
|
+
*/
|
|
100
|
+
export declare function createCommandCheck(checkName: string, exitCode: number, output: string, expectedPatterns?: RegExp[]): VerificationCheck;
|
|
101
|
+
/**
|
|
102
|
+
* Verify that a file exists and optionally contains expected content
|
|
103
|
+
*/
|
|
104
|
+
export declare function verifyFileExists(filePath: string, expectedContent?: string | RegExp): Promise<VerificationCheck>;
|
|
105
|
+
/**
|
|
106
|
+
* Verify URL is accessible (for deployment verification)
|
|
107
|
+
*/
|
|
108
|
+
export declare function verifyUrlAccessible(url: string, expectedStatus?: number, timeoutMs?: number): Promise<VerificationCheck>;
|
|
109
|
+
/**
|
|
110
|
+
* Verify a JSON response matches expected structure
|
|
111
|
+
*/
|
|
112
|
+
export declare function verifyJsonEndpoint(url: string, expectedFields: string[], timeoutMs?: number): Promise<VerificationCheck>;
|
|
113
|
+
//# sourceMappingURL=resultVerification.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultVerification.d.ts","sourceRoot":"","sources":["../../src/core/resultVerification.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,359 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Result Verification Framework
|
|
3
|
+
*
|
|
4
|
+
* Prevents erosolar-cli from hallucinating success by requiring explicit
|
|
5
|
+
* verification of tool operation outcomes. All critical operations must
|
|
6
|
+
* return structured results with verification status.
|
|
7
|
+
*
|
|
8
|
+
* CRITICAL: LLMs can misinterpret ambiguous output as success.
|
|
9
|
+
* This module ensures clear, unambiguous success/failure signals.
|
|
10
|
+
*
|
|
11
|
+
* @license MIT
|
|
12
|
+
* @author Bo Shang
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Format a verified result into a clear, unambiguous string for LLM consumption.
|
|
16
|
+
* The format is designed to prevent misinterpretation.
|
|
17
|
+
*/
|
|
18
|
+
export function formatVerifiedResult(result) {
|
|
19
|
+
const lines = [];
|
|
20
|
+
// CRITICAL: First line must be unambiguous status
|
|
21
|
+
switch (result.status) {
|
|
22
|
+
case 'VERIFIED_SUCCESS':
|
|
23
|
+
lines.push('═══ VERIFIED SUCCESS ═══');
|
|
24
|
+
break;
|
|
25
|
+
case 'VERIFIED_FAILURE':
|
|
26
|
+
lines.push('═══ VERIFIED FAILURE ═══');
|
|
27
|
+
break;
|
|
28
|
+
case 'UNVERIFIED':
|
|
29
|
+
lines.push('═══ UNVERIFIED (CANNOT CONFIRM SUCCESS) ═══');
|
|
30
|
+
break;
|
|
31
|
+
case 'PARTIAL_SUCCESS':
|
|
32
|
+
lines.push('═══ PARTIAL SUCCESS (SOME OPERATIONS FAILED) ═══');
|
|
33
|
+
break;
|
|
34
|
+
case 'REQUIRES_USER_ACTION':
|
|
35
|
+
lines.push('═══ BLOCKED: USER ACTION REQUIRED ═══');
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
lines.push('');
|
|
39
|
+
lines.push(`Summary: ${result.summary}`);
|
|
40
|
+
lines.push('');
|
|
41
|
+
// Show verification checks if any
|
|
42
|
+
if (result.verificationChecks && result.verificationChecks.length > 0) {
|
|
43
|
+
lines.push('Verification Checks:');
|
|
44
|
+
for (const check of result.verificationChecks) {
|
|
45
|
+
const icon = check.passed ? '✓' : '✗';
|
|
46
|
+
lines.push(` ${icon} ${check.check}${check.details ? `: ${check.details}` : ''}`);
|
|
47
|
+
}
|
|
48
|
+
lines.push('');
|
|
49
|
+
}
|
|
50
|
+
// Show details
|
|
51
|
+
if (result.details) {
|
|
52
|
+
lines.push('Details:');
|
|
53
|
+
lines.push(result.details);
|
|
54
|
+
lines.push('');
|
|
55
|
+
}
|
|
56
|
+
// Show suggested actions for non-success states
|
|
57
|
+
if (result.status !== 'VERIFIED_SUCCESS' && result.suggestedActions && result.suggestedActions.length > 0) {
|
|
58
|
+
lines.push('Required Actions:');
|
|
59
|
+
for (const action of result.suggestedActions) {
|
|
60
|
+
lines.push(` → ${action}`);
|
|
61
|
+
}
|
|
62
|
+
lines.push('');
|
|
63
|
+
}
|
|
64
|
+
// Footer with timestamp
|
|
65
|
+
if (result.durationMs !== undefined) {
|
|
66
|
+
lines.push(`[Verified at ${result.verifiedAt} | Duration: ${result.durationMs}ms]`);
|
|
67
|
+
}
|
|
68
|
+
else {
|
|
69
|
+
lines.push(`[Verified at ${result.verifiedAt}]`);
|
|
70
|
+
}
|
|
71
|
+
return lines.join('\n');
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Create a verified success result
|
|
75
|
+
*/
|
|
76
|
+
export function verifiedSuccess(summary, details, checks, durationMs) {
|
|
77
|
+
return formatVerifiedResult({
|
|
78
|
+
status: 'VERIFIED_SUCCESS',
|
|
79
|
+
summary,
|
|
80
|
+
details,
|
|
81
|
+
verificationChecks: checks,
|
|
82
|
+
verifiedAt: new Date().toISOString(),
|
|
83
|
+
durationMs,
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Create a verified failure result
|
|
88
|
+
*/
|
|
89
|
+
export function verifiedFailure(summary, details, suggestedActions, checks, durationMs) {
|
|
90
|
+
return formatVerifiedResult({
|
|
91
|
+
status: 'VERIFIED_FAILURE',
|
|
92
|
+
summary,
|
|
93
|
+
details,
|
|
94
|
+
verificationChecks: checks,
|
|
95
|
+
suggestedActions,
|
|
96
|
+
verifiedAt: new Date().toISOString(),
|
|
97
|
+
durationMs,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Create an unverified result (when we can't confirm success)
|
|
102
|
+
*/
|
|
103
|
+
export function unverifiedResult(summary, details, suggestedActions, durationMs) {
|
|
104
|
+
return formatVerifiedResult({
|
|
105
|
+
status: 'UNVERIFIED',
|
|
106
|
+
summary: `${summary} (VERIFICATION NOT POSSIBLE - DO NOT ASSUME SUCCESS)`,
|
|
107
|
+
details,
|
|
108
|
+
suggestedActions: suggestedActions || [
|
|
109
|
+
'Manually verify the operation completed as expected',
|
|
110
|
+
'Run verification commands to confirm state',
|
|
111
|
+
],
|
|
112
|
+
verifiedAt: new Date().toISOString(),
|
|
113
|
+
durationMs,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Create a partial success result
|
|
118
|
+
*/
|
|
119
|
+
export function partialSuccess(summary, details, checks, suggestedActions, durationMs) {
|
|
120
|
+
return formatVerifiedResult({
|
|
121
|
+
status: 'PARTIAL_SUCCESS',
|
|
122
|
+
summary,
|
|
123
|
+
details,
|
|
124
|
+
verificationChecks: checks,
|
|
125
|
+
suggestedActions,
|
|
126
|
+
verifiedAt: new Date().toISOString(),
|
|
127
|
+
durationMs,
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Create a result requiring user action
|
|
132
|
+
*/
|
|
133
|
+
export function requiresUserAction(summary, details, requiredActions, durationMs) {
|
|
134
|
+
return formatVerifiedResult({
|
|
135
|
+
status: 'REQUIRES_USER_ACTION',
|
|
136
|
+
summary,
|
|
137
|
+
details,
|
|
138
|
+
suggestedActions: requiredActions,
|
|
139
|
+
verifiedAt: new Date().toISOString(),
|
|
140
|
+
durationMs,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Verification patterns for common outputs
|
|
145
|
+
*/
|
|
146
|
+
export const OutputPatterns = {
|
|
147
|
+
// Firebase deployment patterns
|
|
148
|
+
firebase: {
|
|
149
|
+
success: [
|
|
150
|
+
/Deploy complete!/i,
|
|
151
|
+
/✔\s+Deploy complete/i,
|
|
152
|
+
/Hosting URL:/i,
|
|
153
|
+
/Function URL/i,
|
|
154
|
+
],
|
|
155
|
+
failure: [
|
|
156
|
+
/Error:/i,
|
|
157
|
+
/deploy failed/i,
|
|
158
|
+
/Authentication Error/i,
|
|
159
|
+
/not logged in/i,
|
|
160
|
+
/permission denied/i,
|
|
161
|
+
/PERMISSION_DENIED/i,
|
|
162
|
+
/quota exceeded/i,
|
|
163
|
+
/build error/i,
|
|
164
|
+
],
|
|
165
|
+
authRequired: [
|
|
166
|
+
/firebase login/i,
|
|
167
|
+
/not logged in/i,
|
|
168
|
+
/authenticate/i,
|
|
169
|
+
/FIREBASE_TOKEN/i,
|
|
170
|
+
],
|
|
171
|
+
},
|
|
172
|
+
// Generic command patterns
|
|
173
|
+
command: {
|
|
174
|
+
success: [
|
|
175
|
+
/^(success|completed|done|finished)/im,
|
|
176
|
+
/successfully/i,
|
|
177
|
+
],
|
|
178
|
+
failure: [
|
|
179
|
+
/^error/im,
|
|
180
|
+
/^fatal/im,
|
|
181
|
+
/failed/i,
|
|
182
|
+
/command not found/i,
|
|
183
|
+
/permission denied/i,
|
|
184
|
+
/access denied/i,
|
|
185
|
+
/ENOENT/i,
|
|
186
|
+
/EACCES/i,
|
|
187
|
+
/EPERM/i,
|
|
188
|
+
],
|
|
189
|
+
},
|
|
190
|
+
// NPM patterns
|
|
191
|
+
npm: {
|
|
192
|
+
success: [
|
|
193
|
+
/npm notice/i,
|
|
194
|
+
/\+ .+@\d+\.\d+\.\d+/, // Package published pattern
|
|
195
|
+
/published/i,
|
|
196
|
+
],
|
|
197
|
+
failure: [
|
|
198
|
+
/npm ERR!/i,
|
|
199
|
+
/ERESOLVE/i,
|
|
200
|
+
/E404/i,
|
|
201
|
+
/EINTEGRITY/i,
|
|
202
|
+
],
|
|
203
|
+
},
|
|
204
|
+
// Git patterns
|
|
205
|
+
git: {
|
|
206
|
+
success: [
|
|
207
|
+
/\[.+\s+\w+\]/, // Commit hash pattern
|
|
208
|
+
/pushed/i,
|
|
209
|
+
/merged/i,
|
|
210
|
+
],
|
|
211
|
+
failure: [
|
|
212
|
+
/fatal:/i,
|
|
213
|
+
/error:/i,
|
|
214
|
+
/conflict/i,
|
|
215
|
+
/rejected/i,
|
|
216
|
+
],
|
|
217
|
+
},
|
|
218
|
+
};
|
|
219
|
+
/**
|
|
220
|
+
* Analyze output against patterns to determine success/failure
|
|
221
|
+
*/
|
|
222
|
+
export function analyzeOutput(output, patterns, exitCode) {
|
|
223
|
+
// Check explicit failure patterns first
|
|
224
|
+
for (const pattern of patterns.failure) {
|
|
225
|
+
if (pattern.test(output)) {
|
|
226
|
+
return { isSuccess: false, isFailure: true, matchedPattern: pattern.source };
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
// Check success patterns
|
|
230
|
+
for (const pattern of patterns.success) {
|
|
231
|
+
if (pattern.test(output)) {
|
|
232
|
+
return { isSuccess: true, isFailure: false, matchedPattern: pattern.source };
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
// If we have an exit code, use it as fallback
|
|
236
|
+
if (exitCode !== undefined) {
|
|
237
|
+
return {
|
|
238
|
+
isSuccess: exitCode === 0,
|
|
239
|
+
isFailure: exitCode !== 0,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
// Cannot determine
|
|
243
|
+
return { isSuccess: false, isFailure: false };
|
|
244
|
+
}
|
|
245
|
+
/**
|
|
246
|
+
* Create a verification check from a command result
|
|
247
|
+
*/
|
|
248
|
+
export function createCommandCheck(checkName, exitCode, output, expectedPatterns) {
|
|
249
|
+
let passed = exitCode === 0;
|
|
250
|
+
let details = exitCode === 0 ? 'Exit code 0' : `Exit code ${exitCode}`;
|
|
251
|
+
// If we have expected patterns, check for them
|
|
252
|
+
if (expectedPatterns && passed) {
|
|
253
|
+
const foundPattern = expectedPatterns.some((p) => p.test(output));
|
|
254
|
+
if (!foundPattern) {
|
|
255
|
+
passed = false;
|
|
256
|
+
details = 'Exit code 0 but expected output pattern not found';
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
return {
|
|
260
|
+
check: checkName,
|
|
261
|
+
passed,
|
|
262
|
+
details,
|
|
263
|
+
};
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Verify that a file exists and optionally contains expected content
|
|
267
|
+
*/
|
|
268
|
+
export async function verifyFileExists(filePath, expectedContent) {
|
|
269
|
+
const fs = await import('fs/promises');
|
|
270
|
+
try {
|
|
271
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
272
|
+
if (expectedContent) {
|
|
273
|
+
const matches = typeof expectedContent === 'string'
|
|
274
|
+
? content.includes(expectedContent)
|
|
275
|
+
: expectedContent.test(content);
|
|
276
|
+
return {
|
|
277
|
+
check: `File ${filePath} exists with expected content`,
|
|
278
|
+
passed: matches,
|
|
279
|
+
details: matches ? 'Content verified' : 'Content does not match expected',
|
|
280
|
+
};
|
|
281
|
+
}
|
|
282
|
+
return {
|
|
283
|
+
check: `File ${filePath} exists`,
|
|
284
|
+
passed: true,
|
|
285
|
+
details: `File size: ${content.length} bytes`,
|
|
286
|
+
};
|
|
287
|
+
}
|
|
288
|
+
catch (error) {
|
|
289
|
+
return {
|
|
290
|
+
check: `File ${filePath} exists`,
|
|
291
|
+
passed: false,
|
|
292
|
+
details: error instanceof Error ? error.message : 'File not found',
|
|
293
|
+
};
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Verify URL is accessible (for deployment verification)
|
|
298
|
+
*/
|
|
299
|
+
export async function verifyUrlAccessible(url, expectedStatus = 200, timeoutMs = 10000) {
|
|
300
|
+
try {
|
|
301
|
+
const controller = new AbortController();
|
|
302
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
303
|
+
const response = await fetch(url, {
|
|
304
|
+
method: 'HEAD',
|
|
305
|
+
signal: controller.signal,
|
|
306
|
+
});
|
|
307
|
+
clearTimeout(timeout);
|
|
308
|
+
const passed = response.status === expectedStatus;
|
|
309
|
+
return {
|
|
310
|
+
check: `URL ${url} accessible`,
|
|
311
|
+
passed,
|
|
312
|
+
details: passed
|
|
313
|
+
? `Status ${response.status} (expected ${expectedStatus})`
|
|
314
|
+
: `Status ${response.status} (expected ${expectedStatus})`,
|
|
315
|
+
};
|
|
316
|
+
}
|
|
317
|
+
catch (error) {
|
|
318
|
+
return {
|
|
319
|
+
check: `URL ${url} accessible`,
|
|
320
|
+
passed: false,
|
|
321
|
+
details: error instanceof Error ? error.message : 'Request failed',
|
|
322
|
+
};
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
/**
|
|
326
|
+
* Verify a JSON response matches expected structure
|
|
327
|
+
*/
|
|
328
|
+
export async function verifyJsonEndpoint(url, expectedFields, timeoutMs = 10000) {
|
|
329
|
+
try {
|
|
330
|
+
const controller = new AbortController();
|
|
331
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
332
|
+
const response = await fetch(url, { signal: controller.signal });
|
|
333
|
+
clearTimeout(timeout);
|
|
334
|
+
if (!response.ok) {
|
|
335
|
+
return {
|
|
336
|
+
check: `JSON endpoint ${url}`,
|
|
337
|
+
passed: false,
|
|
338
|
+
details: `HTTP ${response.status}`,
|
|
339
|
+
};
|
|
340
|
+
}
|
|
341
|
+
const json = await response.json();
|
|
342
|
+
const missingFields = expectedFields.filter((field) => !(field in json));
|
|
343
|
+
return {
|
|
344
|
+
check: `JSON endpoint ${url}`,
|
|
345
|
+
passed: missingFields.length === 0,
|
|
346
|
+
details: missingFields.length === 0
|
|
347
|
+
? `All expected fields present: ${expectedFields.join(', ')}`
|
|
348
|
+
: `Missing fields: ${missingFields.join(', ')}`,
|
|
349
|
+
};
|
|
350
|
+
}
|
|
351
|
+
catch (error) {
|
|
352
|
+
return {
|
|
353
|
+
check: `JSON endpoint ${url}`,
|
|
354
|
+
passed: false,
|
|
355
|
+
details: error instanceof Error ? error.message : 'Request failed',
|
|
356
|
+
};
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
//# sourceMappingURL=resultVerification.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resultVerification.js","sourceRoot":"","sources":["../../src/core/resultVerification.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bashTools.d.ts","sourceRoot":"","sources":["../../src/tools/bashTools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"bashTools.d.ts","sourceRoot":"","sources":["../../src/tools/bashTools.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAyB7D,wBAAgB,eAAe,CAAC,UAAU,EAAE,MAAM,GAAG,cAAc,EAAE,CAkKpE;AAED,UAAU,iBAAiB;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED,wBAAsB,eAAe,CACnC,UAAU,EAAE,MAAM,EAClB,OAAO,CAAC,EAAE,iBAAiB,GAC1B,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,CA6B5B"}
|
package/dist/tools/bashTools.js
CHANGED
|
@@ -5,6 +5,7 @@ import { promisify } from 'node:util';
|
|
|
5
5
|
import { createBackgroundBashTools, startBackgroundShell } from './backgroundBashTools.js';
|
|
6
6
|
import { validateBashCommand, SmartFixer } from '../core/errors/safetyValidator.js';
|
|
7
7
|
import { toStructuredError } from '../core/errors/errorTypes.js';
|
|
8
|
+
import { verifiedSuccess, verifiedFailure, unverifiedResult, analyzeOutput, OutputPatterns, createCommandCheck, } from '../core/resultVerification.js';
|
|
8
9
|
const execAsync = promisify(exec);
|
|
9
10
|
const sandboxCache = new Map();
|
|
10
11
|
export function createBashTools(workingDir) {
|
|
@@ -69,6 +70,7 @@ export function createBashTools(workingDir) {
|
|
|
69
70
|
return `Background shell started: ${shellId}\n\nUse BashOutput with bash_id="${shellId}" to monitor output.\nUse KillShell with shell_id="${shellId}" to terminate.`;
|
|
70
71
|
}
|
|
71
72
|
// Handle foreground execution
|
|
73
|
+
const startTime = Date.now();
|
|
72
74
|
try {
|
|
73
75
|
const env = await buildSandboxEnv(workingDir);
|
|
74
76
|
const { stdout, stderr } = await execAsync(command, {
|
|
@@ -77,18 +79,30 @@ export function createBashTools(workingDir) {
|
|
|
77
79
|
maxBuffer: 1024 * 1024 * 10, // 10MB
|
|
78
80
|
env,
|
|
79
81
|
});
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
82
|
+
const durationMs = Date.now() - startTime;
|
|
83
|
+
const combinedOutput = [stdout, stderr].filter(Boolean).join('\n');
|
|
84
|
+
// Analyze the output to determine actual success
|
|
85
|
+
const analysis = analyzeOutput(combinedOutput, OutputPatterns.command, 0);
|
|
86
|
+
const commandCheck = createCommandCheck('Command execution', 0, combinedOutput);
|
|
87
|
+
// Check for hidden failures in output despite exit code 0
|
|
88
|
+
if (analysis.isFailure) {
|
|
89
|
+
return verifiedFailure(`Command completed with exit code 0 but output indicates failure`, `Command: ${command}\n\nOutput:\n${combinedOutput || '(no output)'}`, ['Review the error message in the output', 'Fix the underlying issue and retry'], [commandCheck, { check: 'Output analysis', passed: false, details: `Failure pattern matched: ${analysis.matchedPattern}` }], durationMs);
|
|
90
|
+
}
|
|
91
|
+
// No output case - mark as unverified (we can't confirm what happened)
|
|
92
|
+
if (!combinedOutput.trim()) {
|
|
93
|
+
return unverifiedResult(`Command executed with no output`, `Command: ${command}\n\nThe command completed with exit code 0 but produced no output.\nCannot verify the operation achieved its intended result.`, ['Manually verify the expected changes occurred', 'Run a verification command to confirm state'], durationMs);
|
|
94
|
+
}
|
|
95
|
+
// Success case with output
|
|
96
|
+
return verifiedSuccess(`Command executed successfully`, `Command: ${command}\n\nOutput:\n${combinedOutput}`, [commandCheck, ...(analysis.isSuccess ? [{ check: 'Output analysis', passed: true, details: 'Success pattern matched' }] : [])], durationMs);
|
|
86
97
|
}
|
|
87
98
|
catch (error) {
|
|
99
|
+
const durationMs = Date.now() - startTime;
|
|
100
|
+
const exitCode = error.code ?? 1;
|
|
101
|
+
const combinedError = [error.stdout, error.stderr, error.message].filter(Boolean).join('\n');
|
|
88
102
|
if (error.killed) {
|
|
89
|
-
return `
|
|
103
|
+
return verifiedFailure(`Command timed out after ${timeout}ms`, `Command: ${command}\n\nThe command was killed after exceeding the timeout.\nPartial output:\n${combinedError || '(none)'}`, ['Increase timeout if command legitimately needs more time', 'Check if command is hanging on input'], [{ check: 'Timeout', passed: false, details: `Exceeded ${timeout}ms` }], durationMs);
|
|
90
104
|
}
|
|
91
|
-
return `
|
|
105
|
+
return verifiedFailure(`Command failed with exit code ${exitCode}`, `Command: ${command}\n\nError output:\n${combinedError || '(none)'}`, ['Review the error message', 'Fix the issue and retry the command'], [createCommandCheck('Command execution', exitCode, combinedError)], durationMs);
|
|
92
106
|
}
|
|
93
107
|
},
|
|
94
108
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bashTools.js","sourceRoot":"","sources":["../../src/tools/bashTools.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,kBAAkB,CAAC;AACzC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,yBAAyB,EAAE,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,mBAAmB,EAAE,UAAU,EAAE,MAAM,mCAAmC,CAAC;AACpF,OAAO,EAAE,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"bashTools.js","sourceRoot":"","sources":["../../src/tools/bashTools.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cloudTools.d.ts","sourceRoot":"","sources":["../../src/tools/cloudTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"cloudTools.d.ts","sourceRoot":"","sources":["../../src/tools/cloudTools.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAc7D,UAAU,aAAa;IACrB,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,QAAA,MAAM,eAAe,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CA+HlD,CAAC;AAEF,UAAU,SAAS;IACjB,SAAS,EAAE,OAAO,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAwGD,iBAAe,gBAAgB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CA2D1F;AAED,iBAAe,aAAa,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CA6CtF;AAED,wBAAgB,gBAAgB,CAAC,UAAU,GAAE,MAAsB,GAAG,cAAc,EAAE,CAy3BrF;AA8KD,YAAY,EAAE,SAAS,EAAE,aAAa,EAAE,CAAC;AACzC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,aAAa,EAAE,CAAC"}
|