@scanton/phase2s 0.24.0 → 0.26.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"spec-parser.js","sourceRoot":"","sources":["../../../src/core/spec-parser.ts"],"names":[],"mappings":"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"}
@@ -5,24 +5,21 @@ import type { OpenAIFunctionDef } from "../tools/types.js";
5
5
  * Codex CLI provider.
6
6
  *
7
7
  * Uses `codex exec` in fully non-interactive scripting mode:
8
- * --json suppresses the terminal UI (outputs JSONL instead)
9
- * --output-last-message writes the final response to a temp file
8
+ * --json suppresses the terminal UI, outputs JSONL events on stdout
10
9
  *
11
- * This means codex never needs to open /dev/tty, so it cannot corrupt
12
- * the parent process's terminal/readline session.
10
+ * Each `item.completed` event with `type: "agent_message"` is yielded immediately
11
+ * as a `{ type: "text" }` ProviderEvent. Multi-step tasks (with tool calls) produce
12
+ * multiple agent_message items, so callers see real-time step-by-step progress rather
13
+ * than waiting for the entire run to finish.
13
14
  *
14
- * Real Codex streaming is deferred — the JSONL stdout format is undocumented.
15
- * `chatStream()` wraps `_chat()` in a passthrough single-event generator
16
- * (same batch UX as before, but through the Provider streaming interface).
17
- * Tool calling is not supported via the --output-last-message mechanism;
18
- * toolCalls is always [].
15
+ * Malformed JSONL lines are silently skipped.
16
+ * Tool calling is not surfaced via this mechanism; toolCalls is always [].
19
17
  */
20
18
  export declare class CodexProvider implements Provider {
21
19
  name: string;
22
20
  private codexPath;
23
21
  private model;
24
22
  constructor(config: Config);
25
- chatStream(messages: Message[], tools: OpenAIFunctionDef[], options?: import("./types.js").ChatStreamOptions): AsyncIterable<ProviderEvent>;
26
- private _chat;
23
+ chatStream(messages: Message[], _tools: OpenAIFunctionDef[], options?: import("./types.js").ChatStreamOptions): AsyncIterable<ProviderEvent>;
27
24
  }
28
25
  //# sourceMappingURL=codex.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAY,aAAa,EAAE,MAAM,YAAY,CAAC;AAC7E,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAsC3D;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,IAAI,SAAe;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM;IAKnB,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,KAAK,EAAE,iBAAiB,EAAE,EAC1B,OAAO,CAAC,EAAE,OAAO,YAAY,EAAE,iBAAiB,GAC/C,aAAa,CAAC,aAAa,CAAC;YAejB,KAAK;CAmGpB"}
1
+ {"version":3,"file":"codex.d.ts","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACnE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAkD3D;;;;;;;;;;;;;GAaG;AACH,qBAAa,aAAc,YAAW,QAAQ;IAC5C,IAAI,SAAe;IACnB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAS;gBAEV,MAAM,EAAE,MAAM;IAKnB,UAAU,CACf,QAAQ,EAAE,OAAO,EAAE,EACnB,MAAM,EAAE,iBAAiB,EAAE,EAC3B,OAAO,CAAC,EAAE,OAAO,YAAY,EAAE,iBAAiB,GAC/C,aAAa,CAAC,aAAa,CAAC;CAuIhC"}
@@ -1,56 +1,20 @@
1
1
  import { spawn } from "node:child_process";
