happy-imou-cloud 2.1.7 → 2.1.9

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 (27) hide show
  1. package/dist/{BaseReasoningProcessor-C0A6Jr8V.mjs → BaseReasoningProcessor-CgEO6Vh-.mjs} +4 -3
  2. package/dist/{BaseReasoningProcessor-iSuaFeZH.cjs → BaseReasoningProcessor-DV6TAtd7.cjs} +4 -3
  3. package/dist/{ProviderSelectionHandler-DI9QK1iY.cjs → ProviderSelectionHandler-C6ILAmE3.cjs} +2 -2
  4. package/dist/{ProviderSelectionHandler-WT-tvePy.mjs → ProviderSelectionHandler-dczuX21U.mjs} +2 -2
  5. package/dist/{api-BYKV7vX6.mjs → api-CfHYTLZX.mjs} +141 -35
  6. package/dist/{api-CdGT5hsH.cjs → api-CfmTDha2.cjs} +141 -35
  7. package/dist/{command-C1cKqmsa.mjs → command-B0HfYWYW.mjs} +3 -3
  8. package/dist/{command-uyA8cYmL.cjs → command-Bw2XKjA9.cjs} +3 -3
  9. package/dist/{index-BAhlFq45.mjs → index-BKjWLXkN.mjs} +146 -30
  10. package/dist/{index-D_S_7bqK.cjs → index-C3bSe5_d.cjs} +149 -33
  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 +8 -4
  15. package/dist/lib.d.mts +8 -4
  16. package/dist/lib.mjs +1 -1
  17. package/dist/{persistence-CMvrZ4SA.cjs → persistence-Db4p7gsX.cjs} +1 -1
  18. package/dist/{persistence-B8Wgn6aN.mjs → persistence-Nun5c360.mjs} +1 -1
  19. package/dist/{registerKillSessionHandler-5DVlZaJx.mjs → registerKillSessionHandler-C1S9ytML.mjs} +3 -3
  20. package/dist/{registerKillSessionHandler-DjxtkGMv.cjs → registerKillSessionHandler-FIQEW2Rx.cjs} +3 -3
  21. package/dist/{runClaude-WB884iOO.mjs → runClaude-ClXU2LZA.mjs} +9 -5
  22. package/dist/{runClaude-DNZFsQY0.cjs → runClaude-Dxye_oZf.cjs} +9 -5
  23. package/dist/{runCodex-MJar-238.mjs → runCodex-CXu7_Wgk.mjs} +96 -21
  24. package/dist/{runCodex-WZ91ZLK7.cjs → runCodex-IaL6Vqwc.cjs} +96 -21
  25. package/dist/{runGemini-B_wCHgPU.cjs → runGemini-BgcZcZsv.cjs} +11 -5
  26. package/dist/{runGemini-BPGpwljp.mjs → runGemini-BlJjRWN1.mjs} +11 -5
  27. package/package.json +1 -1
@@ -1,6 +1,6 @@
1
- import { l as logger, b as connectionState, A as ApiClient } from './api-BYKV7vX6.mjs';
2
- import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, c as registerKillSessionHandler, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-5DVlZaJx.mjs';
3
- import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-BAhlFq45.mjs';
1
+ import { l as logger, b as connectionState, A as ApiClient } from './api-CfHYTLZX.mjs';
2
+ import { B as BasePermissionHandler, h as hashObject, d as MessageBuffer, C as ConversationHistory$1, f as buildHappyOrgTurnPrompt, w as waitForResponseCompleteWithAbort, i as finalizeHappyOrgTurn, c as registerKillSessionHandler, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession, e as ensureManagedProviderMachine, M as MissingMachineIdError, b as MessageQueue2, r as resolveHappyOrgQueuedTurn, s as syncControlledByUserState } from './registerKillSessionHandler-C1S9ytML.mjs';
3
+ import { f as formatDisplayMessage, v as validateCodexAcpSpawn, h as createCodexBackend, t as truncateDisplayMessage, b as closeProviderSession, e as stopCaffeinate, i as readManagedSessionTag, j as resolveManagedSessionTag } from './index-BKjWLXkN.mjs';
4
4
  import 'cross-spawn';
5
5
  import '@agentclientprotocol/sdk';
6
6
  import { randomUUID } from 'node:crypto';
