ralph-research 0.1.2 → 0.1.3

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 (127) hide show
  1. package/README.md +127 -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/manifest-loader.js +8 -1
  9. package/dist/adapters/fs/manifest-loader.js.map +1 -1
  10. package/dist/adapters/proposer/codex-cli-proposer.d.ts +16 -0
  11. package/dist/adapters/proposer/codex-cli-proposer.js +106 -0
  12. package/dist/adapters/proposer/codex-cli-proposer.js.map +1 -0
  13. package/dist/adapters/proposer/codex-cli-session-driver.d.ts +64 -0
  14. package/dist/adapters/proposer/codex-cli-session-driver.js +182 -0
  15. package/dist/adapters/proposer/codex-cli-session-driver.js.map +1 -0
  16. package/dist/adapters/proposer/codex-cli-session-manager.d.ts +79 -0
  17. package/dist/adapters/proposer/codex-cli-session-manager.js +248 -0
  18. package/dist/adapters/proposer/codex-cli-session-manager.js.map +1 -0
  19. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.d.ts +3 -0
  20. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js +94 -0
  21. package/dist/adapters/proposer/codex-cli-session-outcome-extractor.js.map +1 -0
  22. package/dist/adapters/proposer/proposer-factory.d.ts +22 -0
  23. package/dist/adapters/proposer/proposer-factory.js +19 -0
  24. package/dist/adapters/proposer/proposer-factory.js.map +1 -0
  25. package/dist/app/services/codex-cli-session-lifecycle-service.d.ts +116 -0
  26. package/dist/app/services/codex-cli-session-lifecycle-service.js +186 -0
  27. package/dist/app/services/codex-cli-session-lifecycle-service.js.map +1 -0
  28. package/dist/app/services/research-project-defaults-service.d.ts +18 -0
  29. package/dist/app/services/research-project-defaults-service.js +175 -0
  30. package/dist/app/services/research-project-defaults-service.js.map +1 -0
  31. package/dist/app/services/research-session-draft-service.d.ts +121 -0
  32. package/dist/app/services/research-session-draft-service.js +846 -0
  33. package/dist/app/services/research-session-draft-service.js.map +1 -0
  34. package/dist/app/services/research-session-entry-flow-summary-mapper.d.ts +12 -0
  35. package/dist/app/services/research-session-entry-flow-summary-mapper.js +33 -0
  36. package/dist/app/services/research-session-entry-flow-summary-mapper.js.map +1 -0
  37. package/dist/app/services/research-session-interactive-service.d.ts +35 -0
  38. package/dist/app/services/research-session-interactive-service.js +295 -0
  39. package/dist/app/services/research-session-interactive-service.js.map +1 -0
  40. package/dist/app/services/research-session-launch-service.d.ts +46 -0
  41. package/dist/app/services/research-session-launch-service.js +389 -0
  42. package/dist/app/services/research-session-launch-service.js.map +1 -0
  43. package/dist/app/services/research-session-orchestrator-service.d.ts +140 -0
  44. package/dist/app/services/research-session-orchestrator-service.js +614 -0
  45. package/dist/app/services/research-session-orchestrator-service.js.map +1 -0
  46. package/dist/app/services/research-session-recovery-service.d.ts +30 -0
  47. package/dist/app/services/research-session-recovery-service.js +110 -0
  48. package/dist/app/services/research-session-recovery-service.js.map +1 -0
  49. package/dist/app/services/research-session-wizard-controller.d.ts +51 -0
  50. package/dist/app/services/research-session-wizard-controller.js +220 -0
  51. package/dist/app/services/research-session-wizard-controller.js.map +1 -0
  52. package/dist/app/services/run-cycle-service.d.ts +2 -0
  53. package/dist/app/services/run-cycle-service.js +2 -0
  54. package/dist/app/services/run-cycle-service.js.map +1 -1
  55. package/dist/cli/commands/inspect.js +2 -0
  56. package/dist/cli/commands/inspect.js.map +1 -1
  57. package/dist/cli/commands/launch.d.ts +16 -0
  58. package/dist/cli/commands/launch.js +68 -0
  59. package/dist/cli/commands/launch.js.map +1 -0
  60. package/dist/cli/commands/proposer-display.d.ts +2 -0
  61. package/dist/cli/commands/proposer-display.js +18 -0
  62. package/dist/cli/commands/proposer-display.js.map +1 -0
  63. package/dist/cli/commands/resume.d.ts +14 -0
  64. package/dist/cli/commands/resume.js +134 -0
  65. package/dist/cli/commands/resume.js.map +1 -0
  66. package/dist/cli/commands/run.d.ts +1 -1
  67. package/dist/cli/commands/run.js +2 -2
  68. package/dist/cli/commands/run.js.map +1 -1
  69. package/dist/cli/commands/status.js +4 -0
  70. package/dist/cli/commands/status.js.map +1 -1
  71. package/dist/cli/main.js +2 -29
  72. package/dist/cli/main.js.map +1 -1
  73. package/dist/cli/program.d.ts +15 -0
  74. package/dist/cli/program.js +54 -0
  75. package/dist/cli/program.js.map +1 -0
  76. package/dist/cli/tui/research-session-shell.d.ts +22 -0
  77. package/dist/cli/tui/research-session-shell.js +719 -0
  78. package/dist/cli/tui/research-session-shell.js.map +1 -0
  79. package/dist/core/engine/cycle-runner.d.ts +4 -0
  80. package/dist/core/engine/cycle-runner.js +15 -9
  81. package/dist/core/engine/cycle-runner.js.map +1 -1
  82. package/dist/core/manifest/admission.d.ts +1 -0
  83. package/dist/core/manifest/admission.js +50 -0
  84. package/dist/core/manifest/admission.js.map +1 -1
  85. package/dist/core/manifest/defaults.d.ts +21 -0
  86. package/dist/core/manifest/defaults.js +21 -0
  87. package/dist/core/manifest/defaults.js.map +1 -1
  88. package/dist/core/manifest/schema.d.ts +170 -0
  89. package/dist/core/manifest/schema.js +21 -1
  90. package/dist/core/manifest/schema.js.map +1 -1
  91. package/dist/core/model/codex-cli-cycle-session.d.ts +4 -0
  92. package/dist/core/model/codex-cli-cycle-session.js +2 -0
  93. package/dist/core/model/codex-cli-cycle-session.js.map +1 -0
  94. package/dist/core/model/codex-cli-session-lifecycle.d.ts +131 -0
  95. package/dist/core/model/codex-cli-session-lifecycle.js +237 -0
  96. package/dist/core/model/codex-cli-session-lifecycle.js.map +1 -0
  97. package/dist/core/model/codex-cli-session-outcome.d.ts +121 -0
  98. package/dist/core/model/codex-cli-session-outcome.js +70 -0
  99. package/dist/core/model/codex-cli-session-outcome.js.map +1 -0
  100. package/dist/core/model/research-project-defaults.d.ts +48 -0
  101. package/dist/core/model/research-project-defaults.js +46 -0
  102. package/dist/core/model/research-project-defaults.js.map +1 -0
  103. package/dist/core/model/research-session.d.ts +1143 -0
  104. package/dist/core/model/research-session.js +689 -0
  105. package/dist/core/model/research-session.js.map +1 -0
  106. package/dist/core/model/run-record.d.ts +56 -6
  107. package/dist/core/model/run-record.js +28 -0
  108. package/dist/core/model/run-record.js.map +1 -1
  109. package/dist/core/ports/research-project-defaults-store.d.ts +5 -0
  110. package/dist/core/ports/research-project-defaults-store.js +2 -0
  111. package/dist/core/ports/research-project-defaults-store.js.map +1 -0
  112. package/dist/core/ports/research-session-repository.d.ts +25 -0
  113. package/dist/core/ports/research-session-repository.js +2 -0
  114. package/dist/core/ports/research-session-repository.js.map +1 -0
  115. package/dist/core/state/research-session-recovery-classifier.d.ts +24 -0
  116. package/dist/core/state/research-session-recovery-classifier.js +236 -0
  117. package/dist/core/state/research-session-recovery-classifier.js.map +1 -0
  118. package/dist/core/state/research-session-resume-candidate.d.ts +8 -0
  119. package/dist/core/state/research-session-resume-candidate.js +62 -0
  120. package/dist/core/state/research-session-resume-candidate.js.map +1 -0
  121. package/dist/core/state/research-session-state-machine.d.ts +62 -0
  122. package/dist/core/state/research-session-state-machine.js +443 -0
  123. package/dist/core/state/research-session-state-machine.js.map +1 -0
  124. package/dist/mcp/server.d.ts +4 -0
  125. package/dist/mcp/server.js +192 -1
  126. package/dist/mcp/server.js.map +1 -1
  127. package/package.json +1 -1
