ft-scout 9.0.0 → 9.0.2
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/.firebase/hosting.d2Vi.cache +7 -7
- package/README.md +93 -13
- package/bin/src/commands/agent.d.ts.map +1 -1
- package/bin/src/commands/agent.js +46 -3
- package/bin/src/commands/agent.js.map +1 -1
- package/bin/src/commands/plan.d.ts.map +1 -1
- package/bin/src/commands/plan.js +19 -5
- package/bin/src/commands/plan.js.map +1 -1
- package/bin/src/engine/actionVerifier.d.ts.map +1 -0
- package/bin/src/engine/actionVerifier.js +223 -0
- package/bin/src/engine/actionVerifier.js.map +1 -0
- package/bin/src/engine/agentEngine.d.ts.map +1 -1
- package/bin/src/engine/agentEngine.js +233 -1
- package/bin/src/engine/agentEngine.js.map +1 -1
- package/bin/src/engine/agentState.d.ts.map +1 -0
- package/bin/src/engine/agentState.js +445 -0
- package/bin/src/engine/agentState.js.map +1 -0
- package/bin/src/engine/appControl.d.ts.map +1 -1
- package/bin/src/engine/appControl.js +19 -6
- package/bin/src/engine/appControl.js.map +1 -1
- package/bin/src/engine/browser/browserController.d.ts.map +1 -0
- package/bin/src/engine/browser/browserController.js +689 -0
- package/bin/src/engine/browser/browserController.js.map +1 -0
- package/bin/src/engine/browser/index.d.ts.map +1 -0
- package/bin/src/engine/browser/index.js +2 -0
- package/bin/src/engine/browser/index.js.map +1 -0
- package/bin/src/engine/computer/computerController.d.ts.map +1 -0
- package/bin/src/engine/computer/computerController.js +295 -0
- package/bin/src/engine/computer/computerController.js.map +1 -0
- package/bin/src/engine/computer/index.d.ts.map +1 -0
- package/bin/src/engine/computer/index.js +2 -0
- package/bin/src/engine/computer/index.js.map +1 -0
- package/bin/src/engine/planner.d.ts.map +1 -0
- package/bin/src/engine/planner.js +242 -0
- package/bin/src/engine/planner.js.map +1 -0
- package/bin/src/engine/safety.d.ts.map +1 -0
- package/bin/src/engine/safety.js +281 -0
- package/bin/src/engine/safety.js.map +1 -0
- package/bin/src/engine/toolRegistry.d.ts.map +1 -0
- package/bin/src/engine/toolRegistry.js +218 -0
- package/bin/src/engine/toolRegistry.js.map +1 -0
- package/bin/src/index.js +6 -4
- package/bin/src/index.js.map +1 -1
- package/bin/src/server/server.d.ts.map +1 -1
- package/bin/src/server/server.js +116 -0
- package/bin/src/server/server.js.map +1 -1
- package/bin/src/utils/branding.js +1 -1
- package/bin/src/utils/payment.d.ts.map +1 -1
- package/bin/src/utils/payment.js +23 -3
- package/bin/src/utils/payment.js.map +1 -1
- package/bin/src/utils/pricing.d.ts.map +1 -1
- package/bin/src/utils/pricing.js +32 -10
- package/bin/src/utils/pricing.js.map +1 -1
- package/downloads/INVOICE_2026_ACME.pdf +1 -0
- package/package.json +1 -1
- package/web/app.js +294 -42
- package/web/styles.css +79 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plan.js","sourceRoot":"","sources":["plan.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACjE,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,oBAAoB,EAAiB,MAAM,qBAAqB,CAAC;AACtI,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAEhD,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACnC,MAAM,IAAI,GAAG,cAAc,EAAE,CAAC;IAC9B,MAAM,WAAW,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;IAC/D,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,YAAY,IAAI,GAAG,CAAC;IACvC,MAAM,KAAK,GAAG,oBAAoB,EAAE,CAAC;IAErC,QAAQ,CACJ,iBAAiB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,IAAI;QAC/D,YAAY,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,IAAI,eAAe,CAAC,IAAI;QAClF,YAAY,KAAK,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC,KAAK,KAAK,CAAC,KAAK,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"plan.js","sourceRoot":"","sources":["plan.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionVerifier.d.ts","sourceRoot":"","sources":["actionVerifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import fs from 'fs';
|
|
2
|
+
import path from 'path';
|
|
3
|
+
import { checkFileSyntax } from './verifier.js';
|
|
4
|
+
export class ActionVerifier {
|
|
5
|
+
workspaceDir;
|
|
6
|
+
failureCounts = new Map();
|
|
7
|
+
constructor(workspaceDir = process.cwd()) {
|
|
8
|
+
this.workspaceDir = workspaceDir;
|
|
9
|
+
}
|
|
10
|
+
determineRecoveryStrategy(result, attempt = 1, maxRetries = 3) {
|
|
11
|
+
if (attempt >= maxRetries) {
|
|
12
|
+
return 'RE_PLAN';
|
|
13
|
+
}
|
|
14
|
+
const ruleType = result.ruleType || '';
|
|
15
|
+
const msg = (result.message || '').toLowerCase();
|
|
16
|
+
if (ruleType.includes('dom') || msg.includes('selector') || msg.includes('element') || msg.includes('dom')) {
|
|
17
|
+
return 'ALTERNATIVE_ACTION';
|
|
18
|
+
}
|
|
19
|
+
return 'RETRY';
|
|
20
|
+
}
|
|
21
|
+
async verify(target) {
|
|
22
|
+
if (target.type === 'file_exists') {
|
|
23
|
+
const res = await this.verifyFileCreated(target.expected, target.options?.minSizeBytes || (target.options?.requireNonEmpty ? 1 : 0));
|
|
24
|
+
return { success: res.verified, actual: res.verified, verified: res.verified, ruleType: 'file_exists', message: res.message };
|
|
25
|
+
}
|
|
26
|
+
if (target.type === 'file_syntax') {
|
|
27
|
+
const res = await this.verifyFileSyntax(target.expected);
|
|
28
|
+
return { success: res.verified, actual: res.verified, verified: res.verified, ruleType: 'file_syntax', message: res.message };
|
|
29
|
+
}
|
|
30
|
+
if (target.type === 'dom_element_present') {
|
|
31
|
+
let elements = [];
|
|
32
|
+
if (target.browser?.getDOM) {
|
|
33
|
+
const dom = await target.browser.getDOM();
|
|
34
|
+
elements = dom.elements || [];
|
|
35
|
+
}
|
|
36
|
+
else if (target.browser?.getDom) {
|
|
37
|
+
const dom = await target.browser.getDom();
|
|
38
|
+
elements = dom.elements || [];
|
|
39
|
+
}
|
|
40
|
+
else if (target.browser?.inspect_page) {
|
|
41
|
+
const dom = await target.browser.inspect_page();
|
|
42
|
+
elements = dom.elements || [];
|
|
43
|
+
}
|
|
44
|
+
const res = this.verifyDomElement(elements, target.expected);
|
|
45
|
+
return { success: res.verified, actual: res.verified, verified: res.verified, ruleType: 'dom_element_present', message: res.message };
|
|
46
|
+
}
|
|
47
|
+
if (target.type === 'url_matches') {
|
|
48
|
+
const actual = target.browser?.currentUrl || '';
|
|
49
|
+
const res = this.verifyUrl(actual, target.expected);
|
|
50
|
+
return { success: res.verified, actual, verified: res.verified, ruleType: 'url_matches', message: res.message };
|
|
51
|
+
}
|
|
52
|
+
if (target.type === 'file_content_matches') {
|
|
53
|
+
const fullPath = path.isAbsolute(target.expected) ? target.expected : path.resolve(this.workspaceDir, target.expected);
|
|
54
|
+
if (!fs.existsSync(fullPath))
|
|
55
|
+
return { success: false, actual: false, verified: false, ruleType: 'file_content_matches', message: 'File not found' };
|
|
56
|
+
const content = fs.readFileSync(fullPath, 'utf-8');
|
|
57
|
+
const pattern = target.options?.pattern;
|
|
58
|
+
const matches = pattern instanceof RegExp ? pattern.test(content) : content.includes(String(pattern));
|
|
59
|
+
return { success: matches, actual: matches, verified: matches, ruleType: 'file_content_matches', message: matches ? 'Content matched' : 'Content did not match' };
|
|
60
|
+
}
|
|
61
|
+
return { success: false, actual: false, verified: false, ruleType: target.type || 'unknown', message: `Unknown verification target: ${target.type}` };
|
|
62
|
+
}
|
|
63
|
+
async verifyFileCreated(filePath, minSizeBytes = 1) {
|
|
64
|
+
const fullPath = path.isAbsolute(filePath) ? filePath : path.resolve(this.workspaceDir, filePath);
|
|
65
|
+
if (!fs.existsSync(fullPath)) {
|
|
66
|
+
return {
|
|
67
|
+
verified: false,
|
|
68
|
+
ruleType: 'file_exists',
|
|
69
|
+
message: `Verification failed: File "${filePath}" does not exist on disk.`,
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const stat = fs.statSync(fullPath);
|
|
74
|
+
if (stat.size < minSizeBytes) {
|
|
75
|
+
return {
|
|
76
|
+
verified: false,
|
|
77
|
+
ruleType: 'file_exists',
|
|
78
|
+
message: `Verification failed: File "${filePath}" exists but is empty (0 bytes).`,
|
|
79
|
+
details: { size: stat.size },
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
return {
|
|
83
|
+
verified: true,
|
|
84
|
+
ruleType: 'file_exists',
|
|
85
|
+
message: `Verification confirmed: File "${filePath}" exists (${stat.size} bytes).`,
|
|
86
|
+
details: { size: stat.size, mtime: stat.mtime },
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
catch (err) {
|
|
90
|
+
return {
|
|
91
|
+
verified: false,
|
|
92
|
+
ruleType: 'file_exists',
|
|
93
|
+
message: `Verification error accessing file "${filePath}": ${err.message}`,
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
async verifyFileSyntax(filePath) {
|
|
98
|
+
const res = await checkFileSyntax(filePath, this.workspaceDir);
|
|
99
|
+
if (!res.valid) {
|
|
100
|
+
return {
|
|
101
|
+
verified: false,
|
|
102
|
+
ruleType: 'file_syntax',
|
|
103
|
+
message: `Syntax/build verification failed for "${filePath}":\n${res.errors.join('\n')}`,
|
|
104
|
+
details: { errors: res.errors },
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return {
|
|
108
|
+
verified: true,
|
|
109
|
+
ruleType: 'file_syntax',
|
|
110
|
+
message: `Syntax/build verification confirmed: "${filePath}" is clean.`,
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
verifyDomElement(elements, targetSelectorOrText) {
|
|
114
|
+
const search = targetSelectorOrText.toLowerCase().trim();
|
|
115
|
+
const found = elements.some((el) => {
|
|
116
|
+
if (el.ref !== undefined && String(el.ref).toLowerCase() === search)
|
|
117
|
+
return true;
|
|
118
|
+
if (el.selector && el.selector.toLowerCase() === search)
|
|
119
|
+
return true;
|
|
120
|
+
if (el.id && (el.id.toLowerCase() === search || `#${el.id.toLowerCase()}` === search))
|
|
121
|
+
return true;
|
|
122
|
+
if (el.tag && el.tag.toLowerCase() === search)
|
|
123
|
+
return true;
|
|
124
|
+
if (el.text && el.text.toLowerCase().includes(search))
|
|
125
|
+
return true;
|
|
126
|
+
return false;
|
|
127
|
+
});
|
|
128
|
+
if (found) {
|
|
129
|
+
return {
|
|
130
|
+
verified: true,
|
|
131
|
+
ruleType: 'dom_element',
|
|
132
|
+
message: `Verified DOM element matching "${targetSelectorOrText}" is present and interactive.`,
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
return {
|
|
136
|
+
verified: false,
|
|
137
|
+
ruleType: 'dom_element',
|
|
138
|
+
message: `Verification failed: DOM element matching "${targetSelectorOrText}" was not found in current page.`,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
verifyUrl(currentUrl, expectedPattern) {
|
|
142
|
+
if (!currentUrl) {
|
|
143
|
+
return {
|
|
144
|
+
verified: false,
|
|
145
|
+
ruleType: 'url_match',
|
|
146
|
+
message: `Verification failed: No active URL detected.`,
|
|
147
|
+
};
|
|
148
|
+
}
|
|
149
|
+
const match = currentUrl.toLowerCase().includes(expectedPattern.toLowerCase());
|
|
150
|
+
if (match) {
|
|
151
|
+
return {
|
|
152
|
+
verified: true,
|
|
153
|
+
ruleType: 'url_match',
|
|
154
|
+
message: `URL verification confirmed: Current URL "${currentUrl}" matches pattern "${expectedPattern}".`,
|
|
155
|
+
details: { currentUrl },
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
return {
|
|
159
|
+
verified: false,
|
|
160
|
+
ruleType: 'url_match',
|
|
161
|
+
message: `URL verification failed: Current URL "${currentUrl}" does not match pattern "${expectedPattern}".`,
|
|
162
|
+
details: { currentUrl, expected: expectedPattern },
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
determineRecovery(tool, error, attemptKey = tool, maxRetries = 3) {
|
|
166
|
+
const errLower = (error || '').toLowerCase();
|
|
167
|
+
const currentCount = (this.failureCounts.get(attemptKey) || 0) + 1;
|
|
168
|
+
this.failureCounts.set(attemptKey, currentCount);
|
|
169
|
+
// 1. If exceeded retry budget, abort or re-plan
|
|
170
|
+
if (currentCount > maxRetries) {
|
|
171
|
+
return {
|
|
172
|
+
strategy: 'RE_PLAN',
|
|
173
|
+
reason: `Action "${tool}" failed ${currentCount} times (exceeded max retries of ${maxRetries}). Switching strategy or re-planning.`,
|
|
174
|
+
maxRetriesExceeded: true,
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
// 2. Element not found or stale selector
|
|
178
|
+
if (errLower.includes('element not found') || errLower.includes('stale selector') || errLower.includes('not visible') || errLower.includes('not found')) {
|
|
179
|
+
return {
|
|
180
|
+
strategy: 'RE_OBSERVE',
|
|
181
|
+
reason: `Target element was not found in current view. Re-inspecting page/screen structure to locate updated selector.`,
|
|
182
|
+
suggestedAction: {
|
|
183
|
+
tool: 'browser_inspect',
|
|
184
|
+
args: {},
|
|
185
|
+
},
|
|
186
|
+
};
|
|
187
|
+
}
|
|
188
|
+
// 3. Login or credentials required
|
|
189
|
+
if (errLower.includes('login required') || errLower.includes('unauthorized') || errLower.includes('authentication') || errLower.includes('401') || errLower.includes('403')) {
|
|
190
|
+
return {
|
|
191
|
+
strategy: 'ASK_USER',
|
|
192
|
+
reason: `Application or page requires user credentials or authentication to proceed.`,
|
|
193
|
+
suggestedAction: {
|
|
194
|
+
tool: 'ask_user',
|
|
195
|
+
args: { question: 'This action requires authentication or access permission. Please provide required access or log in.' },
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
// 4. Temporary timeout or network glitch
|
|
200
|
+
if (errLower.includes('timeout') || errLower.includes('econnreset') || errLower.includes('network') || errLower.includes('rate limit')) {
|
|
201
|
+
return {
|
|
202
|
+
strategy: 'RETRY',
|
|
203
|
+
reason: `Temporary network/timeout error encountered. Retrying attempt ${currentCount}/${maxRetries}...`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
// 5. App or browser disconnected
|
|
207
|
+
if (errLower.includes('disconnected') || errLower.includes('target closed') || errLower.includes('process exited')) {
|
|
208
|
+
return {
|
|
209
|
+
strategy: 'ALTERNATIVE_ACTION',
|
|
210
|
+
reason: `Connection to application lost. Re-launching application or utilizing workspace API alternative.`,
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
// Default recovery
|
|
214
|
+
return {
|
|
215
|
+
strategy: 'RE_OBSERVE',
|
|
216
|
+
reason: `Action failed: ${error}. Inspecting environment state before deciding next step.`,
|
|
217
|
+
};
|
|
218
|
+
}
|
|
219
|
+
resetFailureCount(attemptKey) {
|
|
220
|
+
this.failureCounts.delete(attemptKey);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
//# sourceMappingURL=actionVerifier.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"actionVerifier.js","sourceRoot":"","sources":["actionVerifier.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agentEngine.d.ts","sourceRoot":"","sources":["agentEngine.ts"],"names":[],"mappings":"AAMA,OAAO,EAA0C,KAAK,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"agentEngine.d.ts","sourceRoot":"","sources":["agentEngine.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,13 @@ import { checkFileSyntax, verifyAndSelfHealFiles, executeSmartCommand, extractEr
|
|
|
12
12
|
import { openApp, executeInApp, cleanupScreenshots } from './appControl.js';
|
|
13
13
|
import { speakText, listenSpeechToText } from './voiceEngine.js';
|
|
14
14
|
import { startLiveScreenShare, stopLiveScreenShare, isLiveScreenShareActive } from './liveScreenEngine.js';
|
|
15
|
+
import { TaskStateManager } from './agentState.js';
|
|
16
|
+
import { OSComputerController } from './computer/index.js';
|
|
17
|
+
import { SemanticBrowserController } from './browser/index.js';
|
|
18
|
+
import { ActionVerifier } from './actionVerifier.js';
|
|
19
|
+
import { ApprovalManager, RiskClassifier } from './safety.js';
|
|
20
|
+
import { TaskPlanner } from './planner.js';
|
|
21
|
+
import { UnifiedToolRegistry } from './toolRegistry.js';
|
|
15
22
|
const execAsync = promisify(exec);
|
|
16
23
|
export function robustSnippetReplace(origContent, target, replacement) {
|
|
17
24
|
if (!origContent || !target) {
|
|
@@ -403,11 +410,27 @@ export class AgentExecutionLoop {
|
|
|
403
410
|
consecutiveScreenChecks = 0;
|
|
404
411
|
toolCallHistory = [];
|
|
405
412
|
scratchpadState = { plan: [], completedSteps: [], notes: '' };
|
|
413
|
+
taskStateManager;
|
|
414
|
+
computerController;
|
|
415
|
+
browserController;
|
|
416
|
+
actionVerifier;
|
|
417
|
+
approvalManager;
|
|
418
|
+
taskPlanner;
|
|
419
|
+
toolRegistry;
|
|
420
|
+
mockMode;
|
|
406
421
|
constructor(options) {
|
|
407
422
|
this.cwd = process.cwd();
|
|
408
423
|
this.autoApprove = Boolean(options?.autoApprove);
|
|
409
424
|
this.maxSteps = options?.maxSteps || 30;
|
|
410
425
|
this.projectName = options?.projectName || path.basename(this.cwd);
|
|
426
|
+
this.mockMode = Boolean(options?.mockMode);
|
|
427
|
+
this.taskStateManager = new TaskStateManager(options?.taskId, '', this.cwd);
|
|
428
|
+
this.computerController = options?.computerController || new OSComputerController();
|
|
429
|
+
this.browserController = options?.browserController || new SemanticBrowserController(this.cwd);
|
|
430
|
+
this.actionVerifier = new ActionVerifier(this.cwd);
|
|
431
|
+
this.approvalManager = new ApprovalManager(this.autoApprove);
|
|
432
|
+
this.taskPlanner = new TaskPlanner();
|
|
433
|
+
this.toolRegistry = new UnifiedToolRegistry();
|
|
411
434
|
if (options?.screenShare) {
|
|
412
435
|
startLiveScreenShare().catch(() => { });
|
|
413
436
|
}
|
|
@@ -429,6 +452,45 @@ export class AgentExecutionLoop {
|
|
|
429
452
|
process.exit(0);
|
|
430
453
|
});
|
|
431
454
|
}
|
|
455
|
+
getTaskStateManager() {
|
|
456
|
+
return this.taskStateManager;
|
|
457
|
+
}
|
|
458
|
+
getStateManager() {
|
|
459
|
+
return this.taskStateManager;
|
|
460
|
+
}
|
|
461
|
+
getComputerController() {
|
|
462
|
+
return this.computerController;
|
|
463
|
+
}
|
|
464
|
+
getBrowserController() {
|
|
465
|
+
return this.browserController;
|
|
466
|
+
}
|
|
467
|
+
getActionVerifier() {
|
|
468
|
+
return this.actionVerifier;
|
|
469
|
+
}
|
|
470
|
+
getApprovalManager() {
|
|
471
|
+
return this.approvalManager;
|
|
472
|
+
}
|
|
473
|
+
getPlanner() {
|
|
474
|
+
return this.taskPlanner;
|
|
475
|
+
}
|
|
476
|
+
getToolRegistry() {
|
|
477
|
+
return this.toolRegistry;
|
|
478
|
+
}
|
|
479
|
+
async resumeGoal(taskId) {
|
|
480
|
+
const saved = TaskStateManager.loadTaskState(taskId, this.cwd);
|
|
481
|
+
if (!saved) {
|
|
482
|
+
return { success: false, summary: `Saved task checkpoint "${taskId}" not found.` };
|
|
483
|
+
}
|
|
484
|
+
this.taskStateManager.resumeFromState(saved);
|
|
485
|
+
if (this.mockMode) {
|
|
486
|
+
this.taskStateManager.setStatus('completed');
|
|
487
|
+
return {
|
|
488
|
+
success: true,
|
|
489
|
+
summary: `Resumed and completed task "${taskId}" in mock mode.`,
|
|
490
|
+
};
|
|
491
|
+
}
|
|
492
|
+
return await this.executeGoal(saved.objective);
|
|
493
|
+
}
|
|
432
494
|
getModifiedFiles() {
|
|
433
495
|
return Array.from(this.modifiedFiles);
|
|
434
496
|
}
|
|
@@ -730,6 +792,21 @@ When returning tool calls, use standard OpenAI function calling format or JSON t
|
|
|
730
792
|
}
|
|
731
793
|
async executeGoal(userGoal) {
|
|
732
794
|
this.resetContext();
|
|
795
|
+
this.taskStateManager.setObjective(userGoal);
|
|
796
|
+
const structuredPlan = this.taskPlanner.createPlan(userGoal);
|
|
797
|
+
this.taskStateManager.setPlan(structuredPlan.steps);
|
|
798
|
+
this.taskStateManager.setAvailableTools(this.toolRegistry.getAllTools().map((t) => t.name));
|
|
799
|
+
if (this.mockMode) {
|
|
800
|
+
for (let i = 1; i <= structuredPlan.steps.length; i++) {
|
|
801
|
+
this.taskStateManager.startStep(i);
|
|
802
|
+
this.taskStateManager.completeStep(i, `Completed step ${i} in mock mode`);
|
|
803
|
+
}
|
|
804
|
+
this.taskStateManager.setStatus('completed');
|
|
805
|
+
return {
|
|
806
|
+
success: true,
|
|
807
|
+
summary: `Mock execution completed successfully for goal: "${userGoal}".`,
|
|
808
|
+
};
|
|
809
|
+
}
|
|
733
810
|
this.historyMessages.push({ role: 'system', content: this.systemPrompt() });
|
|
734
811
|
// Load persistent session history memory (minimum 3 sessions Context)
|
|
735
812
|
const recentSessionsMemory = getRecentSessionsSummary(3);
|
|
@@ -849,6 +926,7 @@ When returning tool calls, use standard OpenAI function calling format or JSON t
|
|
|
849
926
|
while (step < this.maxSteps) {
|
|
850
927
|
step++;
|
|
851
928
|
this.currentStep = step;
|
|
929
|
+
this.taskStateManager.startStep(step);
|
|
852
930
|
const stepStartTime = Date.now();
|
|
853
931
|
const avgStepMs = stepDurations.length > 0
|
|
854
932
|
? stepDurations.reduce((a, b) => a + b, 0) / stepDurations.length
|
|
@@ -867,7 +945,7 @@ When returning tool calls, use standard OpenAI function calling format or JSON t
|
|
|
867
945
|
return await openai.chat.completions.create({
|
|
868
946
|
model,
|
|
869
947
|
messages: sanitizeMessages(this.historyMessages),
|
|
870
|
-
tools:
|
|
948
|
+
tools: this.toolRegistry.getAllTools().map((t) => ({ type: 'function', function: t })),
|
|
871
949
|
tool_choice: 'auto',
|
|
872
950
|
temperature: 0.1,
|
|
873
951
|
presence_penalty: 0.1,
|
|
@@ -1153,11 +1231,55 @@ You MUST output exactly ONE JSON code block per tool call. Do NOT describe what
|
|
|
1153
1231
|
actionDesc = `Launching app: ${args.app || ''} (${args.target || 'default'})`;
|
|
1154
1232
|
else if (name === 'app_action')
|
|
1155
1233
|
actionDesc = `Executing app action: ${args.app || ''} -> ${args.action || ''}`;
|
|
1234
|
+
else if (name === 'browser_navigate')
|
|
1235
|
+
actionDesc = `Navigating browser: ${args.url || ''}`;
|
|
1236
|
+
else if (name === 'browser_inspect')
|
|
1237
|
+
actionDesc = `Inspecting web page elements`;
|
|
1238
|
+
else if (name === 'browser_click')
|
|
1239
|
+
actionDesc = `Clicking web element: ${args.selectorOrText || ''}`;
|
|
1240
|
+
else if (name === 'browser_type')
|
|
1241
|
+
actionDesc = `Typing in web input: ${args.selectorOrText || ''}`;
|
|
1242
|
+
else if (name === 'browser_download')
|
|
1243
|
+
actionDesc = `Downloading file: ${args.urlOrSelector || ''}`;
|
|
1244
|
+
else if (name === 'browser_content')
|
|
1245
|
+
actionDesc = `Extracting web page content`;
|
|
1246
|
+
else if (name === 'computer_screenshot')
|
|
1247
|
+
actionDesc = `Capturing computer screenshot`;
|
|
1248
|
+
else if (name === 'computer_click')
|
|
1249
|
+
actionDesc = `Clicking coordinates (${args.x}, ${args.y})`;
|
|
1250
|
+
else if (name === 'computer_type')
|
|
1251
|
+
actionDesc = `Typing text keystrokes`;
|
|
1252
|
+
else if (name === 'computer_hotkey')
|
|
1253
|
+
actionDesc = `Pressing hotkey: ${args.keys || ''}`;
|
|
1254
|
+
else if (name === 'computer_open_app')
|
|
1255
|
+
actionDesc = `Opening app: ${args.name || ''}`;
|
|
1256
|
+
else if (name === 'computer_switch_app')
|
|
1257
|
+
actionDesc = `Switching to app: ${args.name || ''}`;
|
|
1258
|
+
else if (name === 'computer_scroll')
|
|
1259
|
+
actionDesc = `Scrolling ${args.direction || 'down'}`;
|
|
1156
1260
|
else if (name === 'task_completed')
|
|
1157
1261
|
actionDesc = `Task finished`;
|
|
1158
1262
|
const badge = chalk.bgCyan.black.bold(` 🛠️ TOOL: ${name} `);
|
|
1159
1263
|
const descText = actionDesc ? chalk.yellow.bold(` → ${actionDesc}`) : '';
|
|
1160
1264
|
console.log(`\n${badge}${descText} ${chalk.dim(JSON.stringify(args))}`);
|
|
1265
|
+
// Safety and human approval classification layer
|
|
1266
|
+
const risk = this.approvalManager.checkAction(name, args);
|
|
1267
|
+
if (risk.requiresApproval && !this.autoApprove) {
|
|
1268
|
+
this.taskStateManager.setPendingAction({
|
|
1269
|
+
id: `act_${Date.now()}`,
|
|
1270
|
+
tool: name,
|
|
1271
|
+
args,
|
|
1272
|
+
riskLevel: risk.level,
|
|
1273
|
+
riskReason: risk.reason,
|
|
1274
|
+
requestedAt: new Date().toISOString(),
|
|
1275
|
+
});
|
|
1276
|
+
const decision = await this.approvalManager.requestApproval(this.taskStateManager.getState().task_id, name, args, risk);
|
|
1277
|
+
this.taskStateManager.setPendingAction(null);
|
|
1278
|
+
if (!decision.approved) {
|
|
1279
|
+
this.taskStateManager.addObservation(name, `[ACTION BLOCKED: User rejected approval: ${decision.reason || 'Not approved'}]`, false);
|
|
1280
|
+
return { result: `[ACTION REJECTED BY USER]: ${decision.reason || 'User did not approve executing this action.'}` };
|
|
1281
|
+
}
|
|
1282
|
+
}
|
|
1161
1283
|
switch (name) {
|
|
1162
1284
|
case 'read_file': {
|
|
1163
1285
|
const targetPath = String(args.path || '').trim();
|
|
@@ -1237,11 +1359,20 @@ You MUST output exactly ONE JSON code block per tool call. Do NOT describe what
|
|
|
1237
1359
|
const syntaxCheck = await checkFileSyntax(targetPath, this.cwd);
|
|
1238
1360
|
if (!syntaxCheck.valid) {
|
|
1239
1361
|
checkSpin.stop(chalk.red(`️ Checking for error: edited ${targetPath} — Compiler/Syntax Error!`));
|
|
1362
|
+
this.taskStateManager.recordError(`Syntax error in "${targetPath}": ${syntaxCheck.errors.join('; ')}`, 'write_file');
|
|
1240
1363
|
return {
|
|
1241
1364
|
result: `Successfully wrote ${content.length} characters (${numberOfLinesChanged} lines changed) to "${targetPath}".\n\n️ AUTOMATED SYNTAX / COMPILER ERROR DETECTED IN "${targetPath}":\n${syntaxCheck.errors.join('\n')}\n\nPLEASE IMMEDIATELY FIX THIS SYNTAX ERROR IN YOUR NEXT TOOL CALL.`
|
|
1242
1365
|
};
|
|
1243
1366
|
}
|
|
1244
1367
|
checkSpin.stop(chalk.green(` Checking for error: edited ${targetPath} — Syntax & build clean.`));
|
|
1368
|
+
this.taskStateManager.recordArtifact({
|
|
1369
|
+
filename: path.basename(targetPath),
|
|
1370
|
+
path: targetPath,
|
|
1371
|
+
source: 'write_file',
|
|
1372
|
+
verified: syntaxCheck.valid,
|
|
1373
|
+
sizeBytes: Buffer.byteLength(content, 'utf-8'),
|
|
1374
|
+
});
|
|
1375
|
+
this.taskStateManager.addObservation('write_file', `Wrote ${numberOfLinesChanged} line(s) to ${targetPath}. Syntax clean: ${syntaxCheck.valid}`, syntaxCheck.valid, targetPath);
|
|
1245
1376
|
return { result: `Successfully wrote ${content.length} characters (${numberOfLinesChanged} lines changed) to "${targetPath}". Rationale: ${reason}. Syntax check passed cleanly.` };
|
|
1246
1377
|
}
|
|
1247
1378
|
case 'edit_file': {
|
|
@@ -1597,10 +1728,111 @@ You MUST output exactly ONE JSON code block per tool call. Do NOT describe what
|
|
|
1597
1728
|
}
|
|
1598
1729
|
return { result: 'No text provided to speak.' };
|
|
1599
1730
|
}
|
|
1731
|
+
case 'browser_navigate': {
|
|
1732
|
+
const targetUrl = String(args.url || '').trim();
|
|
1733
|
+
this.taskStateManager.setActiveUrl(targetUrl);
|
|
1734
|
+
this.taskStateManager.setActiveApplication('browser');
|
|
1735
|
+
const res = await this.browserController.navigate(targetUrl);
|
|
1736
|
+
this.taskStateManager.addObservation('browser_navigate', res.output, res.success, targetUrl);
|
|
1737
|
+
return { result: res.output };
|
|
1738
|
+
}
|
|
1739
|
+
case 'browser_inspect': {
|
|
1740
|
+
const res = await this.browserController.inspect_page();
|
|
1741
|
+
this.taskStateManager.addObservation('browser_inspect', res.summary, res.success, res.url);
|
|
1742
|
+
return { result: res.summary };
|
|
1743
|
+
}
|
|
1744
|
+
case 'browser_click': {
|
|
1745
|
+
const target = String(args.selectorOrText || args.target || '').trim();
|
|
1746
|
+
const res = await this.browserController.click(target);
|
|
1747
|
+
this.taskStateManager.addObservation('browser_click', res.output, res.success, target);
|
|
1748
|
+
return { result: res.output };
|
|
1749
|
+
}
|
|
1750
|
+
case 'browser_type': {
|
|
1751
|
+
const target = String(args.selectorOrText || args.target || '').trim();
|
|
1752
|
+
const text = String(args.text || '');
|
|
1753
|
+
const res = await this.browserController.type(target, text);
|
|
1754
|
+
this.taskStateManager.addObservation('browser_type', res.output, res.success, target);
|
|
1755
|
+
return { result: res.output };
|
|
1756
|
+
}
|
|
1757
|
+
case 'browser_download': {
|
|
1758
|
+
const target = String(args.urlOrSelector || args.url || '').trim();
|
|
1759
|
+
const destPath = args.destPath ? String(args.destPath) : undefined;
|
|
1760
|
+
const res = await this.browserController.download_file(target, destPath);
|
|
1761
|
+
if (res.success && res.details?.path) {
|
|
1762
|
+
const vRes = await this.actionVerifier.verifyFileCreated(res.details.path);
|
|
1763
|
+
const artifact = this.taskStateManager.recordArtifact({
|
|
1764
|
+
filename: res.details.filename || path.basename(res.details.path),
|
|
1765
|
+
path: res.details.path,
|
|
1766
|
+
source: target,
|
|
1767
|
+
application: 'browser',
|
|
1768
|
+
verified: vRes.verified,
|
|
1769
|
+
sizeBytes: res.details.sizeBytes,
|
|
1770
|
+
});
|
|
1771
|
+
this.taskStateManager.addObservation('browser_download', `${res.output} (Verified on disk: ${vRes.verified ? 'YES' : 'NO'})`, vRes.verified, target);
|
|
1772
|
+
return { result: `${res.output}\nTracked Artifact ID: ${artifact.id} (${artifact.path})` };
|
|
1773
|
+
}
|
|
1774
|
+
this.taskStateManager.addObservation('browser_download', res.output, false, target);
|
|
1775
|
+
return { result: res.output };
|
|
1776
|
+
}
|
|
1777
|
+
case 'browser_content': {
|
|
1778
|
+
const res = await this.browserController.extract_content(args.selector);
|
|
1779
|
+
this.taskStateManager.addObservation('browser_content', `Extracted content (${res.output.length} chars)`, res.success);
|
|
1780
|
+
return { result: res.output };
|
|
1781
|
+
}
|
|
1782
|
+
case 'computer_screenshot': {
|
|
1783
|
+
const res = await this.computerController.screenshot();
|
|
1784
|
+
this.taskStateManager.addObservation('computer_screenshot', res.output, res.success);
|
|
1785
|
+
return { result: res.output };
|
|
1786
|
+
}
|
|
1787
|
+
case 'computer_click': {
|
|
1788
|
+
const x = Number(args.x) || 0;
|
|
1789
|
+
const y = Number(args.y) || 0;
|
|
1790
|
+
const res = args.double
|
|
1791
|
+
? await this.computerController.double_click(x, y)
|
|
1792
|
+
: await this.computerController.click(x, y, args.button || 'left');
|
|
1793
|
+
this.taskStateManager.addObservation('computer_click', res.output, res.success, `(${x}, ${y})`);
|
|
1794
|
+
return { result: res.output };
|
|
1795
|
+
}
|
|
1796
|
+
case 'computer_type': {
|
|
1797
|
+
const text = String(args.text || '');
|
|
1798
|
+
const res = await this.computerController.type(text);
|
|
1799
|
+
this.taskStateManager.addObservation('computer_type', res.output, res.success);
|
|
1800
|
+
return { result: res.output };
|
|
1801
|
+
}
|
|
1802
|
+
case 'computer_hotkey': {
|
|
1803
|
+
const keys = String(args.keys || args.key || '');
|
|
1804
|
+
const res = await this.computerController.hotkey(keys);
|
|
1805
|
+
this.taskStateManager.addObservation('computer_hotkey', res.output, res.success, keys);
|
|
1806
|
+
return { result: res.output };
|
|
1807
|
+
}
|
|
1808
|
+
case 'computer_open_app': {
|
|
1809
|
+
const name = String(args.name || args.app || '').trim();
|
|
1810
|
+
const target = args.target ? String(args.target) : undefined;
|
|
1811
|
+
this.taskStateManager.setActiveApplication(name);
|
|
1812
|
+
const res = await this.computerController.open_application(name, target);
|
|
1813
|
+
this.taskStateManager.addObservation('computer_open_app', res.output, res.success, name);
|
|
1814
|
+
return { result: res.output };
|
|
1815
|
+
}
|
|
1816
|
+
case 'computer_switch_app': {
|
|
1817
|
+
const name = String(args.name || args.app || '').trim();
|
|
1818
|
+
this.taskStateManager.setActiveApplication(name);
|
|
1819
|
+
const res = await this.computerController.switch_application(name);
|
|
1820
|
+
this.taskStateManager.addObservation('computer_switch_app', res.output, res.success, name);
|
|
1821
|
+
return { result: res.output };
|
|
1822
|
+
}
|
|
1823
|
+
case 'computer_scroll': {
|
|
1824
|
+
const dir = (args.direction || 'down');
|
|
1825
|
+
const amount = Number(args.amount) || 4;
|
|
1826
|
+
const res = await this.computerController.scroll(dir, amount);
|
|
1827
|
+
this.taskStateManager.addObservation('computer_scroll', res.output, res.success);
|
|
1828
|
+
return { result: res.output };
|
|
1829
|
+
}
|
|
1600
1830
|
case 'task_completed': {
|
|
1601
1831
|
const summaryStr = String(args.summary || 'Task completed successfully.');
|
|
1602
1832
|
speakText(summaryStr, { async: true });
|
|
1603
1833
|
cleanupScreenshots();
|
|
1834
|
+
this.taskStateManager.setStatus('completed');
|
|
1835
|
+
this.taskStateManager.completeStep(this.currentStep, summaryStr);
|
|
1604
1836
|
return { result: summaryStr };
|
|
1605
1837
|
}
|
|
1606
1838
|
default:
|