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
  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-wcqkneTg.mjs';
5
- import { B as BasePermissionHandler, C as ConversationHistory$1, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler, d as MessageBuffer, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurnWithBusinessAck, j as buildTurnResultPushNotification, k as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, m as extractPermissionRequestPushContext, n as buildPermissionPushNotification, o as renderTerminalOutputPreview, p as inferToolResultError, q as forwardAgentMessageToProviderSession } from './registerKillSessionHandler-Buc97BEh.mjs';
6
- import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, b as closeProviderSession, s as saveGeminiModelToConfig, d as createGeminiBackend, e as stopCaffeinate } from './index-B9mt95QV.mjs';
7
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-Cbp6sIDm.mjs';
4
+ import { l as logger, b as connectionState, A as ApiClient, d as AssistantMessageStream } from './api-BEKN9moW.mjs';
5
+ import { B as BasePermissionHandler, C as ConversationHistory$1, r as resolveHappyOrgQueuedTurn, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, h as hashObject, c as registerKillSessionHandler, d as MessageBuffer, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurnWithBusinessAck, j as buildTurnResultPushNotification, k as buildReadyPushNotification, l as launchRuntimeHandleWithFactoryResult, m as extractPermissionRequestPushContext, n as buildPermissionPushNotification, o as renderTerminalOutputPreview, p as inferToolResultError, q as forwardAgentMessageToProviderSession } from './registerKillSessionHandler--KMYjyvz.mjs';
6
+ import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, b as closeProviderSession, s as saveGeminiModelToConfig, d as createGeminiBackend, e as stopCaffeinate } from './index-CNIT6feF.mjs';
7
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-e-2bxjFB.mjs';
8
8
  import 'cross-spawn';
9
9
  import '@agentclientprotocol/sdk';
10
10
  import 'ps-list';
@@ -690,6 +690,7 @@ async function runGemini(opts) {
690
690
  let currentModeHash = null;
691
691
  let unexpectedRuntimeStopRecovery = null;
692
692
  let readyAlreadySent = false;
693
+ let currentHappyOrgTurn = null;
693
694
  async function handleAbort() {
694
695
  logger.debug("[Gemini] Abort requested - stopping current task");
695
696
  if (!turnAbortedSent) {
@@ -701,6 +702,7 @@ async function runGemini(opts) {
701
702
  }
702
703
  reasoningProcessor.abort();
703
704
  diffProcessor.reset();
705
+ assistantMessageStream.reset();
704
706
  try {
705
707
  abortController.abort();
706
708
  messageQueue.reset();
@@ -840,20 +842,72 @@ async function runGemini(opts) {
840
842
  });
841
843
  };
842
844
  let accumulatedResponse = "";
845
+ let currentAssistantStreamStartLength = 0;
843
846
  let isResponseInProgress = false;
844
847
  let hadToolCallInTurn = false;
845
848
  let taskStartedSent = false;
849
+ const assistantMessageStream = new AssistantMessageStream();
846
850
  const resetTurnState = () => {
847
851
  reasoningProcessor.abort();
848
852
  diffProcessor.reset();
849
853
  accumulatedResponse = "";
854
+ currentAssistantStreamStartLength = 0;
850
855
  isResponseInProgress = false;
851
856
  hadToolCallInTurn = false;
852
857
  taskStartedSent = false;
853
858
  turnAbortedSent = false;
859
+ currentHappyOrgTurn = null;
860
+ assistantMessageStream.reset();
854
861
  thinking = false;
855
862
  session.keepAlive(thinking, "remote");
856
863
  };
864
+ const emitAssistantMessageDelta = (text) => {
865
+ if (currentHappyOrgTurn) {
866
+ return false;
867
+ }
868
+ if (!text.trim()) {
869
+ return false;
870
+ }
871
+ if (!assistantMessageStream.hasActive()) {
872
+ currentAssistantStreamStartLength = accumulatedResponse.length - text.length;
873
+ }
874
+ const stream = assistantMessageStream.delta();
875
+ session.sendAgentMessage("gemini", {
876
+ type: "message",
877
+ message: text,
878
+ id: stream.messageId,
879
+ ...stream
880
+ });
881
+ return true;
882
+ };
883
+ const buildAssistantMessageCommit = (message) => {
884
+ if (!assistantMessageStream.hasActive()) {
885
+ return {
886
+ type: "message",
887
+ message,
888
+ id: randomUUID()
889
+ };
890
+ }
891
+ const stream = assistantMessageStream.commit();
892
+ return {
893
+ type: "message",
894
+ message: message.slice(currentAssistantStreamStartLength),
895
+ id: stream.messageId,
896
+ ...stream
897
+ };
898
+ };
899
+ const commitActiveAssistantMessageStream = () => {
900
+ if (!assistantMessageStream.hasActive()) {
901
+ return false;
902
+ }
903
+ const messagePayload = buildAssistantMessageCommit(accumulatedResponse);
904
+ if (!messagePayload.message.trim()) {
905
+ return false;
906
+ }
907
+ session.sendAgentMessage("gemini", messagePayload);
908
+ currentAssistantStreamStartLength = accumulatedResponse.length;
909
+ return true;
910
+ };
857
911
  const disposeRuntimeHandle = async () => {
858
912
  if (!runtimeHandle) {
859
913
  return;
@@ -921,6 +975,7 @@ async function runGemini(opts) {
921
975
  logger.debug(`[gemini] Updated response, chunk length: ${msg.textDelta.length}, total accumulated: ${accumulatedResponse.length + msg.textDelta.length}`);
922
976
  }
923
977
  accumulatedResponse += msg.textDelta;
978
+ emitAssistantMessageDelta(msg.textDelta);
924
979
  }
925
980
  break;
926
981
  case "status":
@@ -977,9 +1032,11 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
977
1032
  type: "message",
978
1033
  message: `Error: ${errorMessage}`
979
1034
  });
1035
+ assistantMessageStream.reset();
980
1036
  }
