happy-imou-cloud 2.1.39 → 2.1.40

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 (25) hide show
  1. package/dist/{BaseReasoningProcessor-BUTolvO5.cjs → BaseReasoningProcessor-C8w4XM-x.cjs} +2 -2
  2. package/dist/{BaseReasoningProcessor-Cbp6sIDm.mjs → BaseReasoningProcessor-e-2bxjFB.mjs} +2 -2
  3. package/dist/{ProviderSelectionHandler-B22eXuym.cjs → ProviderSelectionHandler-CCSEAoQk.cjs} +2 -2
  4. package/dist/{ProviderSelectionHandler-DrSgStLw.mjs → ProviderSelectionHandler-DI3-RSW_.mjs} +2 -2
  5. package/dist/{api-wcqkneTg.mjs → api-BEKN9moW.mjs} +61 -2
  6. package/dist/{api-BoeZDGwx.cjs → api-Ixv6TLYP.cjs} +61 -1
  7. package/dist/{command-CkYq_KwA.cjs → command-DycfJnzn.cjs} +2 -2
  8. package/dist/{command-DcgK0y3F.mjs → command-bEdScxsw.mjs} +2 -2
  9. package/dist/{index-B9mt95QV.mjs → index-CNIT6feF.mjs} +7 -7
  10. package/dist/{index-Cgor8CE7.cjs → index-Mvx4hucr.cjs} +10 -10
  11. package/dist/index.cjs +2 -2
  12. package/dist/index.mjs +2 -2
  13. package/dist/lib.cjs +1 -1
  14. package/dist/lib.d.cts +19 -4
  15. package/dist/lib.d.mts +19 -4
  16. package/dist/lib.mjs +1 -1
  17. package/dist/{registerKillSessionHandler-Buc97BEh.mjs → registerKillSessionHandler--KMYjyvz.mjs} +2 -2
  18. package/dist/{registerKillSessionHandler-DtXhn2Cd.cjs → registerKillSessionHandler-CqjocTSr.cjs} +2 -2
  19. package/dist/{runClaude-CwXQwmgw.cjs → runClaude-DFdTqEU8.cjs} +59 -5
  20. package/dist/{runClaude-BYKNCDEU.mjs → runClaude-V1hBSsrL.mjs} +59 -5
  21. package/dist/{runCodex-BkB_YKhV.cjs → runCodex-BMafN7eI.cjs} +34 -8
  22. package/dist/{runCodex-DqAddhDE.mjs → runCodex-goHWKOd0.mjs} +34 -8
  23. package/dist/{runGemini-3jkfOtlr.mjs → runGemini-BDorYx-I.mjs} +65 -7
  24. package/dist/{runGemini-B4uXPrue.cjs → runGemini-CQBCnzbz.cjs} +65 -7
  25. package/package.json +1 -1
@@ -1,10 +1,10 @@
1
1
  'use strict';
2
2
 
3
3
  var node_crypto = require('node:crypto');
4
- var persistence = require('./api-BoeZDGwx.cjs');
4
+ var persistence = require('./api-Ixv6TLYP.cjs');
5
5
  require('cross-spawn');
6
6
  require('@agentclientprotocol/sdk');
7
- var index = require('./index-Cgor8CE7.cjs');
7
+ var index = require('./index-Mvx4hucr.cjs');
8
8
  require('ps-list');
9
9
  require('fs');
10
10
  require('path');
@@ -25,9 +25,9 @@ require('tweetnacl');
25
25
  require('open');
26
26
  var React = require('react');
27
27
  var ink = require('ink');
28
- var ProviderSelectionHandler = require('./ProviderSelectionHandler-B22eXuym.cjs');
28
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-CCSEAoQk.cjs');
29
29
  var types = require('./types-DVk3crez.cjs');
30
- var registerKillSessionHandler = require('./registerKillSessionHandler-DtXhn2Cd.cjs');
30
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CqjocTSr.cjs');
31
31
  require('socket.io-client');
32
32
  require('expo-server-sdk');
33
33
  var node_util = require('node:util');
