happy-imou-cloud 2.0.20 → 2.0.21

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 (28) hide show
  1. package/dist/{BaseReasoningProcessor-B9z785Pi.cjs → BaseReasoningProcessor-0nj-PMFc.cjs} +3 -3
  2. package/dist/{BaseReasoningProcessor-iTk5q5Vy.mjs → BaseReasoningProcessor-DnVC7liC.mjs} +3 -3
  3. package/dist/{ProviderSelectionHandler-DUBEXkmo.cjs → ProviderSelectionHandler-Bafuy28L.cjs} +2 -2
  4. package/dist/{ProviderSelectionHandler-s79sTquD.mjs → ProviderSelectionHandler-R-2r7ItM.mjs} +2 -2
  5. package/dist/{api-_Y2kzqZL.mjs → api-DJe9WP9M.mjs} +77 -4
  6. package/dist/{api-BKnzORe4.cjs → api-MGlKcEf3.cjs} +78 -3
  7. package/dist/{command-BDkgHdQU.mjs → command-CfyFnMv2.mjs} +3 -3
  8. package/dist/{command-BBNzMWEG.cjs → command-DAlFmWmr.cjs} +3 -3
  9. package/dist/{index-Bg4KLXYY.mjs → index-CHXCgpwi.mjs} +8 -8
  10. package/dist/{index-0TIyXMQu.cjs → index-CgVjDJpt.cjs} +11 -11
  11. package/dist/index.cjs +3 -3
  12. package/dist/index.mjs +3 -3
  13. package/dist/lib.cjs +1 -1
  14. package/dist/lib.d.cts +393 -36
  15. package/dist/lib.d.mts +393 -36
  16. package/dist/lib.mjs +1 -1
  17. package/dist/{persistence-BCkHc68b.mjs → persistence-CkP90vEt.mjs} +1 -1
  18. package/dist/{persistence-D5uolhHo.cjs → persistence-DLFUNI9q.cjs} +1 -1
  19. package/dist/{registerKillSessionHandler-BMUE5Oaj.cjs → registerKillSessionHandler-Cs_INk4A.cjs} +356 -3
  20. package/dist/{registerKillSessionHandler-DJMH-gar.mjs → registerKillSessionHandler-DsHTZDsU.mjs} +354 -4
  21. package/dist/{runClaude-BUhD2jR2.cjs → runClaude-BGSgcyUp.cjs} +72 -9
  22. package/dist/{runClaude-BMv-eao6.mjs → runClaude-DAQAEmHe.mjs} +72 -9
  23. package/dist/{runCodex-DwnLnXWK.mjs → runCodex-B2UpSn82.mjs} +84 -14
  24. package/dist/{runCodex-DyNSDN6X.cjs → runCodex-earICaxw.cjs} +84 -14
  25. package/dist/{runGemini-uVHDcJ09.mjs → runGemini-BBUmH1Qh.mjs} +73 -9
  26. package/dist/{runGemini-UKpRbyNY.cjs → runGemini-D5RAIaR0.cjs} +73 -9
  27. package/package.json +1 -1
  28. package/scripts/release-smoke.mjs +3 -3
@@ -1,8 +1,8 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { l as logger, d as backoff, f as delay, g as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError } from './api-_Y2kzqZL.mjs';
2
+ import { l as logger, f as backoff, g as delay, h as AsyncLock, c as configuration, s as startOfflineReconnection, b as connectionState, A as ApiClient, i as isAuthenticationRequiredError } from './api-DJe9WP9M.mjs';
3
3
  import 'cross-spawn';
4
4
  import '@agentclientprotocol/sdk';
5
- import { j as getProjectPath, F as Future, k as claudeLocal, E as ExitCodeError, l as trimIdent, m as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, n as claudeCheckSession, e as projectPath, o as mapToClaudeMode, P as PushableAsyncIterable, q as query, A as AbortError, b as stopCaffeinate, p as publishSessionRegistration, u as getEnvironmentInfo, w as startCaffeinate } from './index-Bg4KLXYY.mjs';
5
+ import { j as getProjectPath, F as Future, k as claudeLocal, E as ExitCodeError, l as trimIdent, m as createClaudeBackend, f as formatDisplayMessage, t as truncateDisplayMessage, n as claudeCheckSession, e as projectPath, o as mapToClaudeMode, P as PushableAsyncIterable, q as query, A as AbortError, b as stopCaffeinate, p as publishSessionRegistration, u as getEnvironmentInfo, w as startCaffeinate } from './index-CHXCgpwi.mjs';
6
6
  import 'ps-list';
