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.
Files changed (138) hide show
  1. package/README.md +132 -101
  2. package/dist/adapters/fs/json-file-research-project-defaults-store.d.ts +8 -0
  3. package/dist/adapters/fs/json-file-research-project-defaults-store.js +30 -0
  4. package/dist/adapters/fs/json-file-research-project-defaults-store.js.map +1 -0
  5. package/dist/adapters/fs/json-file-research-session-repository.d.ts +24 -0
  6. package/dist/adapters/fs/json-file-research-session-repository.js +199 -0
  7. package/dist/adapters/fs/json-file-research-session-repository.js.map +1 -0
  8. package/dist/adapters/fs/lockfile.js +142 -57
  9. package/dist/adapters/fs/lockfile.js.map +1 -1
  10. package/dist/adapters/fs/manifest-loader.js +8 -1
  11. package/dist/adapters/fs/manifest-loader.js.map +1 -1
  12. package/dist/adapters/proposer/codex-cli-proposer.d.ts +16 -0
  13. package/dist/adapters/proposer/codex-cli-proposer.js +106 -0
  14. package/dist/adapters/proposer/codex-cli-proposer.js.map +1 -0
  15. package/dist/adapters/proposer/codex-cli-session-driver.d.ts +64 -0
  16. package/dist/adapters/proposer/codex-cli-session-driver.js +182 -0
  17. package/dist/adapters/proposer/codex-cli-session-driver.js.map +1 -0
  18. package/dist/adapters/proposer/codex-cli-session-manager.d.ts +79 -0
  19. package/dist/adapters/proposer/codex-cli-session-manager.js +248 -0
  20. package/dist/adapters/proposer/codex-cli-session-manager.js.map +1 -0
  21. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.d.ts +3 -0
  22. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js +94 -0
  23. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js.map +1 -0
  24. package/dist/adapters/proposer/proposer-factory.d.ts +22 -0
  25. package/dist/adapters/proposer/proposer-factory.js +19 -0
  26. package/dist/adapters/proposer/proposer-factory.js.map +1 -0
  27. package/dist/app/services/codex-cli-session-lifecycle-service.d.ts +116 -0
  28. package/dist/app/services/codex-cli-session-lifecycle-service.js +186 -0
  29. package/dist/app/services/codex-cli-session-lifecycle-service.js.map +1 -0
  30. package/dist/app/services/manual-decision-service.js +20 -9
  31. package/dist/app/services/manual-decision-service.js.map +1 -1
  32. package/dist/app/services/project-state-service.js +5 -3
  33. package/dist/app/services/project-state-service.js.map +1 -1
  34. package/dist/app/services/research-project-defaults-service.d.ts +18 -0
  35. package/dist/app/services/research-project-defaults-service.js +175 -0
  36. package/dist/app/services/research-project-defaults-service.js.map +1 -0
  37. package/dist/app/services/research-session-draft-service.d.ts +121 -0
  38. package/dist/app/services/research-session-draft-service.js +846 -0
  39. package/dist/app/services/research-session-draft-service.js.map +1 -0
  40. package/dist/app/services/research-session-entry-flow-summary-mapper.d.ts +12 -0
  41. package/dist/app/services/research-session-entry-flow-summary-mapper.js +33 -0
  42. package/dist/app/services/research-session-entry-flow-summary-mapper.js.map +1 -0
  43. package/dist/app/services/research-session-interactive-service.d.ts +35 -0
  44. package/dist/app/services/research-session-interactive-service.js +295 -0
  45. package/dist/app/services/research-session-interactive-service.js.map +1 -0
  46. package/dist/app/services/research-session-launch-service.d.ts +46 -0
  47. package/dist/app/services/research-session-launch-service.js +389 -0
  48. package/dist/app/services/research-session-launch-service.js.map +1 -0
  49. package/dist/app/services/research-session-orchestrator-service.d.ts +140 -0
  50. package/dist/app/services/research-session-orchestrator-service.js +614 -0
  51. package/dist/app/services/research-session-orchestrator-service.js.map +1 -0
  52. package/dist/app/services/research-session-recovery-service.d.ts +30 -0
  53. package/dist/app/services/research-session-recovery-service.js +110 -0
  54. package/dist/app/services/research-session-recovery-service.js.map +1 -0
  55. package/dist/app/services/research-session-wizard-controller.d.ts +51 -0
  56. package/dist/app/services/research-session-wizard-controller.js +220 -0
  57. package/dist/app/services/research-session-wizard-controller.js.map +1 -0
  58. package/dist/app/services/run-cycle-service.d.ts +2 -0
  59. package/dist/app/services/run-cycle-service.js +8 -6
  60. package/dist/app/services/run-cycle-service.js.map +1 -1
  61. package/dist/app/services/run-loop-service.js +11 -3
  62. package/dist/app/services/run-loop-service.js.map +1 -1
  63. package/dist/cli/commands/inspect.js +2 -0
  64. package/dist/cli/commands/inspect.js.map +1 -1
  65. package/dist/cli/commands/launch.d.ts +16 -0
  66. package/dist/cli/commands/launch.js +68 -0
  67. package/dist/cli/commands/launch.js.map +1 -0
  68. package/dist/cli/commands/proposer-display.d.ts +2 -0
  69. package/dist/cli/commands/proposer-display.js +18 -0
  70. package/dist/cli/commands/proposer-display.js.map +1 -0
  71. package/dist/cli/commands/resume.d.ts +14 -0
  72. package/dist/cli/commands/resume.js +134 -0
  73. package/dist/cli/commands/resume.js.map +1 -0
  74. package/dist/cli/commands/run.d.ts +2 -2
  75. package/dist/cli/commands/run.js +15 -4
  76. package/dist/cli/commands/run.js.map +1 -1
  77. package/dist/cli/commands/status.js +4 -0
  78. package/dist/cli/commands/status.js.map +1 -1
  79. package/dist/cli/main.js +2 -29
  80. package/dist/cli/main.js.map +1 -1
  81. package/dist/cli/program.d.ts +15 -0
  82. package/dist/cli/program.js +54 -0
  83. package/dist/cli/program.js.map +1 -0
  84. package/dist/cli/tui/research-session-shell.d.ts +22 -0
  85. package/dist/cli/tui/research-session-shell.js +719 -0
  86. package/dist/cli/tui/research-session-shell.js.map +1 -0
  87. package/dist/core/engine/cycle-runner.d.ts +4 -0
  88. package/dist/core/engine/cycle-runner.js +15 -9
  89. package/dist/core/engine/cycle-runner.js.map +1 -1
  90. package/dist/core/manifest/admission.d.ts +1 -0
  91. package/dist/core/manifest/admission.js +50 -0
  92. package/dist/core/manifest/admission.js.map +1 -1
  93. package/dist/core/manifest/defaults.d.ts +21 -0
  94. package/dist/core/manifest/defaults.js +21 -0
  95. package/dist/core/manifest/defaults.js.map +1 -1
  96. package/dist/core/manifest/schema.d.ts +170 -0
  97. package/dist/core/manifest/schema.js +21 -1
  98. package/dist/core/manifest/schema.js.map +1 -1
  99. package/dist/core/model/codex-cli-cycle-session.d.ts +4 -0
  100. package/dist/core/model/codex-cli-cycle-session.js +2 -0
  101. package/dist/core/model/codex-cli-cycle-session.js.map +1 -0
  102. package/dist/core/model/codex-cli-session-lifecycle.d.ts +131 -0
  103. package/dist/core/model/codex-cli-session-lifecycle.js +237 -0
  104. package/dist/core/model/codex-cli-session-lifecycle.js.map +1 -0
  105. package/dist/core/model/codex-cli-session-outcome.d.ts +121 -0
  106. package/dist/core/model/codex-cli-session-outcome.js +70 -0
  107. package/dist/core/model/codex-cli-session-outcome.js.map +1 -0
  108. package/dist/core/model/research-project-defaults.d.ts +48 -0
  109. package/dist/core/model/research-project-defaults.js +46 -0
  110. package/dist/core/model/research-project-defaults.js.map +1 -0
  111. package/dist/core/model/research-session.d.ts +1143 -0
  112. package/dist/core/model/research-session.js +689 -0
  113. package/dist/core/model/research-session.js.map +1 -0
  114. package/dist/core/model/run-record.d.ts +56 -6
  115. package/dist/core/model/run-record.js +28 -0
  116. package/dist/core/model/run-record.js.map +1 -1
  117. package/dist/core/ports/research-project-defaults-store.d.ts +5 -0
  118. package/dist/core/ports/research-project-defaults-store.js +2 -0
  119. package/dist/core/ports/research-project-defaults-store.js.map +1 -0
  120. package/dist/core/ports/research-session-repository.d.ts +25 -0
  121. package/dist/core/ports/research-session-repository.js +2 -0
  122. package/dist/core/ports/research-session-repository.js.map +1 -0
  123. package/dist/core/state/frontier-materializer.d.ts +2 -0
  124. package/dist/core/state/frontier-materializer.js +11 -2
  125. package/dist/core/state/frontier-materializer.js.map +1 -1
  126. package/dist/core/state/research-session-recovery-classifier.d.ts +24 -0
  127. package/dist/core/state/research-session-recovery-classifier.js +236 -0
  128. package/dist/core/state/research-session-recovery-classifier.js.map +1 -0
  129. package/dist/core/state/research-session-resume-candidate.d.ts +8 -0
  130. package/dist/core/state/research-session-resume-candidate.js +62 -0
  131. package/dist/core/state/research-session-resume-candidate.js.map +1 -0
  132. package/dist/core/state/research-session-state-machine.d.ts +62 -0
  133. package/dist/core/state/research-session-state-machine.js +443 -0
  134. package/dist/core/state/research-session-state-machine.js.map +1 -0
  135. package/dist/mcp/server.d.ts +4 -0
  136. package/dist/mcp/server.js +192 -1
  137. package/dist/mcp/server.js.map +1 -1
  138. package/package.json +1 -1