2
- import { rmSync } from "node:fs";
3
- import { mkdtemp, readFile, rm } from "node:fs/promises";
4
- import { join } from "node:path";
5
- import { tmpdir } from "node:os";
6
- /** Track all temp dirs created this process so we can clean up on crash/exit. */
7
- const activeTempDirs = new Set();
8
- function cleanupTempDirs() {
9
- // Synchronous cleanup — rmSync is available here (unlike the async rm).
10
- for (const dir of activeTempDirs) {
11
- try {
12
- rmSync(dir, { recursive: true, force: true });
13
- }
14
- catch {
15
- // Best-effort — ignore errors (e.g. already deleted by normal path)
16
- }
17
- }
18
- }
19
- /**
20
- * Guard against double-registration if the module is evaluated multiple times.
21
- * In vitest environments, modules may be re-evaluated between test files, which
22
- * would register duplicate handlers and trigger MaxListenersExceededWarning.
23
- */
24
- let _signalHandlersRegistered = false;
25
- if (!_signalHandlersRegistered) {
26
- _signalHandlersRegistered = true;
27
- process.on("exit", cleanupTempDirs);
28
- // SIGTERM and SIGINT don't trigger "exit" automatically — register them explicitly
29
- // so that temp dirs (which may contain prompt text) are cleaned up on Ctrl+C and kill.
30
- process.on("SIGTERM", () => {
31
- cleanupTempDirs();
32
- process.exit(0);
33
- });
34
- process.on("SIGINT", () => {
35
- cleanupTempDirs();
36
- process.exit(0);
37
- });
2
+ function isAgentMessage(item) {
3
+ return item.type === "agent_message" && "text" in item;
38
4
  }
39
5
  /**
40
6
  * Codex CLI provider.
41
7
  *
42
8
  * Uses `codex exec` in fully non-interactive scripting mode:
43
- * --json suppresses the terminal UI (outputs JSONL instead)
44
- * --output-last-message writes the final response to a temp file
9
+ * --json suppresses the terminal UI, outputs JSONL events on stdout
45
10
  *
46
- * This means codex never needs to open /dev/tty, so it cannot corrupt
47
- * the parent process's terminal/readline session.
11
+ * Each `item.completed` event with `type: "agent_message"` is yielded immediately
12
+ * as a `{ type: "text" }` ProviderEvent. Multi-step tasks (with tool calls) produce
13
+ * multiple agent_message items, so callers see real-time step-by-step progress rather
14
+ * than waiting for the entire run to finish.
48
15
  *
49
- * Real Codex streaming is deferred — the JSONL stdout format is undocumented.
50
- * `chatStream()` wraps `_chat()` in a passthrough single-event generator
51
- * (same batch UX as before, but through the Provider streaming interface).
52
- * Tool calling is not supported via the --output-last-message mechanism;
53
- * toolCalls is always [].
16
+ * Malformed JSONL lines are silently skipped.
17
+ * Tool calling is not surfaced via this mechanism; toolCalls is always [].
54
18
  */
55
19
  export class CodexProvider {
56
20
  name = "codex-cli";
@@ -60,22 +24,8 @@ export class CodexProvider {
60
24
  this.codexPath = config.codexPath;
61
25
  this.model = config.model;
62
26
  }
63
- async *chatStream(messages, tools, options) {
64
- const result = await this._chat(messages, tools, options?.model);
65
- if (result.text) {
66
- yield { type: "text", content: result.text };
67
- }
68
- // Codex provider currently always returns toolCalls: [] — tool calling
69
- // is not supported via the --output-last-message mechanism.
70
- if (result.toolCalls.length > 0) {
71
- yield { type: "tool_calls", calls: result.toolCalls };
72
- yield { type: "done", stopReason: "tool_calls" };
73
- }
74
- else {
75
- yield { type: "done", stopReason: "stop" };
76
- }
77
- }
78
- async _chat(messages, _tools, modelOverride) {
27
+ async *chatStream(messages, _tools, options) {
28
+ const model = options?.model ?? this.model;
79
29
  // Build the full prompt: system context + conversation history
80
30
  const parts = [];
81
31
  const systemMessages = messages.filter((m) => m.role === "system");
@@ -83,8 +33,7 @@ export class CodexProvider {
83
33
  parts.push(systemMessages.map((m) => m.content).join("\n"));
84
34
  parts.push("---");
85
35
  }
86
- const nonSystem = messages.filter((m) => m.role !== "system");
87
- for (const msg of nonSystem) {
36
+ for (const msg of messages.filter((m) => m.role !== "system")) {
88
37
  if (msg.role === "user") {
89
38
  parts.push(`User: ${msg.content}`);
90
39
  }
@@ -93,70 +42,118 @@ export class CodexProvider {
93
42
  }
94
43
  }
95
44
  const prompt = parts.join("\n\n");
96
- // Use a temp dir for the output file so we don't pollute the project
97
- const tmpDir = await mkdtemp(join(tmpdir(), "phase2s-"));
98
- activeTempDirs.add(tmpDir);
99
- const outputFile = join(tmpDir, "last-message.txt");
100
- // codex exec --json suppresses the interactive UI (no /dev/tty access)
101
- // --output-last-message writes the final response to a file we control
102
- //
103
- // The "--" separator signals end-of-flags to codex's own arg parser.
104
- // Without it, a prompt beginning with "--" (e.g. "--help" or "--flags")
105
- // would be misinterpreted as a codex CLI flag rather than as the prompt.
106
- // spawn() with an array is NOT shell-injected, so this is the only risk.
45
+ // codex exec --json suppresses the interactive UI and outputs JSONL on stdout.
46
+ // The "--" separator signals end-of-flags so prompts beginning with "--" are safe.
47
+ // spawn() with an array is NOT shell-injected, so this is the only prompt-injection risk.
107
48
  const args = [
108
49
  "exec",
109
- "-m", modelOverride ?? this.model,
50
+ "-m", model,
110
51
  "--full-auto",
111
52
  "-C", process.cwd(),
112
53
  "--json",
113
- "--output-last-message", outputFile,
114
54
  "--",
115
55
  prompt,
116
56
  ];
117
- return new Promise((resolve, reject) => {
118
- const proc = spawn(this.codexPath, args, {
119
- stdio: ["ignore", "pipe", "pipe"],
120
- env: {
121
- ...process.env,
122
- NO_COLOR: "1",
123
- FORCE_COLOR: "0",
124
- },
125
- });
126
- let stderr = "";
127
- // Consume stdout (JSONL events) so the pipe buffer never fills and
128
- // blocks codex. We don't parse it — we use --output-last-message instead.
129
- proc.stdout.resume();
130
- proc.stderr.on("data", (data) => {
131
- stderr += data.toString();
132
- });
133
- proc.on("close", async (code) => {
134
- // Try reading the output file first (most reliable)
135
- try {
136
- const text = await readFile(outputFile, "utf-8");
137
- await rm(tmpDir, { recursive: true }).catch(() => { });
138
- activeTempDirs.delete(tmpDir);
139
- resolve({ text: text.trim(), toolCalls: [] });
140
- return;
141
- }
142
- catch {
143
- // Output file missing — fall through to error handling
144
- }
145
- await rm(tmpDir, { recursive: true }).catch(() => { });
146
- activeTempDirs.delete(tmpDir);
147
- if (code !== 0) {
148
- reject(new Error(`Codex exited with code ${code}: ${stderr.trim()}`));
149
- return;
150
- }
151
- // Unexpected: exited 0 but no output file
152
- reject(new Error("Codex produced no output"));
153
- });
154
- proc.on("error", async (err) => {
155
- await rm(tmpDir, { recursive: true }).catch(() => { });
156
- activeTempDirs.delete(tmpDir);
157
- reject(new Error(`Failed to spawn codex: ${err.message}`));
158
- });
57
+ const proc = spawn(this.codexPath, args, {
58
+ stdio: ["ignore", "pipe", "pipe"],
59
+ env: {
60
+ ...process.env,
61
+ NO_COLOR: "1",
62
+ FORCE_COLOR: "0",
63
+ },
159
64
  });
65
+ // -------------------------------------------------------------------------
66
+ // Async queue: bridges the event-emitter world → async generator.
67
+ //
68
+ // We can't `yield` from inside event handlers, so we push events into a
69
+ // queue and use a one-shot resolve callback to wake the generator loop.
70
+ // -------------------------------------------------------------------------
71
+ const pendingEvents = [];
72
+ let finished = false;
73
+ let finishError = null;
74
+ let wakeUp = null;
75
+ let hasProducedText = false;
76
+ const push = (event) => {
77
+ pendingEvents.push(event);
78
+ wakeUp?.();
79
+ wakeUp = null;
80
+ };
81
+ const finish = (err) => {
82
+ if (finished)
83
+ return; // Guard: called at most once
84
+ finished = true;
85
+ finishError = err ?? null;
86
+ wakeUp?.();
87
+ wakeUp = null;
88
+ };
89
+ // JSONL line parser — called for each complete line from stdout
90
+ const processLine = (line) => {
91
+ if (!line)
92
+ return;
93
+ let evt;
94
+ try {
95
+ evt = JSON.parse(line);
96
+ }
97
+ catch {
98
+ // Silent fallback: malformed JSONL line, skip it
99
+ return;
100
+ }
101
+ if (evt.type === "item.completed" && isAgentMessage(evt.item)) {
102
+ hasProducedText = true;
103
+ push({ type: "text", content: evt.item.text });
104
+ }
105
+ else if (evt.type === "error") {
106
+ finish(new Error(`Codex error: ${evt.message}`));
107
+ }
108
+ };
109
+ // Stream stdout, splitting on newlines as chunks arrive
110
+ let lineBuffer = "";
111
+ proc.stdout.on("data", (chunk) => {
112
+ lineBuffer += chunk.toString();
113
+ let newlineIdx;
114
+ while ((newlineIdx = lineBuffer.indexOf("\n")) !== -1) {
115
+ processLine(lineBuffer.slice(0, newlineIdx).trim());
116
+ lineBuffer = lineBuffer.slice(newlineIdx + 1);
117
+ }
118
+ });
119
+ // Consume stderr so the pipe buffer never fills and blocks codex.
120
+ proc.stderr.resume();
121
+ proc.on("close", (code) => {
122
+ if (finished)
123
+ return;
124
+ // Flush any remaining content without a trailing newline
125
+ const remaining = lineBuffer.trim();
126
+ if (remaining)
127
+ processLine(remaining);
128
+ if (!hasProducedText && code !== 0) {
129
+ finish(new Error(`Codex exited with code ${code ?? "null"}`));
130
+ }
131
+ else if (!hasProducedText) {
132
+ finish(new Error("Codex produced no output"));
133
+ }
134
+ else {
135
+ finish();
136
+ }
137
+ });
138
+ proc.on("error", (err) => {
139
+ finish(new Error(`Failed to spawn codex: ${err.message}`));
140
+ });
141
+ // Generator loop: drain the queue, wait for more, repeat until done
142
+ while (true) {
143
+ while (pendingEvents.length > 0) {
144
+ yield pendingEvents.shift();
145
+ }
146
+ if (finished) {
147
+ if (finishError)
148
+ throw finishError;
149
+ yield { type: "done", stopReason: "stop" };
150
+ return;
151
+ }
152
+ // Wait for the next push() or finish() call
153
+ await new Promise((resolve) => {
154
+ wakeUp = resolve;
155
+ });
156
+ }
160
157
  }
161
158
  }
162
159
  //# sourceMappingURL=codex.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/providers/codex.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@scanton/phase2s",
3
- "version": "0.24.0",
3
+ "version": "0.26.0",
4
4
  "description": "AI programming harness with multi-model support",
5
5
  "type": "module",
6
6
  "files": [