Skip to content

Commit 3ad144b

Browse files
author
Aleksandr Slapoguzov
committed
better support reasoning: streaming and sections
1 parent 2426815 commit 3ad144b

4 files changed

Lines changed: 402 additions & 117 deletions

File tree

src/CodexACPAgent.ts

Lines changed: 51 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {
88
import {applyPatch} from "diff";
99

1010
interface AgentSession {
11+
seenReasoningDeltas: boolean;
1112
pendingPrompt: AbortController | null;
1213
}
1314

@@ -69,6 +70,7 @@ export class CodexACPAgent implements acp.Agent {
6970

7071
const sessionId = newConversationResponse.conversationId;
7172
this.sessions.set(sessionId, {
73+
seenReasoningDeltas: false,
7274
pendingPrompt: null,
7375
});
7476

@@ -172,18 +174,65 @@ export class CodexACPAgent implements acp.Agent {
172174

173175
private async onAgentMessage(sessionId: string, event: EventMsg) {
174176
switch (event.type) {
175-
case "agent_reasoning":
177+
case "agent_reasoning": {
178+
const session = this.sessions.get(sessionId);
179+
if (!session) break;
180+
181+
// Only send if we haven't seen delta events (non-streaming mode)
182+
if (!session.seenReasoningDeltas) {
183+
await this.connection.sessionUpdate({
184+
sessionId: sessionId,
185+
update: {
186+
sessionUpdate: "agent_thought_chunk",
187+
content: {
188+
type: "text",
189+
text: event.text
190+
}
191+
}
192+
});
193+
}
194+
// Reset the flag for next turn
195+
session.seenReasoningDeltas = false;
196+
break;
197+
}
198+
199+
case "reasoning_content_delta":
200+
case "reasoning_raw_content_delta": {
201+
const session = this.sessions.get(sessionId);
202+
if (!session) break;
203+
204+
session.seenReasoningDeltas = true;
205+
await this.connection.sessionUpdate({
206+
sessionId: sessionId,
207+
update: {
208+
sessionUpdate: "agent_thought_chunk",
209+
content: {
210+
type: "text",
211+
text: event.delta
212+
}
213+
}
214+
});
215+
break;
216+
}
217+
218+
case "agent_reasoning_section_break": {
219+
const session = this.sessions.get(sessionId);
220+
if (!session) break;
221+
222+
session.seenReasoningDeltas = true;
223+
// Send spacing for section break
176224
await this.connection.sessionUpdate({
177225
sessionId: sessionId,
178226
update: {
179227
sessionUpdate: "agent_thought_chunk",
180228
content: {
181229
type: "text",
182-
text: event.text
230+
text: "\n\n"
183231
}
184232
}
185233
});
186234
break;
235+
}
187236

188237
case "exec_command_begin":
189238
if (event.command[0] === "bash" || event.command[0] === "/bin/bash") {
@@ -276,8 +325,6 @@ export class CodexACPAgent implements acp.Agent {
276325
case "item_started":
277326
case "item_completed":
278327
case "agent_message_content_delta":
279-
case "reasoning_content_delta":
280-
case "reasoning_raw_content_delta":
281328
case "shutdown_complete":
282329
case "warning":
283330
case "task_started":
@@ -288,7 +335,6 @@ export class CodexACPAgent implements acp.Agent {
288335
case "agent_reasoning_delta":
289336
case "agent_reasoning_raw_content":
290337
case "agent_reasoning_raw_content_delta":
291-
case "agent_reasoning_section_break":
292338
case "session_configured":
293339
case "mcp_tool_call_begin":
294340
case "mcp_tool_call_end":

src/__tests__/CodexACPAgent/event-handling.test.ts

Lines changed: 0 additions & 110 deletions
This file was deleted.

0 commit comments

Comments
 (0)