7
7
  import 'fs';
8
8
  import 'path';
@@ -13,7 +13,7 @@ import { dirname, basename, join, resolve } from 'node:path';
13
13
  import { homedir } from 'node:os';
14
14
  import { execSync } from 'node:child_process';
15
15
  import 'node:readline';
16
- import './persistence-BCkHc68b.mjs';
16
+ import './persistence-CkP90vEt.mjs';
17
17
  import { readFile } from 'node:fs/promises';
18
18
  import { stat, watch, access } from 'fs/promises';
19
19
  import 'crypto';
@@ -24,9 +24,9 @@ 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-s79sTquD.mjs';
27
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-R-2r7ItM.mjs';
28
28
  import { R as RawJSONLinesSchema } from './types-CiliQpqS.mjs';
29
- import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, w as waitForResponseCompleteWithAbort, l as launchRuntimeHandleWithFactoryResult, j as forwardAgentMessageToProviderSession, s as syncControlledByUserState, e as ensureManagedProviderMachine, M as MissingMachineIdError, c as createSessionMetadata, b as MessageQueue2, h as hashObject, r as registerKillSessionHandler, f as closeProviderSession } from './registerKillSessionHandler-DJMH-gar.mjs';
29
+ import { B as BasePermissionHandler, d as MessageBuffer, C as ConversationHistory$1, i as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, j as finalizeHappyOrgTurn, l as launchRuntimeHandleWithFactoryResult, n as forwardAgentMessageToProviderSession, s as syncControlledByUserState, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, c as createSessionMetadata, b as MessageQueue2, h as hashObject, f as registerKillSessionHandler, k as closeProviderSession } from './registerKillSessionHandler-DsHTZDsU.mjs';
30
30
  import 'socket.io-client';
31
31
  import 'expo-server-sdk';
32
32
  import { isDeepStrictEqual } from 'node:util';
@@ -1038,6 +1038,13 @@ async function claudeAcpRemoteLauncher(session) {
1038
1038
  message
1039
1039
  });
1040
1040
  };
