@wrongstack/core 0.313.1 → 0.316.2

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 (290) hide show
  1. package/dist/chronicle/index.js +31 -31
  2. package/dist/chronicle/legacy-journal-import.d.ts +0 -6
  3. package/dist/chronicle/metrics-ingest.d.ts +14 -0
  4. package/dist/chronicle/metrics-schema.d.ts +10 -1
  5. package/dist/chronicle/metrics-store.d.ts +20 -2
  6. package/dist/chronicle/project-server.js +39 -31
  7. package/dist/chronicle/sink.d.ts +13 -0
  8. package/dist/chronicle/sqlite-journal.d.ts +20 -2
  9. package/dist/{chunk-WOEZV3Q4.js → chunk-25LSLC3G.js} +2 -1
  10. package/dist/{chunk-AI4LLQ2U.js → chunk-27QIURLN.js} +229 -12
  11. package/dist/{chunk-I45KAW2N.js → chunk-3AGWVSS7.js} +38 -450
  12. package/dist/chunk-3BDV7RL3.js +211 -0
  13. package/dist/{chunk-NFAYHPRH.js → chunk-3ECENVHL.js} +10 -8
  14. package/dist/{chunk-FW5LDDMJ.js → chunk-45WI72ZB.js} +1576 -1156
  15. package/dist/{chunk-AT4V4XGI.js → chunk-4BMVPOHO.js} +539 -313
  16. package/dist/{chunk-YBUJCZ57.js → chunk-4I7HGVVA.js} +17 -5
  17. package/dist/{chunk-JVGPR3TS.js → chunk-4LCZVJVF.js} +7 -55
  18. package/dist/{chunk-4ZHTKJHM.js → chunk-4SJNS7OB.js} +36 -2
  19. package/dist/{chunk-AD7ZFZCS.js → chunk-5BMIE7QG.js} +3 -3
  20. package/dist/{chunk-IQ35HMQL.js → chunk-5YPSXQXM.js} +71 -24
  21. package/dist/chunk-6FHWXLPT.js +10 -0
  22. package/dist/{chunk-FIV4IJL7.js → chunk-6H5GEOET.js} +163 -20
  23. package/dist/{chunk-VB3H5WWB.js → chunk-6NWEVFEL.js} +2 -2
  24. package/dist/{chunk-E6I5RXVK.js → chunk-AYW5YINX.js} +2 -2
  25. package/dist/{chunk-DEIQMBD2.js → chunk-B7F4WVP4.js} +2 -2
  26. package/dist/{chunk-XQ2XGIBF.js → chunk-BPBKKBUK.js} +6 -7
  27. package/dist/{chunk-K4YUNKU7.js → chunk-BYD345OX.js} +2 -2
  28. package/dist/{chunk-LZDDLNCZ.js → chunk-C27KDLOX.js} +4 -4
  29. package/dist/{chunk-6AKOTGLM.js → chunk-CU546ESW.js} +7 -7
  30. package/dist/{chunk-ZZ4V3WIZ.js → chunk-DLHHXUAM.js} +10 -1
  31. package/dist/{chunk-BAKVJLEV.js → chunk-DOTHQSJ2.js} +28 -16
  32. package/dist/{chunk-KBZGE6LN.js → chunk-DYLPMV4Q.js} +4 -3
  33. package/dist/{chunk-52RTVH4M.js → chunk-F3JWNST7.js} +2 -2
  34. package/dist/{chunk-WEBMSQP2.js → chunk-FC2ZGRF3.js} +21 -4
  35. package/dist/{chunk-FHAMQS7Q.js → chunk-FCBTO76Z.js} +76 -146
  36. package/dist/{chunk-4LJJYBAU.js → chunk-FHZVFYSL.js} +9 -1
  37. package/dist/{chunk-W4A6QA3D.js → chunk-FWNLEZYG.js} +4 -3
  38. package/dist/{chunk-OJZEX73F.js → chunk-GDQ7CZRQ.js} +5 -1
  39. package/dist/{chunk-QVOVMXJR.js → chunk-GJJGJB2R.js} +32 -9
  40. package/dist/{chunk-4XV6IR37.js → chunk-HI3JGZR2.js} +7 -6
  41. package/dist/{chunk-FSWCWSTS.js → chunk-HMLIGAU7.js} +26 -26
  42. package/dist/{chunk-PFXFQQRT.js → chunk-HXKZ7OBQ.js} +7 -43
  43. package/dist/{chunk-2FQL4PDC.js → chunk-I7DALG7J.js} +5 -5
  44. package/dist/{chunk-GM54GJBU.js → chunk-IRUTEHCE.js} +3 -3
  45. package/dist/{chunk-TYW2GI5I.js → chunk-J2WRWR37.js} +40 -13
  46. package/dist/{chunk-ZEHUCJHY.js → chunk-JFPJ6LLQ.js} +2 -2
  47. package/dist/chunk-JMULFFLN.js +9 -0
  48. package/dist/{chunk-RD6DEE36.js → chunk-JO4MGB6Z.js} +94 -8
  49. package/dist/{chunk-5DSMEVA4.js → chunk-K6BXGITA.js} +7 -7
  50. package/dist/{chunk-O74MJHXU.js → chunk-KZMSZV32.js} +2 -2
  51. package/dist/{chunk-GFJOMSHG.js → chunk-LA7CLDRW.js} +6 -2
  52. package/dist/{chunk-M2WF6AXG.js → chunk-LSMMOS2Z.js} +7 -3
  53. package/dist/{chunk-ASX6AW36.js → chunk-LXWCMQNJ.js} +3 -3
  54. package/dist/{chunk-WZO23AWO.js → chunk-M27LIEKV.js} +72 -22
  55. package/dist/{chunk-JTHKOYWU.js → chunk-MJPHJRAL.js} +15 -15
  56. package/dist/{chunk-G5AAKEEZ.js → chunk-MTL4O5YR.js} +5 -5
  57. package/dist/chunk-NHJ75HXY.js +1 -0
  58. package/dist/{chunk-ZYU2YOJ6.js → chunk-NIOAGFPB.js} +29 -15
  59. package/dist/{chunk-Y2GE5TSI.js → chunk-NS52ISWS.js} +2 -2
  60. package/dist/{chunk-UIWONWVG.js → chunk-NSOFPKGT.js} +541 -148
  61. package/dist/{chunk-RCQYT2I4.js → chunk-NVIZG63R.js} +2 -2
  62. package/dist/{chunk-EPC3GZD4.js → chunk-OOYZPOXM.js} +2 -2
  63. package/dist/{chunk-7ZHZE5EO.js → chunk-OSGLYW5J.js} +2 -2
  64. package/dist/{chunk-CE4ZOCOI.js → chunk-PFCMSSUF.js} +9 -9
  65. package/dist/{chunk-GFXZTHNI.js → chunk-PGRVXIMY.js} +5 -5
  66. package/dist/{chunk-JJPMWPB6.js → chunk-PISBFBJN.js} +6 -6
  67. package/dist/chunk-POOOIWE5.js +9 -0
  68. package/dist/{chunk-5RP3QTRL.js → chunk-PQNS3U7Z.js} +20 -3
  69. package/dist/{chunk-3E244UDA.js → chunk-QSTSJOCK.js} +52 -6
  70. package/dist/{chunk-YUPMXOGP.js → chunk-RFQMOKWK.js} +3 -3
  71. package/dist/chunk-RTOTNK3P.js +484 -0
  72. package/dist/{chunk-SN2DQRL6.js → chunk-RXKSDUAU.js} +7 -7
  73. package/dist/{chunk-T3KGZBU5.js → chunk-S45JPKQN.js} +189 -43
  74. package/dist/{chunk-YNCVSFGF.js → chunk-SAFHACFA.js} +4 -1
  75. package/dist/{chunk-KI4L2DUL.js → chunk-TCCHINEF.js} +114 -19
  76. package/dist/{chunk-AWNQ6ED6.js → chunk-THEGTRAG.js} +7 -2
  77. package/dist/{chunk-2KKODIQU.js → chunk-TR4LQE7L.js} +15 -15
  78. package/dist/{chunk-GPQ3NJPR.js → chunk-TWJMGXCI.js} +3 -3
  79. package/dist/{chunk-H72H4XDU.js → chunk-U45AXT5D.js} +9 -9
  80. package/dist/{chunk-62V2AFVG.js → chunk-U4FWBSO3.js} +160 -73
  81. package/dist/{chunk-A455ATZB.js → chunk-UBGDX6FI.js} +8 -1
  82. package/dist/chunk-UJILKYES.js +75 -0
  83. package/dist/{chunk-KSJ5UTP7.js → chunk-ULMAQV3T.js} +84 -4
  84. package/dist/{chunk-CB2HFKTP.js → chunk-VVBP6KGT.js} +1 -1
  85. package/dist/{chunk-RPOA7IAE.js → chunk-W5VITDM2.js} +43 -25
  86. package/dist/{chunk-QRTG4XTI.js → chunk-WAHQVNWT.js} +7 -1
  87. package/dist/{chunk-SQP64RCS.js → chunk-WGGYRBXH.js} +3019 -2976
  88. package/dist/{chunk-K3G6JBUC.js → chunk-WLYKU45P.js} +679 -141
  89. package/dist/chunk-WP7BVANJ.js +53 -0
  90. package/dist/{chunk-GAZEWQEZ.js → chunk-XF4VUMKW.js} +2 -2
  91. package/dist/{chunk-PAAWLLZX.js → chunk-Y5YXDM7D.js} +2 -2
  92. package/dist/{chunk-65RDIOR2.js → chunk-YOPAUVU4.js} +162 -44
  93. package/dist/{chunk-FFSX2QDQ.js → chunk-YPT4A46F.js} +3 -3
  94. package/dist/chunk-YWXT3JNM.js +425 -0
  95. package/dist/{chunk-EFEHDQGY.js → chunk-ZHZ2Y2DH.js} +64 -10
  96. package/dist/{chunk-CQQL4ZOQ.js → chunk-ZT7JNIGX.js} +4 -3
  97. package/dist/coordination/agent-monitor.d.ts +9 -1
  98. package/dist/coordination/agent-subagent-runner.d.ts +1 -1
  99. package/dist/coordination/agents/agent-prompts.d.ts +8 -0
  100. package/dist/coordination/agents/index.d.ts +33 -1
  101. package/dist/coordination/agents/index.js +52 -22
  102. package/dist/coordination/agents/phase3-wave1-platform.d.ts +1 -3
  103. package/dist/coordination/agents/phase3-wave2-meta.d.ts +1 -3
  104. package/dist/coordination/agents/phase8-wave3-products.d.ts +1 -3
  105. package/dist/coordination/agents/phase9-wave4-platform-meta.d.ts +1 -3
  106. package/dist/coordination/agents/project-agent-identity.d.ts +11 -11
  107. package/dist/coordination/agents/types.d.ts +13 -2
  108. package/dist/coordination/brain-monitor.d.ts +30 -7
  109. package/dist/coordination/collab-debug.d.ts +1 -1
  110. package/dist/coordination/collab-pause.d.ts +1 -1
  111. package/dist/coordination/delegate-tool.d.ts +7 -5
  112. package/dist/coordination/director-kanban-queue-helpers.d.ts +1 -0
  113. package/dist/coordination/director-options.d.ts +7 -0
  114. package/dist/coordination/director-spawn-model.d.ts +17 -0
  115. package/dist/coordination/director-tools.d.ts +2 -2
  116. package/dist/coordination/director.d.ts +12 -0
  117. package/dist/coordination/dispatcher.d.ts +8 -0
  118. package/dist/coordination/fleet-bus.d.ts +35 -4
  119. package/dist/coordination/fleet-supervisor.d.ts +10 -2
  120. package/dist/coordination/fleet.d.ts +16 -7
  121. package/dist/coordination/index.d.ts +4 -0
  122. package/dist/coordination/index.js +86 -49
  123. package/dist/coordination/kanban-dispatch-port.d.ts +2 -2
  124. package/dist/coordination/mailbox-http-router.d.ts +4 -3
  125. package/dist/coordination/mailbox-http-validation.d.ts +1 -1
  126. package/dist/coordination/mailbox-project-server.js +15 -15
  127. package/dist/coordination/mailbox-types.d.ts +24 -6
  128. package/dist/coordination/model-tier-leader.d.ts +122 -0
  129. package/dist/coordination/model-tier.d.ts +122 -0
  130. package/dist/coordination/multi-agent-coordinator.d.ts +24 -0
  131. package/dist/coordination/origin-session.d.ts +16 -0
  132. package/dist/coordination/provider-status-tracker.d.ts +37 -5
  133. package/dist/coordination/session-note-hub.d.ts +44 -0
  134. package/dist/coordination/session-note-tool.d.ts +10 -0
  135. package/dist/core/agent.d.ts +1 -1
  136. package/dist/core/context.d.ts +22 -3
  137. package/dist/core/index.d.ts +2 -0
  138. package/dist/core/index.js +130 -38
  139. package/dist/core/request-conversation-binding.d.ts +37 -0
  140. package/dist/core/session-notes.d.ts +25 -0
  141. package/dist/core/system-prompt-builder.d.ts +11 -2
  142. package/dist/core/system-prompt-variants.d.ts +78 -0
  143. package/dist/design/index.js +3 -3
  144. package/dist/execution/auto-compaction-middleware.d.ts +11 -0
  145. package/dist/execution/autonomy-brain.d.ts +2 -1
  146. package/dist/execution/autonomy-prompt-contributor.d.ts +7 -2
  147. package/dist/execution/compaction-core.d.ts +4 -4
  148. package/dist/execution/eternal-autonomy.d.ts +1 -1
  149. package/dist/execution/index.js +138 -129
  150. package/dist/execution/model-runtime.d.ts +0 -7
  151. package/dist/execution/parallel-eternal-engine.d.ts +7 -7
  152. package/dist/extension/index.js +3 -3
  153. package/dist/goal/index.js +6 -6
  154. package/dist/hooks/index.js +3 -3
  155. package/dist/hq/index.js +14 -12
  156. package/dist/hq/persistence/event-log.d.ts +0 -1
  157. package/dist/hq/persistence.d.ts +4 -4
  158. package/dist/hq/publisher.d.ts +2 -0
  159. package/dist/index.d.ts +14 -11
  160. package/dist/index.js +728 -635
  161. package/dist/infrastructure/index.d.ts +4 -4
  162. package/dist/infrastructure/index.js +281 -260
  163. package/dist/infrastructure/token-counter.d.ts +9 -0
  164. package/dist/kernel/events/agent-events.d.ts +77 -3
  165. package/dist/kernel/events/brain-events.d.ts +12 -0
  166. package/dist/kernel/events/provider-events.d.ts +7 -1
  167. package/dist/kernel/events/session-events.d.ts +14 -0
  168. package/dist/kernel/events/tool-events.d.ts +13 -0
  169. package/dist/kernel/index.js +4 -4
  170. package/dist/mailbox-attach.d.ts +1 -1
  171. package/dist/models/index.js +10 -9
  172. package/dist/observability/event-bridge.d.ts +25 -5
  173. package/dist/observability/index.d.ts +9 -8
  174. package/dist/observability/index.js +459 -351
  175. package/dist/observability/tool-usage-source.d.ts +65 -0
  176. package/dist/plugin/index.d.ts +5 -0
  177. package/dist/plugin/index.js +66 -50
  178. package/dist/plugins/auto-review-plugin.d.ts +3 -2
  179. package/dist/plugins/review-finding-commands.d.ts +0 -8
  180. package/dist/{review-finding-store-DKAV3AS6.js → plugins/review-finding-store.js} +7 -6
  181. package/dist/plugins/review-finding-types.js +19 -0
  182. package/dist/plugins/review-report-integration.js +21 -0
  183. package/dist/{review-report-store-OWY3EC3N.js → plugins/review-report-store.js} +7 -6
  184. package/dist/plugins/review-report-types.js +13 -0
  185. package/dist/prompts/index.js +5 -5
  186. package/dist/registry/index.js +3 -3
  187. package/dist/registry/tool-registry.d.ts +59 -9
  188. package/dist/{registry-R23UBE7H.js → registry-7N4O3E7W.js} +5 -5
  189. package/dist/security/capabilities.d.ts +6 -0
  190. package/dist/security/file-permissions.d.ts +1 -1
  191. package/dist/security/index.js +47 -33
  192. package/dist/security/permission-policy.d.ts +12 -1
  193. package/dist/security/secret-scrubber.d.ts +15 -0
  194. package/dist/session-catalog/index.d.ts +1 -0
  195. package/dist/session-catalog/index.js +19 -14
  196. package/dist/session-catalog/project-server.js +30 -13
  197. package/dist/session-catalog/protocol.d.ts +32 -1
  198. package/dist/session-catalog/registry.d.ts +17 -1
  199. package/dist/session-catalog/session-agents.d.ts +56 -0
  200. package/dist/session-catalog/store-rebuild.d.ts +14 -0
  201. package/dist/session-catalog/store-schema.d.ts +26 -0
  202. package/dist/session-catalog/store.d.ts +27 -1
  203. package/dist/session-note-attach.d.ts +9 -0
  204. package/dist/skills/index.js +5 -5
  205. package/dist/statusline/index.d.ts +43 -0
  206. package/dist/statusline/index.js +102 -0
  207. package/dist/storage/board-store-port.d.ts +2 -2
  208. package/dist/storage/config-loader/in-project-policy.d.ts +29 -0
  209. package/dist/storage/config-loader.d.ts +3 -2
  210. package/dist/storage/file-session-writer.d.ts +4 -2
  211. package/dist/storage/goal-coordination.d.ts +6 -1
  212. package/dist/storage/goal-kanban.d.ts +4 -1
  213. package/dist/storage/index.d.ts +12 -4
  214. package/dist/storage/index.js +76 -61
  215. package/dist/storage/input-history-store.d.ts +2 -4
  216. package/dist/storage/memory-curator.d.ts +133 -0
  217. package/dist/storage/session-agent-attribution.d.ts +39 -0
  218. package/dist/storage/session-doctor.d.ts +109 -0
  219. package/dist/storage/session-event-bridge.d.ts +5 -7
  220. package/dist/storage/session-outcome.d.ts +42 -0
  221. package/dist/storage/session-recovery.d.ts +55 -0
  222. package/dist/storage/session-store/load-session-data.d.ts +11 -0
  223. package/dist/storage/session-store/prune-helpers.d.ts +1 -1
  224. package/dist/storage/session-store/resume-session.d.ts +0 -2
  225. package/dist/storage/session-store/types.d.ts +8 -0
  226. package/dist/storage/session-store.d.ts +3 -3
  227. package/dist/storage/session-summary-tracker.d.ts +8 -1
  228. package/dist/storage/session-write-buffer.d.ts +18 -0
  229. package/dist/storage/session-writer-truncate.d.ts +2 -0
  230. package/dist/tasking/index.js +2 -2
  231. package/dist/tools/fallback-manage-tools.d.ts +6 -4
  232. package/dist/tools/index.js +21 -21
  233. package/dist/tools/model-tier-set-tool.d.ts +66 -0
  234. package/dist/types/agent-bridge.d.ts +2 -1
  235. package/dist/types/config/mcp-features.d.ts +7 -0
  236. package/dist/types/config/model-tiers.d.ts +148 -0
  237. package/dist/types/config/root.d.ts +9 -0
  238. package/dist/types/config/tools.d.ts +73 -0
  239. package/dist/types/config.d.ts +1 -0
  240. package/dist/types/context.d.ts +2 -0
  241. package/dist/types/default-config.d.ts +6 -0
  242. package/dist/types/errors.d.ts +2 -1
  243. package/dist/types/index.d.ts +11 -9
  244. package/dist/types/index.js +25 -15
  245. package/dist/types/multi-agent.d.ts +43 -0
  246. package/dist/types/plugin.d.ts +1 -1
  247. package/dist/types/provider.d.ts +15 -0
  248. package/dist/types/runtime-capability-manifest.d.ts +1 -1
  249. package/dist/types/secret-scrubber.d.ts +15 -0
  250. package/dist/types/session-markers.d.ts +37 -10
  251. package/dist/types/session-markers.js +1 -1
  252. package/dist/types/session-timeline.d.ts +197 -0
  253. package/dist/types/session-timeline.js +12 -0
  254. package/dist/types/session.d.ts +172 -11
  255. package/dist/types/system-prompt.d.ts +27 -0
  256. package/dist/utils/config-backup.d.ts +9 -1
  257. package/dist/utils/heap-watchdog.js +2 -2
  258. package/dist/utils/index.js +50 -48
  259. package/dist/utils/message-invariants.d.ts +4 -1
  260. package/dist/utils/regex-guard.d.ts +1 -1
  261. package/dist/utils/socket-path.d.ts +1 -1
  262. package/dist/utils/token-estimate.d.ts +6 -2
  263. package/dist/utils/wstack-paths.d.ts +2 -0
  264. package/dist/wiring/proxy-rewrite.d.ts +28 -0
  265. package/dist/wiring/proxy-rewrite.js +7 -1
  266. package/dist/worktree/index.js +2 -2
  267. package/instructions/agents/explore-companion.md +45 -18
  268. package/instructions/agents/memory-curator.md +34 -22
  269. package/instructions/coordination/director-preamble.md +12 -7
  270. package/instructions/coordination/subagent-baseline.md +26 -5
  271. package/instructions/leader-after-task.md +4 -1
  272. package/instructions/llm/chimera-review.md +30 -9
  273. package/instructions/llm/memory-curator.md +31 -0
  274. package/instructions/sections/tool/delegation-compact.md +2 -0
  275. package/instructions/sections/tool/delegation-full.md +5 -1
  276. package/instructions/sections/tool/mailbox-compact.md +5 -1
  277. package/instructions/sections/tool/mailbox-full.md +3 -0
  278. package/instructions/sections/tool/session-note-compact.md +3 -0
  279. package/instructions/sections/tool/session-note-full.md +15 -0
  280. package/instructions/system-lite.md +9 -4
  281. package/instructions/system-pro.md +66 -143
  282. package/instructions/system.md +73 -175
  283. package/package.json +33 -5
  284. package/dist/chunk-2BUUIMQB.js +0 -225
  285. package/dist/chunk-FAYRX2AD.js +0 -13
  286. package/dist/chunk-H5E77KUJ.js +0 -15
  287. package/dist/chunk-M7BS2K6U.js +0 -1
  288. package/dist/coordination/agents.d.ts +0 -8
  289. package/dist/coordination/transport.d.ts +0 -2
  290. package/dist/storage/session-writer/session-writer-summary-tracker.d.ts +0 -28
