@a5c-ai/comm-adapter 5.1.1-staging.0007199a1cb2

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.
Files changed (267) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +99 -0
  3. package/dist/adapter-registry.d.ts +51 -0
  4. package/dist/adapter-registry.d.ts.map +1 -0
  5. package/dist/adapter-registry.js +208 -0
  6. package/dist/adapter-registry.js.map +1 -0
  7. package/dist/adapter-types.d.ts +164 -0
  8. package/dist/adapter-types.d.ts.map +1 -0
  9. package/dist/adapter-types.js +27 -0
  10. package/dist/adapter-types.js.map +1 -0
  11. package/dist/adapter.d.ts +248 -0
  12. package/dist/adapter.d.ts.map +1 -0
  13. package/dist/adapter.js +18 -0
  14. package/dist/adapter.js.map +1 -0
  15. package/dist/atomic-fs.d.ts +33 -0
  16. package/dist/atomic-fs.d.ts.map +1 -0
  17. package/dist/atomic-fs.js +190 -0
  18. package/dist/atomic-fs.js.map +1 -0
  19. package/dist/auth-manager.d.ts +37 -0
  20. package/dist/auth-manager.d.ts.map +1 -0
  21. package/dist/auth-manager.js +94 -0
  22. package/dist/auth-manager.js.map +1 -0
  23. package/dist/auth-types.d.ts +83 -0
  24. package/dist/auth-types.d.ts.map +1 -0
  25. package/dist/auth-types.js +10 -0
  26. package/dist/auth-types.js.map +1 -0
  27. package/dist/automation.d.ts +104 -0
  28. package/dist/automation.d.ts.map +1 -0
  29. package/dist/automation.js +2 -0
  30. package/dist/automation.js.map +1 -0
  31. package/dist/browser.d.ts +5 -0
  32. package/dist/browser.d.ts.map +1 -0
  33. package/dist/browser.js +2 -0
  34. package/dist/browser.js.map +1 -0
  35. package/dist/builtin-hooks.d.ts +24 -0
  36. package/dist/builtin-hooks.d.ts.map +1 -0
  37. package/dist/builtin-hooks.js +80 -0
  38. package/dist/builtin-hooks.js.map +1 -0
  39. package/dist/capabilities.d.ts +251 -0
  40. package/dist/capabilities.d.ts.map +1 -0
  41. package/dist/capabilities.js +7 -0
  42. package/dist/capabilities.js.map +1 -0
  43. package/dist/client.d.ts +118 -0
  44. package/dist/client.d.ts.map +1 -0
  45. package/dist/client.js +317 -0
  46. package/dist/client.js.map +1 -0
  47. package/dist/config-manager.d.ts +85 -0
  48. package/dist/config-manager.d.ts.map +1 -0
  49. package/dist/config-manager.js +202 -0
  50. package/dist/config-manager.js.map +1 -0
  51. package/dist/config-types.d.ts +134 -0
  52. package/dist/config-types.d.ts.map +1 -0
  53. package/dist/config-types.js +10 -0
  54. package/dist/config-types.js.map +1 -0
  55. package/dist/cost-utils.d.ts +31 -0
  56. package/dist/cost-utils.d.ts.map +1 -0
  57. package/dist/cost-utils.js +69 -0
  58. package/dist/cost-utils.js.map +1 -0
  59. package/dist/errors.d.ts +50 -0
  60. package/dist/errors.d.ts.map +1 -0
  61. package/dist/errors.js +85 -0
  62. package/dist/errors.js.map +1 -0
  63. package/dist/events-control.d.ts +91 -0
  64. package/dist/events-control.d.ts.map +1 -0
  65. package/dist/events-control.js +8 -0
  66. package/dist/events-control.js.map +1 -0
  67. package/dist/events.d.ts +285 -0
  68. package/dist/events.d.ts.map +1 -0
  69. package/dist/events.js +8 -0
  70. package/dist/events.js.map +1 -0
  71. package/dist/hook-catalog.d.ts +20 -0
  72. package/dist/hook-catalog.d.ts.map +1 -0
  73. package/dist/hook-catalog.js +81 -0
  74. package/dist/hook-catalog.js.map +1 -0
  75. package/dist/hook-dispatcher.d.ts +24 -0
  76. package/dist/hook-dispatcher.d.ts.map +1 -0
  77. package/dist/hook-dispatcher.js +91 -0
  78. package/dist/hook-dispatcher.js.map +1 -0
  79. package/dist/hook-payload.d.ts +24 -0
  80. package/dist/hook-payload.d.ts.map +1 -0
  81. package/dist/hook-payload.js +62 -0
  82. package/dist/hook-payload.js.map +1 -0
  83. package/dist/hooks.d.ts +59 -0
  84. package/dist/hooks.d.ts.map +1 -0
  85. package/dist/hooks.js +118 -0
  86. package/dist/hooks.js.map +1 -0
  87. package/dist/host-detection.d.ts +67 -0
  88. package/dist/host-detection.d.ts.map +1 -0
  89. package/dist/host-detection.js +147 -0
  90. package/dist/host-detection.js.map +1 -0
  91. package/dist/index.d.ts +90 -0
  92. package/dist/index.d.ts.map +1 -0
  93. package/dist/index.js +51 -0
  94. package/dist/index.js.map +1 -0
  95. package/dist/interaction-channel-impl.d.ts +56 -0
  96. package/dist/interaction-channel-impl.d.ts.map +1 -0
  97. package/dist/interaction-channel-impl.js +159 -0
  98. package/dist/interaction-channel-impl.js.map +1 -0
  99. package/dist/interaction.d.ts +93 -0
  100. package/dist/interaction.d.ts.map +1 -0
  101. package/dist/interaction.js +8 -0
  102. package/dist/interaction.js.map +1 -0
  103. package/dist/invocation.d.ts +100 -0
  104. package/dist/invocation.d.ts.map +1 -0
  105. package/dist/invocation.js +17 -0
  106. package/dist/invocation.js.map +1 -0
  107. package/dist/kanban.d.ts +894 -0
  108. package/dist/kanban.d.ts.map +1 -0
  109. package/dist/kanban.js +1153 -0
  110. package/dist/kanban.js.map +1 -0
  111. package/dist/merge.d.ts +37 -0
  112. package/dist/merge.d.ts.map +1 -0
  113. package/dist/merge.js +102 -0
  114. package/dist/merge.js.map +1 -0
  115. package/dist/model-registry.d.ts +61 -0
  116. package/dist/model-registry.d.ts.map +1 -0
  117. package/dist/model-registry.js +198 -0
  118. package/dist/model-registry.js.map +1 -0
  119. package/dist/plugin-manager-impl.d.ts +48 -0
  120. package/dist/plugin-manager-impl.d.ts.map +1 -0
  121. package/dist/plugin-manager-impl.js +343 -0
  122. package/dist/plugin-manager-impl.js.map +1 -0
  123. package/dist/plugin-manager.d.ts +81 -0
  124. package/dist/plugin-manager.d.ts.map +1 -0
  125. package/dist/plugin-manager.js +7 -0
  126. package/dist/plugin-manager.js.map +1 -0
  127. package/dist/plugin-types.d.ts +114 -0
  128. package/dist/plugin-types.d.ts.map +1 -0
  129. package/dist/plugin-types.js +7 -0
  130. package/dist/plugin-types.js.map +1 -0
  131. package/dist/process-tracker.d.ts +20 -0
  132. package/dist/process-tracker.d.ts.map +1 -0
  133. package/dist/process-tracker.js +96 -0
  134. package/dist/process-tracker.js.map +1 -0
  135. package/dist/profiles.d.ts +99 -0
  136. package/dist/profiles.d.ts.map +1 -0
  137. package/dist/profiles.js +231 -0
  138. package/dist/profiles.js.map +1 -0
  139. package/dist/programmatic-runner.d.ts +4 -0
  140. package/dist/programmatic-runner.d.ts.map +1 -0
  141. package/dist/programmatic-runner.js +110 -0
  142. package/dist/programmatic-runner.js.map +1 -0
  143. package/dist/provider-config.d.ts +40 -0
  144. package/dist/provider-config.d.ts.map +1 -0
  145. package/dist/provider-config.js +67 -0
  146. package/dist/provider-config.js.map +1 -0
  147. package/dist/provider-profiles.d.ts +47 -0
  148. package/dist/provider-profiles.d.ts.map +1 -0
  149. package/dist/provider-profiles.js +117 -0
  150. package/dist/provider-profiles.js.map +1 -0
  151. package/dist/provider-resolver.d.ts +15 -0
  152. package/dist/provider-resolver.d.ts.map +1 -0
  153. package/dist/provider-resolver.js +119 -0
  154. package/dist/provider-resolver.js.map +1 -0
  155. package/dist/provider-support-matrix.d.ts +12 -0
  156. package/dist/provider-support-matrix.d.ts.map +1 -0
  157. package/dist/provider-support-matrix.js +88 -0
  158. package/dist/provider-support-matrix.js.map +1 -0
  159. package/dist/remote-runner.d.ts +4 -0
  160. package/dist/remote-runner.d.ts.map +1 -0
  161. package/dist/remote-runner.js +114 -0
  162. package/dist/remote-runner.js.map +1 -0
  163. package/dist/retry.d.ts +13 -0
  164. package/dist/retry.d.ts.map +1 -0
  165. package/dist/retry.js +17 -0
  166. package/dist/retry.js.map +1 -0
  167. package/dist/run-handle-cost.d.ts +36 -0
  168. package/dist/run-handle-cost.d.ts.map +1 -0
  169. package/dist/run-handle-cost.js +62 -0
  170. package/dist/run-handle-cost.js.map +1 -0
  171. package/dist/run-handle-impl.d.ts +144 -0
  172. package/dist/run-handle-impl.d.ts.map +1 -0
  173. package/dist/run-handle-impl.js +695 -0
  174. package/dist/run-handle-impl.js.map +1 -0
  175. package/dist/run-handle.d.ts +222 -0
  176. package/dist/run-handle.d.ts.map +1 -0
  177. package/dist/run-handle.js +9 -0
  178. package/dist/run-handle.js.map +1 -0
  179. package/dist/run-options-validation.d.ts +23 -0
  180. package/dist/run-options-validation.d.ts.map +1 -0
  181. package/dist/run-options-validation.js +234 -0
  182. package/dist/run-options-validation.js.map +1 -0
  183. package/dist/run-options.d.ts +128 -0
  184. package/dist/run-options.d.ts.map +1 -0
  185. package/dist/run-options.js +329 -0
  186. package/dist/run-options.js.map +1 -0
  187. package/dist/runtime-hook-dispatcher.d.ts +19 -0
  188. package/dist/runtime-hook-dispatcher.d.ts.map +1 -0
  189. package/dist/runtime-hook-dispatcher.js +50 -0
  190. package/dist/runtime-hook-dispatcher.js.map +1 -0
  191. package/dist/runtime-hooks.d.ts +67 -0
  192. package/dist/runtime-hooks.d.ts.map +1 -0
  193. package/dist/runtime-hooks.js +2 -0
  194. package/dist/runtime-hooks.js.map +1 -0
  195. package/dist/schema/__tests__/event-schema.test.d.ts +1 -0
  196. package/dist/schema/__tests__/event-schema.test.d.ts.map +1 -0
  197. package/dist/schema/__tests__/event-schema.test.js +480 -0
  198. package/dist/schema/__tests__/event-schema.test.js.map +1 -0
  199. package/dist/schema/event-schema.d.ts +120 -0
  200. package/dist/schema/event-schema.d.ts.map +1 -0
  201. package/dist/schema/event-schema.js +546 -0
  202. package/dist/schema/event-schema.js.map +1 -0
  203. package/dist/schema/index.d.ts +7 -0
  204. package/dist/schema/index.d.ts.map +1 -0
  205. package/dist/schema/index.js +49 -0
  206. package/dist/schema/index.js.map +1 -0
  207. package/dist/session-adapter-registry.d.ts +31 -0
  208. package/dist/session-adapter-registry.d.ts.map +1 -0
  209. package/dist/session-adapter-registry.js +75 -0
  210. package/dist/session-adapter-registry.js.map +1 -0
  211. package/dist/session-manager-helpers.d.ts +33 -0
  212. package/dist/session-manager-helpers.d.ts.map +1 -0
  213. package/dist/session-manager-helpers.js +66 -0
  214. package/dist/session-manager-helpers.js.map +1 -0
  215. package/dist/session-manager.d.ts +73 -0
  216. package/dist/session-manager.d.ts.map +1 -0
  217. package/dist/session-manager.js +353 -0
  218. package/dist/session-manager.js.map +1 -0
  219. package/dist/session-types.d.ts +358 -0
  220. package/dist/session-types.d.ts.map +1 -0
  221. package/dist/session-types.js +10 -0
  222. package/dist/session-types.js.map +1 -0
  223. package/dist/spawn-invocation.d.ts +52 -0
  224. package/dist/spawn-invocation.d.ts.map +1 -0
  225. package/dist/spawn-invocation.js +218 -0
  226. package/dist/spawn-invocation.js.map +1 -0
  227. package/dist/spawn-runner-utils.d.ts +21 -0
  228. package/dist/spawn-runner-utils.d.ts.map +1 -0
  229. package/dist/spawn-runner-utils.js +102 -0
  230. package/dist/spawn-runner-utils.js.map +1 -0
  231. package/dist/spawn-runner.d.ts +21 -0
  232. package/dist/spawn-runner.d.ts.map +1 -0
  233. package/dist/spawn-runner.js +582 -0
  234. package/dist/spawn-runner.js.map +1 -0
  235. package/dist/spawn-runtime-hooks.d.ts +15 -0
  236. package/dist/spawn-runtime-hooks.d.ts.map +1 -0
  237. package/dist/spawn-runtime-hooks.js +136 -0
  238. package/dist/spawn-runtime-hooks.js.map +1 -0
  239. package/dist/state-machine.d.ts +33 -0
  240. package/dist/state-machine.d.ts.map +1 -0
  241. package/dist/state-machine.js +61 -0
  242. package/dist/state-machine.js.map +1 -0
  243. package/dist/storage.d.ts +47 -0
  244. package/dist/storage.d.ts.map +1 -0
  245. package/dist/storage.js +90 -0
  246. package/dist/storage.js.map +1 -0
  247. package/dist/stream-assembler.d.ts +51 -0
  248. package/dist/stream-assembler.d.ts.map +1 -0
  249. package/dist/stream-assembler.js +86 -0
  250. package/dist/stream-assembler.js.map +1 -0
  251. package/dist/tools/classify.d.ts +9 -0
  252. package/dist/tools/classify.d.ts.map +1 -0
  253. package/dist/tools/classify.js +77 -0
  254. package/dist/tools/classify.js.map +1 -0
  255. package/dist/tools/index.d.ts +2 -0
  256. package/dist/tools/index.d.ts.map +1 -0
  257. package/dist/tools/index.js +2 -0
  258. package/dist/tools/index.js.map +1 -0
  259. package/dist/types.d.ts +288 -0
  260. package/dist/types.d.ts.map +1 -0
  261. package/dist/types.js +8 -0
  262. package/dist/types.js.map +1 -0
  263. package/dist/workspaces.d.ts +142 -0
  264. package/dist/workspaces.d.ts.map +1 -0
  265. package/dist/workspaces.js +515 -0
  266. package/dist/workspaces.js.map +1 -0
  267. package/package.json +107 -0
