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,10 +1,10 @@
1
1
  import { useStdout, useInput, Box, Text, render } from 'ink';
2
2
  import React, { useState, useRef, useEffect, useCallback } from 'react';
3
3
  import { randomUUID } from 'node:crypto';
4
- import { l as logger, b as connectionState, A as ApiClient } from './api-_Y2kzqZL.mjs';
5
- import { B as BasePermissionHandler, C as ConversationHistory$1, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, h as hashObject, d as MessageBuffer, r as registerKillSessionHandler, w as waitForResponseCompleteWithAbort, f as closeProviderSession, l as launchRuntimeHandleWithFactoryResult, i as inferToolResultError, j as forwardAgentMessageToProviderSession } from './registerKillSessionHandler-DJMH-gar.mjs';
6
- import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, s as saveGeminiModelToConfig, a as createGeminiBackend, b as stopCaffeinate } from './index-Bg4KLXYY.mjs';
7
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-iTk5q5Vy.mjs';
4
+ import { l as logger, b as connectionState, A as ApiClient } from './api-DJe9WP9M.mjs';
5
+ import { B as BasePermissionHandler, C as ConversationHistory$1, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, h as hashObject, r as resolveHappyOrgQueuedTurn, d as MessageBuffer, f as registerKillSessionHandler, i as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, j as finalizeHappyOrgTurn, k as closeProviderSession, l as launchRuntimeHandleWithFactoryResult, m as inferToolResultError, n as forwardAgentMessageToProviderSession } from './registerKillSessionHandler-DsHTZDsU.mjs';
6
+ import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, s as saveGeminiModelToConfig, a as createGeminiBackend, b as stopCaffeinate } from './index-CHXCgpwi.mjs';
7
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-DnVC7liC.mjs';
8
8
  import 'cross-spawn';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import 'ps-list';
@@ -15,7 +15,7 @@ import 'node:child_process';
15
15
  import 'node:readline';
16
16
  import 'tweetnacl';
17
17
  import 'axios';
18
- import './persistence-BCkHc68b.mjs';
18
+ import './persistence-CkP90vEt.mjs';
19
19
  import 'open';
20
20
  import 'chalk';
21
21
  import 'fs';
