


























@@ -24,10 +24,14 @@ import {
2424ACTIVE_EMBEDDED_RUN_SESSION_IDS_BY_FILE,
2525ACTIVE_EMBEDDED_RUN_SESSION_IDS_BY_KEY,
2626ACTIVE_EMBEDDED_RUN_SNAPSHOTS,
27+ABANDONED_EMBEDDED_RUNS_BY_SESSION_ID,
28+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_FILE,
29+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_KEY,
2730EMBEDDED_RUN_MODEL_SWITCH_REQUESTS,
2831EMBEDDED_RUN_WAITERS,
2932getActiveEmbeddedRunCount,
3033type ActiveEmbeddedRunSnapshot,
34+type AbandonedEmbeddedRun,
3135type EmbeddedAgentQueueHandle,
3236type EmbeddedAgentQueueMessageOptions,
3337type EmbeddedRunModelSwitchRequest,
@@ -136,6 +140,135 @@ function setActiveRunSessionFile(sessionFile: string | undefined, sessionId: str
136140);
137141}
138142143+function clearEmbeddedRunAbandonmentBySessionId(sessionId: string): void {
144+const abandonedRun = ABANDONED_EMBEDDED_RUNS_BY_SESSION_ID.get(sessionId);
145+if (!abandonedRun) {
146+return;
147+}
148+ABANDONED_EMBEDDED_RUNS_BY_SESSION_ID.delete(sessionId);
149+const normalizedSessionKey = abandonedRun.sessionKey?.trim();
150+if (
151+normalizedSessionKey &&
152+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_KEY.get(normalizedSessionKey) === sessionId
153+) {
154+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_KEY.delete(normalizedSessionKey);
155+}
156+const normalizedSessionFile = abandonedRun.sessionFile?.trim();
157+if (normalizedSessionFile) {
158+const sessionFileKey = resolveEmbeddedSessionFileKey(normalizedSessionFile);
159+if (ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_FILE.get(sessionFileKey) === sessionId) {
160+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_FILE.delete(sessionFileKey);
161+}
162+}
163+}
164+165+function clearEmbeddedRunAbandonmentBySessionKey(sessionKey: string | undefined): void {
166+const normalizedSessionKey = sessionKey?.trim();
167+if (!normalizedSessionKey) {
168+return;
169+}
170+const sessionId = ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_KEY.get(normalizedSessionKey);
171+if (sessionId) {
172+clearEmbeddedRunAbandonmentBySessionId(sessionId);
173+}
174+}
175+176+function clearEmbeddedRunAbandonmentBySessionFile(sessionFile: string | undefined): void {
177+const normalizedSessionFile = sessionFile?.trim();
178+if (!normalizedSessionFile) {
179+return;
180+}
181+const sessionFileKey = resolveEmbeddedSessionFileKey(normalizedSessionFile);
182+const sessionId = ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_FILE.get(sessionFileKey);
183+if (sessionId) {
184+clearEmbeddedRunAbandonmentBySessionId(sessionId);
185+}
186+}
187+188+export function clearEmbeddedRunAbandonment(params: {
189+sessionId?: string;
190+sessionKey?: string;
191+sessionFile?: string;
192+}): void {
193+const normalizedSessionId = params.sessionId?.trim();
194+if (normalizedSessionId) {
195+clearEmbeddedRunAbandonmentBySessionId(normalizedSessionId);
196+}
197+clearEmbeddedRunAbandonmentBySessionKey(params.sessionKey);
198+clearEmbeddedRunAbandonmentBySessionFile(params.sessionFile);
199+}
200+201+export function markEmbeddedRunAbandoned(params: {
202+sessionId: string;
203+sessionKey?: string;
204+sessionFile?: string;
205+reason: AbandonedEmbeddedRun["reason"];
206+}): void {
207+const sessionId = params.sessionId.trim();
208+if (!sessionId) {
209+return;
210+}
211+clearEmbeddedRunAbandonment({
212+ sessionId,
213+sessionKey: params.sessionKey,
214+sessionFile: params.sessionFile,
215+});
216+const abandonedRun: AbandonedEmbeddedRun = {
217+ sessionId,
218+abandonedAtMs: Date.now(),
219+reason: params.reason,
220+ ...(params.sessionKey?.trim() ? { sessionKey: params.sessionKey.trim() } : {}),
221+ ...(params.sessionFile?.trim() ? { sessionFile: params.sessionFile.trim() } : {}),
222+};
223+ABANDONED_EMBEDDED_RUNS_BY_SESSION_ID.set(sessionId, abandonedRun);
224+if (abandonedRun.sessionKey) {
225+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_KEY.set(abandonedRun.sessionKey, sessionId);
226+}
227+if (abandonedRun.sessionFile) {
228+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_FILE.set(
229+resolveEmbeddedSessionFileKey(abandonedRun.sessionFile),
230+sessionId,
231+);
232+}
233+}
234+235+export function markActiveEmbeddedRunAbandoned(params: {
236+sessionId: string;
237+handle: EmbeddedAgentQueueHandle;
238+sessionKey?: string;
239+sessionFile?: string;
240+reason: AbandonedEmbeddedRun["reason"];
241+}): boolean {
242+const sessionId = params.sessionId.trim();
243+if (!sessionId || ACTIVE_EMBEDDED_RUNS.get(sessionId) !== params.handle) {
244+return false;
245+}
246+markEmbeddedRunAbandoned(params);
247+return true;
248+}
249+250+export function isEmbeddedRunAbandoned(params: {
251+sessionId?: string;
252+sessionKey?: string;
253+sessionFile?: string;
254+}): boolean {
255+const normalizedSessionId = params.sessionId?.trim();
256+if (normalizedSessionId && ABANDONED_EMBEDDED_RUNS_BY_SESSION_ID.has(normalizedSessionId)) {
257+return true;
258+}
259+const normalizedSessionKey = params.sessionKey?.trim();
260+if (normalizedSessionKey && ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_KEY.has(normalizedSessionKey)) {
261+return true;
262+}
263+const normalizedSessionFile = params.sessionFile?.trim();
264+return Boolean(
265+normalizedSessionFile &&
266+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_FILE.has(
267+resolveEmbeddedSessionFileKey(normalizedSessionFile),
268+),
269+);
270+}
271+139272function clearActiveRunSessionFiles(sessionId: string, sessionFile?: string): void {
140273const normalizedSessionFile = sessionFile?.trim();
141274if (normalizedSessionFile) {
@@ -586,6 +719,7 @@ export function setActiveEmbeddedRun(
586719sessionFile?: string,
587720) {
588721const wasActive = ACTIVE_EMBEDDED_RUNS.has(sessionId);
722+clearEmbeddedRunAbandonment({ sessionId, sessionKey, sessionFile });
589723ACTIVE_EMBEDDED_RUNS.set(sessionId, handle);
590724setActiveRunSessionKey(sessionKey, sessionId);
591725clearActiveRunSessionFiles(sessionId);
@@ -692,6 +826,9 @@ export const testing = {
692826ACTIVE_EMBEDDED_RUN_SNAPSHOTS.clear();
693827ACTIVE_EMBEDDED_RUN_SESSION_IDS_BY_KEY.clear();
694828ACTIVE_EMBEDDED_RUN_SESSION_IDS_BY_FILE.clear();
829+ABANDONED_EMBEDDED_RUNS_BY_SESSION_ID.clear();
830+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_KEY.clear();
831+ABANDONED_EMBEDDED_RUN_SESSION_IDS_BY_FILE.clear();
695832EMBEDDED_RUN_MODEL_SWITCH_REQUESTS.clear();
696833},
697834};
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。