@@ -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;
@@ -0,0 +1,19 @@
1
+ import { CodexCliSessionProposer } from "./codex-cli-proposer.js";
2
+ import { runCommandProposer, } from "./command-proposer.js";
3
+ export function createProposerRunner(proposer, dependencies = {}) {
4
+ switch (proposer.type) {
5
+ case "command":
6
+ return {
7
+ run: (input) => (dependencies.runCommand ?? runCommandProposer)(proposer, input),
8
+ };
9
+ case "codex_cli":
10
+ return new CodexCliSessionProposer(proposer, {
11
+ ...(dependencies.createSessionManager ? { createSessionManager: dependencies.createSessionManager } : {}),
12
+ ...(dependencies.createSessionId ? { createSessionId: dependencies.createSessionId } : {}),
13
+ ...(dependencies.now ? { now: dependencies.now } : {}),
14
+ });
15
+ default:
16
+ throw new Error(`unsupported proposer type ${proposer.type} in cycle runner`);
17
+ }
18
+ }
19
+ //# sourceMappingURL=proposer-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"proposer-factory.js","sourceRoot":"","sources":["../../../src/adapters/proposer/proposer-factory.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,uBAAuB,EAA4C,MAAM,yBAAyB,CAAC;AAC5G,OAAO,EACL,kBAAkB,GAGnB,MAAM,uBAAuB,CAAC;AAqB/B,MAAM,UAAU,oBAAoB,CAClC,QAA4B,EAC5B,eAA4C,EAAE;IAE9C,QAAQ,QAAQ,CAAC,IAAI,EAAE,CAAC;QACtB,KAAK,SAAS;YACZ,OAAO;gBACL,GAAG,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,UAAU,IAAI,kBAAkB,CAAC,CAAC,QAAQ,EAAE,KAAK,CAAC;aACjF,CAAC;QACJ,KAAK,WAAW;YACd,OAAO,IAAI,uBAAuB,CAAC,QAAQ,EAAE;gBAC3C,GAAG,CAAC,YAAY,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,YAAY,CAAC,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzG,GAAG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,YAAY,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1F,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACvD,CAAC,CAAC;QACL;YACE,MAAM,IAAI,KAAK,CAAC,6BAA6B,QAAQ,CAAC,IAAI,kBAAkB,CAAC,CAAC;IAClF,CAAC;AACH,CAAC"}
@@ -0,0 +1,116 @@
1
+ import type { CodexCliSessionLifecyclePhase, CodexCliSessionLifecycleRecord } from "../../core/model/codex-cli-session-lifecycle.js";
2
+ import type { ResearchSessionRecord } from "../../core/model/research-session.js";
3
+ import type { PersistedCodexSessionReference } from "../../core/ports/research-session-repository.js";
4
+ import type { ResearchSessionRecoveryStatus } from "../../core/state/research-session-recovery-classifier.js";
5
+ import { ResearchSessionRecoveryService, type ResearchSessionRecoveryInspection, type ResearchSessionRecoveryInput } from "./research-session-recovery-service.js";
6
+ type ReusableAttachmentPhase = Extract<CodexCliSessionLifecyclePhase, "starting" | "running">;
7
+ export type CodexCliSessionAttachability = {
8
+ mode: "attach";
9
+ attachable: true;
10
+ resumable: false;
11
+ reason: string;
12
+ } | {
13
+ mode: "resume";
14
+ attachable: false;
15
+ resumable: true;
16
+ reason: string;
17
+ } | {
18
+ mode: "inspect";
19
+ attachable: false;
20
+ resumable: false;
21
+ reason: string;
22
+ };
23
+ export interface CodexCliReusableAttachmentTarget {
24
+ kind: "reusable_attachment_target";
25
+ session: ResearchSessionRecord;
26
+ lifecycle: CodexCliSessionLifecycleRecord & {
27
+ phase: ReusableAttachmentPhase;
28
+ pid: number;
29
+ attachmentState: CodexCliSessionLifecycleRecord["attachmentState"] & {
30
+ status: "bound";
31
+ };
32
+ };
33
+ recovery: ResearchSessionRecoveryStatus;
34
+ attachability: Extract<CodexCliSessionAttachability, {
35
+ mode: "attach";
36
+ }>;
37
+ target: {
38
+ researchSessionId: string;
39
+ codexSessionId: string;
40
+ pid: number;
41
+ phase: ReusableAttachmentPhase;
42
+ command: string;
43
+ args: string[];
44
+ workingDirectory: string;
45
+ attachmentStatus: "bound";
46
+ trackedGlobs: string[];
47
+ extraWritableDirectories: string[];
48
+ tty: CodexCliSessionLifecycleRecord["tty"];
49
+ workspaceRef?: string;
50
+ workspacePath?: string;
51
+ checkpointRunId?: string;
52
+ checkpointDecisionId?: string;
53
+ };
54
+ }
55
+ export interface CodexCliStaleSessionOutcome {
56
+ kind: "stale_session_outcome";
57
+ session: ResearchSessionRecord;
58
+ lifecycle: CodexCliSessionLifecycleRecord | null;
59
+ recovery: ResearchSessionRecoveryStatus;
60
+ attachability: Exclude<CodexCliSessionAttachability, {
61
+ mode: "attach";
62
+ }>;
63
+ outcome: {
64
+ runtimeState: ResearchSessionRecoveryStatus["runtime"]["state"];
65
+ completedCycles: number;
66
+ resumeFromCycle: number;
67
+ resumable: boolean;
68
+ reason: string;
69
+ phase?: CodexCliSessionLifecyclePhase;
70
+ attachmentStatus?: CodexCliSessionLifecycleRecord["attachmentState"]["status"];
71
+ };
72
+ }
73
+ export interface CodexCliReuseExistingSessionDecision {
74
+ decision: "reuse";
75
+ session: ResearchSessionRecord;
76
+ lifecycle: CodexCliSessionLifecycleRecord & {
77
+ phase: ReusableAttachmentPhase;
78
+ pid: number;
79
+ attachmentState: CodexCliSessionLifecycleRecord["attachmentState"] & {
80
+ status: "bound";
81
+ };
82
+ };
83
+ recovery: ResearchSessionRecoveryStatus;
84
+ codexSessionReference: PersistedCodexSessionReference;
85
+ reason: string;
86
+ reuse: CodexCliReusableAttachmentTarget["target"];
87
+ }
88
+ export interface CodexCliReplaceExistingSessionDecision {
89
+ decision: "replace";
90
+ session: ResearchSessionRecord;
91
+ lifecycle: CodexCliSessionLifecycleRecord | null;
92
+ recovery: ResearchSessionRecoveryStatus;
93
+ codexSessionReference: PersistedCodexSessionReference | null;
94
+ reason: string;
95
+ replace: CodexCliStaleSessionOutcome["outcome"] & {
96
+ attachabilityMode: Exclude<CodexCliSessionAttachability["mode"], "attach">;
97
+ };
98
+ }
99
+ export type CodexCliSessionLifecycleServiceResult = CodexCliReusableAttachmentTarget | CodexCliStaleSessionOutcome;
100
+ export type CodexCliSessionReuseOrReplaceDecision = CodexCliReuseExistingSessionDecision | CodexCliReplaceExistingSessionDecision;
101
+ export interface CodexCliSessionLifecycleServiceDependencies {
102
+ recoveryService?: Pick<ResearchSessionRecoveryService, "inspectSession">;
103
+ createRecoveryService?: () => Pick<ResearchSessionRecoveryService, "inspectSession">;
104
+ attachabilityValidator?: (inspection: ResearchSessionRecoveryInspection) => CodexCliSessionAttachability;
105
+ }
106
+ export declare class CodexCliSessionLifecycleService {
107
+ private readonly recoveryService;
108
+ private readonly attachabilityValidator;
109
+ constructor(dependencies?: CodexCliSessionLifecycleServiceDependencies);
110
+ inspectSession(input: ResearchSessionRecoveryInput): Promise<CodexCliSessionLifecycleServiceResult>;
111
+ resolveCycleSession(input: ResearchSessionRecoveryInput): Promise<CodexCliSessionReuseOrReplaceDecision>;
112
+ }
113
+ export declare function classifyCodexCliSessionLifecycleInspection(inspection: ResearchSessionRecoveryInspection): CodexCliSessionLifecycleServiceResult;
114
+ export declare function resolveCodexCliSessionReuseOrReplaceDecision(inspection: ResearchSessionRecoveryInspection, attachability?: CodexCliSessionAttachability): CodexCliSessionReuseOrReplaceDecision;
115
+ export declare function validateCodexCliSessionAttachability(inspection: ResearchSessionRecoveryInspection): CodexCliSessionAttachability;
116
+ export {};