





















@@ -46,48 +46,95 @@ function sessionRefs(params: { sessionId?: string; sessionKey?: string }): strin
4646return refs;
4747}
484849+function registerSessionActivityRefs(
50+activity: SessionActivity,
51+params: { sessionId?: string; sessionKey?: string; runId?: string },
52+): void {
53+activity.sessionId ??= params.sessionId;
54+activity.sessionKey ??= params.sessionKey;
55+for (const ref of sessionRefs(params)) {
56+activityByRef.set(ref, activity);
57+}
58+if (params.runId) {
59+activityByRunId.set(params.runId, activity);
60+}
61+}
62+63+function replaceSessionActivityReferences(source: SessionActivity, target: SessionActivity): void {
64+for (const [ref, activity] of activityByRef) {
65+if (activity === source) {
66+activityByRef.set(ref, target);
67+}
68+}
69+for (const [runId, activity] of activityByRunId) {
70+if (activity === source) {
71+activityByRunId.set(runId, target);
72+}
73+}
74+}
75+76+function mergeSessionActivity(target: SessionActivity, source: SessionActivity): void {
77+target.sessionId ??= source.sessionId;
78+target.sessionKey ??= source.sessionKey;
79+target.activeEmbeddedRun ||= source.activeEmbeddedRun;
80+for (const [key, tool] of source.activeTools) {
81+target.activeTools.set(key, tool);
82+}
83+for (const call of source.activeModelCalls) {
84+target.activeModelCalls.add(call);
85+}
86+if (source.lastProgressAt > target.lastProgressAt) {
87+target.lastProgressAt = source.lastProgressAt;
88+target.lastProgressReason = source.lastProgressReason;
89+}
90+replaceSessionActivityReferences(source, target);
91+}
92+4993function resolveSessionActivity(params: {
5094sessionId?: string;
5195sessionKey?: string;
5296runId?: string;
5397create?: boolean;
5498}): SessionActivity | undefined {
99+let activity: SessionActivity | undefined;
55100if (params.runId) {
56101const byRun = activityByRunId.get(params.runId);
57102if (byRun) {
58-return byRun;
103+activity = byRun;
59104}
60105}
6110662107for (const ref of sessionRefs(params)) {
63-const activity = activityByRef.get(ref);
64-if (activity) {
65-if (params.runId) {
66-activityByRunId.set(params.runId, activity);
67-}
68-return activity;
108+const byRef = activityByRef.get(ref);
109+if (!byRef) {
110+continue;
111+}
112+if (!activity) {
113+activity = byRef;
114+} else if (activity !== byRef) {
115+mergeSessionActivity(activity, byRef);
69116}
70117}
71118119+if (activity) {
120+registerSessionActivityRefs(activity, params);
121+return activity;
122+}
123+72124if (!params.create) {
73125return undefined;
74126}
7512776-const activity: SessionActivity = {
128+const created: SessionActivity = {
77129sessionId: params.sessionId,
78130sessionKey: params.sessionKey,
79131activeEmbeddedRun: false,
80132activeTools: new Map(),
81133activeModelCalls: new Set(),
82134lastProgressAt: Date.now(),
83135};
84-for (const ref of sessionRefs(params)) {
85-activityByRef.set(ref, activity);
86-}
87-if (params.runId) {
88-activityByRunId.set(params.runId, activity);
89-}
90-return activity;
136+registerSessionActivityRefs(created, params);
137+return created;
91138}
9213993140function touchSessionActivity(activity: SessionActivity, reason: string, now = Date.now()): void {
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。