@@ -0,0 +1,182 @@
1
+ export class CodexCliSessionDriver {
2
+ sessionId;
3
+ session;
4
+ now;
5
+ transcript;
6
+ detachOutputListeners;
7
+ nextOrder = 1;
8
+ pendingInput = Promise.resolve();
9
+ finalizedExit = null;
10
+ constructor(sessionId, session, dependencies = {}) {
11
+ this.sessionId = sessionId;
12
+ this.session = session;
13
+ this.now = dependencies.now ?? (() => new Date());
14
+ const startedAt = this.now().toISOString();
15
+ this.transcript = {
16
+ sessionId,
17
+ pid: session.pid,
18
+ startedAt,
19
+ updatedAt: startedAt,
20
+ entries: [],
21
+ };
22
+ this.detachOutputListeners = this.attachOutputListeners();
23
+ }
24
+ async run(options) {
25
+ await this.sendResearchPrompt(options.researchPrompt);
26
+ for (const input of options.controlInputs ?? []) {
27
+ await this.sendControlInput(input);
28
+ }
29
+ const exit = await this.waitForExit();
30
+ return {
31
+ exit,
32
+ transcript: this.getTranscript(),
33
+ };
34
+ }
35
+ async sendResearchPrompt(prompt) {
36
+ const normalized = normalizeRequiredText(prompt, "Research prompt");
37
+ await this.enqueueInput(async () => {
38
+ const payload = withTrailingNewline(normalized);
39
+ this.recordEntry({
40
+ stream: "stdin",
41
+ text: payload,
42
+ inputType: "research_prompt",
43
+ });
44
+ await writeToStream(this.session.stdin, payload);
45
+ });
46
+ }
47
+ async sendControlInput(input) {
48
+ const control = normalizeControlInput(input);
49
+ await this.enqueueInput(async () => {
50
+ const payload = control.appendNewline ? withTrailingNewline(control.text) : control.text;
51
+ this.recordEntry({
52
+ stream: "stdin",
53
+ text: payload,
54
+ inputType: "control",
55
+ ...(control.label ? { label: control.label } : {}),
56
+ });
57
+ await writeToStream(this.session.stdin, payload);
58
+ });
59
+ }
60
+ async waitForExit() {
61
+ return this.finalizeExit(this.session.waitForExit());
62
+ }
63
+ async stop(signal) {
64
+ return this.finalizeExit(this.session.stop(signal));
65
+ }
66
+ getTranscript() {
67
+ return {
68
+ ...this.transcript,
69
+ entries: this.transcript.entries.map((entry) => ({ ...entry })),
70
+ };
71
+ }
72
+ attachOutputListeners() {
73
+ const onStdout = (chunk) => {
74
+ this.recordEntry({
75
+ stream: "stdout",
76
+ text: toUtf8(chunk),
77
+ });
78
+ };
79
+ const onStderr = (chunk) => {
80
+ this.recordEntry({
81
+ stream: "stderr",
82
+ text: toUtf8(chunk),
83
+ });
84
+ };
85
+ this.session.stdout.on("data", onStdout);
86
+ this.session.stderr.on("data", onStderr);
87
+ return () => {
88
+ this.session.stdout.off("data", onStdout);
89
+ this.session.stderr.off("data", onStderr);
90
+ };
91
+ }
92
+ recordEntry(entry) {
93
+ const capturedAt = this.now().toISOString();
94
+ this.transcript.entries.push({
95
+ order: this.nextOrder,
96
+ capturedAt,
97
+ ...entry,
98
+ });
99
+ this.nextOrder += 1;
100
+ this.transcript.updatedAt = capturedAt;
101
+ }
102
+ enqueueInput(operation) {
103
+ const next = this.pendingInput.then(operation);
104
+ this.pendingInput = next.catch(() => undefined);
105
+ return next;
106
+ }
107
+ async finalizeExit(exitPromise) {
108
+ if (!this.finalizedExit) {
109
+ this.finalizedExit = exitPromise.then((exit) => {
110
+ this.detachOutputListeners();
111
+ const endedAt = this.now().toISOString();
112
+ this.transcript.endedAt = endedAt;
113
+ this.transcript.updatedAt = endedAt;
114
+ this.transcript.exit = exit;
115
+ return exit;
116
+ });
117
+ }
118
+ return this.finalizedExit;
119
+ }
120
+ }
121
+ async function writeToStream(stream, value) {
122
+ await new Promise((resolve, reject) => {
123
+ const writable = asWritable(stream);
124
+ const onError = (error) => {
125
+ cleanup();
126
+ reject(error);
127
+ };
128
+ const onDrain = () => {
129
+ cleanup();
130
+ resolve();
131
+ };
132
+ const cleanup = () => {
133
+ writable.off("error", onError);
134
+ writable.off("drain", onDrain);
135
+ };
136
+ writable.on("error", onError);
137
+ const accepted = writable.write(value, "utf8");
138
+ if (accepted) {
139
+ cleanup();
140
+ resolve();
141
+ return;
142
+ }
143
+ writable.once("drain", onDrain);
144
+ });
145
+ }
146
+ function normalizeControlInput(input) {
147
+ if (typeof input === "string") {
148
+ return {
149
+ text: normalizeRequiredText(input, "Control input"),
150
+ label: "",
151
+ appendNewline: true,
152
+ };
153
+ }
154
+ return {
155
+ text: normalizeRequiredText(input.text, "Control input"),
156
+ label: input.label?.trim() ?? "",
157
+ appendNewline: input.appendNewline ?? true,
158
+ };
159
+ }
160
+ function normalizeRequiredText(value, label) {
161
+ const normalized = value.trim();
162
+ if (!normalized) {
163
+ throw new Error(`${label} is required`);
164
+ }
165
+ return normalized;
166
+ }
167
+ function withTrailingNewline(value) {
168
+ return value.endsWith("\n") ? value : `${value}\n`;
169
+ }
170
+ function toUtf8(chunk) {
171
+ if (typeof chunk === "string") {
172
+ return chunk;
173
+ }
174
+ if (Buffer.isBuffer(chunk)) {
175
+ return chunk.toString("utf8");
176
+ }
177
+ return String(chunk);
178
+ }
179
+ function asWritable(stream) {
180
+ return stream;
181
+ }
182
+ //# sourceMappingURL=codex-cli-session-driver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-cli-session-driver.js","sourceRoot":"","sources":["../../../src/adapters/proposer/codex-cli-session-driver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import { type ChildProcess, type SpawnOptions } from "node:child_process";
2
+ export type CodexCliApprovalPolicy = "never" | "on-failure" | "on-request" | "untrusted";
3
+ export type CodexCliSandboxMode = "read-only" | "workspace-write" | "danger-full-access";
4
+ type RuntimeEvent = NodeJS.Signals | "exit";
5
+ type RuntimeListener = (...args: unknown[]) => void;
6
+ type SpawnChildProcess = (command: string, args: string[], options: SpawnOptions) => ChildProcess;
7
+ export interface CodexCliSessionLaunchOptions {
8
+ cwd: string;
9
+ sessionId: string;
10
+ existingSessionId?: string;
11
+ approvalPolicy: CodexCliApprovalPolicy;
12
+ sandboxMode: CodexCliSandboxMode;
13
+ command?: string;
14
+ prompt?: string;
15
+ model?: string;
16
+ webSearch?: boolean;
17
+ extraWritableDirectories?: string[];
18
+ env?: Record<string, string>;
19
+ input?: NodeJS.ReadableStream;
20
+ output?: NodeJS.WritableStream;
21
+ shutdownGracePeriodMs?: number;
22
+ }
23
+ export interface CodexCliSessionExit {
24
+ code: number | null;
25
+ signal: NodeJS.Signals | null;
26
+ }
27
+ export interface CodexCliSessionTtyMetadata {
28
+ stdinIsTty: boolean;
29
+ stdoutIsTty: boolean;
30
+ columns?: number;
31
+ rows?: number;
32
+ term?: string;
33
+ }
34
+ export interface CodexCliSessionMetadata {
35
+ launchMode: "new" | "resume";
36
+ researchSessionId: string;
37
+ codexSessionId?: string;
38
+ }
39
+ export interface CodexCliSessionHandle {
40
+ pid: number | undefined;
41
+ command: string;
42
+ args: string[];
43
+ metadata: CodexCliSessionMetadata;
44
+ tty?: CodexCliSessionTtyMetadata;
45
+ waitForExit(): Promise<CodexCliSessionExit>;
46
+ stop(signal?: NodeJS.Signals): Promise<CodexCliSessionExit>;
47
+ }
48
+ export interface CodexCliSessionReattachOptions {
49
+ sessionId: string;
50
+ codexSessionId?: string;
51
+ }
52
+ export interface CodexCliSessionManagerDependencies {
53
+ spawn?: SpawnChildProcess;
54
+ runtimeProcess?: {
55
+ env: NodeJS.ProcessEnv;
56
+ stdin: NodeJS.ReadableStream;
57
+ stdout: NodeJS.WritableStream;
58
+ on(event: RuntimeEvent, listener: RuntimeListener): unknown;
59
+ off(event: RuntimeEvent, listener: RuntimeListener): unknown;
60
+ };
61
+ setTimeout?: typeof globalThis.setTimeout;
62
+ clearTimeout?: typeof globalThis.clearTimeout;
63
+ }
64
+ export declare class CodexCliSessionManager {
65
+ private readonly spawnChild;
66
+ private readonly runtimeProcess;
67
+ private readonly setTimeoutFn;
68
+ private readonly clearTimeoutFn;
69
+ private activeSession;
70
+ constructor(dependencies?: CodexCliSessionManagerDependencies);
71
+ startSession(options: CodexCliSessionLaunchOptions): CodexCliSessionHandle;
72
+ reattachSession(options: CodexCliSessionReattachOptions): CodexCliSessionHandle;
73
+ private attachRuntimeHandlers;
74
+ }
75
+ export declare function buildCodexCliArgs(options: CodexCliSessionLaunchOptions): string[];
76
+ export declare function buildCodexCliEnvironment(baseEnvironment: NodeJS.ProcessEnv, options: Pick<CodexCliSessionLaunchOptions, "cwd" | "env" | "sessionId">): NodeJS.ProcessEnv;
77
+ export declare function isInteractiveTerminal(input: NodeJS.ReadableStream, output: NodeJS.WritableStream): boolean;
78
+ export declare function getCodexCliSessionTtyMetadata(input: NodeJS.ReadableStream, output: NodeJS.WritableStream, environment: NodeJS.ProcessEnv): CodexCliSessionTtyMetadata;
79
+ export {};
@@ -0,0 +1,248 @@
1
+ import { spawn } from "node:child_process";
2
+ const FORWARDED_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
3
+ const DEFAULT_CODEX_COMMAND = "codex";
4
+ const DEFAULT_SHUTDOWN_GRACE_PERIOD_MS = 5_000;
5
+ const activeSessionRegistry = new Map();
6
+ export class CodexCliSessionManager {
7
+ spawnChild;
8
+ runtimeProcess;
9
+ setTimeoutFn;
10
+ clearTimeoutFn;
11
+ activeSession = null;
12
+ constructor(dependencies = {}) {
13
+ this.spawnChild = dependencies.spawn ?? spawn;
14
+ this.runtimeProcess = dependencies.runtimeProcess ?? process;
15
+ this.setTimeoutFn = dependencies.setTimeout ?? globalThis.setTimeout;
16
+ this.clearTimeoutFn = dependencies.clearTimeout ?? globalThis.clearTimeout;
17
+ }
18
+ startSession(options) {
19
+ if (this.activeSession && !this.activeSession.closed) {
20
+ throw new Error("A Codex CLI session is already running");
21
+ }
22
+ const input = options.input ?? this.runtimeProcess.stdin;
23
+ const output = options.output ?? this.runtimeProcess.stdout;
24
+ if (!isInteractiveTerminal(input, output)) {
25
+ throw new Error("Codex CLI requires an interactive terminal on stdin and stdout");
26
+ }
27
+ const command = options.command?.trim() || DEFAULT_CODEX_COMMAND;
28
+ const args = buildCodexCliArgs(options);
29
+ const env = buildCodexCliEnvironment(this.runtimeProcess.env, options);
30
+ const tty = getCodexCliSessionTtyMetadata(input, output, env);
31
+ const metadata = buildCodexCliSessionMetadata(options);
32
+ const registryKeys = buildActiveSessionRegistryKeys(options.sessionId, metadata.codexSessionId);
33
+ const child = this.spawnChild(command, args, {
34
+ cwd: options.cwd,
35
+ env,
36
+ stdio: "inherit",
37
+ });
38
+ let resolveExit;
39
+ let rejectExit;
40
+ let forceKillTimer;
41
+ let activeSession;
42
+ const cleanup = () => {
43
+ if (activeSession.closed) {
44
+ return;
45
+ }
46
+ activeSession.closed = true;
47
+ if (forceKillTimer) {
48
+ this.clearTimeoutFn(forceKillTimer);
49
+ forceKillTimer = undefined;
50
+ }
51
+ detachRuntimeHandlers();
52
+ for (const key of activeSession.registryKeys) {
53
+ activeSessionRegistry.delete(key);
54
+ }
55
+ if (this.activeSession === activeSession) {
56
+ this.activeSession = null;
57
+ }
58
+ };
59
+ const stop = (signal = "SIGTERM") => {
60
+ if (!activeSession.closed && isChildRunning(child)) {
61
+ child.kill(signal);
62
+ if (!forceKillTimer) {
63
+ forceKillTimer = this.setTimeoutFn(() => {
64
+ if (activeSession.closed || !isChildRunning(child)) {
65
+ return;
66
+ }
67
+ child.kill("SIGKILL");
68
+ }, options.shutdownGracePeriodMs ?? DEFAULT_SHUTDOWN_GRACE_PERIOD_MS);
69
+ }
70
+ }
71
+ return activeSession.waitForExit;
72
+ };
73
+ const handle = {
74
+ pid: child.pid,
75
+ command,
76
+ args,
77
+ metadata,
78
+ tty,
79
+ waitForExit: () => activeSession.waitForExit,
80
+ stop,
81
+ };
82
+ activeSession = {
83
+ sessionId: options.sessionId,
84
+ registryKeys,
85
+ handle,
86
+ child,
87
+ closed: false,
88
+ waitForExit: new Promise((resolve, reject) => {
89
+ resolveExit = resolve;
90
+ rejectExit = reject;
91
+ }),
92
+ };
93
+ this.activeSession = activeSession;
94
+ for (const key of registryKeys) {
95
+ activeSessionRegistry.set(key, activeSession);
96
+ }
97
+ const exitHandler = (code, signal) => {
98
+ cleanup();
99
+ resolveExit?.({ code, signal });
100
+ };
101
+ const errorHandler = (error) => {
102
+ cleanup();
103
+ rejectExit?.(error);
104
+ };
105
+ child.once("exit", exitHandler);
106
+ child.once("error", errorHandler);
107
+ const detachRuntimeHandlers = this.attachRuntimeHandlers({
108
+ onSignal: (signal) => {
109
+ void stop(signal);
110
+ },
111
+ onExit: () => {
112
+ if (activeSession.closed || !isChildRunning(child)) {
113
+ return;
114
+ }
115
+ child.kill("SIGTERM");
116
+ },
117
+ });
118
+ return handle;
119
+ }
120
+ reattachSession(options) {
121
+ if (this.activeSession && !this.activeSession.closed) {
122
+ throw new Error("A Codex CLI session is already running");
123
+ }
124
+ const lookupKeys = buildReattachLookupKeys(options);
125
+ const activeSession = lookupKeys
126
+ .map((key) => activeSessionRegistry.get(key))
127
+ .find((candidate) => candidate && !candidate.closed && isChildRunning(candidate.child));
128
+ if (!activeSession) {
129
+ throw new Error(`Active Codex CLI session not found for ${lookupKeys[0] ?? options.sessionId}`);
130
+ }
131
+ this.activeSession = activeSession;
132
+ return activeSession.handle;
133
+ }
134
+ attachRuntimeHandlers(handlers) {
135
+ const boundHandlers = new Map();
136
+ for (const signal of FORWARDED_SIGNALS) {
137
+ const listener = () => {
138
+ handlers.onSignal(signal);
139
+ };
140
+ boundHandlers.set(signal, listener);
141
+ this.runtimeProcess.on(signal, listener);
142
+ }
143
+ const exitListener = () => {
144
+ handlers.onExit();
145
+ };
146
+ boundHandlers.set("exit", exitListener);
147
+ this.runtimeProcess.on("exit", exitListener);
148
+ return () => {
149
+ for (const [event, listener] of boundHandlers.entries()) {
150
+ this.runtimeProcess.off(event, listener);
151
+ }
152
+ };
153
+ }
154
+ }
155
+ export function buildCodexCliArgs(options) {
156
+ const baseArgs = [
157
+ "-C",
158
+ options.cwd,
159
+ "-a",
160
+ options.approvalPolicy,
161
+ "-s",
162
+ options.sandboxMode,
163
+ ];
164
+ if (options.model) {
165
+ baseArgs.push("-m", options.model);
166
+ }
167
+ if (options.webSearch ?? true) {
168
+ baseArgs.push("--search");
169
+ }
170
+ for (const directory of options.extraWritableDirectories ?? []) {
171
+ baseArgs.push("--add-dir", directory);
172
+ }
173
+ const existingSessionId = normalizeExistingSessionId(options.existingSessionId);
174
+ if (existingSessionId) {
175
+ return [
176
+ "resume",
177
+ existingSessionId,
178
+ ...baseArgs,
179
+ ...(options.prompt ? [options.prompt] : []),
180
+ ];
181
+ }
182
+ if (options.prompt) {
183
+ baseArgs.push(options.prompt);
184
+ }
185
+ return baseArgs;
186
+ }
187
+ export function buildCodexCliEnvironment(baseEnvironment, options) {
188
+ return {
189
+ ...baseEnvironment,
190
+ ...options.env,
191
+ INIT_CWD: options.cwd,
192
+ PWD: options.cwd,
193
+ RRX_AGENT: "codex_cli",
194
+ RRX_SESSION_ID: options.sessionId,
195
+ };
196
+ }
197
+ export function isInteractiveTerminal(input, output) {
198
+ return Boolean(input.isTTY && output.isTTY);
199
+ }
200
+ export function getCodexCliSessionTtyMetadata(input, output, environment) {
201
+ const columns = output.columns;
202
+ const rows = output.rows;
203
+ return {
204
+ stdinIsTty: Boolean(input.isTTY),
205
+ stdoutIsTty: Boolean(output.isTTY),
206
+ ...(columns && rows ? { columns, rows } : {}),
207
+ ...(environment.TERM ? { term: environment.TERM } : {}),
208
+ };
209
+ }
210
+ function isChildRunning(child) {
211
+ return child.exitCode === null && child.signalCode === null;
212
+ }
213
+ function buildCodexCliSessionMetadata(options) {
214
+ const existingSessionId = normalizeExistingSessionId(options.existingSessionId);
215
+ return {
216
+ launchMode: existingSessionId ? "resume" : "new",
217
+ researchSessionId: options.sessionId,
218
+ ...(existingSessionId ? { codexSessionId: existingSessionId } : {}),
219
+ };
220
+ }
221
+ function buildActiveSessionRegistryKeys(sessionId, codexSessionId) {
222
+ return [...new Set([sessionId, codexSessionId].filter((value) => Boolean(value)))];
223
+ }
224
+ function buildReattachLookupKeys(options) {
225
+ const sessionId = normalizeReattachLookupId(options.sessionId, "Research session id");
226
+ const codexSessionId = options.codexSessionId === undefined
227
+ ? undefined
228
+ : normalizeReattachLookupId(options.codexSessionId, "Codex session id");
229
+ return [...new Set([codexSessionId, sessionId].filter((value) => Boolean(value)))];
230
+ }
231
+ function normalizeExistingSessionId(value) {
232
+ if (value === undefined) {
233
+ return undefined;
234
+ }
235
+ const normalized = value.trim();
236
+ if (!normalized) {
237
+ throw new Error("Existing Codex session id must not be blank");
238
+ }
239
+ return normalized;
240
+ }
241
+ function normalizeReattachLookupId(value, label) {
242
+ const normalized = value.trim();
243
+ if (!normalized) {
244
+ throw new Error(`${label} must not be blank`);
245
+ }
246
+ return normalized;
247
+ }
248
+ //# sourceMappingURL=codex-cli-session-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-cli-session-manager.js","sourceRoot":"","sources":["../../../src/adapters/proposer/codex-cli-session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { CodexCliSessionTranscript } from "./codex-cli-session-driver.js";
2
+ import { type CodexCliSessionOutcome } from "../../core/model/codex-cli-session-outcome.js";
3
+ export declare function extractCodexCliSessionOutcome(transcript: CodexCliSessionTranscript): CodexCliSessionOutcome;
@@ -0,0 +1,94 @@
1
+ import { CODEX_CLI_SESSION_OUTCOME_BEGIN_MARKER, CODEX_CLI_SESSION_OUTCOME_END_MARKER, codexCliAgentTerminalOutcomeSchema, } from "../../core/model/codex-cli-session-outcome.js";
2
+ export function extractCodexCliSessionOutcome(transcript) {
3
+ const exit = transcript.exit ?? {
4
+ code: null,
5
+ signal: null,
6
+ };
7
+ if (!transcript.exit || !transcript.endedAt) {
8
+ return {
9
+ type: "terminal_runtime_error",
10
+ reasonCode: "transcript_not_finalized",
11
+ summary: "Codex CLI transcript is not finalized at a completed cycle boundary.",
12
+ exit,
13
+ };
14
+ }
15
+ if (transcript.exit.signal) {
16
+ return {
17
+ type: "terminal_runtime_error",
18
+ reasonCode: "process_exit_signaled",
19
+ summary: `Codex CLI session exited from signal ${transcript.exit.signal}.`,
20
+ exit,
21
+ };
22
+ }
23
+ if (transcript.exit.code !== 0) {
24
+ return {
25
+ type: "terminal_runtime_error",
26
+ reasonCode: "process_exit_non_zero",
27
+ summary: `Codex CLI session exited with code ${transcript.exit.code}.`,
28
+ exit,
29
+ };
30
+ }
31
+ const output = transcript.entries
32
+ .filter((entry) => entry.stream !== "stdin")
33
+ .map((entry) => entry.text)
34
+ .join("");
35
+ const startMatches = findAllMarkers(output, CODEX_CLI_SESSION_OUTCOME_BEGIN_MARKER);
36
+ const endMatches = findAllMarkers(output, CODEX_CLI_SESSION_OUTCOME_END_MARKER);
37
+ const startMarker = startMatches[0];
38
+ const endMarker = endMatches[0];
39
+ if (startMatches.length === 0 && endMatches.length === 0) {
40
+ return {
41
+ type: "terminal_runtime_error",
42
+ reasonCode: "missing_terminal_outcome",
43
+ summary: "Codex CLI transcript did not emit a terminal outcome marker.",
44
+ exit,
45
+ };
46
+ }
47
+ if (startMatches.length !== 1 ||
48
+ endMatches.length !== 1 ||
49
+ startMarker === undefined ||
50
+ endMarker === undefined ||
51
+ endMarker < startMarker) {
52
+ return {
53
+ type: "terminal_runtime_error",
54
+ reasonCode: startMatches.length === endMatches.length &&
55
+ startMatches.length > 1
56
+ ? "duplicate_terminal_outcomes"
57
+ : "partial_terminal_outcome",
58
+ summary: "Codex CLI transcript must contain exactly one complete terminal outcome block.",
59
+ exit,
60
+ };
61
+ }
62
+ const payload = output
63
+ .slice(startMarker + CODEX_CLI_SESSION_OUTCOME_BEGIN_MARKER.length, endMarker)
64
+ .trim();
65
+ if (!payload) {
66
+ return {
67
+ type: "terminal_runtime_error",
68
+ reasonCode: "invalid_terminal_outcome",
69
+ summary: "Codex CLI terminal outcome block was empty.",
70
+ exit,
71
+ };
72
+ }
73
+ try {
74
+ return codexCliAgentTerminalOutcomeSchema.parse(JSON.parse(payload));
75
+ }
76
+ catch {
77
+ return {
78
+ type: "terminal_runtime_error",
79
+ reasonCode: "invalid_terminal_outcome",
80
+ summary: "Codex CLI terminal outcome block was not valid session outcome JSON.",
81
+ exit,
82
+ };
83
+ }
84
+ }
85
+ function findAllMarkers(haystack, marker) {
86
+ const positions = [];
87
+ let index = haystack.indexOf(marker);
88
+ while (index !== -1) {
89
+ positions.push(index);
90
+ index = haystack.indexOf(marker, index + marker.length);
91
+ }
92
+ return positions;
93
+ }
94
+ //# sourceMappingURL=codex-cli-session-outcome-extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex-cli-session-outcome-extractor.js","sourceRoot":"","sources":["../../../src/adapters/proposer/codex-cli-session-outcome-extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { LeafProposerConfig } from "../../core/manifest/schema.js";
2
+ import type { CodexCliCycleSessionContext } from "../../core/model/codex-cli-cycle-session.js";
3
+ import type { ProposalAdapterMetadata } from "../../core/model/run-record.js";
4
+ import { type CodexCliSessionProposerDependencies } from "./codex-cli-proposer.js";
5
+ import { runCommandProposer, type CommandProposalResult, type RunCommandProposerInput } from "./command-proposer.js";
6
+ export interface ProposalExecutionInput extends RunCommandProposerInput {
7
+ codexSession?: CodexCliCycleSessionContext;
8
+ }
9
+ export interface ProposalExecutionResult {
10
+ proposerType: CommandProposalResult["proposerType"] | "codex_cli";
11
+ stdout: string;
12
+ stderr: string;
13
+ summary: string;
14
+ adapterMetadata?: ProposalAdapterMetadata;
15
+ }
16
+ export interface ProposerRunner {
17
+ run(input: ProposalExecutionInput): Promise<ProposalExecutionResult>;
18
+ }
19
+ export interface ProposerFactoryDependencies extends CodexCliSessionProposerDependencies {
20
+ runCommand?: typeof runCommandProposer;
21
+ }
22
+ export declare function createProposerRunner(proposer: LeafProposerConfig, dependencies?: ProposerFactoryDependencies): ProposerRunner;