981
1037
  break;
982
1038
  case "tool-call":
1039
+ commitActiveAssistantMessageStream();
983
1040
  hadToolCallInTurn = true;
984
1041
  const toolArgs = msg.args ? JSON.stringify(msg.args).substring(0, 100) : "";
985
1042
  const isInvestigationTool = msg.toolName === "codebase_investigator" || typeof msg.toolName === "string" && msg.toolName.includes("investigator");
@@ -1204,10 +1261,12 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1204
1261
  throw new Error("Gemini runtime session not started");
1205
1262
  }
1206
1263
  accumulatedResponse = "";
1264
+ currentAssistantStreamStartLength = 0;
1207
1265
  isResponseInProgress = false;
1208
1266
  hadToolCallInTurn = false;
1209
1267
  taskStartedSent = false;
1210
1268
  turnAbortedSent = false;
1269
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
1211
1270
  let promptToSend = message.message;
1212
1271
  if (shouldInjectHistoryOnNextSession && conversationHistory.hasHistory()) {
1213
1272
  const historyContext = conversationHistory.getContextForNewSession();
@@ -1359,11 +1418,10 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1359
1418
  logger.debug(`[gemini] Warning: Incomplete options block detected`);
1360
1419
  }
1361
1420
  const messagePayload = {
1362
- type: "message",
1363
- message: finalMessageText,
1364
- id: randomUUID(),
1421
+ ...buildAssistantMessageCommit(finalMessageText),
1365
1422
  ...options.length > 0 && { options }
1366
1423
  };
1424
+ currentAssistantStreamStartLength = accumulatedResponse.length;
1367
1425
  logger.debug(`[gemini] Sending complete message to mobile (length: ${finalMessageText.length}): ${finalMessageText.substring(0, 100)}...`);
1368
1426
  session.sendAgentMessage("gemini", messagePayload);
