@agent-vm/agent-vm-worker 0.0.20
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/LICENSE +21 -0
- package/dist/config/worker-config.d.ts +158 -0
- package/dist/config/worker-config.d.ts.map +1 -0
- package/dist/config/worker-config.js +280 -0
- package/dist/config/worker-config.js.map +1 -0
- package/dist/context/gather-context.d.ts +9 -0
- package/dist/context/gather-context.d.ts.map +1 -0
- package/dist/context/gather-context.js +72 -0
- package/dist/context/gather-context.js.map +1 -0
- package/dist/coordinator/coordinator-helpers.d.ts +13 -0
- package/dist/coordinator/coordinator-helpers.d.ts.map +1 -0
- package/dist/coordinator/coordinator-helpers.js +63 -0
- package/dist/coordinator/coordinator-helpers.js.map +1 -0
- package/dist/coordinator/coordinator-types.d.ts +25 -0
- package/dist/coordinator/coordinator-types.d.ts.map +1 -0
- package/dist/coordinator/coordinator-types.js +2 -0
- package/dist/coordinator/coordinator-types.js.map +1 -0
- package/dist/coordinator/coordinator.d.ts +4 -0
- package/dist/coordinator/coordinator.d.ts.map +1 -0
- package/dist/coordinator/coordinator.js +74 -0
- package/dist/coordinator/coordinator.js.map +1 -0
- package/dist/coordinator/task-runner.d.ts +5 -0
- package/dist/coordinator/task-runner.d.ts.map +1 -0
- package/dist/coordinator/task-runner.js +310 -0
- package/dist/coordinator/task-runner.js.map +1 -0
- package/dist/git/git-operations.d.ts +33 -0
- package/dist/git/git-operations.d.ts.map +1 -0
- package/dist/git/git-operations.js +109 -0
- package/dist/git/git-operations.js.map +1 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/main.d.ts +11 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +140 -0
- package/dist/main.js.map +1 -0
- package/dist/plan-phase/plan-cycle.d.ts +27 -0
- package/dist/plan-phase/plan-cycle.d.ts.map +1 -0
- package/dist/plan-phase/plan-cycle.js +83 -0
- package/dist/plan-phase/plan-cycle.js.map +1 -0
- package/dist/prompt/message-builders.d.ts +44 -0
- package/dist/prompt/message-builders.d.ts.map +1 -0
- package/dist/prompt/message-builders.js +83 -0
- package/dist/prompt/message-builders.js.map +1 -0
- package/dist/prompt/prompt-assembler.d.ts +11 -0
- package/dist/prompt/prompt-assembler.d.ts.map +1 -0
- package/dist/prompt/prompt-assembler.js +34 -0
- package/dist/prompt/prompt-assembler.js.map +1 -0
- package/dist/prompt/prompt-defaults.d.ts +10 -0
- package/dist/prompt/prompt-defaults.d.ts.map +1 -0
- package/dist/prompt/prompt-defaults.js +200 -0
- package/dist/prompt/prompt-defaults.js.map +1 -0
- package/dist/server.d.ts +32 -0
- package/dist/server.d.ts.map +1 -0
- package/dist/server.js +75 -0
- package/dist/server.js.map +1 -0
- package/dist/shared/phase-names.d.ts +8 -0
- package/dist/shared/phase-names.d.ts.map +1 -0
- package/dist/shared/phase-names.js +11 -0
- package/dist/shared/phase-names.js.map +1 -0
- package/dist/shared/repo-location.d.ts +13 -0
- package/dist/shared/repo-location.d.ts.map +1 -0
- package/dist/shared/repo-location.js +9 -0
- package/dist/shared/repo-location.js.map +1 -0
- package/dist/shared/review-result.d.ts +17 -0
- package/dist/shared/review-result.d.ts.map +1 -0
- package/dist/shared/review-result.js +12 -0
- package/dist/shared/review-result.js.map +1 -0
- package/dist/shared/skill-types.d.ts +7 -0
- package/dist/shared/skill-types.d.ts.map +1 -0
- package/dist/shared/skill-types.js +6 -0
- package/dist/shared/skill-types.js.map +1 -0
- package/dist/shared/stderr.d.ts +2 -0
- package/dist/shared/stderr.d.ts.map +1 -0
- package/dist/shared/stderr.js +4 -0
- package/dist/shared/stderr.js.map +1 -0
- package/dist/state/event-log.d.ts +4 -0
- package/dist/state/event-log.d.ts.map +1 -0
- package/dist/state/event-log.js +67 -0
- package/dist/state/event-log.js.map +1 -0
- package/dist/state/task-event-types.d.ts +280 -0
- package/dist/state/task-event-types.d.ts.map +1 -0
- package/dist/state/task-event-types.js +106 -0
- package/dist/state/task-event-types.js.map +1 -0
- package/dist/state/task-state.d.ts +35 -0
- package/dist/state/task-state.d.ts.map +1 -0
- package/dist/state/task-state.js +191 -0
- package/dist/state/task-state.js.map +1 -0
- package/dist/validation-runner/verification-runner.d.ts +30 -0
- package/dist/validation-runner/verification-runner.d.ts.map +1 -0
- package/dist/validation-runner/verification-runner.js +196 -0
- package/dist/validation-runner/verification-runner.js.map +1 -0
- package/dist/work-executor/codex-executor.d.ts +9 -0
- package/dist/work-executor/codex-executor.d.ts.map +1 -0
- package/dist/work-executor/codex-executor.js +159 -0
- package/dist/work-executor/codex-executor.js.map +1 -0
- package/dist/work-executor/executor-factory.d.ts +4 -0
- package/dist/work-executor/executor-factory.d.ts.map +1 -0
- package/dist/work-executor/executor-factory.js +17 -0
- package/dist/work-executor/executor-factory.js.map +1 -0
- package/dist/work-executor/executor-interface.d.ts +33 -0
- package/dist/work-executor/executor-interface.d.ts.map +1 -0
- package/dist/work-executor/executor-interface.js +2 -0
- package/dist/work-executor/executor-interface.js.map +1 -0
- package/dist/work-executor/local-tool-mcp-server.d.ts +8 -0
- package/dist/work-executor/local-tool-mcp-server.d.ts.map +1 -0
- package/dist/work-executor/local-tool-mcp-server.js +187 -0
- package/dist/work-executor/local-tool-mcp-server.js.map +1 -0
- package/dist/work-executor/persistent-thread.d.ts +16 -0
- package/dist/work-executor/persistent-thread.d.ts.map +1 -0
- package/dist/work-executor/persistent-thread.js +37 -0
- package/dist/work-executor/persistent-thread.js.map +1 -0
- package/dist/work-phase/controller-tools/controller-tool-support.d.ts +19 -0
- package/dist/work-phase/controller-tools/controller-tool-support.d.ts.map +1 -0
- package/dist/work-phase/controller-tools/controller-tool-support.js +92 -0
- package/dist/work-phase/controller-tools/controller-tool-support.js.map +1 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.d.ts +10 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.d.ts.map +1 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.js +36 -0
- package/dist/work-phase/controller-tools/git-pull-default-tool.js.map +1 -0
- package/dist/work-phase/controller-tools/git-push-tool.d.ts +10 -0
- package/dist/work-phase/controller-tools/git-push-tool.d.ts.map +1 -0
- package/dist/work-phase/controller-tools/git-push-tool.js +45 -0
- package/dist/work-phase/controller-tools/git-push-tool.js.map +1 -0
- package/dist/work-phase/validation-tool.d.ts +11 -0
- package/dist/work-phase/validation-tool.d.ts.map +1 -0
- package/dist/work-phase/validation-tool.js +25 -0
- package/dist/work-phase/validation-tool.js.map +1 -0
- package/dist/work-phase/work-cycle.d.ts +28 -0
- package/dist/work-phase/work-cycle.d.ts.map +1 -0
- package/dist/work-phase/work-cycle.js +122 -0
- package/dist/work-phase/work-cycle.js.map +1 -0
- package/dist/wrapup-phase/wrapup-runner.d.ts +30 -0
- package/dist/wrapup-phase/wrapup-runner.d.ts.map +1 -0
- package/dist/wrapup-phase/wrapup-runner.js +91 -0
- package/dist/wrapup-phase/wrapup-runner.js.map +1 -0
- package/package.json +57 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-runner.d.ts","sourceRoot":"","sources":["../../src/validation-runner/verification-runner.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;CACzB;AAED,MAAM,WAAW,yBAAyB;IACzC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,QAAQ,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAClD,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC3B;AAgBD,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAuE5E;AAED,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,MAAM,EACf,GAAG,EAAE,MAAM,EACX,SAAS,EAAE,MAAM,GACf,OAAO,CAAC;IACV,QAAQ,CAAC,MAAM,EAAE,aAAa,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B,CAAC,CA6DD;AAsCD,wBAAsB,eAAe,CACpC,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,SAAS,yBAAyB,EAAE,CAAC,CAsB/C;AAED,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,SAAS,yBAAyB,EAAE,GAAG,OAAO,CAE7F;AAED,wBAAgB,+BAA+B,CAC9C,OAAO,EAAE,SAAS,yBAAyB,EAAE,GAC3C,MAAM,CASR"}
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
/* oxlint-disable eslint/no-await-in-loop -- verification commands must run in stable serial order */
|
|
2
|
+
import fs from 'node:fs/promises';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { execa } from 'execa';
|
|
5
|
+
import { writeStderr } from '../shared/stderr.js';
|
|
6
|
+
function formatUnknownError(error) {
|
|
7
|
+
if (error instanceof Error) {
|
|
8
|
+
return error.message;
|
|
9
|
+
}
|
|
10
|
+
if (typeof error === 'string') {
|
|
11
|
+
return error;
|
|
12
|
+
}
|
|
13
|
+
try {
|
|
14
|
+
return JSON.stringify(error);
|
|
15
|
+
}
|
|
16
|
+
catch {
|
|
17
|
+
return 'Unknown error';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function parseCommand(command) {
|
|
21
|
+
const trimmed = command.trim();
|
|
22
|
+
if (trimmed.length === 0) {
|
|
23
|
+
throw new Error('Unsafe command: command must not be empty');
|
|
24
|
+
}
|
|
25
|
+
const tokens = [];
|
|
26
|
+
let current = '';
|
|
27
|
+
let quote = null;
|
|
28
|
+
for (let index = 0; index < trimmed.length; index += 1) {
|
|
29
|
+
const char = trimmed[index] ?? '';
|
|
30
|
+
const next = trimmed[index + 1] ?? '';
|
|
31
|
+
if (quote === null) {
|
|
32
|
+
if (char === "'" || char === '"') {
|
|
33
|
+
quote = char;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (/\s/.test(char)) {
|
|
37
|
+
if (current.length > 0) {
|
|
38
|
+
tokens.push(current);
|
|
39
|
+
current = '';
|
|
40
|
+
}
|
|
41
|
+
continue;
|
|
42
|
+
}
|
|
43
|
+
if (char === '|' ||
|
|
44
|
+
char === '&' ||
|
|
45
|
+
char === ';' ||
|
|
46
|
+
char === '>' ||
|
|
47
|
+
char === '<' ||
|
|
48
|
+
char === '`' ||
|
|
49
|
+
(char === '$' && next === '(')) {
|
|
50
|
+
throw new Error(`Unsafe command: shell operator '${char}' is not allowed`);
|
|
51
|
+
}
|
|
52
|
+
if (char === '\\') {
|
|
53
|
+
current += next;
|
|
54
|
+
index += 1;
|
|
55
|
+
continue;
|
|
56
|
+
}
|
|
57
|
+
current += char;
|
|
58
|
+
continue;
|
|
59
|
+
}
|
|
60
|
+
if (char === quote) {
|
|
61
|
+
quote = null;
|
|
62
|
+
continue;
|
|
63
|
+
}
|
|
64
|
+
if (char === '\\') {
|
|
65
|
+
current += next;
|
|
66
|
+
index += 1;
|
|
67
|
+
continue;
|
|
68
|
+
}
|
|
69
|
+
current += char;
|
|
70
|
+
}
|
|
71
|
+
if (quote !== null) {
|
|
72
|
+
throw new Error('Unsafe command: unmatched quote');
|
|
73
|
+
}
|
|
74
|
+
if (current.length > 0) {
|
|
75
|
+
tokens.push(current);
|
|
76
|
+
}
|
|
77
|
+
const [bin, ...args] = tokens;
|
|
78
|
+
if (!bin) {
|
|
79
|
+
throw new Error('Unsafe command: command must not be empty');
|
|
80
|
+
}
|
|
81
|
+
return [bin, ...args];
|
|
82
|
+
}
|
|
83
|
+
export async function runCommandWithTimeout(command, cwd, timeoutMs) {
|
|
84
|
+
const controller = new AbortController();
|
|
85
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
86
|
+
try {
|
|
87
|
+
const [bin, ...args] = parseCommand(command);
|
|
88
|
+
const result = await execa(bin, args, {
|
|
89
|
+
cwd,
|
|
90
|
+
cancelSignal: controller.signal,
|
|
91
|
+
reject: false,
|
|
92
|
+
});
|
|
93
|
+
clearTimeout(timeout);
|
|
94
|
+
const rawOutput = `${result.stdout}\n${result.stderr}`.trim();
|
|
95
|
+
if (result.isCanceled || result.isTerminated) {
|
|
96
|
+
return {
|
|
97
|
+
status: 'timeout',
|
|
98
|
+
output: rawOutput.length > 4096 ? rawOutput.slice(-4096) : rawOutput,
|
|
99
|
+
rawOutput,
|
|
100
|
+
exitCode: -1,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
if ('code' in result && result.code === 'ENOENT') {
|
|
104
|
+
const output = 'shortMessage' in result && typeof result.shortMessage === 'string'
|
|
105
|
+
? result.shortMessage
|
|
106
|
+
: 'Command not found';
|
|
107
|
+
return { status: 'failed', output, rawOutput: output, exitCode: 127 };
|
|
108
|
+
}
|
|
109
|
+
if (result.exitCode === 0) {
|
|
110
|
+
return { status: 'passed', output: '', rawOutput, exitCode: 0 };
|
|
111
|
+
}
|
|
112
|
+
return {
|
|
113
|
+
status: 'failed',
|
|
114
|
+
output: rawOutput.length > 4096 ? rawOutput.slice(-4096) : rawOutput,
|
|
115
|
+
rawOutput,
|
|
116
|
+
exitCode: result.exitCode ?? 1,
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
clearTimeout(timeout);
|
|
121
|
+
if (error && typeof error === 'object' && 'code' in error && error.code === 'ENOENT') {
|
|
122
|
+
const output = formatUnknownError(error);
|
|
123
|
+
return {
|
|
124
|
+
status: 'failed',
|
|
125
|
+
output,
|
|
126
|
+
rawOutput: output,
|
|
127
|
+
exitCode: 127,
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
const output = formatUnknownError(error);
|
|
131
|
+
return {
|
|
132
|
+
status: 'failed',
|
|
133
|
+
output,
|
|
134
|
+
rawOutput: output,
|
|
135
|
+
exitCode: 1,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
function sanitizeFilenameSegment(name) {
|
|
140
|
+
const cleaned = name.replace(/[^a-zA-Z0-9._-]/g, '_').slice(0, 80);
|
|
141
|
+
return cleaned.length > 0 ? cleaned : 'cmd';
|
|
142
|
+
}
|
|
143
|
+
async function writeRawLog(rawLogDir, attemptLabel, command, result) {
|
|
144
|
+
const filePath = path.join(rawLogDir, `${attemptLabel}-${sanitizeFilenameSegment(command.name)}.log`);
|
|
145
|
+
const header = `# verification log\n` +
|
|
146
|
+
`# name: ${command.name}\n` +
|
|
147
|
+
`# command: ${command.command}\n` +
|
|
148
|
+
`# attempt: ${attemptLabel}\n` +
|
|
149
|
+
`# exitCode: ${String(result.exitCode)}\n` +
|
|
150
|
+
`# status: ${result.status}\n` +
|
|
151
|
+
`# ts: ${new Date().toISOString()}\n` +
|
|
152
|
+
`# ---\n`;
|
|
153
|
+
try {
|
|
154
|
+
await fs.mkdir(rawLogDir, { recursive: true });
|
|
155
|
+
await fs.writeFile(filePath, `${header}${result.rawOutput}\n`, 'utf-8');
|
|
156
|
+
return filePath;
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
160
|
+
writeStderr(`[verification-runner] Failed to write raw log ${filePath}: ${message}`);
|
|
161
|
+
return undefined;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
export async function runVerification(options) {
|
|
165
|
+
const results = [];
|
|
166
|
+
const attemptLabel = options.attemptLabel ?? `attempt-${new Date().toISOString().replace(/[:.]/g, '-')}`;
|
|
167
|
+
// Verification runs sequentially to keep output ordering stable and avoid oversubscribing the VM.
|
|
168
|
+
// oxlint-disable-next-line eslint/no-await-in-loop
|
|
169
|
+
for (const command of options.commands) {
|
|
170
|
+
const result = await runCommandWithTimeout(command.command, options.cwd, options.timeoutMs);
|
|
171
|
+
const logPath = options.rawLogDir
|
|
172
|
+
? await writeRawLog(options.rawLogDir, attemptLabel, command, result)
|
|
173
|
+
: undefined;
|
|
174
|
+
results.push({
|
|
175
|
+
name: command.name,
|
|
176
|
+
passed: result.status === 'passed',
|
|
177
|
+
exitCode: result.exitCode,
|
|
178
|
+
output: result.output,
|
|
179
|
+
...(logPath ? { logPath } : {}),
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
return results;
|
|
183
|
+
}
|
|
184
|
+
export function allVerificationsPassed(results) {
|
|
185
|
+
return results.every((result) => result.passed);
|
|
186
|
+
}
|
|
187
|
+
export function buildVerificationFailureSummary(results) {
|
|
188
|
+
const failed = results.filter((result) => !result.passed);
|
|
189
|
+
if (failed.length === 0) {
|
|
190
|
+
return 'All verifications passed.';
|
|
191
|
+
}
|
|
192
|
+
return failed
|
|
193
|
+
.map((result) => `${result.name} failed (exit code ${result.exitCode}):\n${result.output}`)
|
|
194
|
+
.join('\n\n');
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=verification-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-runner.js","sourceRoot":"","sources":["../../src/validation-runner/verification-runner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ExecutorCapabilities, WorkExecutor } from './executor-interface.js';
|
|
2
|
+
export interface CodexExecutorConfig {
|
|
3
|
+
readonly model: string;
|
|
4
|
+
readonly capabilities: ExecutorCapabilities;
|
|
5
|
+
readonly workingDirectory?: string;
|
|
6
|
+
readonly reasoningEffort?: 'minimal' | 'low' | 'medium' | 'high' | 'xhigh';
|
|
7
|
+
}
|
|
8
|
+
export declare function createCodexExecutor(config: CodexExecutorConfig): WorkExecutor;
|
|
9
|
+
//# sourceMappingURL=codex-executor.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-executor.d.ts","sourceRoot":"","sources":["../../src/work-executor/codex-executor.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EACX,oBAAoB,EAGpB,YAAY,EACZ,MAAM,yBAAyB,CAAC;AA4BjC,MAAM,WAAW,mBAAmB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,YAAY,EAAE,oBAAoB,CAAC;IAC5C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,eAAe,CAAC,EAAE,SAAS,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,OAAO,CAAC;CAC3E;AAeD,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,mBAAmB,GAAG,YAAY,CA+I7E"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import fs from 'node:fs/promises';
|
|
2
|
+
import os from 'node:os';
|
|
3
|
+
import path from 'node:path';
|
|
4
|
+
import { Codex } from '@openai/codex-sdk';
|
|
5
|
+
import { execa } from 'execa';
|
|
6
|
+
import { writeStderr } from '../shared/stderr.js';
|
|
7
|
+
import { getOrCreateLocalToolMcpServer } from './local-tool-mcp-server.js';
|
|
8
|
+
function extractErrorMessages(error) {
|
|
9
|
+
if (!(error instanceof Error)) {
|
|
10
|
+
return [String(error)];
|
|
11
|
+
}
|
|
12
|
+
const messages = [error.message];
|
|
13
|
+
if ('cause' in error && error.cause !== undefined) {
|
|
14
|
+
messages.push(...extractErrorMessages(error.cause));
|
|
15
|
+
}
|
|
16
|
+
return messages;
|
|
17
|
+
}
|
|
18
|
+
function isRecoverableResumeError(error) {
|
|
19
|
+
const messages = extractErrorMessages(error).map((message) => message.toLowerCase());
|
|
20
|
+
return messages.some((message) => message.includes('expired') ||
|
|
21
|
+
message.includes('thread not found') ||
|
|
22
|
+
message.includes('does not exist') ||
|
|
23
|
+
message.includes('unknown thread') ||
|
|
24
|
+
message.includes('404') ||
|
|
25
|
+
message.includes('no thread found'));
|
|
26
|
+
}
|
|
27
|
+
function mapToCodexInput(input) {
|
|
28
|
+
return input.map((item) => {
|
|
29
|
+
if (item.type === 'text') {
|
|
30
|
+
return { type: 'text', text: item.text };
|
|
31
|
+
}
|
|
32
|
+
return {
|
|
33
|
+
type: 'text',
|
|
34
|
+
text: `[Skill: ${item.name}]\n\n${item.content}`,
|
|
35
|
+
};
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
export function createCodexExecutor(config) {
|
|
39
|
+
const workingDirectory = config.workingDirectory ?? process.cwd();
|
|
40
|
+
let codex = null;
|
|
41
|
+
let currentThread = null;
|
|
42
|
+
let currentThreadId = null;
|
|
43
|
+
async function ensureCapabilitiesConfigured() {
|
|
44
|
+
if (codex !== null) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
await fs.mkdir(workingDirectory, { recursive: true });
|
|
48
|
+
const codexHomeBase = process.env.STATE_DIR ?? os.tmpdir();
|
|
49
|
+
await fs.mkdir(codexHomeBase, { recursive: true });
|
|
50
|
+
const tempHome = await fs.mkdtemp(path.join(codexHomeBase, 'agent-vm-codex-home-'));
|
|
51
|
+
await fs.mkdir(path.join(tempHome, '.codex'), { recursive: true });
|
|
52
|
+
for (const mcpServer of config.capabilities.mcpServers) {
|
|
53
|
+
// MCP registration must be serialized because each command mutates the same config home.
|
|
54
|
+
// oxlint-disable-next-line eslint/no-await-in-loop
|
|
55
|
+
await execa('codex', ['mcp', 'add', mcpServer.name, '--url', mcpServer.url], {
|
|
56
|
+
cwd: workingDirectory,
|
|
57
|
+
env: { ...process.env, HOME: tempHome },
|
|
58
|
+
reject: true,
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
const localToolServer = await getOrCreateLocalToolMcpServer(config.capabilities.tools);
|
|
62
|
+
if (localToolServer) {
|
|
63
|
+
await execa('codex', ['mcp', 'add', 'agent-vm-local-tools', '--url', localToolServer.url], {
|
|
64
|
+
cwd: workingDirectory,
|
|
65
|
+
env: { ...process.env, HOME: tempHome },
|
|
66
|
+
reject: true,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
codex = new Codex({
|
|
70
|
+
...(typeof process.env.OPENAI_API_KEY === 'string' && process.env.OPENAI_API_KEY.length > 0
|
|
71
|
+
? { apiKey: process.env.OPENAI_API_KEY }
|
|
72
|
+
: {}),
|
|
73
|
+
config: {
|
|
74
|
+
skip_git_repo_check: true,
|
|
75
|
+
},
|
|
76
|
+
env: {
|
|
77
|
+
...process.env,
|
|
78
|
+
HOME: tempHome,
|
|
79
|
+
},
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
function startNewThread() {
|
|
83
|
+
if (codex === null) {
|
|
84
|
+
throw new Error('Codex executor has not been configured.');
|
|
85
|
+
}
|
|
86
|
+
return codex.startThread({
|
|
87
|
+
model: config.model,
|
|
88
|
+
approvalPolicy: 'never',
|
|
89
|
+
sandboxMode: 'danger-full-access',
|
|
90
|
+
workingDirectory,
|
|
91
|
+
skipGitRepoCheck: true,
|
|
92
|
+
networkAccessEnabled: true,
|
|
93
|
+
...(config.reasoningEffort ? { modelReasoningEffort: config.reasoningEffort } : {}),
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
async function runInThread(thread, input) {
|
|
97
|
+
const result = await thread.run(mapToCodexInput(input));
|
|
98
|
+
const threadId = thread.id ?? currentThreadId ?? '';
|
|
99
|
+
return {
|
|
100
|
+
response: result.finalResponse ?? '',
|
|
101
|
+
tokenCount: result.usage?.output_tokens ?? 0,
|
|
102
|
+
threadId,
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
return {
|
|
106
|
+
async execute(input) {
|
|
107
|
+
await ensureCapabilitiesConfigured();
|
|
108
|
+
currentThread = startNewThread();
|
|
109
|
+
const result = await runInThread(currentThread, input);
|
|
110
|
+
currentThreadId = result.threadId || null;
|
|
111
|
+
return result;
|
|
112
|
+
},
|
|
113
|
+
async fix(input) {
|
|
114
|
+
await ensureCapabilitiesConfigured();
|
|
115
|
+
if (currentThread === null) {
|
|
116
|
+
throw new Error('No active executor thread. Call execute() first.');
|
|
117
|
+
}
|
|
118
|
+
const result = await runInThread(currentThread, input);
|
|
119
|
+
currentThreadId = result.threadId || currentThreadId;
|
|
120
|
+
return result;
|
|
121
|
+
},
|
|
122
|
+
async resumeOrRebuild(threadId, context) {
|
|
123
|
+
await ensureCapabilitiesConfigured();
|
|
124
|
+
if (threadId !== null) {
|
|
125
|
+
try {
|
|
126
|
+
if (codex === null) {
|
|
127
|
+
throw new Error('Codex executor has not been configured.');
|
|
128
|
+
}
|
|
129
|
+
currentThread = codex.resumeThread(threadId, {
|
|
130
|
+
model: config.model,
|
|
131
|
+
approvalPolicy: 'never',
|
|
132
|
+
sandboxMode: 'danger-full-access',
|
|
133
|
+
workingDirectory,
|
|
134
|
+
skipGitRepoCheck: true,
|
|
135
|
+
networkAccessEnabled: true,
|
|
136
|
+
});
|
|
137
|
+
currentThreadId = threadId;
|
|
138
|
+
return;
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
if (!isRecoverableResumeError(error)) {
|
|
142
|
+
throw error;
|
|
143
|
+
}
|
|
144
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
145
|
+
writeStderr(`[codex-executor] Failed to resume thread ${threadId}; rebuilding thread instead: ${message}`);
|
|
146
|
+
currentThread = null;
|
|
147
|
+
currentThreadId = null;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
currentThread = startNewThread();
|
|
151
|
+
await runInThread(currentThread, context);
|
|
152
|
+
currentThreadId = currentThread.id ?? null;
|
|
153
|
+
},
|
|
154
|
+
getThreadId() {
|
|
155
|
+
return currentThreadId;
|
|
156
|
+
},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
//# sourceMappingURL=codex-executor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-executor.js","sourceRoot":"","sources":["../../src/work-executor/codex-executor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { ReasoningEffort } from '../config/worker-config.js';
|
|
2
|
+
import type { ExecutorCapabilities, WorkExecutor } from './executor-interface.js';
|
|
3
|
+
export declare function createWorkExecutor(provider: string, model: string, capabilities: ExecutorCapabilities, workingDirectory?: string, reasoningEffort?: ReasoningEffort): WorkExecutor;
|
|
4
|
+
//# sourceMappingURL=executor-factory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-factory.d.ts","sourceRoot":"","sources":["../../src/work-executor/executor-factory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,KAAK,EAAE,oBAAoB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAElF,wBAAgB,kBAAkB,CACjC,QAAQ,EAAE,MAAM,EAChB,KAAK,EAAE,MAAM,EACb,YAAY,EAAE,oBAAoB,EAClC,gBAAgB,CAAC,EAAE,MAAM,EACzB,eAAe,CAAC,EAAE,eAAe,GAC/B,YAAY,CAcd"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createCodexExecutor } from './codex-executor.js';
|
|
2
|
+
export function createWorkExecutor(provider, model, capabilities, workingDirectory, reasoningEffort) {
|
|
3
|
+
switch (provider) {
|
|
4
|
+
case 'codex':
|
|
5
|
+
return createCodexExecutor({
|
|
6
|
+
model,
|
|
7
|
+
capabilities,
|
|
8
|
+
...(workingDirectory ? { workingDirectory } : {}),
|
|
9
|
+
...(reasoningEffort ? { reasoningEffort } : {}),
|
|
10
|
+
});
|
|
11
|
+
case 'claude':
|
|
12
|
+
throw new Error('Claude executor is not implemented yet.');
|
|
13
|
+
default:
|
|
14
|
+
throw new Error(`Unknown executor provider: '${provider}'.`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=executor-factory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-factory.js","sourceRoot":"","sources":["../../src/work-executor/executor-factory.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAG1D,MAAM,UAAU,kBAAkB,CACjC,QAAgB,EAChB,KAAa,EACb,YAAkC,EAClC,gBAAyB,EACzB,eAAiC;IAEjC,QAAQ,QAAQ,EAAE,CAAC;QAClB,KAAK,OAAO;YACX,OAAO,mBAAmB,CAAC;gBAC1B,KAAK;gBACL,YAAY;gBACZ,GAAG,CAAC,gBAAgB,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACjD,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC/C,CAAC,CAAC;QACJ,KAAK,QAAQ;YACZ,MAAM,IAAI,KAAK,CAAC,yCAAyC,CAAC,CAAC;QAC5D;YACC,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,IAAI,CAAC,CAAC;IAC/D,CAAC;AACF,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type StructuredInput = {
|
|
2
|
+
readonly type: 'text';
|
|
3
|
+
readonly text: string;
|
|
4
|
+
} | {
|
|
5
|
+
readonly type: 'skill';
|
|
6
|
+
readonly name: string;
|
|
7
|
+
readonly content: string;
|
|
8
|
+
};
|
|
9
|
+
export interface ExecutorResult {
|
|
10
|
+
readonly response: string;
|
|
11
|
+
readonly tokenCount: number;
|
|
12
|
+
readonly threadId: string;
|
|
13
|
+
}
|
|
14
|
+
export interface WorkExecutor {
|
|
15
|
+
execute(input: readonly StructuredInput[]): Promise<ExecutorResult>;
|
|
16
|
+
fix(input: readonly StructuredInput[]): Promise<ExecutorResult>;
|
|
17
|
+
resumeOrRebuild(threadId: string | null, context: readonly StructuredInput[]): Promise<void>;
|
|
18
|
+
getThreadId(): string | null;
|
|
19
|
+
}
|
|
20
|
+
export interface ToolDefinition {
|
|
21
|
+
readonly name: string;
|
|
22
|
+
readonly description: string;
|
|
23
|
+
readonly inputSchema: Record<string, unknown>;
|
|
24
|
+
readonly execute: (params: Record<string, unknown>) => Promise<unknown>;
|
|
25
|
+
}
|
|
26
|
+
export interface ExecutorCapabilities {
|
|
27
|
+
readonly mcpServers: readonly {
|
|
28
|
+
readonly name: string;
|
|
29
|
+
readonly url: string;
|
|
30
|
+
}[];
|
|
31
|
+
readonly tools: readonly ToolDefinition[];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=executor-interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-interface.d.ts","sourceRoot":"","sources":["../../src/work-executor/executor-interface.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,eAAe,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAChD;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/E,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC1B;AAED,MAAM,WAAW,YAAY;IAC5B,OAAO,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IACpE,GAAG,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,cAAc,CAAC,CAAC;IAChE,eAAe,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,SAAS,eAAe,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC7F,WAAW,IAAI,MAAM,GAAG,IAAI,CAAC;CAC7B;AAED,MAAM,WAAW,cAAc;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C,QAAQ,CAAC,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACxE;AAED,MAAM,WAAW,oBAAoB;IACpC,QAAQ,CAAC,UAAU,EAAE,SAAS;QAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAChF,QAAQ,CAAC,KAAK,EAAE,SAAS,cAAc,EAAE,CAAC;CAC1C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"executor-interface.js","sourceRoot":"","sources":["../../src/work-executor/executor-interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { ToolDefinition } from './executor-interface.js';
|
|
2
|
+
interface LocalToolMcpServer {
|
|
3
|
+
readonly url: string;
|
|
4
|
+
readonly close: () => Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare function getOrCreateLocalToolMcpServer(tools: readonly ToolDefinition[]): Promise<LocalToolMcpServer | null>;
|
|
7
|
+
export {};
|
|
8
|
+
//# sourceMappingURL=local-tool-mcp-server.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"local-tool-mcp-server.d.ts","sourceRoot":"","sources":["../../src/work-executor/local-tool-mcp-server.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D,UAAU,kBAAkB;IAC3B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,KAAK,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC;AAkKD,wBAAsB,6BAA6B,CAClD,KAAK,EAAE,SAAS,cAAc,EAAE,GAC9B,OAAO,CAAC,kBAAkB,GAAG,IAAI,CAAC,CAkDpC"}
|