happy-imou-cloud 2.0.21 → 2.0.23

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 (29) hide show
  1. package/dist/{BaseReasoningProcessor-0nj-PMFc.cjs → BaseReasoningProcessor-BzbDRBqp.cjs} +3 -3
  2. package/dist/{BaseReasoningProcessor-DnVC7liC.mjs → BaseReasoningProcessor-DH3BCCTf.mjs} +3 -3
  3. package/dist/ProviderSelectionHandler-CbkbtIRC.mjs +673 -0
  4. package/dist/ProviderSelectionHandler-meVvz9NZ.cjs +680 -0
  5. package/dist/{api-MGlKcEf3.cjs → api-C4bF6GEA.cjs} +35 -3
  6. package/dist/{api-DJe9WP9M.mjs → api-DX7Vg4Hz.mjs} +35 -4
  7. package/dist/{command-DAlFmWmr.cjs → command-CF6Wi_v2.cjs} +3 -3
  8. package/dist/{command-CfyFnMv2.mjs → command-DicPZ-Up.mjs} +3 -3
  9. package/dist/{index-CgVjDJpt.cjs → index-BybqdOf2.cjs} +63 -15
  10. package/dist/{index-CHXCgpwi.mjs → index-CEJmASSW.mjs} +60 -12
  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 +108 -105
  15. package/dist/lib.d.mts +108 -105
  16. package/dist/lib.mjs +1 -1
  17. package/dist/{persistence-DLFUNI9q.cjs → persistence-CdqBfAwo.cjs} +1 -1
  18. package/dist/{persistence-CkP90vEt.mjs → persistence-xypxp7ei.mjs} +1 -1
  19. package/dist/{registerKillSessionHandler-Cs_INk4A.cjs → registerKillSessionHandler-BK3fZIch.cjs} +14 -364
  20. package/dist/{registerKillSessionHandler-DsHTZDsU.mjs → registerKillSessionHandler-BNN-_qNu.mjs} +15 -362
  21. package/dist/{runClaude-DAQAEmHe.mjs → runClaude-B-ex_tr3.mjs} +8 -6
  22. package/dist/{runClaude-BGSgcyUp.cjs → runClaude-CT3jCZjH.cjs} +11 -9
  23. package/dist/{runCodex-B2UpSn82.mjs → runCodex-DhbvUtJC.mjs} +9 -7
  24. package/dist/{runCodex-earICaxw.cjs → runCodex-DodH9jhh.cjs} +12 -10
  25. package/dist/{runGemini-BBUmH1Qh.mjs → runGemini-BsFR5Pd3.mjs} +12 -74
  26. package/dist/{runGemini-D5RAIaR0.cjs → runGemini-CeHCZ1l4.cjs} +12 -74
  27. package/package.json +1 -1
  28. package/dist/ProviderSelectionHandler-Bafuy28L.cjs +0 -265
  29. package/dist/ProviderSelectionHandler-R-2r7ItM.mjs +0 -261
@@ -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-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';
4
+ import { l as logger, f as connectionState, A as ApiClient } from './api-DX7Vg4Hz.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-BNN-_qNu.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-CEJmASSW.mjs';
7
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-DH3BCCTf.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-CkP90vEt.mjs';
18
+ import './persistence-xypxp7ei.mjs';
19
19
  import 'open';
20
20
  import 'chalk';
21
21
  import 'fs';
@@ -511,32 +511,12 @@ 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,
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
514
+ model: mode.model
522
515
  }));
523
516
  const conversationHistory = new ConversationHistory({ maxMessages: 20, maxCharacters: 5e4 });
524
517
  let currentPermissionMode = void 0;
525
518
  let currentModel = void 0;
526
519
  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
- }
540
520
  let messagePermissionMode = currentPermissionMode;