@@ -1,23 +1,86 @@
1
+ import {
2
+ shouldSkipSessionDirectoryEntry
3
+ } from "./chunk-JMULFFLN.js";
1
4
  import {
2
5
  SESSION_CATALOG_DEFAULT_LEASE_MS,
3
6
  SESSION_CATALOG_DEFAULT_RESERVATION_MS,
4
7
  SESSION_CATALOG_MAX_AGENTS
5
- } from "./chunk-E6I5RXVK.js";
8
+ } from "./chunk-AYW5YINX.js";
9
+ import {
10
+ isSessionTranscriptFileName
11
+ } from "./chunk-5BMIE7QG.js";
6
12
  import {
7
13
  loadDatabaseSync
8
- } from "./chunk-GM54GJBU.js";
14
+ } from "./chunk-IRUTEHCE.js";
9
15
  import {
10
16
  DefaultSecretScrubber
11
- } from "./chunk-3E244UDA.js";
12
- import {
13
- isSessionTranscriptFileName
14
- } from "./chunk-AD7ZFZCS.js";
17
+ } from "./chunk-QSTSJOCK.js";
15
18
  import {
16
19
  isPidAlive
17
20
  } from "./chunk-TRT2HRWZ.js";
18
21
  import {
19
22
  atomicWrite
20
- } from "./chunk-7ZHZE5EO.js";
23
+ } from "./chunk-OSGLYW5J.js";
24
+ import {
25
+ totalUsageTokens
26
+ } from "./chunk-3ECENVHL.js";
27
+
28
+ // src/session-catalog/session-agents.ts
29
+ function deriveSessionAgents(events) {
30
+ const rows = /* @__PURE__ */ new Map();
31
+ const upsert = (agentId) => {
32
+ let row = rows.get(agentId);
33
+ if (!row) {
34
+ row = { agentId, status: "running", interleavedEventCount: 0 };
35
+ rows.set(agentId, row);
36
+ }
37
+ return row;
38
+ };
39
+ for (const event of events) {
40
+ if (event.agentId !== void 0 && event.agentId !== "") {
41
+ const isLifecycle = event.type === "agent_spawned" || event.type === "agent_session_linked" || event.type === "agent_stopped" || event.type === "agent_error";
42
+ const row = upsert(event.agentId);
43
+ if (!isLifecycle) row.interleavedEventCount += 1;
44
+ }
45
+ switch (event.type) {
46
+ case "agent_spawned": {
47
+ const row = upsert(event.agentId);
48
+ row.role = event.role;
49
+ row.spawnedAt ??= event.ts;
50
+ break;
51
+ }
52
+ case "agent_session_linked": {
53
+ const row = upsert(event.agentId);
54
+ row.agentSessionId = event.agentSessionId;
55
+ if (event.transcriptPath !== void 0) row.transcriptPath = event.transcriptPath;
56
+ if (event.provider !== void 0) row.provider = event.provider;
57
+ if (event.model !== void 0) row.model = event.model;
58
+ if (event.parentAgentId !== void 0) row.parentAgentId = event.parentAgentId;
59
+ row.spawnedAt ??= event.ts;
60
+ break;
61
+ }
62
+ case "agent_stopped": {
63
+ const row = upsert(event.agentId);
64
+ row.endedAt = event.ts;
65
+ if (row.status !== "failed") {
66
+ row.status = event.reason === "failed" || event.reason === "aborted" ? "failed" : "completed";
67
+ }
68
+ if (event.usage !== void 0) row.usage = event.usage;
69
+ break;
70
+ }
71
+ case "agent_error": {
72
+ const row = upsert(event.agentId);
73
+ row.status = "failed";
74
+ row.error = event.error;
75
+ row.endedAt ??= event.ts;
76
+ break;
77
+ }
78
+ default:
79
+ break;
80
+ }
81
+ }
82
+ return [...rows.values()];
83
+ }
21
84
 
