@ai-devkit/agent-manager 0.28.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +1 -342
- package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
- package/dist/__tests__/capacity/codex.test.js +343 -0
- package/dist/__tests__/capacity/codex.test.js.map +1 -0
- package/dist/__tests__/capacity/index.test.js +50 -0
- package/dist/__tests__/capacity/index.test.js.map +1 -0
- package/dist/__tests__/database/DurableAgentsDatabase.test.js +31 -3
- package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +1 -1
- package/dist/__tests__/durable/CodexCliProbe.test.js +129 -0
- package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -0
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +84 -0
- package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +126 -0
- package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -0
- package/dist/__tests__/durable/CodexPrintAgentService.test.js +271 -0
- package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/durable/CodexPrintRunner.test.js +393 -0
- package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -0
- package/dist/__tests__/print/ClaudeCliProbe.test.js +3 -7
- package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +33 -27
- package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintAgentService.test.js +65 -0
- package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
- package/dist/__tests__/print/ClaudePrintRunner.test.js +4 -10
- package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +79 -0
- package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -0
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +436 -0
- package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +76 -0
- package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +43 -0
- package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +202 -0
- package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +119 -0
- package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +386 -0
- package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -0
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +34 -0
- package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -0
- package/dist/__tests__/utils/ClaudeSessionParser.test.js +2 -2
- package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
- package/dist/adapters/index.d.ts +1 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +1 -1
- package/dist/adapters/index.js.map +1 -1
- package/dist/capacity/codex.d.ts +36 -0
- package/dist/capacity/codex.d.ts.map +1 -0
- package/dist/capacity/codex.js +317 -0
- package/dist/capacity/codex.js.map +1 -0
- package/dist/capacity/index.d.ts +11 -0
- package/dist/capacity/index.d.ts.map +1 -0
- package/dist/capacity/index.js +49 -0
- package/dist/capacity/index.js.map +1 -0
- package/dist/capacity/types.d.ts +17 -0
- package/dist/capacity/types.d.ts.map +1 -0
- package/dist/capacity/types.js +3 -0
- package/dist/capacity/types.js.map +1 -0
- package/dist/database/migrations/004_codex_durable_sessions.sql +1 -0
- package/dist/durable/DurableAgent.d.ts +23 -3
- package/dist/durable/DurableAgent.d.ts.map +1 -1
- package/dist/durable/DurableAgent.js +12 -0
- package/dist/durable/DurableAgent.js.map +1 -1
- package/dist/durable/DurableAgentRepository.d.ts +6 -7
- package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
- package/dist/durable/DurableAgentRepository.js +73 -42
- package/dist/durable/DurableAgentRepository.js.map +1 -1
- package/dist/durable/process.d.ts +8 -0
- package/dist/durable/process.d.ts.map +1 -0
- package/dist/durable/process.js +40 -0
- package/dist/durable/process.js.map +1 -0
- package/dist/durable/run.d.ts +32 -0
- package/dist/durable/run.d.ts.map +1 -0
- package/dist/durable/run.js +46 -0
- package/dist/durable/run.js.map +1 -0
- package/dist/durable/utils.d.ts +19 -0
- package/dist/durable/utils.d.ts.map +1 -0
- package/dist/durable/utils.js +52 -0
- package/dist/durable/utils.js.map +1 -0
- package/dist/index.d.ts +19 -13
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +10 -8
- package/dist/index.js.map +1 -1
- package/dist/providers/claude/ClaudeAgentMapper.d.ts +21 -0
- package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -0
- package/dist/providers/claude/ClaudeAgentMapper.js +42 -0
- package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -0
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts +29 -0
- package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -0
- package/dist/providers/claude/ClaudeCodeAdapter.js +129 -0
- package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -0
- package/dist/{adapters/ClaudeCodeAdapter.d.ts → providers/claude/ClaudeSessionLocator.d.ts} +68 -52
- package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -0
- package/dist/{adapters/ClaudeCodeAdapter.js → providers/claude/ClaudeSessionLocator.js} +71 -189
- package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -0
- package/dist/{utils → providers/claude}/ClaudeSessionParser.d.ts +2 -2
- package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -0
- package/dist/{utils → providers/claude}/ClaudeSessionParser.js +1 -1
- package/dist/providers/claude/ClaudeSessionParser.js.map +1 -0
- package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -0
- package/dist/{durable → providers/claude/durable}/ClaudeCliProbe.js +4 -9
- package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -0
- package/dist/{durable → providers/claude/durable}/ClaudePrintAgentService.d.ts +4 -9
- package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -0
- package/dist/providers/claude/durable/ClaudePrintAgentService.js +45 -0
- package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -0
- package/dist/{durable → providers/claude/durable}/ClaudePrintRunner.d.ts +3 -3
- package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -0
- package/dist/providers/claude/durable/ClaudePrintRunner.js +75 -0
- package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +17 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.js +69 -0
- package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts +20 -0
- package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexCliProbe.js +61 -0
- package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +40 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.js +50 -0
- package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -0
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts +34 -0
- package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexPrintRunner.js +78 -0
- package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -0
- package/dist/providers/codex/durable/CodexStreamParser.d.ts +21 -0
- package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -0
- package/dist/providers/codex/durable/CodexStreamParser.js +86 -0
- package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts +20 -0
- package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiCliProbe.js +51 -0
- package/dist/providers/pi/durable/PiCliProbe.js.map +1 -0
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts +39 -0
- package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiPrintAgentService.js +47 -0
- package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -0
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts +4 -0
- package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiPrintProtocol.js +44 -0
- package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -0
- package/dist/providers/pi/durable/PiPrintRunner.d.ts +32 -0
- package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiPrintRunner.js +61 -0
- package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -0
- package/dist/providers/pi/durable/PiStreamParser.d.ts +21 -0
- package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -0
- package/dist/providers/pi/durable/PiStreamParser.js +71 -0
- package/dist/providers/pi/durable/PiStreamParser.js.map +1 -0
- package/package.json +1 -1
- package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1 -307
- package/src/__tests__/capacity/codex.test.ts +184 -0
- package/src/__tests__/capacity/index.test.ts +38 -0
- package/src/__tests__/database/DurableAgentsDatabase.test.ts +28 -3
- package/src/__tests__/durable/CodexCliProbe.test.ts +63 -0
- package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +54 -0
- package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +79 -0
- package/src/__tests__/durable/CodexPrintAgentService.test.ts +139 -0
- package/src/__tests__/durable/CodexPrintRunner.test.ts +189 -0
- package/src/__tests__/fixtures/fake-codex.cjs +45 -0
- package/src/__tests__/print/ClaudeCliProbe.test.ts +3 -7
- package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +19 -22
- package/src/__tests__/print/ClaudePrintAgentService.test.ts +33 -1
- package/src/__tests__/print/ClaudePrintRunner.test.ts +4 -10
- package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +84 -0
- package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +411 -0
- package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +38 -0
- package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +32 -0
- package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +69 -0
- package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +33 -0
- package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +107 -0
- package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +24 -0
- package/src/__tests__/utils/ClaudeSessionParser.test.ts +2 -2
- package/src/adapters/index.ts +1 -1
- package/src/capacity/codex.ts +320 -0
- package/src/capacity/index.ts +57 -0
- package/src/capacity/types.ts +18 -0
- package/src/database/migrations/004_codex_durable_sessions.sql +1 -0
- package/src/durable/DurableAgent.ts +51 -3
- package/src/durable/DurableAgentRepository.ts +60 -31
- package/src/durable/process.ts +28 -0
- package/src/durable/run.ts +74 -0
- package/src/durable/utils.ts +61 -0
- package/src/index.ts +37 -15
- package/src/providers/claude/ClaudeAgentMapper.ts +62 -0
- package/src/providers/claude/ClaudeCodeAdapter.ts +160 -0
- package/src/{adapters/ClaudeCodeAdapter.ts → providers/claude/ClaudeSessionLocator.ts} +97 -239
- package/src/{utils → providers/claude}/ClaudeSessionParser.ts +2 -2
- package/src/{durable → providers/claude/durable}/ClaudeCliProbe.ts +4 -10
- package/src/providers/claude/durable/ClaudePrintAgentService.ts +66 -0
- package/src/providers/claude/durable/ClaudePrintRunner.ts +92 -0
- package/src/providers/claude/durable/ClaudeStreamParser.ts +79 -0
- package/src/providers/codex/durable/CodexCliProbe.ts +60 -0
- package/src/providers/codex/durable/CodexPrintAgentService.ts +65 -0
- package/src/providers/codex/durable/CodexPrintRunner.ts +94 -0
- package/src/providers/codex/durable/CodexStreamParser.ts +104 -0
- package/src/providers/pi/durable/PiCliProbe.ts +48 -0
- package/src/providers/pi/durable/PiPrintAgentService.ts +69 -0
- package/src/providers/pi/durable/PiPrintProtocol.ts +39 -0
- package/src/providers/pi/durable/PiPrintRunner.ts +88 -0
- package/src/providers/pi/durable/PiStreamParser.ts +84 -0
- package/dist/adapters/ClaudeCodeAdapter.d.ts.map +0 -1
- package/dist/adapters/ClaudeCodeAdapter.js.map +0 -1
- package/dist/durable/ClaudeCliProbe.d.ts.map +0 -1
- package/dist/durable/ClaudeCliProbe.js.map +0 -1
- package/dist/durable/ClaudePrintAgentService.d.ts.map +0 -1
- package/dist/durable/ClaudePrintAgentService.js +0 -66
- package/dist/durable/ClaudePrintAgentService.js.map +0 -1
- package/dist/durable/ClaudePrintRunner.d.ts.map +0 -1
- package/dist/durable/ClaudePrintRunner.js +0 -128
- package/dist/durable/ClaudePrintRunner.js.map +0 -1
- package/dist/utils/ClaudeSessionParser.d.ts.map +0 -1
- package/dist/utils/ClaudeSessionParser.js.map +0 -1
- package/src/durable/ClaudePrintAgentService.ts +0 -94
- package/src/durable/ClaudePrintRunner.ts +0 -139
- /package/dist/{durable → providers/claude/durable}/ClaudeCliProbe.d.ts +0 -0
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'child_process';
|
|
2
|
+
import { ClaudePrintError } from '../../../durable/DurableAgent.js';
|
|
3
|
+
import { LocalProcessInspector } from '../../../durable/process.js';
|
|
4
|
+
import { waitForChildClose } from '../../../durable/utils.js';
|
|
5
|
+
import { ClaudeStreamParser } from './ClaudeStreamParser.js';
|
|
6
|
+
export class ClaudePrintRunner {
|
|
7
|
+
spawn;
|
|
8
|
+
processInspector;
|
|
9
|
+
maxLineBytes;
|
|
10
|
+
constructor(options = {}){
|
|
11
|
+
this.spawn = options.spawn ?? nodeSpawn;
|
|
12
|
+
this.processInspector = options.processInspector ?? new LocalProcessInspector();
|
|
13
|
+
this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;
|
|
14
|
+
}
|
|
15
|
+
async run(request) {
|
|
16
|
+
const sessionArgs = request.firstRun ? [
|
|
17
|
+
'--session-id',
|
|
18
|
+
request.agent.providerSessionId
|
|
19
|
+
] : [
|
|
20
|
+
'--resume',
|
|
21
|
+
request.agent.providerSessionId
|
|
22
|
+
];
|
|
23
|
+
const args = [
|
|
24
|
+
'-p',
|
|
25
|
+
...sessionArgs,
|
|
26
|
+
'--output-format',
|
|
27
|
+
'stream-json',
|
|
28
|
+
'--verbose'
|
|
29
|
+
];
|
|
30
|
+
const child = this.spawn(request.executable ?? 'claude', args, {
|
|
31
|
+
cwd: request.agent.cwd,
|
|
32
|
+
shell: false,
|
|
33
|
+
stdio: [
|
|
34
|
+
'pipe',
|
|
35
|
+
'pipe',
|
|
36
|
+
'pipe'
|
|
37
|
+
]
|
|
38
|
+
});
|
|
39
|
+
if (!child.pid) {
|
|
40
|
+
child.kill();
|
|
41
|
+
throw new ClaudePrintError('Claude process did not provide a PID.', 'CLAUDE_PROCESS_IDENTITY');
|
|
42
|
+
}
|
|
43
|
+
const identity = this.processInspector.getIdentity(child.pid);
|
|
44
|
+
if (!identity) {
|
|
45
|
+
child.kill();
|
|
46
|
+
throw new ClaudePrintError('Cannot verify Claude process identity.', 'CLAUDE_PROCESS_IDENTITY');
|
|
47
|
+
}
|
|
48
|
+
const parser = new ClaudeStreamParser(request.agent.providerSessionId, this.maxLineBytes);
|
|
49
|
+
child.stdout.on('data', (chunk)=>{
|
|
50
|
+
if (parser.hasFailed()) return;
|
|
51
|
+
try {
|
|
52
|
+
parser.accept(chunk);
|
|
53
|
+
} catch (error) {
|
|
54
|
+
parser.fail(error);
|
|
55
|
+
}
|
|
56
|
+
});
|
|
57
|
+
// Drain provider diagnostics without reflecting potentially sensitive prompt/tool data.
|
|
58
|
+
child.stderr.resume();
|
|
59
|
+
const closed = waitForChildClose(child);
|
|
60
|
+
try {
|
|
61
|
+
await request.onSpawn(identity);
|
|
62
|
+
} catch (error) {
|
|
63
|
+
child.kill();
|
|
64
|
+
throw error;
|
|
65
|
+
}
|
|
66
|
+
child.stdin.end(request.prompt);
|
|
67
|
+
const { code, signal } = await closed;
|
|
68
|
+
return parser.result({
|
|
69
|
+
code,
|
|
70
|
+
signal
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
//# sourceMappingURL=ClaudePrintRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/claude/durable/ClaudePrintRunner.ts"],"sourcesContent":["import { spawn as nodeSpawn, type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from 'child_process';\nimport type { ClaudeDurableAgent, ProcessIdentity } from '../../../durable/DurableAgent.js';\nimport { ClaudePrintError } from '../../../durable/DurableAgent.js';\nimport { LocalProcessInspector, type ProcessInspector } from '../../../durable/process.js';\nimport { waitForChildClose } from '../../../durable/utils.js';\nimport { ClaudeStreamParser } from './ClaudeStreamParser.js';\n\ntype Spawn = (\n command: string,\n args: readonly string[],\n options: SpawnOptionsWithoutStdio & { stdio: ['pipe', 'pipe', 'pipe'] },\n) => ChildProcessWithoutNullStreams;\n\nexport interface ClaudePrintRunRequest {\n agent: ClaudeDurableAgent;\n prompt: string;\n executable?: string;\n firstRun: boolean;\n onSpawn(identity: ProcessIdentity): Promise<void>;\n}\n\nexport interface ClaudePrintRunResult {\n sessionId: string;\n result: string;\n exitCode: number;\n}\n\nexport interface ClaudePrintRunnerOptions {\n spawn?: Spawn;\n processInspector?: ProcessInspector;\n maxLineBytes?: number;\n}\n\nexport class ClaudePrintRunner {\n private readonly spawn: Spawn;\n private readonly processInspector: ProcessInspector;\n private readonly maxLineBytes: number;\n\n constructor(options: ClaudePrintRunnerOptions = {}) {\n this.spawn = options.spawn ?? (nodeSpawn as Spawn);\n this.processInspector = options.processInspector ?? new LocalProcessInspector();\n this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;\n }\n\n async run(request: ClaudePrintRunRequest): Promise<ClaudePrintRunResult> {\n const sessionArgs = request.firstRun\n ? ['--session-id', request.agent.providerSessionId]\n : ['--resume', request.agent.providerSessionId];\n const args = ['-p', ...sessionArgs, '--output-format', 'stream-json', '--verbose'];\n const child = this.spawn(request.executable ?? 'claude', args, {\n cwd: request.agent.cwd,\n shell: false,\n stdio: ['pipe', 'pipe', 'pipe'],\n });\n if (!child.pid) {\n child.kill();\n throw new ClaudePrintError('Claude process did not provide a PID.', 'CLAUDE_PROCESS_IDENTITY');\n }\n const identity = this.processInspector.getIdentity(child.pid);\n if (!identity) {\n child.kill();\n throw new ClaudePrintError('Cannot verify Claude process identity.', 'CLAUDE_PROCESS_IDENTITY');\n }\n\n const parser = new ClaudeStreamParser(request.agent.providerSessionId, this.maxLineBytes);\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n if (parser.hasFailed()) return;\n try {\n parser.accept(chunk);\n } catch (error) {\n parser.fail(error);\n }\n });\n // Drain provider diagnostics without reflecting potentially sensitive prompt/tool data.\n child.stderr.resume();\n\n const closed = waitForChildClose(child);\n\n try {\n await request.onSpawn(identity);\n } catch (error) {\n child.kill();\n throw error;\n }\n\n child.stdin.end(request.prompt);\n const { code, signal } = await closed;\n\n return parser.result({ code, signal });\n }\n}\n"],"names":["spawn","nodeSpawn","ClaudePrintError","LocalProcessInspector","waitForChildClose","ClaudeStreamParser","ClaudePrintRunner","processInspector","maxLineBytes","options","run","request","sessionArgs","firstRun","agent","providerSessionId","args","child","executable","cwd","shell","stdio","pid","kill","identity","getIdentity","parser","stdout","on","chunk","hasFailed","accept","error","fail","stderr","resume","closed","onSpawn","stdin","end","prompt","code","signal","result"],"mappings":"AAAA,SAASA,SAASC,SAAS,QAA4E,gBAAgB;AAEvH,SAASC,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,qBAAqB,QAA+B,8BAA8B;AAC3F,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,kBAAkB,QAAQ,0BAA0B;AA4B7D,OAAO,MAAMC;IACQN,MAAa;IACbO,iBAAmC;IACnCC,aAAqB;IAEtC,YAAYC,UAAoC,CAAC,CAAC,CAAE;QAChD,IAAI,CAACT,KAAK,GAAGS,QAAQT,KAAK,IAAKC;QAC/B,IAAI,CAACM,gBAAgB,GAAGE,QAAQF,gBAAgB,IAAI,IAAIJ;QACxD,IAAI,CAACK,YAAY,GAAGC,QAAQD,YAAY,IAAI,OAAO;IACvD;IAEA,MAAME,IAAIC,OAA8B,EAAiC;QACrE,MAAMC,cAAcD,QAAQE,QAAQ,GAC9B;YAAC;YAAgBF,QAAQG,KAAK,CAACC,iBAAiB;SAAC,GACjD;YAAC;YAAYJ,QAAQG,KAAK,CAACC,iBAAiB;SAAC;QACnD,MAAMC,OAAO;YAAC;eAASJ;YAAa;YAAmB;YAAe;SAAY;QAClF,MAAMK,QAAQ,IAAI,CAACjB,KAAK,CAACW,QAAQO,UAAU,IAAI,UAAUF,MAAM;YAC3DG,KAAKR,QAAQG,KAAK,CAACK,GAAG;YACtBC,OAAO;YACPC,OAAO;gBAAC;gBAAQ;gBAAQ;aAAO;QACnC;QACA,IAAI,CAACJ,MAAMK,GAAG,EAAE;YACZL,MAAMM,IAAI;YACV,MAAM,IAAIrB,iBAAiB,yCAAyC;QACxE;QACA,MAAMsB,WAAW,IAAI,CAACjB,gBAAgB,CAACkB,WAAW,CAACR,MAAMK,GAAG;QAC5D,IAAI,CAACE,UAAU;YACXP,MAAMM,IAAI;YACV,MAAM,IAAIrB,iBAAiB,0CAA0C;QACzE;QAEA,MAAMwB,SAAS,IAAIrB,mBAAmBM,QAAQG,KAAK,CAACC,iBAAiB,EAAE,IAAI,CAACP,YAAY;QAExFS,MAAMU,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;YACrB,IAAIH,OAAOI,SAAS,IAAI;YACxB,IAAI;gBACAJ,OAAOK,MAAM,CAACF;YAClB,EAAE,OAAOG,OAAO;gBACZN,OAAOO,IAAI,CAACD;YAChB;QACJ;QACA,wFAAwF;QACxFf,MAAMiB,MAAM,CAACC,MAAM;QAEnB,MAAMC,SAAShC,kBAAkBa;QAEjC,IAAI;YACA,MAAMN,QAAQ0B,OAAO,CAACb;QAC1B,EAAE,OAAOQ,OAAO;YACZf,MAAMM,IAAI;YACV,MAAMS;QACV;QAEAf,MAAMqB,KAAK,CAACC,GAAG,CAAC5B,QAAQ6B,MAAM;QAC9B,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAG,MAAMN;QAE/B,OAAOV,OAAOiB,MAAM,CAAC;YAAEF;YAAMC;QAAO;IACxC;AACJ"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { type ChildCloseResult } from '../../../durable/utils.js';
|
|
2
|
+
import type { ClaudePrintRunResult } from './ClaudePrintRunner.js';
|
|
3
|
+
export declare class ClaudeStreamParser {
|
|
4
|
+
private readonly expectedSessionId;
|
|
5
|
+
private readonly lines;
|
|
6
|
+
private terminal;
|
|
7
|
+
private protocolError;
|
|
8
|
+
constructor(expectedSessionId: string, maxLineBytes: number);
|
|
9
|
+
hasFailed(): boolean;
|
|
10
|
+
accept(chunk: Buffer | string): void;
|
|
11
|
+
fail(error: unknown): void;
|
|
12
|
+
result(close: ChildCloseResult): ClaudePrintRunResult;
|
|
13
|
+
private processLine;
|
|
14
|
+
private parseEvent;
|
|
15
|
+
private recordTerminalResult;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=ClaudeStreamParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ClaudeStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/providers/claude/durable/ClaudeStreamParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,qBAAa,kBAAkB;IAMvB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IALtC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,aAAa,CAAiC;gBAGjC,iBAAiB,EAAE,MAAM,EAC1C,YAAY,EAAE,MAAM;IAQxB,SAAS,IAAI,OAAO;IAIpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAM1B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,oBAAoB;IAarD,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,oBAAoB;CAO/B"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { ClaudePrintError } from '../../../durable/DurableAgent.js';
|
|
2
|
+
import { LineBuffer } from '../../../durable/utils.js';
|
|
3
|
+
export class ClaudeStreamParser {
|
|
4
|
+
expectedSessionId;
|
|
5
|
+
lines;
|
|
6
|
+
terminal = null;
|
|
7
|
+
protocolError = null;
|
|
8
|
+
constructor(expectedSessionId, maxLineBytes){
|
|
9
|
+
this.expectedSessionId = expectedSessionId;
|
|
10
|
+
this.lines = new LineBuffer(maxLineBytes, ()=>new ClaudePrintError('Claude stream line exceeded the safety limit.', 'CLAUDE_STREAM_OVERSIZED'));
|
|
11
|
+
}
|
|
12
|
+
hasFailed() {
|
|
13
|
+
return this.protocolError !== null;
|
|
14
|
+
}
|
|
15
|
+
accept(chunk) {
|
|
16
|
+
for (const line of this.lines.accept(chunk)){
|
|
17
|
+
this.processLine(line);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
fail(error) {
|
|
21
|
+
this.protocolError = error instanceof ClaudePrintError ? error : new ClaudePrintError('Claude stream processing failed.', 'CLAUDE_STREAM_INVALID');
|
|
22
|
+
}
|
|
23
|
+
result(close) {
|
|
24
|
+
if (this.protocolError) throw this.protocolError;
|
|
25
|
+
this.lines.assertComplete(()=>new ClaudePrintError('Claude stream ended with incomplete JSON.', 'CLAUDE_STREAM_INVALID'));
|
|
26
|
+
if (close.code !== 0) {
|
|
27
|
+
throw new ClaudePrintError(`Claude print run failed${close.signal ? ` (${close.signal})` : '.'}`, 'CLAUDE_PROCESS_FAILED');
|
|
28
|
+
}
|
|
29
|
+
if (!this.terminal) throw new ClaudePrintError('Claude stream ended without a terminal result.', 'CLAUDE_RESULT_MISSING');
|
|
30
|
+
return {
|
|
31
|
+
sessionId: this.terminal.sessionId,
|
|
32
|
+
result: this.terminal.result,
|
|
33
|
+
exitCode: close.code
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
processLine(line) {
|
|
37
|
+
if (line.length === 0) return;
|
|
38
|
+
const event = this.parseEvent(line);
|
|
39
|
+
if (typeof event.session_id === 'string' && event.session_id !== this.expectedSessionId) {
|
|
40
|
+
throw new ClaudePrintError('Claude returned a different session identity.', 'CLAUDE_SESSION_MISMATCH');
|
|
41
|
+
}
|
|
42
|
+
if (event.type === 'result') this.recordTerminalResult(event);
|
|
43
|
+
}
|
|
44
|
+
parseEvent(line) {
|
|
45
|
+
let value;
|
|
46
|
+
try {
|
|
47
|
+
value = JSON.parse(line.toString('utf8'));
|
|
48
|
+
} catch {
|
|
49
|
+
throw new ClaudePrintError('Claude emitted malformed stream JSON.', 'CLAUDE_STREAM_INVALID');
|
|
50
|
+
}
|
|
51
|
+
if (!value || typeof value !== 'object' || Array.isArray(value)) {
|
|
52
|
+
throw new ClaudePrintError('Claude emitted a non-object stream message.', 'CLAUDE_STREAM_INVALID');
|
|
53
|
+
}
|
|
54
|
+
return value;
|
|
55
|
+
}
|
|
56
|
+
recordTerminalResult(event) {
|
|
57
|
+
if (this.terminal) throw new ClaudePrintError('Claude emitted more than one terminal result.', 'CLAUDE_STREAM_INVALID');
|
|
58
|
+
if (typeof event.session_id !== 'string' || typeof event.result !== 'string') {
|
|
59
|
+
throw new ClaudePrintError('Claude emitted an invalid terminal result.', 'CLAUDE_STREAM_INVALID');
|
|
60
|
+
}
|
|
61
|
+
this.terminal = {
|
|
62
|
+
sessionId: event.session_id,
|
|
63
|
+
result: event.result,
|
|
64
|
+
exitCode: 0
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
//# sourceMappingURL=ClaudeStreamParser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/claude/durable/ClaudeStreamParser.ts"],"sourcesContent":["import { ClaudePrintError } from '../../../durable/DurableAgent.js';\nimport { LineBuffer, type ChildCloseResult } from '../../../durable/utils.js';\nimport type { ClaudePrintRunResult } from './ClaudePrintRunner.js';\n\nexport class ClaudeStreamParser {\n private readonly lines: LineBuffer;\n private terminal: ClaudePrintRunResult | null = null;\n private protocolError: ClaudePrintError | null = null;\n\n constructor(\n private readonly expectedSessionId: string,\n maxLineBytes: number,\n ) {\n this.lines = new LineBuffer(\n maxLineBytes,\n () => new ClaudePrintError('Claude stream line exceeded the safety limit.', 'CLAUDE_STREAM_OVERSIZED'),\n );\n }\n\n hasFailed(): boolean {\n return this.protocolError !== null;\n }\n\n accept(chunk: Buffer | string): void {\n for (const line of this.lines.accept(chunk)) {\n this.processLine(line);\n }\n }\n\n fail(error: unknown): void {\n this.protocolError = error instanceof ClaudePrintError\n ? error\n : new ClaudePrintError('Claude stream processing failed.', 'CLAUDE_STREAM_INVALID');\n }\n\n result(close: ChildCloseResult): ClaudePrintRunResult {\n if (this.protocolError) throw this.protocolError;\n this.lines.assertComplete(() => new ClaudePrintError('Claude stream ended with incomplete JSON.', 'CLAUDE_STREAM_INVALID'));\n if (close.code !== 0) {\n throw new ClaudePrintError(\n `Claude print run failed${close.signal ? ` (${close.signal})` : '.'}`,\n 'CLAUDE_PROCESS_FAILED',\n );\n }\n if (!this.terminal) throw new ClaudePrintError('Claude stream ended without a terminal result.', 'CLAUDE_RESULT_MISSING');\n return { sessionId: this.terminal.sessionId, result: this.terminal.result, exitCode: close.code };\n }\n\n private processLine(line: Buffer): void {\n if (line.length === 0) return;\n\n const event = this.parseEvent(line);\n if (typeof event.session_id === 'string' && event.session_id !== this.expectedSessionId) {\n throw new ClaudePrintError('Claude returned a different session identity.', 'CLAUDE_SESSION_MISMATCH');\n }\n if (event.type === 'result') this.recordTerminalResult(event);\n }\n\n private parseEvent(line: Buffer): Record<string, unknown> {\n let value: unknown;\n try {\n value = JSON.parse(line.toString('utf8'));\n } catch {\n throw new ClaudePrintError('Claude emitted malformed stream JSON.', 'CLAUDE_STREAM_INVALID');\n }\n if (!value || typeof value !== 'object' || Array.isArray(value)) {\n throw new ClaudePrintError('Claude emitted a non-object stream message.', 'CLAUDE_STREAM_INVALID');\n }\n return value as Record<string, unknown>;\n }\n\n private recordTerminalResult(event: Record<string, unknown>): void {\n if (this.terminal) throw new ClaudePrintError('Claude emitted more than one terminal result.', 'CLAUDE_STREAM_INVALID');\n if (typeof event.session_id !== 'string' || typeof event.result !== 'string') {\n throw new ClaudePrintError('Claude emitted an invalid terminal result.', 'CLAUDE_STREAM_INVALID');\n }\n this.terminal = { sessionId: event.session_id, result: event.result, exitCode: 0 };\n }\n}\n"],"names":["ClaudePrintError","LineBuffer","ClaudeStreamParser","lines","terminal","protocolError","expectedSessionId","maxLineBytes","hasFailed","accept","chunk","line","processLine","fail","error","result","close","assertComplete","code","signal","sessionId","exitCode","length","event","parseEvent","session_id","type","recordTerminalResult","value","JSON","parse","toString","Array","isArray"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,UAAU,QAA+B,4BAA4B;AAG9E,OAAO,MAAMC;;IACQC,MAAkB;IAC3BC,WAAwC,KAAK;IAC7CC,gBAAyC,KAAK;IAEtD,YACI,AAAiBC,iBAAyB,EAC1CC,YAAoB,CACtB;aAFmBD,oBAAAA;QAGjB,IAAI,CAACH,KAAK,GAAG,IAAIF,WACbM,cACA,IAAM,IAAIP,iBAAiB,iDAAiD;IAEpF;IAEAQ,YAAqB;QACjB,OAAO,IAAI,CAACH,aAAa,KAAK;IAClC;IAEAI,OAAOC,KAAsB,EAAQ;QACjC,KAAK,MAAMC,QAAQ,IAAI,CAACR,KAAK,CAACM,MAAM,CAACC,OAAQ;YACzC,IAAI,CAACE,WAAW,CAACD;QACrB;IACJ;IAEAE,KAAKC,KAAc,EAAQ;QACvB,IAAI,CAACT,aAAa,GAAGS,iBAAiBd,mBAChCc,QACA,IAAId,iBAAiB,oCAAoC;IACnE;IAEAe,OAAOC,KAAuB,EAAwB;QAClD,IAAI,IAAI,CAACX,aAAa,EAAE,MAAM,IAAI,CAACA,aAAa;QAChD,IAAI,CAACF,KAAK,CAACc,cAAc,CAAC,IAAM,IAAIjB,iBAAiB,6CAA6C;QAClG,IAAIgB,MAAME,IAAI,KAAK,GAAG;YAClB,MAAM,IAAIlB,iBACN,CAAC,uBAAuB,EAAEgB,MAAMG,MAAM,GAAG,CAAC,EAAE,EAAEH,MAAMG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EACrE;QAER;QACA,IAAI,CAAC,IAAI,CAACf,QAAQ,EAAE,MAAM,IAAIJ,iBAAiB,kDAAkD;QACjG,OAAO;YAAEoB,WAAW,IAAI,CAAChB,QAAQ,CAACgB,SAAS;YAAEL,QAAQ,IAAI,CAACX,QAAQ,CAACW,MAAM;YAAEM,UAAUL,MAAME,IAAI;QAAC;IACpG;IAEQN,YAAYD,IAAY,EAAQ;QACpC,IAAIA,KAAKW,MAAM,KAAK,GAAG;QAEvB,MAAMC,QAAQ,IAAI,CAACC,UAAU,CAACb;QAC9B,IAAI,OAAOY,MAAME,UAAU,KAAK,YAAYF,MAAME,UAAU,KAAK,IAAI,CAACnB,iBAAiB,EAAE;YACrF,MAAM,IAAIN,iBAAiB,iDAAiD;QAChF;QACA,IAAIuB,MAAMG,IAAI,KAAK,UAAU,IAAI,CAACC,oBAAoB,CAACJ;IAC3D;IAEQC,WAAWb,IAAY,EAA2B;QACtD,IAAIiB;QACJ,IAAI;YACAA,QAAQC,KAAKC,KAAK,CAACnB,KAAKoB,QAAQ,CAAC;QACrC,EAAE,OAAM;YACJ,MAAM,IAAI/B,iBAAiB,yCAAyC;QACxE;QACA,IAAI,CAAC4B,SAAS,OAAOA,UAAU,YAAYI,MAAMC,OAAO,CAACL,QAAQ;YAC7D,MAAM,IAAI5B,iBAAiB,+CAA+C;QAC9E;QACA,OAAO4B;IACX;IAEQD,qBAAqBJ,KAA8B,EAAQ;QAC/D,IAAI,IAAI,CAACnB,QAAQ,EAAE,MAAM,IAAIJ,iBAAiB,iDAAiD;QAC/F,IAAI,OAAOuB,MAAME,UAAU,KAAK,YAAY,OAAOF,MAAMR,MAAM,KAAK,UAAU;YAC1E,MAAM,IAAIf,iBAAiB,8CAA8C;QAC7E;QACA,IAAI,CAACI,QAAQ,GAAG;YAAEgB,WAAWG,MAAME,UAAU;YAAEV,QAAQQ,MAAMR,MAAM;YAAEM,UAAU;QAAE;IACrF;AACJ"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
type ExecResult = {
|
|
2
|
+
stdout: string;
|
|
3
|
+
stderr: string;
|
|
4
|
+
};
|
|
5
|
+
type Exec = (file: string, args: string[]) => Promise<ExecResult>;
|
|
6
|
+
export interface CodexCliProbeOptions {
|
|
7
|
+
executable?: string;
|
|
8
|
+
exec?: Exec;
|
|
9
|
+
}
|
|
10
|
+
export declare class CodexCliProbe {
|
|
11
|
+
private readonly executable;
|
|
12
|
+
private readonly exec;
|
|
13
|
+
constructor(options?: CodexCliProbeOptions);
|
|
14
|
+
validate(): Promise<{
|
|
15
|
+
executable: string;
|
|
16
|
+
version: string;
|
|
17
|
+
}>;
|
|
18
|
+
}
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=CodexCliProbe.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/durable/CodexCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAIlE,MAAM,WAAW,oBAAoB;IACjC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACf;AAED,qBAAa,aAAa;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,GAAE,oBAAyB;IAQxC,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CA4BrE"}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import { execFile } from 'child_process';
|
|
2
|
+
import { promisify } from 'util';
|
|
3
|
+
import { CodexPrintError } from '../../../durable/DurableAgent.js';
|
|
4
|
+
import { sanitizeText } from '../../../durable/utils.js';
|
|
5
|
+
const execFileAsync = promisify(execFile);
|
|
6
|
+
export class CodexCliProbe {
|
|
7
|
+
executable;
|
|
8
|
+
exec;
|
|
9
|
+
constructor(options = {}){
|
|
10
|
+
this.executable = options.executable ?? 'codex';
|
|
11
|
+
this.exec = options.exec ?? (async (file, args)=>{
|
|
12
|
+
const result = await execFileAsync(file, args, {
|
|
13
|
+
encoding: 'utf8',
|
|
14
|
+
maxBuffer: 1024 * 1024
|
|
15
|
+
});
|
|
16
|
+
return {
|
|
17
|
+
stdout: result.stdout,
|
|
18
|
+
stderr: result.stderr
|
|
19
|
+
};
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async validate() {
|
|
23
|
+
try {
|
|
24
|
+
const version = await this.exec(this.executable, [
|
|
25
|
+
'--version'
|
|
26
|
+
]);
|
|
27
|
+
const execHelp = await this.exec(this.executable, [
|
|
28
|
+
'exec',
|
|
29
|
+
'--help'
|
|
30
|
+
]);
|
|
31
|
+
const resumeHelp = await this.exec(this.executable, [
|
|
32
|
+
'exec',
|
|
33
|
+
'resume',
|
|
34
|
+
'--help'
|
|
35
|
+
]);
|
|
36
|
+
const missing = [
|
|
37
|
+
!execHelp.stdout.includes('exec') && 'exec',
|
|
38
|
+
!execHelp.stdout.includes('--json') && '--json',
|
|
39
|
+
!hasStdinDash(execHelp.stdout) && 'stdin -',
|
|
40
|
+
!resumeHelp.stdout.includes('resume') && 'resume',
|
|
41
|
+
!resumeHelp.stdout.includes('--json') && 'resume --json',
|
|
42
|
+
!hasStdinDash(resumeHelp.stdout) && 'resume stdin -'
|
|
43
|
+
].filter((value)=>typeof value === 'string');
|
|
44
|
+
if (missing.length > 0) {
|
|
45
|
+
throw new CodexPrintError(`Codex CLI does not support required print-mode capabilities: ${missing.join(', ')}.`, 'CODEX_CLI_UNSUPPORTED');
|
|
46
|
+
}
|
|
47
|
+
return {
|
|
48
|
+
executable: this.executable,
|
|
49
|
+
version: sanitizeText(version.stdout, 256) || 'unknown'
|
|
50
|
+
};
|
|
51
|
+
} catch (error) {
|
|
52
|
+
if (error instanceof CodexPrintError) throw error;
|
|
53
|
+
throw new CodexPrintError(`Codex CLI validation failed: ${sanitizeText(error.message, 512)}`, 'CODEX_CLI_UNAVAILABLE');
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
function hasStdinDash(help) {
|
|
58
|
+
return /(?:^|\s)-(?:\s|$)/m.test(help);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
//# sourceMappingURL=CodexCliProbe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/codex/durable/CodexCliProbe.ts"],"sourcesContent":["import { execFile } from 'child_process';\nimport { promisify } from 'util';\nimport { CodexPrintError } from '../../../durable/DurableAgent.js';\nimport { sanitizeText } from '../../../durable/utils.js';\n\ntype ExecResult = { stdout: string; stderr: string };\ntype Exec = (file: string, args: string[]) => Promise<ExecResult>;\n\nconst execFileAsync = promisify(execFile);\n\nexport interface CodexCliProbeOptions {\n executable?: string;\n exec?: Exec;\n}\n\nexport class CodexCliProbe {\n private readonly executable: string;\n private readonly exec: Exec;\n\n constructor(options: CodexCliProbeOptions = {}) {\n this.executable = options.executable ?? 'codex';\n this.exec = options.exec ?? (async (file, args) => {\n const result = await execFileAsync(file, args, { encoding: 'utf8', maxBuffer: 1024 * 1024 });\n return { stdout: result.stdout, stderr: result.stderr };\n });\n }\n\n async validate(): Promise<{ executable: string; version: string }> {\n try {\n const version = await this.exec(this.executable, ['--version']);\n const execHelp = await this.exec(this.executable, ['exec', '--help']);\n const resumeHelp = await this.exec(this.executable, ['exec', 'resume', '--help']);\n const missing = [\n !execHelp.stdout.includes('exec') && 'exec',\n !execHelp.stdout.includes('--json') && '--json',\n !hasStdinDash(execHelp.stdout) && 'stdin -',\n !resumeHelp.stdout.includes('resume') && 'resume',\n !resumeHelp.stdout.includes('--json') && 'resume --json',\n !hasStdinDash(resumeHelp.stdout) && 'resume stdin -',\n ].filter((value): value is string => typeof value === 'string');\n if (missing.length > 0) {\n throw new CodexPrintError(\n `Codex CLI does not support required print-mode capabilities: ${missing.join(', ')}.`,\n 'CODEX_CLI_UNSUPPORTED',\n );\n }\n return { executable: this.executable, version: sanitizeText(version.stdout, 256) || 'unknown' };\n } catch (error) {\n if (error instanceof CodexPrintError) throw error;\n throw new CodexPrintError(\n `Codex CLI validation failed: ${sanitizeText((error as Error).message, 512)}`,\n 'CODEX_CLI_UNAVAILABLE',\n );\n }\n }\n}\n\nfunction hasStdinDash(help: string): boolean {\n return /(?:^|\\s)-(?:\\s|$)/m.test(help);\n}\n"],"names":["execFile","promisify","CodexPrintError","sanitizeText","execFileAsync","CodexCliProbe","executable","exec","options","file","args","result","encoding","maxBuffer","stdout","stderr","validate","version","execHelp","resumeHelp","missing","includes","hasStdinDash","filter","value","length","join","error","message","help","test"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,eAAe,QAAQ,mCAAmC;AACnE,SAASC,YAAY,QAAQ,4BAA4B;AAKzD,MAAMC,gBAAgBH,UAAUD;AAOhC,OAAO,MAAMK;IACQC,WAAmB;IACnBC,KAAW;IAE5B,YAAYC,UAAgC,CAAC,CAAC,CAAE;QAC5C,IAAI,CAACF,UAAU,GAAGE,QAAQF,UAAU,IAAI;QACxC,IAAI,CAACC,IAAI,GAAGC,QAAQD,IAAI,IAAK,CAAA,OAAOE,MAAMC;YACtC,MAAMC,SAAS,MAAMP,cAAcK,MAAMC,MAAM;gBAAEE,UAAU;gBAAQC,WAAW,OAAO;YAAK;YAC1F,OAAO;gBAAEC,QAAQH,OAAOG,MAAM;gBAAEC,QAAQJ,OAAOI,MAAM;YAAC;QAC1D,CAAA;IACJ;IAEA,MAAMC,WAA6D;QAC/D,IAAI;YACA,MAAMC,UAAU,MAAM,IAAI,CAACV,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAY;YAC9D,MAAMY,WAAW,MAAM,IAAI,CAACX,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;gBAAQ;aAAS;YACpE,MAAMa,aAAa,MAAM,IAAI,CAACZ,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;gBAAQ;gBAAU;aAAS;YAChF,MAAMc,UAAU;gBACZ,CAACF,SAASJ,MAAM,CAACO,QAAQ,CAAC,WAAW;gBACrC,CAACH,SAASJ,MAAM,CAACO,QAAQ,CAAC,aAAa;gBACvC,CAACC,aAAaJ,SAASJ,MAAM,KAAK;gBAClC,CAACK,WAAWL,MAAM,CAACO,QAAQ,CAAC,aAAa;gBACzC,CAACF,WAAWL,MAAM,CAACO,QAAQ,CAAC,aAAa;gBACzC,CAACC,aAAaH,WAAWL,MAAM,KAAK;aACvC,CAACS,MAAM,CAAC,CAACC,QAA2B,OAAOA,UAAU;YACtD,IAAIJ,QAAQK,MAAM,GAAG,GAAG;gBACpB,MAAM,IAAIvB,gBACN,CAAC,6DAA6D,EAAEkB,QAAQM,IAAI,CAAC,MAAM,CAAC,CAAC,EACrF;YAER;YACA,OAAO;gBAAEpB,YAAY,IAAI,CAACA,UAAU;gBAAEW,SAASd,aAAac,QAAQH,MAAM,EAAE,QAAQ;YAAU;QAClG,EAAE,OAAOa,OAAO;YACZ,IAAIA,iBAAiBzB,iBAAiB,MAAMyB;YAC5C,MAAM,IAAIzB,gBACN,CAAC,6BAA6B,EAAEC,aAAa,AAACwB,MAAgBC,OAAO,EAAE,MAAM,EAC7E;QAER;IACJ;AACJ;AAEA,SAASN,aAAaO,IAAY;IAC9B,OAAO,qBAAqBC,IAAI,CAACD;AACrC"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import type { DurableAgent, ProcessIdentity } from '../../../durable/DurableAgent.js';
|
|
2
|
+
import { CodexPrintRunner, type CodexPrintRunResult } from './CodexPrintRunner.js';
|
|
3
|
+
import { type CreateDurableAgentInput } from '../../../durable/DurableAgentRepository.js';
|
|
4
|
+
import { type DurableRunRepository } from '../../../durable/run.js';
|
|
5
|
+
interface RepositoryLike extends DurableRunRepository {
|
|
6
|
+
create(input: CreateDurableAgentInput): Promise<DurableAgent>;
|
|
7
|
+
list(): Promise<DurableAgent[]>;
|
|
8
|
+
recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;
|
|
9
|
+
bindProviderSession(id: string, token: string, providerSessionId: string): Promise<DurableAgent>;
|
|
10
|
+
}
|
|
11
|
+
interface ProbeLike {
|
|
12
|
+
validate(): Promise<{
|
|
13
|
+
executable: string;
|
|
14
|
+
version: string;
|
|
15
|
+
}>;
|
|
16
|
+
}
|
|
17
|
+
interface RunnerLike {
|
|
18
|
+
run(request: Parameters<CodexPrintRunner['run']>[0]): Promise<CodexPrintRunResult>;
|
|
19
|
+
}
|
|
20
|
+
export interface CodexPrintAgentServiceOptions {
|
|
21
|
+
repository?: RepositoryLike;
|
|
22
|
+
probe?: ProbeLike;
|
|
23
|
+
runner?: RunnerLike;
|
|
24
|
+
executable?: string;
|
|
25
|
+
}
|
|
26
|
+
export interface CodexPrintSendResult extends CodexPrintRunResult {
|
|
27
|
+
agentId: string;
|
|
28
|
+
agentName: string;
|
|
29
|
+
}
|
|
30
|
+
export declare class CodexPrintAgentService {
|
|
31
|
+
readonly repository: RepositoryLike;
|
|
32
|
+
private readonly probe;
|
|
33
|
+
private readonly runner;
|
|
34
|
+
private readonly executable?;
|
|
35
|
+
constructor(options?: CodexPrintAgentServiceOptions);
|
|
36
|
+
create(input: Omit<CreateDurableAgentInput, 'provider'>): Promise<DurableAgent>;
|
|
37
|
+
send(reference: string, prompt: string): Promise<CodexPrintSendResult>;
|
|
38
|
+
}
|
|
39
|
+
export {};
|
|
40
|
+
//# sourceMappingURL=CodexPrintAgentService.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexPrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/durable/CodexPrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,gBAAgB,EAAE,KAAK,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAA0B,KAAK,uBAAuB,EAAE,MAAM,4CAA4C,CAAC;AAClH,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAErF,UAAU,cAAe,SAAQ,oBAAoB;IACjD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC3F,mBAAmB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CACpG;AAED,UAAU,SAAS;IAAG,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE;AACpF,UAAU,UAAU;IAAG,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAAA;CAAE;AAE3G,MAAM,WAAW,6BAA6B;IAC1C,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC7D,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACrB;AAED,qBAAa,sBAAsB;IAC/B,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,6BAAkC;IAOjD,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,uBAAuB,EAAE,UAAU,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC;IAK/E,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAiB/E"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { CodexPrintError } from '../../../durable/DurableAgent.js';
|
|
2
|
+
import { CodexCliProbe } from './CodexCliProbe.js';
|
|
3
|
+
import { CodexPrintRunner } from './CodexPrintRunner.js';
|
|
4
|
+
import { DurableAgentRepository } from '../../../durable/DurableAgentRepository.js';
|
|
5
|
+
import { runDurableAgent } from '../../../durable/run.js';
|
|
6
|
+
export class CodexPrintAgentService {
|
|
7
|
+
repository;
|
|
8
|
+
probe;
|
|
9
|
+
runner;
|
|
10
|
+
executable;
|
|
11
|
+
constructor(options = {}){
|
|
12
|
+
this.repository = options.repository ?? new DurableAgentRepository();
|
|
13
|
+
this.probe = options.probe ?? new CodexCliProbe();
|
|
14
|
+
this.runner = options.runner ?? new CodexPrintRunner();
|
|
15
|
+
this.executable = options.executable;
|
|
16
|
+
}
|
|
17
|
+
async create(input) {
|
|
18
|
+
await this.probe.validate();
|
|
19
|
+
return this.repository.create({
|
|
20
|
+
...input,
|
|
21
|
+
provider: 'codex'
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
async send(reference, prompt) {
|
|
25
|
+
const completed = await runDurableAgent({
|
|
26
|
+
reference,
|
|
27
|
+
provider: 'codex',
|
|
28
|
+
repository: this.repository,
|
|
29
|
+
ambiguousError: ()=>new CodexPrintError('Multiple print agents match.', 'CODEX_UNSUPPORTED'),
|
|
30
|
+
providerError: ()=>new CodexPrintError('Print agent provider is not Codex.', 'CODEX_UNSUPPORTED'),
|
|
31
|
+
execute: (agent, token)=>this.runner.run({
|
|
32
|
+
agent,
|
|
33
|
+
prompt,
|
|
34
|
+
executable: this.executable,
|
|
35
|
+
onSpawn: (identity)=>this.repository.recordProviderProcess(agent.id, token, identity),
|
|
36
|
+
onSession: async (sessionId)=>{
|
|
37
|
+
await this.repository.bindProviderSession(agent.id, token, sessionId);
|
|
38
|
+
}
|
|
39
|
+
}),
|
|
40
|
+
isSessionMismatch: (error)=>error instanceof CodexPrintError && error.code === 'CODEX_SESSION_MISMATCH'
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
...completed.result,
|
|
44
|
+
agentId: completed.agent.id,
|
|
45
|
+
agentName: completed.agent.name
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
//# sourceMappingURL=CodexPrintAgentService.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/codex/durable/CodexPrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from '../../../durable/DurableAgent.js';\nimport { CodexPrintError } from '../../../durable/DurableAgent.js';\nimport { CodexCliProbe } from './CodexCliProbe.js';\nimport { CodexPrintRunner, type CodexPrintRunResult } from './CodexPrintRunner.js';\nimport { DurableAgentRepository, type CreateDurableAgentInput } from '../../../durable/DurableAgentRepository.js';\nimport { runDurableAgent, type DurableRunRepository } from '../../../durable/run.js';\n\ninterface RepositoryLike extends DurableRunRepository {\n create(input: CreateDurableAgentInput): Promise<DurableAgent>;\n list(): Promise<DurableAgent[]>;\n recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;\n bindProviderSession(id: string, token: string, providerSessionId: string): Promise<DurableAgent>;\n}\n\ninterface ProbeLike { validate(): Promise<{ executable: string; version: string }> }\ninterface RunnerLike { run(request: Parameters<CodexPrintRunner['run']>[0]): Promise<CodexPrintRunResult> }\n\nexport interface CodexPrintAgentServiceOptions {\n repository?: RepositoryLike;\n probe?: ProbeLike;\n runner?: RunnerLike;\n executable?: string;\n}\n\nexport interface CodexPrintSendResult extends CodexPrintRunResult {\n agentId: string;\n agentName: string;\n}\n\nexport class CodexPrintAgentService {\n readonly repository: RepositoryLike;\n private readonly probe: ProbeLike;\n private readonly runner: RunnerLike;\n private readonly executable?: string;\n\n constructor(options: CodexPrintAgentServiceOptions = {}) {\n this.repository = options.repository ?? new DurableAgentRepository();\n this.probe = options.probe ?? new CodexCliProbe();\n this.runner = options.runner ?? new CodexPrintRunner();\n this.executable = options.executable;\n }\n\n async create(input: Omit<CreateDurableAgentInput, 'provider'>): Promise<DurableAgent> {\n await this.probe.validate();\n return this.repository.create({ ...input, provider: 'codex' });\n }\n\n async send(reference: string, prompt: string): Promise<CodexPrintSendResult> {\n const completed = await runDurableAgent({\n reference, provider: 'codex', repository: this.repository,\n ambiguousError: () => new CodexPrintError('Multiple print agents match.', 'CODEX_UNSUPPORTED'),\n providerError: () => new CodexPrintError('Print agent provider is not Codex.', 'CODEX_UNSUPPORTED'),\n execute: (agent, token) => this.runner.run({\n agent,\n prompt,\n executable: this.executable,\n onSpawn: (identity) => this.repository.recordProviderProcess(agent.id, token, identity),\n onSession: async (sessionId) => { await this.repository.bindProviderSession(agent.id, token, sessionId); },\n }),\n isSessionMismatch: (error) => error instanceof CodexPrintError\n && error.code === 'CODEX_SESSION_MISMATCH',\n });\n return { ...completed.result, agentId: completed.agent.id, agentName: completed.agent.name };\n }\n}\n"],"names":["CodexPrintError","CodexCliProbe","CodexPrintRunner","DurableAgentRepository","runDurableAgent","CodexPrintAgentService","repository","probe","runner","executable","options","create","input","validate","provider","send","reference","prompt","completed","ambiguousError","providerError","execute","agent","token","run","onSpawn","identity","recordProviderProcess","id","onSession","sessionId","bindProviderSession","isSessionMismatch","error","code","result","agentId","agentName","name"],"mappings":"AACA,SAASA,eAAe,QAAQ,mCAAmC;AACnE,SAASC,aAAa,QAAQ,qBAAqB;AACnD,SAASC,gBAAgB,QAAkC,wBAAwB;AACnF,SAASC,sBAAsB,QAAsC,6CAA6C;AAClH,SAASC,eAAe,QAAmC,0BAA0B;AAwBrF,OAAO,MAAMC;IACAC,WAA2B;IACnBC,MAAiB;IACjBC,OAAmB;IACnBC,WAAoB;IAErC,YAAYC,UAAyC,CAAC,CAAC,CAAE;QACrD,IAAI,CAACJ,UAAU,GAAGI,QAAQJ,UAAU,IAAI,IAAIH;QAC5C,IAAI,CAACI,KAAK,GAAGG,QAAQH,KAAK,IAAI,IAAIN;QAClC,IAAI,CAACO,MAAM,GAAGE,QAAQF,MAAM,IAAI,IAAIN;QACpC,IAAI,CAACO,UAAU,GAAGC,QAAQD,UAAU;IACxC;IAEA,MAAME,OAAOC,KAAgD,EAAyB;QAClF,MAAM,IAAI,CAACL,KAAK,CAACM,QAAQ;QACzB,OAAO,IAAI,CAACP,UAAU,CAACK,MAAM,CAAC;YAAE,GAAGC,KAAK;YAAEE,UAAU;QAAQ;IAChE;IAEA,MAAMC,KAAKC,SAAiB,EAAEC,MAAc,EAAiC;QACzE,MAAMC,YAAY,MAAMd,gBAAgB;YACpCY;YAAWF,UAAU;YAASR,YAAY,IAAI,CAACA,UAAU;YACzDa,gBAAgB,IAAM,IAAInB,gBAAgB,gCAAgC;YAC1EoB,eAAe,IAAM,IAAIpB,gBAAgB,sCAAsC;YAC/EqB,SAAS,CAACC,OAAOC,QAAU,IAAI,CAACf,MAAM,CAACgB,GAAG,CAAC;oBACvCF;oBACAL;oBACAR,YAAY,IAAI,CAACA,UAAU;oBAC3BgB,SAAS,CAACC,WAAa,IAAI,CAACpB,UAAU,CAACqB,qBAAqB,CAACL,MAAMM,EAAE,EAAEL,OAAOG;oBAC9EG,WAAW,OAAOC;wBAAgB,MAAM,IAAI,CAACxB,UAAU,CAACyB,mBAAmB,CAACT,MAAMM,EAAE,EAAEL,OAAOO;oBAAY;gBAC7G;YACAE,mBAAmB,CAACC,QAAUA,iBAAiBjC,mBACxCiC,MAAMC,IAAI,KAAK;QAC1B;QACA,OAAO;YAAE,GAAGhB,UAAUiB,MAAM;YAAEC,SAASlB,UAAUI,KAAK,CAACM,EAAE;YAAES,WAAWnB,UAAUI,KAAK,CAACgB,IAAI;QAAC;IAC/F;AACJ"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from 'child_process';
|
|
2
|
+
import type { CodexDurableAgent, ProcessIdentity } from '../../../durable/DurableAgent.js';
|
|
3
|
+
import { type ProcessInspector } from '../../../durable/process.js';
|
|
4
|
+
type Spawn = (command: string, args: readonly string[], options: SpawnOptionsWithoutStdio & {
|
|
5
|
+
stdio: ['pipe', 'pipe', 'pipe'];
|
|
6
|
+
}) => ChildProcessWithoutNullStreams;
|
|
7
|
+
export interface CodexPrintRunRequest {
|
|
8
|
+
agent: CodexDurableAgent;
|
|
9
|
+
prompt: string;
|
|
10
|
+
executable?: string;
|
|
11
|
+
onSpawn(identity: ProcessIdentity): Promise<void>;
|
|
12
|
+
onSession(providerSessionId: string): Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export interface CodexPrintRunResult {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
result: string;
|
|
17
|
+
messages: string[];
|
|
18
|
+
exitCode: number;
|
|
19
|
+
}
|
|
20
|
+
export interface CodexPrintRunnerOptions {
|
|
21
|
+
spawn?: Spawn;
|
|
22
|
+
processInspector?: ProcessInspector;
|
|
23
|
+
maxLineBytes?: number;
|
|
24
|
+
}
|
|
25
|
+
export declare class CodexPrintRunner {
|
|
26
|
+
private readonly spawn;
|
|
27
|
+
private readonly processInspector;
|
|
28
|
+
private readonly maxLineBytes;
|
|
29
|
+
constructor(options?: CodexPrintRunnerOptions);
|
|
30
|
+
run(request: CodexPrintRunRequest): Promise<CodexPrintRunResult>;
|
|
31
|
+
private verifyProcessIdentity;
|
|
32
|
+
}
|
|
33
|
+
export {};
|
|
34
|
+
//# sourceMappingURL=CodexPrintRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexPrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/durable/CodexPrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,8BAA8B,EAAE,KAAK,wBAAwB,EAAE,MAAM,eAAe,CAAC;AACvH,OAAO,KAAK,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE3F,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAI3F,KAAK,KAAK,GAAG,CACT,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAAG;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACtE,8BAA8B,CAAC;AAEpC,MAAM,WAAW,oBAAoB;IACjC,KAAK,EAAE,iBAAiB,CAAC;IACzB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClD,SAAS,CAAC,iBAAiB,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,mBAAmB;IAChC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,uBAAuB;IACpC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACzB;AAED,qBAAa,gBAAgB;IACzB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,uBAA4B;IAM3C,GAAG,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA8BtE,OAAO,CAAC,qBAAqB;CAYhC"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import { spawn as nodeSpawn } from 'child_process';
|
|
2
|
+
import { CodexPrintError } from '../../../durable/DurableAgent.js';
|
|
3
|
+
import { LocalProcessInspector } from '../../../durable/process.js';
|
|
4
|
+
import { waitForChildClose } from '../../../durable/utils.js';
|
|
5
|
+
import { CodexStreamParser } from './CodexStreamParser.js';
|
|
6
|
+
export class CodexPrintRunner {
|
|
7
|
+
spawn;
|
|
8
|
+
processInspector;
|
|
9
|
+
maxLineBytes;
|
|
10
|
+
constructor(options = {}){
|
|
11
|
+
this.spawn = options.spawn ?? nodeSpawn;
|
|
12
|
+
this.processInspector = options.processInspector ?? new LocalProcessInspector();
|
|
13
|
+
this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;
|
|
14
|
+
}
|
|
15
|
+
async run(request) {
|
|
16
|
+
const args = buildCodexExecArgs(request.agent);
|
|
17
|
+
const child = this.spawn(request.executable ?? 'codex', args, {
|
|
18
|
+
cwd: request.agent.cwd,
|
|
19
|
+
shell: false,
|
|
20
|
+
stdio: [
|
|
21
|
+
'pipe',
|
|
22
|
+
'pipe',
|
|
23
|
+
'pipe'
|
|
24
|
+
]
|
|
25
|
+
});
|
|
26
|
+
const identity = this.verifyProcessIdentity(child);
|
|
27
|
+
const parser = new CodexStreamParser(request.agent.providerSessionId, request.onSession, this.maxLineBytes);
|
|
28
|
+
let processing = Promise.resolve();
|
|
29
|
+
child.stdout.on('data', (chunk)=>{
|
|
30
|
+
if (parser.hasFailed()) return;
|
|
31
|
+
processing = processing.then(()=>parser.accept(chunk)).catch((error)=>parser.fail(error));
|
|
32
|
+
});
|
|
33
|
+
child.stderr.resume();
|
|
34
|
+
const closed = waitForChildClose(child);
|
|
35
|
+
try {
|
|
36
|
+
await request.onSpawn(identity);
|
|
37
|
+
} catch (error) {
|
|
38
|
+
child.kill();
|
|
39
|
+
throw error;
|
|
40
|
+
}
|
|
41
|
+
child.stdin.end(request.prompt);
|
|
42
|
+
const { code, signal } = await closed.catch(()=>{
|
|
43
|
+
throw new CodexPrintError('Codex process failed to start or communicate.', 'CODEX_PROCESS');
|
|
44
|
+
});
|
|
45
|
+
await processing;
|
|
46
|
+
return parser.result({
|
|
47
|
+
code,
|
|
48
|
+
signal
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
verifyProcessIdentity(child) {
|
|
52
|
+
if (!child.pid) {
|
|
53
|
+
child.kill();
|
|
54
|
+
throw new CodexPrintError('Codex process did not provide a PID.', 'CODEX_PROCESS');
|
|
55
|
+
}
|
|
56
|
+
const identity = this.processInspector.getIdentity(child.pid);
|
|
57
|
+
if (!identity) {
|
|
58
|
+
child.kill();
|
|
59
|
+
throw new CodexPrintError('Cannot verify Codex process identity.', 'CODEX_PROCESS');
|
|
60
|
+
}
|
|
61
|
+
return identity;
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function buildCodexExecArgs(agent) {
|
|
65
|
+
return agent.providerSessionId === null ? [
|
|
66
|
+
'exec',
|
|
67
|
+
'--json',
|
|
68
|
+
'-'
|
|
69
|
+
] : [
|
|
70
|
+
'exec',
|
|
71
|
+
'resume',
|
|
72
|
+
'--json',
|
|
73
|
+
agent.providerSessionId,
|
|
74
|
+
'-'
|
|
75
|
+
];
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=CodexPrintRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/providers/codex/durable/CodexPrintRunner.ts"],"sourcesContent":["import { spawn as nodeSpawn, type ChildProcessWithoutNullStreams, type SpawnOptionsWithoutStdio } from 'child_process';\nimport type { CodexDurableAgent, ProcessIdentity } from '../../../durable/DurableAgent.js';\nimport { CodexPrintError } from '../../../durable/DurableAgent.js';\nimport { LocalProcessInspector, type ProcessInspector } from '../../../durable/process.js';\nimport { waitForChildClose } from '../../../durable/utils.js';\nimport { CodexStreamParser } from './CodexStreamParser.js';\n\ntype Spawn = (\n command: string,\n args: readonly string[],\n options: SpawnOptionsWithoutStdio & { stdio: ['pipe', 'pipe', 'pipe'] },\n) => ChildProcessWithoutNullStreams;\n\nexport interface CodexPrintRunRequest {\n agent: CodexDurableAgent;\n prompt: string;\n executable?: string;\n onSpawn(identity: ProcessIdentity): Promise<void>;\n onSession(providerSessionId: string): Promise<void>;\n}\n\nexport interface CodexPrintRunResult {\n sessionId: string;\n result: string;\n messages: string[];\n exitCode: number;\n}\n\nexport interface CodexPrintRunnerOptions {\n spawn?: Spawn;\n processInspector?: ProcessInspector;\n maxLineBytes?: number;\n}\n\nexport class CodexPrintRunner {\n private readonly spawn: Spawn;\n private readonly processInspector: ProcessInspector;\n private readonly maxLineBytes: number;\n\n constructor(options: CodexPrintRunnerOptions = {}) {\n this.spawn = options.spawn ?? (nodeSpawn as Spawn);\n this.processInspector = options.processInspector ?? new LocalProcessInspector();\n this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;\n }\n\n async run(request: CodexPrintRunRequest): Promise<CodexPrintRunResult> {\n const args = buildCodexExecArgs(request.agent);\n const child = this.spawn(request.executable ?? 'codex', args, {\n cwd: request.agent.cwd, shell: false, stdio: ['pipe', 'pipe', 'pipe'],\n });\n const identity = this.verifyProcessIdentity(child);\n\n const parser = new CodexStreamParser(request.agent.providerSessionId, request.onSession, this.maxLineBytes);\n let processing = Promise.resolve();\n\n child.stdout.on('data', (chunk: Buffer | string) => {\n if (parser.hasFailed()) return;\n processing = processing.then(() => parser.accept(chunk)).catch((error) => parser.fail(error));\n });\n child.stderr.resume();\n const closed = waitForChildClose(child);\n try {\n await request.onSpawn(identity);\n } catch (error) {\n child.kill();\n throw error;\n }\n child.stdin.end(request.prompt);\n const { code, signal } = await closed.catch(() => {\n throw new CodexPrintError('Codex process failed to start or communicate.', 'CODEX_PROCESS');\n });\n await processing;\n return parser.result({ code, signal });\n }\n\n private verifyProcessIdentity(child: ChildProcessWithoutNullStreams): ProcessIdentity {\n if (!child.pid) {\n child.kill();\n throw new CodexPrintError('Codex process did not provide a PID.', 'CODEX_PROCESS');\n }\n const identity = this.processInspector.getIdentity(child.pid);\n if (!identity) {\n child.kill();\n throw new CodexPrintError('Cannot verify Codex process identity.', 'CODEX_PROCESS');\n }\n return identity;\n }\n}\n\nfunction buildCodexExecArgs(agent: CodexDurableAgent): string[] {\n return agent.providerSessionId === null\n ? ['exec', '--json', '-']\n : ['exec', 'resume', '--json', agent.providerSessionId, '-'];\n}\n"],"names":["spawn","nodeSpawn","CodexPrintError","LocalProcessInspector","waitForChildClose","CodexStreamParser","CodexPrintRunner","processInspector","maxLineBytes","options","run","request","args","buildCodexExecArgs","agent","child","executable","cwd","shell","stdio","identity","verifyProcessIdentity","parser","providerSessionId","onSession","processing","Promise","resolve","stdout","on","chunk","hasFailed","then","accept","catch","error","fail","stderr","resume","closed","onSpawn","kill","stdin","end","prompt","code","signal","result","pid","getIdentity"],"mappings":"AAAA,SAASA,SAASC,SAAS,QAA4E,gBAAgB;AAEvH,SAASC,eAAe,QAAQ,mCAAmC;AACnE,SAASC,qBAAqB,QAA+B,8BAA8B;AAC3F,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,iBAAiB,QAAQ,yBAAyB;AA6B3D,OAAO,MAAMC;IACQN,MAAa;IACbO,iBAAmC;IACnCC,aAAqB;IAEtC,YAAYC,UAAmC,CAAC,CAAC,CAAE;QAC/C,IAAI,CAACT,KAAK,GAAGS,QAAQT,KAAK,IAAKC;QAC/B,IAAI,CAACM,gBAAgB,GAAGE,QAAQF,gBAAgB,IAAI,IAAIJ;QACxD,IAAI,CAACK,YAAY,GAAGC,QAAQD,YAAY,IAAI,OAAO;IACvD;IAEA,MAAME,IAAIC,OAA6B,EAAgC;QACnE,MAAMC,OAAOC,mBAAmBF,QAAQG,KAAK;QAC7C,MAAMC,QAAQ,IAAI,CAACf,KAAK,CAACW,QAAQK,UAAU,IAAI,SAASJ,MAAM;YAC1DK,KAAKN,QAAQG,KAAK,CAACG,GAAG;YAAEC,OAAO;YAAOC,OAAO;gBAAC;gBAAQ;gBAAQ;aAAO;QACzE;QACA,MAAMC,WAAW,IAAI,CAACC,qBAAqB,CAACN;QAE5C,MAAMO,SAAS,IAAIjB,kBAAkBM,QAAQG,KAAK,CAACS,iBAAiB,EAAEZ,QAAQa,SAAS,EAAE,IAAI,CAAChB,YAAY;QAC1G,IAAIiB,aAAaC,QAAQC,OAAO;QAEhCZ,MAAMa,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;YACrB,IAAIR,OAAOS,SAAS,IAAI;YACxBN,aAAaA,WAAWO,IAAI,CAAC,IAAMV,OAAOW,MAAM,CAACH,QAAQI,KAAK,CAAC,CAACC,QAAUb,OAAOc,IAAI,CAACD;QAC1F;QACApB,MAAMsB,MAAM,CAACC,MAAM;QACnB,MAAMC,SAASnC,kBAAkBW;QACjC,IAAI;YACA,MAAMJ,QAAQ6B,OAAO,CAACpB;QAC1B,EAAE,OAAOe,OAAO;YACZpB,MAAM0B,IAAI;YACV,MAAMN;QACV;QACApB,MAAM2B,KAAK,CAACC,GAAG,CAAChC,QAAQiC,MAAM;QAC9B,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAG,MAAMP,OAAOL,KAAK,CAAC;YACxC,MAAM,IAAIhC,gBAAgB,iDAAiD;QAC/E;QACA,MAAMuB;QACN,OAAOH,OAAOyB,MAAM,CAAC;YAAEF;YAAMC;QAAO;IACxC;IAEQzB,sBAAsBN,KAAqC,EAAmB;QAClF,IAAI,CAACA,MAAMiC,GAAG,EAAE;YACZjC,MAAM0B,IAAI;YACV,MAAM,IAAIvC,gBAAgB,wCAAwC;QACtE;QACA,MAAMkB,WAAW,IAAI,CAACb,gBAAgB,CAAC0C,WAAW,CAAClC,MAAMiC,GAAG;QAC5D,IAAI,CAAC5B,UAAU;YACXL,MAAM0B,IAAI;YACV,MAAM,IAAIvC,gBAAgB,yCAAyC;QACvE;QACA,OAAOkB;IACX;AACJ;AAEA,SAASP,mBAAmBC,KAAwB;IAChD,OAAOA,MAAMS,iBAAiB,KAAK,OAC7B;QAAC;QAAQ;QAAU;KAAI,GACvB;QAAC;QAAQ;QAAU;QAAUT,MAAMS,iBAAiB;QAAE;KAAI;AACpE"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type ChildCloseResult } from '../../../durable/utils.js';
|
|
2
|
+
import type { CodexPrintRunResult } from './CodexPrintRunner.js';
|
|
3
|
+
export declare class CodexStreamParser {
|
|
4
|
+
private readonly expectedSessionId;
|
|
5
|
+
private readonly onSession;
|
|
6
|
+
private readonly lines;
|
|
7
|
+
private sessionId;
|
|
8
|
+
private turnCompleted;
|
|
9
|
+
private readonly messages;
|
|
10
|
+
private protocolError;
|
|
11
|
+
constructor(expectedSessionId: string | null, onSession: (providerSessionId: string) => Promise<void>, maxLineBytes: number);
|
|
12
|
+
hasFailed(): boolean;
|
|
13
|
+
accept(chunk: Buffer | string): Promise<void>;
|
|
14
|
+
fail(error: unknown): void;
|
|
15
|
+
result(close: ChildCloseResult): CodexPrintRunResult;
|
|
16
|
+
private processLine;
|
|
17
|
+
private parseEvent;
|
|
18
|
+
private recordSession;
|
|
19
|
+
private recordAssistantMessage;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=CodexStreamParser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CodexStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/providers/codex/durable/CodexStreamParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AACtF,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAEjE,qBAAa,iBAAiB;IAQtB,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAR9B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,aAAa,CAAgC;gBAGhC,iBAAiB,EAAE,MAAM,GAAG,IAAI,EAChC,SAAS,EAAE,CAAC,iBAAiB,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,EACxE,YAAY,EAAE,MAAM;IAQxB,SAAS,IAAI,OAAO;IAId,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAMnD,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAM1B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,mBAAmB;YAoBtC,WAAW;IAazB,OAAO,CAAC,UAAU;YAaJ,aAAa;IAY3B,OAAO,CAAC,sBAAsB;CAOjC"}
|