ralph-research 0.1.2 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +132 -101
- package/dist/adapters/fs/json-file-research-project-defaults-store.d.ts +8 -0
- package/dist/adapters/fs/json-file-research-project-defaults-store.js +30 -0
- package/dist/adapters/fs/json-file-research-project-defaults-store.js.map +1 -0
- package/dist/adapters/fs/json-file-research-session-repository.d.ts +24 -0
- package/dist/adapters/fs/json-file-research-session-repository.js +199 -0
- package/dist/adapters/fs/json-file-research-session-repository.js.map +1 -0
- package/dist/adapters/fs/lockfile.js +142 -57
- package/dist/adapters/fs/lockfile.js.map +1 -1
- package/dist/adapters/fs/manifest-loader.js +8 -1
- package/dist/adapters/fs/manifest-loader.js.map +1 -1
- package/dist/adapters/proposer/codex-cli-proposer.d.ts +16 -0
- package/dist/adapters/proposer/codex-cli-proposer.js +106 -0
- package/dist/adapters/proposer/codex-cli-proposer.js.map +1 -0
- package/dist/adapters/proposer/codex-cli-session-driver.d.ts +64 -0
- package/dist/adapters/proposer/codex-cli-session-driver.js +182 -0
- package/dist/adapters/proposer/codex-cli-session-driver.js.map +1 -0
- package/dist/adapters/proposer/codex-cli-session-manager.d.ts +79 -0
- package/dist/adapters/proposer/codex-cli-session-manager.js +248 -0
- package/dist/adapters/proposer/codex-cli-session-manager.js.map +1 -0
- package/dist/adapters/proposer/codex-cli-session-outcome-extractor.d.ts +3 -0
- package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js +94 -0
- package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js.map +1 -0
- package/dist/adapters/proposer/proposer-factory.d.ts +22 -0
- package/dist/adapters/proposer/proposer-factory.js +19 -0
- package/dist/adapters/proposer/proposer-factory.js.map +1 -0
- package/dist/app/services/codex-cli-session-lifecycle-service.d.ts +116 -0
- package/dist/app/services/codex-cli-session-lifecycle-service.js +186 -0
- package/dist/app/services/codex-cli-session-lifecycle-service.js.map +1 -0
- package/dist/app/services/manual-decision-service.js +20 -9
- package/dist/app/services/manual-decision-service.js.map +1 -1
- package/dist/app/services/project-state-service.js +5 -3
- package/dist/app/services/project-state-service.js.map +1 -1
- package/dist/app/services/research-project-defaults-service.d.ts +18 -0
- package/dist/app/services/research-project-defaults-service.js +175 -0
- package/dist/app/services/research-project-defaults-service.js.map +1 -0
- package/dist/app/services/research-session-draft-service.d.ts +121 -0
- package/dist/app/services/research-session-draft-service.js +846 -0
- package/dist/app/services/research-session-draft-service.js.map +1 -0
- package/dist/app/services/research-session-entry-flow-summary-mapper.d.ts +12 -0
- package/dist/app/services/research-session-entry-flow-summary-mapper.js +33 -0
- package/dist/app/services/research-session-entry-flow-summary-mapper.js.map +1 -0
- package/dist/app/services/research-session-interactive-service.d.ts +35 -0
- package/dist/app/services/research-session-interactive-service.js +295 -0
- package/dist/app/services/research-session-interactive-service.js.map +1 -0
- package/dist/app/services/research-session-launch-service.d.ts +46 -0
- package/dist/app/services/research-session-launch-service.js +389 -0
- package/dist/app/services/research-session-launch-service.js.map +1 -0
- package/dist/app/services/research-session-orchestrator-service.d.ts +140 -0
- package/dist/app/services/research-session-orchestrator-service.js +614 -0
- package/dist/app/services/research-session-orchestrator-service.js.map +1 -0
- package/dist/app/services/research-session-recovery-service.d.ts +30 -0
- package/dist/app/services/research-session-recovery-service.js +110 -0
- package/dist/app/services/research-session-recovery-service.js.map +1 -0
- package/dist/app/services/research-session-wizard-controller.d.ts +51 -0
- package/dist/app/services/research-session-wizard-controller.js +220 -0
- package/dist/app/services/research-session-wizard-controller.js.map +1 -0
- package/dist/app/services/run-cycle-service.d.ts +2 -0
- package/dist/app/services/run-cycle-service.js +8 -6
- package/dist/app/services/run-cycle-service.js.map +1 -1
- package/dist/app/services/run-loop-service.js +11 -3
- package/dist/app/services/run-loop-service.js.map +1 -1
- package/dist/cli/commands/inspect.js +2 -0
- package/dist/cli/commands/inspect.js.map +1 -1
- package/dist/cli/commands/launch.d.ts +16 -0
- package/dist/cli/commands/launch.js +68 -0
- package/dist/cli/commands/launch.js.map +1 -0
- package/dist/cli/commands/proposer-display.d.ts +2 -0
- package/dist/cli/commands/proposer-display.js +18 -0
- package/dist/cli/commands/proposer-display.js.map +1 -0
- package/dist/cli/commands/resume.d.ts +14 -0
- package/dist/cli/commands/resume.js +134 -0
- package/dist/cli/commands/resume.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -2
- package/dist/cli/commands/run.js +15 -4
- package/dist/cli/commands/run.js.map +1 -1
- package/dist/cli/commands/status.js +4 -0
- package/dist/cli/commands/status.js.map +1 -1
- package/dist/cli/main.js +2 -29
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/program.d.ts +15 -0
- package/dist/cli/program.js +54 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/tui/research-session-shell.d.ts +22 -0
- package/dist/cli/tui/research-session-shell.js +719 -0
- package/dist/cli/tui/research-session-shell.js.map +1 -0
- package/dist/core/engine/cycle-runner.d.ts +4 -0
- package/dist/core/engine/cycle-runner.js +15 -9
- package/dist/core/engine/cycle-runner.js.map +1 -1
- package/dist/core/manifest/admission.d.ts +1 -0
- package/dist/core/manifest/admission.js +50 -0
- package/dist/core/manifest/admission.js.map +1 -1
- package/dist/core/manifest/defaults.d.ts +21 -0
- package/dist/core/manifest/defaults.js +21 -0
- package/dist/core/manifest/defaults.js.map +1 -1
- package/dist/core/manifest/schema.d.ts +170 -0
- package/dist/core/manifest/schema.js +21 -1
- package/dist/core/manifest/schema.js.map +1 -1
- package/dist/core/model/codex-cli-cycle-session.d.ts +4 -0
- package/dist/core/model/codex-cli-cycle-session.js +2 -0
- package/dist/core/model/codex-cli-cycle-session.js.map +1 -0
- package/dist/core/model/codex-cli-session-lifecycle.d.ts +131 -0
- package/dist/core/model/codex-cli-session-lifecycle.js +237 -0
- package/dist/core/model/codex-cli-session-lifecycle.js.map +1 -0
- package/dist/core/model/codex-cli-session-outcome.d.ts +121 -0
- package/dist/core/model/codex-cli-session-outcome.js +70 -0
- package/dist/core/model/codex-cli-session-outcome.js.map +1 -0
- package/dist/core/model/research-project-defaults.d.ts +48 -0
- package/dist/core/model/research-project-defaults.js +46 -0
- package/dist/core/model/research-project-defaults.js.map +1 -0
- package/dist/core/model/research-session.d.ts +1143 -0
- package/dist/core/model/research-session.js +689 -0
- package/dist/core/model/research-session.js.map +1 -0
- package/dist/core/model/run-record.d.ts +56 -6
- package/dist/core/model/run-record.js +28 -0
- package/dist/core/model/run-record.js.map +1 -1
- package/dist/core/ports/research-project-defaults-store.d.ts +5 -0
- package/dist/core/ports/research-project-defaults-store.js +2 -0
- package/dist/core/ports/research-project-defaults-store.js.map +1 -0
- package/dist/core/ports/research-session-repository.d.ts +25 -0
- package/dist/core/ports/research-session-repository.js +2 -0
- package/dist/core/ports/research-session-repository.js.map +1 -0
- package/dist/core/state/frontier-materializer.d.ts +2 -0
- package/dist/core/state/frontier-materializer.js +11 -2
- package/dist/core/state/frontier-materializer.js.map +1 -1
- package/dist/core/state/research-session-recovery-classifier.d.ts +24 -0
- package/dist/core/state/research-session-recovery-classifier.js +236 -0
- package/dist/core/state/research-session-recovery-classifier.js.map +1 -0
- package/dist/core/state/research-session-resume-candidate.d.ts +8 -0
- package/dist/core/state/research-session-resume-candidate.js +62 -0
- package/dist/core/state/research-session-resume-candidate.js.map +1 -0
- package/dist/core/state/research-session-state-machine.d.ts +62 -0
- package/dist/core/state/research-session-state-machine.js +443 -0
- package/dist/core/state/research-session-state-machine.js.map +1 -0
- package/dist/mcp/server.d.ts +4 -0
- package/dist/mcp/server.js +192 -1
- package/dist/mcp/server.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,14 +1,23 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
|
-
import { mkdir, readFile, rm, writeFile } from "node:fs/promises";
|
|
3
|
-
import { dirname, resolve } from "node:path";
|
|
2
|
+
import { mkdir, readFile, rename, rm, stat, writeFile } from "node:fs/promises";
|
|
3
|
+
import { dirname, join, resolve } from "node:path";
|
|
4
|
+
import { setTimeout as delay } from "node:timers/promises";
|
|
4
5
|
import { z } from "zod";
|
|
5
6
|
import { isMissingFileError } from "../../shared/fs-errors.js";
|
|
6
7
|
const DEFAULT_LOCK_TTL_MS = 5 * 60 * 1000;
|
|
7
8
|
const DEFAULT_LOCK_GRACE_MS = 30 * 1000;
|
|
9
|
+
const LOCK_GUARD_RETRY_MS = 10;
|
|
10
|
+
const LOCK_GUARD_TIMEOUT_MS = 15_000;
|
|
11
|
+
const LOCK_GUARD_STALE_MS = 10_000;
|
|
8
12
|
const lockOwnerSchema = z.object({
|
|
9
13
|
runId: z.string().min(1).optional(),
|
|
10
14
|
operation: z.string().min(1).optional(),
|
|
11
15
|
});
|
|
16
|
+
const lockGuardMetadataSchema = z.object({
|
|
17
|
+
pid: z.number().int().positive(),
|
|
18
|
+
token: z.string().min(1),
|
|
19
|
+
createdAt: z.string().datetime(),
|
|
20
|
+
});
|
|
12
21
|
const lockfileMetadataSchema = z.object({
|
|
13
22
|
pid: z.number().int().positive(),
|
|
14
23
|
token: z.string().min(1),
|
|
@@ -32,7 +41,6 @@ export async function acquireLock(path, options = {}) {
|
|
|
32
41
|
const resolvedPath = resolve(path);
|
|
33
42
|
const ttlMs = options.ttlMs ?? DEFAULT_LOCK_TTL_MS;
|
|
34
43
|
const graceMs = options.graceMs ?? DEFAULT_LOCK_GRACE_MS;
|
|
35
|
-
await mkdir(dirname(resolvedPath), { recursive: true });
|
|
36
44
|
const now = new Date().toISOString();
|
|
37
45
|
const metadata = {
|
|
38
46
|
pid: process.pid,
|
|
@@ -43,68 +51,61 @@ export async function acquireLock(path, options = {}) {
|
|
|
43
51
|
graceMs,
|
|
44
52
|
...(options.owner ? { owner: options.owner } : {}),
|
|
45
53
|
};
|
|
46
|
-
|
|
47
|
-
await
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
return { path: resolvedPath, metadata };
|
|
52
|
-
}
|
|
53
|
-
catch (error) {
|
|
54
|
-
if (!isAlreadyExistsError(error)) {
|
|
55
|
-
throw error;
|
|
54
|
+
return withLockfileMutationGuard(resolvedPath, async () => {
|
|
55
|
+
const existingRuntime = await inspectLock(resolvedPath);
|
|
56
|
+
if (!existingRuntime) {
|
|
57
|
+
await writeLockMetadata(resolvedPath, metadata, "wx");
|
|
58
|
+
return { path: resolvedPath, metadata };
|
|
56
59
|
}
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
await rm(resolvedPath, { force: true });
|
|
74
|
-
await writeFile(resolvedPath, `${JSON.stringify(metadata, null, 2)}\n`, {
|
|
75
|
-
encoding: "utf8",
|
|
76
|
-
flag: "wx",
|
|
60
|
+
if (!existingRuntime.stale) {
|
|
61
|
+
const details = [
|
|
62
|
+
`Active lock already exists at ${resolvedPath}`,
|
|
63
|
+
`pid=${existingRuntime.metadata.pid}`,
|
|
64
|
+
existingRuntime.metadata.owner?.runId ? `runId=${existingRuntime.metadata.owner.runId}` : null,
|
|
65
|
+
`heartbeatAgeMs=${existingRuntime.heartbeatAgeMs}`,
|
|
66
|
+
].filter(Boolean).join(" ");
|
|
67
|
+
throw new LockAcquisitionError(details, {
|
|
68
|
+
metadata: existingRuntime.metadata,
|
|
69
|
+
heartbeatAgeMs: existingRuntime.heartbeatAgeMs,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
await rm(resolvedPath, { force: true });
|
|
73
|
+
await writeLockMetadata(resolvedPath, metadata, "wx");
|
|
74
|
+
return { path: resolvedPath, metadata };
|
|
77
75
|
});
|
|
78
|
-
return { path: resolvedPath, metadata };
|
|
79
76
|
}
|
|
80
77
|
export async function renewLock(path, token) {
|
|
81
78
|
const resolvedPath = resolve(path);
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
79
|
+
return withLockfileMutationGuard(resolvedPath, async () => {
|
|
80
|
+
const metadata = await readLockMetadata(resolvedPath);
|
|
81
|
+
if (!metadata) {
|
|
82
|
+
throw new LockAcquisitionError(`Refusing to renew lock at ${resolvedPath}: lock is missing`);
|
|
83
|
+
}
|
|
84
|
+
if (metadata.token !== token) {
|
|
85
|
+
throw new LockAcquisitionError(`Refusing to renew lock at ${resolvedPath}: token mismatch`, {
|
|
86
|
+
metadata,
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
const updated = {
|
|
90
|
+
...metadata,
|
|
91
|
+
updatedAt: new Date().toISOString(),
|
|
92
|
+
};
|
|
93
|
+
await writeLockMetadata(resolvedPath, updated);
|
|
94
|
+
return updated;
|
|
95
|
+
});
|
|
97
96
|
}
|
|
98
97
|
export async function releaseLock(path, token) {
|
|
99
98
|
const resolvedPath = resolve(path);
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
99
|
+
await withLockfileMutationGuard(resolvedPath, async () => {
|
|
100
|
+
const metadata = await readLockMetadata(resolvedPath);
|
|
101
|
+
if (!metadata) {
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
if (token && metadata.token !== token) {
|
|
105
|
+
throw new LockAcquisitionError(`Refusing to release lock at ${resolvedPath}: token mismatch`);
|
|
106
|
+
}
|
|
107
|
+
await rm(resolvedPath, { force: true });
|
|
108
|
+
});
|
|
108
109
|
}
|
|
109
110
|
export async function isStaleLock(path) {
|
|
110
111
|
const runtime = await inspectLock(path);
|
|
@@ -140,6 +141,90 @@ export async function readLockMetadata(path) {
|
|
|
140
141
|
throw error;
|
|
141
142
|
}
|
|
142
143
|
}
|
|
144
|
+
async function writeLockMetadata(path, metadata, flag) {
|
|
145
|
+
await mkdir(dirname(path), { recursive: true });
|
|
146
|
+
await writeFile(path, `${JSON.stringify(metadata, null, 2)}\n`, {
|
|
147
|
+
encoding: "utf8",
|
|
148
|
+
...(flag ? { flag } : {}),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
async function withLockfileMutationGuard(lockPath, callback) {
|
|
152
|
+
const resolvedPath = resolve(lockPath);
|
|
153
|
+
const guardPath = `${resolvedPath}.guard`;
|
|
154
|
+
const guardMetadata = {
|
|
155
|
+
pid: process.pid,
|
|
156
|
+
token: randomUUID(),
|
|
157
|
+
createdAt: new Date().toISOString(),
|
|
158
|
+
};
|
|
159
|
+
const deadline = Date.now() + LOCK_GUARD_TIMEOUT_MS;
|
|
160
|
+
await mkdir(dirname(resolvedPath), { recursive: true });
|
|
161
|
+
while (true) {
|
|
162
|
+
try {
|
|
163
|
+
await mkdir(guardPath);
|
|
164
|
+
try {
|
|
165
|
+
await writeFile(getGuardMetadataPath(guardPath), `${JSON.stringify(guardMetadata, null, 2)}\n`, "utf8");
|
|
166
|
+
}
|
|
167
|
+
catch (error) {
|
|
168
|
+
await rm(guardPath, { recursive: true, force: true });
|
|
169
|
+
throw error;
|
|
170
|
+
}
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
if (!isAlreadyExistsError(error)) {
|
|
175
|
+
throw error;
|
|
176
|
+
}
|
|
177
|
+
await removeStaleGuard(guardPath);
|
|
178
|
+
if (Date.now() > deadline) {
|
|
179
|
+
throw new LockAcquisitionError(`Timed out waiting for lock mutation guard at ${guardPath}`);
|
|
180
|
+
}
|
|
181
|
+
await delay(LOCK_GUARD_RETRY_MS);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
try {
|
|
185
|
+
return await callback();
|
|
186
|
+
}
|
|
187
|
+
finally {
|
|
188
|
+
await removeOwnedGuard(guardPath, guardMetadata.token);
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
async function removeStaleGuard(guardPath) {
|
|
192
|
+
try {
|
|
193
|
+
const metadata = await readGuardMetadata(guardPath);
|
|
194
|
+
if (metadata && isProcessAlive(metadata.pid)) {
|
|
195
|
+
return;
|
|
196
|
+
}
|
|
197
|
+
const guardStats = await stat(guardPath);
|
|
198
|
+
if (Date.now() - guardStats.mtimeMs > LOCK_GUARD_STALE_MS) {
|
|
199
|
+
const staleClaimPath = `${guardPath}.stale-${process.pid}-${randomUUID()}`;
|
|
200
|
+
await rename(guardPath, staleClaimPath);
|
|
201
|
+
await rm(staleClaimPath, { recursive: true, force: true });
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
catch (error) {
|
|
205
|
+
if (!isMissingFileError(error)) {
|
|
206
|
+
throw error;
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
async function removeOwnedGuard(guardPath, token) {
|
|
211
|
+
const metadata = await readGuardMetadata(guardPath);
|
|
212
|
+
if (metadata?.token === token) {
|
|
213
|
+
await rm(guardPath, { recursive: true, force: true });
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function readGuardMetadata(guardPath) {
|
|
217
|
+
try {
|
|
218
|
+
const raw = await readFile(getGuardMetadataPath(guardPath), "utf8");
|
|
219
|
+
return lockGuardMetadataSchema.parse(JSON.parse(raw));
|
|
220
|
+
}
|
|
221
|
+
catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
function getGuardMetadataPath(guardPath) {
|
|
226
|
+
return join(guardPath, "owner.json");
|
|
227
|
+
}
|
|
143
228
|
function isAlreadyExistsError(error) {
|
|
144
229
|
return error instanceof Error && "code" in error && error.code === "EEXIST";
|
|
145
230
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../../src/adapters/fs/lockfile.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"lockfile.js","sourceRoot":"","sources":["../../../src/adapters/fs/lockfile.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,7 +2,7 @@ import { readFile } from "node:fs/promises";
|
|
|
2
2
|
import { resolve } from "node:path";
|
|
3
3
|
import { parse } from "yaml";
|
|
4
4
|
import { ZodError } from "zod";
|
|
5
|
-
import { compileManifestAdmission } from "../../core/manifest/admission.js";
|
|
5
|
+
import { compileManifestAdmission, compileRawManifestAdmission } from "../../core/manifest/admission.js";
|
|
6
6
|
import { DEFAULT_MANIFEST_FILENAME, RalphManifestSchema } from "../../core/manifest/schema.js";
|
|
7
7
|
export class ManifestLoadError extends Error {
|
|
8
8
|
causeValue;
|
|
@@ -29,6 +29,13 @@ export async function loadManifestFromFile(path = DEFAULT_MANIFEST_FILENAME, opt
|
|
|
29
29
|
throw new ManifestLoadError(`Failed to parse YAML from ${resolvedPath}`, error);
|
|
30
30
|
}
|
|
31
31
|
try {
|
|
32
|
+
const rawAdmissionIssues = compileRawManifestAdmission(parsedYaml);
|
|
33
|
+
if (rawAdmissionIssues.length > 0) {
|
|
34
|
+
throw new ManifestLoadError(`Manifest admission failed for ${resolvedPath}`, {
|
|
35
|
+
executable: false,
|
|
36
|
+
issues: rawAdmissionIssues,
|
|
37
|
+
});
|
|
38
|
+
}
|
|
32
39
|
const manifest = RalphManifestSchema.parse(parsedYaml);
|
|
33
40
|
const admission = await compileManifestAdmission(manifest, options);
|
|
34
41
|
if (!admission.executable) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manifest-loader.js","sourceRoot":"","sources":["../../../src/adapters/fs/manifest-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,EAAE,wBAAwB,EAAE,MAAM,kCAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"manifest-loader.js","sourceRoot":"","sources":["../../../src/adapters/fs/manifest-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAE/B,OAAO,EAAE,wBAAwB,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AACzG,OAAO,EAAE,yBAAyB,EAAE,mBAAmB,EAAsB,MAAM,+BAA+B,CAAC;AAQnH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IAC1B,UAAU,CAAW;IAErC,YAAmB,OAAe,EAAE,UAAoB;QACtD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;QAChC,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;CACF;AAMD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAI,GAAG,yBAAyB,EAChC,UAA+B,EAAE;IAEjC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAEnC,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,MAAM,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,iBAAiB,CAAC,8BAA8B,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IACnF,CAAC;IAED,IAAI,UAAmB,CAAC;IACxB,IAAI,CAAC;QACH,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IAC9B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,iBAAiB,CAAC,6BAA6B,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IAClF,CAAC;IAED,IAAI,CAAC;QACH,MAAM,kBAAkB,GAAG,2BAA2B,CAAC,UAAU,CAAC,CAAC;QACnE,IAAI,kBAAkB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,MAAM,IAAI,iBAAiB,CAAC,iCAAiC,YAAY,EAAE,EAAE;gBAC3E,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,kBAAkB;aAC3B,CAAC,CAAC;QACL,CAAC;QAED,MAAM,QAAQ,GAAG,mBAAmB,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,wBAAwB,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEpE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,CAAC;YAC1B,MAAM,IAAI,iBAAiB,CAAC,iCAAiC,YAAY,EAAE,EAAE;gBAC3E,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,SAAS,CAAC,MAAM;aACzB,CAAC,CAAC;QACL,CAAC;QAED,OAAO;YACL,IAAI,EAAE,YAAY;YAClB,QAAQ;YACR,mBAAmB,EAAE,SAAS,CAAC,mBAAmB;SACnD,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,IAAI,KAAK,YAAY,iBAAiB,EAAE,CAAC;YACvC,MAAM,KAAK,CAAC;QACd,CAAC;QAED,IAAI,KAAK,YAAY,QAAQ,EAAE,CAAC;YAC9B,MAAM,IAAI,iBAAiB,CAAC,kCAAkC,YAAY,EAAE,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;QACjG,CAAC;QAED,MAAM,IAAI,iBAAiB,CAAC,kCAAkC,YAAY,EAAE,EAAE,KAAK,CAAC,CAAC;IACvF,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { CodexCliProposerConfig } from "../../core/manifest/schema.js";
|
|
2
|
+
import { CodexCliSessionManager } from "./codex-cli-session-manager.js";
|
|
3
|
+
import type { ProposalExecutionInput, ProposalExecutionResult, ProposerRunner } from "./proposer-factory.js";
|
|
4
|
+
export interface CodexCliSessionProposerDependencies {
|
|
5
|
+
createSessionManager?: () => CodexCliSessionManager;
|
|
6
|
+
createSessionId?: () => string;
|
|
7
|
+
now?: () => Date;
|
|
8
|
+
}
|
|
9
|
+
export declare class CodexCliSessionProposer implements ProposerRunner {
|
|
10
|
+
private readonly config;
|
|
11
|
+
private readonly sessionManager;
|
|
12
|
+
private readonly createSessionId;
|
|
13
|
+
private readonly now;
|
|
14
|
+
constructor(config: CodexCliProposerConfig, dependencies?: CodexCliSessionProposerDependencies);
|
|
15
|
+
run(input: ProposalExecutionInput): Promise<ProposalExecutionResult>;
|
|
16
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import { randomUUID } from "node:crypto";
|
|
2
|
+
import { CodexCliSessionManager } from "./codex-cli-session-manager.js";
|
|
3
|
+
export class CodexCliSessionProposer {
|
|
4
|
+
config;
|
|
5
|
+
sessionManager;
|
|
6
|
+
createSessionId;
|
|
7
|
+
now;
|
|
8
|
+
constructor(config, dependencies = {}) {
|
|
9
|
+
this.config = config;
|
|
10
|
+
this.sessionManager = dependencies.createSessionManager?.() ?? new CodexCliSessionManager();
|
|
11
|
+
this.createSessionId = dependencies.createSessionId ?? randomUUID;
|
|
12
|
+
this.now = dependencies.now ?? (() => new Date());
|
|
13
|
+
}
|
|
14
|
+
async run(input) {
|
|
15
|
+
const sessionId = input.codexSession?.researchSessionId ?? this.createSessionId();
|
|
16
|
+
const existingSessionId = input.codexSession?.existingCodexSessionId;
|
|
17
|
+
const startedAt = this.now().getTime();
|
|
18
|
+
let session;
|
|
19
|
+
try {
|
|
20
|
+
session = this.sessionManager.startSession({
|
|
21
|
+
cwd: input.workspacePath,
|
|
22
|
+
sessionId,
|
|
23
|
+
...(existingSessionId ? { existingSessionId } : {}),
|
|
24
|
+
approvalPolicy: this.config.approvalPolicy,
|
|
25
|
+
sandboxMode: this.config.sandboxMode,
|
|
26
|
+
...(this.config.model ? { model: this.config.model } : {}),
|
|
27
|
+
...(input.env ? { env: input.env } : {}),
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
catch (error) {
|
|
31
|
+
throw new Error(`codex_cli proposer failed to start: ${formatErrorMessage(error)}`);
|
|
32
|
+
}
|
|
33
|
+
const timeoutMs = this.config.ttySession.turnTimeoutSec * 1_000;
|
|
34
|
+
let exit;
|
|
35
|
+
try {
|
|
36
|
+
exit = await waitForExitWithTimeout(session, timeoutMs);
|
|
37
|
+
}
|
|
38
|
+
catch (error) {
|
|
39
|
+
throw new Error(`codex_cli proposer session failed: ${formatErrorMessage(error)}`);
|
|
40
|
+
}
|
|
41
|
+
if (exit.signal) {
|
|
42
|
+
throw new Error(`codex_cli proposer exited from signal ${exit.signal}`);
|
|
43
|
+
}
|
|
44
|
+
if (exit.code !== 0) {
|
|
45
|
+
throw new Error(`codex_cli proposer exited with code ${exit.code}`);
|
|
46
|
+
}
|
|
47
|
+
const durationMs = this.now().getTime() - startedAt;
|
|
48
|
+
const summarySessionId = getAuthoritativeCodexSessionId(session, sessionId);
|
|
49
|
+
const summary = `codex_cli session ${summarySessionId} completed with exit code 0 in ${durationMs}ms`;
|
|
50
|
+
return {
|
|
51
|
+
proposerType: "codex_cli",
|
|
52
|
+
stdout: "",
|
|
53
|
+
stderr: "",
|
|
54
|
+
summary,
|
|
55
|
+
adapterMetadata: {
|
|
56
|
+
adapter: "codex_cli",
|
|
57
|
+
invocation: {
|
|
58
|
+
sessionId,
|
|
59
|
+
command: session.command,
|
|
60
|
+
args: session.args,
|
|
61
|
+
cwd: input.workspacePath,
|
|
62
|
+
sessionMetadata: session.metadata,
|
|
63
|
+
},
|
|
64
|
+
outcome: {
|
|
65
|
+
kind: "terminal_exit",
|
|
66
|
+
code: exit.code,
|
|
67
|
+
signal: exit.signal,
|
|
68
|
+
durationMs,
|
|
69
|
+
summary,
|
|
70
|
+
},
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
function getAuthoritativeCodexSessionId(session, fallbackSessionId) {
|
|
76
|
+
const metadata = session.metadata;
|
|
77
|
+
if (typeof metadata?.codexSessionId === "string" && metadata.codexSessionId.length > 0) {
|
|
78
|
+
return metadata.codexSessionId;
|
|
79
|
+
}
|
|
80
|
+
if (typeof metadata?.researchSessionId === "string" && metadata.researchSessionId.length > 0) {
|
|
81
|
+
return metadata.researchSessionId;
|
|
82
|
+
}
|
|
83
|
+
return fallbackSessionId;
|
|
84
|
+
}
|
|
85
|
+
async function waitForExitWithTimeout(session, timeoutMs) {
|
|
86
|
+
let timeoutId;
|
|
87
|
+
const timeoutPromise = new Promise((_, reject) => {
|
|
88
|
+
timeoutId = setTimeout(() => {
|
|
89
|
+
void session.stop("SIGTERM").catch(() => undefined);
|
|
90
|
+
reject(new Error(`timed out after ${timeoutMs}ms`));
|
|
91
|
+
}, timeoutMs);
|
|
92
|
+
timeoutId.unref?.();
|
|
93
|
+
});
|
|
94
|
+
try {
|
|
95
|
+
return await Promise.race([session.waitForExit(), timeoutPromise]);
|
|
96
|
+
}
|
|
97
|
+
finally {
|
|
98
|
+
if (timeoutId) {
|
|
99
|
+
clearTimeout(timeoutId);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
function formatErrorMessage(error) {
|
|
104
|
+
return error instanceof Error ? error.message : String(error);
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=codex-cli-proposer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-cli-proposer.js","sourceRoot":"","sources":["../../../src/adapters/proposer/codex-cli-proposer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import type { CodexCliSessionExit } from "./codex-cli-session-manager.js";
|
|
2
|
+
export type CodexCliTranscriptStream = "stdin" | "stdout" | "stderr";
|
|
3
|
+
export type CodexCliTranscriptInputType = "research_prompt" | "control";
|
|
4
|
+
export interface CodexCliInteractiveSession {
|
|
5
|
+
pid: number | undefined;
|
|
6
|
+
stdin: NodeJS.WritableStream;
|
|
7
|
+
stdout: NodeJS.ReadableStream;
|
|
8
|
+
stderr: NodeJS.ReadableStream;
|
|
9
|
+
waitForExit(): Promise<CodexCliSessionExit>;
|
|
10
|
+
stop(signal?: NodeJS.Signals): Promise<CodexCliSessionExit>;
|
|
11
|
+
}
|
|
12
|
+
export interface CodexCliSessionTranscriptEntry {
|
|
13
|
+
order: number;
|
|
14
|
+
capturedAt: string;
|
|
15
|
+
stream: CodexCliTranscriptStream;
|
|
16
|
+
text: string;
|
|
17
|
+
inputType?: CodexCliTranscriptInputType;
|
|
18
|
+
label?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface CodexCliSessionTranscript {
|
|
21
|
+
sessionId: string;
|
|
22
|
+
pid: number | undefined;
|
|
23
|
+
startedAt: string;
|
|
24
|
+
updatedAt: string;
|
|
25
|
+
endedAt?: string;
|
|
26
|
+
exit?: CodexCliSessionExit;
|
|
27
|
+
entries: CodexCliSessionTranscriptEntry[];
|
|
28
|
+
}
|
|
29
|
+
export interface CodexCliControlInput {
|
|
30
|
+
text: string;
|
|
31
|
+
label?: string;
|
|
32
|
+
appendNewline?: boolean;
|
|
33
|
+
}
|
|
34
|
+
export interface CodexCliDriveSessionOptions {
|
|
35
|
+
researchPrompt: string;
|
|
36
|
+
controlInputs?: Array<string | CodexCliControlInput>;
|
|
37
|
+
}
|
|
38
|
+
export interface CodexCliSessionDriverDependencies {
|
|
39
|
+
now?: () => Date;
|
|
40
|
+
}
|
|
41
|
+
export declare class CodexCliSessionDriver {
|
|
42
|
+
private readonly sessionId;
|
|
43
|
+
private readonly session;
|
|
44
|
+
private readonly now;
|
|
45
|
+
private readonly transcript;
|
|
46
|
+
private readonly detachOutputListeners;
|
|
47
|
+
private nextOrder;
|
|
48
|
+
private pendingInput;
|
|
49
|
+
private finalizedExit;
|
|
50
|
+
constructor(sessionId: string, session: CodexCliInteractiveSession, dependencies?: CodexCliSessionDriverDependencies);
|
|
51
|
+
run(options: CodexCliDriveSessionOptions): Promise<{
|
|
52
|
+
exit: CodexCliSessionExit;
|
|
53
|
+
transcript: CodexCliSessionTranscript;
|
|
54
|
+
}>;
|
|
55
|
+
sendResearchPrompt(prompt: string): Promise<void>;
|
|
56
|
+
sendControlInput(input: string | CodexCliControlInput): Promise<void>;
|
|
57
|
+
waitForExit(): Promise<CodexCliSessionExit>;
|
|
58
|
+
stop(signal?: NodeJS.Signals): Promise<CodexCliSessionExit>;
|
|
59
|
+
getTranscript(): CodexCliSessionTranscript;
|
|
60
|
+
private attachOutputListeners;
|
|
61
|
+
private recordEntry;
|
|
62
|
+
private enqueueInput;
|
|
63
|
+
private finalizeExit;
|
|
64
|
+
}
|