@@ -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-B8Wgn6aN.mjs';
17
+ import './persistence-Nun5c360.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-WT-tvePy.mjs';
29
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-C0A6Jr8V.mjs';
28
+ import { c as createKeepAliveController, P as ProviderSelectionHandler, r as runModeLoop } from './ProviderSelectionHandler-dczuX21U.mjs';
29
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-CgEO6Vh-.mjs';
30
30
  import 'zod';
31
31
  import 'socket.io-client';
32
32
  import 'expo-server-sdk';
@@ -977,6 +977,10 @@ async function codexRemoteLauncher(session) {
977
977
  let message = pending;
978
978
  pending = null;
979
979
  if (!message) {
980
+ if (!shouldExit && session.queue.size() === 0 && !readyAlreadySent) {
981
+ sendReady();
982
+ readyAlreadySent = true;
983
+ }
980
984
  const waitSignal = abortController.signal;
981
985
  const batch = await session.queue.waitForMessagesAndGetAsString(waitSignal);
982
986
  if (!batch) {
@@ -1155,6 +1159,58 @@ async function codexLoop(opts) {
1155
1159
  });
1156
1160
  }
1157
1161
 
1162
+ function normalizeFatalProcessError(error) {
1163
+ if (error instanceof Error) {
1164
+ return error;
1165
+ }
1166
+ const message = typeof error === "string" ? error : (() => {
1167
+ try {
1168
+ const serialized = JSON.stringify(error);
1169
+ return serialized && serialized !== "{}" ? serialized : String(error);
1170
+ } catch {
1171
+ return String(error);
1172
+ }
1173
+ })();
1174
+ return new Error(message || "Unknown fatal process error");
1175
+ }
1176
+ function installFatalProcessHandlers(options) {
1177
+ const target = options.target ?? process;
1178
+ const exit = options.exit ?? process.exit;
1179
+ let shuttingDown = false;
1180
+ let disposed = false;
1181
+ const handleFatalEvent = async (event, reason) => {
1182
+ const error = normalizeFatalProcessError(reason);
1183
+ logger.debug(`[${options.label}] Fatal ${event}`, error);
1184
+ if (shuttingDown) {
1185
+ logger.debug(`[${options.label}] Ignoring duplicate fatal ${event} while shutdown is already in progress`);
1186
+ return;
1187
+ }
1188
+ shuttingDown = true;
1189
+ try {
1190
+ await options.cleanup({ event, error });
1191
+ } catch (cleanupError) {
1192
+ logger.debug(`[${options.label}] Fatal cleanup failed`, cleanupError);
1193
+ }
1194
+ exit(1);
1195
+ };
1196
+ const onUncaughtException = (error) => {
1197
+ void handleFatalEvent("uncaughtException", error);
1198
+ };
1199
+ const onUnhandledRejection = (reason) => {
1200
+ void handleFatalEvent("unhandledRejection", reason);
1201
+ };
1202
+ target.on("uncaughtException", onUncaughtException);
1203
+ target.on("unhandledRejection", onUnhandledRejection);
1204
+ return () => {
1205
+ if (disposed) {
1206
+ return;
1207
+ }
1208
+ disposed = true;
1209
+ target.off("uncaughtException", onUncaughtException);
1210
+ target.off("unhandledRejection", onUnhandledRejection);
1211
+ };
1212
+ }
1213
+
1158
1214
  function resolveInitialCodexPermissionMode(opts) {
1159
1215
  if (opts.permissionMode) {
1160
1216
  return opts.permissionMode;
@@ -1296,30 +1352,49 @@ async function runCodex(opts) {
1296
1352
  let loopError;
1297
1353
  let closeError;
1298
1354
  let observerCloseError;
1299
- try {
1300
- exitCode = await codexLoop({
1301
- session: codexSession,
1302
- startingMode: requestedStartingMode
1303
- });
1304
- logger.debug(`[codex] codexLoop resolved with exit code ${exitCode}`);
1305
- } catch (error) {
1306
- loopError = error;
1307
- } finally {
1355
+ let cleanupStarted = false;
1356
+ const cleanupResources = async (closeOptions = {
1357
+ archiveOnClose: true
1358
+ }) => {
1359
+ if (cleanupStarted) {
1360
+ return;
1361
+ }
1362
+ cleanupStarted = true;
1308
1363
  try {
1309
- await closeProviderSession(sessionClient, {
1310
- archiveOnClose: true
1311
- });
1364
+ await closeProviderSession(sessionClient, closeOptions);
1312
1365
  } catch (error) {
1313
- closeError = error;
1366
+ closeError = closeError ?? error;
1314
1367
  }
1315
1368
  try {
1316
1369
  await userScopedObserver?.close();
1317
1370
  } catch (error) {
1318
- observerCloseError = error;
1371
+ observerCloseError = observerCloseError ?? error;
1319
1372
  }
1320
1373
  stopCaffeinate();
1321
1374
  reconnectionHandle?.cancel();
1322
- codexSession.cleanup();
1375
+ codexSession?.cleanup();
1376
+ };
1377
+ const disposeFatalProcessHandlers = installFatalProcessHandlers({
1378
+ label: "codex",
1379
+ cleanup: async ({ event, error }) => {
1380
+ await cleanupResources({
1381
+ archiveReason: `Fatal ${event}: ${error.message}`
1382
+ });
1383
+ }
1384
+ });
1385
+ try {
1386
+ exitCode = await codexLoop({
1387
+ session: codexSession,
1388
+ startingMode: requestedStartingMode
1389
+ });
1390
+ logger.debug(`[codex] codexLoop resolved with exit code ${exitCode}`);
1391
+ } catch (error) {
1392
+ loopError = error;
1393
+ } finally {
1394
+ disposeFatalProcessHandlers();
1395
+ await cleanupResources({
1396
+ archiveOnClose: true
1397
+ });
1323
1398
  }
1324
1399
  if (loopError !== void 0) {
1325
1400
  logger.debug("[codex] runCodex exiting after loop error", loopError);
@@ -1,8 +1,8 @@
1
1
  'use strict';
2
2
 
3
- var api = require('./api-CdGT5hsH.cjs');
4
- var registerKillSessionHandler = require('./registerKillSessionHandler-DjxtkGMv.cjs');
5
- var index = require('./index-D_S_7bqK.cjs');
3
+ var api = require('./api-CfmTDha2.cjs');
4
+ var registerKillSessionHandler = require('./registerKillSessionHandler-FIQEW2Rx.cjs');
5
+ var index = require('./index-C3bSe5_d.cjs');
6
6
  require('cross-spawn');
7
7
  require('@agentclientprotocol/sdk');
8
8
  var node_crypto = require('node:crypto');
@@ -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-CMvrZ4SA.cjs');
19
+ require('./persistence-Db4p7gsX.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-DI9QK1iY.cjs');
31
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-iSuaFeZH.cjs');
30
+ var ProviderSelectionHandler = require('./ProviderSelectionHandler-C6ILAmE3.cjs');
31
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-DV6TAtd7.cjs');
32
32
  require('zod');
33
33
  require('socket.io-client');
34
34
  require('expo-server-sdk');
@@ -979,6 +979,10 @@ async function codexRemoteLauncher(session) {
979
979
  let message = pending;
980
980
  pending = null;
981
981
  if (!message) {
982
+ if (!shouldExit && session.queue.size() === 0 && !readyAlreadySent) {
983
+ sendReady();
984
+ readyAlreadySent = true;
985
+ }
982
986
  const waitSignal = abortController.signal;
983
987
  const batch = await session.queue.waitForMessagesAndGetAsString(waitSignal);
984
988
  if (!batch) {
@@ -1157,6 +1161,58 @@ async function codexLoop(opts) {
1157
1161
  });
1158
1162
  }
1159
1163
 
1164
+ function normalizeFatalProcessError(error) {
1165
+ if (error instanceof Error) {
1166
+ return error;
1167
+ }
1168
+ const message = typeof error === "string" ? error : (() => {
1169
+ try {
1170
+ const serialized = JSON.stringify(error);
1171
+ return serialized && serialized !== "{}" ? serialized : String(error);
1172
+ } catch {
1173
+ return String(error);
1174
+ }
1175
+ })();
1176
+ return new Error(message || "Unknown fatal process error");
1177
+ }
1178
+ function installFatalProcessHandlers(options) {
1179
+ const target = options.target ?? process;
1180
+ const exit = options.exit ?? process.exit;
1181
+ let shuttingDown = false;
1182
+ let disposed = false;
1183
+ const handleFatalEvent = async (event, reason) => {
1184
+ const error = normalizeFatalProcessError(reason);
1185
+ api.logger.debug(`[${options.label}] Fatal ${event}`, error);
1186
+ if (shuttingDown) {
1187
+ api.logger.debug(`[${options.label}] Ignoring duplicate fatal ${event} while shutdown is already in progress`);
1188
+ return;
1189
+ }
1190
+ shuttingDown = true;
1191
+ try {
1192
+ await options.cleanup({ event, error });
1193
+ } catch (cleanupError) {
1194
+ api.logger.debug(`[${options.label}] Fatal cleanup failed`, cleanupError);
1195
+ }
1196
+ exit(1);
1197
+ };
1198
+ const onUncaughtException = (error) => {
1199
+ void handleFatalEvent("uncaughtException", error);
1200
+ };
1201
+ const onUnhandledRejection = (reason) => {
1202
+ void handleFatalEvent("unhandledRejection", reason);
1203
+ };
1204
+ target.on("uncaughtException", onUncaughtException);
1205
+ target.on("unhandledRejection", onUnhandledRejection);
1206
+ return () => {
1207
+ if (disposed) {
1208
+ return;
1209
+ }
1210
+ disposed = true;
1211
+ target.off("uncaughtException", onUncaughtException);
1212
+ target.off("unhandledRejection", onUnhandledRejection);
1213
+ };
1214
+ }
1215
+
1160
1216
  function resolveInitialCodexPermissionMode(opts) {
1161
1217
  if (opts.permissionMode) {
1162
1218
  return opts.permissionMode;
@@ -1298,30 +1354,49 @@ async function runCodex(opts) {
1298
1354
  let loopError;
1299
1355
  let closeError;
1300
1356
  let observerCloseError;
1301
- try {
1302
- exitCode = await codexLoop({
1303
- session: codexSession,
1304
- startingMode: requestedStartingMode
1305
- });
1306
- api.logger.debug(`[codex] codexLoop resolved with exit code ${exitCode}`);
1307
- } catch (error) {
1308
- loopError = error;
1309
- } finally {
1357
+ let cleanupStarted = false;
1358
+ const cleanupResources = async (closeOptions = {
1359
+ archiveOnClose: true
1360
+ }) => {
1361
+ if (cleanupStarted) {
1362
+ return;
1363
+ }
1364
+ cleanupStarted = true;
1310
1365
  try {
1311
- await index.closeProviderSession(sessionClient, {
1312
- archiveOnClose: true
1313
- });
1366
+ await index.closeProviderSession(sessionClient, closeOptions);
1314
1367
  } catch (error) {
1315
- closeError = error;
1368
+ closeError = closeError ?? error;
1316
1369
  }
1317
1370
  try {
1318
1371
  await userScopedObserver?.close();
1319
1372
  } catch (error) {
1320
- observerCloseError = error;
1373
+ observerCloseError = observerCloseError ?? error;
1321
1374
  }
1322
1375
  index.stopCaffeinate();
1323
1376
  reconnectionHandle?.cancel();
1324
- codexSession.cleanup();
1377
+ codexSession?.cleanup();
1378
+ };
1379
+ const disposeFatalProcessHandlers = installFatalProcessHandlers({
1380
+ label: "codex",
1381
+ cleanup: async ({ event, error }) => {
1382
+ await cleanupResources({
1383
+ archiveReason: `Fatal ${event}: ${error.message}`
1384
+ });
1385
+ }
1386
+ });
1387
+ try {
1388
+ exitCode = await codexLoop({
1389
+ session: codexSession,
1390
+ startingMode: requestedStartingMode
1391
+ });
1392
+ api.logger.debug(`[codex] codexLoop resolved with exit code ${exitCode}`);
1393
+ } catch (error) {
1394
+ loopError = error;
1395
+ } finally {
1396
+ disposeFatalProcessHandlers();
1397
+ await cleanupResources({
1398
+ archiveOnClose: true
1399
+ });
1325
1400
  }
1326
1401
  if (loopError !== void 0) {
1327
1402
  api.logger.debug("[codex] runCodex exiting after loop error", loopError);
@@ -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-CdGT5hsH.cjs');
7
- var registerKillSessionHandler = require('./registerKillSessionHandler-DjxtkGMv.cjs');
8
- var index = require('./index-D_S_7bqK.cjs');
9
- var BaseReasoningProcessor = require('./BaseReasoningProcessor-iSuaFeZH.cjs');
6
+ var api = require('./api-CfmTDha2.cjs');
7
+ var registerKillSessionHandler = require('./registerKillSessionHandler-FIQEW2Rx.cjs');
8
+ var index = require('./index-C3bSe5_d.cjs');
9
+ var BaseReasoningProcessor = require('./BaseReasoningProcessor-DV6TAtd7.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-CMvrZ4SA.cjs');
20
+ require('./persistence-Db4p7gsX.cjs');
21
21
  require('open');
22
22
  require('chalk');
23
23
  require('fs');
@@ -677,6 +677,7 @@ async function runGemini(opts) {
677
677
  let shouldInjectHistoryOnNextSession = false;
678
678
  let currentModeHash = null;
679
679
  let unexpectedRuntimeStopRecovery = null;
680
+ let readyAlreadySent = false;
680
681
  async function handleAbort() {
681
682
  api.logger.debug("[Gemini] Abort requested - stopping current task");
682
683
  if (!turnAbortedSent) {
@@ -1102,6 +1103,10 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1102
1103
  let message = pending;
1103
1104
  pending = null;
1104
1105
  if (!message) {
1106
+ if (!shouldExit && messageQueue.size() === 0 && !readyAlreadySent) {
1107
+ sendReady();
1108
+ readyAlreadySent = true;
1109
+ }
1105
1110
  api.logger.debug("[gemini] Main loop: waiting for messages from queue...");
1106
1111
  const waitSignal = abortController.signal;
1107
1112
  const batch = await messageQueue.waitForMessagesAndGetAsString(waitSignal);
@@ -1136,6 +1141,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1136
1141
  currentModeHash = message.hash;
1137
1142
  }
1138
1143
  currentModeHash = message.hash;
1144
+ readyAlreadySent = false;
1139
1145
  const userMessageToShow = message.mode?.originalUserMessage || message.message;
1140
1146
  messageBuffer.addMessage(userMessageToShow, "user");
1141
1147
  isProcessingMessage = true;
@@ -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-BYKV7vX6.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 finalizeHappyOrgTurn, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession } from './registerKillSessionHandler-5DVlZaJx.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-BAhlFq45.mjs';
7
- import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-C0A6Jr8V.mjs';
4
+ import { l as logger, b as connectionState, A as ApiClient } from './api-CfHYTLZX.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 finalizeHappyOrgTurn, l as launchRuntimeHandleWithFactoryResult, j as inferToolResultError, k as forwardAgentMessageToProviderSession } from './registerKillSessionHandler-C1S9ytML.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-BKjWLXkN.mjs';
7
+ import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-CgEO6Vh-.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-B8Wgn6aN.mjs';
18
+ import './persistence-Nun5c360.mjs';
19
19
  import 'open';
20
20
  import 'chalk';
21
21
  import 'fs';
@@ -675,6 +675,7 @@ async function runGemini(opts) {
675
675
  let shouldInjectHistoryOnNextSession = false;
676
676
  let currentModeHash = null;
677
677
  let unexpectedRuntimeStopRecovery = null;
678
+ let readyAlreadySent = false;
678
679
  async function handleAbort() {
679
680
  logger.debug("[Gemini] Abort requested - stopping current task");
680
681
  if (!turnAbortedSent) {
@@ -1100,6 +1101,10 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1100
1101
  let message = pending;
1101
1102
  pending = null;
1102
1103
  if (!message) {
1104
+ if (!shouldExit && messageQueue.size() === 0 && !readyAlreadySent) {
1105
+ sendReady();
1106
+ readyAlreadySent = true;
1107
+ }
1103
1108
  logger.debug("[gemini] Main loop: waiting for messages from queue...");
1104
1109
  const waitSignal = abortController.signal;
1105
1110
  const batch = await messageQueue.waitForMessagesAndGetAsString(waitSignal);
@@ -1134,6 +1139,7 @@ Guide: https://goo.gle/gemini-cli-auth-docs#workspace-gca`;
1134
1139
  currentModeHash = message.hash;
1135
1140
  }
1136
1141
  currentModeHash = message.hash;
1142
+ readyAlreadySent = false;
1137
1143
  const userMessageToShow = message.mode?.originalUserMessage || message.message;
1138
1144
  messageBuffer.addMessage(userMessageToShow, "user");
1139
1145
  isProcessingMessage = true;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "happy-imou-cloud",
3
- "version": "2.1.7",
3
+ "version": "2.1.9",
4
4
  "description": "hicloud - Imou 企业定制版。关键是 happy!移动端远程 AI 编程工具,支持 Claude Code、Codex 和 Gemini CLI",
5
5
  "author": "long.zhu",
6
6
  "license": "MIT",