1369
1427
  if (!shouldExit) {
@@ -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 persistence = require('./api-BoeZDGwx.cjs');
7
- var registerKillSessionHandler = require('./registerKillSessionHandler-DtXhn2Cd.cjs');
8
- var index = require('./index-Cgor8CE7.cjs');
9
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-BUTolvO5.cjs');
6
+ var persistence = require('./api-Ixv6TLYP.cjs');
7
+ var registerKillSessionHandler = require('./registerKillSessionHandler-CqjocTSr.cjs');
8
+ var index = require('./index-Mvx4hucr.cjs');
9
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-C8w4XM-x.cjs');
10
10
  require('cross-spawn');
11
11
  require('@agentclientprotocol/sdk');
12
12
  require('ps-list');
@@ -692,6 +692,7 @@ async function runGemini(opts) {
692
692
  let currentModeHash = null;
693
693
  let unexpectedRuntimeStopRecovery = null;
694
694
  let readyAlreadySent = false;
695
+ let currentHappyOrgTurn = null;
695
696
  async function handleAbort() {
696
697
  persistence.logger.debug("[Gemini] Abort requested - stopping current task");
697
698
  if (!turnAbortedSent) {
@@ -703,6 +704,7 @@ async function runGemini(opts) {
703
704
  }
704
705
  reasoningProcessor.abort();
705
706
  diffProcessor.reset();
707
+ assistantMessageStream.reset();
706
708
  try {
707
709
  abortController.abort();
708
710
  messageQueue.reset();
@@ -842,20 +844,72 @@ async function runGemini(opts) {
842
844
  });
843
845
  };
844
846
  let accumulatedResponse = "";
847
+ let currentAssistantStreamStartLength = 0;
845
848
  let isResponseInProgress = false;
846
849
  let hadToolCallInTurn = false;
847
850
  let taskStartedSent = false;
851
+ const assistantMessageStream = new persistence.AssistantMessageStream();
848
852
  const resetTurnState = () => {
849
853
  reasoningProcessor.abort();
850
854
  diffProcessor.reset();
851
855
  accumulatedResponse = "";
856
+ currentAssistantStreamStartLength = 0;
852
857
  isResponseInProgress = false;
853
858
  hadToolCallInTurn = false;
854
859
  taskStartedSent = false;
855
860
  turnAbortedSent = false;
861
+ currentHappyOrgTurn = null;
862
+ assistantMessageStream.reset();
856
863
  thinking = false;
857
864
  session.keepAlive(thinking, "remote");
858
865
  };
866
+ const emitAssistantMessageDelta = (text) => {
867
+ if (currentHappyOrgTurn) {
868
+ return false;
869
+ }
870
+ if (!text.trim()) {
871
+ return false;
872
+ }
873
+ if (!assistantMessageStream.hasActive()) {
874
+ currentAssistantStreamStartLength = accumulatedResponse.length - text.length;
875
+ }
876
+ const stream = assistantMessageStream.delta();
877
+ session.sendAgentMessage("gemini", {
878
+ type: "message",
879
+ message: text,
880
+ id: stream.messageId,
881
+ ...stream
882
+ });
883
+ return true;
884
+ };
885
+ const buildAssistantMessageCommit = (message) => {
886
+ if (!assistantMessageStream.hasActive()) {
887
+ return {
888
+ type: "message",
889
+ message,
890
+ id: node_crypto.randomUUID()
891
+ };
892
+ }
893
+ const stream = assistantMessageStream.commit();
894
+ return {
895
+ type: "message",
896
+ message: message.slice(currentAssistantStreamStartLength),
897
+ id: stream.messageId,
898
+ ...stream
899
+ };
900
+ };
901
+ const commitActiveAssistantMessageStream = () => {
902
+ if (!assistantMessageStream.hasActive()) {
903
+ return false;
904
+ }
905
+ const messagePayload = buildAssistantMessageCommit(accumulatedResponse);
906
+ if (!messagePayload.message.trim()) {
907
+ return false;
908
+ }
909
+ session.sendAgentMessage("gemini", messagePayload);
910
+ currentAssistantStreamStartLength = accumulatedResponse.length;
911
+ return true;
912
+ };
859
913
  const disposeRuntimeHandle = async () => {
860
914
  if (!runtimeHandle) {
861
915
  return;
@@ -923,6 +977,7 @@ async function runGemini(opts) {
923
977
  persistence.logger.debug(`[gemini] Updated response, chunk length: ${msg.textDelta.length}, total accumulated: ${accumulatedResponse.length + msg.textDelta.length}`);
924
978
  }
925
979
  accumulatedResponse += msg.textDelta;
980
+ emitAssistantMessageDelta(msg.textDelta);
926
981
  }
927
982
  break;
928
983
  case "status":
@@ -979,9 +1034,11 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
979
1034
  type: "message",
980
1035
  message: `Error: ${errorMessage}`
981
1036
  });
1037
+ assistantMessageStream.reset();
982
1038
  }
983
1039
  break;
984
1040
  case "tool-call":
1041
+ commitActiveAssistantMessageStream();
985
1042
  hadToolCallInTurn = true;
986
1043
  const toolArgs = msg.args ? JSON.stringify(msg.args).substring(0, 100) : "";
987
1044
  const isInvestigationTool = msg.toolName === "codebase_investigator" || typeof msg.toolName === "string" && msg.toolName.includes("investigator");
@@ -1206,10 +1263,12 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1206
1263
  throw new Error("Gemini runtime session not started");
1207
1264
  }
1208
1265
  accumulatedResponse = "";
1266
+ currentAssistantStreamStartLength = 0;
1209
1267
  isResponseInProgress = false;
1210
1268
  hadToolCallInTurn = false;
1211
1269
  taskStartedSent = false;
1212
1270
  turnAbortedSent = false;
1271
+ currentHappyOrgTurn = message.mode.happyOrg ?? null;
1213
1272
  let promptToSend = message.message;
1214
1273
  if (shouldInjectHistoryOnNextSession && conversationHistory.hasHistory()) {
1215
1274
  const historyContext = conversationHistory.getContextForNewSession();
@@ -1361,11 +1420,10 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1361
1420
  persistence.logger.debug(`[gemini] Warning: Incomplete options block detected`);
1362
1421
  }
1363
1422
  const messagePayload = {
1364
- type: "message",
1365
- message: finalMessageText,
1366
- id: node_crypto.randomUUID(),
1423
+ ...buildAssistantMessageCommit(finalMessageText),
1367
1424
  ...options.length > 0 && { options }
1368
1425
  };
1426
+ currentAssistantStreamStartLength = accumulatedResponse.length;
1369
1427
  persistence.logger.debug(`[gemini] Sending complete message to mobile (length: ${finalMessageText.length}): ${finalMessageText.substring(0, 100)}...`);
1370
1428
  session.sendAgentMessage("gemini", messagePayload);
1371
1429
  if (!shouldExit) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-imou-cloud",
3
- "version": "2.1.39",
3
+ "version": "2.1.40",
4
4
  "description": "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI",
5
5
  "author": "long.zhu",
6
6
  "license": "MIT",