@tutti-os/agent-activity-core 0.0.53 → 0.0.55
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/index.d.ts +17 -0
- package/dist/index.js +59 -17
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ type AgentActivityDisplayStatus = "working" | "waiting" | "idle" | "completed" |
|
|
|
3
3
|
interface AgentActivitySession {
|
|
4
4
|
workspaceId: string;
|
|
5
5
|
agentSessionId: string;
|
|
6
|
+
agentTargetId?: string | null;
|
|
6
7
|
provider: string;
|
|
7
8
|
providerSessionId?: string | null;
|
|
8
9
|
userId?: string;
|
|
@@ -12,6 +13,7 @@ interface AgentActivitySession {
|
|
|
12
13
|
status: AgentActivitySessionStatus | (string & {});
|
|
13
14
|
turnLifecycle?: AgentActivityTurnLifecycle | null;
|
|
14
15
|
submitAvailability?: AgentActivitySubmitAvailability | null;
|
|
16
|
+
pendingInteractive?: AgentActivityInteractivePrompt | null;
|
|
15
17
|
visible?: boolean;
|
|
16
18
|
resumable?: boolean;
|
|
17
19
|
currentPhase?: string | null;
|
|
@@ -25,6 +27,16 @@ interface AgentActivitySession {
|
|
|
25
27
|
createdAtUnixMs?: number;
|
|
26
28
|
updatedAtUnixMs?: number;
|
|
27
29
|
}
|
|
30
|
+
interface AgentActivityInteractivePrompt {
|
|
31
|
+
kind: string;
|
|
32
|
+
requestId?: string;
|
|
33
|
+
toolName?: string;
|
|
34
|
+
status?: string;
|
|
35
|
+
input?: Record<string, unknown>;
|
|
36
|
+
output?: Record<string, unknown>;
|
|
37
|
+
error?: Record<string, unknown>;
|
|
38
|
+
metadata?: Record<string, unknown>;
|
|
39
|
+
}
|
|
28
40
|
type AgentActivityCancelReason = "active_turn_canceled" | "no_active_turn" | "stale_turn_reconciled";
|
|
29
41
|
interface AgentActivityCancelSessionResult {
|
|
30
42
|
session: AgentActivitySession;
|
|
@@ -130,6 +142,7 @@ interface AgentActivityComposerOptions {
|
|
|
130
142
|
loadedAtUnixMs: number;
|
|
131
143
|
}
|
|
132
144
|
interface AgentActivityLoadComposerOptionsInput {
|
|
145
|
+
agentTargetId?: string | null;
|
|
133
146
|
workspaceId: string;
|
|
134
147
|
provider: string;
|
|
135
148
|
cwd?: string | null;
|
|
@@ -141,6 +154,7 @@ interface AgentActivitySnapshot {
|
|
|
141
154
|
sessions: AgentActivitySession[];
|
|
142
155
|
presences: AgentActivityPresence[];
|
|
143
156
|
sessionMessagesById: Record<string, AgentActivityMessage[]>;
|
|
157
|
+
composerOptionsByAgentTargetId?: Record<string, AgentActivityComposerOptions>;
|
|
144
158
|
composerOptionsByProvider?: Record<string, AgentActivityComposerOptions>;
|
|
145
159
|
}
|
|
146
160
|
interface AgentActivitySessionEventEnvelope {
|
|
@@ -157,6 +171,7 @@ interface AgentActivityUpdatedEvent {
|
|
|
157
171
|
}
|
|
158
172
|
interface AgentActivityStatePatch {
|
|
159
173
|
agentSessionId: string;
|
|
174
|
+
agentTargetId?: string;
|
|
160
175
|
currentPhase?: string;
|
|
161
176
|
cwd?: string;
|
|
162
177
|
lastError?: string;
|
|
@@ -169,6 +184,7 @@ interface AgentActivityStatePatch {
|
|
|
169
184
|
runtimeContext?: Record<string, unknown>;
|
|
170
185
|
startedAtUnixMs?: number;
|
|
171
186
|
submitAvailability?: AgentActivitySubmitAvailability;
|
|
187
|
+
pendingInteractive?: AgentActivityInteractivePrompt | null;
|
|
172
188
|
endedAtUnixMs?: number;
|
|
173
189
|
title?: string;
|
|
174
190
|
turn?: {
|
|
@@ -199,6 +215,7 @@ interface AgentActivityProviderTargetRef {
|
|
|
199
215
|
interface AgentActivityCreateSessionInput {
|
|
200
216
|
workspaceId: string;
|
|
201
217
|
agentSessionId?: string | null;
|
|
218
|
+
agentTargetId?: string | null;
|
|
202
219
|
cwd?: string | null;
|
|
203
220
|
initialContent?: AgentPromptContentBlock[] | null;
|
|
204
221
|
/** 仅展示用的首轮文本(bundle 折叠成一个 chip);initialContent 仍带展开后的文件。 */
|
package/dist/index.js
CHANGED
|
@@ -168,9 +168,11 @@ function createAgentActivityController({
|
|
|
168
168
|
const activeMessageSyncs = /* @__PURE__ */ new Map();
|
|
169
169
|
const activeComposerOptionsLoads = /* @__PURE__ */ new Map();
|
|
170
170
|
const composerOptionsLoadVersions = /* @__PURE__ */ new Map();
|
|
171
|
-
const
|
|
171
|
+
const composerOptionsCwdByCacheKey = /* @__PURE__ */ new Map();
|
|
172
172
|
const activeComposerOptionsLoadCwds = /* @__PURE__ */ new Map();
|
|
173
173
|
const normalizeComposerCwd = (cwd) => (cwd ?? "").trim();
|
|
174
|
+
const composerOptionsProviderCacheKey = (provider) => `provider:${provider}`;
|
|
175
|
+
const composerOptionsTargetCacheKey = (agentTargetId) => `target:${agentTargetId}`;
|
|
174
176
|
const autoRetainedStreamReleases = /* @__PURE__ */ new Map();
|
|
175
177
|
const retainedStreams = /* @__PURE__ */ new Map();
|
|
176
178
|
let snapshot = createEmptyAgentActivitySnapshot(workspaceId);
|
|
@@ -224,20 +226,23 @@ function createAgentActivityController({
|
|
|
224
226
|
if (!provider) {
|
|
225
227
|
throw new Error("Agent composer options provider is required.");
|
|
226
228
|
}
|
|
229
|
+
const agentTargetId = typeof input.agentTargetId === "string" && input.agentTargetId.trim() ? input.agentTargetId.trim() : null;
|
|
230
|
+
const primaryCacheKey = agentTargetId ? composerOptionsTargetCacheKey(agentTargetId) : composerOptionsProviderCacheKey(provider);
|
|
227
231
|
const requestedCwd = normalizeComposerCwd(input.cwd);
|
|
228
232
|
if (!input.force) {
|
|
229
|
-
const cached = snapshot.composerOptionsByProvider?.[provider];
|
|
230
|
-
if (cached &&
|
|
233
|
+
const cached = agentTargetId ? snapshot.composerOptionsByAgentTargetId?.[agentTargetId] : snapshot.composerOptionsByProvider?.[provider];
|
|
234
|
+
if (cached && composerOptionsCwdByCacheKey.get(primaryCacheKey) === requestedCwd) {
|
|
231
235
|
return cloneAgentActivityComposerOptions(cached);
|
|
232
236
|
}
|
|
233
237
|
}
|
|
234
|
-
const existingLoad = activeComposerOptionsLoads.get(
|
|
235
|
-
if (existingLoad && !input.force && activeComposerOptionsLoadCwds.get(
|
|
238
|
+
const existingLoad = activeComposerOptionsLoads.get(primaryCacheKey);
|
|
239
|
+
if (existingLoad && !input.force && activeComposerOptionsLoadCwds.get(primaryCacheKey) === requestedCwd) {
|
|
236
240
|
return existingLoad.then(cloneAgentActivityComposerOptions);
|
|
237
241
|
}
|
|
238
|
-
const loadVersion = (composerOptionsLoadVersions.get(
|
|
239
|
-
composerOptionsLoadVersions.set(
|
|
242
|
+
const loadVersion = (composerOptionsLoadVersions.get(primaryCacheKey) ?? 0) + 1;
|
|
243
|
+
composerOptionsLoadVersions.set(primaryCacheKey, loadVersion);
|
|
240
244
|
const load = adapter.loadComposerOptions({
|
|
245
|
+
agentTargetId,
|
|
241
246
|
workspaceId,
|
|
242
247
|
provider,
|
|
243
248
|
cwd: input.cwd,
|
|
@@ -249,15 +254,24 @@ function createAgentActivityController({
|
|
|
249
254
|
provider,
|
|
250
255
|
loadedAtUnixMs: options.loadedAtUnixMs || Date.now()
|
|
251
256
|
});
|
|
252
|
-
if (composerOptionsLoadVersions.get(
|
|
257
|
+
if (composerOptionsLoadVersions.get(primaryCacheKey) !== loadVersion) {
|
|
253
258
|
return cloneAgentActivityComposerOptions(normalizedOptions);
|
|
254
259
|
}
|
|
255
|
-
|
|
260
|
+
composerOptionsCwdByCacheKey.set(primaryCacheKey, requestedCwd);
|
|
256
261
|
updateSnapshot((current) => {
|
|
257
|
-
const currentOptions = current.composerOptionsByProvider?.[provider];
|
|
262
|
+
const currentOptions = agentTargetId ? current.composerOptionsByAgentTargetId?.[agentTargetId] : current.composerOptionsByProvider?.[provider];
|
|
258
263
|
if (currentOptions && areComposerOptionsEqual(currentOptions, normalizedOptions)) {
|
|
259
264
|
return current;
|
|
260
265
|
}
|
|
266
|
+
if (agentTargetId) {
|
|
267
|
+
return {
|
|
268
|
+
...current,
|
|
269
|
+
composerOptionsByAgentTargetId: {
|
|
270
|
+
...current.composerOptionsByAgentTargetId,
|
|
271
|
+
[agentTargetId]: normalizedOptions
|
|
272
|
+
}
|
|
273
|
+
};
|
|
274
|
+
}
|
|
261
275
|
return {
|
|
262
276
|
...current,
|
|
263
277
|
composerOptionsByProvider: {
|
|
@@ -268,13 +282,13 @@ function createAgentActivityController({
|
|
|
268
282
|
});
|
|
269
283
|
return cloneAgentActivityComposerOptions(normalizedOptions);
|
|
270
284
|
}).finally(() => {
|
|
271
|
-
if (activeComposerOptionsLoads.get(
|
|
272
|
-
activeComposerOptionsLoads.delete(
|
|
273
|
-
activeComposerOptionsLoadCwds.delete(
|
|
285
|
+
if (activeComposerOptionsLoads.get(primaryCacheKey) === load) {
|
|
286
|
+
activeComposerOptionsLoads.delete(primaryCacheKey);
|
|
287
|
+
activeComposerOptionsLoadCwds.delete(primaryCacheKey);
|
|
274
288
|
}
|
|
275
289
|
});
|
|
276
|
-
activeComposerOptionsLoads.set(
|
|
277
|
-
activeComposerOptionsLoadCwds.set(
|
|
290
|
+
activeComposerOptionsLoads.set(primaryCacheKey, load);
|
|
291
|
+
activeComposerOptionsLoadCwds.set(primaryCacheKey, requestedCwd);
|
|
278
292
|
return load.then(cloneAgentActivityComposerOptions);
|
|
279
293
|
},
|
|
280
294
|
async listSessionMessages({
|
|
@@ -476,7 +490,8 @@ function createEmptyAgentActivitySnapshot(workspaceId) {
|
|
|
476
490
|
sessions: [],
|
|
477
491
|
presences: [],
|
|
478
492
|
sessionMessagesById: {},
|
|
479
|
-
composerOptionsByProvider: {}
|
|
493
|
+
composerOptionsByProvider: {},
|
|
494
|
+
composerOptionsByAgentTargetId: {}
|
|
480
495
|
};
|
|
481
496
|
}
|
|
482
497
|
function cloneAgentActivitySnapshot(snapshot) {
|
|
@@ -484,6 +499,14 @@ function cloneAgentActivitySnapshot(snapshot) {
|
|
|
484
499
|
workspaceId: snapshot.workspaceId,
|
|
485
500
|
sessions: snapshot.sessions.map(cloneAgentActivitySession),
|
|
486
501
|
presences: snapshot.presences.map((presence) => ({ ...presence })),
|
|
502
|
+
composerOptionsByAgentTargetId: Object.fromEntries(
|
|
503
|
+
Object.entries(snapshot.composerOptionsByAgentTargetId ?? {}).map(
|
|
504
|
+
([agentTargetId, options]) => [
|
|
505
|
+
agentTargetId,
|
|
506
|
+
cloneAgentActivityComposerOptions(options)
|
|
507
|
+
]
|
|
508
|
+
)
|
|
509
|
+
),
|
|
487
510
|
composerOptionsByProvider: Object.fromEntries(
|
|
488
511
|
Object.entries(snapshot.composerOptionsByProvider ?? {}).map(
|
|
489
512
|
([provider, options]) => [
|
|
@@ -538,6 +561,9 @@ function cloneAgentActivitySession(session) {
|
|
|
538
561
|
session.turnLifecycle
|
|
539
562
|
) : session.turnLifecycle,
|
|
540
563
|
submitAvailability: session.submitAvailability ? { ...session.submitAvailability } : session.submitAvailability,
|
|
564
|
+
pendingInteractive: session.pendingInteractive === null ? null : session.pendingInteractive ? cloneJSONValue(
|
|
565
|
+
session.pendingInteractive
|
|
566
|
+
) : session.pendingInteractive,
|
|
541
567
|
runtimeContext: cloneJSONRecord(session.runtimeContext)
|
|
542
568
|
};
|
|
543
569
|
}
|
|
@@ -996,6 +1022,7 @@ function sessionFromEvent(workspaceId, event, data) {
|
|
|
996
1022
|
return {
|
|
997
1023
|
workspaceId: stringValue(source.workspaceId) || workspaceId,
|
|
998
1024
|
agentSessionId,
|
|
1025
|
+
agentTargetId: nullableStringValue(source.agentTargetId),
|
|
999
1026
|
provider: stringValue(source.provider),
|
|
1000
1027
|
providerSessionId: nullableStringValue(source.providerSessionId),
|
|
1001
1028
|
model: nullableStringValue(source.model),
|
|
@@ -1098,6 +1125,11 @@ function inlineStatePatchFromActivityUpdateData(data) {
|
|
|
1098
1125
|
runtimeContext: cloneJSONRecord(
|
|
1099
1126
|
recordValue2(source.runtimeContext) ?? void 0
|
|
1100
1127
|
),
|
|
1128
|
+
...source.pendingInteractive !== void 0 ? {
|
|
1129
|
+
pendingInteractive: source.pendingInteractive === null ? null : cloneJSONValue(
|
|
1130
|
+
recordValue2(source.pendingInteractive) ?? {}
|
|
1131
|
+
)
|
|
1132
|
+
} : {},
|
|
1101
1133
|
startedAtUnixMs: numberValue(source.startedAtUnixMs),
|
|
1102
1134
|
endedAtUnixMs: numberValue(source.endedAtUnixMs),
|
|
1103
1135
|
title: stringValue(source.title) || void 0,
|
|
@@ -1137,6 +1169,7 @@ function agentActivitySessionFromInlineStatePatch(input) {
|
|
|
1137
1169
|
...input.existingSession,
|
|
1138
1170
|
workspaceId: input.patch.workspaceId ?? input.workspaceId,
|
|
1139
1171
|
agentSessionId: input.patch.agentSessionId,
|
|
1172
|
+
agentTargetId: input.patch.agentTargetId ?? input.existingSession.agentTargetId,
|
|
1140
1173
|
provider: input.patch.provider ?? input.existingSession.provider,
|
|
1141
1174
|
providerSessionId: input.patch.providerSessionId ?? input.existingSession.providerSessionId,
|
|
1142
1175
|
model: input.patch.model ?? input.existingSession.model,
|
|
@@ -1150,6 +1183,9 @@ function agentActivitySessionFromInlineStatePatch(input) {
|
|
|
1150
1183
|
currentPhase: input.patch.currentPhase ?? input.patch.turn?.phase ?? input.existingSession.currentPhase,
|
|
1151
1184
|
lastError: input.patch.lastError ?? input.existingSession.lastError,
|
|
1152
1185
|
runtimeContext: cloneJSONRecord(input.patch.runtimeContext) ?? cloneJSONRecord(input.existingSession.runtimeContext),
|
|
1186
|
+
pendingInteractive: input.patch.pendingInteractive !== void 0 ? input.patch.pendingInteractive === null ? null : cloneJSONValue(
|
|
1187
|
+
input.patch.pendingInteractive
|
|
1188
|
+
) : input.existingSession.pendingInteractive,
|
|
1153
1189
|
lastEventUnixMs: input.patch.lastEventUnixMs ?? input.patch.occurredAtUnixMs ?? input.existingSession.lastEventUnixMs,
|
|
1154
1190
|
startedAtUnixMs: input.patch.startedAtUnixMs ?? input.existingSession.startedAtUnixMs,
|
|
1155
1191
|
endedAtUnixMs: input.patch.endedAtUnixMs ?? input.existingSession.endedAtUnixMs,
|
|
@@ -1160,6 +1196,9 @@ function cloneAgentActivityStatePatch(statePatch) {
|
|
|
1160
1196
|
return {
|
|
1161
1197
|
...statePatch,
|
|
1162
1198
|
runtimeContext: cloneJSONRecord(statePatch.runtimeContext),
|
|
1199
|
+
pendingInteractive: statePatch.pendingInteractive === null ? null : statePatch.pendingInteractive ? cloneJSONValue(
|
|
1200
|
+
statePatch.pendingInteractive
|
|
1201
|
+
) : statePatch.pendingInteractive,
|
|
1163
1202
|
...statePatch.submitAvailability ? { submitAvailability: { ...statePatch.submitAvailability } } : {},
|
|
1164
1203
|
turn: statePatch.turn ? {
|
|
1165
1204
|
...statePatch.turn,
|
|
@@ -1245,11 +1284,14 @@ function selectSessionDisplayStatuses(snapshot) {
|
|
|
1245
1284
|
);
|
|
1246
1285
|
return [
|
|
1247
1286
|
session.agentSessionId,
|
|
1248
|
-
sessionStatus === "failed" ? latestTurnStatus
|
|
1287
|
+
sessionStatus === "failed" ? shouldLatestTurnStatusOverrideFailedSession(latestTurnStatus) ? latestTurnStatus : sessionStatus : sessionStatus
|
|
1249
1288
|
];
|
|
1250
1289
|
})
|
|
1251
1290
|
);
|
|
1252
1291
|
}
|
|
1292
|
+
function shouldLatestTurnStatusOverrideFailedSession(status) {
|
|
1293
|
+
return status !== null && status !== "working" && status !== "idle";
|
|
1294
|
+
}
|
|
1253
1295
|
function resolveLatestAgentActivityMessageDisplayStatus(messages) {
|
|
1254
1296
|
const latestMessage = latestMessageWithTurn(messages);
|
|
1255
1297
|
const turnId = latestMessage?.turnId?.trim() ?? "";
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/capabilities.ts","../src/merge.ts","../src/pagination.ts","../src/controller.ts","../src/selectors.ts","../src/usage.ts"],"sourcesContent":["import type { AgentActivityComposerOptions } from \"./types.ts\";\n\n/** Mirror of packages/agent/daemon/runtime/capabilities.go. */\nexport const AGENT_CAPABILITY_KEYS = [\n \"imageInput\",\n \"skills\",\n \"compact\",\n \"tokenUsage\",\n \"rateLimits\",\n \"planMode\",\n \"interrupt\",\n \"browserUse\",\n \"computerUse\"\n] as const;\n\nexport type AgentCapabilityKey = (typeof AGENT_CAPABILITY_KEYS)[number];\n\nexport interface AgentActivityCapabilityInput {\n composerOptions?: AgentActivityComposerOptions | null;\n sessionRuntimeContext?: Record<string, unknown> | null;\n}\n\nexport function resolveAgentActivityCapability(\n key: AgentCapabilityKey,\n input: AgentActivityCapabilityInput\n): boolean | null {\n return (\n capabilityFromRuntimeContext(key, input.sessionRuntimeContext) ??\n capabilityFromRuntimeContext(key, input.composerOptions?.runtimeContext)\n );\n}\n\nfunction capabilityFromRuntimeContext(\n key: string,\n runtimeContext: Record<string, unknown> | null | undefined\n): boolean | null {\n const list = runtimeContext?.capabilities;\n if (!Array.isArray(list)) {\n return null;\n }\n return list.some((entry) => typeof entry === \"string\" && entry === key);\n}\n","import type { AgentActivityMessage } from \"./types.ts\";\n\nexport function mergeAgentActivityMessages<\n T extends AgentActivityMessage = AgentActivityMessage\n>(currentMessages: readonly T[], incomingMessages: readonly T[]): T[] {\n if (incomingMessages.length === 0) {\n return [...currentMessages];\n }\n\n const byMessageId = new Map<string, T>();\n for (const message of currentMessages) {\n byMessageId.set(message.messageId, cloneAgentActivityMessage(message));\n }\n\n for (const incoming of incomingMessages) {\n const existing = byMessageId.get(incoming.messageId);\n if (!existing || shouldReplaceAgentActivityMessage(existing, incoming)) {\n byMessageId.set(\n incoming.messageId,\n existing\n ? mergeAgentActivityMessage(existing, incoming)\n : cloneAgentActivityMessage(incoming)\n );\n }\n }\n\n return [...byMessageId.values()].sort(compareAgentActivityMessages);\n}\n\nexport function compareAgentActivityMessages(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n return (\n left.version - right.version ||\n (left.id ?? 0) - (right.id ?? 0) ||\n left.messageId.localeCompare(right.messageId)\n );\n}\n\nexport function latestAgentActivityMessageVersion(\n messages: readonly AgentActivityMessage[]\n): number {\n return messages.reduce(\n (latestVersion, message) => Math.max(latestVersion, message.version),\n 0\n );\n}\n\nexport function areAgentActivityMessageArraysEqual(\n left: readonly AgentActivityMessage[],\n right: readonly AgentActivityMessage[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n if (!areAgentActivityMessagesEqual(left[index]!, right[index]!)) {\n return false;\n }\n }\n return true;\n}\n\nexport function areAgentActivityMessagesEqual(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): boolean {\n return (\n left.workspaceId === right.workspaceId &&\n left.agentSessionId === right.agentSessionId &&\n left.messageId === right.messageId &&\n Object.is(left.id, right.id) &&\n left.version === right.version &&\n Object.is(left.turnId, right.turnId) &&\n left.role === right.role &&\n left.kind === right.kind &&\n Object.is(left.status, right.status) &&\n areJsonLikeValuesEqual(left.semantics, right.semantics) &&\n Object.is(left.occurredAtUnixMs, right.occurredAtUnixMs) &&\n Object.is(left.startedAtUnixMs, right.startedAtUnixMs) &&\n Object.is(left.completedAtUnixMs, right.completedAtUnixMs) &&\n areJsonLikeValuesEqual(left.payload, right.payload)\n );\n}\n\nexport function cloneAgentActivityMessage<\n T extends AgentActivityMessage = AgentActivityMessage\n>(message: T): T {\n return {\n ...message,\n semantics: message.semantics ? { ...message.semantics } : undefined,\n payload: { ...message.payload }\n };\n}\n\nfunction mergeAgentActivityMessage<T extends AgentActivityMessage>(\n existing: T,\n incoming: T\n): T {\n return {\n ...existing,\n ...incoming,\n semantics: incoming.semantics\n ? {\n ...existing.semantics,\n ...incoming.semantics\n }\n : existing.semantics,\n payload: {\n ...existing.payload,\n ...incoming.payload\n }\n };\n}\n\nfunction shouldReplaceAgentActivityMessage(\n existing: AgentActivityMessage,\n incoming: AgentActivityMessage\n): boolean {\n if (incoming.version !== existing.version) {\n return incoming.version > existing.version;\n }\n return (incoming.id ?? 0) >= (existing.id ?? 0);\n}\n\nfunction areJsonLikeValuesEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) {\n return true;\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right)) {\n return false;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n if (!areJsonLikeValuesEqual(left[index], right[index])) {\n return false;\n }\n }\n return true;\n }\n const leftRecord = recordValue(left);\n const rightRecord = recordValue(right);\n if (!leftRecord || !rightRecord) {\n return false;\n }\n const keys = new Set([\n ...Object.keys(leftRecord),\n ...Object.keys(rightRecord)\n ]);\n for (const key of keys) {\n if (!areJsonLikeValuesEqual(leftRecord[key], rightRecord[key])) {\n return false;\n }\n }\n return true;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n","export interface AgentActivityMessagePageLike<T> {\n messages: readonly T[];\n hasMore?: boolean;\n latestVersion?: number;\n}\n\nexport interface LoadAllAgentSessionMessagesInput<T> {\n listPage: (afterVersion: number) => Promise<AgentActivityMessagePageLike<T>>;\n afterVersion?: number;\n maxPages?: number;\n shouldAbort?: () => boolean;\n onPage?: (messages: readonly T[]) => void;\n}\n\nexport interface LoadAllAgentSessionMessagesResult<T> {\n messages: T[];\n aborted: boolean;\n}\n\nconst DEFAULT_MAX_MESSAGE_PAGES = 1000;\n\nexport async function loadAllAgentSessionMessages<\n T extends { version?: number }\n>(\n input: LoadAllAgentSessionMessagesInput<T>\n): Promise<LoadAllAgentSessionMessagesResult<T>> {\n const maxPages = input.maxPages ?? DEFAULT_MAX_MESSAGE_PAGES;\n let afterVersion = input.afterVersion ?? 0;\n const messages: T[] = [];\n\n for (let pageIndex = 0; pageIndex < maxPages; pageIndex += 1) {\n const page = await input.listPage(afterVersion);\n if (input.shouldAbort?.()) {\n return { messages, aborted: true };\n }\n if (page.messages.length > 0) {\n input.onPage?.(page.messages);\n messages.push(...page.messages);\n }\n const messageMaxVersion = page.messages.reduce(\n (maxVersion, message) => Math.max(maxVersion, message.version ?? 0),\n afterVersion\n );\n const pageLatestVersion =\n typeof page.latestVersion === \"number\" &&\n Number.isFinite(page.latestVersion)\n ? Math.max(0, Math.trunc(page.latestVersion))\n : afterVersion;\n const nextAfterVersion = Math.max(messageMaxVersion, pageLatestVersion);\n if (!page.hasMore || nextAfterVersion <= afterVersion) {\n break;\n }\n afterVersion = nextAfterVersion;\n }\n\n return { messages, aborted: false };\n}\n","import type { AgentActivityAdapter } from \"./adapter.ts\";\nimport {\n areAgentActivityMessageArraysEqual,\n cloneAgentActivityMessage,\n latestAgentActivityMessageVersion,\n mergeAgentActivityMessages\n} from \"./merge.ts\";\nimport { loadAllAgentSessionMessages } from \"./pagination.ts\";\nimport type {\n AgentActivityComposerOptions,\n AgentActivityLoadComposerOptionsInput,\n AgentActivityMessage,\n AgentActivityMessageOrder,\n AgentActivityMessagePage,\n AgentActivityStatePatch,\n AgentActivitySession,\n AgentActivitySessionEventEnvelope,\n AgentActivitySnapshot,\n AgentActivityUpdatedApplyResult,\n AgentActivityUpdatedEvent\n} from \"./types.ts\";\n\nexport interface CreateAgentActivityControllerInput {\n adapter: AgentActivityAdapter;\n autoRetainSessionEvents?: boolean;\n workspaceId: string;\n}\n\nexport interface AgentActivityController {\n getSnapshot(): AgentActivitySnapshot;\n subscribe(listener: AgentActivitySnapshotListener): () => void;\n load(signal?: AbortSignal): Promise<AgentActivitySnapshot>;\n loadComposerOptions(\n input: Omit<AgentActivityLoadComposerOptionsInput, \"workspaceId\"> & {\n force?: boolean;\n }\n ): Promise<AgentActivityComposerOptions>;\n listSessionMessages(input: {\n agentSessionId: string;\n afterVersion?: number;\n beforeVersion?: number;\n cache?: boolean;\n limit?: number;\n order?: AgentActivityMessageOrder;\n signal?: AbortSignal;\n }): Promise<AgentActivityMessagePage>;\n retainSessionEvents(input: {\n agentSessionId: string;\n afterVersion?: number;\n onError?: (error: unknown) => void;\n }): () => void;\n removeSession(agentSessionId: string): void;\n upsertSession(session: AgentActivitySession): void;\n applyActivityUpdatedEvent(\n event: AgentActivityUpdatedEvent\n ): AgentActivityUpdatedApplyResult;\n applySessionEvent(event: AgentActivitySessionEventEnvelope): void;\n}\n\nexport type AgentActivitySnapshotListener = (\n snapshot: AgentActivitySnapshot\n) => void;\n\ninterface RetainedSessionStream {\n abortController: AbortController;\n refCount: number;\n unsubscribe: (() => void) | null;\n}\n\nexport function createAgentActivityController({\n adapter,\n autoRetainSessionEvents = true,\n workspaceId\n}: CreateAgentActivityControllerInput): AgentActivityController {\n const listeners = new Set<AgentActivitySnapshotListener>();\n const activeMessageSyncs = new Map<string, Promise<void>>();\n const activeComposerOptionsLoads = new Map<\n string,\n Promise<AgentActivityComposerOptions>\n >();\n const composerOptionsLoadVersions = new Map<string, number>();\n const composerOptionsCwdByProvider = new Map<string, string>();\n const activeComposerOptionsLoadCwds = new Map<string, string>();\n const normalizeComposerCwd = (cwd: string | null | undefined): string =>\n (cwd ?? \"\").trim();\n const autoRetainedStreamReleases = new Map<string, () => void>();\n const retainedStreams = new Map<string, RetainedSessionStream>();\n let snapshot: AgentActivitySnapshot =\n createEmptyAgentActivitySnapshot(workspaceId);\n\n const emit = (): void => {\n for (const listener of listeners) {\n listener(snapshot);\n }\n };\n\n const updateSnapshot = (\n updater: (current: AgentActivitySnapshot) => AgentActivitySnapshot\n ): AgentActivitySnapshot => {\n const nextSnapshot = updater(snapshot);\n if (nextSnapshot === snapshot) {\n return snapshot;\n }\n snapshot = cloneAgentActivitySnapshot(nextSnapshot);\n emit();\n return snapshot;\n };\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n listeners.add(listener);\n listener(snapshot);\n return () => {\n listeners.delete(listener);\n };\n },\n async load(signal) {\n const response = await adapter.listSessions({ workspaceId, signal });\n const nextSessions = response.sessions;\n const nextPresences = response.presences ?? [];\n const nextSnapshot = updateSnapshot((current) => {\n const sessionDataUnchanged =\n areShallowObjectArraysEqual(current.sessions, nextSessions) &&\n areShallowObjectArraysEqual(current.presences, nextPresences);\n const source = sessionDataUnchanged\n ? current\n : {\n ...current,\n presences: nextPresences,\n sessions: nextSessions\n };\n const canonical = canonicalizeSnapshotMessageBuckets(source);\n if (canonical !== source) {\n return canonical;\n }\n return sessionDataUnchanged ? current : source;\n });\n if (autoRetainSessionEvents) {\n reconcileAutoRetainedSessionStreams(nextSnapshot.sessions, signal);\n }\n return nextSnapshot;\n },\n async loadComposerOptions(input) {\n const provider = input.provider.trim();\n if (!provider) {\n throw new Error(\"Agent composer options provider is required.\");\n }\n const requestedCwd = normalizeComposerCwd(input.cwd);\n if (!input.force) {\n const cached = snapshot.composerOptionsByProvider?.[provider];\n if (\n cached &&\n composerOptionsCwdByProvider.get(provider) === requestedCwd\n ) {\n return cloneAgentActivityComposerOptions(cached);\n }\n }\n const existingLoad = activeComposerOptionsLoads.get(provider);\n if (\n existingLoad &&\n !input.force &&\n activeComposerOptionsLoadCwds.get(provider) === requestedCwd\n ) {\n return existingLoad.then(cloneAgentActivityComposerOptions);\n }\n const loadVersion = (composerOptionsLoadVersions.get(provider) ?? 0) + 1;\n composerOptionsLoadVersions.set(provider, loadVersion);\n const load = adapter\n .loadComposerOptions({\n workspaceId,\n provider,\n cwd: input.cwd,\n settings: input.settings,\n signal: input.signal\n })\n .then((options) => {\n const normalizedOptions = cloneAgentActivityComposerOptions({\n ...options,\n provider,\n loadedAtUnixMs: options.loadedAtUnixMs || Date.now()\n });\n if (composerOptionsLoadVersions.get(provider) !== loadVersion) {\n return cloneAgentActivityComposerOptions(normalizedOptions);\n }\n composerOptionsCwdByProvider.set(provider, requestedCwd);\n updateSnapshot((current) => {\n const currentOptions =\n current.composerOptionsByProvider?.[provider];\n if (\n currentOptions &&\n areComposerOptionsEqual(currentOptions, normalizedOptions)\n ) {\n return current;\n }\n return {\n ...current,\n composerOptionsByProvider: {\n ...current.composerOptionsByProvider,\n [provider]: normalizedOptions\n }\n };\n });\n return cloneAgentActivityComposerOptions(normalizedOptions);\n })\n .finally(() => {\n if (activeComposerOptionsLoads.get(provider) === load) {\n activeComposerOptionsLoads.delete(provider);\n activeComposerOptionsLoadCwds.delete(provider);\n }\n });\n activeComposerOptionsLoads.set(provider, load);\n activeComposerOptionsLoadCwds.set(provider, requestedCwd);\n return load.then(cloneAgentActivityComposerOptions);\n },\n async listSessionMessages({\n agentSessionId,\n afterVersion,\n beforeVersion,\n cache = true,\n limit,\n order,\n signal\n }) {\n const response = await adapter.listSessionMessages({\n workspaceId,\n agentSessionId,\n afterVersion,\n beforeVersion,\n limit,\n order,\n signal\n });\n if (cache) {\n updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, response.messages)\n );\n }\n return {\n ...response,\n messages: response.messages.map((message) => ({\n ...message,\n payload: { ...message.payload }\n }))\n };\n },\n retainSessionEvents: retainSessionEventsImpl,\n removeSession(agentSessionId) {\n updateSnapshot((current) =>\n removeSnapshotSession(current, agentSessionId)\n );\n },\n upsertSession(session) {\n if (session.workspaceId && session.workspaceId !== snapshot.workspaceId) {\n return;\n }\n updateSnapshot((current) => upsertSnapshotSession(current, session));\n },\n applyActivityUpdatedEvent(event) {\n const result = applyActivityUpdatedEvent(snapshot, event);\n if (result.snapshot !== snapshot) {\n snapshot = result.snapshot;\n emit();\n }\n return {\n applied: result.applied,\n messages: result.messages.map(cloneAgentActivityMessage),\n session: result.session\n ? cloneAgentActivitySession(result.session)\n : null,\n statePatch: result.statePatch\n ? cloneAgentActivityStatePatch(result.statePatch)\n : null\n };\n },\n applySessionEvent(event) {\n updateSnapshot((current) => applySessionEvent(current, event));\n }\n };\n\n function retainSessionEventsImpl({\n agentSessionId,\n afterVersion,\n onRetainFailed,\n onError\n }: {\n agentSessionId: string;\n afterVersion?: number;\n onRetainFailed?: () => void;\n onError?: (error: unknown) => void;\n }): () => void {\n const normalizedAgentSessionId = agentSessionId.trim();\n if (!normalizedAgentSessionId) {\n return () => {};\n }\n\n const existing = retainedStreams.get(normalizedAgentSessionId);\n if (existing) {\n existing.refCount += 1;\n return createRetainedStreamRelease(normalizedAgentSessionId);\n }\n\n const abortController = new AbortController();\n const stream: RetainedSessionStream = {\n abortController,\n refCount: 1,\n unsubscribe: null\n };\n retainedStreams.set(normalizedAgentSessionId, stream);\n\n const cachedMessages =\n snapshot.sessionMessagesById[normalizedAgentSessionId] ?? [];\n const streamAfterVersion =\n afterVersion ?? latestAgentActivityMessageVersion(cachedMessages);\n\n void adapter\n .subscribeSessionEvents({\n workspaceId,\n agentSessionId: normalizedAgentSessionId,\n afterVersion: streamAfterVersion,\n signal: abortController.signal,\n onEvent(event) {\n if (!abortController.signal.aborted) {\n updateSnapshot((current) => applySessionEvent(current, event));\n }\n },\n onError\n })\n .then((unsubscribe) => {\n const retained = retainedStreams.get(normalizedAgentSessionId);\n if (!retained || retained.abortController.signal.aborted) {\n unsubscribe();\n return;\n }\n retained.unsubscribe = unsubscribe;\n })\n .catch((error: unknown) => {\n if (!abortController.signal.aborted) {\n onError?.(error);\n }\n if (retainedStreams.get(normalizedAgentSessionId) === stream) {\n retainedStreams.delete(normalizedAgentSessionId);\n }\n onRetainFailed?.();\n abortController.abort();\n stream.unsubscribe?.();\n });\n\n return createRetainedStreamRelease(normalizedAgentSessionId);\n }\n\n function reconcileAutoRetainedSessionStreams(\n sessions: readonly AgentActivitySession[],\n signal: AbortSignal | undefined\n ): void {\n const activeSessionIds = new Set(\n sessions\n .filter(shouldAutoRetainSessionEvents)\n .map((session) => session.agentSessionId.trim())\n .filter(Boolean)\n );\n\n for (const [agentSessionId, release] of autoRetainedStreamReleases) {\n if (!activeSessionIds.has(agentSessionId)) {\n release();\n autoRetainedStreamReleases.delete(agentSessionId);\n }\n }\n\n for (const agentSessionId of activeSessionIds) {\n if (!autoRetainedStreamReleases.has(agentSessionId)) {\n autoRetainedStreamReleases.set(\n agentSessionId,\n retainSessionEventsImpl({\n agentSessionId,\n onRetainFailed() {\n autoRetainedStreamReleases.delete(agentSessionId);\n }\n })\n );\n }\n syncSessionMessages(agentSessionId, signal);\n }\n }\n\n function syncSessionMessages(\n agentSessionId: string,\n signal: AbortSignal | undefined\n ): void {\n if (activeMessageSyncs.has(agentSessionId)) {\n return;\n }\n const cachedMessages = snapshot.sessionMessagesById[agentSessionId] ?? [];\n const afterVersion = latestAgentActivityMessageVersion(cachedMessages);\n const sync = loadAllAgentSessionMessages({\n afterVersion,\n shouldAbort: () => signal?.aborted ?? false,\n listPage: (cursor) =>\n adapter.listSessionMessages({\n workspaceId,\n agentSessionId,\n afterVersion: cursor,\n signal\n }),\n onPage: (messages) => {\n updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, messages)\n );\n }\n })\n .then(() => undefined)\n .catch(() => {})\n .finally(() => {\n if (activeMessageSyncs.get(agentSessionId) === sync) {\n activeMessageSyncs.delete(agentSessionId);\n }\n });\n activeMessageSyncs.set(agentSessionId, sync);\n }\n\n function createRetainedStreamRelease(agentSessionId: string): () => void {\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n releaseRetainedStream(agentSessionId);\n };\n }\n\n function releaseRetainedStream(agentSessionId: string): void {\n const stream = retainedStreams.get(agentSessionId);\n if (!stream) {\n return;\n }\n stream.refCount -= 1;\n if (stream.refCount > 0) {\n return;\n }\n retainedStreams.delete(agentSessionId);\n stream.abortController.abort();\n stream.unsubscribe?.();\n }\n}\n\nexport function createEmptyAgentActivitySnapshot(\n workspaceId: string\n): AgentActivitySnapshot {\n return {\n workspaceId,\n sessions: [],\n presences: [],\n sessionMessagesById: {},\n composerOptionsByProvider: {}\n };\n}\n\nexport function cloneAgentActivitySnapshot(\n snapshot: AgentActivitySnapshot\n): AgentActivitySnapshot {\n return {\n workspaceId: snapshot.workspaceId,\n sessions: snapshot.sessions.map(cloneAgentActivitySession),\n presences: snapshot.presences.map((presence) => ({ ...presence })),\n composerOptionsByProvider: Object.fromEntries(\n Object.entries(snapshot.composerOptionsByProvider ?? {}).map(\n ([provider, options]) => [\n provider,\n cloneAgentActivityComposerOptions(options)\n ]\n )\n ),\n sessionMessagesById: Object.fromEntries(\n Object.entries(snapshot.sessionMessagesById).map(\n ([agentSessionId, messages]) => [\n agentSessionId,\n messages.map((message) => ({\n ...message,\n payload: { ...message.payload }\n }))\n ]\n )\n )\n };\n}\n\nfunction cloneAgentActivityComposerOptions(\n options: AgentActivityComposerOptions\n): AgentActivityComposerOptions {\n return {\n provider: options.provider,\n models: options.models.map((option) => ({ ...option })),\n reasoningEfforts: options.reasoningEfforts.map((option) => ({\n ...option\n })),\n speeds: (options.speeds ?? []).map((option) => ({\n ...option\n })),\n modelConfigurable: options.modelConfigurable ?? false,\n reasoningConfigurable: options.reasoningConfigurable ?? false,\n speedConfigurable: options.speedConfigurable ?? false,\n permissionConfig: options.permissionConfig\n ? {\n configurable: options.permissionConfig.configurable,\n defaultValue: options.permissionConfig.defaultValue ?? null,\n modes: options.permissionConfig.modes.map((mode) => ({ ...mode }))\n }\n : (options.permissionConfig ?? null),\n runtimeContext: cloneJSONRecord(options.runtimeContext),\n skills: options.skills.map((skill) => ({ ...skill })),\n capabilityCatalog: (options.capabilityCatalog ?? []).map((capability) => ({\n ...capability\n })),\n loadedAtUnixMs: options.loadedAtUnixMs\n };\n}\n\nfunction cloneAgentActivitySession(\n session: AgentActivitySession\n): AgentActivitySession {\n return {\n ...session,\n turnLifecycle: session.turnLifecycle\n ? (cloneJSONValue(\n session.turnLifecycle\n ) as AgentActivitySession[\"turnLifecycle\"])\n : session.turnLifecycle,\n submitAvailability: session.submitAvailability\n ? { ...session.submitAvailability }\n : session.submitAvailability,\n runtimeContext: cloneJSONRecord(session.runtimeContext)\n };\n}\n\nfunction areComposerOptionsEqual(\n left: AgentActivityComposerOptions,\n right: AgentActivityComposerOptions\n): boolean {\n const { loadedAtUnixMs: _leftLoadedAtUnixMs, ...leftComparable } = left;\n const { loadedAtUnixMs: _rightLoadedAtUnixMs, ...rightComparable } = right;\n return JSON.stringify(leftComparable) === JSON.stringify(rightComparable);\n}\n\nfunction cloneJSONRecord<T extends Record<string, unknown> | undefined>(\n value: T\n): T {\n if (value === undefined) {\n return value;\n }\n return cloneJSONValue(value) as T;\n}\n\nfunction cloneJSONValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(cloneJSONValue);\n }\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [\n key,\n cloneJSONValue(entry)\n ])\n );\n }\n return value;\n}\n\nfunction areShallowObjectArraysEqual<T extends object>(\n left: readonly T[],\n right: readonly T[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n if (!areShallowObjectsEqual(left[index]!, right[index]!)) {\n return false;\n }\n }\n return true;\n}\n\nfunction areShallowObjectsEqual(left: object, right: object): boolean {\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const keys = new Set([\n ...Object.keys(leftRecord),\n ...Object.keys(rightRecord)\n ]);\n for (const key of keys) {\n if (!Object.is(leftRecord[key], rightRecord[key])) {\n return false;\n }\n }\n return true;\n}\n\nfunction applyActivityUpdatedEvent(\n snapshot: AgentActivitySnapshot,\n event: AgentActivityUpdatedEvent\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n if (event.workspaceId && event.workspaceId !== snapshot.workspaceId) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n\n const workspaceId = event.workspaceId || snapshot.workspaceId;\n const agentSessionId = event.agentSessionId.trim();\n if (!agentSessionId) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n\n if (event.eventType === \"message_update\") {\n return applyActivityUpdatedMessages(snapshot, {\n agentSessionId,\n data: event.data,\n workspaceId\n });\n }\n\n if (event.eventType === \"state_patch\") {\n return applyActivityUpdatedStatePatch(snapshot, {\n agentSessionId,\n data: event.data,\n workspaceId\n });\n }\n\n return emptyActivityUpdatedApplyResult(snapshot);\n}\n\nfunction applyActivityUpdatedMessages(\n snapshot: AgentActivitySnapshot,\n input: {\n agentSessionId: string;\n data: unknown;\n workspaceId: string;\n }\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n const inlineMessages = inlineMessagesFromActivityUpdateData(input.data);\n if (inlineMessages.length === 0) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const messagesBySessionId = new Map<string, AgentActivityMessage[]>();\n for (const message of inlineMessages) {\n const targetSessionId = inlineMessageTargetAgentSessionId(\n snapshot,\n input.agentSessionId,\n message\n );\n if (!targetSessionId) {\n continue;\n }\n const activityMessage = agentActivityMessageFromInlineMessage({\n agentSessionId: targetSessionId,\n message,\n workspaceId: input.workspaceId\n });\n if (!activityMessage) {\n continue;\n }\n messagesBySessionId.set(targetSessionId, [\n ...(messagesBySessionId.get(targetSessionId) ?? []),\n activityMessage\n ]);\n }\n if (messagesBySessionId.size === 0) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n let nextSnapshot = snapshot;\n const messages: AgentActivityMessage[] = [];\n for (const [agentSessionId, sessionMessages] of messagesBySessionId) {\n nextSnapshot = mergeSnapshotMessages(\n nextSnapshot,\n agentSessionId,\n sessionMessages\n );\n messages.push(...sessionMessages);\n }\n if (nextSnapshot === snapshot) {\n return {\n applied: true,\n messages: [],\n session: null,\n snapshot,\n statePatch: null\n };\n }\n return {\n applied: true,\n messages,\n session: null,\n snapshot: nextSnapshot,\n statePatch: null\n };\n}\n\nfunction applyActivityUpdatedStatePatch(\n snapshot: AgentActivitySnapshot,\n input: {\n agentSessionId: string;\n data: unknown;\n workspaceId: string;\n }\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n const statePatch = inlineStatePatchFromActivityUpdateData(input.data);\n if (!statePatch) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const canonicalEventSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n input.agentSessionId,\n statePatch.provider\n );\n const canonicalPatchSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n statePatch.agentSessionId,\n statePatch.provider\n );\n if (canonicalPatchSessionId !== canonicalEventSessionId) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const canonicalStatePatch = {\n ...statePatch,\n agentSessionId: canonicalPatchSessionId\n };\n const existingSession =\n snapshot.sessions.find(\n (session) => session.agentSessionId === canonicalPatchSessionId\n ) ?? null;\n if (\n !existingSession ||\n isStaleStatePatch(existingSession, canonicalStatePatch)\n ) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const session = agentActivitySessionFromInlineStatePatch({\n existingSession,\n patch: canonicalStatePatch,\n workspaceId: input.workspaceId\n });\n return {\n applied: true,\n messages: [],\n session,\n snapshot: upsertSnapshotSession(snapshot, session),\n statePatch: canonicalStatePatch\n };\n}\n\nfunction emptyActivityUpdatedApplyResult(\n snapshot: AgentActivitySnapshot\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n return {\n applied: false,\n messages: [],\n session: null,\n snapshot,\n statePatch: null\n };\n}\n\nfunction applySessionEvent(\n snapshot: AgentActivitySnapshot,\n event: AgentActivitySessionEventEnvelope\n): AgentActivitySnapshot {\n if (event.workspaceId && event.workspaceId !== snapshot.workspaceId) {\n return snapshot;\n }\n\n const data = recordValue(event.data) ?? {};\n if (event.eventType === \"message_update\") {\n const message = messageFromEvent(event, data);\n return message\n ? mergeSnapshotMessages(snapshot, message.agentSessionId, [message])\n : snapshot;\n }\n\n if (event.eventType === \"session_update\") {\n const session = sessionFromEvent(snapshot.workspaceId, event, data);\n return session ? upsertSnapshotSession(snapshot, session) : snapshot;\n }\n\n return snapshot;\n}\n\nfunction mergeSnapshotMessages(\n snapshot: AgentActivitySnapshot,\n agentSessionId: string,\n messages: readonly AgentActivityMessage[]\n): AgentActivitySnapshot {\n const rawAgentSessionId = agentSessionId.trim();\n const canonicalAgentSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n rawAgentSessionId\n );\n if (!canonicalAgentSessionId || messages.length === 0) {\n return snapshot;\n }\n const currentMessages =\n snapshot.sessionMessagesById[canonicalAgentSessionId] ?? [];\n const aliasMessages =\n rawAgentSessionId && rawAgentSessionId !== canonicalAgentSessionId\n ? (snapshot.sessionMessagesById[rawAgentSessionId] ?? [])\n : [];\n const currentCanonicalMessages =\n aliasMessages.length > 0\n ? mergeAgentActivityMessages(\n currentMessages,\n canonicalizeAgentActivityMessages(\n aliasMessages,\n canonicalAgentSessionId\n )\n )\n : currentMessages;\n const canonicalMessages = canonicalizeAgentActivityMessages(\n messages,\n canonicalAgentSessionId\n );\n const mergedMessages = mergeAgentActivityMessages(\n currentCanonicalMessages,\n canonicalMessages\n );\n const hasAliasBucket =\n rawAgentSessionId !== \"\" &&\n rawAgentSessionId !== canonicalAgentSessionId &&\n Object.prototype.hasOwnProperty.call(\n snapshot.sessionMessagesById,\n rawAgentSessionId\n );\n if (areAgentActivityMessageArraysEqual(currentMessages, mergedMessages)) {\n return hasAliasBucket\n ? {\n ...snapshot,\n sessionMessagesById: deleteSessionMessageBucket(\n snapshot.sessionMessagesById,\n rawAgentSessionId\n )\n }\n : snapshot;\n }\n const sessionMessagesById = {\n ...snapshot.sessionMessagesById,\n [canonicalAgentSessionId]: mergedMessages\n };\n if (hasAliasBucket) {\n delete sessionMessagesById[rawAgentSessionId];\n }\n return {\n ...snapshot,\n sessionMessagesById\n };\n}\n\nfunction upsertSnapshotSession(\n snapshot: AgentActivitySnapshot,\n session: AgentActivitySession\n): AgentActivitySnapshot {\n const index = snapshot.sessions.findIndex(\n (item) => item.agentSessionId === session.agentSessionId\n );\n if (index < 0) {\n return canonicalizeSnapshotMessageBuckets({\n ...snapshot,\n sessions: [...snapshot.sessions, session]\n });\n }\n const sessions = [...snapshot.sessions];\n sessions[index] = session;\n return canonicalizeSnapshotMessageBuckets({\n ...snapshot,\n sessions\n });\n}\n\nfunction removeSnapshotSession(\n snapshot: AgentActivitySnapshot,\n agentSessionId: string\n): AgentActivitySnapshot {\n const normalizedAgentSessionId = agentSessionId.trim();\n if (!normalizedAgentSessionId) {\n return snapshot;\n }\n const sessions = snapshot.sessions.filter(\n (session) => session.agentSessionId !== normalizedAgentSessionId\n );\n const removedSession =\n snapshot.sessions.find(\n (session) => session.agentSessionId === normalizedAgentSessionId\n ) ?? null;\n const removableMessageBuckets = new Set([normalizedAgentSessionId]);\n if (removedSession) {\n for (const alias of sessionMessageAliases(removedSession)) {\n if (\n alias === normalizedAgentSessionId ||\n resolveCanonicalAgentSessionId(\n snapshot,\n alias,\n removedSession.provider\n ) === normalizedAgentSessionId\n ) {\n removableMessageBuckets.add(alias);\n }\n }\n }\n if (\n sessions.length === snapshot.sessions.length &&\n [...removableMessageBuckets].every(\n (bucket) => !snapshot.sessionMessagesById[bucket]\n )\n ) {\n return snapshot;\n }\n const sessionMessagesById = { ...snapshot.sessionMessagesById };\n for (const bucket of removableMessageBuckets) {\n delete sessionMessagesById[bucket];\n }\n return {\n ...snapshot,\n sessions,\n sessionMessagesById\n };\n}\n\nfunction canonicalizeSnapshotMessageBuckets(\n snapshot: AgentActivitySnapshot\n): AgentActivitySnapshot {\n let sessionMessagesById = snapshot.sessionMessagesById;\n let changed = false;\n\n for (const session of snapshot.sessions) {\n const canonicalAgentSessionId = session.agentSessionId.trim();\n if (!canonicalAgentSessionId) {\n continue;\n }\n\n let mergedMessages = sessionMessagesById[canonicalAgentSessionId] ?? [];\n for (const alias of sessionMessageAliases(session)) {\n if (\n alias !== canonicalAgentSessionId &&\n resolveCanonicalAgentSessionId(snapshot, alias, session.provider) !==\n canonicalAgentSessionId\n ) {\n continue;\n }\n const aliasMessages = sessionMessagesById[alias];\n if (!aliasMessages) {\n continue;\n }\n const canonicalMessages = canonicalizeAgentActivityMessages(\n aliasMessages,\n canonicalAgentSessionId\n );\n if (alias === canonicalAgentSessionId) {\n if (\n !areAgentActivityMessageArraysEqual(aliasMessages, canonicalMessages)\n ) {\n sessionMessagesById = {\n ...sessionMessagesById,\n [canonicalAgentSessionId]: canonicalMessages\n };\n mergedMessages = canonicalMessages;\n changed = true;\n }\n continue;\n }\n mergedMessages = mergeAgentActivityMessages(\n mergedMessages,\n canonicalMessages\n );\n sessionMessagesById = deleteSessionMessageBucket(\n sessionMessagesById,\n alias\n );\n changed = true;\n }\n\n const currentMessages = sessionMessagesById[canonicalAgentSessionId] ?? [];\n if (!areAgentActivityMessageArraysEqual(currentMessages, mergedMessages)) {\n sessionMessagesById = {\n ...sessionMessagesById,\n [canonicalAgentSessionId]: mergedMessages\n };\n changed = true;\n }\n }\n\n return changed ? { ...snapshot, sessionMessagesById } : snapshot;\n}\n\nfunction resolveCanonicalAgentSessionId(\n snapshot: AgentActivitySnapshot,\n rawAgentSessionId: string | null | undefined,\n provider?: string | null\n): string {\n const normalizedAgentSessionId = rawAgentSessionId?.trim() ?? \"\";\n if (!normalizedAgentSessionId) {\n return \"\";\n }\n\n const exactSession = snapshot.sessions.find(\n (session) => session.agentSessionId.trim() === normalizedAgentSessionId\n );\n if (exactSession) {\n return exactSession.agentSessionId.trim();\n }\n\n const normalizedProvider = provider?.trim() ?? \"\";\n const candidates = snapshot.sessions.filter((session) => {\n if (session.providerSessionId?.trim() !== normalizedAgentSessionId) {\n return false;\n }\n return (\n !normalizedProvider || session.provider.trim() === normalizedProvider\n );\n });\n return candidates.length === 1\n ? candidates[0]!.agentSessionId.trim()\n : normalizedAgentSessionId;\n}\n\nfunction sessionMessageAliases(session: AgentActivitySession): string[] {\n const values = [session.agentSessionId, session.providerSessionId];\n const seen = new Set<string>();\n const aliases: string[] = [];\n for (const value of values) {\n const normalized = value?.trim() ?? \"\";\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n aliases.push(normalized);\n }\n return aliases;\n}\n\nfunction canonicalizeAgentActivityMessages(\n messages: readonly AgentActivityMessage[],\n agentSessionId: string\n): AgentActivityMessage[] {\n return messages.map((message) =>\n message.agentSessionId === agentSessionId\n ? message\n : { ...message, agentSessionId }\n );\n}\n\nfunction deleteSessionMessageBucket(\n sessionMessagesById: Record<string, AgentActivityMessage[]>,\n agentSessionId: string\n): Record<string, AgentActivityMessage[]> {\n if (\n !Object.prototype.hasOwnProperty.call(sessionMessagesById, agentSessionId)\n ) {\n return sessionMessagesById;\n }\n const next = { ...sessionMessagesById };\n delete next[agentSessionId];\n return next;\n}\n\nfunction shouldAutoRetainSessionEvents(session: AgentActivitySession): boolean {\n if (!session.agentSessionId.trim()) {\n return false;\n }\n switch (session.status.trim()) {\n case \"canceled\":\n case \"completed\":\n case \"failed\":\n return false;\n default:\n return true;\n }\n}\n\nfunction messageFromEvent(\n event: AgentActivitySessionEventEnvelope,\n data: Record<string, unknown>\n): AgentActivityMessage | null {\n const source = recordValue(data.message) ?? data;\n const agentSessionId =\n stringValue(source.agentSessionId) || event.agentSessionId;\n const messageId = stringValue(source.messageId);\n const role = stringValue(source.role);\n const kind = stringValue(source.kind);\n const turnId = stringValue(source.turnId);\n const version = messageVersionValue(source);\n const occurredAtUnixMs = numberValue(source.occurredAtUnixMs);\n if (\n !agentSessionId ||\n !messageId ||\n !role ||\n !kind ||\n !turnId ||\n version <= 0 ||\n occurredAtUnixMs === undefined ||\n occurredAtUnixMs <= 0\n ) {\n return null;\n }\n return {\n workspaceId: stringValue(source.workspaceId) || event.workspaceId,\n agentSessionId,\n messageId,\n id: numberValue(source.id),\n version,\n turnId,\n role,\n kind,\n status: nullableStringValue(source.status),\n semantics: recordValue(source.semantics)\n ? (cloneJSONValue(source.semantics) as AgentActivityMessage[\"semantics\"])\n : undefined,\n payload: recordValue(source.payload) ?? {},\n occurredAtUnixMs,\n startedAtUnixMs: numberValue(source.startedAtUnixMs),\n completedAtUnixMs: numberValue(source.completedAtUnixMs)\n };\n}\n\nfunction sessionFromEvent(\n workspaceId: string,\n event: AgentActivitySessionEventEnvelope,\n data: Record<string, unknown>\n): AgentActivitySession | null {\n const source = recordValue(data.session) ?? data;\n const agentSessionId =\n stringValue(source.agentSessionId) || event.agentSessionId;\n if (!agentSessionId) {\n return null;\n }\n return {\n workspaceId: stringValue(source.workspaceId) || workspaceId,\n agentSessionId,\n provider: stringValue(source.provider),\n providerSessionId: nullableStringValue(source.providerSessionId),\n model: nullableStringValue(source.model),\n cwd: stringValue(source.cwd),\n title: stringValue(source.title),\n status: stringValue(source.status) || \"unknown\",\n turnLifecycle: recordValue(source.turnLifecycle)\n ? (cloneJSONValue(\n source.turnLifecycle\n ) as AgentActivitySession[\"turnLifecycle\"])\n : undefined,\n submitAvailability: recordValue(source.submitAvailability)\n ? (cloneJSONValue(\n source.submitAvailability\n ) as AgentActivitySession[\"submitAvailability\"])\n : undefined,\n resumable: booleanValue(source.resumable),\n currentPhase: nullableStringValue(source.currentPhase),\n lastError: nullableStringValue(source.lastError),\n runtimeContext: cloneJSONRecord(\n recordValue(source.runtimeContext) ?? undefined\n ),\n messageVersion: numberValue(source.messageVersion),\n lastEventUnixMs: numberValue(source.lastEventUnixMs),\n startedAtUnixMs: numberValue(source.startedAtUnixMs),\n endedAtUnixMs: numberValue(source.endedAtUnixMs),\n createdAtUnixMs: numberValue(source.createdAtUnixMs),\n updatedAtUnixMs: numberValue(source.updatedAtUnixMs)\n };\n}\n\nfunction inlineMessagesFromActivityUpdateData(\n data: unknown\n): Record<string, unknown>[] {\n const source = recordValue(data);\n const messages = Array.isArray(source?.messages) ? source.messages : [];\n return messages.flatMap((message) => {\n const record = recordValue(message);\n return record ? [record] : [];\n });\n}\n\nfunction inlineMessageTargetAgentSessionId(\n snapshot: AgentActivitySnapshot,\n eventAgentSessionId: string,\n message: Record<string, unknown>\n): string {\n const canonicalEventSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n eventAgentSessionId\n );\n if (!canonicalEventSessionId) {\n return \"\";\n }\n const messageAgentSessionId = stringValue(message.agentSessionId);\n return messageAgentSessionId === \"\" ||\n resolveCanonicalAgentSessionId(snapshot, messageAgentSessionId) ===\n canonicalEventSessionId\n ? canonicalEventSessionId\n : knownSessionIdentity(snapshot, eventAgentSessionId)\n ? \"\"\n : resolveCanonicalAgentSessionId(snapshot, messageAgentSessionId);\n}\n\nfunction knownSessionIdentity(\n snapshot: AgentActivitySnapshot,\n agentSessionId: string\n): boolean {\n const normalizedAgentSessionId = agentSessionId.trim();\n return (\n normalizedAgentSessionId !== \"\" &&\n (snapshot.sessions.some(\n (session) => session.agentSessionId.trim() === normalizedAgentSessionId\n ) ||\n resolveCanonicalAgentSessionId(snapshot, normalizedAgentSessionId) !==\n normalizedAgentSessionId)\n );\n}\n\nfunction agentActivityMessageFromInlineMessage(input: {\n agentSessionId: string;\n message: Record<string, unknown>;\n workspaceId: string;\n}): AgentActivityMessage | null {\n const messageId = stringValue(input.message.messageId);\n const role = stringValue(input.message.role);\n const kind = stringValue(input.message.kind);\n const turnId = stringValue(input.message.turnId);\n const version = messageVersionValue(input.message);\n const occurredAtUnixMs = numberValue(input.message.occurredAtUnixMs);\n if (\n !messageId ||\n !role ||\n !kind ||\n !turnId ||\n version <= 0 ||\n occurredAtUnixMs === undefined ||\n occurredAtUnixMs <= 0\n ) {\n return null;\n }\n return {\n workspaceId: stringValue(input.message.workspaceId) || input.workspaceId,\n agentSessionId: input.agentSessionId,\n messageId,\n id: numberValue(input.message.id),\n version,\n turnId,\n role,\n kind,\n status: nullableStringValue(input.message.status),\n semantics: recordValue(input.message.semantics)\n ? (cloneJSONValue(\n input.message.semantics\n ) as AgentActivityMessage[\"semantics\"])\n : undefined,\n payload: recordValue(input.message.payload) ?? {},\n occurredAtUnixMs,\n startedAtUnixMs: numberValue(input.message.startedAtUnixMs),\n completedAtUnixMs: numberValue(input.message.completedAtUnixMs)\n };\n}\n\nfunction inlineStatePatchFromActivityUpdateData(\n data: unknown\n): AgentActivityStatePatch | null {\n const source = recordValue(data);\n const agentSessionId = stringValue(source?.agentSessionId);\n if (!source || !agentSessionId) {\n return null;\n }\n const turn = recordValue(source.turn);\n const submitAvailability = recordValue(source.submitAvailability);\n return {\n agentSessionId,\n currentPhase: stringValue(source.currentPhase) || undefined,\n cwd: stringValue(source.cwd) || undefined,\n lastError: stringValue(source.lastError) || undefined,\n lastEventUnixMs: numberValue(source.lastEventUnixMs),\n lifecycleStatus: stringValue(source.lifecycleStatus) || undefined,\n model: stringValue(source.model) || undefined,\n occurredAtUnixMs: numberValue(source.occurredAtUnixMs),\n provider: stringValue(source.provider) || undefined,\n providerSessionId: stringValue(source.providerSessionId) || undefined,\n runtimeContext: cloneJSONRecord(\n recordValue(source.runtimeContext) ?? undefined\n ),\n startedAtUnixMs: numberValue(source.startedAtUnixMs),\n endedAtUnixMs: numberValue(source.endedAtUnixMs),\n title: stringValue(source.title) || undefined,\n turn: turn\n ? {\n ...(turn.activeTurnId !== undefined\n ? { activeTurnId: nullableStringValue(turn.activeTurnId) }\n : {}),\n ...(recordValue(turn.completedCommand)\n ? {\n completedCommand: cloneJSONValue(\n turn.completedCommand\n ) as NonNullable<\n NonNullable<\n AgentActivityStatePatch[\"turn\"]\n >[\"completedCommand\"]\n >\n }\n : {}),\n completedAtUnixMs: numberValue(turn.completedAtUnixMs),\n fileChanges: turn.fileChanges,\n outcome: stringValue(turn.outcome) || undefined,\n phase: stringValue(turn.phase) || undefined,\n ...(turn.settling !== undefined\n ? { settling: booleanValue(turn.settling) }\n : {}),\n ...(recordValue(turn.submitAvailability)\n ? {\n submitAvailability: cloneJSONValue(\n turn.submitAvailability\n ) as NonNullable<\n NonNullable<\n AgentActivityStatePatch[\"turn\"]\n >[\"submitAvailability\"]\n >\n }\n : {}),\n startedAtUnixMs: numberValue(turn.startedAtUnixMs),\n turnId: stringValue(turn.turnId)\n }\n : undefined,\n submitAvailability: submitAvailability\n ? (cloneJSONValue(\n submitAvailability\n ) as AgentActivityStatePatch[\"submitAvailability\"])\n : undefined,\n workspaceId: stringValue(source.workspaceId) || undefined\n };\n}\n\nfunction isStaleStatePatch(\n session: AgentActivitySession,\n patch: AgentActivityStatePatch\n): boolean {\n const nextTime = patch.lastEventUnixMs ?? patch.occurredAtUnixMs;\n const currentTime = session.lastEventUnixMs ?? session.updatedAtUnixMs;\n return (\n typeof nextTime === \"number\" &&\n typeof currentTime === \"number\" &&\n nextTime < currentTime\n );\n}\n\nfunction agentActivitySessionFromInlineStatePatch(input: {\n existingSession: AgentActivitySession;\n patch: AgentActivityStatePatch;\n workspaceId: string;\n}): AgentActivitySession {\n return {\n ...input.existingSession,\n workspaceId: input.patch.workspaceId ?? input.workspaceId,\n agentSessionId: input.patch.agentSessionId,\n provider: input.patch.provider ?? input.existingSession.provider,\n providerSessionId:\n input.patch.providerSessionId ?? input.existingSession.providerSessionId,\n model: input.patch.model ?? input.existingSession.model,\n cwd: input.patch.cwd ?? input.existingSession.cwd,\n title: input.patch.title ?? input.existingSession.title,\n status: input.patch.lifecycleStatus ?? input.existingSession.status,\n turnLifecycle:\n turnLifecycleFromStatePatch(input.patch) ??\n (cloneJSONValue(\n input.existingSession.turnLifecycle\n ) as AgentActivitySession[\"turnLifecycle\"]),\n submitAvailability:\n input.patch.submitAvailability ??\n input.patch.turn?.submitAvailability ??\n input.existingSession.submitAvailability,\n currentPhase:\n input.patch.currentPhase ??\n input.patch.turn?.phase ??\n input.existingSession.currentPhase,\n lastError: input.patch.lastError ?? input.existingSession.lastError,\n runtimeContext:\n cloneJSONRecord(input.patch.runtimeContext) ??\n cloneJSONRecord(input.existingSession.runtimeContext),\n lastEventUnixMs:\n input.patch.lastEventUnixMs ??\n input.patch.occurredAtUnixMs ??\n input.existingSession.lastEventUnixMs,\n startedAtUnixMs:\n input.patch.startedAtUnixMs ?? input.existingSession.startedAtUnixMs,\n endedAtUnixMs:\n input.patch.endedAtUnixMs ?? input.existingSession.endedAtUnixMs,\n updatedAtUnixMs:\n input.patch.occurredAtUnixMs ??\n input.patch.lastEventUnixMs ??\n input.existingSession.updatedAtUnixMs\n };\n}\n\nfunction cloneAgentActivityStatePatch(\n statePatch: AgentActivityStatePatch\n): AgentActivityStatePatch {\n return {\n ...statePatch,\n runtimeContext: cloneJSONRecord(statePatch.runtimeContext),\n ...(statePatch.submitAvailability\n ? { submitAvailability: { ...statePatch.submitAvailability } }\n : {}),\n turn: statePatch.turn\n ? {\n ...statePatch.turn,\n ...(statePatch.turn.completedCommand\n ? {\n completedCommand: {\n ...statePatch.turn.completedCommand\n }\n }\n : {}),\n ...(statePatch.turn.submitAvailability\n ? {\n submitAvailability: {\n ...statePatch.turn.submitAvailability\n }\n }\n : {})\n }\n : undefined\n };\n}\n\nfunction turnLifecycleFromStatePatch(\n patch: AgentActivityStatePatch\n): AgentActivitySession[\"turnLifecycle\"] | undefined {\n const turn = patch.turn;\n if (!turn?.phase) {\n return undefined;\n }\n const phase = turn.phase;\n const activeTurnId =\n turn.activeTurnId !== undefined\n ? turn.activeTurnId\n : phase === \"settled\"\n ? null\n : turn.turnId || null;\n return {\n activeTurnId,\n phase,\n settling: turn.settling,\n outcome: turn.outcome ?? null,\n completedCommand: turn.completedCommand ?? null\n };\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction nullableStringValue(value: unknown): string | null | undefined {\n return typeof value === \"string\" ? value : value === null ? null : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction messageVersionValue(source: Record<string, unknown>): number {\n return numberValue(source.version) ?? numberValue(source.seq) ?? 0;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n","import type {\n AgentActivityDisplayStatus,\n AgentActivityMessage,\n AgentActivityNeedsAttentionItem,\n AgentActivityNeedsAttentionKind,\n AgentActivitySession,\n AgentActivitySnapshot\n} from \"./types.ts\";\n\nconst terminalMessageStatuses = new Set([\n \"completed\",\n \"canceled\",\n \"failed\",\n \"rejected\",\n \"answered\",\n \"resolved\"\n]);\n\nexport function selectNeedsAttentionCount(\n snapshot: AgentActivitySnapshot\n): number {\n return selectNeedsAttentionItems(snapshot).length;\n}\n\nexport function selectSessionDisplayStatuses(\n snapshot: AgentActivitySnapshot\n): Map<string, AgentActivityDisplayStatus> {\n const needsAttentionSessionIds = new Set(\n selectNeedsAttentionItems(snapshot).map((item) => item.agentSessionId)\n );\n return new Map(\n snapshot.sessions.map((session) => {\n const needsAttention = needsAttentionSessionIds.has(\n session.agentSessionId\n );\n const latestTurnStatus = needsAttention\n ? null\n : resolveLatestAgentActivityMessageDisplayStatus(\n resolveSessionMessages(snapshot, session)\n );\n const sessionStatus = normalizeAgentActivityDisplayStatus(\n session.status,\n {\n currentPhase: session.currentPhase,\n needsAttention,\n turnLifecycleOutcome: session.turnLifecycle?.outcome,\n turnLifecyclePhase: session.turnLifecycle?.phase\n }\n );\n return [\n session.agentSessionId,\n sessionStatus === \"failed\"\n ? (latestTurnStatus ?? sessionStatus)\n : sessionStatus\n ];\n })\n );\n}\n\nexport function resolveLatestAgentActivityMessageDisplayStatus(\n messages: readonly AgentActivityMessage[]\n): AgentActivityDisplayStatus | null {\n const latestMessage = latestMessageWithTurn(messages);\n const turnId = latestMessage?.turnId?.trim() ?? \"\";\n if (!latestMessage || !turnId) {\n return null;\n }\n const turnMessages = messages\n .filter((message) => message.turnId?.trim() === turnId)\n .sort(compareMessageOrder);\n const latestStatus = normalizeStatus(turnMessages.at(-1)?.status);\n const latestTerminalStatus = displayStatusFromTerminalStatus(latestStatus);\n if (latestTerminalStatus) {\n return latestTerminalStatus;\n }\n if (isWaitingStatus(latestStatus, \"\")) {\n return \"waiting\";\n }\n if (isWorkingStatus(latestStatus)) {\n return \"working\";\n }\n if (latestMessage.role.trim().toLowerCase() === \"user\") {\n return \"working\";\n }\n if (\n turnMessages.some((message) =>\n isWaitingStatus(normalizeStatus(message.status), \"\")\n )\n ) {\n return \"waiting\";\n }\n if (\n turnMessages.some((message) =>\n isWorkingStatus(normalizeStatus(message.status))\n )\n ) {\n return \"working\";\n }\n return null;\n}\n\nexport function normalizeAgentActivityDisplayStatus(\n status: string | null | undefined,\n options: {\n currentPhase?: string | null;\n needsAttention?: boolean;\n turnLifecycleOutcome?: string | null;\n turnLifecyclePhase?: string | null;\n } = {}\n): AgentActivityDisplayStatus {\n const normalizedStatus = normalizeStatus(status);\n const normalizedCurrentPhase = normalizeStatus(options.currentPhase);\n const normalizedTurnLifecycleOutcome = normalizeStatus(\n options.turnLifecycleOutcome\n );\n switch (normalizeStatus(options.turnLifecyclePhase)) {\n case \"settled\":\n switch (normalizedTurnLifecycleOutcome) {\n case \"failed\":\n case \"error\":\n return \"failed\";\n case \"canceled\":\n case \"cancelled\":\n case \"interrupted\":\n return \"canceled\";\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n default:\n break;\n }\n if (\n [normalizedStatus, normalizedCurrentPhase].some(\n (value) => value === \"failed\" || value === \"error\"\n )\n ) {\n return \"failed\";\n }\n if (\n [normalizedStatus, normalizedCurrentPhase].some(\n (value) => value === \"canceled\" || value === \"cancelled\"\n )\n ) {\n return \"canceled\";\n }\n return \"completed\";\n case \"waiting\":\n case \"waiting_approval\":\n case \"waiting_input\":\n case \"awaiting_approval\":\n return \"waiting\";\n case \"running\":\n case \"submitted\":\n return \"working\";\n default:\n break;\n }\n if (options.needsAttention) {\n return \"waiting\";\n }\n switch (normalizedStatus) {\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"canceled\":\n case \"cancelled\":\n return \"canceled\";\n case \"error\":\n case \"failed\":\n return \"failed\";\n default:\n break;\n }\n switch (normalizedCurrentPhase) {\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"canceled\":\n case \"cancelled\":\n return \"canceled\";\n case \"error\":\n case \"failed\":\n return \"failed\";\n case \"awaiting_approval\":\n case \"waiting\":\n case \"waiting_approval\":\n case \"waiting_input\":\n return \"waiting\";\n case \"running\":\n case \"streaming\":\n case \"working\":\n return \"working\";\n default:\n break;\n }\n switch (normalizedStatus) {\n case \"running\":\n case \"streaming\":\n case \"working\":\n return \"working\";\n case \"awaiting_approval\":\n case \"waiting\":\n case \"waiting_approval\":\n case \"waiting_input\":\n return \"waiting\";\n case \"idle\":\n case \"ready\":\n default:\n return \"idle\";\n }\n}\n\nexport function selectNeedsAttentionItems(\n snapshot: AgentActivitySnapshot\n): AgentActivityNeedsAttentionItem[] {\n const sessionsById = new Map(\n snapshot.sessions.map((session) => [session.agentSessionId, session])\n );\n const items: AgentActivityNeedsAttentionItem[] = [];\n\n for (const [agentSessionId, messages] of Object.entries(\n snapshot.sessionMessagesById\n )) {\n const session = sessionsById.get(agentSessionId);\n for (const message of messages) {\n const kind = needsAttentionKindForMessage(message);\n if (!kind) {\n continue;\n }\n items.push(\n needsAttentionItemFromMessage(snapshot, message, kind, session)\n );\n }\n }\n\n return items.sort(\n (left, right) =>\n right.occurredAtUnixMs - left.occurredAtUnixMs ||\n left.id.localeCompare(right.id)\n );\n}\n\nfunction needsAttentionKindForMessage(\n message: AgentActivityMessage\n): AgentActivityNeedsAttentionKind | null {\n if (isTerminalMessageStatus(message.status)) {\n return null;\n }\n\n const kind = normalizeKind(message.kind);\n const payloadType = normalizeMetadataValue(message.payload.type);\n const action = normalizeMetadataValue(message.payload.action);\n const requestType = normalizeMetadataValue(message.payload.requestType);\n const callType = normalizeMetadataValue(message.payload.callType);\n const toolName = normalizeMetadataValue(message.payload.toolName);\n const name = normalizeMetadataValue(message.payload.name);\n const status = normalizeStatus(message.status);\n const payloadStatus = normalizeMetadataValue(message.payload.status);\n\n if (\n includesAny(\n [\n kind,\n payloadType,\n requestType,\n callType,\n toolName,\n name,\n status,\n payloadStatus\n ].join(\" \"),\n [\"permission\", \"approval\"]\n )\n ) {\n return \"permission\";\n }\n\n if (\n includesAny(\n [\n kind,\n payloadType,\n action,\n callType,\n toolName,\n name,\n status,\n payloadStatus\n ].join(\" \"),\n [\"ask_user\", \"ask-user\", \"askuserquestion\", \"question\"]\n )\n ) {\n return \"question\";\n }\n\n if (\n includesAny([kind, payloadType, action, toolName, name].join(\" \"), [\n \"constraint\"\n ])\n ) {\n return \"constraint\";\n }\n\n if (\n isWaitingStatus(status, payloadStatus) &&\n (message.role === \"assistant\" || message.role === \"system\")\n ) {\n return \"other\";\n }\n\n return null;\n}\n\nfunction needsAttentionItemFromMessage(\n snapshot: AgentActivitySnapshot,\n message: AgentActivityMessage,\n kind: AgentActivityNeedsAttentionKind,\n session: AgentActivitySession | undefined\n): AgentActivityNeedsAttentionItem {\n return {\n id: `${message.agentSessionId}:${message.messageId}`,\n workspaceId: message.workspaceId || snapshot.workspaceId,\n agentSessionId: message.agentSessionId,\n provider: session?.provider ?? \"\",\n title: session?.title ?? \"\",\n cwd: session?.cwd ?? \"\",\n kind,\n summary: messageSummary(message),\n occurredAtUnixMs:\n message.occurredAtUnixMs ??\n message.startedAtUnixMs ??\n message.completedAtUnixMs ??\n session?.updatedAtUnixMs ??\n session?.lastEventUnixMs ??\n 0\n };\n}\n\nfunction messageSummary(message: AgentActivityMessage): string {\n return (\n stringValue(message.payload.displayPrompt) ||\n stringValue(message.payload.summary) ||\n stringValue(message.payload.title) ||\n stringValue(message.payload.text) ||\n stringValue(message.payload.content) ||\n message.kind\n );\n}\n\nfunction isTerminalMessageStatus(status: string | null | undefined): boolean {\n return terminalMessageStatuses.has(normalizeStatus(status));\n}\n\nfunction resolveSessionMessages(\n snapshot: AgentActivitySnapshot,\n session: AgentActivitySession\n): readonly AgentActivityMessage[] {\n return (\n snapshot.sessionMessagesById[session.agentSessionId] ??\n (session.providerSessionId\n ? snapshot.sessionMessagesById[session.providerSessionId]\n : undefined) ??\n []\n );\n}\n\nfunction latestMessageWithTurn(\n messages: readonly AgentActivityMessage[]\n): AgentActivityMessage | null {\n return messages.reduce<AgentActivityMessage | null>((latest, message) => {\n if (!message.turnId?.trim()) {\n return latest;\n }\n if (!latest) {\n return message;\n }\n return compareMessageOrder(message, latest) > 0 ? message : latest;\n }, null);\n}\n\nfunction compareMessageOrder(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n return (\n (left.version ?? 0) - (right.version ?? 0) ||\n (left.occurredAtUnixMs ?? 0) - (right.occurredAtUnixMs ?? 0) ||\n (left.messageId ?? \"\").localeCompare(right.messageId ?? \"\")\n );\n}\n\nfunction displayStatusFromTerminalStatus(\n status: string\n): AgentActivityDisplayStatus | null {\n switch (status) {\n case \"failed\":\n case \"error\":\n return \"failed\";\n case \"canceled\":\n case \"cancelled\":\n case \"interrupted\":\n return \"canceled\";\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n case \"answered\":\n case \"rejected\":\n case \"resolved\":\n return \"completed\";\n default:\n return null;\n }\n}\n\nfunction isWorkingStatus(status: string): boolean {\n return status === \"running\" || status === \"streaming\" || status === \"working\";\n}\n\nfunction normalizeStatus(status: string | null | undefined): string {\n return status?.trim().toLowerCase() ?? \"\";\n}\n\nfunction isWaitingStatus(...values: readonly string[]): boolean {\n return values.some((value) => {\n const normalized = value.trim().toLowerCase();\n return normalized === \"waiting\" || normalized.startsWith(\"waiting_\");\n });\n}\n\nfunction normalizeKind(kind: string): string {\n return kind.trim().toLowerCase();\n}\n\nfunction normalizeMetadataValue(value: unknown): string {\n return stringValue(value).toLowerCase();\n}\n\nfunction includesAny(value: string, needles: readonly string[]): boolean {\n return needles.some((needle) => value.includes(needle));\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n","export interface AgentActivityUsage {\n usedTokens: number | null;\n totalTokens: number | null;\n percentUsed: number | null; // 0-100, rounded to integer; null when window unknown\n quotas: Array<Record<string, unknown>>;\n}\n\nexport interface AgentActivityUsageInput {\n sessionRuntimeContext?: Record<string, unknown> | null;\n}\n\nexport function resolveAgentActivityUsage(\n input: AgentActivityUsageInput\n): AgentActivityUsage | null {\n const usage = recordValue(input.sessionRuntimeContext?.usage);\n if (!usage) {\n return null;\n }\n const contextWindow = recordValue(usage.contextWindow);\n const usedTokens = finiteNumber(contextWindow?.usedTokens);\n const totalTokens = finiteNumber(contextWindow?.totalTokens);\n const quotas = Array.isArray(usage.quotas)\n ? usage.quotas.filter(\n (entry): entry is Record<string, unknown> =>\n typeof entry === \"object\" && entry !== null\n )\n : [];\n const hasWindow =\n usedTokens !== null && totalTokens !== null && totalTokens > 0;\n if (!hasWindow && quotas.length === 0) {\n return null;\n }\n return {\n usedTokens: hasWindow ? usedTokens : null,\n totalTokens: hasWindow ? totalTokens : null,\n percentUsed: hasWindow\n ? Math.min(100, Math.round((usedTokens / totalTokens) * 100))\n : null,\n quotas\n };\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n"],"mappings":"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","names":["session","recordValue","stringValue","recordValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/capabilities.ts","../src/merge.ts","../src/pagination.ts","../src/controller.ts","../src/selectors.ts","../src/usage.ts"],"sourcesContent":["import type { AgentActivityComposerOptions } from \"./types.ts\";\n\n/** Mirror of packages/agent/daemon/runtime/capabilities.go. */\nexport const AGENT_CAPABILITY_KEYS = [\n \"imageInput\",\n \"skills\",\n \"compact\",\n \"tokenUsage\",\n \"rateLimits\",\n \"planMode\",\n \"interrupt\",\n \"browserUse\",\n \"computerUse\"\n] as const;\n\nexport type AgentCapabilityKey = (typeof AGENT_CAPABILITY_KEYS)[number];\n\nexport interface AgentActivityCapabilityInput {\n composerOptions?: AgentActivityComposerOptions | null;\n sessionRuntimeContext?: Record<string, unknown> | null;\n}\n\nexport function resolveAgentActivityCapability(\n key: AgentCapabilityKey,\n input: AgentActivityCapabilityInput\n): boolean | null {\n return (\n capabilityFromRuntimeContext(key, input.sessionRuntimeContext) ??\n capabilityFromRuntimeContext(key, input.composerOptions?.runtimeContext)\n );\n}\n\nfunction capabilityFromRuntimeContext(\n key: string,\n runtimeContext: Record<string, unknown> | null | undefined\n): boolean | null {\n const list = runtimeContext?.capabilities;\n if (!Array.isArray(list)) {\n return null;\n }\n return list.some((entry) => typeof entry === \"string\" && entry === key);\n}\n","import type { AgentActivityMessage } from \"./types.ts\";\n\nexport function mergeAgentActivityMessages<\n T extends AgentActivityMessage = AgentActivityMessage\n>(currentMessages: readonly T[], incomingMessages: readonly T[]): T[] {\n if (incomingMessages.length === 0) {\n return [...currentMessages];\n }\n\n const byMessageId = new Map<string, T>();\n for (const message of currentMessages) {\n byMessageId.set(message.messageId, cloneAgentActivityMessage(message));\n }\n\n for (const incoming of incomingMessages) {\n const existing = byMessageId.get(incoming.messageId);\n if (!existing || shouldReplaceAgentActivityMessage(existing, incoming)) {\n byMessageId.set(\n incoming.messageId,\n existing\n ? mergeAgentActivityMessage(existing, incoming)\n : cloneAgentActivityMessage(incoming)\n );\n }\n }\n\n return [...byMessageId.values()].sort(compareAgentActivityMessages);\n}\n\nexport function compareAgentActivityMessages(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n return (\n left.version - right.version ||\n (left.id ?? 0) - (right.id ?? 0) ||\n left.messageId.localeCompare(right.messageId)\n );\n}\n\nexport function latestAgentActivityMessageVersion(\n messages: readonly AgentActivityMessage[]\n): number {\n return messages.reduce(\n (latestVersion, message) => Math.max(latestVersion, message.version),\n 0\n );\n}\n\nexport function areAgentActivityMessageArraysEqual(\n left: readonly AgentActivityMessage[],\n right: readonly AgentActivityMessage[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n if (!areAgentActivityMessagesEqual(left[index]!, right[index]!)) {\n return false;\n }\n }\n return true;\n}\n\nexport function areAgentActivityMessagesEqual(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): boolean {\n return (\n left.workspaceId === right.workspaceId &&\n left.agentSessionId === right.agentSessionId &&\n left.messageId === right.messageId &&\n Object.is(left.id, right.id) &&\n left.version === right.version &&\n Object.is(left.turnId, right.turnId) &&\n left.role === right.role &&\n left.kind === right.kind &&\n Object.is(left.status, right.status) &&\n areJsonLikeValuesEqual(left.semantics, right.semantics) &&\n Object.is(left.occurredAtUnixMs, right.occurredAtUnixMs) &&\n Object.is(left.startedAtUnixMs, right.startedAtUnixMs) &&\n Object.is(left.completedAtUnixMs, right.completedAtUnixMs) &&\n areJsonLikeValuesEqual(left.payload, right.payload)\n );\n}\n\nexport function cloneAgentActivityMessage<\n T extends AgentActivityMessage = AgentActivityMessage\n>(message: T): T {\n return {\n ...message,\n semantics: message.semantics ? { ...message.semantics } : undefined,\n payload: { ...message.payload }\n };\n}\n\nfunction mergeAgentActivityMessage<T extends AgentActivityMessage>(\n existing: T,\n incoming: T\n): T {\n return {\n ...existing,\n ...incoming,\n semantics: incoming.semantics\n ? {\n ...existing.semantics,\n ...incoming.semantics\n }\n : existing.semantics,\n payload: {\n ...existing.payload,\n ...incoming.payload\n }\n };\n}\n\nfunction shouldReplaceAgentActivityMessage(\n existing: AgentActivityMessage,\n incoming: AgentActivityMessage\n): boolean {\n if (incoming.version !== existing.version) {\n return incoming.version > existing.version;\n }\n return (incoming.id ?? 0) >= (existing.id ?? 0);\n}\n\nfunction areJsonLikeValuesEqual(left: unknown, right: unknown): boolean {\n if (Object.is(left, right)) {\n return true;\n }\n if (Array.isArray(left) || Array.isArray(right)) {\n if (!Array.isArray(left) || !Array.isArray(right)) {\n return false;\n }\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n if (!areJsonLikeValuesEqual(left[index], right[index])) {\n return false;\n }\n }\n return true;\n }\n const leftRecord = recordValue(left);\n const rightRecord = recordValue(right);\n if (!leftRecord || !rightRecord) {\n return false;\n }\n const keys = new Set([\n ...Object.keys(leftRecord),\n ...Object.keys(rightRecord)\n ]);\n for (const key of keys) {\n if (!areJsonLikeValuesEqual(leftRecord[key], rightRecord[key])) {\n return false;\n }\n }\n return true;\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n","export interface AgentActivityMessagePageLike<T> {\n messages: readonly T[];\n hasMore?: boolean;\n latestVersion?: number;\n}\n\nexport interface LoadAllAgentSessionMessagesInput<T> {\n listPage: (afterVersion: number) => Promise<AgentActivityMessagePageLike<T>>;\n afterVersion?: number;\n maxPages?: number;\n shouldAbort?: () => boolean;\n onPage?: (messages: readonly T[]) => void;\n}\n\nexport interface LoadAllAgentSessionMessagesResult<T> {\n messages: T[];\n aborted: boolean;\n}\n\nconst DEFAULT_MAX_MESSAGE_PAGES = 1000;\n\nexport async function loadAllAgentSessionMessages<\n T extends { version?: number }\n>(\n input: LoadAllAgentSessionMessagesInput<T>\n): Promise<LoadAllAgentSessionMessagesResult<T>> {\n const maxPages = input.maxPages ?? DEFAULT_MAX_MESSAGE_PAGES;\n let afterVersion = input.afterVersion ?? 0;\n const messages: T[] = [];\n\n for (let pageIndex = 0; pageIndex < maxPages; pageIndex += 1) {\n const page = await input.listPage(afterVersion);\n if (input.shouldAbort?.()) {\n return { messages, aborted: true };\n }\n if (page.messages.length > 0) {\n input.onPage?.(page.messages);\n messages.push(...page.messages);\n }\n const messageMaxVersion = page.messages.reduce(\n (maxVersion, message) => Math.max(maxVersion, message.version ?? 0),\n afterVersion\n );\n const pageLatestVersion =\n typeof page.latestVersion === \"number\" &&\n Number.isFinite(page.latestVersion)\n ? Math.max(0, Math.trunc(page.latestVersion))\n : afterVersion;\n const nextAfterVersion = Math.max(messageMaxVersion, pageLatestVersion);\n if (!page.hasMore || nextAfterVersion <= afterVersion) {\n break;\n }\n afterVersion = nextAfterVersion;\n }\n\n return { messages, aborted: false };\n}\n","import type { AgentActivityAdapter } from \"./adapter.ts\";\nimport {\n areAgentActivityMessageArraysEqual,\n cloneAgentActivityMessage,\n latestAgentActivityMessageVersion,\n mergeAgentActivityMessages\n} from \"./merge.ts\";\nimport { loadAllAgentSessionMessages } from \"./pagination.ts\";\nimport type {\n AgentActivityComposerOptions,\n AgentActivityLoadComposerOptionsInput,\n AgentActivityMessage,\n AgentActivityMessageOrder,\n AgentActivityMessagePage,\n AgentActivityStatePatch,\n AgentActivitySession,\n AgentActivitySessionEventEnvelope,\n AgentActivitySnapshot,\n AgentActivityUpdatedApplyResult,\n AgentActivityUpdatedEvent\n} from \"./types.ts\";\n\nexport interface CreateAgentActivityControllerInput {\n adapter: AgentActivityAdapter;\n autoRetainSessionEvents?: boolean;\n workspaceId: string;\n}\n\nexport interface AgentActivityController {\n getSnapshot(): AgentActivitySnapshot;\n subscribe(listener: AgentActivitySnapshotListener): () => void;\n load(signal?: AbortSignal): Promise<AgentActivitySnapshot>;\n loadComposerOptions(\n input: Omit<AgentActivityLoadComposerOptionsInput, \"workspaceId\"> & {\n force?: boolean;\n }\n ): Promise<AgentActivityComposerOptions>;\n listSessionMessages(input: {\n agentSessionId: string;\n afterVersion?: number;\n beforeVersion?: number;\n cache?: boolean;\n limit?: number;\n order?: AgentActivityMessageOrder;\n signal?: AbortSignal;\n }): Promise<AgentActivityMessagePage>;\n retainSessionEvents(input: {\n agentSessionId: string;\n afterVersion?: number;\n onError?: (error: unknown) => void;\n }): () => void;\n removeSession(agentSessionId: string): void;\n upsertSession(session: AgentActivitySession): void;\n applyActivityUpdatedEvent(\n event: AgentActivityUpdatedEvent\n ): AgentActivityUpdatedApplyResult;\n applySessionEvent(event: AgentActivitySessionEventEnvelope): void;\n}\n\nexport type AgentActivitySnapshotListener = (\n snapshot: AgentActivitySnapshot\n) => void;\n\ninterface RetainedSessionStream {\n abortController: AbortController;\n refCount: number;\n unsubscribe: (() => void) | null;\n}\n\nexport function createAgentActivityController({\n adapter,\n autoRetainSessionEvents = true,\n workspaceId\n}: CreateAgentActivityControllerInput): AgentActivityController {\n const listeners = new Set<AgentActivitySnapshotListener>();\n const activeMessageSyncs = new Map<string, Promise<void>>();\n const activeComposerOptionsLoads = new Map<\n string,\n Promise<AgentActivityComposerOptions>\n >();\n const composerOptionsLoadVersions = new Map<string, number>();\n const composerOptionsCwdByCacheKey = new Map<string, string>();\n const activeComposerOptionsLoadCwds = new Map<string, string>();\n const normalizeComposerCwd = (cwd: string | null | undefined): string =>\n (cwd ?? \"\").trim();\n const composerOptionsProviderCacheKey = (provider: string): string =>\n `provider:${provider}`;\n const composerOptionsTargetCacheKey = (agentTargetId: string): string =>\n `target:${agentTargetId}`;\n const autoRetainedStreamReleases = new Map<string, () => void>();\n const retainedStreams = new Map<string, RetainedSessionStream>();\n let snapshot: AgentActivitySnapshot =\n createEmptyAgentActivitySnapshot(workspaceId);\n\n const emit = (): void => {\n for (const listener of listeners) {\n listener(snapshot);\n }\n };\n\n const updateSnapshot = (\n updater: (current: AgentActivitySnapshot) => AgentActivitySnapshot\n ): AgentActivitySnapshot => {\n const nextSnapshot = updater(snapshot);\n if (nextSnapshot === snapshot) {\n return snapshot;\n }\n snapshot = cloneAgentActivitySnapshot(nextSnapshot);\n emit();\n return snapshot;\n };\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n listeners.add(listener);\n listener(snapshot);\n return () => {\n listeners.delete(listener);\n };\n },\n async load(signal) {\n const response = await adapter.listSessions({ workspaceId, signal });\n const nextSessions = response.sessions;\n const nextPresences = response.presences ?? [];\n const nextSnapshot = updateSnapshot((current) => {\n const sessionDataUnchanged =\n areShallowObjectArraysEqual(current.sessions, nextSessions) &&\n areShallowObjectArraysEqual(current.presences, nextPresences);\n const source = sessionDataUnchanged\n ? current\n : {\n ...current,\n presences: nextPresences,\n sessions: nextSessions\n };\n const canonical = canonicalizeSnapshotMessageBuckets(source);\n if (canonical !== source) {\n return canonical;\n }\n return sessionDataUnchanged ? current : source;\n });\n if (autoRetainSessionEvents) {\n reconcileAutoRetainedSessionStreams(nextSnapshot.sessions, signal);\n }\n return nextSnapshot;\n },\n async loadComposerOptions(input) {\n const provider = input.provider.trim();\n if (!provider) {\n throw new Error(\"Agent composer options provider is required.\");\n }\n const agentTargetId =\n typeof input.agentTargetId === \"string\" && input.agentTargetId.trim()\n ? input.agentTargetId.trim()\n : null;\n const primaryCacheKey = agentTargetId\n ? composerOptionsTargetCacheKey(agentTargetId)\n : composerOptionsProviderCacheKey(provider);\n const requestedCwd = normalizeComposerCwd(input.cwd);\n if (!input.force) {\n const cached = agentTargetId\n ? snapshot.composerOptionsByAgentTargetId?.[agentTargetId]\n : snapshot.composerOptionsByProvider?.[provider];\n if (\n cached &&\n composerOptionsCwdByCacheKey.get(primaryCacheKey) === requestedCwd\n ) {\n return cloneAgentActivityComposerOptions(cached);\n }\n }\n const existingLoad = activeComposerOptionsLoads.get(primaryCacheKey);\n if (\n existingLoad &&\n !input.force &&\n activeComposerOptionsLoadCwds.get(primaryCacheKey) === requestedCwd\n ) {\n return existingLoad.then(cloneAgentActivityComposerOptions);\n }\n const loadVersion =\n (composerOptionsLoadVersions.get(primaryCacheKey) ?? 0) + 1;\n composerOptionsLoadVersions.set(primaryCacheKey, loadVersion);\n const load = adapter\n .loadComposerOptions({\n agentTargetId,\n workspaceId,\n provider,\n cwd: input.cwd,\n settings: input.settings,\n signal: input.signal\n })\n .then((options) => {\n const normalizedOptions = cloneAgentActivityComposerOptions({\n ...options,\n provider,\n loadedAtUnixMs: options.loadedAtUnixMs || Date.now()\n });\n if (\n composerOptionsLoadVersions.get(primaryCacheKey) !== loadVersion\n ) {\n return cloneAgentActivityComposerOptions(normalizedOptions);\n }\n composerOptionsCwdByCacheKey.set(primaryCacheKey, requestedCwd);\n updateSnapshot((current) => {\n const currentOptions = agentTargetId\n ? current.composerOptionsByAgentTargetId?.[agentTargetId]\n : current.composerOptionsByProvider?.[provider];\n if (\n currentOptions &&\n areComposerOptionsEqual(currentOptions, normalizedOptions)\n ) {\n return current;\n }\n if (agentTargetId) {\n return {\n ...current,\n composerOptionsByAgentTargetId: {\n ...current.composerOptionsByAgentTargetId,\n [agentTargetId]: normalizedOptions\n }\n };\n }\n return {\n ...current,\n composerOptionsByProvider: {\n ...current.composerOptionsByProvider,\n [provider]: normalizedOptions\n }\n };\n });\n return cloneAgentActivityComposerOptions(normalizedOptions);\n })\n .finally(() => {\n if (activeComposerOptionsLoads.get(primaryCacheKey) === load) {\n activeComposerOptionsLoads.delete(primaryCacheKey);\n activeComposerOptionsLoadCwds.delete(primaryCacheKey);\n }\n });\n activeComposerOptionsLoads.set(primaryCacheKey, load);\n activeComposerOptionsLoadCwds.set(primaryCacheKey, requestedCwd);\n return load.then(cloneAgentActivityComposerOptions);\n },\n async listSessionMessages({\n agentSessionId,\n afterVersion,\n beforeVersion,\n cache = true,\n limit,\n order,\n signal\n }) {\n const response = await adapter.listSessionMessages({\n workspaceId,\n agentSessionId,\n afterVersion,\n beforeVersion,\n limit,\n order,\n signal\n });\n if (cache) {\n updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, response.messages)\n );\n }\n return {\n ...response,\n messages: response.messages.map((message) => ({\n ...message,\n payload: { ...message.payload }\n }))\n };\n },\n retainSessionEvents: retainSessionEventsImpl,\n removeSession(agentSessionId) {\n updateSnapshot((current) =>\n removeSnapshotSession(current, agentSessionId)\n );\n },\n upsertSession(session) {\n if (session.workspaceId && session.workspaceId !== snapshot.workspaceId) {\n return;\n }\n updateSnapshot((current) => upsertSnapshotSession(current, session));\n },\n applyActivityUpdatedEvent(event) {\n const result = applyActivityUpdatedEvent(snapshot, event);\n if (result.snapshot !== snapshot) {\n snapshot = result.snapshot;\n emit();\n }\n return {\n applied: result.applied,\n messages: result.messages.map(cloneAgentActivityMessage),\n session: result.session\n ? cloneAgentActivitySession(result.session)\n : null,\n statePatch: result.statePatch\n ? cloneAgentActivityStatePatch(result.statePatch)\n : null\n };\n },\n applySessionEvent(event) {\n updateSnapshot((current) => applySessionEvent(current, event));\n }\n };\n\n function retainSessionEventsImpl({\n agentSessionId,\n afterVersion,\n onRetainFailed,\n onError\n }: {\n agentSessionId: string;\n afterVersion?: number;\n onRetainFailed?: () => void;\n onError?: (error: unknown) => void;\n }): () => void {\n const normalizedAgentSessionId = agentSessionId.trim();\n if (!normalizedAgentSessionId) {\n return () => {};\n }\n\n const existing = retainedStreams.get(normalizedAgentSessionId);\n if (existing) {\n existing.refCount += 1;\n return createRetainedStreamRelease(normalizedAgentSessionId);\n }\n\n const abortController = new AbortController();\n const stream: RetainedSessionStream = {\n abortController,\n refCount: 1,\n unsubscribe: null\n };\n retainedStreams.set(normalizedAgentSessionId, stream);\n\n const cachedMessages =\n snapshot.sessionMessagesById[normalizedAgentSessionId] ?? [];\n const streamAfterVersion =\n afterVersion ?? latestAgentActivityMessageVersion(cachedMessages);\n\n void adapter\n .subscribeSessionEvents({\n workspaceId,\n agentSessionId: normalizedAgentSessionId,\n afterVersion: streamAfterVersion,\n signal: abortController.signal,\n onEvent(event) {\n if (!abortController.signal.aborted) {\n updateSnapshot((current) => applySessionEvent(current, event));\n }\n },\n onError\n })\n .then((unsubscribe) => {\n const retained = retainedStreams.get(normalizedAgentSessionId);\n if (!retained || retained.abortController.signal.aborted) {\n unsubscribe();\n return;\n }\n retained.unsubscribe = unsubscribe;\n })\n .catch((error: unknown) => {\n if (!abortController.signal.aborted) {\n onError?.(error);\n }\n if (retainedStreams.get(normalizedAgentSessionId) === stream) {\n retainedStreams.delete(normalizedAgentSessionId);\n }\n onRetainFailed?.();\n abortController.abort();\n stream.unsubscribe?.();\n });\n\n return createRetainedStreamRelease(normalizedAgentSessionId);\n }\n\n function reconcileAutoRetainedSessionStreams(\n sessions: readonly AgentActivitySession[],\n signal: AbortSignal | undefined\n ): void {\n const activeSessionIds = new Set(\n sessions\n .filter(shouldAutoRetainSessionEvents)\n .map((session) => session.agentSessionId.trim())\n .filter(Boolean)\n );\n\n for (const [agentSessionId, release] of autoRetainedStreamReleases) {\n if (!activeSessionIds.has(agentSessionId)) {\n release();\n autoRetainedStreamReleases.delete(agentSessionId);\n }\n }\n\n for (const agentSessionId of activeSessionIds) {\n if (!autoRetainedStreamReleases.has(agentSessionId)) {\n autoRetainedStreamReleases.set(\n agentSessionId,\n retainSessionEventsImpl({\n agentSessionId,\n onRetainFailed() {\n autoRetainedStreamReleases.delete(agentSessionId);\n }\n })\n );\n }\n syncSessionMessages(agentSessionId, signal);\n }\n }\n\n function syncSessionMessages(\n agentSessionId: string,\n signal: AbortSignal | undefined\n ): void {\n if (activeMessageSyncs.has(agentSessionId)) {\n return;\n }\n const cachedMessages = snapshot.sessionMessagesById[agentSessionId] ?? [];\n const afterVersion = latestAgentActivityMessageVersion(cachedMessages);\n const sync = loadAllAgentSessionMessages({\n afterVersion,\n shouldAbort: () => signal?.aborted ?? false,\n listPage: (cursor) =>\n adapter.listSessionMessages({\n workspaceId,\n agentSessionId,\n afterVersion: cursor,\n signal\n }),\n onPage: (messages) => {\n updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, messages)\n );\n }\n })\n .then(() => undefined)\n .catch(() => {})\n .finally(() => {\n if (activeMessageSyncs.get(agentSessionId) === sync) {\n activeMessageSyncs.delete(agentSessionId);\n }\n });\n activeMessageSyncs.set(agentSessionId, sync);\n }\n\n function createRetainedStreamRelease(agentSessionId: string): () => void {\n let released = false;\n return () => {\n if (released) {\n return;\n }\n released = true;\n releaseRetainedStream(agentSessionId);\n };\n }\n\n function releaseRetainedStream(agentSessionId: string): void {\n const stream = retainedStreams.get(agentSessionId);\n if (!stream) {\n return;\n }\n stream.refCount -= 1;\n if (stream.refCount > 0) {\n return;\n }\n retainedStreams.delete(agentSessionId);\n stream.abortController.abort();\n stream.unsubscribe?.();\n }\n}\n\nexport function createEmptyAgentActivitySnapshot(\n workspaceId: string\n): AgentActivitySnapshot {\n return {\n workspaceId,\n sessions: [],\n presences: [],\n sessionMessagesById: {},\n composerOptionsByProvider: {},\n composerOptionsByAgentTargetId: {}\n };\n}\n\nexport function cloneAgentActivitySnapshot(\n snapshot: AgentActivitySnapshot\n): AgentActivitySnapshot {\n return {\n workspaceId: snapshot.workspaceId,\n sessions: snapshot.sessions.map(cloneAgentActivitySession),\n presences: snapshot.presences.map((presence) => ({ ...presence })),\n composerOptionsByAgentTargetId: Object.fromEntries(\n Object.entries(snapshot.composerOptionsByAgentTargetId ?? {}).map(\n ([agentTargetId, options]) => [\n agentTargetId,\n cloneAgentActivityComposerOptions(options)\n ]\n )\n ),\n composerOptionsByProvider: Object.fromEntries(\n Object.entries(snapshot.composerOptionsByProvider ?? {}).map(\n ([provider, options]) => [\n provider,\n cloneAgentActivityComposerOptions(options)\n ]\n )\n ),\n sessionMessagesById: Object.fromEntries(\n Object.entries(snapshot.sessionMessagesById).map(\n ([agentSessionId, messages]) => [\n agentSessionId,\n messages.map((message) => ({\n ...message,\n payload: { ...message.payload }\n }))\n ]\n )\n )\n };\n}\n\nfunction cloneAgentActivityComposerOptions(\n options: AgentActivityComposerOptions\n): AgentActivityComposerOptions {\n return {\n provider: options.provider,\n models: options.models.map((option) => ({ ...option })),\n reasoningEfforts: options.reasoningEfforts.map((option) => ({\n ...option\n })),\n speeds: (options.speeds ?? []).map((option) => ({\n ...option\n })),\n modelConfigurable: options.modelConfigurable ?? false,\n reasoningConfigurable: options.reasoningConfigurable ?? false,\n speedConfigurable: options.speedConfigurable ?? false,\n permissionConfig: options.permissionConfig\n ? {\n configurable: options.permissionConfig.configurable,\n defaultValue: options.permissionConfig.defaultValue ?? null,\n modes: options.permissionConfig.modes.map((mode) => ({ ...mode }))\n }\n : (options.permissionConfig ?? null),\n runtimeContext: cloneJSONRecord(options.runtimeContext),\n skills: options.skills.map((skill) => ({ ...skill })),\n capabilityCatalog: (options.capabilityCatalog ?? []).map((capability) => ({\n ...capability\n })),\n loadedAtUnixMs: options.loadedAtUnixMs\n };\n}\n\nfunction cloneAgentActivitySession(\n session: AgentActivitySession\n): AgentActivitySession {\n return {\n ...session,\n turnLifecycle: session.turnLifecycle\n ? (cloneJSONValue(\n session.turnLifecycle\n ) as AgentActivitySession[\"turnLifecycle\"])\n : session.turnLifecycle,\n submitAvailability: session.submitAvailability\n ? { ...session.submitAvailability }\n : session.submitAvailability,\n pendingInteractive:\n session.pendingInteractive === null\n ? null\n : session.pendingInteractive\n ? (cloneJSONValue(\n session.pendingInteractive\n ) as AgentActivitySession[\"pendingInteractive\"])\n : session.pendingInteractive,\n runtimeContext: cloneJSONRecord(session.runtimeContext)\n };\n}\n\nfunction areComposerOptionsEqual(\n left: AgentActivityComposerOptions,\n right: AgentActivityComposerOptions\n): boolean {\n const { loadedAtUnixMs: _leftLoadedAtUnixMs, ...leftComparable } = left;\n const { loadedAtUnixMs: _rightLoadedAtUnixMs, ...rightComparable } = right;\n return JSON.stringify(leftComparable) === JSON.stringify(rightComparable);\n}\n\nfunction cloneJSONRecord<T extends Record<string, unknown> | undefined>(\n value: T\n): T {\n if (value === undefined) {\n return value;\n }\n return cloneJSONValue(value) as T;\n}\n\nfunction cloneJSONValue(value: unknown): unknown {\n if (Array.isArray(value)) {\n return value.map(cloneJSONValue);\n }\n if (value !== null && typeof value === \"object\") {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [\n key,\n cloneJSONValue(entry)\n ])\n );\n }\n return value;\n}\n\nfunction areShallowObjectArraysEqual<T extends object>(\n left: readonly T[],\n right: readonly T[]\n): boolean {\n if (left.length !== right.length) {\n return false;\n }\n for (let index = 0; index < left.length; index += 1) {\n if (!areShallowObjectsEqual(left[index]!, right[index]!)) {\n return false;\n }\n }\n return true;\n}\n\nfunction areShallowObjectsEqual(left: object, right: object): boolean {\n const leftRecord = left as Record<string, unknown>;\n const rightRecord = right as Record<string, unknown>;\n const keys = new Set([\n ...Object.keys(leftRecord),\n ...Object.keys(rightRecord)\n ]);\n for (const key of keys) {\n if (!Object.is(leftRecord[key], rightRecord[key])) {\n return false;\n }\n }\n return true;\n}\n\nfunction applyActivityUpdatedEvent(\n snapshot: AgentActivitySnapshot,\n event: AgentActivityUpdatedEvent\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n if (event.workspaceId && event.workspaceId !== snapshot.workspaceId) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n\n const workspaceId = event.workspaceId || snapshot.workspaceId;\n const agentSessionId = event.agentSessionId.trim();\n if (!agentSessionId) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n\n if (event.eventType === \"message_update\") {\n return applyActivityUpdatedMessages(snapshot, {\n agentSessionId,\n data: event.data,\n workspaceId\n });\n }\n\n if (event.eventType === \"state_patch\") {\n return applyActivityUpdatedStatePatch(snapshot, {\n agentSessionId,\n data: event.data,\n workspaceId\n });\n }\n\n return emptyActivityUpdatedApplyResult(snapshot);\n}\n\nfunction applyActivityUpdatedMessages(\n snapshot: AgentActivitySnapshot,\n input: {\n agentSessionId: string;\n data: unknown;\n workspaceId: string;\n }\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n const inlineMessages = inlineMessagesFromActivityUpdateData(input.data);\n if (inlineMessages.length === 0) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const messagesBySessionId = new Map<string, AgentActivityMessage[]>();\n for (const message of inlineMessages) {\n const targetSessionId = inlineMessageTargetAgentSessionId(\n snapshot,\n input.agentSessionId,\n message\n );\n if (!targetSessionId) {\n continue;\n }\n const activityMessage = agentActivityMessageFromInlineMessage({\n agentSessionId: targetSessionId,\n message,\n workspaceId: input.workspaceId\n });\n if (!activityMessage) {\n continue;\n }\n messagesBySessionId.set(targetSessionId, [\n ...(messagesBySessionId.get(targetSessionId) ?? []),\n activityMessage\n ]);\n }\n if (messagesBySessionId.size === 0) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n let nextSnapshot = snapshot;\n const messages: AgentActivityMessage[] = [];\n for (const [agentSessionId, sessionMessages] of messagesBySessionId) {\n nextSnapshot = mergeSnapshotMessages(\n nextSnapshot,\n agentSessionId,\n sessionMessages\n );\n messages.push(...sessionMessages);\n }\n if (nextSnapshot === snapshot) {\n return {\n applied: true,\n messages: [],\n session: null,\n snapshot,\n statePatch: null\n };\n }\n return {\n applied: true,\n messages,\n session: null,\n snapshot: nextSnapshot,\n statePatch: null\n };\n}\n\nfunction applyActivityUpdatedStatePatch(\n snapshot: AgentActivitySnapshot,\n input: {\n agentSessionId: string;\n data: unknown;\n workspaceId: string;\n }\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n const statePatch = inlineStatePatchFromActivityUpdateData(input.data);\n if (!statePatch) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const canonicalEventSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n input.agentSessionId,\n statePatch.provider\n );\n const canonicalPatchSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n statePatch.agentSessionId,\n statePatch.provider\n );\n if (canonicalPatchSessionId !== canonicalEventSessionId) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const canonicalStatePatch = {\n ...statePatch,\n agentSessionId: canonicalPatchSessionId\n };\n const existingSession =\n snapshot.sessions.find(\n (session) => session.agentSessionId === canonicalPatchSessionId\n ) ?? null;\n if (\n !existingSession ||\n isStaleStatePatch(existingSession, canonicalStatePatch)\n ) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const session = agentActivitySessionFromInlineStatePatch({\n existingSession,\n patch: canonicalStatePatch,\n workspaceId: input.workspaceId\n });\n return {\n applied: true,\n messages: [],\n session,\n snapshot: upsertSnapshotSession(snapshot, session),\n statePatch: canonicalStatePatch\n };\n}\n\nfunction emptyActivityUpdatedApplyResult(\n snapshot: AgentActivitySnapshot\n): AgentActivityUpdatedApplyResult & { snapshot: AgentActivitySnapshot } {\n return {\n applied: false,\n messages: [],\n session: null,\n snapshot,\n statePatch: null\n };\n}\n\nfunction applySessionEvent(\n snapshot: AgentActivitySnapshot,\n event: AgentActivitySessionEventEnvelope\n): AgentActivitySnapshot {\n if (event.workspaceId && event.workspaceId !== snapshot.workspaceId) {\n return snapshot;\n }\n\n const data = recordValue(event.data) ?? {};\n if (event.eventType === \"message_update\") {\n const message = messageFromEvent(event, data);\n return message\n ? mergeSnapshotMessages(snapshot, message.agentSessionId, [message])\n : snapshot;\n }\n\n if (event.eventType === \"session_update\") {\n const session = sessionFromEvent(snapshot.workspaceId, event, data);\n return session ? upsertSnapshotSession(snapshot, session) : snapshot;\n }\n\n return snapshot;\n}\n\nfunction mergeSnapshotMessages(\n snapshot: AgentActivitySnapshot,\n agentSessionId: string,\n messages: readonly AgentActivityMessage[]\n): AgentActivitySnapshot {\n const rawAgentSessionId = agentSessionId.trim();\n const canonicalAgentSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n rawAgentSessionId\n );\n if (!canonicalAgentSessionId || messages.length === 0) {\n return snapshot;\n }\n const currentMessages =\n snapshot.sessionMessagesById[canonicalAgentSessionId] ?? [];\n const aliasMessages =\n rawAgentSessionId && rawAgentSessionId !== canonicalAgentSessionId\n ? (snapshot.sessionMessagesById[rawAgentSessionId] ?? [])\n : [];\n const currentCanonicalMessages =\n aliasMessages.length > 0\n ? mergeAgentActivityMessages(\n currentMessages,\n canonicalizeAgentActivityMessages(\n aliasMessages,\n canonicalAgentSessionId\n )\n )\n : currentMessages;\n const canonicalMessages = canonicalizeAgentActivityMessages(\n messages,\n canonicalAgentSessionId\n );\n const mergedMessages = mergeAgentActivityMessages(\n currentCanonicalMessages,\n canonicalMessages\n );\n const hasAliasBucket =\n rawAgentSessionId !== \"\" &&\n rawAgentSessionId !== canonicalAgentSessionId &&\n Object.prototype.hasOwnProperty.call(\n snapshot.sessionMessagesById,\n rawAgentSessionId\n );\n if (areAgentActivityMessageArraysEqual(currentMessages, mergedMessages)) {\n return hasAliasBucket\n ? {\n ...snapshot,\n sessionMessagesById: deleteSessionMessageBucket(\n snapshot.sessionMessagesById,\n rawAgentSessionId\n )\n }\n : snapshot;\n }\n const sessionMessagesById = {\n ...snapshot.sessionMessagesById,\n [canonicalAgentSessionId]: mergedMessages\n };\n if (hasAliasBucket) {\n delete sessionMessagesById[rawAgentSessionId];\n }\n return {\n ...snapshot,\n sessionMessagesById\n };\n}\n\nfunction upsertSnapshotSession(\n snapshot: AgentActivitySnapshot,\n session: AgentActivitySession\n): AgentActivitySnapshot {\n const index = snapshot.sessions.findIndex(\n (item) => item.agentSessionId === session.agentSessionId\n );\n if (index < 0) {\n return canonicalizeSnapshotMessageBuckets({\n ...snapshot,\n sessions: [...snapshot.sessions, session]\n });\n }\n const sessions = [...snapshot.sessions];\n sessions[index] = session;\n return canonicalizeSnapshotMessageBuckets({\n ...snapshot,\n sessions\n });\n}\n\nfunction removeSnapshotSession(\n snapshot: AgentActivitySnapshot,\n agentSessionId: string\n): AgentActivitySnapshot {\n const normalizedAgentSessionId = agentSessionId.trim();\n if (!normalizedAgentSessionId) {\n return snapshot;\n }\n const sessions = snapshot.sessions.filter(\n (session) => session.agentSessionId !== normalizedAgentSessionId\n );\n const removedSession =\n snapshot.sessions.find(\n (session) => session.agentSessionId === normalizedAgentSessionId\n ) ?? null;\n const removableMessageBuckets = new Set([normalizedAgentSessionId]);\n if (removedSession) {\n for (const alias of sessionMessageAliases(removedSession)) {\n if (\n alias === normalizedAgentSessionId ||\n resolveCanonicalAgentSessionId(\n snapshot,\n alias,\n removedSession.provider\n ) === normalizedAgentSessionId\n ) {\n removableMessageBuckets.add(alias);\n }\n }\n }\n if (\n sessions.length === snapshot.sessions.length &&\n [...removableMessageBuckets].every(\n (bucket) => !snapshot.sessionMessagesById[bucket]\n )\n ) {\n return snapshot;\n }\n const sessionMessagesById = { ...snapshot.sessionMessagesById };\n for (const bucket of removableMessageBuckets) {\n delete sessionMessagesById[bucket];\n }\n return {\n ...snapshot,\n sessions,\n sessionMessagesById\n };\n}\n\nfunction canonicalizeSnapshotMessageBuckets(\n snapshot: AgentActivitySnapshot\n): AgentActivitySnapshot {\n let sessionMessagesById = snapshot.sessionMessagesById;\n let changed = false;\n\n for (const session of snapshot.sessions) {\n const canonicalAgentSessionId = session.agentSessionId.trim();\n if (!canonicalAgentSessionId) {\n continue;\n }\n\n let mergedMessages = sessionMessagesById[canonicalAgentSessionId] ?? [];\n for (const alias of sessionMessageAliases(session)) {\n if (\n alias !== canonicalAgentSessionId &&\n resolveCanonicalAgentSessionId(snapshot, alias, session.provider) !==\n canonicalAgentSessionId\n ) {\n continue;\n }\n const aliasMessages = sessionMessagesById[alias];\n if (!aliasMessages) {\n continue;\n }\n const canonicalMessages = canonicalizeAgentActivityMessages(\n aliasMessages,\n canonicalAgentSessionId\n );\n if (alias === canonicalAgentSessionId) {\n if (\n !areAgentActivityMessageArraysEqual(aliasMessages, canonicalMessages)\n ) {\n sessionMessagesById = {\n ...sessionMessagesById,\n [canonicalAgentSessionId]: canonicalMessages\n };\n mergedMessages = canonicalMessages;\n changed = true;\n }\n continue;\n }\n mergedMessages = mergeAgentActivityMessages(\n mergedMessages,\n canonicalMessages\n );\n sessionMessagesById = deleteSessionMessageBucket(\n sessionMessagesById,\n alias\n );\n changed = true;\n }\n\n const currentMessages = sessionMessagesById[canonicalAgentSessionId] ?? [];\n if (!areAgentActivityMessageArraysEqual(currentMessages, mergedMessages)) {\n sessionMessagesById = {\n ...sessionMessagesById,\n [canonicalAgentSessionId]: mergedMessages\n };\n changed = true;\n }\n }\n\n return changed ? { ...snapshot, sessionMessagesById } : snapshot;\n}\n\nfunction resolveCanonicalAgentSessionId(\n snapshot: AgentActivitySnapshot,\n rawAgentSessionId: string | null | undefined,\n provider?: string | null\n): string {\n const normalizedAgentSessionId = rawAgentSessionId?.trim() ?? \"\";\n if (!normalizedAgentSessionId) {\n return \"\";\n }\n\n const exactSession = snapshot.sessions.find(\n (session) => session.agentSessionId.trim() === normalizedAgentSessionId\n );\n if (exactSession) {\n return exactSession.agentSessionId.trim();\n }\n\n const normalizedProvider = provider?.trim() ?? \"\";\n const candidates = snapshot.sessions.filter((session) => {\n if (session.providerSessionId?.trim() !== normalizedAgentSessionId) {\n return false;\n }\n return (\n !normalizedProvider || session.provider.trim() === normalizedProvider\n );\n });\n return candidates.length === 1\n ? candidates[0]!.agentSessionId.trim()\n : normalizedAgentSessionId;\n}\n\nfunction sessionMessageAliases(session: AgentActivitySession): string[] {\n const values = [session.agentSessionId, session.providerSessionId];\n const seen = new Set<string>();\n const aliases: string[] = [];\n for (const value of values) {\n const normalized = value?.trim() ?? \"\";\n if (!normalized || seen.has(normalized)) {\n continue;\n }\n seen.add(normalized);\n aliases.push(normalized);\n }\n return aliases;\n}\n\nfunction canonicalizeAgentActivityMessages(\n messages: readonly AgentActivityMessage[],\n agentSessionId: string\n): AgentActivityMessage[] {\n return messages.map((message) =>\n message.agentSessionId === agentSessionId\n ? message\n : { ...message, agentSessionId }\n );\n}\n\nfunction deleteSessionMessageBucket(\n sessionMessagesById: Record<string, AgentActivityMessage[]>,\n agentSessionId: string\n): Record<string, AgentActivityMessage[]> {\n if (\n !Object.prototype.hasOwnProperty.call(sessionMessagesById, agentSessionId)\n ) {\n return sessionMessagesById;\n }\n const next = { ...sessionMessagesById };\n delete next[agentSessionId];\n return next;\n}\n\nfunction shouldAutoRetainSessionEvents(session: AgentActivitySession): boolean {\n if (!session.agentSessionId.trim()) {\n return false;\n }\n switch (session.status.trim()) {\n case \"canceled\":\n case \"completed\":\n case \"failed\":\n return false;\n default:\n return true;\n }\n}\n\nfunction messageFromEvent(\n event: AgentActivitySessionEventEnvelope,\n data: Record<string, unknown>\n): AgentActivityMessage | null {\n const source = recordValue(data.message) ?? data;\n const agentSessionId =\n stringValue(source.agentSessionId) || event.agentSessionId;\n const messageId = stringValue(source.messageId);\n const role = stringValue(source.role);\n const kind = stringValue(source.kind);\n const turnId = stringValue(source.turnId);\n const version = messageVersionValue(source);\n const occurredAtUnixMs = numberValue(source.occurredAtUnixMs);\n if (\n !agentSessionId ||\n !messageId ||\n !role ||\n !kind ||\n !turnId ||\n version <= 0 ||\n occurredAtUnixMs === undefined ||\n occurredAtUnixMs <= 0\n ) {\n return null;\n }\n return {\n workspaceId: stringValue(source.workspaceId) || event.workspaceId,\n agentSessionId,\n messageId,\n id: numberValue(source.id),\n version,\n turnId,\n role,\n kind,\n status: nullableStringValue(source.status),\n semantics: recordValue(source.semantics)\n ? (cloneJSONValue(source.semantics) as AgentActivityMessage[\"semantics\"])\n : undefined,\n payload: recordValue(source.payload) ?? {},\n occurredAtUnixMs,\n startedAtUnixMs: numberValue(source.startedAtUnixMs),\n completedAtUnixMs: numberValue(source.completedAtUnixMs)\n };\n}\n\nfunction sessionFromEvent(\n workspaceId: string,\n event: AgentActivitySessionEventEnvelope,\n data: Record<string, unknown>\n): AgentActivitySession | null {\n const source = recordValue(data.session) ?? data;\n const agentSessionId =\n stringValue(source.agentSessionId) || event.agentSessionId;\n if (!agentSessionId) {\n return null;\n }\n return {\n workspaceId: stringValue(source.workspaceId) || workspaceId,\n agentSessionId,\n agentTargetId: nullableStringValue(source.agentTargetId),\n provider: stringValue(source.provider),\n providerSessionId: nullableStringValue(source.providerSessionId),\n model: nullableStringValue(source.model),\n cwd: stringValue(source.cwd),\n title: stringValue(source.title),\n status: stringValue(source.status) || \"unknown\",\n turnLifecycle: recordValue(source.turnLifecycle)\n ? (cloneJSONValue(\n source.turnLifecycle\n ) as AgentActivitySession[\"turnLifecycle\"])\n : undefined,\n submitAvailability: recordValue(source.submitAvailability)\n ? (cloneJSONValue(\n source.submitAvailability\n ) as AgentActivitySession[\"submitAvailability\"])\n : undefined,\n resumable: booleanValue(source.resumable),\n currentPhase: nullableStringValue(source.currentPhase),\n lastError: nullableStringValue(source.lastError),\n runtimeContext: cloneJSONRecord(\n recordValue(source.runtimeContext) ?? undefined\n ),\n messageVersion: numberValue(source.messageVersion),\n lastEventUnixMs: numberValue(source.lastEventUnixMs),\n startedAtUnixMs: numberValue(source.startedAtUnixMs),\n endedAtUnixMs: numberValue(source.endedAtUnixMs),\n createdAtUnixMs: numberValue(source.createdAtUnixMs),\n updatedAtUnixMs: numberValue(source.updatedAtUnixMs)\n };\n}\n\nfunction inlineMessagesFromActivityUpdateData(\n data: unknown\n): Record<string, unknown>[] {\n const source = recordValue(data);\n const messages = Array.isArray(source?.messages) ? source.messages : [];\n return messages.flatMap((message) => {\n const record = recordValue(message);\n return record ? [record] : [];\n });\n}\n\nfunction inlineMessageTargetAgentSessionId(\n snapshot: AgentActivitySnapshot,\n eventAgentSessionId: string,\n message: Record<string, unknown>\n): string {\n const canonicalEventSessionId = resolveCanonicalAgentSessionId(\n snapshot,\n eventAgentSessionId\n );\n if (!canonicalEventSessionId) {\n return \"\";\n }\n const messageAgentSessionId = stringValue(message.agentSessionId);\n return messageAgentSessionId === \"\" ||\n resolveCanonicalAgentSessionId(snapshot, messageAgentSessionId) ===\n canonicalEventSessionId\n ? canonicalEventSessionId\n : knownSessionIdentity(snapshot, eventAgentSessionId)\n ? \"\"\n : resolveCanonicalAgentSessionId(snapshot, messageAgentSessionId);\n}\n\nfunction knownSessionIdentity(\n snapshot: AgentActivitySnapshot,\n agentSessionId: string\n): boolean {\n const normalizedAgentSessionId = agentSessionId.trim();\n return (\n normalizedAgentSessionId !== \"\" &&\n (snapshot.sessions.some(\n (session) => session.agentSessionId.trim() === normalizedAgentSessionId\n ) ||\n resolveCanonicalAgentSessionId(snapshot, normalizedAgentSessionId) !==\n normalizedAgentSessionId)\n );\n}\n\nfunction agentActivityMessageFromInlineMessage(input: {\n agentSessionId: string;\n message: Record<string, unknown>;\n workspaceId: string;\n}): AgentActivityMessage | null {\n const messageId = stringValue(input.message.messageId);\n const role = stringValue(input.message.role);\n const kind = stringValue(input.message.kind);\n const turnId = stringValue(input.message.turnId);\n const version = messageVersionValue(input.message);\n const occurredAtUnixMs = numberValue(input.message.occurredAtUnixMs);\n if (\n !messageId ||\n !role ||\n !kind ||\n !turnId ||\n version <= 0 ||\n occurredAtUnixMs === undefined ||\n occurredAtUnixMs <= 0\n ) {\n return null;\n }\n return {\n workspaceId: stringValue(input.message.workspaceId) || input.workspaceId,\n agentSessionId: input.agentSessionId,\n messageId,\n id: numberValue(input.message.id),\n version,\n turnId,\n role,\n kind,\n status: nullableStringValue(input.message.status),\n semantics: recordValue(input.message.semantics)\n ? (cloneJSONValue(\n input.message.semantics\n ) as AgentActivityMessage[\"semantics\"])\n : undefined,\n payload: recordValue(input.message.payload) ?? {},\n occurredAtUnixMs,\n startedAtUnixMs: numberValue(input.message.startedAtUnixMs),\n completedAtUnixMs: numberValue(input.message.completedAtUnixMs)\n };\n}\n\nfunction inlineStatePatchFromActivityUpdateData(\n data: unknown\n): AgentActivityStatePatch | null {\n const source = recordValue(data);\n const agentSessionId = stringValue(source?.agentSessionId);\n if (!source || !agentSessionId) {\n return null;\n }\n const turn = recordValue(source.turn);\n const submitAvailability = recordValue(source.submitAvailability);\n return {\n agentSessionId,\n currentPhase: stringValue(source.currentPhase) || undefined,\n cwd: stringValue(source.cwd) || undefined,\n lastError: stringValue(source.lastError) || undefined,\n lastEventUnixMs: numberValue(source.lastEventUnixMs),\n lifecycleStatus: stringValue(source.lifecycleStatus) || undefined,\n model: stringValue(source.model) || undefined,\n occurredAtUnixMs: numberValue(source.occurredAtUnixMs),\n provider: stringValue(source.provider) || undefined,\n providerSessionId: stringValue(source.providerSessionId) || undefined,\n runtimeContext: cloneJSONRecord(\n recordValue(source.runtimeContext) ?? undefined\n ),\n ...(source.pendingInteractive !== undefined\n ? {\n pendingInteractive:\n source.pendingInteractive === null\n ? null\n : (cloneJSONValue(\n recordValue(source.pendingInteractive) ?? {}\n ) as AgentActivityStatePatch[\"pendingInteractive\"])\n }\n : {}),\n startedAtUnixMs: numberValue(source.startedAtUnixMs),\n endedAtUnixMs: numberValue(source.endedAtUnixMs),\n title: stringValue(source.title) || undefined,\n turn: turn\n ? {\n ...(turn.activeTurnId !== undefined\n ? { activeTurnId: nullableStringValue(turn.activeTurnId) }\n : {}),\n ...(recordValue(turn.completedCommand)\n ? {\n completedCommand: cloneJSONValue(\n turn.completedCommand\n ) as NonNullable<\n NonNullable<\n AgentActivityStatePatch[\"turn\"]\n >[\"completedCommand\"]\n >\n }\n : {}),\n completedAtUnixMs: numberValue(turn.completedAtUnixMs),\n fileChanges: turn.fileChanges,\n outcome: stringValue(turn.outcome) || undefined,\n phase: stringValue(turn.phase) || undefined,\n ...(turn.settling !== undefined\n ? { settling: booleanValue(turn.settling) }\n : {}),\n ...(recordValue(turn.submitAvailability)\n ? {\n submitAvailability: cloneJSONValue(\n turn.submitAvailability\n ) as NonNullable<\n NonNullable<\n AgentActivityStatePatch[\"turn\"]\n >[\"submitAvailability\"]\n >\n }\n : {}),\n startedAtUnixMs: numberValue(turn.startedAtUnixMs),\n turnId: stringValue(turn.turnId)\n }\n : undefined,\n submitAvailability: submitAvailability\n ? (cloneJSONValue(\n submitAvailability\n ) as AgentActivityStatePatch[\"submitAvailability\"])\n : undefined,\n workspaceId: stringValue(source.workspaceId) || undefined\n };\n}\n\nfunction isStaleStatePatch(\n session: AgentActivitySession,\n patch: AgentActivityStatePatch\n): boolean {\n const nextTime = patch.lastEventUnixMs ?? patch.occurredAtUnixMs;\n const currentTime = session.lastEventUnixMs ?? session.updatedAtUnixMs;\n return (\n typeof nextTime === \"number\" &&\n typeof currentTime === \"number\" &&\n nextTime < currentTime\n );\n}\n\nfunction agentActivitySessionFromInlineStatePatch(input: {\n existingSession: AgentActivitySession;\n patch: AgentActivityStatePatch;\n workspaceId: string;\n}): AgentActivitySession {\n return {\n ...input.existingSession,\n workspaceId: input.patch.workspaceId ?? input.workspaceId,\n agentSessionId: input.patch.agentSessionId,\n agentTargetId:\n input.patch.agentTargetId ?? input.existingSession.agentTargetId,\n provider: input.patch.provider ?? input.existingSession.provider,\n providerSessionId:\n input.patch.providerSessionId ?? input.existingSession.providerSessionId,\n model: input.patch.model ?? input.existingSession.model,\n cwd: input.patch.cwd ?? input.existingSession.cwd,\n title: input.patch.title ?? input.existingSession.title,\n status: input.patch.lifecycleStatus ?? input.existingSession.status,\n turnLifecycle:\n turnLifecycleFromStatePatch(input.patch) ??\n (cloneJSONValue(\n input.existingSession.turnLifecycle\n ) as AgentActivitySession[\"turnLifecycle\"]),\n submitAvailability:\n input.patch.submitAvailability ??\n input.patch.turn?.submitAvailability ??\n input.existingSession.submitAvailability,\n currentPhase:\n input.patch.currentPhase ??\n input.patch.turn?.phase ??\n input.existingSession.currentPhase,\n lastError: input.patch.lastError ?? input.existingSession.lastError,\n runtimeContext:\n cloneJSONRecord(input.patch.runtimeContext) ??\n cloneJSONRecord(input.existingSession.runtimeContext),\n pendingInteractive:\n input.patch.pendingInteractive !== undefined\n ? input.patch.pendingInteractive === null\n ? null\n : (cloneJSONValue(\n input.patch.pendingInteractive\n ) as AgentActivitySession[\"pendingInteractive\"])\n : input.existingSession.pendingInteractive,\n lastEventUnixMs:\n input.patch.lastEventUnixMs ??\n input.patch.occurredAtUnixMs ??\n input.existingSession.lastEventUnixMs,\n startedAtUnixMs:\n input.patch.startedAtUnixMs ?? input.existingSession.startedAtUnixMs,\n endedAtUnixMs:\n input.patch.endedAtUnixMs ?? input.existingSession.endedAtUnixMs,\n updatedAtUnixMs:\n input.patch.occurredAtUnixMs ??\n input.patch.lastEventUnixMs ??\n input.existingSession.updatedAtUnixMs\n };\n}\n\nfunction cloneAgentActivityStatePatch(\n statePatch: AgentActivityStatePatch\n): AgentActivityStatePatch {\n return {\n ...statePatch,\n runtimeContext: cloneJSONRecord(statePatch.runtimeContext),\n pendingInteractive:\n statePatch.pendingInteractive === null\n ? null\n : statePatch.pendingInteractive\n ? (cloneJSONValue(\n statePatch.pendingInteractive\n ) as AgentActivityStatePatch[\"pendingInteractive\"])\n : statePatch.pendingInteractive,\n ...(statePatch.submitAvailability\n ? { submitAvailability: { ...statePatch.submitAvailability } }\n : {}),\n turn: statePatch.turn\n ? {\n ...statePatch.turn,\n ...(statePatch.turn.completedCommand\n ? {\n completedCommand: {\n ...statePatch.turn.completedCommand\n }\n }\n : {}),\n ...(statePatch.turn.submitAvailability\n ? {\n submitAvailability: {\n ...statePatch.turn.submitAvailability\n }\n }\n : {})\n }\n : undefined\n };\n}\n\nfunction turnLifecycleFromStatePatch(\n patch: AgentActivityStatePatch\n): AgentActivitySession[\"turnLifecycle\"] | undefined {\n const turn = patch.turn;\n if (!turn?.phase) {\n return undefined;\n }\n const phase = turn.phase;\n const activeTurnId =\n turn.activeTurnId !== undefined\n ? turn.activeTurnId\n : phase === \"settled\"\n ? null\n : turn.turnId || null;\n return {\n activeTurnId,\n phase,\n settling: turn.settling,\n outcome: turn.outcome ?? null,\n completedCommand: turn.completedCommand ?? null\n };\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return typeof value === \"object\" && value !== null\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n\nfunction nullableStringValue(value: unknown): string | null | undefined {\n return typeof value === \"string\" ? value : value === null ? null : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value)\n ? value\n : undefined;\n}\n\nfunction messageVersionValue(source: Record<string, unknown>): number {\n return numberValue(source.version) ?? numberValue(source.seq) ?? 0;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n","import type {\n AgentActivityDisplayStatus,\n AgentActivityMessage,\n AgentActivityNeedsAttentionItem,\n AgentActivityNeedsAttentionKind,\n AgentActivitySession,\n AgentActivitySnapshot\n} from \"./types.ts\";\n\nconst terminalMessageStatuses = new Set([\n \"completed\",\n \"canceled\",\n \"failed\",\n \"rejected\",\n \"answered\",\n \"resolved\"\n]);\n\nexport function selectNeedsAttentionCount(\n snapshot: AgentActivitySnapshot\n): number {\n return selectNeedsAttentionItems(snapshot).length;\n}\n\nexport function selectSessionDisplayStatuses(\n snapshot: AgentActivitySnapshot\n): Map<string, AgentActivityDisplayStatus> {\n const needsAttentionSessionIds = new Set(\n selectNeedsAttentionItems(snapshot).map((item) => item.agentSessionId)\n );\n return new Map(\n snapshot.sessions.map((session) => {\n const needsAttention = needsAttentionSessionIds.has(\n session.agentSessionId\n );\n const latestTurnStatus = needsAttention\n ? null\n : resolveLatestAgentActivityMessageDisplayStatus(\n resolveSessionMessages(snapshot, session)\n );\n const sessionStatus = normalizeAgentActivityDisplayStatus(\n session.status,\n {\n currentPhase: session.currentPhase,\n needsAttention,\n turnLifecycleOutcome: session.turnLifecycle?.outcome,\n turnLifecyclePhase: session.turnLifecycle?.phase\n }\n );\n return [\n session.agentSessionId,\n sessionStatus === \"failed\"\n ? shouldLatestTurnStatusOverrideFailedSession(latestTurnStatus)\n ? latestTurnStatus\n : sessionStatus\n : sessionStatus\n ];\n })\n );\n}\n\nfunction shouldLatestTurnStatusOverrideFailedSession(\n status: AgentActivityDisplayStatus | null\n): status is AgentActivityDisplayStatus {\n return status !== null && status !== \"working\" && status !== \"idle\";\n}\n\nexport function resolveLatestAgentActivityMessageDisplayStatus(\n messages: readonly AgentActivityMessage[]\n): AgentActivityDisplayStatus | null {\n const latestMessage = latestMessageWithTurn(messages);\n const turnId = latestMessage?.turnId?.trim() ?? \"\";\n if (!latestMessage || !turnId) {\n return null;\n }\n const turnMessages = messages\n .filter((message) => message.turnId?.trim() === turnId)\n .sort(compareMessageOrder);\n const latestStatus = normalizeStatus(turnMessages.at(-1)?.status);\n const latestTerminalStatus = displayStatusFromTerminalStatus(latestStatus);\n if (latestTerminalStatus) {\n return latestTerminalStatus;\n }\n if (isWaitingStatus(latestStatus, \"\")) {\n return \"waiting\";\n }\n if (isWorkingStatus(latestStatus)) {\n return \"working\";\n }\n if (latestMessage.role.trim().toLowerCase() === \"user\") {\n return \"working\";\n }\n if (\n turnMessages.some((message) =>\n isWaitingStatus(normalizeStatus(message.status), \"\")\n )\n ) {\n return \"waiting\";\n }\n if (\n turnMessages.some((message) =>\n isWorkingStatus(normalizeStatus(message.status))\n )\n ) {\n return \"working\";\n }\n return null;\n}\n\nexport function normalizeAgentActivityDisplayStatus(\n status: string | null | undefined,\n options: {\n currentPhase?: string | null;\n needsAttention?: boolean;\n turnLifecycleOutcome?: string | null;\n turnLifecyclePhase?: string | null;\n } = {}\n): AgentActivityDisplayStatus {\n const normalizedStatus = normalizeStatus(status);\n const normalizedCurrentPhase = normalizeStatus(options.currentPhase);\n const normalizedTurnLifecycleOutcome = normalizeStatus(\n options.turnLifecycleOutcome\n );\n switch (normalizeStatus(options.turnLifecyclePhase)) {\n case \"settled\":\n switch (normalizedTurnLifecycleOutcome) {\n case \"failed\":\n case \"error\":\n return \"failed\";\n case \"canceled\":\n case \"cancelled\":\n case \"interrupted\":\n return \"canceled\";\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n default:\n break;\n }\n if (\n [normalizedStatus, normalizedCurrentPhase].some(\n (value) => value === \"failed\" || value === \"error\"\n )\n ) {\n return \"failed\";\n }\n if (\n [normalizedStatus, normalizedCurrentPhase].some(\n (value) => value === \"canceled\" || value === \"cancelled\"\n )\n ) {\n return \"canceled\";\n }\n return \"completed\";\n case \"waiting\":\n case \"waiting_approval\":\n case \"waiting_input\":\n case \"awaiting_approval\":\n return \"waiting\";\n case \"running\":\n case \"submitted\":\n return \"working\";\n default:\n break;\n }\n if (options.needsAttention) {\n return \"waiting\";\n }\n switch (normalizedStatus) {\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"canceled\":\n case \"cancelled\":\n return \"canceled\";\n case \"error\":\n case \"failed\":\n return \"failed\";\n default:\n break;\n }\n switch (normalizedCurrentPhase) {\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n return \"completed\";\n case \"canceled\":\n case \"cancelled\":\n return \"canceled\";\n case \"error\":\n case \"failed\":\n return \"failed\";\n case \"awaiting_approval\":\n case \"waiting\":\n case \"waiting_approval\":\n case \"waiting_input\":\n return \"waiting\";\n case \"running\":\n case \"streaming\":\n case \"working\":\n return \"working\";\n default:\n break;\n }\n switch (normalizedStatus) {\n case \"running\":\n case \"streaming\":\n case \"working\":\n return \"working\";\n case \"awaiting_approval\":\n case \"waiting\":\n case \"waiting_approval\":\n case \"waiting_input\":\n return \"waiting\";\n case \"idle\":\n case \"ready\":\n default:\n return \"idle\";\n }\n}\n\nexport function selectNeedsAttentionItems(\n snapshot: AgentActivitySnapshot\n): AgentActivityNeedsAttentionItem[] {\n const sessionsById = new Map(\n snapshot.sessions.map((session) => [session.agentSessionId, session])\n );\n const items: AgentActivityNeedsAttentionItem[] = [];\n\n for (const [agentSessionId, messages] of Object.entries(\n snapshot.sessionMessagesById\n )) {\n const session = sessionsById.get(agentSessionId);\n for (const message of messages) {\n const kind = needsAttentionKindForMessage(message);\n if (!kind) {\n continue;\n }\n items.push(\n needsAttentionItemFromMessage(snapshot, message, kind, session)\n );\n }\n }\n\n return items.sort(\n (left, right) =>\n right.occurredAtUnixMs - left.occurredAtUnixMs ||\n left.id.localeCompare(right.id)\n );\n}\n\nfunction needsAttentionKindForMessage(\n message: AgentActivityMessage\n): AgentActivityNeedsAttentionKind | null {\n if (isTerminalMessageStatus(message.status)) {\n return null;\n }\n\n const kind = normalizeKind(message.kind);\n const payloadType = normalizeMetadataValue(message.payload.type);\n const action = normalizeMetadataValue(message.payload.action);\n const requestType = normalizeMetadataValue(message.payload.requestType);\n const callType = normalizeMetadataValue(message.payload.callType);\n const toolName = normalizeMetadataValue(message.payload.toolName);\n const name = normalizeMetadataValue(message.payload.name);\n const status = normalizeStatus(message.status);\n const payloadStatus = normalizeMetadataValue(message.payload.status);\n\n if (\n includesAny(\n [\n kind,\n payloadType,\n requestType,\n callType,\n toolName,\n name,\n status,\n payloadStatus\n ].join(\" \"),\n [\"permission\", \"approval\"]\n )\n ) {\n return \"permission\";\n }\n\n if (\n includesAny(\n [\n kind,\n payloadType,\n action,\n callType,\n toolName,\n name,\n status,\n payloadStatus\n ].join(\" \"),\n [\"ask_user\", \"ask-user\", \"askuserquestion\", \"question\"]\n )\n ) {\n return \"question\";\n }\n\n if (\n includesAny([kind, payloadType, action, toolName, name].join(\" \"), [\n \"constraint\"\n ])\n ) {\n return \"constraint\";\n }\n\n if (\n isWaitingStatus(status, payloadStatus) &&\n (message.role === \"assistant\" || message.role === \"system\")\n ) {\n return \"other\";\n }\n\n return null;\n}\n\nfunction needsAttentionItemFromMessage(\n snapshot: AgentActivitySnapshot,\n message: AgentActivityMessage,\n kind: AgentActivityNeedsAttentionKind,\n session: AgentActivitySession | undefined\n): AgentActivityNeedsAttentionItem {\n return {\n id: `${message.agentSessionId}:${message.messageId}`,\n workspaceId: message.workspaceId || snapshot.workspaceId,\n agentSessionId: message.agentSessionId,\n provider: session?.provider ?? \"\",\n title: session?.title ?? \"\",\n cwd: session?.cwd ?? \"\",\n kind,\n summary: messageSummary(message),\n occurredAtUnixMs:\n message.occurredAtUnixMs ??\n message.startedAtUnixMs ??\n message.completedAtUnixMs ??\n session?.updatedAtUnixMs ??\n session?.lastEventUnixMs ??\n 0\n };\n}\n\nfunction messageSummary(message: AgentActivityMessage): string {\n return (\n stringValue(message.payload.displayPrompt) ||\n stringValue(message.payload.summary) ||\n stringValue(message.payload.title) ||\n stringValue(message.payload.text) ||\n stringValue(message.payload.content) ||\n message.kind\n );\n}\n\nfunction isTerminalMessageStatus(status: string | null | undefined): boolean {\n return terminalMessageStatuses.has(normalizeStatus(status));\n}\n\nfunction resolveSessionMessages(\n snapshot: AgentActivitySnapshot,\n session: AgentActivitySession\n): readonly AgentActivityMessage[] {\n return (\n snapshot.sessionMessagesById[session.agentSessionId] ??\n (session.providerSessionId\n ? snapshot.sessionMessagesById[session.providerSessionId]\n : undefined) ??\n []\n );\n}\n\nfunction latestMessageWithTurn(\n messages: readonly AgentActivityMessage[]\n): AgentActivityMessage | null {\n return messages.reduce<AgentActivityMessage | null>((latest, message) => {\n if (!message.turnId?.trim()) {\n return latest;\n }\n if (!latest) {\n return message;\n }\n return compareMessageOrder(message, latest) > 0 ? message : latest;\n }, null);\n}\n\nfunction compareMessageOrder(\n left: AgentActivityMessage,\n right: AgentActivityMessage\n): number {\n return (\n (left.version ?? 0) - (right.version ?? 0) ||\n (left.occurredAtUnixMs ?? 0) - (right.occurredAtUnixMs ?? 0) ||\n (left.messageId ?? \"\").localeCompare(right.messageId ?? \"\")\n );\n}\n\nfunction displayStatusFromTerminalStatus(\n status: string\n): AgentActivityDisplayStatus | null {\n switch (status) {\n case \"failed\":\n case \"error\":\n return \"failed\";\n case \"canceled\":\n case \"cancelled\":\n case \"interrupted\":\n return \"canceled\";\n case \"completed\":\n case \"done\":\n case \"success\":\n case \"succeeded\":\n case \"answered\":\n case \"rejected\":\n case \"resolved\":\n return \"completed\";\n default:\n return null;\n }\n}\n\nfunction isWorkingStatus(status: string): boolean {\n return status === \"running\" || status === \"streaming\" || status === \"working\";\n}\n\nfunction normalizeStatus(status: string | null | undefined): string {\n return status?.trim().toLowerCase() ?? \"\";\n}\n\nfunction isWaitingStatus(...values: readonly string[]): boolean {\n return values.some((value) => {\n const normalized = value.trim().toLowerCase();\n return normalized === \"waiting\" || normalized.startsWith(\"waiting_\");\n });\n}\n\nfunction normalizeKind(kind: string): string {\n return kind.trim().toLowerCase();\n}\n\nfunction normalizeMetadataValue(value: unknown): string {\n return stringValue(value).toLowerCase();\n}\n\nfunction includesAny(value: string, needles: readonly string[]): boolean {\n return needles.some((needle) => value.includes(needle));\n}\n\nfunction stringValue(value: unknown): string {\n return typeof value === \"string\" ? value.trim() : \"\";\n}\n","export interface AgentActivityUsage {\n usedTokens: number | null;\n totalTokens: number | null;\n percentUsed: number | null; // 0-100, rounded to integer; null when window unknown\n quotas: Array<Record<string, unknown>>;\n}\n\nexport interface AgentActivityUsageInput {\n sessionRuntimeContext?: Record<string, unknown> | null;\n}\n\nexport function resolveAgentActivityUsage(\n input: AgentActivityUsageInput\n): AgentActivityUsage | null {\n const usage = recordValue(input.sessionRuntimeContext?.usage);\n if (!usage) {\n return null;\n }\n const contextWindow = recordValue(usage.contextWindow);\n const usedTokens = finiteNumber(contextWindow?.usedTokens);\n const totalTokens = finiteNumber(contextWindow?.totalTokens);\n const quotas = Array.isArray(usage.quotas)\n ? usage.quotas.filter(\n (entry): entry is Record<string, unknown> =>\n typeof entry === \"object\" && entry !== null\n )\n : [];\n const hasWindow =\n usedTokens !== null && totalTokens !== null && totalTokens > 0;\n if (!hasWindow && quotas.length === 0) {\n return null;\n }\n return {\n usedTokens: hasWindow ? usedTokens : null,\n totalTokens: hasWindow ? totalTokens : null,\n percentUsed: hasWindow\n ? Math.min(100, Math.round((usedTokens / totalTokens) * 100))\n : null,\n quotas\n };\n}\n\nfunction recordValue(value: unknown): Record<string, unknown> | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as Record<string, unknown>)\n : null;\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n"],"mappings":"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","names":["session","recordValue","stringValue","recordValue"]}
|