22
85
  // src/session-catalog/store.ts
23
86
  import { randomBytes, randomUUID } from "node:crypto";
@@ -122,6 +185,30 @@ function initializeCatalogSchema(db) {
122
185
  acquired_at INTEGER NOT NULL,
123
186
  expires_at INTEGER NOT NULL
124
187
  );
188
+ CREATE TABLE IF NOT EXISTS session_agents (
189
+ session_id TEXT NOT NULL,
190
+ agent_id TEXT NOT NULL,
191
+ role TEXT,
192
+ provider TEXT,
193
+ model TEXT,
194
+ agent_session_id TEXT,
195
+ transcript_path TEXT,
196
+ parent_agent_id TEXT,
197
+ spawned_at TEXT,
198
+ ended_at TEXT,
199
+ status TEXT NOT NULL,
200
+ error TEXT,
201
+ interleaved_event_count INTEGER NOT NULL DEFAULT 0,
202
+ usage_json TEXT,
203
+ ordinal INTEGER NOT NULL DEFAULT 0,
204
+ PRIMARY KEY (session_id, agent_id)
205
+ );
206
+ CREATE TABLE IF NOT EXISTS session_agent_index (
207
+ session_id TEXT PRIMARY KEY,
208
+ transcript_size INTEGER NOT NULL,
209
+ transcript_mtime_ms REAL NOT NULL,
210
+ derived_at TEXT NOT NULL
211
+ );
125
212
  CREATE INDEX IF NOT EXISTS idx_sessions_activity ON sessions(indexed_at DESC);