@@ -511,12 +511,32 @@ async function runGemini(opts) {
511
511
  await syncControlledByUserState(session, false);
512
512
  const messageQueue = new MessageQueue2((mode) => hashObject({
513
513
  permissionMode: mode.permissionMode,
514
- model: mode.model
514
+ model: mode.model,
515
+ happyOrg: mode.happyOrg ? {
516
+ taskId: mode.happyOrg.context.taskId,
517
+ organizationId: mode.happyOrg.context.organizationId,
518
+ memberAgentId: mode.happyOrg.context.memberAgentId,
519
+ supervisorAgentId: mode.happyOrg.context.supervisorAgentId,
520
+ reopenContext: mode.happyOrg.reopenContext ?? null
521
+ } : null
515
522
  }));
516
523
  const conversationHistory = new ConversationHistory({ maxMessages: 20, maxCharacters: 5e4 });
517
524
  let currentPermissionMode = void 0;
518
525
  let currentModel = void 0;
519
526
  session.onUserMessage((message) => {
527
+ const happyOrgResult = resolveHappyOrgQueuedTurn({
528
+ metadata: session.getMetadataSnapshot(),
529
+ message
530
+ });
531
+ if (happyOrgResult.nextMetadata) {
532
+ session.updateMetadata(() => happyOrgResult.nextMetadata);
533
+ }
534
+ if (happyOrgResult.blocked) {
535
+ if (happyOrgResult.statusMessage) {
536
+ session.sendSessionEvent({ type: "message", message: happyOrgResult.statusMessage });
537
+ }
538
+ return;
539
+ }
520
540
  let messagePermissionMode = currentPermissionMode;
521
541
  if (message.meta?.permissionMode) {
522
542
  const validModes = ["default", "read-only", "safe-yolo", "yolo"];
@@ -560,8 +580,9 @@ async function runGemini(opts) {
560
580
  const mode = {
561
581
  permissionMode: messagePermissionMode || "default",
562
582
  model: messageModel,
563
- originalUserMessage
583
+ originalUserMessage,
564
584
  // Store original message separately
585
+ happyOrg: happyOrgResult.queuedTurn
565
586
  };
566
587
  messageQueue.push(fullPrompt, mode);
567
588
  conversationHistory.addUserMessage(originalUserMessage);
@@ -712,8 +733,10 @@ async function runGemini(opts) {
712
733
  };
713
734
  let accumulatedResponse = "";
714
735
  let isResponseInProgress = false;
736
+ let currentResponseMessageId = null;
715
737
  let hadToolCallInTurn = false;
716
738
  let taskStartedSent = false;
739
+ let currentHappyOrgTurn = null;
717
740
  const disposeRuntimeHandle = async () => {
718
741
  if (!runtimeHandle) {
719
742
  return;
@@ -728,6 +751,13 @@ async function runGemini(opts) {
728
751
  logger.debug("[Gemini] Error disposing runtime session:", error);
729
752
  }
730
753
  };
754
+ const emitTurnReport = (report) => {
755
+ session.sendAgentMessage("gemini", {
756
+ type: "turn-report",
757
+ id: randomUUID(),
758
+ report
759
+ });
760
+ };
731
761
  function setupGeminiMessageHandler(activeRuntimeHandle) {
732
762
  const forwardAgentMessage = (agentMessage) => {
733
763
  forwardAgentMessageToProviderSession(agentMessage, {
@@ -742,11 +772,15 @@ async function runGemini(opts) {
742
772
  if (msg.textDelta) {
743
773
  if (!isResponseInProgress) {
744
774
  messageBuffer.removeLastMessage("system");
745
- messageBuffer.addMessage(msg.textDelta, "assistant");
775
+ currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
746
776
  isResponseInProgress = true;
747
777
  logger.debug(`[gemini] Started new response, first chunk length: ${msg.textDelta.length}`);
748
778
  } else {
749
- messageBuffer.updateLastMessage(msg.textDelta, "assistant");
779
+ if (currentResponseMessageId) {
780
+ messageBuffer.updateMessage(currentResponseMessageId, msg.textDelta);
781
+ } else {
782
+ currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
783
+ }
750
784
  logger.debug(`[gemini] Updated response, chunk length: ${msg.textDelta.length}, total accumulated: ${accumulatedResponse.length + msg.textDelta.length}`);
751
785
  }
752
786
  accumulatedResponse += msg.textDelta;
@@ -780,6 +814,7 @@ async function runGemini(opts) {
780
814
  session.keepAlive(thinking, "remote");
781
815
  accumulatedResponse = "";
782
816
  isResponseInProgress = false;
817
+ currentResponseMessageId = null;
783
818
  let errorMessage = "Unknown error";
784
819
  if (msg.detail) {
785
820
  if (typeof msg.detail === "object") {
@@ -985,6 +1020,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
985
1020
  const userMessageToShow = message.mode?.originalUserMessage || message.message;
986
1021
  messageBuffer.addMessage(userMessageToShow, "user");
987
1022
  isProcessingMessage = true;
1023
+ let turnStatus = "task_complete";
1024
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
988
1025
  try {
989
1026
  let activeHandle = runtimeHandle;
990
1027
  if (!activeHandle) {
@@ -1003,6 +1040,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1003
1040
  }
1004
1041
  accumulatedResponse = "";
1005
1042
  isResponseInProgress = false;
1043
+ currentResponseMessageId = null;
1006
1044
  hadToolCallInTurn = false;
1007
1045
  taskStartedSent = false;
1008
1046
  let promptToSend = message.message;
@@ -1011,6 +1049,9 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1011
1049
  promptToSend = historyContext + promptToSend;
1012
1050
  logger.debug(`[gemini] Injected conversation history context (${historyContext.length} chars)`);
1013
1051
  }
1052
+ if (message.mode.happyOrg) {
1053
+ promptToSend = buildHappyOrgTurnPrompt(promptToSend, message.mode.happyOrg);
1054
+ }
1014
1055
  logger.debug(`[gemini] Sending prompt to Gemini (length: ${promptToSend.length}): ${promptToSend.substring(0, 100)}...`);
1015
1056
  logger.debug(`[gemini] Full prompt: ${promptToSend}`);
1016
1057
  const MAX_RETRIES = 3;
@@ -1060,6 +1101,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1060
1101
  logger.debug("[gemini] Error in gemini session:", error);
1061
1102
  const isAbortError = error instanceof Error && error.name === "AbortError";
1062
1103
  if (isAbortError) {
1104
+ turnStatus = "turn_aborted";
1063
1105
  messageBuffer.addMessage("Aborted by user", "status");
1064
1106
  session.sendSessionEvent({ type: "message", message: "Aborted by user" });
1065
1107
  } else {
@@ -1108,6 +1150,26 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1108
1150
  permissionHandler.reset();
1109
1151
  reasoningProcessor.abort();
1110
1152
  diffProcessor.reset();
1153
+ const finalizedTurn = finalizeHappyOrgTurn({
1154
+ metadata: session.getMetadataSnapshot?.() ?? null,
1155
+ queuedTurn: message.mode.happyOrg,
1156
+ responseText: accumulatedResponse,
1157
+ turnStatus
1158
+ });
1159
+ if (finalizedTurn.nextMetadata && typeof session.updateMetadata === "function") {
1160
+ session.updateMetadata(() => finalizedTurn.nextMetadata);
1161
+ }
1162
+ if (finalizedTurn.report) {
1163
+ emitTurnReport(finalizedTurn.report);
1164
+ }
1165
+ if (finalizedTurn.terminateMessage) {
1166
+ messageBuffer.addMessage(finalizedTurn.terminateMessage, "status");
1167
+ session.sendSessionEvent({ type: "message", message: finalizedTurn.terminateMessage });
1168
+ }
1169
+ accumulatedResponse = finalizedTurn.cleanedText;
1170
+ if (currentResponseMessageId && finalizedTurn.cleanedText.trim()) {
1171
+ messageBuffer.updateMessage(currentResponseMessageId, finalizedTurn.cleanedText, { mode: "replace" });
1172
+ }
1111
1173
  if (accumulatedResponse.trim()) {
1112
1174
  const { text: messageText, options } = parseOptionsFromText(accumulatedResponse);
1113
1175
  conversationHistory.addAssistantMessage(messageText);
@@ -1136,6 +1198,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1136
1198
  });
1137
1199
  hadToolCallInTurn = false;
1138
1200
  taskStartedSent = false;
1201
+ currentResponseMessageId = null;
1202
+ currentHappyOrgTurn = null;
1139
1203
  thinking = false;
1140
1204
  session.keepAlive(thinking, "remote");
1141
1205
  emitReadyIfIdle();
@@ -3,10 +3,10 @@
3
3
  var ink = require('ink');
4
4
  var React = require('react');
5
5
  var node_crypto = require('node:crypto');
6
- var api = require('./api-BKnzORe4.cjs');
7
- var registerKillSessionHandler = require('./registerKillSessionHandler-BMUE5Oaj.cjs');
8
- var index = require('./index-0TIyXMQu.cjs');
9
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-B9z785Pi.cjs');
6
+ var api = require('./api-MGlKcEf3.cjs');
7
+ var registerKillSessionHandler = require('./registerKillSessionHandler-Cs_INk4A.cjs');
8
+ var index = require('./index-CgVjDJpt.cjs');
9
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-0nj-PMFc.cjs');
10
10
  require('cross-spawn');
11
11
  require('@agentclientprotocol/sdk');
12
12
  require('ps-list');
@@ -17,7 +17,7 @@ require('node:child_process');
17
17
  require('node:readline');
18
18
  require('tweetnacl');
19
19
  require('axios');
20
- require('./persistence-D5uolhHo.cjs');
20
+ require('./persistence-DLFUNI9q.cjs');
21
21
  require('open');
22
22
  require('chalk');
23
23
  require('fs');
@@ -513,12 +513,32 @@ async function runGemini(opts) {
513
513
  await registerKillSessionHandler.syncControlledByUserState(session, false);
514
514
  const messageQueue = new registerKillSessionHandler.MessageQueue2((mode) => registerKillSessionHandler.hashObject({
515
515
  permissionMode: mode.permissionMode,
516
- model: mode.model
516
+ model: mode.model,
517
+ happyOrg: mode.happyOrg ? {
518
+ taskId: mode.happyOrg.context.taskId,
519
+ organizationId: mode.happyOrg.context.organizationId,
520
+ memberAgentId: mode.happyOrg.context.memberAgentId,
521
+ supervisorAgentId: mode.happyOrg.context.supervisorAgentId,
522
+ reopenContext: mode.happyOrg.reopenContext ?? null
523
+ } : null
517
524
  }));
518
525
  const conversationHistory = new ConversationHistory({ maxMessages: 20, maxCharacters: 5e4 });
519
526
  let currentPermissionMode = void 0;
520
527
  let currentModel = void 0;
521
528
  session.onUserMessage((message) => {
529
+ const happyOrgResult = registerKillSessionHandler.resolveHappyOrgQueuedTurn({
530
+ metadata: session.getMetadataSnapshot(),
531
+ message
532
+ });
533
+ if (happyOrgResult.nextMetadata) {
534
+ session.updateMetadata(() => happyOrgResult.nextMetadata);
535
+ }
536
+ if (happyOrgResult.blocked) {
537
+ if (happyOrgResult.statusMessage) {
538
+ session.sendSessionEvent({ type: "message", message: happyOrgResult.statusMessage });
539
+ }
540
+ return;
541
+ }
522
542
  let messagePermissionMode = currentPermissionMode;
523
543
  if (message.meta?.permissionMode) {
524
544
  const validModes = ["default", "read-only", "safe-yolo", "yolo"];
@@ -562,8 +582,9 @@ async function runGemini(opts) {
562
582
  const mode = {
563
583
  permissionMode: messagePermissionMode || "default",
564
584
  model: messageModel,
565
- originalUserMessage
585
+ originalUserMessage,
566
586
  // Store original message separately
587
+ happyOrg: happyOrgResult.queuedTurn
567
588
  };
568
589
  messageQueue.push(fullPrompt, mode);
569
590
  conversationHistory.addUserMessage(originalUserMessage);
@@ -714,8 +735,10 @@ async function runGemini(opts) {
714
735
  };
715
736
  let accumulatedResponse = "";
716
737
  let isResponseInProgress = false;
738
+ let currentResponseMessageId = null;
717
739
  let hadToolCallInTurn = false;
718
740
  let taskStartedSent = false;
741
+ let currentHappyOrgTurn = null;
719
742
  const disposeRuntimeHandle = async () => {
720
743
  if (!runtimeHandle) {
721
744
  return;
@@ -730,6 +753,13 @@ async function runGemini(opts) {
730
753
  api.logger.debug("[Gemini] Error disposing runtime session:", error);
731
754
  }
732
755
  };
756
+ const emitTurnReport = (report) => {
757
+ session.sendAgentMessage("gemini", {
758
+ type: "turn-report",
759
+ id: node_crypto.randomUUID(),
760
+ report
761
+ });
762
+ };
733
763
  function setupGeminiMessageHandler(activeRuntimeHandle) {
734
764
  const forwardAgentMessage = (agentMessage) => {
735
765
  registerKillSessionHandler.forwardAgentMessageToProviderSession(agentMessage, {
@@ -744,11 +774,15 @@ async function runGemini(opts) {
744
774
  if (msg.textDelta) {
745
775
  if (!isResponseInProgress) {
746
776
  messageBuffer.removeLastMessage("system");
747
- messageBuffer.addMessage(msg.textDelta, "assistant");
777
+ currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
748
778
  isResponseInProgress = true;
749
779
  api.logger.debug(`[gemini] Started new response, first chunk length: ${msg.textDelta.length}`);
750
780
  } else {
751
- messageBuffer.updateLastMessage(msg.textDelta, "assistant");
781
+ if (currentResponseMessageId) {
782
+ messageBuffer.updateMessage(currentResponseMessageId, msg.textDelta);
783
+ } else {
784
+ currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
785
+ }
752
786
  api.logger.debug(`[gemini] Updated response, chunk length: ${msg.textDelta.length}, total accumulated: ${accumulatedResponse.length + msg.textDelta.length}`);
753
787
  }
754
788
  accumulatedResponse += msg.textDelta;
@@ -782,6 +816,7 @@ async function runGemini(opts) {
782
816
  session.keepAlive(thinking, "remote");
783
817
  accumulatedResponse = "";
784
818
  isResponseInProgress = false;
819
+ currentResponseMessageId = null;
785
820
  let errorMessage = "Unknown error";
786
821
  if (msg.detail) {
787
822
  if (typeof msg.detail === "object") {
@@ -987,6 +1022,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
987
1022
  const userMessageToShow = message.mode?.originalUserMessage || message.message;
988
1023
  messageBuffer.addMessage(userMessageToShow, "user");
989
1024
  isProcessingMessage = true;
1025
+ let turnStatus = "task_complete";
1026
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
990
1027
  try {
991
1028
  let activeHandle = runtimeHandle;
992
1029
  if (!activeHandle) {
@@ -1005,6 +1042,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1005
1042
  }
1006
1043
  accumulatedResponse = "";
1007
1044
  isResponseInProgress = false;
1045
+ currentResponseMessageId = null;
1008
1046
  hadToolCallInTurn = false;
1009
1047
  taskStartedSent = false;
1010
1048
  let promptToSend = message.message;
@@ -1013,6 +1051,9 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1013
1051
  promptToSend = historyContext + promptToSend;
1014
1052
  api.logger.debug(`[gemini] Injected conversation history context (${historyContext.length} chars)`);
1015
1053
  }
1054
+ if (message.mode.happyOrg) {
1055
+ promptToSend = registerKillSessionHandler.buildHappyOrgTurnPrompt(promptToSend, message.mode.happyOrg);
1056
+ }
1016
1057
  api.logger.debug(`[gemini] Sending prompt to Gemini (length: ${promptToSend.length}): ${promptToSend.substring(0, 100)}...`);
1017
1058
  api.logger.debug(`[gemini] Full prompt: ${promptToSend}`);
1018
1059
  const MAX_RETRIES = 3;
@@ -1062,6 +1103,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1062
1103
  api.logger.debug("[gemini] Error in gemini session:", error);
1063
1104
  const isAbortError = error instanceof Error && error.name === "AbortError";
1064
1105
  if (isAbortError) {
1106
+ turnStatus = "turn_aborted";
1065
1107
  messageBuffer.addMessage("Aborted by user", "status");
1066
1108
  session.sendSessionEvent({ type: "message", message: "Aborted by user" });
1067
1109
  } else {
@@ -1110,6 +1152,26 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1110
1152
  permissionHandler.reset();
1111
1153
  reasoningProcessor.abort();
1112
1154
  diffProcessor.reset();
1155
+ const finalizedTurn = registerKillSessionHandler.finalizeHappyOrgTurn({
1156
+ metadata: session.getMetadataSnapshot?.() ?? null,
1157
+ queuedTurn: message.mode.happyOrg,
1158
+ responseText: accumulatedResponse,
1159
+ turnStatus
1160
+ });
1161
+ if (finalizedTurn.nextMetadata && typeof session.updateMetadata === "function") {
1162
+ session.updateMetadata(() => finalizedTurn.nextMetadata);
1163
+ }
1164
+ if (finalizedTurn.report) {
1165
+ emitTurnReport(finalizedTurn.report);
1166
+ }
1167
+ if (finalizedTurn.terminateMessage) {
1168
+ messageBuffer.addMessage(finalizedTurn.terminateMessage, "status");
1169
+ session.sendSessionEvent({ type: "message", message: finalizedTurn.terminateMessage });
1170
+ }
1171
+ accumulatedResponse = finalizedTurn.cleanedText;
1172
+ if (currentResponseMessageId && finalizedTurn.cleanedText.trim()) {
1173
+ messageBuffer.updateMessage(currentResponseMessageId, finalizedTurn.cleanedText, { mode: "replace" });
1174
+ }
1113
1175
  if (accumulatedResponse.trim()) {
1114
1176
  const { text: messageText, options } = parseOptionsFromText(accumulatedResponse);
1115
1177
  conversationHistory.addAssistantMessage(messageText);
@@ -1138,6 +1200,8 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1138
1200
  });
1139
1201
  hadToolCallInTurn = false;
1140
1202
  taskStartedSent = false;
1203
+ currentResponseMessageId = null;
1204
+ currentHappyOrgTurn = null;
1141
1205
  thinking = false;
1142
1206
  session.keepAlive(thinking, "remote");
1143
1207
  emitReadyIfIdle();
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-imou-cloud",
3
- "version": "2.0.20",
3
+ "version": "2.0.21",
4
4
  "description": "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI",
5
5
  "author": "long.zhu",
6
6
  "license": "MIT",
@@ -166,9 +166,9 @@ function shouldRunProviderSmoke(provider) {
166
166
  return process.env[`HAPPY_SMOKE_${provider.toUpperCase()}`] === '1';
167
167
  }
168
168
 
169
- function shouldSkipPackedInstallVerification() {
170
- return process.env.npm_lifecycle_event === 'prepublishOnly';
171
- }
169
+ function shouldSkipPackedInstallVerification() {
170
+ return process.env.npm_lifecycle_event === 'prepublishOnly';
171
+ }
172
172
 
173
173
  function main() {
174
174
  const tsc = resolveTool('tsc', 'typescript');