@tutti-os/agent-activity-core 0.0.10 → 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 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
- export { type AgentActivityAdapter, type AgentActivityCancelReason, type AgentActivityCancelSessionInput, type AgentActivityCancelSessionResult, 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 AgentActivityPromptImagesSupportInput, type AgentActivitySendInput, type AgentActivitySession, type AgentActivitySessionEventEnvelope, type AgentActivitySessionList, type AgentActivitySessionStatus, type AgentActivitySnapshot, type AgentActivitySnapshotListener, type AgentActivityStatePatch, type AgentActivitySubmitInteractiveInput, type AgentActivityUpdatedApplyResult, type AgentActivityUpdatedEvent, type AgentPromptContentBlock, type CreateAgentActivityControllerInput, cloneAgentActivityMessage, cloneAgentActivitySnapshot, compareAgentActivityMessages, createAgentActivityController, createEmptyAgentActivitySnapshot, latestAgentActivityMessageVersion, mergeAgentActivityMessages, normalizeAgentActivityDisplayStatus, resolveAgentActivityPromptImagesSupported, selectNeedsAttentionCount, selectNeedsAttentionItems, selectSessionDisplayStatuses };
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
- if (areShallowObjectArraysEqual(current.sessions, nextSessions) && areShallowObjectArraysEqual(current.presences, nextPresences)) {
146
- return current;
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 sessionMessages = inlineMessages.filter(
534
- (message) => inlineMessageBelongsToSession(message, input.agentSessionId)
535
- );
536
- if (sessionMessages.length === 0) {
537
- return emptyActivityUpdatedApplyResult(snapshot);
538
- }
539
- const messages = sessionMessages.map(
540
- (message) => agentActivityMessageFromInlineMessage({
541
- agentSessionId: input.agentSessionId,
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
- const nextSnapshot = mergeSnapshotMessages(
547
- snapshot,
548
- input.agentSessionId,
549
- messages
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 || statePatch.agentSessionId !== input.agentSessionId) {
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 === input.agentSessionId
639
+ (session2) => session2.agentSessionId === canonicalPatchSessionId
575
640
  ) ?? null;
576
- if (!existingSession || isStaleStatePatch(existingSession, statePatch)) {
641
+ if (!existingSession || isStaleStatePatch(existingSession, canonicalStatePatch)) {
577
642
  return emptyActivityUpdatedApplyResult(snapshot);
578
643
  }
579
644
  const session = agentActivitySessionFromInlineStatePatch({
580
645
  existingSession,
581
- patch: statePatch,
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 normalizedAgentSessionId = agentSessionId.trim();
618
- if (!normalizedAgentSessionId || messages.length === 0) {
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[normalizedAgentSessionId] ?? [];
622
- const mergedMessages = mergeAgentActivityMessages(currentMessages, messages);
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 snapshot;
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
- if (sessions.length === snapshot.sessions.length && !snapshot.sessionMessagesById[normalizedAgentSessionId]) {
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
- delete sessionMessagesById[normalizedAgentSessionId];
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 inlineMessageBelongsToSession(message, agentSessionId) {
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 !messageAgentSessionId || messageAgentSessionId === agentSessionId;
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: stringValue(input.message.agentSessionId) || input.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
- function promptImagesSupportedFromRuntimeContext(runtimeContext) {
1050
- const promptCapabilities = recordValue3(runtimeContext?.promptCapabilities);
1051
- const value = promptCapabilities?.image;
1052
- if (typeof value === "boolean") {
1053
- return value;
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
- if (typeof value === "string") {
1056
- const normalized = value.trim().toLowerCase();
1057
- if (normalized === "true") {
1058
- return true;
1059
- }
1060
- if (normalized === "false") {
1061
- return false;
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 null;
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
- resolveAgentActivityPromptImagesSupported,
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"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tutti-os/agent-activity-core",
3
- "version": "0.0.10",
3
+ "version": "0.0.11",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "types": "./dist/index.d.ts",