126
213
  CREATE INDEX IF NOT EXISTS idx_leases_expiry ON session_leases(lease_expires_at);
127
214
  CREATE INDEX IF NOT EXISTS idx_reservations_expiry ON resume_reservations(expires_at);
@@ -140,7 +227,9 @@ function walkSessionFiles(root, suffix) {
140
227
  const visit = (dir) => {
141
228
  for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
142
229
  if (entry.isDirectory()) {
143
- if (entry.name !== "_cas" && entry.name !== "_trash") visit(path.join(dir, entry.name));
230
+ if (entry.name === "_cas" || entry.name === "_trash") continue;
231
+ if (shouldSkipSessionDirectoryEntry(entry.name)) continue;
232
+ visit(path.join(dir, entry.name));
144
233
  } else if (entry.isFile() && entry.name.endsWith(suffix))
145
234
  result.push(path.join(dir, entry.name));
146
235
  }
@@ -158,6 +247,8 @@ function summarizeTranscriptFile(transcriptFilePath, id) {
158
247
  let toolCallCount = 0;
159
248
  let compactionCount = 0;
160
249
  let tokenTotal = 0;
250
+ let routedModel;
251
+ let routedProvider;
161
252
  for (const line of lines) {
162
253
  if (!line) continue;
163
254
  let event;
@@ -173,7 +264,9 @@ function summarizeTranscriptFile(transcriptFilePath, id) {
173
264
  messageCount++;
174
265
  if (event.type === "llm_response") {
175
266
  iterationCount++;
176
- tokenTotal += event.usage.input + event.usage.output + (event.usage.cacheRead ?? 0) + (event.usage.cacheWrite ?? 0);
267
+ tokenTotal += totalUsageTokens(event.usage);
268
+ if (event.model) routedModel = event.model;
269
+ if (event.provider) routedProvider = event.provider;
177
270
  }
178
271
  if (event.type === "tool_call_end") toolCallCount++;
179
272
  if (event.type === "compaction") compactionCount++;
@@ -184,8 +277,8 @@ function summarizeTranscriptFile(transcriptFilePath, id) {
184
277
  title: id,
185
278
  startedAt: start.ts,
186
279
  ...endedAt ? { endedAt } : {},
187
- model: start.model,
188
- provider: start.provider,
280
+ model: routedModel ?? start.model,
281
+ provider: routedProvider ?? start.provider,
189
282
  tokenTotal,
190
283
  ...lastActivityAt ? { lastActivityAt } : {},
191
284
  messageCount,
@@ -478,6 +571,30 @@ var SessionCatalogStore = class {
478
571
  return credential;
479
572
  });
480
573
  }
574
+ /**
575
+ * Extend a live reservation the requester still owns.
576
+ *
577
+ * Deliberately does NOT call `reapExpired()` first: reaping would delete an
578
+ * already-expired row and turn the accurate "expired" answer into the
579
+ * indistinguishable "not owned by this requester". The caller needs to know
580
+ * which of the two happened.
581
+ */
582
+ renewReservation(reservationId, requesterInstanceId, reservationMs) {
583
+ return this.transaction(() => {
584
+ const row = this.db.prepare("SELECT * FROM resume_reservations WHERE reservation_id=?").get(reservationId);
585
+ if (!row || row.requester_instance_id !== requesterInstanceId)
586
+ throw conflict("Resume reservation is not owned by this requester");
587
+ if (row.expires_at <= Date.now()) throw conflict("Resume reservation expired");
588
+ const expiresAt = Date.now() + boundedMs(reservationMs, SESSION_CATALOG_DEFAULT_RESERVATION_MS, MAX_RESERVATION_MS);
589
+ this.db.prepare("UPDATE resume_reservations SET expires_at=? WHERE reservation_id=?").run(expiresAt, reservationId);
590
+ return {
591
+ reservationId,
592
+ targetSessionId: row.target_session_id,
593
+ requesterInstanceId,
594
+ expiresAt
595
+ };
596
+ });
597
+ }
481
598
  cancelReservation(reservationId, requesterInstanceId) {
482
599
  this.db.prepare("DELETE FROM resume_reservations WHERE reservation_id=? AND requester_instance_id=?").run(reservationId, requesterInstanceId);
483
600
  }
@@ -677,6 +794,105 @@ var SessionCatalogStore = class {
677
794
  const row = this.db.prepare("SELECT * FROM sessions WHERE session_id=?").get(sessionId);
678
795
  return row ? this.catalogRecord(row) : null;
679
796
  }
797
+ /**
798
+ * The agent roster of one session, derived from its journal.
799
+ *
800
+ * Cached in `session_agents`, keyed to the transcript's size and mtime: the
801
+ * journal is the authority, so the cache is a memo of a pure function over
802
+ * it rather than a second place agents get recorded. When the file has grown
803
+ * (the usual case — a live session) the rows are re-derived from scratch, so
804
+ * a partial read can never leave a half-updated roster behind.
805
+ *
806
+ * Returns `[]` for a session with no transcript on disk. A caller cannot
807
+ * distinguish that from "a real session that spawned nothing", and should
808
+ * not need to: both mean there is no agent to show.
809
+ */
810
+ listSessionAgents(sessionId) {
811
+ assertId(sessionId);
812
+ const summary = this.getSummary(sessionId);
813
+ if (!summary) return [];
814
+ const file = path2.join(this.sessionsDir, summary.transcriptRelativePath);
815
+ let stat;
816
+ try {
817
+ stat = fs2.statSync(file);
818
+ } catch {
819
+ return [];
820
+ }
821
+ const cached = this.db.prepare(
822
+ "SELECT transcript_size, transcript_mtime_ms FROM session_agent_index WHERE session_id=?"
823
+ ).get(sessionId);
824
+ if (cached && Number(cached.transcript_size) === stat.size && Number(cached.transcript_mtime_ms) === stat.mtimeMs) {
825
+ return this.readSessionAgentRows(sessionId);
826
+ }
827
+ let raw;
828
+ try {
829
+ raw = fs2.readFileSync(file, "utf8");
830
+ } catch {
831
+ return [];
832
+ }
833
+ const events = [];
834
+ for (const line of raw.split("\n")) {
835
+ const trimmed = line.trim();
836
+ if (!trimmed) continue;
837
+ try {
838
+ events.push(JSON.parse(trimmed));
839
+ } catch {
840
+ }
841
+ }
842
+ const derived = deriveSessionAgents(events);
843
+ this.writeSessionAgentRows(sessionId, derived, stat.size, stat.mtimeMs);
844
+ return derived;
845
+ }
846
+ readSessionAgentRows(sessionId) {
847
+ const rows = this.db.prepare("SELECT * FROM session_agents WHERE session_id=? ORDER BY ordinal ASC").all(sessionId);
848
+ return rows.map((row) => ({
849
+ agentId: row.agent_id,
850
+ ...row.role !== null ? { role: row.role } : {},
851
+ ...row.provider !== null ? { provider: row.provider } : {},
852
+ ...row.model !== null ? { model: row.model } : {},
853
+ ...row.agent_session_id !== null ? { agentSessionId: row.agent_session_id } : {},
854
+ ...row.transcript_path !== null ? { transcriptPath: row.transcript_path } : {},
855
+ ...row.parent_agent_id !== null ? { parentAgentId: row.parent_agent_id } : {},
856
+ ...row.spawned_at !== null ? { spawnedAt: row.spawned_at } : {},
857
+ ...row.ended_at !== null ? { endedAt: row.ended_at } : {},
858
+ status: row.status,
859
+ ...row.error !== null ? { error: row.error } : {},
860
+ interleavedEventCount: Number(row.interleaved_event_count),
861
+ ...row.usage_json !== null ? { usage: parseJson(row.usage_json) } : {}
862
+ }));
863
+ }
864
+ writeSessionAgentRows(sessionId, records, size, mtimeMs) {
865
+ this.transaction(() => {
866
+ this.db.prepare("DELETE FROM session_agents WHERE session_id=?").run(sessionId);
867
+ const insert = this.db.prepare(
868
+ `INSERT INTO session_agents(session_id,agent_id,role,provider,model,agent_session_id,transcript_path,parent_agent_id,spawned_at,ended_at,status,error,interleaved_event_count,usage_json,ordinal)
869
+ VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)`
870
+ );
871
+ records.forEach((record, ordinal) => {
872
+ insert.run(
873
+ sessionId,
874
+ record.agentId,
875
+ record.role ?? null,
876
+ record.provider ?? null,
877
+ record.model ?? null,
878
+ record.agentSessionId ?? null,
879
+ record.transcriptPath ?? null,
880
+ record.parentAgentId ?? null,
881
+ record.spawnedAt ?? null,
882
+ record.endedAt ?? null,
883
+ record.status,
884
+ record.error ?? null,
885
+ record.interleavedEventCount,
886
+ record.usage ? JSON.stringify(record.usage) : null,
887
+ ordinal
888
+ );
889
+ });
890
+ this.db.prepare(
891
+ `INSERT INTO session_agent_index(session_id,transcript_size,transcript_mtime_ms,derived_at)
892
+ VALUES (?,?,?,?) ON CONFLICT(session_id) DO UPDATE SET transcript_size=excluded.transcript_size,transcript_mtime_ms=excluded.transcript_mtime_ms,derived_at=excluded.derived_at`
893
+ ).run(sessionId, size, mtimeMs, (/* @__PURE__ */ new Date()).toISOString());
894
+ });
895
+ }
680
896
  resolveId(query) {
681
897
  const normalized = query.trim();
682
898
  if (!normalized) throw new Error("Session not found: (empty query)");
@@ -851,6 +1067,7 @@ var SessionCatalogStore = class {
851
1067
  };
852
1068
 
853
1069
  export {
1070
+ deriveSessionAgents,
854
1071
  SessionCatalogStore
855
1072
  };
856
- //# sourceMappingURL=chunk-AI4LLQ2U.js.map
1073
+ //# sourceMappingURL=chunk-27QIURLN.js.map