@@ -0,0 +1,31 @@
1
+ import type { AgentAdapter } from './adapter.js';
2
+ import type { AdapterRegistry } from './adapter-registry.js';
3
+ import type { AgentName } from './types.js';
4
+ import type { Session } from './session-types.js';
5
+ export interface PersistentSessionAdapterMetadata {
6
+ readonly sessionDirStrategy?: string;
7
+ readonly sessionPersistence?: string;
8
+ readonly pluginTargetId?: string;
9
+ readonly adapterName?: string;
10
+ }
11
+ export interface PersistentSessionAdapter {
12
+ readonly agent: AgentName;
13
+ readonly metadata?: PersistentSessionAdapterMetadata;
14
+ sessionDir(cwd?: string): string;
15
+ listSessionFiles(cwd?: string): Promise<string[]>;
16
+ parseSessionFile(filePath: string): Promise<Session>;
17
+ }
18
+ export declare class SessionAdapterRegistry {
19
+ private readonly byAlias;
20
+ register(adapter: PersistentSessionAdapter, aliases?: readonly string[]): void;
21
+ get(agentOrAlias: string): PersistentSessionAdapter | undefined;
22
+ list(): PersistentSessionAdapter[];
23
+ resolveUnifiedId(agent: AgentName, nativeSessionId: string): string;
24
+ resolveNativeId(unifiedId: string): {
25
+ agent: AgentName;
26
+ nativeSessionId: string;
27
+ } | null;
28
+ }
29
+ export declare function createLegacySessionAdapter(adapter: AgentAdapter, metadata?: PersistentSessionAdapterMetadata): PersistentSessionAdapter;
30
+ export declare function registerLegacySessionAdapters(adapters: AdapterRegistry, registry: SessionAdapterRegistry): SessionAdapterRegistry;
31
+ export declare function createSessionAdapterRegistry(adapters: AdapterRegistry): SessionAdapterRegistry;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-adapter-registry.d.ts","sourceRoot":"","sources":["../src/session-adapter-registry.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAC;AAC7D,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC;IAC1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,gCAAgC,CAAC;IAErD,UAAU,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,gBAAgB,CAAC,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClD,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CACtD;AAED,qBAAa,sBAAsB;IACjC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA+C;IAEvE,QAAQ,CAAC,OAAO,EAAE,wBAAwB,EAAE,OAAO,GAAE,SAAS,MAAM,EAAO,GAAG,IAAI;IAalF,GAAG,CAAC,YAAY,EAAE,MAAM,GAAG,wBAAwB,GAAG,SAAS;IAI/D,IAAI,IAAI,wBAAwB,EAAE;IAMlC,gBAAgB,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM;IAInE,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,SAAS,CAAC;QAAC,eAAe,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI;CAUzF;AAED,wBAAgB,0BAA0B,CACxC,OAAO,EAAE,YAAY,EACrB,QAAQ,GAAE,gCAAqC,GAC9C,wBAAwB,CAW1B;AAED,wBAAgB,6BAA6B,CAC3C,QAAQ,EAAE,eAAe,EACzB,QAAQ,EAAE,sBAAsB,GAC/B,sBAAsB,CA0BxB;AAED,wBAAgB,4BAA4B,CAAC,QAAQ,EAAE,eAAe,GAAG,sBAAsB,CAI9F"}
@@ -0,0 +1,75 @@
1
+ import { getPluginTargetDescriptor, getSessionConfig } from '@a5c-ai/atlas/catalog';
2
+ export class SessionAdapterRegistry {
3
+ byAlias = new Map();
4
+ register(adapter, aliases = []) {
5
+ const keys = new Set([
6
+ adapter.agent,
7
+ adapter.metadata?.adapterName,
8
+ adapter.metadata?.pluginTargetId,
9
+ ...aliases,
10
+ ].filter((key) => typeof key === 'string' && key.length > 0));
11
+ for (const key of keys) {
12
+ this.byAlias.set(key, adapter);
13
+ }
14
+ }
15
+ get(agentOrAlias) {
16
+ return this.byAlias.get(agentOrAlias);
17
+ }
18
+ list() {
19
+ return Array.from(new Set(this.byAlias.values())).sort((left, right) => left.agent.localeCompare(right.agent));
20
+ }
21
+ resolveUnifiedId(agent, nativeSessionId) {
22
+ return `${agent}:${nativeSessionId}`;
23
+ }
24
+ resolveNativeId(unifiedId) {
25
+ const colonIndex = unifiedId.indexOf(':');
26
+ if (colonIndex === -1)
27
+ return null;
28
+ const agent = unifiedId.slice(0, colonIndex);
29
+ const nativeSessionId = unifiedId.slice(colonIndex + 1);
30
+ if (!agent || !nativeSessionId || !this.get(agent))
31
+ return null;
32
+ return { agent, nativeSessionId };
33
+ }
34
+ }
35
+ export function createLegacySessionAdapter(adapter, metadata = {}) {
36
+ return {
37
+ agent: adapter.agent,
38
+ metadata: {
39
+ adapterName: adapter.agent,
40
+ ...metadata,
41
+ },
42
+ sessionDir: (cwd) => adapter.sessionDir(cwd),
43
+ listSessionFiles: (cwd) => adapter.listSessionFiles(cwd),
44
+ parseSessionFile: (filePath) => adapter.parseSessionFile(filePath),
45
+ };
46
+ }
47
+ export function registerLegacySessionAdapters(adapters, registry) {
48
+ for (const info of adapters.list()) {
49
+ const adapter = adapters.get(info.agent);
50
+ if (!adapter)
51
+ continue;
52
+ const target = getPluginTargetDescriptor(info.agent);
53
+ const session = getSessionConfig(info.agent);
54
+ const aliases = [
55
+ target?.targetId,
56
+ target?.adapterName,
57
+ target?.cliCommand,
58
+ ].filter((alias) => typeof alias === 'string' && alias.length > 0);
59
+ if ([info.agent, ...aliases].some((alias) => registry.get(alias)))
60
+ continue;
61
+ registry.register(createLegacySessionAdapter(adapter, {
62
+ adapterName: target?.adapterName ?? info.agent,
63
+ pluginTargetId: target?.targetId,
64
+ sessionDirStrategy: session.sessionDir,
65
+ sessionPersistence: session.sessionPersistence,
66
+ }), aliases);
67
+ }
68
+ return registry;
69
+ }
70
+ export function createSessionAdapterRegistry(adapters) {
71
+ const registry = new SessionAdapterRegistry();
72
+ registerLegacySessionAdapters(adapters, registry);
73
+ return registry;
74
+ }
75
+ //# sourceMappingURL=session-adapter-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-adapter-registry.js","sourceRoot":"","sources":["../src/session-adapter-registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ import type { AgentName } from './types.js';
2
+ import type { SessionSummary, SessionListOptions } from './session-types.js';
3
+ import type { WorkspaceSessionContext } from './workspaces.js';
4
+ type SessionShape = {
5
+ agent: AgentName;
6
+ sessionId: string;
7
+ createdAt: string;
8
+ updatedAt: string;
9
+ title?: string;
10
+ turnCount: number;
11
+ messages?: Array<unknown>;
12
+ tags?: string[];
13
+ model?: string;
14
+ cost?: SessionSummary['cost'];
15
+ cwd?: string;
16
+ workspace?: WorkspaceSessionContext;
17
+ workspaceId?: string;
18
+ forkedFrom?: string;
19
+ };
20
+ type SessionAdapter = {
21
+ parseSessionFile(filePath: string): Promise<SessionShape>;
22
+ };
23
+ export declare function canFastListByDate(options: SessionListOptions | undefined, sortField: string): boolean;
24
+ export declare function listByRecentFiles(adapter: SessionAdapter, filePaths: string[], limit: number, sortDir: 'asc' | 'desc', resolveUnifiedId: (agent: AgentName, nativeSessionId: string) => string): Promise<SessionSummary[]>;
25
+ export declare function getSessionDates(session: {
26
+ createdAt: string;
27
+ updatedAt: string;
28
+ }): {
29
+ createdAt: Date;
30
+ updatedAt: Date;
31
+ };
32
+ export declare function buildSummary(session: Omit<SessionShape, 'createdAt' | 'updatedAt'>, createdAt: Date, updatedAt: Date, resolveUnifiedId: (agent: AgentName, nativeSessionId: string) => string): SessionSummary;
33
+ export {};
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager-helpers.d.ts","sourceRoot":"","sources":["../src/session-manager-helpers.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAC7E,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAI/D,KAAK,YAAY,GAAG;IAClB,KAAK,EAAE,SAAS,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IAC1B,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC9B,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,uBAAuB,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,CAAC;AAEF,KAAK,cAAc,GAAG;IACpB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;CAC3D,CAAC;AAEF,wBAAgB,iBAAiB,CAC/B,OAAO,EAAE,kBAAkB,GAAG,SAAS,EACvC,SAAS,EAAE,MAAM,GAChB,OAAO,CAQT;AAED,wBAAsB,iBAAiB,CACrC,OAAO,EAAE,cAAc,EACvB,SAAS,EAAE,MAAM,EAAE,EACnB,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,KAAK,GAAG,MAAM,EACvB,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,KAAK,MAAM,GACtE,OAAO,CAAC,cAAc,EAAE,CAAC,CAsC3B;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE;IACvC,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG;IAAE,SAAS,EAAE,IAAI,CAAC;IAAC,SAAS,EAAE,IAAI,CAAA;CAAE,CAKvC;AAED,wBAAgB,YAAY,CAC1B,OAAO,EAAE,IAAI,CAAC,YAAY,EAAE,WAAW,GAAG,WAAW,CAAC,EACtD,SAAS,EAAE,IAAI,EACf,SAAS,EAAE,IAAI,EACf,gBAAgB,EAAE,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,KAAK,MAAM,GACtE,cAAc,CAkBhB"}
@@ -0,0 +1,66 @@
1
+ import * as fsp from 'node:fs/promises';
2
+ const FAST_LIST_BUFFER = 10;
3
+ export function canFastListByDate(options, sortField) {
4
+ return (sortField === 'date' &&
5
+ options?.since == null &&
6
+ options?.until == null &&
7
+ options?.model == null &&
8
+ (options?.tags == null || options.tags.length === 0));
9
+ }
10
+ export async function listByRecentFiles(adapter, filePaths, limit, sortDir, resolveUnifiedId) {
11
+ const ranked = await Promise.all(filePaths.map(async (filePath) => {
12
+ try {
13
+ const stat = await fsp.stat(filePath);
14
+ const createdMs = stat.birthtimeMs > 0 ? stat.birthtimeMs : stat.mtimeMs;
15
+ return { filePath, createdMs };
16
+ }
17
+ catch {
18
+ return { filePath, createdMs: 0 };
19
+ }
20
+ }));
21
+ ranked.sort((a, b) => sortDir === 'asc' ? a.createdMs - b.createdMs : b.createdMs - a.createdMs);
22
+ const summaries = [];
23
+ const parseBudget = Math.max(limit + FAST_LIST_BUFFER, limit * 2);
24
+ for (const candidate of ranked) {
25
+ try {
26
+ const session = await adapter.parseSessionFile(candidate.filePath);
27
+ const { createdAt, updatedAt } = getSessionDates(session);
28
+ summaries.push(buildSummary(session, createdAt, updatedAt, resolveUnifiedId));
29
+ if (summaries.length >= parseBudget)
30
+ break;
31
+ }
32
+ catch {
33
+ // Skip unparseable session files
34
+ }
35
+ }
36
+ summaries.sort((a, b) => sortDir === 'asc'
37
+ ? a.createdAt.getTime() - b.createdAt.getTime()
38
+ : b.createdAt.getTime() - a.createdAt.getTime());
39
+ return summaries.slice(0, limit);
40
+ }
41
+ export function getSessionDates(session) {
42
+ return {
43
+ createdAt: new Date(session.createdAt),
44
+ updatedAt: new Date(session.updatedAt),
45
+ };
46
+ }
47
+ export function buildSummary(session, createdAt, updatedAt, resolveUnifiedId) {
48
+ return {
49
+ agent: session.agent,
50
+ sessionId: session.sessionId,
51
+ unifiedId: resolveUnifiedId(session.agent, session.sessionId),
52
+ title: session.title ?? '',
53
+ createdAt,
54
+ updatedAt,
55
+ turnCount: session.turnCount,
56
+ messageCount: session.messages?.length ?? 0,
57
+ tags: session.tags ?? [],
58
+ model: session.model,
59
+ cost: session.cost,
60
+ cwd: session.cwd,
61
+ workspace: session.workspace,
62
+ workspaceId: session.workspaceId,
63
+ forkedFrom: session.forkedFrom,
64
+ };
65
+ }
66
+ //# sourceMappingURL=session-manager-helpers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager-helpers.js","sourceRoot":"","sources":["../src/session-manager-helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,GAAG,MAAM,kBAAkB,CAAC;AAMxC,MAAM,gBAAgB,GAAG,EAAE,CAAC;AAuB5B,MAAM,UAAU,iBAAiB,CAC/B,OAAuC,EACvC,SAAiB;IAEjB,OAAO,CACL,SAAS,KAAK,MAAM;QACpB,OAAO,EAAE,KAAK,IAAI,IAAI;QACtB,OAAO,EAAE,KAAK,IAAI,IAAI;QACtB,OAAO,EAAE,KAAK,IAAI,IAAI;QACtB,CAAC,OAAO,EAAE,IAAI,IAAI,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CACrD,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CACrC,OAAuB,EACvB,SAAmB,EACnB,KAAa,EACb,OAAuB,EACvB,gBAAuE;IAEvE,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,GAAG,CAC9B,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,EAAE,EAAE;QAC/B,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACtC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC;YACzE,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;QACjC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC;QACpC,CAAC;IACH,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACnB,OAAO,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC,SAAS,CAC1E,CAAC;IAEF,MAAM,SAAS,GAAqB,EAAE,CAAC;IACvC,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,GAAG,gBAAgB,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;IAElE,KAAK,MAAM,SAAS,IAAI,MAAM,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,gBAAgB,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YACnE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;YAC1D,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,gBAAgB,CAAC,CAAC,CAAC;YAC9E,IAAI,SAAS,CAAC,MAAM,IAAI,WAAW;gBAAE,MAAM;QAC7C,CAAC;QAAC,MAAM,CAAC;YACP,iCAAiC;QACnC,CAAC;IACH,CAAC;IAED,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACtB,OAAO,KAAK,KAAK;QACf,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE;QAC/C,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,SAAS,CAAC,OAAO,EAAE,CAClD,CAAC;IAEF,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,OAG/B;IACC,OAAO;QACL,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACtC,SAAS,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAC1B,OAAsD,EACtD,SAAe,EACf,SAAe,EACf,gBAAuE;IAEvE,OAAO;QACL,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,SAAS,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,EAAE,OAAO,CAAC,SAAS,CAAC;QAC7D,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,EAAE;QAC1B,SAAS;QACT,SAAS;QACT,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,YAAY,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,IAAI,CAAC;QAC3C,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,EAAE;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,SAAS,EAAE,OAAO,CAAC,SAAS;QAC5B,WAAW,EAAE,OAAO,CAAC,WAAW;QAChC,UAAU,EAAE,OAAO,CAAC,UAAU;KAC/B,CAAC;AACJ,CAAC"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * SessionManager interface and implementation for @a5c-ai/adapters.
3
+ *
4
+ * Provides read-only access to agent session data stored in each agent's
5
+ * native format. Delegates parsing and listing to agent adapters.
6
+ *
7
+ * @see 07-session-manager.md
8
+ */
9
+ import type { AgentName } from './types.js';
10
+ import type { AdapterRegistry } from './adapter-registry.js';
11
+ import { SessionAdapterRegistry } from './session-adapter-registry.js';
12
+ export type { SessionToolCall, SessionMessage, SessionSummary, FullSession, Session, SessionListOptions, SessionQuery, CostAggregationOptions, CostSummary, CostBreakdown, SessionDiff, DiffOperation, } from './session-types.js';
13
+ import type { SessionSummary, FullSession, SessionListOptions, SessionQuery, CostAggregationOptions, CostSummary, SessionDiff } from './session-types.js';
14
+ /** Read-only access to agent session data. */
15
+ export interface SessionManager {
16
+ /** List sessions for a specific agent. */
17
+ list(agent: AgentName, options?: SessionListOptions): Promise<SessionSummary[]>;
18
+ /** Retrieve full session content. */
19
+ get(agent: AgentName, sessionId: string): Promise<FullSession>;
20
+ /** Full-text search across sessions. */
21
+ search(query: SessionQuery): Promise<SessionSummary[]>;
22
+ /** Aggregate cost data across sessions. */
23
+ totalCost(options?: CostAggregationOptions): Promise<CostSummary>;
24
+ /** Export a session in a specified format. */
25
+ export(agent: AgentName, sessionId: string, format: 'json' | 'jsonl' | 'markdown'): Promise<string>;
26
+ /** Compute structural diff between two sessions. */
27
+ diff(a: {
28
+ agent: AgentName;
29
+ sessionId: string;
30
+ }, b: {
31
+ agent: AgentName;
32
+ sessionId: string;
33
+ }): Promise<SessionDiff>;
34
+ /** Map a native session ID to a unified cross-agent ID. */
35
+ resolveUnifiedId(agent: AgentName, nativeSessionId: string): string;
36
+ /** Parse a unified session ID back into agent and native ID. */
37
+ resolveNativeId(unifiedId: string): {
38
+ agent: AgentName;
39
+ nativeSessionId: string;
40
+ } | null;
41
+ }
42
+ /**
43
+ * Implementation of SessionManager.
44
+ *
45
+ * Delegates session file I/O to the adapter registry. Provides
46
+ * filtering, sorting, search, cost aggregation, export, diff, and
47
+ * unified ID resolution.
48
+ */
49
+ export declare class SessionManagerImpl implements SessionManager {
50
+ private readonly _adapters;
51
+ private readonly _sessionAdapters;
52
+ private readonly logger;
53
+ constructor(adapters: AdapterRegistry, sessionAdapters?: SessionAdapterRegistry);
54
+ private _getAdapter;
55
+ private _getSessionAdapter;
56
+ list(agent: AgentName, options?: SessionListOptions): Promise<SessionSummary[]>;
57
+ get(agent: AgentName, sessionId: string): Promise<FullSession>;
58
+ search(query: SessionQuery): Promise<SessionSummary[]>;
59
+ totalCost(options?: CostAggregationOptions): Promise<CostSummary>;
60
+ export(agent: AgentName, sessionId: string, format: 'json' | 'jsonl' | 'markdown'): Promise<string>;
61
+ diff(a: {
62
+ agent: AgentName;
63
+ sessionId: string;
64
+ }, b: {
65
+ agent: AgentName;
66
+ sessionId: string;
67
+ }): Promise<SessionDiff>;
68
+ resolveUnifiedId(agent: AgentName, nativeSessionId: string): string;
69
+ resolveNativeId(unifiedId: string): {
70
+ agent: AgentName;
71
+ nativeSessionId: string;
72
+ } | null;
73
+ }
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-manager.d.ts","sourceRoot":"","sources":["../src/session-manager.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,353 @@
1
+ /**
2
+ * SessionManager interface and implementation for @a5c-ai/adapters.
3
+ *
4
+ * Provides read-only access to agent session data stored in each agent's
5
+ * native format. Delegates parsing and listing to agent adapters.
6
+ *
7
+ * @see 07-session-manager.md
8
+ */
9
+ import { createComponentLogger } from '@a5c-ai/adapters-observability';
10
+ import { AgentMuxError } from './errors.js';
11
+ import { buildSummary, canFastListByDate, getSessionDates, listByRecentFiles, } from './session-manager-helpers.js';
12
+ import { SessionAdapterRegistry, registerLegacySessionAdapters } from './session-adapter-registry.js';
13
+ // ---------------------------------------------------------------------------
14
+ // SessionManagerImpl
15
+ // ---------------------------------------------------------------------------
16
+ /**
17
+ * Implementation of SessionManager.
18
+ *
19
+ * Delegates session file I/O to the adapter registry. Provides
20
+ * filtering, sorting, search, cost aggregation, export, diff, and
21
+ * unified ID resolution.
22
+ */
23
+ export class SessionManagerImpl {
24
+ _adapters;
25
+ _sessionAdapters;
26
+ logger = createComponentLogger('sessions');
27
+ constructor(adapters, sessionAdapters = new SessionAdapterRegistry()) {
28
+ this._adapters = adapters;
29
+ this._sessionAdapters = sessionAdapters;
30
+ }
31
+ // -- Helper: ensure adapter exists -------------------------------------------
32
+ _getAdapter(agent) {
33
+ const adapter = this._adapters.get(agent);
34
+ if (!adapter) {
35
+ throw new AgentMuxError('AGENT_NOT_FOUND', `Unknown agent: "${agent}"`);
36
+ }
37
+ return adapter;
38
+ }
39
+ _getSessionAdapter(agent) {
40
+ registerLegacySessionAdapters(this._adapters, this._sessionAdapters);
41
+ const adapter = this._sessionAdapters.get(agent);
42
+ if (adapter)
43
+ return adapter;
44
+ this._getAdapter(agent);
45
+ throw new AgentMuxError('AGENT_NOT_FOUND', `Unknown agent: "${agent}"`);
46
+ }
47
+ // -- list() ------------------------------------------------------------------
48
+ async list(agent, options) {
49
+ this.logger.debug({ agent, limit: options?.limit }, 'Listing sessions');
50
+ const adapter = this._getSessionAdapter(agent);
51
+ const filePaths = await adapter.listSessionFiles();
52
+ const limit = options?.limit ?? 100;
53
+ const sortField = options?.sort ?? 'date';
54
+ const sortDir = options?.sortDirection ?? 'desc';
55
+ if (canFastListByDate(options, sortField)) {
56
+ return listByRecentFiles(adapter, filePaths, limit, sortDir, this.resolveUnifiedId.bind(this));
57
+ }
58
+ const summaries = [];
59
+ for (const fp of filePaths) {
60
+ try {
61
+ const session = await adapter.parseSessionFile(fp);
62
+ const { createdAt, updatedAt } = getSessionDates(session);
63
+ // Apply date filters
64
+ if (options?.since && createdAt < options.since)
65
+ continue;
66
+ if (options?.until && createdAt > options.until)
67
+ continue;
68
+ summaries.push(buildSummary(session, createdAt, updatedAt, this.resolveUnifiedId.bind(this)));
69
+ }
70
+ catch {
71
+ // Skip unparseable session files
72
+ }
73
+ }
74
+ // Sort
75
+ const multiplier = sortDir === 'asc' ? 1 : -1;
76
+ summaries.sort((a, b) => {
77
+ if (sortField === 'date') {
78
+ return multiplier * (a.createdAt.getTime() - b.createdAt.getTime());
79
+ }
80
+ if (sortField === 'turns') {
81
+ return multiplier * (a.turnCount - b.turnCount);
82
+ }
83
+ if (sortField === 'cost') {
84
+ const aCost = a.cost?.totalUsd ?? 0;
85
+ const bCost = b.cost?.totalUsd ?? 0;
86
+ return multiplier * (aCost - bCost);
87
+ }
88
+ return 0;
89
+ });
90
+ return summaries.slice(0, limit);
91
+ }
92
+ // -- get() -------------------------------------------------------------------
93
+ async get(agent, sessionId) {
94
+ this.logger.debug({ agent, sessionId }, 'Getting session');
95
+ const adapter = this._getSessionAdapter(agent);
96
+ const filePaths = await adapter.listSessionFiles();
97
+ for (const fp of filePaths) {
98
+ try {
99
+ const session = await adapter.parseSessionFile(fp);
100
+ if (session.sessionId === sessionId) {
101
+ return {
102
+ agent: session.agent,
103
+ sessionId: session.sessionId,
104
+ unifiedId: this.resolveUnifiedId(session.agent, session.sessionId),
105
+ title: session.title ?? '',
106
+ createdAt: new Date(session.createdAt),
107
+ updatedAt: new Date(session.updatedAt),
108
+ turnCount: session.turnCount,
109
+ model: session.model,
110
+ cost: session.cost,
111
+ tags: session.tags ?? [],
112
+ cwd: session.cwd,
113
+ workspace: session.workspace,
114
+ workspaceId: session.workspaceId,
115
+ forkedFrom: session.forkedFrom,
116
+ messages: session.messages ?? [],
117
+ raw: session.raw,
118
+ };
119
+ }
120
+ }
121
+ catch {
122
+ // Skip unparseable files
123
+ }
124
+ }
125
+ throw new AgentMuxError('SESSION_NOT_FOUND', `Session "${sessionId}" not found for agent "${agent}"`);
126
+ }
127
+ // -- search() ----------------------------------------------------------------
128
+ async search(query) {
129
+ const agents = query.agent
130
+ ? [query.agent]
131
+ : this._adapters.list().map((a) => a.agent);
132
+ const allSummaries = [];
133
+ const limit = query.limit ?? 50;
134
+ for (const agent of agents) {
135
+ try {
136
+ const sessions = await this.list(agent, {
137
+ since: query.since,
138
+ until: query.until,
139
+ model: query.model,
140
+ tags: query.tags,
141
+ limit,
142
+ });
143
+ for (const s of sessions) {
144
+ // Simple text matching on title and sessionId
145
+ const text = query.text.toLowerCase();
146
+ const matchesTitle = s.title.toLowerCase().includes(text);
147
+ const matchesId = s.sessionId.toLowerCase().includes(text);
148
+ if (matchesTitle || matchesId) {
149
+ allSummaries.push({
150
+ ...s,
151
+ relevanceScore: matchesTitle ? 1.0 : 0.5,
152
+ });
153
+ }
154
+ }
155
+ }
156
+ catch {
157
+ // Skip agents that fail
158
+ }
159
+ }
160
+ // Sort by relevance (descending) then by date (descending)
161
+ if (query.sort === 'date') {
162
+ allSummaries.sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
163
+ }
164
+ else if (query.sort === 'cost') {
165
+ allSummaries.sort((a, b) => (b.cost?.totalUsd ?? 0) - (a.cost?.totalUsd ?? 0));
166
+ }
167
+ else {
168
+ // Default: relevance
169
+ allSummaries.sort((a, b) => (b.relevanceScore ?? 0) - (a.relevanceScore ?? 0));
170
+ }
171
+ return allSummaries.slice(0, limit);
172
+ }
173
+ // -- totalCost() -------------------------------------------------------------
174
+ async totalCost(options) {
175
+ const agents = options?.agent
176
+ ? [options.agent]
177
+ : this._adapters.list().map((a) => a.agent);
178
+ const summary = {
179
+ totalUsd: 0,
180
+ inputTokens: 0,
181
+ outputTokens: 0,
182
+ thinkingTokens: 0,
183
+ cachedTokens: 0,
184
+ sessionCount: 0,
185
+ runCount: 0,
186
+ };
187
+ const breakdowns = {};
188
+ for (const agent of agents) {
189
+ try {
190
+ const sessions = await this.list(agent, {
191
+ since: options?.since,
192
+ until: options?.until,
193
+ model: options?.model,
194
+ tags: options?.tags,
195
+ });
196
+ for (const s of sessions) {
197
+ const cost = s.cost;
198
+ if (cost) {
199
+ summary.totalUsd += cost.totalUsd;
200
+ summary.inputTokens += cost.inputTokens;
201
+ summary.outputTokens += cost.outputTokens;
202
+ summary.thinkingTokens += cost.thinkingTokens ?? 0;
203
+ summary.cachedTokens += cost.cachedTokens ?? 0;
204
+ }
205
+ summary.sessionCount++;
206
+ // Build breakdowns if requested
207
+ if (options?.groupBy) {
208
+ let key;
209
+ switch (options.groupBy) {
210
+ case 'agent':
211
+ key = agent;
212
+ break;
213
+ case 'model':
214
+ key = s.model ?? 'unknown';
215
+ break;
216
+ case 'day':
217
+ key = s.createdAt.toISOString().slice(0, 10);
218
+ break;
219
+ case 'tag':
220
+ key = s.tags.length > 0 ? s.tags[0] : 'untagged';
221
+ break;
222
+ default:
223
+ key = 'unknown';
224
+ }
225
+ if (!breakdowns[key]) {
226
+ breakdowns[key] = {
227
+ key,
228
+ totalUsd: 0,
229
+ inputTokens: 0,
230
+ outputTokens: 0,
231
+ thinkingTokens: 0,
232
+ cachedTokens: 0,
233
+ sessionCount: 0,
234
+ };
235
+ }
236
+ const bd = breakdowns[key];
237
+ if (cost) {
238
+ bd.totalUsd += cost.totalUsd;
239
+ bd.inputTokens += cost.inputTokens;
240
+ bd.outputTokens += cost.outputTokens;
241
+ bd.thinkingTokens += cost.thinkingTokens ?? 0;
242
+ bd.cachedTokens += cost.cachedTokens ?? 0;
243
+ }
244
+ bd.sessionCount++;
245
+ }
246
+ }
247
+ }
248
+ catch {
249
+ // Skip agents that fail
250
+ }
251
+ }
252
+ if (options?.groupBy) {
253
+ summary.breakdowns = breakdowns;
254
+ }
255
+ return summary;
256
+ }
257
+ // -- export() ----------------------------------------------------------------
258
+ async export(agent, sessionId, format) {
259
+ const session = await this.get(agent, sessionId);
260
+ switch (format) {
261
+ case 'json':
262
+ return JSON.stringify(session, null, 2);
263
+ case 'jsonl':
264
+ return session.messages
265
+ .map((m) => JSON.stringify(m))
266
+ .join('\n');
267
+ case 'markdown': {
268
+ const lines = [];
269
+ lines.push(`# Session: ${session.title || session.sessionId}`);
270
+ lines.push(`**Agent:** ${session.agent}`);
271
+ lines.push(`**Created:** ${session.createdAt.toISOString()}`);
272
+ lines.push(`**Turns:** ${session.turnCount}`);
273
+ if (session.model)
274
+ lines.push(`**Model:** ${session.model}`);
275
+ lines.push('');
276
+ for (const msg of session.messages) {
277
+ lines.push(`## ${msg.role}`);
278
+ lines.push(msg.content);
279
+ lines.push('');
280
+ }
281
+ return lines.join('\n');
282
+ }
283
+ default:
284
+ throw new AgentMuxError('VALIDATION_ERROR', `Unknown export format: "${format}"`);
285
+ }
286
+ }
287
+ // -- diff() ------------------------------------------------------------------
288
+ async diff(a, b) {
289
+ const sessionA = await this.get(a.agent, a.sessionId);
290
+ const sessionB = await this.get(b.agent, b.sessionId);
291
+ const operations = [];
292
+ const maxLen = Math.max(sessionA.messages.length, sessionB.messages.length);
293
+ let added = 0;
294
+ let removed = 0;
295
+ let modified = 0;
296
+ let unchanged = 0;
297
+ for (let i = 0; i < maxLen; i++) {
298
+ const msgA = sessionA.messages[i];
299
+ const msgB = sessionB.messages[i];
300
+ if (msgA && msgB) {
301
+ if (msgA.role === msgB.role && msgA.content === msgB.content) {
302
+ operations.push({ type: 'unchanged', indexA: i, indexB: i, messageA: msgA, messageB: msgB });
303
+ unchanged++;
304
+ }
305
+ else {
306
+ operations.push({ type: 'modified', indexA: i, indexB: i, messageA: msgA, messageB: msgB });
307
+ modified++;
308
+ }
309
+ }
310
+ else if (msgA && !msgB) {
311
+ operations.push({ type: 'removed', indexA: i, messageA: msgA });
312
+ removed++;
313
+ }
314
+ else if (!msgA && msgB) {
315
+ operations.push({ type: 'added', indexB: i, messageB: msgB });
316
+ added++;
317
+ }
318
+ }
319
+ return {
320
+ a: {
321
+ agent: a.agent,
322
+ sessionId: a.sessionId,
323
+ unifiedId: this.resolveUnifiedId(a.agent, a.sessionId),
324
+ },
325
+ b: {
326
+ agent: b.agent,
327
+ sessionId: b.sessionId,
328
+ unifiedId: this.resolveUnifiedId(b.agent, b.sessionId),
329
+ },
330
+ operations,
331
+ summary: { added, removed, modified, unchanged },
332
+ };
333
+ }
334
+ // -- resolveUnifiedId() ------------------------------------------------------
335
+ resolveUnifiedId(agent, nativeSessionId) {
336
+ return this._sessionAdapters.resolveUnifiedId(agent, nativeSessionId);
337
+ }
338
+ // -- resolveNativeId() -------------------------------------------------------
339
+ resolveNativeId(unifiedId) {
340
+ const parsed = this._sessionAdapters.resolveNativeId(unifiedId);
341
+ if (parsed)
342
+ return parsed;
343
+ const colonIndex = unifiedId.indexOf(':');
344
+ if (colonIndex === -1)
345
+ return null;
346
+ const agent = unifiedId.slice(0, colonIndex);
347
+ const nativeSessionId = unifiedId.slice(colonIndex + 1);
348
+ if (!agent || !nativeSessionId || !this._adapters.get(agent))
349
+ return null;
350
+ return { agent, nativeSessionId };
351
+ }
352
+ }
353
+ //# sourceMappingURL=session-manager.js.map