541
521
  if (message.meta?.permissionMode) {
542
522
  const validModes = ["default", "read-only", "safe-yolo", "yolo"];
@@ -580,9 +560,8 @@ async function runGemini(opts) {
580
560
  const mode = {
581
561
  permissionMode: messagePermissionMode || "default",
582
562
  model: messageModel,
583
- originalUserMessage,
563
+ originalUserMessage
584
564
  // Store original message separately
585
- happyOrg: happyOrgResult.queuedTurn
586
565
  };
587
566
  messageQueue.push(fullPrompt, mode);
588
567
  conversationHistory.addUserMessage(originalUserMessage);
@@ -733,10 +712,8 @@ async function runGemini(opts) {
733
712
  };
734
713
  let accumulatedResponse = "";
735
714
  let isResponseInProgress = false;
736
- let currentResponseMessageId = null;
737
715
  let hadToolCallInTurn = false;
738
716
  let taskStartedSent = false;
739
- let currentHappyOrgTurn = null;
740
717
  const disposeRuntimeHandle = async () => {
741
718
  if (!runtimeHandle) {
742
719
  return;
@@ -751,13 +728,6 @@ async function runGemini(opts) {
751
728
  logger.debug("[Gemini] Error disposing runtime session:", error);
752
729
  }
753
730
  };
754
- const emitTurnReport = (report) => {
755
- session.sendAgentMessage("gemini", {
756
- type: "turn-report",
757
- id: randomUUID(),
758
- report
759
- });
760
- };
761
731
  function setupGeminiMessageHandler(activeRuntimeHandle) {
762
732
  const forwardAgentMessage = (agentMessage) => {
763
733
  forwardAgentMessageToProviderSession(agentMessage, {
@@ -772,15 +742,11 @@ async function runGemini(opts) {
772
742
  if (msg.textDelta) {
773
743
  if (!isResponseInProgress) {
774
744
  messageBuffer.removeLastMessage("system");
775
- currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
745
+ messageBuffer.addMessage(msg.textDelta, "assistant");
776
746
  isResponseInProgress = true;
777
747
  logger.debug(`[gemini] Started new response, first chunk length: ${msg.textDelta.length}`);
778
748
  } else {
779
- if (currentResponseMessageId) {
780
- messageBuffer.updateMessage(currentResponseMessageId, msg.textDelta);
781
- } else {
782
- currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
783
- }
749
+ messageBuffer.updateLastMessage(msg.textDelta, "assistant");
784
750
  logger.debug(`[gemini] Updated response, chunk length: ${msg.textDelta.length}, total accumulated: ${accumulatedResponse.length + msg.textDelta.length}`);
785
751
  }
786
752
  accumulatedResponse += msg.textDelta;
@@ -814,7 +780,6 @@ async function runGemini(opts) {
814
780
  session.keepAlive(thinking, "remote");
815
781
  accumulatedResponse = "";
816
782
  isResponseInProgress = false;
817
- currentResponseMessageId = null;
818
783
  let errorMessage = "Unknown error";
819
784
  if (msg.detail) {
820
785
  if (typeof msg.detail === "object") {
@@ -1020,8 +985,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1020
985
  const userMessageToShow = message.mode?.originalUserMessage || message.message;
1021
986
  messageBuffer.addMessage(userMessageToShow, "user");
1022
987
  isProcessingMessage = true;
1023
- let turnStatus = "task_complete";
1024
- currentHappyOrgTurn = message.mode.happyOrg ?? null;
1025
988
  try {
1026
989
  let activeHandle = runtimeHandle;
1027
990
  if (!activeHandle) {
@@ -1040,7 +1003,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1040
1003
  }
1041
1004
  accumulatedResponse = "";
1042
1005
  isResponseInProgress = false;
1043
- currentResponseMessageId = null;
1044
1006
  hadToolCallInTurn = false;
1045
1007
  taskStartedSent = false;
1046
1008
  let promptToSend = message.message;
@@ -1049,9 +1011,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1049
1011
  promptToSend = historyContext + promptToSend;
1050
1012
  logger.debug(`[gemini] Injected conversation history context (${historyContext.length} chars)`);
1051
1013
  }
1052
- if (message.mode.happyOrg) {
1053
- promptToSend = buildHappyOrgTurnPrompt(promptToSend, message.mode.happyOrg);
1054
- }
1055
1014
  logger.debug(`[gemini] Sending prompt to Gemini (length: ${promptToSend.length}): ${promptToSend.substring(0, 100)}...`);
1056
1015
  logger.debug(`[gemini] Full prompt: ${promptToSend}`);
1057
1016
  const MAX_RETRIES = 3;
@@ -1101,7 +1060,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1101
1060
  logger.debug("[gemini] Error in gemini session:", error);
1102
1061
  const isAbortError = error instanceof Error && error.name === "AbortError";
1103
1062
  if (isAbortError) {
1104
- turnStatus = "turn_aborted";
1105
1063
  messageBuffer.addMessage("Aborted by user", "status");
1106
1064
  session.sendSessionEvent({ type: "message", message: "Aborted by user" });
1107
1065
  } else {
@@ -1150,26 +1108,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1150
1108
  permissionHandler.reset();
1151
1109
  reasoningProcessor.abort();
1152
1110
  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
- }
1173
1111
  if (accumulatedResponse.trim()) {
1174
1112
  const { text: messageText, options } = parseOptionsFromText(accumulatedResponse);
1175
1113
  conversationHistory.addAssistantMessage(messageText);
@@ -1198,8 +1136,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1198
1136
  });
1199
1137
  hadToolCallInTurn = false;
1200
1138
  taskStartedSent = false;
1201
- currentResponseMessageId = null;
1202
- currentHappyOrgTurn = null;
1203
1139
  thinking = false;
1204
1140
  session.keepAlive(thinking, "remote");
1205
1141
  emitReadyIfIdle();
@@ -1215,7 +1151,9 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1215
1151
  reconnectionHandle.cancel();
1216
1152
  }
1217
1153
  try {
1218
- await closeProviderSession(session);
1154
+ await closeProviderSession(session, {
1155
+ archiveOnClose: true
1156
+ });
1219
1157
  } catch (e) {
1220
1158
  logger.debug("[gemini]: Error while closing session", e);
1221
1159
  }
@@ -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-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');
6
+ var api = require('./api-C4bF6GEA.cjs');
7
+ var registerKillSessionHandler = require('./registerKillSessionHandler-BK3fZIch.cjs');
8
+ var index = require('./index-BybqdOf2.cjs');
9
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-BzbDRBqp.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-DLFUNI9q.cjs');
20
+ require('./persistence-CdqBfAwo.cjs');
21
21
  require('open');
22
22
  require('chalk');
23
23
  require('fs');
@@ -513,32 +513,12 @@ 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,
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
516
+ model: mode.model
524
517
  }));
525
518
  const conversationHistory = new ConversationHistory({ maxMessages: 20, maxCharacters: 5e4 });
526
519
  let currentPermissionMode = void 0;
527
520
  let currentModel = void 0;
528
521
  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
- }
542
522
  let messagePermissionMode = currentPermissionMode;
543
523
  if (message.meta?.permissionMode) {
544
524
  const validModes = ["default", "read-only", "safe-yolo", "yolo"];
@@ -582,9 +562,8 @@ async function runGemini(opts) {
582
562
  const mode = {
583
563
  permissionMode: messagePermissionMode || "default",
584
564
  model: messageModel,
585
- originalUserMessage,
565
+ originalUserMessage
586
566
  // Store original message separately
587
- happyOrg: happyOrgResult.queuedTurn
588
567
  };
589
568
  messageQueue.push(fullPrompt, mode);
590
569
  conversationHistory.addUserMessage(originalUserMessage);
@@ -735,10 +714,8 @@ async function runGemini(opts) {
735
714
  };
736
715
  let accumulatedResponse = "";
737
716
  let isResponseInProgress = false;
738
- let currentResponseMessageId = null;
739
717
  let hadToolCallInTurn = false;
740
718
  let taskStartedSent = false;
741
- let currentHappyOrgTurn = null;
742
719
  const disposeRuntimeHandle = async () => {
743
720
  if (!runtimeHandle) {
744
721
  return;
@@ -753,13 +730,6 @@ async function runGemini(opts) {
753
730
  api.logger.debug("[Gemini] Error disposing runtime session:", error);
754
731
  }
755
732
  };
756
- const emitTurnReport = (report) => {
757
- session.sendAgentMessage("gemini", {
758
- type: "turn-report",
759
- id: node_crypto.randomUUID(),
760
- report
761
- });
762
- };
763
733
  function setupGeminiMessageHandler(activeRuntimeHandle) {
764
734
  const forwardAgentMessage = (agentMessage) => {
765
735
  registerKillSessionHandler.forwardAgentMessageToProviderSession(agentMessage, {
@@ -774,15 +744,11 @@ async function runGemini(opts) {
774
744
  if (msg.textDelta) {
775
745
  if (!isResponseInProgress) {
776
746
  messageBuffer.removeLastMessage("system");
777
- currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
747
+ messageBuffer.addMessage(msg.textDelta, "assistant");
778
748
  isResponseInProgress = true;
779
749
  api.logger.debug(`[gemini] Started new response, first chunk length: ${msg.textDelta.length}`);
780
750
  } else {
781
- if (currentResponseMessageId) {
782
- messageBuffer.updateMessage(currentResponseMessageId, msg.textDelta);
783
- } else {
784
- currentResponseMessageId = messageBuffer.addMessage(msg.textDelta, "assistant");
785
- }
751
+ messageBuffer.updateLastMessage(msg.textDelta, "assistant");
786
752
  api.logger.debug(`[gemini] Updated response, chunk length: ${msg.textDelta.length}, total accumulated: ${accumulatedResponse.length + msg.textDelta.length}`);
787
753
  }
788
754
  accumulatedResponse += msg.textDelta;
@@ -816,7 +782,6 @@ async function runGemini(opts) {
816
782
  session.keepAlive(thinking, "remote");
817
783
  accumulatedResponse = "";
818
784
  isResponseInProgress = false;
819
- currentResponseMessageId = null;
820
785
  let errorMessage = "Unknown error";
821
786
  if (msg.detail) {
822
787
  if (typeof msg.detail === "object") {
@@ -1022,8 +987,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1022
987
  const userMessageToShow = message.mode?.originalUserMessage || message.message;
1023
988
  messageBuffer.addMessage(userMessageToShow, "user");
1024
989
  isProcessingMessage = true;
1025
- let turnStatus = "task_complete";
1026
- currentHappyOrgTurn = message.mode.happyOrg ?? null;
1027
990
  try {
1028
991
  let activeHandle = runtimeHandle;
1029
992
  if (!activeHandle) {
@@ -1042,7 +1005,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1042
1005
  }
1043
1006
  accumulatedResponse = "";
1044
1007
  isResponseInProgress = false;
1045
- currentResponseMessageId = null;
1046
1008
  hadToolCallInTurn = false;
1047
1009
  taskStartedSent = false;
1048
1010
  let promptToSend = message.message;
@@ -1051,9 +1013,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1051
1013
  promptToSend = historyContext + promptToSend;
1052
1014
  api.logger.debug(`[gemini] Injected conversation history context (${historyContext.length} chars)`);
1053
1015
  }
1054
- if (message.mode.happyOrg) {
1055
- promptToSend = registerKillSessionHandler.buildHappyOrgTurnPrompt(promptToSend, message.mode.happyOrg);
1056
- }
1057
1016
  api.logger.debug(`[gemini] Sending prompt to Gemini (length: ${promptToSend.length}): ${promptToSend.substring(0, 100)}...`);
1058
1017
  api.logger.debug(`[gemini] Full prompt: ${promptToSend}`);
1059
1018
  const MAX_RETRIES = 3;
@@ -1103,7 +1062,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1103
1062
  api.logger.debug("[gemini] Error in gemini session:", error);
1104
1063
  const isAbortError = error instanceof Error && error.name === "AbortError";
1105
1064
  if (isAbortError) {
1106
- turnStatus = "turn_aborted";
1107
1065
  messageBuffer.addMessage("Aborted by user", "status");
1108
1066
  session.sendSessionEvent({ type: "message", message: "Aborted by user" });
1109
1067
  } else {
@@ -1152,26 +1110,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1152
1110
  permissionHandler.reset();
1153
1111
  reasoningProcessor.abort();
1154
1112
  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
- }
1175
1113
  if (accumulatedResponse.trim()) {
1176
1114
  const { text: messageText, options } = parseOptionsFromText(accumulatedResponse);
1177
1115
  conversationHistory.addAssistantMessage(messageText);
@@ -1200,8 +1138,6 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1200
1138
  });
1201
1139
  hadToolCallInTurn = false;
1202
1140
  taskStartedSent = false;
1203
- currentResponseMessageId = null;
1204
- currentHappyOrgTurn = null;
1205
1141
  thinking = false;
1206
1142
  session.keepAlive(thinking, "remote");
1207
1143
  emitReadyIfIdle();
@@ -1217,7 +1153,9 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1217
1153
  reconnectionHandle.cancel();
1218
1154
  }
1219
1155
  try {
1220
- await registerKillSessionHandler.closeProviderSession(session);
1156
+ await registerKillSessionHandler.closeProviderSession(session, {
1157
+ archiveOnClose: true
1158
+ });
1221
1159
  } catch (e) {
1222
1160
  api.logger.debug("[gemini]: Error while closing session", e);
1223
1161
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-imou-cloud",
3
- "version": "2.0.21",
3
+ "version": "2.0.23",
4
4
  "description": "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI",
5
5
  "author": "long.zhu",
6
6
  "license": "MIT",
@@ -1,265 +0,0 @@
1
- 'use strict';
2
-
3
- var api = require('./api-MGlKcEf3.cjs');
4
- var registerKillSessionHandler = require('./registerKillSessionHandler-Cs_INk4A.cjs');
5
-
6
- async function runModeLoop(opts) {
7
- let currentMode = opts.startingMode;
8
- if (opts.notifyInitialMode) {
9
- await opts.onModeChange?.(currentMode);
10
- }
11
- while (true) {
12
- opts.onIteration?.(currentMode);
13
- const result = await opts.launchers[currentMode]();
14
- if (result.type === "exit") {
15
- return result.value;
16
- }
17
- currentMode = result.mode;
18
- await opts.onModeChange?.(currentMode);
19
- }
20
- }
21
-
22
- function createKeepAliveController(opts) {
23
- let thinking = opts.initialThinking ?? false;
24
- let mode = opts.initialMode;
25
- let disposed = false;
26
- const sync = () => {
27
- if (disposed) {
28
- return;
29
- }
30
- opts.send(thinking, mode);
31
- };
32
- sync();
33
- const intervalId = setInterval(sync, opts.intervalMs ?? 2e3);
34
- return {
35
- dispose: () => {
36
- if (disposed) {
37
- return;
38
- }
39
- disposed = true;
40
- clearInterval(intervalId);
41
- },
42
- getMode: () => mode,
43
- getThinking: () => thinking,
44
- setMode: (nextMode) => {
45
- mode = nextMode;
46
- sync();
47
- },
48
- setThinking: (nextThinking) => {
49
- thinking = nextThinking;
50
- sync();
51
- },
52
- sync
53
- };
54
- }
55
-
56
- class ProviderSelectionHandler {
57
- pendingRequests = /* @__PURE__ */ new Map();
58
- session;
59
- providerLabel;
60
- constructor(session, providerLabel) {
61
- this.session = session;
62
- this.providerLabel = providerLabel;
63
- this.setupRpcHandler();
64
- }
65
- updateSession(newSession) {
66
- this.session = newSession;
67
- this.setupRpcHandler();
68
- }
69
- async requestSelection(request) {
70
- return new Promise((resolve, reject) => {
71
- const pending = {
72
- resolve,
73
- reject,
74
- request
75
- };
76
- pending.timeoutHandle = setTimeout(() => {
77
- this.handleSelectionTimeout(request.id, pending);
78
- }, registerKillSessionHandler.getPendingInteractionTimeoutMs());
79
- this.pendingRequests.set(request.id, pending);
80
- this.session.updateAgentState((currentState) => ({
81
- ...currentState,
82
- requests: {
83
- ...currentState.requests,
84
- [request.id]: {
85
- tool: "AskUserQuestion",
86
- arguments: {
87
- requestKind: "selection",
88
- questions: [
89
- {
90
- header: this.providerLabel,
91
- question: request.message,
92
- multiSelect: false,
93
- options: request.options.map((option) => ({
94
- label: option.label,
95
- description: option.description || option.optionId,
96
- optionId: option.optionId
97
- }))
98
- }
99
- ]
100
- },
101
- createdAt: Date.now(),
102
- requestKind: "selection",
103
- options: request.options,
104
- defaultOptionId: request.defaultOptionId
105
- }
106
- }
107
- }));
108
- api.logger.debug(`[${this.providerLabel}] Selection request sent (${request.id}) with ${request.options.length} options`);
109
- });
110
- }
111
- hasPendingRequests() {
112
- return this.pendingRequests.size > 0;
113
- }
114
- supersedePendingRequests(reason = registerKillSessionHandler.INTERACTION_SUPERSEDED_ERROR) {
115
- const pendingSnapshot = Array.from(this.pendingRequests.entries());
116
- if (pendingSnapshot.length === 0) {
117
- return 0;
118
- }
119
- this.pendingRequests.clear();
120
- const completedAt = Date.now();
121
- for (const [, pending] of pendingSnapshot) {
122
- this.clearPendingRequestTimeout(pending);
123
- pending.reject(new Error(reason));
124
- }
125
- this.session.updateAgentState((currentState) => {
126
- const requests = { ...currentState.requests || {} };
127
- const completedRequests = { ...currentState.completedRequests || {} };
128
- for (const [id, request] of Object.entries(requests)) {
129
- if (request.requestKind !== "selection") {
130
- continue;
131
- }
132
- completedRequests[id] = {
133
- ...request,
134
- completedAt,
135
- status: "canceled",
136
- reason,
137
- requestKind: "selection"
138
- };
139
- delete requests[id];
140
- }
141
- return {
142
- ...currentState,
143
- requests,
144
- completedRequests
145
- };
146
- });
147
- api.logger.debug(`[${this.providerLabel}] Superseded ${pendingSnapshot.length} pending selection request(s)`);
148
- return pendingSnapshot.length;
149
- }
150
- reset(reason = "Session reset") {
151
- const pendingSnapshot = Array.from(this.pendingRequests.entries());
152
- this.pendingRequests.clear();
153
- for (const [, pending] of pendingSnapshot) {
154
- this.clearPendingRequestTimeout(pending);
155
- pending.reject(new Error(reason));
156
- }
157
- this.session.updateAgentState((currentState) => {
158
- const requests = { ...currentState.requests || {} };
159
- const completedRequests = { ...currentState.completedRequests || {} };
160
- for (const [id, request] of Object.entries(requests)) {
161
- if (request.requestKind !== "selection") {
162
- continue;
163
- }
164
- completedRequests[id] = {
165
- ...request,
166
- completedAt: Date.now(),
167
- status: "canceled",
168
- reason,
169
- requestKind: "selection"
170
- };
171
- delete requests[id];
172
- }
173
- return {
174
- ...currentState,
175
- requests,
176
- completedRequests
177
- };
178
- });
179
- }
180
- setupRpcHandler() {
181
- this.session.rpcHandlerManager.registerHandler("selection", async (response) => {
182
- const pending = this.pendingRequests.get(response.id);
183
- if (!pending) {
184
- api.logger.debug(`[${this.providerLabel}] Selection request not found or already resolved`);
185
- return;
186
- }
187
- this.pendingRequests.delete(response.id);
188
- this.clearPendingRequestTimeout(pending);
189
- pending.resolve(response);
190
- this.session.updateAgentState((currentState) => {
191
- const request = currentState.requests?.[response.id];
192
- if (!request) {
193
- return currentState;
194
- }
195
- const { [response.id]: _, ...remainingRequests } = currentState.requests || {};
196
- return {
197
- ...currentState,
198
- requests: remainingRequests,
199
- completedRequests: {
200
- ...currentState.completedRequests,
201
- [response.id]: {
202
- ...request,
203
- completedAt: Date.now(),
204
- status: "approved",
205
- requestKind: "selection",
206
- selectedOptionId: response.optionId
207
- }
208
- }
209
- };
210
- });
211
- });
212
- }
213
- clearPendingRequestTimeout(pending) {
214
- if (pending?.timeoutHandle) {
215
- clearTimeout(pending.timeoutHandle);
216
- pending.timeoutHandle = void 0;
217
- }
218
- }
219
- handleSelectionTimeout(requestId, pending) {
220
- const active = this.pendingRequests.get(requestId);
221
- if (!active || active !== pending) {
222
- return;
223
- }
224
- this.pendingRequests.delete(requestId);
225
- this.clearPendingRequestTimeout(active);
226
- active.reject(new Error(registerKillSessionHandler.INTERACTION_TIMED_OUT_ERROR));
227
- this.session.updateAgentState((currentState) => {
228
- const request = currentState.requests?.[requestId] || {
229
- tool: "AskUserQuestion",
230
- arguments: {
231
- requestKind: "selection",
232
- questions: []
233
- },
234
- createdAt: Date.now(),
235
- requestKind: "selection",
236
- options: active.request.options,
237
- defaultOptionId: active.request.defaultOptionId
238
- };
239
- const { [requestId]: _, ...remainingRequests } = currentState.requests || {};
240
- return {
241
- ...currentState,
242
- requests: remainingRequests,
243
- completedRequests: {
244
- ...currentState.completedRequests,
245
- [requestId]: {
246
- ...request,
247
- completedAt: Date.now(),
248
- status: "canceled",
249
- reason: registerKillSessionHandler.INTERACTION_TIMED_OUT_ERROR,
250
- requestKind: "selection"
251
- }
252
- }
253
- };
254
- });
255
- this.session.sendSessionEvent({
256
- type: "message",
257
- message: "Pending interaction timed out waiting for a response. Send a new message to continue."
258
- });
259
- api.logger.debug(`[${this.providerLabel}] Selection request timed out (${requestId})`);
260
- }
261
- }
262
-
263
- exports.ProviderSelectionHandler = ProviderSelectionHandler;
264
- exports.createKeepAliveController = createKeepAliveController;
265
- exports.runModeLoop = runModeLoop;