@tutti-os/agent-activity-core 0.0.9 → 0.0.11
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 +25 -6
- package/dist/index.js +302 -65
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.d.ts
CHANGED
|
@@ -93,6 +93,10 @@ interface AgentActivityComposerOptions {
|
|
|
93
93
|
provider: string;
|
|
94
94
|
models: AgentActivityComposerSettingOption[];
|
|
95
95
|
reasoningEfforts: AgentActivityComposerSettingOption[];
|
|
96
|
+
/** Mirrors tuttid modelConfig.configurable; false when absent. */
|
|
97
|
+
modelConfigurable?: boolean;
|
|
98
|
+
/** Mirrors tuttid reasoningConfig.configurable; false when absent. */
|
|
99
|
+
reasoningConfigurable?: boolean;
|
|
96
100
|
permissionConfig?: AgentActivityComposerPermissionConfig | null;
|
|
97
101
|
runtimeContext?: Record<string, unknown>;
|
|
98
102
|
skills: AgentActivityComposerSkillOption[];
|
|
@@ -247,6 +251,15 @@ interface AgentActivityAdapter {
|
|
|
247
251
|
deleteSession(input: AgentActivityDeleteSessionInput): Promise<AgentActivityDeleteSessionResult>;
|
|
248
252
|
}
|
|
249
253
|
|
|
254
|
+
/** Mirror of packages/agent/daemon/runtime/capabilities.go. */
|
|
255
|
+
declare const AGENT_CAPABILITY_KEYS: readonly ["imageInput", "skills", "compact", "tokenUsage", "rateLimits", "planMode", "interrupt"];
|
|
256
|
+
type AgentCapabilityKey = (typeof AGENT_CAPABILITY_KEYS)[number];
|
|
257
|
+
interface AgentActivityCapabilityInput {
|
|
258
|
+
composerOptions?: AgentActivityComposerOptions | null;
|
|
259
|
+
sessionRuntimeContext?: Record<string, unknown> | null;
|
|
260
|
+
}
|
|
261
|
+
declare function resolveAgentActivityCapability(key: AgentCapabilityKey, input: AgentActivityCapabilityInput): boolean | null;
|
|
262
|
+
|
|
250
263
|
interface CreateAgentActivityControllerInput {
|
|
251
264
|
adapter: AgentActivityAdapter;
|
|
252
265
|
autoRetainSessionEvents?: boolean;
|
|
@@ -287,11 +300,6 @@ declare function compareAgentActivityMessages(left: AgentActivityMessage, right:
|
|
|
287
300
|
declare function latestAgentActivityMessageVersion(messages: readonly AgentActivityMessage[]): number;
|
|
288
301
|
declare function cloneAgentActivityMessage<T extends AgentActivityMessage = AgentActivityMessage>(message: T): T;
|
|
289
302
|
|
|
290
|
-
interface AgentActivityPromptImagesSupportInput {
|
|
291
|
-
composerOptions?: AgentActivityComposerOptions | null;
|
|
292
|
-
sessionRuntimeContext?: Record<string, unknown> | null;
|
|
293
|
-
}
|
|
294
|
-
declare function resolveAgentActivityPromptImagesSupported(input: AgentActivityPromptImagesSupportInput): boolean | null;
|
|
295
303
|
declare function selectNeedsAttentionCount(snapshot: AgentActivitySnapshot): number;
|
|
296
304
|
declare function selectSessionDisplayStatuses(snapshot: AgentActivitySnapshot): Map<string, AgentActivityDisplayStatus>;
|
|
297
305
|
declare function normalizeAgentActivityDisplayStatus(status: string | null | undefined, options?: {
|
|
@@ -300,4 +308,15 @@ declare function normalizeAgentActivityDisplayStatus(status: string | null | und
|
|
|
300
308
|
}): AgentActivityDisplayStatus;
|
|
301
309
|
declare function selectNeedsAttentionItems(snapshot: AgentActivitySnapshot): AgentActivityNeedsAttentionItem[];
|
|
302
310
|
|
|
303
|
-
|
|
311
|
+
interface AgentActivityUsage {
|
|
312
|
+
usedTokens: number | null;
|
|
313
|
+
totalTokens: number | null;
|
|
314
|
+
percentUsed: number | null;
|
|
315
|
+
quotas: Array<Record<string, unknown>>;
|
|
316
|
+
}
|
|
317
|
+
interface AgentActivityUsageInput {
|
|
318
|
+
sessionRuntimeContext?: Record<string, unknown> | null;
|
|
319
|
+
}
|
|
320
|
+
declare function resolveAgentActivityUsage(input: AgentActivityUsageInput): AgentActivityUsage | null;
|
|
321
|
+
|
|
322
|
+
export { AGENT_CAPABILITY_KEYS, type AgentActivityAdapter, type AgentActivityCancelReason, type AgentActivityCancelSessionInput, type AgentActivityCancelSessionResult, type AgentActivityCapabilityInput, type AgentActivityComposerOptions, type AgentActivityComposerPermissionConfig, type AgentActivityComposerPermissionModeOption, type AgentActivityComposerSettingOption, type AgentActivityComposerSettings, type AgentActivityComposerSkillOption, type AgentActivityController, type AgentActivityCreateSessionInput, type AgentActivityDeleteSessionInput, type AgentActivityDeleteSessionResult, type AgentActivityDisplayStatus, type AgentActivityLoadComposerOptionsInput, type AgentActivityMessage, type AgentActivityMessageOrder, type AgentActivityMessagePage, type AgentActivityNeedsAttentionItem, type AgentActivityNeedsAttentionKind, type AgentActivityPresence, type AgentActivitySendInput, type AgentActivitySession, type AgentActivitySessionEventEnvelope, type AgentActivitySessionList, type AgentActivitySessionStatus, type AgentActivitySnapshot, type AgentActivitySnapshotListener, type AgentActivityStatePatch, type AgentActivitySubmitInteractiveInput, type AgentActivityUpdatedApplyResult, type AgentActivityUpdatedEvent, type AgentActivityUsage, type AgentActivityUsageInput, type AgentCapabilityKey, type AgentPromptContentBlock, type CreateAgentActivityControllerInput, cloneAgentActivityMessage, cloneAgentActivitySnapshot, compareAgentActivityMessages, createAgentActivityController, createEmptyAgentActivitySnapshot, latestAgentActivityMessageVersion, mergeAgentActivityMessages, normalizeAgentActivityDisplayStatus, resolveAgentActivityCapability, resolveAgentActivityUsage, selectNeedsAttentionCount, selectNeedsAttentionItems, selectSessionDisplayStatuses };
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,24 @@
|
|
|
1
|
+
// src/capabilities.ts
|
|
2
|
+
var AGENT_CAPABILITY_KEYS = [
|
|
3
|
+
"imageInput",
|
|
4
|
+
"skills",
|
|
5
|
+
"compact",
|
|
6
|
+
"tokenUsage",
|
|
7
|
+
"rateLimits",
|
|
8
|
+
"planMode",
|
|
9
|
+
"interrupt"
|
|
10
|
+
];
|
|
11
|
+
function resolveAgentActivityCapability(key, input) {
|
|
12
|
+
return capabilityFromRuntimeContext(key, input.sessionRuntimeContext) ?? capabilityFromRuntimeContext(key, input.composerOptions?.runtimeContext);
|
|
13
|
+
}
|
|
14
|
+
function capabilityFromRuntimeContext(key, runtimeContext) {
|
|
15
|
+
const list = runtimeContext?.capabilities;
|
|
16
|
+
if (!Array.isArray(list)) {
|
|
17
|
+
return null;
|
|
18
|
+
}
|
|
19
|
+
return list.some((entry) => typeof entry === "string" && entry === key);
|
|
20
|
+
}
|
|
21
|
+
|
|
1
22
|
// src/merge.ts
|
|
2
23
|
function mergeAgentActivityMessages(currentMessages, incomingMessages) {
|
|
3
24
|
if (incomingMessages.length === 0) {
|
|
@@ -111,6 +132,9 @@ function createAgentActivityController({
|
|
|
111
132
|
const activeMessageSyncs = /* @__PURE__ */ new Map();
|
|
112
133
|
const activeComposerOptionsLoads = /* @__PURE__ */ new Map();
|
|
113
134
|
const composerOptionsLoadVersions = /* @__PURE__ */ new Map();
|
|
135
|
+
const composerOptionsCwdByProvider = /* @__PURE__ */ new Map();
|
|
136
|
+
const activeComposerOptionsLoadCwds = /* @__PURE__ */ new Map();
|
|
137
|
+
const normalizeComposerCwd = (cwd) => (cwd ?? "").trim();
|
|
114
138
|
const autoRetainedStreamReleases = /* @__PURE__ */ new Map();
|
|
115
139
|
const retainedStreams = /* @__PURE__ */ new Map();
|
|
116
140
|
let snapshot = createEmptyAgentActivitySnapshot(workspaceId);
|
|
@@ -142,14 +166,17 @@ function createAgentActivityController({
|
|
|
142
166
|
const nextSessions = response.sessions;
|
|
143
167
|
const nextPresences = response.presences ?? [];
|
|
144
168
|
const nextSnapshot = updateSnapshot((current) => {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
}
|
|
148
|
-
return {
|
|
169
|
+
const sessionDataUnchanged = areShallowObjectArraysEqual(current.sessions, nextSessions) && areShallowObjectArraysEqual(current.presences, nextPresences);
|
|
170
|
+
const source = sessionDataUnchanged ? current : {
|
|
149
171
|
...current,
|
|
150
172
|
presences: nextPresences,
|
|
151
173
|
sessions: nextSessions
|
|
152
174
|
};
|
|
175
|
+
const canonical = canonicalizeSnapshotMessageBuckets(source);
|
|
176
|
+
if (canonical !== source) {
|
|
177
|
+
return canonical;
|
|
178
|
+
}
|
|
179
|
+
return sessionDataUnchanged ? current : source;
|
|
153
180
|
});
|
|
154
181
|
if (autoRetainSessionEvents) {
|
|
155
182
|
reconcileAutoRetainedSessionStreams(nextSnapshot.sessions, signal);
|
|
@@ -161,14 +188,15 @@ function createAgentActivityController({
|
|
|
161
188
|
if (!provider) {
|
|
162
189
|
throw new Error("Agent composer options provider is required.");
|
|
163
190
|
}
|
|
191
|
+
const requestedCwd = normalizeComposerCwd(input.cwd);
|
|
164
192
|
if (!input.force) {
|
|
165
193
|
const cached = snapshot.composerOptionsByProvider?.[provider];
|
|
166
|
-
if (cached) {
|
|
194
|
+
if (cached && composerOptionsCwdByProvider.get(provider) === requestedCwd) {
|
|
167
195
|
return cloneAgentActivityComposerOptions(cached);
|
|
168
196
|
}
|
|
169
197
|
}
|
|
170
198
|
const existingLoad = activeComposerOptionsLoads.get(provider);
|
|
171
|
-
if (existingLoad && !input.force) {
|
|
199
|
+
if (existingLoad && !input.force && activeComposerOptionsLoadCwds.get(provider) === requestedCwd) {
|
|
172
200
|
return existingLoad.then(cloneAgentActivityComposerOptions);
|
|
173
201
|
}
|
|
174
202
|
const loadVersion = (composerOptionsLoadVersions.get(provider) ?? 0) + 1;
|
|
@@ -188,6 +216,7 @@ function createAgentActivityController({
|
|
|
188
216
|
if (composerOptionsLoadVersions.get(provider) !== loadVersion) {
|
|
189
217
|
return cloneAgentActivityComposerOptions(normalizedOptions);
|
|
190
218
|
}
|
|
219
|
+
composerOptionsCwdByProvider.set(provider, requestedCwd);
|
|
191
220
|
updateSnapshot((current) => {
|
|
192
221
|
const currentOptions = current.composerOptionsByProvider?.[provider];
|
|
193
222
|
if (currentOptions && areComposerOptionsEqual(currentOptions, normalizedOptions)) {
|
|
@@ -205,9 +234,11 @@ function createAgentActivityController({
|
|
|
205
234
|
}).finally(() => {
|
|
206
235
|
if (activeComposerOptionsLoads.get(provider) === load) {
|
|
207
236
|
activeComposerOptionsLoads.delete(provider);
|
|
237
|
+
activeComposerOptionsLoadCwds.delete(provider);
|
|
208
238
|
}
|
|
209
239
|
});
|
|
210
240
|
activeComposerOptionsLoads.set(provider, load);
|
|
241
|
+
activeComposerOptionsLoadCwds.set(provider, requestedCwd);
|
|
211
242
|
return load.then(cloneAgentActivityComposerOptions);
|
|
212
243
|
},
|
|
213
244
|
async listSessionMessages({
|
|
@@ -440,6 +471,8 @@ function cloneAgentActivityComposerOptions(options) {
|
|
|
440
471
|
reasoningEfforts: options.reasoningEfforts.map((option) => ({
|
|
441
472
|
...option
|
|
442
473
|
})),
|
|
474
|
+
modelConfigurable: options.modelConfigurable ?? false,
|
|
475
|
+
reasoningConfigurable: options.reasoningConfigurable ?? false,
|
|
443
476
|
permissionConfig: options.permissionConfig ? {
|
|
444
477
|
configurable: options.permissionConfig.configurable,
|
|
445
478
|
defaultValue: options.permissionConfig.defaultValue ?? null,
|
|
@@ -530,24 +563,39 @@ function applyActivityUpdatedMessages(snapshot, input) {
|
|
|
530
563
|
if (inlineMessages.length === 0) {
|
|
531
564
|
return emptyActivityUpdatedApplyResult(snapshot);
|
|
532
565
|
}
|
|
533
|
-
const
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
(
|
|
541
|
-
|
|
566
|
+
const messagesBySessionId = /* @__PURE__ */ new Map();
|
|
567
|
+
for (const message of inlineMessages) {
|
|
568
|
+
const targetSessionId = inlineMessageTargetAgentSessionId(
|
|
569
|
+
snapshot,
|
|
570
|
+
input.agentSessionId,
|
|
571
|
+
message
|
|
572
|
+
);
|
|
573
|
+
if (!targetSessionId) {
|
|
574
|
+
continue;
|
|
575
|
+
}
|
|
576
|
+
const activityMessage = agentActivityMessageFromInlineMessage({
|
|
577
|
+
agentSessionId: targetSessionId,
|
|
542
578
|
message,
|
|
543
579
|
workspaceId: input.workspaceId
|
|
544
|
-
})
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
)
|
|
580
|
+
});
|
|
581
|
+
messagesBySessionId.set(targetSessionId, [
|
|
582
|
+
...messagesBySessionId.get(targetSessionId) ?? [],
|
|
583
|
+
activityMessage
|
|
584
|
+
]);
|
|
585
|
+
}
|
|
586
|
+
if (messagesBySessionId.size === 0) {
|
|
587
|
+
return emptyActivityUpdatedApplyResult(snapshot);
|
|
588
|
+
}
|
|
589
|
+
let nextSnapshot = snapshot;
|
|
590
|
+
const messages = [];
|
|
591
|
+
for (const [agentSessionId, sessionMessages] of messagesBySessionId) {
|
|
592
|
+
nextSnapshot = mergeSnapshotMessages(
|
|
593
|
+
nextSnapshot,
|
|
594
|
+
agentSessionId,
|
|
595
|
+
sessionMessages
|
|
596
|
+
);
|
|
597
|
+
messages.push(...sessionMessages);
|
|
598
|
+
}
|
|
551
599
|
if (nextSnapshot === snapshot) {
|
|
552
600
|
return {
|
|
553
601
|
applied: true,
|
|
@@ -567,18 +615,35 @@ function applyActivityUpdatedMessages(snapshot, input) {
|
|
|
567
615
|
}
|
|
568
616
|
function applyActivityUpdatedStatePatch(snapshot, input) {
|
|
569
617
|
const statePatch = inlineStatePatchFromActivityUpdateData(input.data);
|
|
570
|
-
if (!statePatch
|
|
618
|
+
if (!statePatch) {
|
|
619
|
+
return emptyActivityUpdatedApplyResult(snapshot);
|
|
620
|
+
}
|
|
621
|
+
const canonicalEventSessionId = resolveCanonicalAgentSessionId(
|
|
622
|
+
snapshot,
|
|
623
|
+
input.agentSessionId,
|
|
624
|
+
statePatch.provider
|
|
625
|
+
);
|
|
626
|
+
const canonicalPatchSessionId = resolveCanonicalAgentSessionId(
|
|
627
|
+
snapshot,
|
|
628
|
+
statePatch.agentSessionId,
|
|
629
|
+
statePatch.provider
|
|
630
|
+
);
|
|
631
|
+
if (canonicalPatchSessionId !== canonicalEventSessionId) {
|
|
571
632
|
return emptyActivityUpdatedApplyResult(snapshot);
|
|
572
633
|
}
|
|
634
|
+
const canonicalStatePatch = {
|
|
635
|
+
...statePatch,
|
|
636
|
+
agentSessionId: canonicalPatchSessionId
|
|
637
|
+
};
|
|
573
638
|
const existingSession = snapshot.sessions.find(
|
|
574
|
-
(session2) => session2.agentSessionId ===
|
|
639
|
+
(session2) => session2.agentSessionId === canonicalPatchSessionId
|
|
575
640
|
) ?? null;
|
|
576
|
-
if (!existingSession || isStaleStatePatch(existingSession,
|
|
641
|
+
if (!existingSession || isStaleStatePatch(existingSession, canonicalStatePatch)) {
|
|
577
642
|
return emptyActivityUpdatedApplyResult(snapshot);
|
|
578
643
|
}
|
|
579
644
|
const session = agentActivitySessionFromInlineStatePatch({
|
|
580
645
|
existingSession,
|
|
581
|
-
patch:
|
|
646
|
+
patch: canonicalStatePatch,
|
|
582
647
|
workspaceId: input.workspaceId
|
|
583
648
|
});
|
|
584
649
|
return {
|
|
@@ -586,7 +651,7 @@ function applyActivityUpdatedStatePatch(snapshot, input) {
|
|
|
586
651
|
messages: [],
|
|
587
652
|
session,
|
|
588
653
|
snapshot: upsertSnapshotSession(snapshot, session),
|
|
589
|
-
statePatch
|
|
654
|
+
statePatch: canonicalStatePatch
|
|
590
655
|
};
|
|
591
656
|
}
|
|
592
657
|
function emptyActivityUpdatedApplyResult(snapshot) {
|
|
@@ -614,21 +679,54 @@ function applySessionEvent(snapshot, event) {
|
|
|
614
679
|
return snapshot;
|
|
615
680
|
}
|
|
616
681
|
function mergeSnapshotMessages(snapshot, agentSessionId, messages) {
|
|
617
|
-
const
|
|
618
|
-
|
|
682
|
+
const rawAgentSessionId = agentSessionId.trim();
|
|
683
|
+
const canonicalAgentSessionId = resolveCanonicalAgentSessionId(
|
|
684
|
+
snapshot,
|
|
685
|
+
rawAgentSessionId
|
|
686
|
+
);
|
|
687
|
+
if (!canonicalAgentSessionId || messages.length === 0) {
|
|
619
688
|
return snapshot;
|
|
620
689
|
}
|
|
621
|
-
const currentMessages = snapshot.sessionMessagesById[
|
|
622
|
-
const
|
|
690
|
+
const currentMessages = snapshot.sessionMessagesById[canonicalAgentSessionId] ?? [];
|
|
691
|
+
const aliasMessages = rawAgentSessionId && rawAgentSessionId !== canonicalAgentSessionId ? snapshot.sessionMessagesById[rawAgentSessionId] ?? [] : [];
|
|
692
|
+
const currentCanonicalMessages = aliasMessages.length > 0 ? mergeAgentActivityMessages(
|
|
693
|
+
currentMessages,
|
|
694
|
+
canonicalizeAgentActivityMessages(
|
|
695
|
+
aliasMessages,
|
|
696
|
+
canonicalAgentSessionId
|
|
697
|
+
)
|
|
698
|
+
) : currentMessages;
|
|
699
|
+
const canonicalMessages = canonicalizeAgentActivityMessages(
|
|
700
|
+
messages,
|
|
701
|
+
canonicalAgentSessionId
|
|
702
|
+
);
|
|
703
|
+
const mergedMessages = mergeAgentActivityMessages(
|
|
704
|
+
currentCanonicalMessages,
|
|
705
|
+
canonicalMessages
|
|
706
|
+
);
|
|
707
|
+
const hasAliasBucket = rawAgentSessionId !== "" && rawAgentSessionId !== canonicalAgentSessionId && Object.prototype.hasOwnProperty.call(
|
|
708
|
+
snapshot.sessionMessagesById,
|
|
709
|
+
rawAgentSessionId
|
|
710
|
+
);
|
|
623
711
|
if (areAgentActivityMessageArraysEqual(currentMessages, mergedMessages)) {
|
|
624
|
-
return
|
|
712
|
+
return hasAliasBucket ? {
|
|
713
|
+
...snapshot,
|
|
714
|
+
sessionMessagesById: deleteSessionMessageBucket(
|
|
715
|
+
snapshot.sessionMessagesById,
|
|
716
|
+
rawAgentSessionId
|
|
717
|
+
)
|
|
718
|
+
} : snapshot;
|
|
719
|
+
}
|
|
720
|
+
const sessionMessagesById = {
|
|
721
|
+
...snapshot.sessionMessagesById,
|
|
722
|
+
[canonicalAgentSessionId]: mergedMessages
|
|
723
|
+
};
|
|
724
|
+
if (hasAliasBucket) {
|
|
725
|
+
delete sessionMessagesById[rawAgentSessionId];
|
|
625
726
|
}
|
|
626
727
|
return {
|
|
627
728
|
...snapshot,
|
|
628
|
-
sessionMessagesById
|
|
629
|
-
...snapshot.sessionMessagesById,
|
|
630
|
-
[normalizedAgentSessionId]: mergedMessages
|
|
631
|
-
}
|
|
729
|
+
sessionMessagesById
|
|
632
730
|
};
|
|
633
731
|
}
|
|
634
732
|
function upsertSnapshotSession(snapshot, session) {
|
|
@@ -636,17 +734,17 @@ function upsertSnapshotSession(snapshot, session) {
|
|
|
636
734
|
(item) => item.agentSessionId === session.agentSessionId
|
|
637
735
|
);
|
|
638
736
|
if (index < 0) {
|
|
639
|
-
return {
|
|
737
|
+
return canonicalizeSnapshotMessageBuckets({
|
|
640
738
|
...snapshot,
|
|
641
739
|
sessions: [...snapshot.sessions, session]
|
|
642
|
-
};
|
|
740
|
+
});
|
|
643
741
|
}
|
|
644
742
|
const sessions = [...snapshot.sessions];
|
|
645
743
|
sessions[index] = session;
|
|
646
|
-
return {
|
|
744
|
+
return canonicalizeSnapshotMessageBuckets({
|
|
647
745
|
...snapshot,
|
|
648
746
|
sessions
|
|
649
|
-
};
|
|
747
|
+
});
|
|
650
748
|
}
|
|
651
749
|
function removeSnapshotSession(snapshot, agentSessionId) {
|
|
652
750
|
const normalizedAgentSessionId = agentSessionId.trim();
|
|
@@ -656,17 +754,136 @@ function removeSnapshotSession(snapshot, agentSessionId) {
|
|
|
656
754
|
const sessions = snapshot.sessions.filter(
|
|
657
755
|
(session) => session.agentSessionId !== normalizedAgentSessionId
|
|
658
756
|
);
|
|
659
|
-
|
|
757
|
+
const removedSession = snapshot.sessions.find(
|
|
758
|
+
(session) => session.agentSessionId === normalizedAgentSessionId
|
|
759
|
+
) ?? null;
|
|
760
|
+
const removableMessageBuckets = /* @__PURE__ */ new Set([normalizedAgentSessionId]);
|
|
761
|
+
if (removedSession) {
|
|
762
|
+
for (const alias of sessionMessageAliases(removedSession)) {
|
|
763
|
+
if (alias === normalizedAgentSessionId || resolveCanonicalAgentSessionId(
|
|
764
|
+
snapshot,
|
|
765
|
+
alias,
|
|
766
|
+
removedSession.provider
|
|
767
|
+
) === normalizedAgentSessionId) {
|
|
768
|
+
removableMessageBuckets.add(alias);
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
}
|
|
772
|
+
if (sessions.length === snapshot.sessions.length && [...removableMessageBuckets].every(
|
|
773
|
+
(bucket) => !snapshot.sessionMessagesById[bucket]
|
|
774
|
+
)) {
|
|
660
775
|
return snapshot;
|
|
661
776
|
}
|
|
662
777
|
const sessionMessagesById = { ...snapshot.sessionMessagesById };
|
|
663
|
-
|
|
778
|
+
for (const bucket of removableMessageBuckets) {
|
|
779
|
+
delete sessionMessagesById[bucket];
|
|
780
|
+
}
|
|
664
781
|
return {
|
|
665
782
|
...snapshot,
|
|
666
783
|
sessions,
|
|
667
784
|
sessionMessagesById
|
|
668
785
|
};
|
|
669
786
|
}
|
|
787
|
+
function canonicalizeSnapshotMessageBuckets(snapshot) {
|
|
788
|
+
let sessionMessagesById = snapshot.sessionMessagesById;
|
|
789
|
+
let changed = false;
|
|
790
|
+
for (const session of snapshot.sessions) {
|
|
791
|
+
const canonicalAgentSessionId = session.agentSessionId.trim();
|
|
792
|
+
if (!canonicalAgentSessionId) {
|
|
793
|
+
continue;
|
|
794
|
+
}
|
|
795
|
+
let mergedMessages = sessionMessagesById[canonicalAgentSessionId] ?? [];
|
|
796
|
+
for (const alias of sessionMessageAliases(session)) {
|
|
797
|
+
if (alias !== canonicalAgentSessionId && resolveCanonicalAgentSessionId(snapshot, alias, session.provider) !== canonicalAgentSessionId) {
|
|
798
|
+
continue;
|
|
799
|
+
}
|
|
800
|
+
const aliasMessages = sessionMessagesById[alias];
|
|
801
|
+
if (!aliasMessages) {
|
|
802
|
+
continue;
|
|
803
|
+
}
|
|
804
|
+
const canonicalMessages = canonicalizeAgentActivityMessages(
|
|
805
|
+
aliasMessages,
|
|
806
|
+
canonicalAgentSessionId
|
|
807
|
+
);
|
|
808
|
+
if (alias === canonicalAgentSessionId) {
|
|
809
|
+
if (!areAgentActivityMessageArraysEqual(aliasMessages, canonicalMessages)) {
|
|
810
|
+
sessionMessagesById = {
|
|
811
|
+
...sessionMessagesById,
|
|
812
|
+
[canonicalAgentSessionId]: canonicalMessages
|
|
813
|
+
};
|
|
814
|
+
mergedMessages = canonicalMessages;
|
|
815
|
+
changed = true;
|
|
816
|
+
}
|
|
817
|
+
continue;
|
|
818
|
+
}
|
|
819
|
+
mergedMessages = mergeAgentActivityMessages(
|
|
820
|
+
mergedMessages,
|
|
821
|
+
canonicalMessages
|
|
822
|
+
);
|
|
823
|
+
sessionMessagesById = deleteSessionMessageBucket(
|
|
824
|
+
sessionMessagesById,
|
|
825
|
+
alias
|
|
826
|
+
);
|
|
827
|
+
changed = true;
|
|
828
|
+
}
|
|
829
|
+
const currentMessages = sessionMessagesById[canonicalAgentSessionId] ?? [];
|
|
830
|
+
if (!areAgentActivityMessageArraysEqual(currentMessages, mergedMessages)) {
|
|
831
|
+
sessionMessagesById = {
|
|
832
|
+
...sessionMessagesById,
|
|
833
|
+
[canonicalAgentSessionId]: mergedMessages
|
|
834
|
+
};
|
|
835
|
+
changed = true;
|
|
836
|
+
}
|
|
837
|
+
}
|
|
838
|
+
return changed ? { ...snapshot, sessionMessagesById } : snapshot;
|
|
839
|
+
}
|
|
840
|
+
function resolveCanonicalAgentSessionId(snapshot, rawAgentSessionId, provider) {
|
|
841
|
+
const normalizedAgentSessionId = rawAgentSessionId?.trim() ?? "";
|
|
842
|
+
if (!normalizedAgentSessionId) {
|
|
843
|
+
return "";
|
|
844
|
+
}
|
|
845
|
+
const exactSession = snapshot.sessions.find(
|
|
846
|
+
(session) => session.agentSessionId.trim() === normalizedAgentSessionId
|
|
847
|
+
);
|
|
848
|
+
if (exactSession) {
|
|
849
|
+
return exactSession.agentSessionId.trim();
|
|
850
|
+
}
|
|
851
|
+
const normalizedProvider = provider?.trim() ?? "";
|
|
852
|
+
const candidates = snapshot.sessions.filter((session) => {
|
|
853
|
+
if (session.providerSessionId?.trim() !== normalizedAgentSessionId) {
|
|
854
|
+
return false;
|
|
855
|
+
}
|
|
856
|
+
return !normalizedProvider || session.provider.trim() === normalizedProvider;
|
|
857
|
+
});
|
|
858
|
+
return candidates.length === 1 ? candidates[0].agentSessionId.trim() : normalizedAgentSessionId;
|
|
859
|
+
}
|
|
860
|
+
function sessionMessageAliases(session) {
|
|
861
|
+
const values = [session.agentSessionId, session.providerSessionId];
|
|
862
|
+
const seen = /* @__PURE__ */ new Set();
|
|
863
|
+
const aliases = [];
|
|
864
|
+
for (const value of values) {
|
|
865
|
+
const normalized = value?.trim() ?? "";
|
|
866
|
+
if (!normalized || seen.has(normalized)) {
|
|
867
|
+
continue;
|
|
868
|
+
}
|
|
869
|
+
seen.add(normalized);
|
|
870
|
+
aliases.push(normalized);
|
|
871
|
+
}
|
|
872
|
+
return aliases;
|
|
873
|
+
}
|
|
874
|
+
function canonicalizeAgentActivityMessages(messages, agentSessionId) {
|
|
875
|
+
return messages.map(
|
|
876
|
+
(message) => message.agentSessionId === agentSessionId ? message : { ...message, agentSessionId }
|
|
877
|
+
);
|
|
878
|
+
}
|
|
879
|
+
function deleteSessionMessageBucket(sessionMessagesById, agentSessionId) {
|
|
880
|
+
if (!Object.prototype.hasOwnProperty.call(sessionMessagesById, agentSessionId)) {
|
|
881
|
+
return sessionMessagesById;
|
|
882
|
+
}
|
|
883
|
+
const next = { ...sessionMessagesById };
|
|
884
|
+
delete next[agentSessionId];
|
|
885
|
+
return next;
|
|
886
|
+
}
|
|
670
887
|
function shouldAutoRetainSessionEvents(session) {
|
|
671
888
|
if (!session.agentSessionId.trim()) {
|
|
672
889
|
return false;
|
|
@@ -739,14 +956,27 @@ function inlineMessagesFromActivityUpdateData(data) {
|
|
|
739
956
|
return record ? [record] : [];
|
|
740
957
|
});
|
|
741
958
|
}
|
|
742
|
-
function
|
|
959
|
+
function inlineMessageTargetAgentSessionId(snapshot, eventAgentSessionId, message) {
|
|
960
|
+
const canonicalEventSessionId = resolveCanonicalAgentSessionId(
|
|
961
|
+
snapshot,
|
|
962
|
+
eventAgentSessionId
|
|
963
|
+
);
|
|
964
|
+
if (!canonicalEventSessionId) {
|
|
965
|
+
return "";
|
|
966
|
+
}
|
|
743
967
|
const messageAgentSessionId = stringValue(message.agentSessionId);
|
|
744
|
-
return
|
|
968
|
+
return messageAgentSessionId === "" || resolveCanonicalAgentSessionId(snapshot, messageAgentSessionId) === canonicalEventSessionId ? canonicalEventSessionId : knownSessionIdentity(snapshot, eventAgentSessionId) ? "" : resolveCanonicalAgentSessionId(snapshot, messageAgentSessionId);
|
|
969
|
+
}
|
|
970
|
+
function knownSessionIdentity(snapshot, agentSessionId) {
|
|
971
|
+
const normalizedAgentSessionId = agentSessionId.trim();
|
|
972
|
+
return normalizedAgentSessionId !== "" && (snapshot.sessions.some(
|
|
973
|
+
(session) => session.agentSessionId.trim() === normalizedAgentSessionId
|
|
974
|
+
) || resolveCanonicalAgentSessionId(snapshot, normalizedAgentSessionId) !== normalizedAgentSessionId);
|
|
745
975
|
}
|
|
746
976
|
function agentActivityMessageFromInlineMessage(input) {
|
|
747
977
|
return {
|
|
748
978
|
workspaceId: stringValue(input.message.workspaceId) || input.workspaceId,
|
|
749
|
-
agentSessionId:
|
|
979
|
+
agentSessionId: input.agentSessionId,
|
|
750
980
|
messageId: stringValue(input.message.messageId),
|
|
751
981
|
id: numberValue(input.message.id),
|
|
752
982
|
version: numberValue(input.message.version) ?? 0,
|
|
@@ -847,11 +1077,6 @@ var terminalMessageStatuses = /* @__PURE__ */ new Set([
|
|
|
847
1077
|
"answered",
|
|
848
1078
|
"resolved"
|
|
849
1079
|
]);
|
|
850
|
-
function resolveAgentActivityPromptImagesSupported(input) {
|
|
851
|
-
return promptImagesSupportedFromRuntimeContext(input.sessionRuntimeContext) ?? promptImagesSupportedFromRuntimeContext(
|
|
852
|
-
input.composerOptions?.runtimeContext
|
|
853
|
-
);
|
|
854
|
-
}
|
|
855
1080
|
function selectNeedsAttentionCount(snapshot) {
|
|
856
1081
|
return selectNeedsAttentionItems(snapshot).length;
|
|
857
1082
|
}
|
|
@@ -1046,27 +1271,38 @@ function includesAny(value, needles) {
|
|
|
1046
1271
|
function stringValue2(value) {
|
|
1047
1272
|
return typeof value === "string" ? value.trim() : "";
|
|
1048
1273
|
}
|
|
1049
|
-
|
|
1050
|
-
|
|
1051
|
-
|
|
1052
|
-
|
|
1053
|
-
|
|
1274
|
+
|
|
1275
|
+
// src/usage.ts
|
|
1276
|
+
function resolveAgentActivityUsage(input) {
|
|
1277
|
+
const usage = recordValue3(input.sessionRuntimeContext?.usage);
|
|
1278
|
+
if (!usage) {
|
|
1279
|
+
return null;
|
|
1054
1280
|
}
|
|
1055
|
-
|
|
1056
|
-
|
|
1057
|
-
|
|
1058
|
-
|
|
1059
|
-
|
|
1060
|
-
|
|
1061
|
-
|
|
1062
|
-
|
|
1281
|
+
const contextWindow = recordValue3(usage.contextWindow);
|
|
1282
|
+
const usedTokens = finiteNumber(contextWindow?.usedTokens);
|
|
1283
|
+
const totalTokens = finiteNumber(contextWindow?.totalTokens);
|
|
1284
|
+
const quotas = Array.isArray(usage.quotas) ? usage.quotas.filter(
|
|
1285
|
+
(entry) => typeof entry === "object" && entry !== null
|
|
1286
|
+
) : [];
|
|
1287
|
+
const hasWindow = usedTokens !== null && totalTokens !== null && totalTokens > 0;
|
|
1288
|
+
if (!hasWindow && quotas.length === 0) {
|
|
1289
|
+
return null;
|
|
1063
1290
|
}
|
|
1064
|
-
return
|
|
1291
|
+
return {
|
|
1292
|
+
usedTokens: hasWindow ? usedTokens : null,
|
|
1293
|
+
totalTokens: hasWindow ? totalTokens : null,
|
|
1294
|
+
percentUsed: hasWindow ? Math.min(100, Math.round(usedTokens / totalTokens * 100)) : null,
|
|
1295
|
+
quotas
|
|
1296
|
+
};
|
|
1065
1297
|
}
|
|
1066
1298
|
function recordValue3(value) {
|
|
1067
1299
|
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
|
|
1068
1300
|
}
|
|
1301
|
+
function finiteNumber(value) {
|
|
1302
|
+
return typeof value === "number" && Number.isFinite(value) ? value : null;
|
|
1303
|
+
}
|
|
1069
1304
|
export {
|
|
1305
|
+
AGENT_CAPABILITY_KEYS,
|
|
1070
1306
|
cloneAgentActivityMessage,
|
|
1071
1307
|
cloneAgentActivitySnapshot,
|
|
1072
1308
|
compareAgentActivityMessages,
|
|
@@ -1075,7 +1311,8 @@ export {
|
|
|
1075
1311
|
latestAgentActivityMessageVersion,
|
|
1076
1312
|
mergeAgentActivityMessages,
|
|
1077
1313
|
normalizeAgentActivityDisplayStatus,
|
|
1078
|
-
|
|
1314
|
+
resolveAgentActivityCapability,
|
|
1315
|
+
resolveAgentActivityUsage,
|
|
1079
1316
|
selectNeedsAttentionCount,
|
|
1080
1317
|
selectNeedsAttentionItems,
|
|
1081
1318
|
selectSessionDisplayStatuses
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/merge.ts","../src/controller.ts","../src/selectors.ts"],"sourcesContent":["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 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 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 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","import type { AgentActivityAdapter } from \"./adapter.ts\";\nimport {\n areAgentActivityMessageArraysEqual,\n cloneAgentActivityMessage,\n latestAgentActivityMessageVersion,\n mergeAgentActivityMessages\n} from \"./merge.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 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 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 if (\n areShallowObjectArraysEqual(current.sessions, nextSessions) &&\n areShallowObjectArraysEqual(current.presences, nextPresences)\n ) {\n return current;\n }\n return {\n ...current,\n presences: nextPresences,\n sessions: nextSessions\n };\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 if (!input.force) {\n const cached = snapshot.composerOptionsByProvider?.[provider];\n if (cached) {\n return cloneAgentActivityComposerOptions(cached);\n }\n }\n const existingLoad = activeComposerOptionsLoads.get(provider);\n if (existingLoad && !input.force) {\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 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 }\n });\n activeComposerOptionsLoads.set(provider, load);\n return load.then(cloneAgentActivityComposerOptions);\n },\n async listSessionMessages({\n agentSessionId,\n afterVersion,\n beforeVersion,\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 updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, response.messages)\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 ? { ...result.session } : 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 = adapter\n .listSessionMessages({\n workspaceId,\n agentSessionId,\n afterVersion,\n signal\n })\n .then((response) => {\n if (signal?.aborted) {\n return;\n }\n updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, response.messages)\n );\n })\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((session) => ({ ...session })),\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 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 loadedAtUnixMs: options.loadedAtUnixMs\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 sessionMessages = inlineMessages.filter((message) =>\n inlineMessageBelongsToSession(message, input.agentSessionId)\n );\n if (sessionMessages.length === 0) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const messages = sessionMessages.map((message) =>\n agentActivityMessageFromInlineMessage({\n agentSessionId: input.agentSessionId,\n message,\n workspaceId: input.workspaceId\n })\n );\n const nextSnapshot = mergeSnapshotMessages(\n snapshot,\n input.agentSessionId,\n messages\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 || statePatch.agentSessionId !== input.agentSessionId) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const existingSession =\n snapshot.sessions.find(\n (session) => session.agentSessionId === input.agentSessionId\n ) ?? null;\n if (!existingSession || isStaleStatePatch(existingSession, statePatch)) {\n return emptyActivityUpdatedApplyResult(snapshot);\n }\n const session = agentActivitySessionFromInlineStatePatch({\n existingSession,\n patch: statePatch,\n workspaceId: input.workspaceId\n });\n return {\n applied: true,\n messages: [],\n session,\n snapshot: upsertSnapshotSession(snapshot, session),\n statePatch\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 normalizedAgentSessionId = agentSessionId.trim();\n if (!normalizedAgentSessionId || messages.length === 0) {\n return snapshot;\n }\n const currentMessages =\n snapshot.sessionMessagesById[normalizedAgentSessionId] ?? [];\n const mergedMessages = mergeAgentActivityMessages(currentMessages, messages);\n if (areAgentActivityMessageArraysEqual(currentMessages, mergedMessages)) {\n return snapshot;\n }\n return {\n ...snapshot,\n sessionMessagesById: {\n ...snapshot.sessionMessagesById,\n [normalizedAgentSessionId]: mergedMessages\n }\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 {\n ...snapshot,\n sessions: [...snapshot.sessions, session]\n };\n }\n const sessions = [...snapshot.sessions];\n sessions[index] = session;\n return {\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 if (\n sessions.length === snapshot.sessions.length &&\n !snapshot.sessionMessagesById[normalizedAgentSessionId]\n ) {\n return snapshot;\n }\n const sessionMessagesById = { ...snapshot.sessionMessagesById };\n delete sessionMessagesById[normalizedAgentSessionId];\n return {\n ...snapshot,\n sessions,\n sessionMessagesById\n };\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 if (!agentSessionId || !messageId || !role || !kind) {\n return null;\n }\n return {\n workspaceId: stringValue(source.workspaceId) || event.workspaceId,\n agentSessionId,\n messageId,\n id: numberValue(source.id),\n version: numberValue(source.version) ?? 0,\n turnId: nullableStringValue(source.turnId),\n role,\n kind,\n status: nullableStringValue(source.status),\n payload: recordValue(source.payload) ?? {},\n occurredAtUnixMs: numberValue(source.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 resumable: booleanValue(source.resumable),\n currentPhase: nullableStringValue(source.currentPhase),\n lastError: nullableStringValue(source.lastError),\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 inlineMessageBelongsToSession(\n message: Record<string, unknown>,\n agentSessionId: string\n): boolean {\n const messageAgentSessionId = stringValue(message.agentSessionId);\n return !messageAgentSessionId || messageAgentSessionId === agentSessionId;\n}\n\nfunction agentActivityMessageFromInlineMessage(input: {\n agentSessionId: string;\n message: Record<string, unknown>;\n workspaceId: string;\n}): AgentActivityMessage {\n return {\n workspaceId: stringValue(input.message.workspaceId) || input.workspaceId,\n agentSessionId:\n stringValue(input.message.agentSessionId) || input.agentSessionId,\n messageId: stringValue(input.message.messageId),\n id: numberValue(input.message.id),\n version: numberValue(input.message.version) ?? 0,\n turnId: nullableStringValue(input.message.turnId),\n role: stringValue(input.message.role),\n kind: stringValue(input.message.kind),\n status: nullableStringValue(input.message.status),\n payload: recordValue(input.message.payload) ?? {},\n occurredAtUnixMs: numberValue(input.message.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 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 startedAtUnixMs: numberValue(source.startedAtUnixMs),\n endedAtUnixMs: numberValue(source.endedAtUnixMs),\n title: stringValue(source.title) || undefined,\n turn: turn\n ? {\n completedAtUnixMs: numberValue(turn.completedAtUnixMs),\n fileChanges: turn.fileChanges,\n outcome: stringValue(turn.outcome) || undefined,\n phase: stringValue(turn.phase) || undefined,\n startedAtUnixMs: numberValue(turn.startedAtUnixMs),\n turnId: stringValue(turn.turnId)\n }\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 currentPhase:\n input.patch.currentPhase ??\n input.patch.turn?.phase ??\n input.existingSession.currentPhase,\n lastError: input.patch.lastError ?? input.existingSession.lastError,\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 turn: statePatch.turn ? { ...statePatch.turn } : undefined\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 booleanValue(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n","import type {\n AgentActivityDisplayStatus,\n AgentActivityComposerOptions,\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 interface AgentActivityPromptImagesSupportInput {\n composerOptions?: AgentActivityComposerOptions | null;\n sessionRuntimeContext?: Record<string, unknown> | null;\n}\n\nexport function resolveAgentActivityPromptImagesSupported(\n input: AgentActivityPromptImagesSupportInput\n): boolean | null {\n return (\n promptImagesSupportedFromRuntimeContext(input.sessionRuntimeContext) ??\n promptImagesSupportedFromRuntimeContext(\n input.composerOptions?.runtimeContext\n )\n );\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 session.agentSessionId,\n normalizeAgentActivityDisplayStatus(session.status, {\n currentPhase: session.currentPhase,\n needsAttention: needsAttentionSessionIds.has(session.agentSessionId)\n })\n ])\n );\n}\n\nexport function normalizeAgentActivityDisplayStatus(\n status: string | null | undefined,\n options: {\n currentPhase?: string | null;\n needsAttention?: boolean;\n } = {}\n): AgentActivityDisplayStatus {\n if (options.needsAttention) {\n return \"waiting\";\n }\n const normalizedStatus = normalizeStatus(status);\n const normalizedCurrentPhase = normalizeStatus(options.currentPhase);\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.summary) ||\n stringValue(message.payload.title) ||\n stringValue(message.payload.content) ||\n stringValue(message.payload.text) ||\n message.kind\n );\n}\n\nfunction isTerminalMessageStatus(status: string | null | undefined): boolean {\n return terminalMessageStatuses.has(normalizeStatus(status));\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\nfunction promptImagesSupportedFromRuntimeContext(\n runtimeContext: Record<string, unknown> | null | undefined\n): boolean | null {\n const promptCapabilities = recordValue(runtimeContext?.promptCapabilities);\n const value = promptCapabilities?.image;\n if (typeof value === \"boolean\") {\n return value;\n }\n if (typeof value === \"string\") {\n const normalized = value.trim().toLowerCase();\n if (normalized === \"true\") {\n return true;\n }\n if (normalized === \"false\") {\n return false;\n }\n }\n return null;\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"],"mappings":"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","names":["session","recordValue","stringValue","recordValue"]}
|
|
1
|
+
{"version":3,"sources":["../src/capabilities.ts","../src/merge.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] 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 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 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 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","import type { AgentActivityAdapter } from \"./adapter.ts\";\nimport {\n areAgentActivityMessageArraysEqual,\n cloneAgentActivityMessage,\n latestAgentActivityMessageVersion,\n mergeAgentActivityMessages\n} from \"./merge.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 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 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 updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, response.messages)\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 ? { ...result.session } : 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 = adapter\n .listSessionMessages({\n workspaceId,\n agentSessionId,\n afterVersion,\n signal\n })\n .then((response) => {\n if (signal?.aborted) {\n return;\n }\n updateSnapshot((current) =>\n mergeSnapshotMessages(current, agentSessionId, response.messages)\n );\n })\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((session) => ({ ...session })),\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 modelConfigurable: options.modelConfigurable ?? false,\n reasoningConfigurable: options.reasoningConfigurable ?? 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 loadedAtUnixMs: options.loadedAtUnixMs\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 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 if (!agentSessionId || !messageId || !role || !kind) {\n return null;\n }\n return {\n workspaceId: stringValue(source.workspaceId) || event.workspaceId,\n agentSessionId,\n messageId,\n id: numberValue(source.id),\n version: numberValue(source.version) ?? 0,\n turnId: nullableStringValue(source.turnId),\n role,\n kind,\n status: nullableStringValue(source.status),\n payload: recordValue(source.payload) ?? {},\n occurredAtUnixMs: numberValue(source.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 resumable: booleanValue(source.resumable),\n currentPhase: nullableStringValue(source.currentPhase),\n lastError: nullableStringValue(source.lastError),\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 {\n return {\n workspaceId: stringValue(input.message.workspaceId) || input.workspaceId,\n agentSessionId: input.agentSessionId,\n messageId: stringValue(input.message.messageId),\n id: numberValue(input.message.id),\n version: numberValue(input.message.version) ?? 0,\n turnId: nullableStringValue(input.message.turnId),\n role: stringValue(input.message.role),\n kind: stringValue(input.message.kind),\n status: nullableStringValue(input.message.status),\n payload: recordValue(input.message.payload) ?? {},\n occurredAtUnixMs: numberValue(input.message.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 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 startedAtUnixMs: numberValue(source.startedAtUnixMs),\n endedAtUnixMs: numberValue(source.endedAtUnixMs),\n title: stringValue(source.title) || undefined,\n turn: turn\n ? {\n completedAtUnixMs: numberValue(turn.completedAtUnixMs),\n fileChanges: turn.fileChanges,\n outcome: stringValue(turn.outcome) || undefined,\n phase: stringValue(turn.phase) || undefined,\n startedAtUnixMs: numberValue(turn.startedAtUnixMs),\n turnId: stringValue(turn.turnId)\n }\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 currentPhase:\n input.patch.currentPhase ??\n input.patch.turn?.phase ??\n input.existingSession.currentPhase,\n lastError: input.patch.lastError ?? input.existingSession.lastError,\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 turn: statePatch.turn ? { ...statePatch.turn } : undefined\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 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 session.agentSessionId,\n normalizeAgentActivityDisplayStatus(session.status, {\n currentPhase: session.currentPhase,\n needsAttention: needsAttentionSessionIds.has(session.agentSessionId)\n })\n ])\n );\n}\n\nexport function normalizeAgentActivityDisplayStatus(\n status: string | null | undefined,\n options: {\n currentPhase?: string | null;\n needsAttention?: boolean;\n } = {}\n): AgentActivityDisplayStatus {\n if (options.needsAttention) {\n return \"waiting\";\n }\n const normalizedStatus = normalizeStatus(status);\n const normalizedCurrentPhase = normalizeStatus(options.currentPhase);\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.summary) ||\n stringValue(message.payload.title) ||\n stringValue(message.payload.content) ||\n stringValue(message.payload.text) ||\n message.kind\n );\n}\n\nfunction isTerminalMessageStatus(status: string | null | undefined): boolean {\n return terminalMessageStatuses.has(normalizeStatus(status));\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"]}
|