1041
+ const emitTurnReport = (report) => {
1042
+ session.client.sendAgentMessage("claude", {
1043
+ type: "turn-report",
1044
+ id: randomUUID(),
1045
+ report
1046
+ });
1047
+ };
1041
1048
  const resetTurnState = () => {
1042
1049
  accumulatedResponse = "";
1043
1050
  isResponseInProgress = false;
@@ -1046,13 +1053,16 @@ async function claudeAcpRemoteLauncher(session) {
1046
1053
  currentThinkingMessageId = null;
1047
1054
  session.onThinkingChange(false);
1048
1055
  };
1049
- const emitFinalAssistantMessage = () => {
1050
- const finalMessage = accumulatedResponse.trim();
1056
+ const emitFinalAssistantMessage = (finalMessageText) => {
1057
+ const finalMessage = (finalMessageText ?? accumulatedResponse).trim();
1051
1058
  if (!finalMessage) {
1052
1059
  accumulatedResponse = "";
1053
1060
  isResponseInProgress = false;
1054
1061
  return;
1055
1062
  }
1063
+ if (currentAssistantMessageId) {
1064
+ messageBuffer.updateMessage(currentAssistantMessageId, finalMessage, { mode: "replace" });
1065
+ }
1056
1066
  conversationHistory.addAssistantMessage(finalMessage);
1057
1067
  session.client.sendAgentMessage("claude", {
1058
1068
  type: "message",
@@ -1364,6 +1374,7 @@ ${systemPrompt}` : systemPrompt,
1364
1374
  permissionHandler.setPermissionMode(message.mode.permissionMode);
1365
1375
  messageBuffer.addMessage(message.message, "user");
1366
1376
  let shouldClearHistoryAfterTurn = false;
1377
+ let turnStatus = "task_complete";
1367
1378
  try {
1368
1379
  const activeRuntimeHandle = runtimeHandle ?? await createRuntimeHandle(message.mode);
1369
1380
  let promptToSend = message.message;
@@ -1374,6 +1385,9 @@ ${systemPrompt}` : systemPrompt,
1374
1385
  promptToSend = historyContext + promptToSend;
1375
1386
  logger.debug(`[ClaudeACP] Injected conversation history context (${historyContext.length} chars)`);
1376
1387
  }
1388
+ if (message.mode.happyOrg) {
1389
+ promptToSend = buildHappyOrgTurnPrompt(promptToSend, message.mode.happyOrg);
1390
+ }
1377
1391
  if (specialCommand.type === "compact") {
1378
1392
  emitStatusMessage("Compaction started");
1379
1393
  }
@@ -1387,6 +1401,7 @@ ${systemPrompt}` : systemPrompt,
1387
1401
  const isAbortError = error instanceof Error && error.name === "AbortError";
1388
1402
  const isExpectedInterruption = isAbortError || abortController.signal.aborted || shouldExit;
1389
1403
  if (isExpectedInterruption) {
1404
+ turnStatus = "turn_aborted";
1390
1405
  session.client.sendAgentMessage("claude", {
1391
1406
  type: "turn_aborted",
1392
1407
  id: randomUUID()
@@ -1403,7 +1418,23 @@ ${systemPrompt}` : systemPrompt,
1403
1418
  currentModeHash = null;
1404
1419
  }
1405
1420
  } finally {
1406
- emitFinalAssistantMessage();
1421
+ const finalizedTurn = finalizeHappyOrgTurn({
1422
+ metadata: session.client.getMetadataSnapshot?.() ?? null,
1423
+ queuedTurn: message.mode.happyOrg,
1424
+ responseText: accumulatedResponse,
1425
+ turnStatus
1426
+ });
1427
+ if (finalizedTurn.nextMetadata && typeof session.client.updateMetadata === "function") {
1428
+ session.client.updateMetadata(() => finalizedTurn.nextMetadata);
1429
+ }
1430
+ if (finalizedTurn.report) {
1431
+ emitTurnReport(finalizedTurn.report);
1432
+ }
1433
+ if (finalizedTurn.terminateMessage) {
1434
+ emitStatusMessage(finalizedTurn.terminateMessage);
1435
+ }
1436
+ accumulatedResponse = finalizedTurn.cleanedText;
1437
+ emitFinalAssistantMessage(finalizedTurn.cleanedText);
1407
1438
  if (shouldClearHistoryAfterTurn) {
1408
1439
  conversationHistory.clear();
1409
1440
  emitStatusMessage("Compaction completed");
@@ -3128,8 +3159,28 @@ function resolveClaudeQueuedMessage(message, currentState) {
3128
3159
  function bindClaudeUserMessageQueue(opts) {
3129
3160
  let currentState = { ...opts.initialState };
3130
3161
  opts.session.onUserMessage((message) => {
3162
+ const happyOrgResult = opts.happyOrg ? resolveHappyOrgQueuedTurn({
3163
+ metadata: opts.happyOrg.getMetadata(),
3164
+ message
3165
+ }) : {
3166
+ nextMetadata: null,
3167
+ queuedTurn: null,
3168
+ blocked: false,
3169
+ statusMessage: void 0
3170
+ };
3171
+ if (opts.happyOrg && happyOrgResult.nextMetadata) {
3172
+ opts.happyOrg.updateMetadata(() => happyOrgResult.nextMetadata);
3173
+ }
3174
+ if (happyOrgResult.blocked) {
3175
+ if (happyOrgResult.statusMessage) {
3176
+ opts.happyOrg?.emitStatusMessage(happyOrgResult.statusMessage);
3177
+ }
3178
+ logger.debugLargeJson("[claude] User message blocked by Happy Org runtime:", message);
3179
+ return;
3180
+ }
3131
3181
  const { nextState, queuedMessage } = resolveClaudeQueuedMessage(message, currentState);
3132
3182
  currentState = nextState;
3183
+ queuedMessage.mode.happyOrg = happyOrgResult.queuedTurn;
3133
3184
  if (queuedMessage.isolate) {
3134
3185
  logger.debug(`[claude] Queuing isolated special command: ${queuedMessage.specialCommand}`);
3135
3186
  opts.messageQueue.pushIsolateAndClear(queuedMessage.text, queuedMessage.mode);
@@ -3234,7 +3285,14 @@ async function runClaude(credentials, options = {}) {
3234
3285
  customSystemPrompt: mode.customSystemPrompt,
3235
3286
  appendSystemPrompt: mode.appendSystemPrompt,
3236
3287
  allowedTools: mode.allowedTools,
3237
- disallowedTools: mode.disallowedTools
3288
+ disallowedTools: mode.disallowedTools,
3289
+ happyOrg: mode.happyOrg ? {
3290
+ taskId: mode.happyOrg.context.taskId,
3291
+ organizationId: mode.happyOrg.context.organizationId,
3292
+ memberAgentId: mode.happyOrg.context.memberAgentId,
3293
+ supervisorAgentId: mode.happyOrg.context.supervisorAgentId,
3294
+ reopenContext: mode.happyOrg.reopenContext ?? null
3295
+ } : null
3238
3296
  }));
3239
3297
  bindClaudeUserMessageQueue({
3240
3298
  session,
@@ -3242,6 +3300,11 @@ async function runClaude(credentials, options = {}) {
3242
3300
  initialState: {
3243
3301
  permissionMode: options.permissionMode,
3244
3302
  model: options.model
3303
+ },
3304
+ happyOrg: {
3305
+ getMetadata: () => session.getMetadataSnapshot(),
3306
+ updateMetadata: (handler) => session.updateMetadata(handler),
3307
+ emitStatusMessage: (message) => session.sendSessionEvent({ type: "message", message })
3245
3308
  }
3246
3309
  });
3247
3310
  const cleanup = async () => {
@@ -1,7 +1,7 @@
1
1
  import { randomUUID } from 'node:crypto';
2
- import { l as logger, b as connectionState, A as ApiClient } from './api-_Y2kzqZL.mjs';
3
- import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, w as waitForResponseCompleteWithAbort, r as registerKillSessionHandler, l as launchRuntimeHandleWithFactoryResult, i as inferToolResultError, j as forwardAgentMessageToProviderSession, f as closeProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, s as syncControlledByUserState } from './registerKillSessionHandler-DJMH-gar.mjs';
4
- import { f as formatDisplayMessage, v as validateCodexAcpSpawn, d as createCodexBackend, t as truncateDisplayMessage, b as stopCaffeinate } from './index-Bg4KLXYY.mjs';
2
+ import { l as logger, b as connectionState, A as ApiClient } from './api-DJe9WP9M.mjs';
3
+ import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, i as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, j as finalizeHappyOrgTurn, f as registerKillSessionHandler, l as launchRuntimeHandleWithFactoryResult, m as inferToolResultError, n as forwardAgentMessageToProviderSession, k as closeProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-DsHTZDsU.mjs';
4
+ import { f as formatDisplayMessage, v as validateCodexAcpSpawn, d as createCodexBackend, t as truncateDisplayMessage, b as stopCaffeinate } from './index-CHXCgpwi.mjs';
5
5
  import 'cross-spawn';
6
6
  import '@agentclientprotocol/sdk';
7
7
  import 'ps-list';
@@ -14,7 +14,7 @@ import 'node:path';
14
14
  import 'node:os';
15
15
  import 'node:child_process';
16
16
  import 'node:readline';
17
- import './persistence-BCkHc68b.mjs';
17
+ import './persistence-CkP90vEt.mjs';
18
18
  import 'node:fs/promises';
19
19
  import 'fs/promises';
20
20
  import 'crypto';
@@ -25,8 +25,8 @@ import 'tweetnacl';
25
25
  import 'open';
26
26
  import React, { useState, useRef, useEffect, useCallback } from 'react';
27
27
  import { useStdout, useInput, Box, Text, render } from 'ink';
28
- import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-s79sTquD.mjs';
29
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-iTk5q5Vy.mjs';
28
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-R-2r7ItM.mjs';
29
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-DnVC7liC.mjs';
30
30
  import 'zod';
31
31
  import 'socket.io-client';
32
32
  import 'expo-server-sdk';
@@ -486,7 +486,16 @@ function resolveCodexAcpExecutionMode(mode) {
486
486
  };
487
487
  }
488
488
  function getCodexExecutionFingerprint(mode) {
489
- return hashObject(resolveCodexAcpExecutionMode(mode));
489
+ return hashObject({
490
+ ...resolveCodexAcpExecutionMode(mode),
491
+ happyOrg: mode.happyOrg ? {
492
+ taskId: mode.happyOrg.context.taskId,
493
+ organizationId: mode.happyOrg.context.organizationId,
494
+ memberAgentId: mode.happyOrg.context.memberAgentId,
495
+ supervisorAgentId: mode.happyOrg.context.supervisorAgentId,
496
+ reopenContext: mode.happyOrg.reopenContext ?? null
497
+ } : null
498
+ });
490
499
  }
491
500
 
492
501
  function normalizeCodexBackendError(error) {
@@ -565,6 +574,7 @@ async function codexRemoteLauncher(session) {
565
574
  let currentAssistantMessageId = null;
566
575
  let currentThinkingMessageId = null;
567
576
  let fatalRuntimeStopError = null;
577
+ let currentHappyOrgTurn = null;
568
578
  const permissionHandler = new CodexPermissionHandler(session.client);
569
579
  const selectionHandler = new CodexSelectionHandler(session.client);
570
580
  const conversationHistory = new ConversationHistory$1({ maxMessages: 20, maxCharacters: 5e4 });
@@ -597,6 +607,7 @@ async function codexRemoteLauncher(session) {
597
607
  shouldCommitAccumulatedResponse = false;
598
608
  currentAssistantMessageId = null;
599
609
  currentThinkingMessageId = null;
610
+ currentHappyOrgTurn = null;
600
611
  session.onThinkingChange(false);
601
612
  };
602
613
  const abortActiveTurn = () => {
@@ -636,6 +647,13 @@ async function codexRemoteLauncher(session) {
636
647
  id: randomUUID()
637
648
  });
638
649
  };
650
+ const emitTurnReport = (report) => {
651
+ session.runtimeSession.sendCodexMessage({
652
+ type: "turn-report",
653
+ id: randomUUID(),
654
+ report
655
+ });
656
+ };
639
657
  const handleUnexpectedRuntimeStop = (detail) => {
640
658
  if (shouldExit || fatalRuntimeStopError) {
641
659
  return;
@@ -658,17 +676,33 @@ async function codexRemoteLauncher(session) {
658
676
  }
659
677
  emitStatusMessage(reason);
660
678
  };
661
- const emitFinalAssistantMessage = () => {
662
- if (!accumulatedResponse.trim()) {
679
+ const emitFinalAssistantMessage = (finalMessageText) => {
680
+ const finalMessage = (finalMessageText ?? accumulatedResponse).trim();
681
+ if (!finalMessage) {
663
682
  return;
664
683
  }
665
- conversationHistory.addAssistantMessage(accumulatedResponse);
666
- emitPendingAssistantMessageDelta();
684
+ if (currentAssistantMessageId) {
685
+ messageBuffer.updateMessage(currentAssistantMessageId, finalMessage, { mode: "replace" });
686
+ }
687
+ conversationHistory.addAssistantMessage(finalMessage);
688
+ if (currentHappyOrgTurn) {
689
+ session.runtimeSession.sendCodexMessage({
690
+ type: "message",
691
+ message: finalMessage,
692
+ id: randomUUID()
693
+ });
694
+ } else {
695
+ accumulatedResponse = finalMessage;
696
+ emitPendingAssistantMessageDelta({ force: true });
697
+ }
667
698
  accumulatedResponse = "";
668
699
  emittedResponseLength = 0;
669
700
  isResponseInProgress = false;
670
701
  };
671
- const emitPendingAssistantMessageDelta = () => {
702
+ const emitPendingAssistantMessageDelta = (opts) => {
703
+ if (currentHappyOrgTurn && !opts?.force) {
704
+ return false;
705
+ }
672
706
  const nextMessage = accumulatedResponse.slice(emittedResponseLength);
673
707
  if (!nextMessage.trim()) {
674
708
  return false;
@@ -968,6 +1002,8 @@ async function codexRemoteLauncher(session) {
968
1002
  readyAlreadySent = false;
969
1003
  messageBuffer.addMessage(message.message, "user");
970
1004
  const turnSignal = abortController.signal;
1005
+ let turnStatus = "task_complete";
1006
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
971
1007
  try {
972
1008
  turnInFlight = true;
973
1009
  shouldCommitAccumulatedResponse = false;
@@ -982,6 +1018,9 @@ async function codexRemoteLauncher(session) {
982
1018
  promptToSend = historyContext + promptToSend;
983
1019
  logger.debug(`[Codex] Injected conversation history context (${historyContext.length} chars)`);
984
1020
  }
1021
+ if (message.mode.happyOrg) {
1022
+ promptToSend = buildHappyOrgTurnPrompt(promptToSend, message.mode.happyOrg);
1023
+ }
985
1024
  conversationHistory.addUserMessage(message.message);
986
1025
  await activeRuntimeHandle.sendPrompt(promptToSend);
987
1026
  await waitForResponseCompleteWithAbort(activeRuntimeHandle.backend, turnSignal);
@@ -993,6 +1032,7 @@ async function codexRemoteLauncher(session) {
993
1032
  const isAbortError = error instanceof Error && error.name === "AbortError";
994
1033
  const isExpectedInterruption = isAbortError || turnSignal.aborted || shouldExit;
995
1034
  if (isExpectedInterruption) {
1035
+ turnStatus = "turn_aborted";
996
1036
  session.runtimeSession.sendCodexMessage({
997
1037
  type: "turn_aborted",
998
1038
  id: randomUUID()
@@ -1009,8 +1049,24 @@ async function codexRemoteLauncher(session) {
1009
1049
  }
1010
1050
  } finally {
1011
1051
  turnInFlight = false;
1052
+ const finalizedTurn = finalizeHappyOrgTurn({
1053
+ metadata: session.runtimeSession.getMetadataSnapshot?.() ?? null,
1054
+ queuedTurn: message.mode.happyOrg,
1055
+ responseText: accumulatedResponse,
1056
+ turnStatus
1057
+ });
1058
+ if (finalizedTurn.nextMetadata && typeof session.runtimeSession.updateMetadata === "function") {
1059
+ session.runtimeSession.updateMetadata(() => finalizedTurn.nextMetadata);
1060
+ }
1061
+ if (finalizedTurn.report) {
1062
+ emitTurnReport(finalizedTurn.report);
1063
+ }
1064
+ if (finalizedTurn.terminateMessage) {
1065
+ emitStatusMessage(finalizedTurn.terminateMessage);
1066
+ }
1067
+ accumulatedResponse = finalizedTurn.cleanedText;
1012
1068
  if (shouldCommitAccumulatedResponse) {
1013
- emitFinalAssistantMessage();
1069
+ emitFinalAssistantMessage(finalizedTurn.cleanedText);
1014
1070
  }
1015
1071
  if (!shouldExit) {
1016
1072
  session.runtimeSession.sendCodexMessage({
@@ -1175,6 +1231,19 @@ async function runCodex(opts) {
1175
1231
  let currentPermissionMode = initialPermissionMode;
1176
1232
  let currentModel;
1177
1233
  sessionClient.onUserMessage((message) => {
1234
+ const happyOrgResult = resolveHappyOrgQueuedTurn({
1235
+ metadata: sessionClient.getMetadataSnapshot?.() ?? metadata,
1236
+ message
1237
+ });
1238
+ if (happyOrgResult.nextMetadata) {
1239
+ sessionClient.updateMetadata(() => happyOrgResult.nextMetadata);
1240
+ }
1241
+ if (happyOrgResult.blocked) {
1242
+ if (happyOrgResult.statusMessage) {
1243
+ sessionClient.sendSessionEvent({ type: "message", message: happyOrgResult.statusMessage });
1244
+ }
1245
+ return;
1246
+ }
1178
1247
  const previousPermissionMode = currentPermissionMode;
1179
1248
  let messagePermissionMode = previousPermissionMode;
1180
1249
  if (message.meta?.permissionMode) {
@@ -1193,7 +1262,8 @@ async function runCodex(opts) {
1193
1262
  }
1194
1263
  messageQueue.push(message.content.text, {
1195
1264
  permissionMode: permissionResolution.resolvedPermissionMode,
1196
- model: messageModel
1265
+ model: messageModel,
1266
+ happyOrg: happyOrgResult.queuedTurn
1197
1267
  });
1198
1268
  });
1199
1269
  codexSession = new CodexSession({
@@ -1,9 +1,9 @@
1
1
  'use strict';
2
2
 
3
3
  var node_crypto = require('node:crypto');
4
- var api = require('./api-BKnzORe4.cjs');
5
- var registerKillSessionHandler = require('./registerKillSessionHandler-BMUE5Oaj.cjs');
6
- var index = require('./index-0TIyXMQu.cjs');
4
+ var api = require('./api-MGlKcEf3.cjs');
5
+ var registerKillSessionHandler = require('./registerKillSessionHandler-Cs_INk4A.cjs');
6
+ var index = require('./index-CgVjDJpt.cjs');
7
7
  require('cross-spawn');
8
8
  require('@agentclientprotocol/sdk');
9
9
  require('ps-list');
@@ -16,7 +16,7 @@ require('node:path');
16
16
  require('node:os');
17
17
  require('node:child_process');
18
18
  require('node:readline');
19
- require('./persistence-D5uolhHo.cjs');
19
+ require('./persistence-DLFUNI9q.cjs');
20
20
  require('node:fs/promises');
21
21
  require('fs/promises');
22
22
  require('crypto');
@@ -27,8 +27,8 @@ require('tweetnacl');
27
27
  require('open');
28
28
  var React = require('react');
29
29
  var ink = require('ink');
30
- var ProviderSelectionHandler = require('./ProviderSelectionHandler-DUBEXkmo.cjs');
31
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-B9z785Pi.cjs');
30
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-Bafuy28L.cjs');
31
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-0nj-PMFc.cjs');
32
32
  require('zod');
33
33
  require('socket.io-client');
34
34
  require('expo-server-sdk');
@@ -488,7 +488,16 @@ function resolveCodexAcpExecutionMode(mode) {
488
488
  };
489
489
  }
490
490
  function getCodexExecutionFingerprint(mode) {
491
- return registerKillSessionHandler.hashObject(resolveCodexAcpExecutionMode(mode));
491
+ return registerKillSessionHandler.hashObject({
492
+ ...resolveCodexAcpExecutionMode(mode),
493
+ happyOrg: mode.happyOrg ? {
494
+ taskId: mode.happyOrg.context.taskId,
495
+ organizationId: mode.happyOrg.context.organizationId,
496
+ memberAgentId: mode.happyOrg.context.memberAgentId,
497
+ supervisorAgentId: mode.happyOrg.context.supervisorAgentId,
498
+ reopenContext: mode.happyOrg.reopenContext ?? null
499
+ } : null
500
+ });
492
501
  }
493
502
 
494
503
  function normalizeCodexBackendError(error) {
@@ -567,6 +576,7 @@ async function codexRemoteLauncher(session) {
567
576
  let currentAssistantMessageId = null;
568
577
  let currentThinkingMessageId = null;
569
578
  let fatalRuntimeStopError = null;
579
+ let currentHappyOrgTurn = null;
570
580
  const permissionHandler = new CodexPermissionHandler(session.client);
571
581
  const selectionHandler = new CodexSelectionHandler(session.client);
572
582
  const conversationHistory = new registerKillSessionHandler.ConversationHistory({ maxMessages: 20, maxCharacters: 5e4 });
@@ -599,6 +609,7 @@ async function codexRemoteLauncher(session) {
599
609
  shouldCommitAccumulatedResponse = false;
600
610
  currentAssistantMessageId = null;
601
611
  currentThinkingMessageId = null;
612
+ currentHappyOrgTurn = null;
602
613
  session.onThinkingChange(false);
603
614
  };
604
615
  const abortActiveTurn = () => {
@@ -638,6 +649,13 @@ async function codexRemoteLauncher(session) {
638
649
  id: node_crypto.randomUUID()
639
650
  });
640
651
  };
652
+ const emitTurnReport = (report) => {
653
+ session.runtimeSession.sendCodexMessage({
654
+ type: "turn-report",
655
+ id: node_crypto.randomUUID(),
656
+ report
657
+ });
658
+ };
641
659
  const handleUnexpectedRuntimeStop = (detail) => {
642
660
  if (shouldExit || fatalRuntimeStopError) {
643
661
  return;
@@ -660,17 +678,33 @@ async function codexRemoteLauncher(session) {
660
678
  }
661
679
  emitStatusMessage(reason);
662
680
  };
663
- const emitFinalAssistantMessage = () => {
664
- if (!accumulatedResponse.trim()) {
681
+ const emitFinalAssistantMessage = (finalMessageText) => {
682
+ const finalMessage = (finalMessageText ?? accumulatedResponse).trim();
683
+ if (!finalMessage) {
665
684
  return;
666
685
  }
667
- conversationHistory.addAssistantMessage(accumulatedResponse);
668
- emitPendingAssistantMessageDelta();
686
+ if (currentAssistantMessageId) {
687
+ messageBuffer.updateMessage(currentAssistantMessageId, finalMessage, { mode: "replace" });
688
+ }
689
+ conversationHistory.addAssistantMessage(finalMessage);
690
+ if (currentHappyOrgTurn) {
691
+ session.runtimeSession.sendCodexMessage({
692
+ type: "message",
693
+ message: finalMessage,
694
+ id: node_crypto.randomUUID()
695
+ });
696
+ } else {
697
+ accumulatedResponse = finalMessage;
698
+ emitPendingAssistantMessageDelta({ force: true });
699
+ }
669
700
  accumulatedResponse = "";
670
701
  emittedResponseLength = 0;
671
702
  isResponseInProgress = false;
672
703
  };
673
- const emitPendingAssistantMessageDelta = () => {
704
+ const emitPendingAssistantMessageDelta = (opts) => {
705
+ if (currentHappyOrgTurn && !opts?.force) {
706
+ return false;
707
+ }
674
708
  const nextMessage = accumulatedResponse.slice(emittedResponseLength);
675
709
  if (!nextMessage.trim()) {
676
710
  return false;
@@ -970,6 +1004,8 @@ async function codexRemoteLauncher(session) {
970
1004
  readyAlreadySent = false;
971
1005
  messageBuffer.addMessage(message.message, "user");
972
1006
  const turnSignal = abortController.signal;
1007
+ let turnStatus = "task_complete";
1008
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
973
1009
  try {
974
1010
  turnInFlight = true;
975
1011
  shouldCommitAccumulatedResponse = false;
@@ -984,6 +1020,9 @@ async function codexRemoteLauncher(session) {
984
1020
  promptToSend = historyContext + promptToSend;
985
1021
  api.logger.debug(`[Codex] Injected conversation history context (${historyContext.length} chars)`);
986
1022
  }
1023
+ if (message.mode.happyOrg) {
1024
+ promptToSend = registerKillSessionHandler.buildHappyOrgTurnPrompt(promptToSend, message.mode.happyOrg);
1025
+ }
987
1026
  conversationHistory.addUserMessage(message.message);
988
1027
  await activeRuntimeHandle.sendPrompt(promptToSend);
989
1028
  await registerKillSessionHandler.waitForResponseCompleteWithAbort(activeRuntimeHandle.backend, turnSignal);
@@ -995,6 +1034,7 @@ async function codexRemoteLauncher(session) {
995
1034
  const isAbortError = error instanceof Error && error.name === "AbortError";
996
1035
  const isExpectedInterruption = isAbortError || turnSignal.aborted || shouldExit;
997
1036
  if (isExpectedInterruption) {
1037
+ turnStatus = "turn_aborted";
998
1038
  session.runtimeSession.sendCodexMessage({
999
1039
  type: "turn_aborted",
1000
1040
  id: node_crypto.randomUUID()
@@ -1011,8 +1051,24 @@ async function codexRemoteLauncher(session) {
1011
1051
  }
1012
1052
  } finally {
1013
1053
  turnInFlight = false;
1054
+ const finalizedTurn = registerKillSessionHandler.finalizeHappyOrgTurn({
1055
+ metadata: session.runtimeSession.getMetadataSnapshot?.() ?? null,
1056
+ queuedTurn: message.mode.happyOrg,
1057
+ responseText: accumulatedResponse,
1058
+ turnStatus
1059
+ });
1060
+ if (finalizedTurn.nextMetadata && typeof session.runtimeSession.updateMetadata === "function") {
1061
+ session.runtimeSession.updateMetadata(() => finalizedTurn.nextMetadata);
1062
+ }
1063
+ if (finalizedTurn.report) {
1064
+ emitTurnReport(finalizedTurn.report);
1065
+ }
1066
+ if (finalizedTurn.terminateMessage) {
1067
+ emitStatusMessage(finalizedTurn.terminateMessage);
1068
+ }
1069
+ accumulatedResponse = finalizedTurn.cleanedText;
1014
1070
  if (shouldCommitAccumulatedResponse) {
1015
- emitFinalAssistantMessage();
1071
+ emitFinalAssistantMessage(finalizedTurn.cleanedText);
1016
1072
  }
1017
1073
  if (!shouldExit) {
1018
1074
  session.runtimeSession.sendCodexMessage({
@@ -1177,6 +1233,19 @@ async function runCodex(opts) {
1177
1233
  let currentPermissionMode = initialPermissionMode;
1178
1234
  let currentModel;
1179
1235
  sessionClient.onUserMessage((message) => {
1236
+ const happyOrgResult = registerKillSessionHandler.resolveHappyOrgQueuedTurn({
1237
+ metadata: sessionClient.getMetadataSnapshot?.() ?? metadata,
1238
+ message
1239
+ });
1240
+ if (happyOrgResult.nextMetadata) {
1241
+ sessionClient.updateMetadata(() => happyOrgResult.nextMetadata);
1242
+ }
1243
+ if (happyOrgResult.blocked) {
1244
+ if (happyOrgResult.statusMessage) {
1245
+ sessionClient.sendSessionEvent({ type: "message", message: happyOrgResult.statusMessage });
1246
+ }
1247
+ return;
1248
+ }
1180
1249
  const previousPermissionMode = currentPermissionMode;
1181
1250
  let messagePermissionMode = previousPermissionMode;
1182
1251
  if (message.meta?.permissionMode) {
@@ -1195,7 +1264,8 @@ async function runCodex(opts) {
1195
1264
  }
1196
1265
  messageQueue.push(message.content.text, {
1197
1266
  permissionMode: permissionResolution.resolvedPermissionMode,
1198
- model: messageModel
1267
+ model: messageModel,
1268
+ happyOrg: happyOrgResult.queuedTurn
1199
1269
  });
1200
1270
  });
1201
1271
  codexSession = new CodexSession({