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,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
+ }
@@ -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 {};