























@@ -1,10 +1,8 @@
11import {
22abortActiveReplyRuns,
33abortReplyRunBySessionId,
4-getActiveReplyRunCount,
54isReplyRunActiveForSessionId,
65isReplyRunStreamingForSessionId,
7-listActiveReplyRunSessionIds,
86queueReplyRunMessage,
97resolveActiveReplyRunSessionId,
108waitForReplyRunEndBySessionId,
@@ -14,64 +12,26 @@ import {
1412logMessageQueued,
1513logSessionStateChange,
1614} from "../../logging/diagnostic.js";
17-import { resolveGlobalSingleton } from "../../shared/global-singleton.js";
1815import { normalizeOptionalString } from "../../shared/string-coerce.js";
16+import {
17+ACTIVE_EMBEDDED_RUNS,
18+ACTIVE_EMBEDDED_RUN_SESSION_IDS_BY_KEY,
19+ACTIVE_EMBEDDED_RUN_SNAPSHOTS,
20+EMBEDDED_RUN_MODEL_SWITCH_REQUESTS,
21+EMBEDDED_RUN_WAITERS,
22+getActiveEmbeddedRunCount,
23+type ActiveEmbeddedRunSnapshot,
24+type EmbeddedPiQueueHandle,
25+type EmbeddedRunModelSwitchRequest,
26+type EmbeddedRunWaiter,
27+} from "./run-state.js";
192820-export type EmbeddedPiQueueHandle = {
21-kind?: "embedded";
22-queueMessage: (text: string) => Promise<void>;
23-isStreaming: () => boolean;
24-isCompacting: () => boolean;
25-cancel?: (reason?: "user_abort" | "restart" | "superseded") => void;
26-abort: () => void;
27-};
28-29-export type ActiveEmbeddedRunSnapshot = {
30-transcriptLeafId: string | null;
31-messages?: unknown[];
32-inFlightPrompt?: string;
33-};
34-35-type EmbeddedRunWaiter = {
36-resolve: (ended: boolean) => void;
37-timer: NodeJS.Timeout;
38-};
39-40-export type EmbeddedRunModelSwitchRequest = {
41-provider: string;
42-model: string;
43-authProfileId?: string;
44-authProfileIdSource?: "auto" | "user";
45-};
46-47-/**
48- * Use global singleton state so busy/streaming checks stay consistent even
49- * when the bundler emits multiple copies of this module into separate chunks.
50- */
51-const EMBEDDED_RUN_STATE_KEY = Symbol.for("openclaw.embeddedRunState");
52-53-const embeddedRunState = resolveGlobalSingleton(EMBEDDED_RUN_STATE_KEY, () => ({
54-activeRuns: new Map<string, EmbeddedPiQueueHandle>(),
55-snapshots: new Map<string, ActiveEmbeddedRunSnapshot>(),
56-sessionIdsByKey: new Map<string, string>(),
57-waiters: new Map<string, Set<EmbeddedRunWaiter>>(),
58-modelSwitchRequests: new Map<string, EmbeddedRunModelSwitchRequest>(),
59-}));
60-const ACTIVE_EMBEDDED_RUNS =
61-embeddedRunState.activeRuns ??
62-(embeddedRunState.activeRuns = new Map<string, EmbeddedPiQueueHandle>());
63-const ACTIVE_EMBEDDED_RUN_SNAPSHOTS =
64-embeddedRunState.snapshots ??
65-(embeddedRunState.snapshots = new Map<string, ActiveEmbeddedRunSnapshot>());
66-const ACTIVE_EMBEDDED_RUN_SESSION_IDS_BY_KEY =
67-embeddedRunState.sessionIdsByKey ??
68-(embeddedRunState.sessionIdsByKey = new Map<string, string>());
69-const EMBEDDED_RUN_WAITERS =
70-embeddedRunState.waiters ??
71-(embeddedRunState.waiters = new Map<string, Set<EmbeddedRunWaiter>>());
72-const EMBEDDED_RUN_MODEL_SWITCH_REQUESTS =
73-embeddedRunState.modelSwitchRequests ??
74-(embeddedRunState.modelSwitchRequests = new Map<string, EmbeddedRunModelSwitchRequest>());
29+export {
30+getActiveEmbeddedRunCount,
31+type ActiveEmbeddedRunSnapshot,
32+type EmbeddedPiQueueHandle,
33+type EmbeddedRunModelSwitchRequest,
34+} from "./run-state.js";
75357636function setActiveRunSessionKey(sessionKey: string | undefined, sessionId: string): void {
7737const normalizedSessionKey = sessionKey?.trim();
@@ -216,16 +176,6 @@ export function resolveActiveEmbeddedRunSessionId(sessionKey: string): string |
216176);
217177}
218178219-export function getActiveEmbeddedRunCount(): number {
220-let activeCount = ACTIVE_EMBEDDED_RUNS.size;
221-for (const sessionId of listActiveReplyRunSessionIds()) {
222-if (!ACTIVE_EMBEDDED_RUNS.has(sessionId)) {
223-activeCount += 1;
224-}
225-}
226-return Math.max(activeCount, getActiveReplyRunCount());
227-}
228-229179export function getActiveEmbeddedRunSnapshot(
230180sessionId: string,
231181): ActiveEmbeddedRunSnapshot | undefined {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。