@@ -1000,6 +1000,7 @@ async function claudeAcpRemoteLauncher(session) {
1000
1000
  let currentModeHash = null;
1001
1001
  let pending = null;
1002
1002
  let accumulatedResponse = "";
1003
+ let currentAssistantStreamStartLength = 0;
1003
1004
  let accumulatedThinking = "";
1004
1005
  let isResponseInProgress = false;
1005
1006
  let taskStartedSent = false;
@@ -1008,6 +1009,8 @@ async function claudeAcpRemoteLauncher(session) {
1008
1009
  let shouldInjectHistoryOnNextSession = false;
1009
1010
  let unexpectedRuntimeStopRecovery = null;
1010
1011
  let readyAlreadySent = false;
1012
+ let currentHappyOrgTurn = null;
1013
+ const assistantMessageStream = new persistence.AssistantMessageStream();
1011
1014
  const permissionHandler = new ClaudeAcpPermissionHandler(session.client);
1012
1015
  const selectionHandler = new ProviderSelectionHandler.ProviderSelectionHandler(session.client, "Claude");
1013
1016
  const conversationHistory = new registerKillSessionHandler.ConversationHistory({
@@ -1059,13 +1062,35 @@ async function claudeAcpRemoteLauncher(session) {
1059
1062
  };
1060
1063
  const resetTurnState = () => {
1061
1064
  accumulatedResponse = "";
1065
+ currentAssistantStreamStartLength = 0;
1062
1066
  accumulatedThinking = "";
1063
1067
  isResponseInProgress = false;
1064
1068
  taskStartedSent = false;
1065
1069
  currentAssistantMessageId = null;
1066
1070
  currentThinkingMessageId = null;
1071
+ currentHappyOrgTurn = null;
1072
+ assistantMessageStream.reset();
1067
1073
  session.onThinkingChange(false);
1068
1074
  };
1075
+ const emitAssistantMessageDelta = (text) => {
1076
+ if (currentHappyOrgTurn) {
1077
+ return false;
1078
+ }
1079
+ if (!text.trim()) {
1080
+ return false;
1081
+ }
1082
+ if (!assistantMessageStream.hasActive()) {
1083
+ currentAssistantStreamStartLength = accumulatedResponse.length - text.length;
1084
+ }
1085
+ const stream = assistantMessageStream.delta();
1086
+ session.client.sendAgentMessage("claude", {
1087
+ type: "message",
1088
+ message: text,
1089
+ id: stream.messageId,
1090
+ ...stream
1091
+ });
1092
+ return true;
1093
+ };
1069
1094
  const emitPendingThinkingMessage = () => {
1070
1095
  const thinking = accumulatedThinking.trim();
1071
1096
  if (!thinking) {
@@ -1083,15 +1108,19 @@ async function claudeAcpRemoteLauncher(session) {
1083
1108
  if (!finalMessage) {
1084
1109
  accumulatedResponse = "";
1085
1110
  isResponseInProgress = false;
1111
+ assistantMessageStream.reset();
1086
1112
  return;
1087
1113
  }
1088
1114
  if (currentAssistantMessageId) {
1089
1115
  messageBuffer.updateMessage(currentAssistantMessageId, finalMessage, { mode: "replace" });
1090
1116
  }
1091
1117
  conversationHistory.addAssistantMessage(finalMessage);
1118
+ const hadActiveStream = assistantMessageStream.hasActive();
1119
+ const stream = hadActiveStream ? assistantMessageStream.commit() : null;
1092
1120
  session.client.sendAgentMessage("claude", {
1093
1121
  type: "message",
1094
- message: finalMessage
1122
+ message: hadActiveStream ? finalMessage.slice(currentAssistantStreamStartLength) : finalMessage,
1123
+ ...stream ? { id: stream.messageId, ...stream } : {}
1095
1124
  });
1096
1125
  session.client.sendClaudeSessionMessage({
1097
1126
  type: "assistant",
@@ -1109,8 +1138,29 @@ async function claudeAcpRemoteLauncher(session) {
1109
1138
  }
1110
1139
  });
1111
1140
  accumulatedResponse = "";
1141
+ currentAssistantStreamStartLength = 0;
1112
1142
  isResponseInProgress = false;
1113
1143
  };
1144
+ const commitActiveAssistantMessageStream = () => {
1145
+ if (!assistantMessageStream.hasActive()) {
1146
+ return false;
1147
+ }
1148
+ const finalMessage = accumulatedResponse.trim();
1149
+ if (!finalMessage) {
1150
+ assistantMessageStream.reset();
1151
+ currentAssistantStreamStartLength = accumulatedResponse.length;
1152
+ return false;
1153
+ }
1154
+ const stream = assistantMessageStream.commit();
1155
+ session.client.sendAgentMessage("claude", {
1156
+ type: "message",
1157
+ message: finalMessage.slice(currentAssistantStreamStartLength),
1158
+ id: stream.messageId,
1159
+ ...stream
1160
+ });
1161
+ currentAssistantStreamStartLength = accumulatedResponse.length;
1162
+ return true;
1163
+ };
1114
1164
  const disposeRuntimeHandle = async () => {
1115
1165
  if (!runtimeHandle) {
1116
1166
  return;
@@ -1188,6 +1238,7 @@ async function claudeAcpRemoteLauncher(session) {
1188
1238
  }
1189
1239
  }
1190
1240
  accumulatedResponse += text;
1241
+ emitAssistantMessageDelta(text);
1191
1242
  return;
1192
1243
  }
1193
1244
  case "status": {
@@ -1220,6 +1271,7 @@ async function claudeAcpRemoteLauncher(session) {
1220
1271
  return;
1221
1272
  }
1222
1273
  case "tool-call": {
1274
+ commitActiveAssistantMessageStream();
1223
1275
  emitPendingThinkingMessage();
1224
1276
  const toolArgs = index.truncateDisplayMessage(msg.args, 100);
1225
1277
  messageBuffer.addMessage(
@@ -1330,6 +1382,7 @@ ${systemPrompt}` : systemPrompt,
1330
1382
  const abortActiveTurn = async () => {
1331
1383
  const activeController = rotateAbortController();
1332
1384
  activeController.abort();
1385
+ assistantMessageStream.reset();
1333
1386
  session.onThinkingChange(false);
1334
1387
  if (runtimeHandle) {
1335
1388
  await runtimeHandle.cancel().catch((error) => {
@@ -1443,6 +1496,7 @@ ${systemPrompt}` : systemPrompt,
1443
1496
  let turnStatus = "task_complete";
1444
1497
  try {
1445
1498
  turnInFlight = true;
1499
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
1446
1500
  const activeRuntimeHandle = runtimeHandle ?? await createRuntimeHandle(message.mode);
1447
1501
  let promptToSend = message.message;
1448
1502
  if (shouldInjectHistoryOnNextSession && conversationHistory.hasHistory()) {
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { l as logger, h as backoff, j as delay, k as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError } from './api-wcqkneTg.mjs';
2
+ import { l as logger, j as backoff, k as delay, d as AssistantMessageStream, m as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError } from './api-BEKN9moW.mjs';
3
3
  import 'cross-spawn';
4
4
  import '@agentclientprotocol/sdk';
5
- import { n as getProjectPath, F as Future, o as claudeLocal, E as ExitCodeError, q as trimIdent, u as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, w as claudeCheckSession, x as projectPath, y as mapToClaudeMode, P as PushableAsyncIterable, z as query, A as AbortError, e as stopCaffeinate, p as publishSessionRegistration, B as getEnvironmentInfo, a as createSessionMetadata, C as startCaffeinate, b as closeProviderSession } from './index-B9mt95QV.mjs';
5
+ import { n as getProjectPath, F as Future, o as claudeLocal, E as ExitCodeError, q as trimIdent, u as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, w as claudeCheckSession, x as projectPath, y as mapToClaudeMode, P as PushableAsyncIterable, z as query, A as AbortError, e as stopCaffeinate, p as publishSessionRegistration, B as getEnvironmentInfo, a as createSessionMetadata, C as startCaffeinate, b as closeProviderSession } from './index-CNIT6feF.mjs';
6
6
  import 'ps-list';
7
7
  import 'fs';
8
8
  import 'path';
@@ -23,9 +23,9 @@ import 'tweetnacl';
23
23
  import 'open';
24
24
  import React, { useState, useRef, useEffect, useCallback } from 'react';
25
25
  import { useStdout, useInput, Box, Text, render } from 'ink';
26
- import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-DrSgStLw.mjs';
26
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-DI3-RSW_.mjs';
27
27
  import { R as RawJSONLinesSchema } from './types-CiliQpqS.mjs';
28
- import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurnWithBusinessAck, j as buildTurnResultPushNotification, k as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, o as renderTerminalOutputPreview, q as forwardAgentMessageToProviderSession, n as buildPermissionPushNotification, s as syncControlledByUserState, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler } from './registerKillSessionHandler-Buc97BEh.mjs';
28
+ import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurnWithBusinessAck, j as buildTurnResultPushNotification, k as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, o as renderTerminalOutputPreview, q as forwardAgentMessageToProviderSession, n as buildPermissionPushNotification, s as syncControlledByUserState, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler } from './registerKillSessionHandler--KMYjyvz.mjs';
29
29
  import 'socket.io-client';
30
30
  import 'expo-server-sdk';
31
31
  import { isDeepStrictEqual } from 'node:util';
@@ -998,6 +998,7 @@ async function claudeAcpRemoteLauncher(session) {
998
998
  let currentModeHash = null;
999
999
  let pending = null;
1000
1000
  let accumulatedResponse = "";
1001
+ let currentAssistantStreamStartLength = 0;
1001
1002
  let accumulatedThinking = "";
1002
1003
  let isResponseInProgress = false;
1003
1004
  let taskStartedSent = false;
@@ -1006,6 +1007,8 @@ async function claudeAcpRemoteLauncher(session) {
1006
1007
  let shouldInjectHistoryOnNextSession = false;
1007
1008
  let unexpectedRuntimeStopRecovery = null;
1008
1009
  let readyAlreadySent = false;
1010
+ let currentHappyOrgTurn = null;
1011
+ const assistantMessageStream = new AssistantMessageStream();
1009
1012
  const permissionHandler = new ClaudeAcpPermissionHandler(session.client);
1010
1013
  const selectionHandler = new ProviderSelectionHandler(session.client, "Claude");
1011
1014
  const conversationHistory = new ConversationHistory$1({
@@ -1057,13 +1060,35 @@ async function claudeAcpRemoteLauncher(session) {
1057
1060
  };
1058
1061
  const resetTurnState = () => {
1059
1062
  accumulatedResponse = "";
1063
+ currentAssistantStreamStartLength = 0;
1060
1064
  accumulatedThinking = "";
1061
1065
  isResponseInProgress = false;
1062
1066
  taskStartedSent = false;
1063
1067
  currentAssistantMessageId = null;
1064
1068
  currentThinkingMessageId = null;
1069
+ currentHappyOrgTurn = null;
1070
+ assistantMessageStream.reset();
1065
1071
  session.onThinkingChange(false);
1066
1072
  };
1073
+ const emitAssistantMessageDelta = (text) => {
1074
+ if (currentHappyOrgTurn) {
1075
+ return false;
1076
+ }
1077
+ if (!text.trim()) {
1078
+ return false;
1079
+ }
1080
+ if (!assistantMessageStream.hasActive()) {
1081
+ currentAssistantStreamStartLength = accumulatedResponse.length - text.length;
1082
+ }
1083
+ const stream = assistantMessageStream.delta();
1084
+ session.client.sendAgentMessage("claude", {
1085
+ type: "message",
1086
+ message: text,
1087
+ id: stream.messageId,
1088
+ ...stream
1089
+ });
1090
+ return true;
1091
+ };
1067
1092
  const emitPendingThinkingMessage = () => {
1068
1093
  const thinking = accumulatedThinking.trim();
1069
1094
  if (!thinking) {
@@ -1081,15 +1106,19 @@ async function claudeAcpRemoteLauncher(session) {
1081
1106
  if (!finalMessage) {
1082
1107
  accumulatedResponse = "";
1083
1108
  isResponseInProgress = false;
1109
+ assistantMessageStream.reset();
1084
1110
  return;
1085
1111
  }
1086
1112
  if (currentAssistantMessageId) {
1087
1113
  messageBuffer.updateMessage(currentAssistantMessageId, finalMessage, { mode: "replace" });
1088
1114
  }
1089
1115
  conversationHistory.addAssistantMessage(finalMessage);
1116
+ const hadActiveStream = assistantMessageStream.hasActive();
1117
+ const stream = hadActiveStream ? assistantMessageStream.commit() : null;
1090
1118
  session.client.sendAgentMessage("claude", {
1091
1119
  type: "message",
1092
- message: finalMessage
1120
+ message: hadActiveStream ? finalMessage.slice(currentAssistantStreamStartLength) : finalMessage,
1121
+ ...stream ? { id: stream.messageId, ...stream } : {}
1093
1122
  });
1094
1123
  session.client.sendClaudeSessionMessage({
1095
1124
  type: "assistant",
@@ -1107,8 +1136,29 @@ async function claudeAcpRemoteLauncher(session) {
1107
1136
  }
1108
1137
  });
1109
1138
  accumulatedResponse = "";
1139
+ currentAssistantStreamStartLength = 0;
1110
1140
  isResponseInProgress = false;
1111
1141
  };
1142
+ const commitActiveAssistantMessageStream = () => {
1143
+ if (!assistantMessageStream.hasActive()) {
1144
+ return false;
1145
+ }
1146
+ const finalMessage = accumulatedResponse.trim();
1147
+ if (!finalMessage) {
1148
+ assistantMessageStream.reset();
1149
+ currentAssistantStreamStartLength = accumulatedResponse.length;
1150
+ return false;
1151
+ }
1152
+ const stream = assistantMessageStream.commit();
1153
+ session.client.sendAgentMessage("claude", {
1154
+ type: "message",
1155
+ message: finalMessage.slice(currentAssistantStreamStartLength),
1156
+ id: stream.messageId,
1157
+ ...stream
1158
+ });
1159
+ currentAssistantStreamStartLength = accumulatedResponse.length;
1160
+ return true;
1161
+ };
1112
1162
  const disposeRuntimeHandle = async () => {
1113
1163
  if (!runtimeHandle) {
1114
1164
  return;
@@ -1186,6 +1236,7 @@ async function claudeAcpRemoteLauncher(session) {
1186
1236
  }
1187
1237
  }
1188
1238
  accumulatedResponse += text;
1239
+ emitAssistantMessageDelta(text);
1189
1240
  return;
1190
1241
  }
1191
1242
  case "status": {
@@ -1218,6 +1269,7 @@ async function claudeAcpRemoteLauncher(session) {
1218
1269
  return;
1219
1270
  }
1220
1271
  case "tool-call": {
1272
+ commitActiveAssistantMessageStream();
1221
1273
  emitPendingThinkingMessage();
1222
1274
  const toolArgs = truncateDisplayMessage(msg.args, 100);
1223
1275
  messageBuffer.addMessage(
@@ -1328,6 +1380,7 @@ ${systemPrompt}` : systemPrompt,
1328
1380
  const abortActiveTurn = async () => {
1329
1381
  const activeController = rotateAbortController();
1330
1382
  activeController.abort();
1383
+ assistantMessageStream.reset();
1331
1384
  session.onThinkingChange(false);
1332
1385
  if (runtimeHandle) {
1333
1386
  await runtimeHandle.cancel().catch((error) => {
@@ -1441,6 +1494,7 @@ ${systemPrompt}` : systemPrompt,
1441
1494
  let turnStatus = "task_complete";
1442
1495
  try {
1443
1496
  turnInFlight = true;
1497
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
1444
1498
  const activeRuntimeHandle = runtimeHandle ?? await createRuntimeHandle(message.mode);
1445
1499
  let promptToSend = message.message;
1446
1500
  if (shouldInjectHistoryOnNextSession && conversationHistory.hasHistory()) {
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var persistence = require('./api-BoeZDGwx.cjs');
4
- var registerKillSessionHandler = require('./registerKillSessionHandler-DtXhn2Cd.cjs');
5
- var index = require('./index-Cgor8CE7.cjs');
3
+ var persistence = require('./api-Ixv6TLYP.cjs');
4
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CqjocTSr.cjs');
5
+ var index = require('./index-Mvx4hucr.cjs');
6
6
  require('cross-spawn');
7
7
  require('@agentclientprotocol/sdk');
8
8
  var node_crypto = require('node:crypto');
@@ -26,8 +26,8 @@ require('tweetnacl');
26
26
  require('open');
27
27
  var React = require('react');
28
28
  var ink = require('ink');
29
- var ProviderSelectionHandler = require('./ProviderSelectionHandler-B22eXuym.cjs');
30
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-BUTolvO5.cjs');
29
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-CCSEAoQk.cjs');
30
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-C8w4XM-x.cjs');
31
31
  require('zod');
32
32
  require('socket.io-client');
33
33
  require('expo-server-sdk');
@@ -708,6 +708,7 @@ async function codexRemoteLauncher(session) {
708
708
  let readyAlreadySent = false;
709
709
  let accumulatedResponse = "";
710
710
  let emittedResponseLength = 0;
711
+ let currentAssistantStreamStartLength = 0;
711
712
  let isResponseInProgress = false;
712
713
  let taskStartedSent = false;
713
714
  let shouldInjectHistoryOnNextSession = false;
@@ -717,6 +718,7 @@ async function codexRemoteLauncher(session) {
717
718
  let currentThinkingMessageId = null;
718
719
  let currentHappyOrgTurn = null;
719
720
  let unexpectedRuntimeStopRecovery = null;
721
+ const assistantMessageStream = new persistence.AssistantMessageStream();
720
722
  const permissionHandler = new CodexPermissionHandler(session.client);
721
723
  const selectionHandler = new CodexSelectionHandler(session.client);
722
724
  const conversationHistory = new registerKillSessionHandler.ConversationHistory({ maxMessages: 20, maxCharacters: 5e4 });
@@ -752,18 +754,21 @@ async function codexRemoteLauncher(session) {
752
754
  reasoningProcessor.abort();
753
755
  accumulatedResponse = "";
754
756
  emittedResponseLength = 0;
757
+ currentAssistantStreamStartLength = 0;
755
758
  isResponseInProgress = false;
756
759
  taskStartedSent = false;
757
760
  shouldCommitAccumulatedResponse = false;
758
761
  currentAssistantMessageId = null;
759
762
  currentThinkingMessageId = null;
760
763
  currentHappyOrgTurn = null;
764
+ assistantMessageStream.reset();
761
765
  session.onThinkingChange(false);
762
766
  };
763
767
  const abortActiveTurn = () => {
764
768
  const activeController = rotateAbortController();
765
769
  activeController.abort();
766
770
  reasoningProcessor.abort();
771
+ assistantMessageStream.reset();
767
772
  session.onThinkingChange(false);
768
773
  if (runtimeHandle) {
769
774
  void runtimeHandle.cancel().catch((error) => {
@@ -796,6 +801,7 @@ async function codexRemoteLauncher(session) {
796
801
  message,
797
802
  id: node_crypto.randomUUID()
798
803
  });
804
+ assistantMessageStream.reset();
799
805
  };
800
806
  const emitTurnReport = (report) => {
801
807
  session.runtimeSession.sendCodexMessage({
@@ -867,18 +873,37 @@ async function codexRemoteLauncher(session) {
867
873
  if (currentHappyOrgTurn && !opts?.force) {
868
874
  return false;
869
875
  }
870
- const nextMessage = accumulatedResponse.slice(emittedResponseLength);
876
+ const hadActiveStream = assistantMessageStream.hasActive();
877
+ if (!opts?.force && !hadActiveStream) {
878
+ currentAssistantStreamStartLength = emittedResponseLength;
879
+ }
880
+ const nextMessage = opts?.force && hadActiveStream ? accumulatedResponse.slice(currentAssistantStreamStartLength) : opts?.force ? accumulatedResponse : accumulatedResponse.slice(emittedResponseLength);
871
881
  if (!nextMessage.trim()) {
882
+ if (opts?.force) {
883
+ assistantMessageStream.reset();
884
+ currentAssistantStreamStartLength = emittedResponseLength;
885
+ }
872
886
  return false;
873
887
  }
888
+ const stream = opts?.force ? assistantMessageStream.commit() : assistantMessageStream.delta();
874
889
  session.runtimeSession.sendCodexMessage({
875
890
  type: "message",
876
891
  message: nextMessage,
877
- id: node_crypto.randomUUID()
892
+ id: stream.messageId,
893
+ ...stream
878
894
  });
879
895
  emittedResponseLength = accumulatedResponse.length;
896
+ if (opts?.force) {
897
+ currentAssistantStreamStartLength = emittedResponseLength;
898
+ }
880
899
  return true;
881
900
  };
901
+ const commitActiveAssistantMessageStream = () => {
902
+ if (!assistantMessageStream.hasActive()) {
903
+ return false;
904
+ }
905
+ return emitPendingAssistantMessageDelta({ force: true });
906
+ };
882
907
  const setupRuntimeMessageHandler = (activeRuntimeHandle) => {
883
908
  const forwardAgentMessage = (agentMessage) => {
884
909
  registerKillSessionHandler.forwardAgentMessageToProviderSession(agentMessage, {
@@ -909,6 +934,7 @@ async function codexRemoteLauncher(session) {
909
934
  }
910
935
  }
911
936
  accumulatedResponse += text;
937
+ emitPendingAssistantMessageDelta();
912
938
  return;
913
939
  }
914
940
  case "status": {
@@ -942,7 +968,7 @@ async function codexRemoteLauncher(session) {
942
968
  return;
943
969
  }
944
970
  case "tool-call": {
945
- emitPendingAssistantMessageDelta();
971
+ commitActiveAssistantMessageStream();
946
972
  const toolArgs = hasRenderableToolPayload(msg.args) ? index.truncateDisplayMessage(msg.args, 100) : "";
947
973
  messageBuffer.addMessage(
948
974
  `Executing: ${msg.toolName}${toolArgs ? ` ${toolArgs}` : ""}`,
@@ -1,6 +1,6 @@
1
- import { p as preserveSessionRuntimeMetadata, l as logger, b as connectionState, A as ApiClient } from './api-wcqkneTg.mjs';
2
- import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurnWithBusinessAck, j as buildTurnResultPushNotification, c as registerKillSessionHandler, k as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, m as extractPermissionRequestPushContext, n as buildPermissionPushNotification, o as renderTerminalOutputPreview, p as inferToolResultError, q as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-Buc97BEh.mjs';
3
- import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-B9mt95QV.mjs';
1
+ import { p as preserveSessionRuntimeMetadata, l as logger, d as AssistantMessageStream, b as connectionState, A as ApiClient } from './api-BEKN9moW.mjs';
2
+ import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurnWithBusinessAck, j as buildTurnResultPushNotification, c as registerKillSessionHandler, k as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, m as extractPermissionRequestPushContext, n as buildPermissionPushNotification, o as renderTerminalOutputPreview, p as inferToolResultError, q as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler--KMYjyvz.mjs';
3
+ import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-CNIT6feF.mjs';
4
4
  import 'cross-spawn';
5
5
  import '@agentclientprotocol/sdk';
6
6
  import { randomUUID } from 'node:crypto';
@@ -24,8 +24,8 @@ import 'tweetnacl';
24
24
  import 'open';
25
25
  import React, { useState, useRef, useEffect, useCallback } from 'react';
26
26
  import { useStdout, useInput, Box, Text, render } from 'ink';
27
- import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-DrSgStLw.mjs';
28
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-Cbp6sIDm.mjs';
27
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-DI3-RSW_.mjs';
28
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-e-2bxjFB.mjs';
29
29
  import 'zod';
30
30
  import 'socket.io-client';
31
31
  import 'expo-server-sdk';
@@ -706,6 +706,7 @@ async function codexRemoteLauncher(session) {
706
706
  let readyAlreadySent = false;
707
707
  let accumulatedResponse = "";
708
708
  let emittedResponseLength = 0;
709
+ let currentAssistantStreamStartLength = 0;
709
710
  let isResponseInProgress = false;
710
711
  let taskStartedSent = false;
711
712
  let shouldInjectHistoryOnNextSession = false;
@@ -715,6 +716,7 @@ async function codexRemoteLauncher(session) {
715
716
  let currentThinkingMessageId = null;
716
717
  let currentHappyOrgTurn = null;
717
718
  let unexpectedRuntimeStopRecovery = null;
719
+ const assistantMessageStream = new AssistantMessageStream();
718
720
  const permissionHandler = new CodexPermissionHandler(session.client);
719
721
  const selectionHandler = new CodexSelectionHandler(session.client);
720
722
  const conversationHistory = new ConversationHistory$1({ maxMessages: 20, maxCharacters: 5e4 });
@@ -750,18 +752,21 @@ async function codexRemoteLauncher(session) {
750
752
  reasoningProcessor.abort();
751
753
  accumulatedResponse = "";
752
754
  emittedResponseLength = 0;
755
+ currentAssistantStreamStartLength = 0;
753
756
  isResponseInProgress = false;
754
757
  taskStartedSent = false;
755
758
  shouldCommitAccumulatedResponse = false;
756
759
  currentAssistantMessageId = null;
757
760
  currentThinkingMessageId = null;
758
761
  currentHappyOrgTurn = null;
762
+ assistantMessageStream.reset();
759
763
  session.onThinkingChange(false);
760
764
  };
761
765
  const abortActiveTurn = () => {
762
766
  const activeController = rotateAbortController();
763
767
  activeController.abort();
764
768
  reasoningProcessor.abort();
769
+ assistantMessageStream.reset();
765
770
  session.onThinkingChange(false);
766
771
  if (runtimeHandle) {
767
772
  void runtimeHandle.cancel().catch((error) => {
@@ -794,6 +799,7 @@ async function codexRemoteLauncher(session) {
794
799
  message,
795
800
  id: randomUUID()
796
801
  });
802
+ assistantMessageStream.reset();
797
803
  };
798
804
  const emitTurnReport = (report) => {
799
805
  session.runtimeSession.sendCodexMessage({
@@ -865,18 +871,37 @@ async function codexRemoteLauncher(session) {
865
871
  if (currentHappyOrgTurn && !opts?.force) {
866
872
  return false;
867
873
  }
868
- const nextMessage = accumulatedResponse.slice(emittedResponseLength);
874
+ const hadActiveStream = assistantMessageStream.hasActive();
875
+ if (!opts?.force && !hadActiveStream) {
876
+ currentAssistantStreamStartLength = emittedResponseLength;
877
+ }
878
+ const nextMessage = opts?.force && hadActiveStream ? accumulatedResponse.slice(currentAssistantStreamStartLength) : opts?.force ? accumulatedResponse : accumulatedResponse.slice(emittedResponseLength);
869
879
  if (!nextMessage.trim()) {
880
+ if (opts?.force) {
881
+ assistantMessageStream.reset();
882
+ currentAssistantStreamStartLength = emittedResponseLength;
883
+ }
870
884
  return false;
871
885
  }
886
+ const stream = opts?.force ? assistantMessageStream.commit() : assistantMessageStream.delta();
872
887
  session.runtimeSession.sendCodexMessage({
873
888
  type: "message",
874
889
  message: nextMessage,
875
- id: randomUUID()
890
+ id: stream.messageId,
891
+ ...stream
876
892
  });
877
893
  emittedResponseLength = accumulatedResponse.length;
894
+ if (opts?.force) {
895
+ currentAssistantStreamStartLength = emittedResponseLength;
896
+ }
878
897
  return true;
879
898
  };
899
+ const commitActiveAssistantMessageStream = () => {
900
+ if (!assistantMessageStream.hasActive()) {
901
+ return false;
902
+ }
903
+ return emitPendingAssistantMessageDelta({ force: true });
904
+ };
880
905
  const setupRuntimeMessageHandler = (activeRuntimeHandle) => {
881
906
  const forwardAgentMessage = (agentMessage) => {
882
907
  forwardAgentMessageToProviderSession(agentMessage, {
@@ -907,6 +932,7 @@ async function codexRemoteLauncher(session) {
907
932
  }
908
933
  }
909
934
  accumulatedResponse += text;
935
+ emitPendingAssistantMessageDelta();
910
936
  return;
911
937
  }
912
938
  case "status": {
@@ -940,7 +966,7 @@ async function codexRemoteLauncher(session) {
940
966
  return;
941
967
  }
942
968
  case "tool-call": {
943
- emitPendingAssistantMessageDelta();
969
+ commitActiveAssistantMessageStream();
944
970
  const toolArgs = hasRenderableToolPayload(msg.args) ? truncateDisplayMessage(msg.args, 100) : "";
945
971
  messageBuffer.addMessage(
946
972
  `Executing: ${msg.toolName}${toolArgs ? ` ${toolArgs}` : ""}`,