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.
- package/dist/{BaseReasoningProcessor-0nj-PMFc.cjs → BaseReasoningProcessor-BzbDRBqp.cjs} +3 -3
- package/dist/{BaseReasoningProcessor-DnVC7liC.mjs → BaseReasoningProcessor-DH3BCCTf.mjs} +3 -3
- package/dist/ProviderSelectionHandler-CbkbtIRC.mjs +673 -0
- package/dist/ProviderSelectionHandler-meVvz9NZ.cjs +680 -0
- package/dist/{api-MGlKcEf3.cjs → api-C4bF6GEA.cjs} +35 -3
- package/dist/{api-DJe9WP9M.mjs → api-DX7Vg4Hz.mjs} +35 -4
- package/dist/{command-DAlFmWmr.cjs → command-CF6Wi_v2.cjs} +3 -3
- package/dist/{command-CfyFnMv2.mjs → command-DicPZ-Up.mjs} +3 -3
- package/dist/{index-CgVjDJpt.cjs → index-BybqdOf2.cjs} +63 -15
- package/dist/{index-CHXCgpwi.mjs → index-CEJmASSW.mjs} +60 -12
- package/dist/index.cjs +3 -3
- package/dist/index.mjs +3 -3
- package/dist/lib.cjs +1 -1
- package/dist/lib.d.cts +108 -105
- package/dist/lib.d.mts +108 -105
- package/dist/lib.mjs +1 -1
- package/dist/{persistence-DLFUNI9q.cjs → persistence-CdqBfAwo.cjs} +1 -1
- package/dist/{persistence-CkP90vEt.mjs → persistence-xypxp7ei.mjs} +1 -1
- package/dist/{registerKillSessionHandler-Cs_INk4A.cjs → registerKillSessionHandler-BK3fZIch.cjs} +14 -364
- package/dist/{registerKillSessionHandler-DsHTZDsU.mjs → registerKillSessionHandler-BNN-_qNu.mjs} +15 -362
- package/dist/{runClaude-DAQAEmHe.mjs → runClaude-B-ex_tr3.mjs} +8 -6
- package/dist/{runClaude-BGSgcyUp.cjs → runClaude-CT3jCZjH.cjs} +11 -9
- package/dist/{runCodex-B2UpSn82.mjs → runCodex-DhbvUtJC.mjs} +9 -7
- package/dist/{runCodex-earICaxw.cjs → runCodex-DodH9jhh.cjs} +12 -10
- package/dist/{runGemini-BBUmH1Qh.mjs → runGemini-BsFR5Pd3.mjs} +12 -74
- package/dist/{runGemini-D5RAIaR0.cjs → runGemini-CeHCZ1l4.cjs} +12 -74
- package/package.json +1 -1
- package/dist/ProviderSelectionHandler-Bafuy28L.cjs +0 -265
- 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,
|
|
5
|
-
import { B as BasePermissionHandler, C as ConversationHistory$1, e as ensureManagedProviderMachine, M as MissingMachineIdError, s as syncControlledByUserState, b as MessageQueue2, h as hashObject,
|
|
6
|
-
import { g as getInitialGeminiModel, r as readGeminiLocalConfig, G as GEMINI_MODEL_ENV, s as saveGeminiModelToConfig, a as createGeminiBackend, b as stopCaffeinate } from './index-
|
|
7
|
-
import { B as BaseReasoningProcessor, b as bootstrapManagedProviderSession } from './BaseReasoningProcessor-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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-
|
|
7
|
-
var registerKillSessionHandler = require('./registerKillSessionHandler-
|
|
8
|
-
var index = require('./index-
|
|
9
|
-
var BaseReasoningProcessor = require('./BaseReasoningProcessor-
|
|
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-
|
|
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
|
-
|
|
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
|
-
|
|
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,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;
|