@ai-devkit/agent-manager 0.35.0 → 0.37.0

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 (651) hide show
  1. package/dist/AgentManager.d.ts +9 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +21 -2
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +151 -3
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
  8. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
  9. package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
  10. package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
  11. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
  12. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
  13. package/dist/__tests__/capacity/claude.test.js +485 -0
  14. package/dist/__tests__/capacity/claude.test.js.map +1 -0
  15. package/dist/__tests__/capacity/openai.test.js +670 -0
  16. package/dist/__tests__/capacity/openai.test.js.map +1 -0
  17. package/dist/__tests__/capacity/wham.test.js +144 -0
  18. package/dist/__tests__/capacity/wham.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  20. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  21. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  22. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  24. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  25. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
  26. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  27. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  28. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  30. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  31. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  32. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  33. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  34. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  35. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  36. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  38. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  41. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  42. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  43. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  44. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  45. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  46. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  47. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  48. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  49. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  50. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  51. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  52. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  54. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  56. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  59. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  60. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  61. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  62. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  64. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  65. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  66. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  67. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  68. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  69. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  70. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  71. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  72. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  73. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  74. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  78. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  79. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  80. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  81. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  82. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  83. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
  84. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  90. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  91. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  92. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  94. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  95. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  96. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  97. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  98. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  99. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  105. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  106. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  107. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  108. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  109. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  110. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  111. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  112. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  113. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  114. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  115. package/dist/__tests__/utils/agents.test.js +72 -2
  116. package/dist/__tests__/utils/agents.test.js.map +1 -1
  117. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  118. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  119. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  120. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  121. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  122. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  123. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  124. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  125. package/dist/__tests__/utils/process.test.js +436 -2
  126. package/dist/__tests__/utils/process.test.js.map +1 -1
  127. package/dist/adapters/AgentAdapter.d.ts +25 -6
  128. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  129. package/dist/adapters/AgentAdapter.js +12 -3
  130. package/dist/adapters/AgentAdapter.js.map +1 -1
  131. package/dist/capacity/claude.d.ts +17 -0
  132. package/dist/capacity/claude.d.ts.map +1 -0
  133. package/dist/capacity/claude.js +271 -0
  134. package/dist/capacity/claude.js.map +1 -0
  135. package/dist/capacity/codex.d.ts +1 -2
  136. package/dist/capacity/codex.d.ts.map +1 -1
  137. package/dist/capacity/codex.js +5 -47
  138. package/dist/capacity/codex.js.map +1 -1
  139. package/dist/capacity/index.d.ts +11 -0
  140. package/dist/capacity/index.d.ts.map +1 -1
  141. package/dist/capacity/index.js +17 -0
  142. package/dist/capacity/index.js.map +1 -1
  143. package/dist/capacity/openai.d.ts +47 -0
  144. package/dist/capacity/openai.d.ts.map +1 -0
  145. package/dist/capacity/openai.js +307 -0
  146. package/dist/capacity/openai.js.map +1 -0
  147. package/dist/capacity/wham.d.ts +16 -0
  148. package/dist/capacity/wham.d.ts.map +1 -0
  149. package/dist/capacity/wham.js +66 -0
  150. package/dist/capacity/wham.js.map +1 -0
  151. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  152. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  153. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  154. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  155. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  156. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  157. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  158. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  159. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  160. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  161. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  162. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  163. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  164. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  165. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  166. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  167. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  169. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  170. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  171. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  172. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  173. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  174. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  175. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  176. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  177. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  178. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  179. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  180. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  181. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  182. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  183. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  184. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  185. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  186. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  187. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  190. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  191. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  192. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  193. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  195. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  196. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  197. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  198. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  199. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  200. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  201. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  202. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  203. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  204. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  205. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  206. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  207. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  208. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  209. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  210. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  211. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  212. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  213. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  214. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  215. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  216. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  217. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  218. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  219. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  220. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  221. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  222. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  223. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  224. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  225. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  226. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  227. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  228. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  229. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  230. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  231. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  232. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  233. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  234. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  235. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  236. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  237. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  238. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  239. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  240. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  241. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  242. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  243. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  244. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  245. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  246. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  247. package/dist/harnesses/gemini/fileSignature.js +9 -0
  248. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  249. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  250. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  251. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  252. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  253. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  254. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  255. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  256. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  257. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  258. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  259. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  260. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  262. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  263. package/dist/harnesses/index.d.ts +7 -0
  264. package/dist/harnesses/index.d.ts.map +1 -0
  265. package/dist/harnesses/index.js +27 -0
  266. package/dist/harnesses/index.js.map +1 -0
  267. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  268. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  269. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  270. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  271. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  272. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  273. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  274. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  275. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  276. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  277. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  278. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  279. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  280. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  281. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  282. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  283. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  284. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  285. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  286. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  287. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  288. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  289. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  290. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  291. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  292. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  293. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  294. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  295. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  296. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  297. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  298. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  299. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  300. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  301. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  303. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  304. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  305. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  306. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  307. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  308. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  309. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  310. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  311. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  312. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  313. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  314. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  315. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  316. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  317. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  318. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  319. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  320. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  321. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  322. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  323. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  324. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  325. package/dist/harnesses/shared.d.ts +41 -0
  326. package/dist/harnesses/shared.d.ts.map +1 -0
  327. package/dist/harnesses/shared.js +71 -0
  328. package/dist/harnesses/shared.js.map +1 -0
  329. package/dist/index.d.ts +28 -25
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +19 -16
  332. package/dist/index.js.map +1 -1
  333. package/dist/readiness/AgentReadiness.d.ts +1 -1
  334. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  335. package/dist/readiness/AgentReadiness.js.map +1 -1
  336. package/dist/runtime/ManagedAgentRuntime.js +3 -1
  337. package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
  338. package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
  339. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
  340. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  341. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  342. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  343. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  344. package/dist/utils/agents.d.ts +3 -2
  345. package/dist/utils/agents.d.ts.map +1 -1
  346. package/dist/utils/agents.js +61 -15
  347. package/dist/utils/agents.js.map +1 -1
  348. package/dist/utils/index.d.ts +2 -1
  349. package/dist/utils/index.d.ts.map +1 -1
  350. package/dist/utils/index.js +1 -1
  351. package/dist/utils/index.js.map +1 -1
  352. package/dist/utils/jsonlTail.d.ts +73 -0
  353. package/dist/utils/jsonlTail.d.ts.map +1 -0
  354. package/dist/utils/jsonlTail.js +238 -0
  355. package/dist/utils/jsonlTail.js.map +1 -0
  356. package/dist/utils/matching.d.ts +2 -0
  357. package/dist/utils/matching.d.ts.map +1 -1
  358. package/dist/utils/matching.js +3 -2
  359. package/dist/utils/matching.js.map +1 -1
  360. package/dist/utils/matchingConstants.d.ts +15 -0
  361. package/dist/utils/matchingConstants.d.ts.map +1 -0
  362. package/dist/utils/matchingConstants.js +14 -0
  363. package/dist/utils/matchingConstants.js.map +1 -0
  364. package/dist/utils/process.d.ts +38 -2
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +131 -43
  367. package/dist/utils/process.js.map +1 -1
  368. package/package.json +2 -1
  369. package/scripts/benchmark-cold-start.mjs +350 -0
  370. package/src/AgentManager.ts +26 -5
  371. package/src/__tests__/AgentManager.test.ts +141 -3
  372. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  373. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  374. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  375. package/src/__tests__/capacity/claude.test.ts +467 -0
  376. package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
  377. package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
  378. package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
  379. package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
  380. package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
  381. package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
  382. package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
  383. package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
  384. package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
  385. package/src/__tests__/capacity/openai.test.ts +560 -0
  386. package/src/__tests__/capacity/wham.test.ts +104 -0
  387. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  388. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  389. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  390. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
  391. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  392. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  393. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  394. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  395. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  396. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  397. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  398. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  399. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  400. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  401. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  402. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  403. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  404. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  405. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  406. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  407. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  408. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  409. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  410. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  411. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  412. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  413. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  414. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  415. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  416. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  417. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  418. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  419. package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
  420. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  421. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  422. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  423. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  424. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  425. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  426. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  427. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  428. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  429. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  430. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  431. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  432. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  433. package/src/__tests__/utils/agents.test.ts +83 -2
  434. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  435. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  436. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  437. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  438. package/src/__tests__/utils/process.test.ts +254 -0
  439. package/src/adapters/AgentAdapter.ts +37 -12
  440. package/src/capacity/claude.ts +313 -0
  441. package/src/capacity/codex.ts +25 -134
  442. package/src/capacity/index.ts +33 -4
  443. package/src/capacity/openai.ts +355 -0
  444. package/src/capacity/wham.ts +84 -0
  445. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  446. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  447. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  448. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  449. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  450. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  451. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  452. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  453. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  454. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  455. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  456. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  457. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  458. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  459. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  460. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  461. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  462. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  463. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  464. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  465. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  466. package/src/harnesses/gemini/fileSignature.ts +10 -0
  467. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  468. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  469. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  470. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  471. package/src/harnesses/index.ts +28 -0
  472. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  473. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  474. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  475. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  476. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  477. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  478. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  479. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  480. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  481. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  482. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  483. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  484. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  485. package/src/harnesses/shared.ts +119 -0
  486. package/src/index.ts +34 -23
  487. package/src/readiness/AgentReadiness.ts +4 -1
  488. package/src/runtime/ManagedAgentRuntime.ts +2 -0
  489. package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
  490. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  491. package/src/utils/agents.ts +62 -20
  492. package/src/utils/index.ts +2 -0
  493. package/src/utils/jsonlTail.ts +349 -0
  494. package/src/utils/matching.ts +3 -3
  495. package/src/utils/matchingConstants.ts +15 -0
  496. package/src/utils/process.ts +189 -45
  497. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  498. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  499. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  500. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  501. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  502. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  503. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  504. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  505. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  506. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  507. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  508. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  509. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  510. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  511. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  512. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  513. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  514. package/dist/adapters/index.d.ts +0 -10
  515. package/dist/adapters/index.d.ts.map +0 -1
  516. package/dist/adapters/index.js +0 -10
  517. package/dist/adapters/index.js.map +0 -1
  518. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  519. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  520. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  521. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  522. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  523. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  524. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  525. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  526. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  527. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  528. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  529. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  530. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  531. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  532. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  533. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  534. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  535. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  536. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  537. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  538. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  539. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  541. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  542. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  543. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  544. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  545. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  546. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  547. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  548. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  549. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  550. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  551. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  552. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  553. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  554. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  555. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  556. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  557. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  558. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  559. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  560. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  561. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  562. package/dist/providers/grok/GrokSessionParser.js +0 -122
  563. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  564. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  565. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  566. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  567. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  568. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  569. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  570. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  571. package/dist/providers/pi/PiAdapter.js.map +0 -1
  572. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  573. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  574. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  575. package/dist/providers/pi/PiSessionLocator.js +0 -86
  576. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  577. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  578. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  579. package/dist/providers/pi/PiSessionParser.js +0 -191
  580. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  581. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  582. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  583. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  584. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  585. package/src/adapters/index.ts +0 -15
  586. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  587. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  588. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  589. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  590. package/src/providers/grok/GrokSessionParser.ts +0 -166
  591. package/src/providers/pi/PiSessionLocator.ts +0 -110
  592. package/src/providers/pi/PiSessionParser.ts +0 -284
  593. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  594. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  595. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  596. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  597. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  598. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  600. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  601. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  602. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  603. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  604. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  605. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  606. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  607. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  608. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  609. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  610. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  611. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  612. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  613. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  614. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  615. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  616. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  617. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  618. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  619. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  620. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  621. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  622. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  623. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  624. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  625. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  626. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  627. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  628. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  629. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  630. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  631. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  632. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  633. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  634. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  635. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  636. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  637. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  638. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  639. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  640. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  641. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  642. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  643. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  644. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  645. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  646. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  647. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  648. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  649. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  650. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  651. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -0,0 +1,726 @@
1
+ /**
2
+ * Equivalence between the incremental session summaries used on refresh and
3
+ * the full-file parse of Claude, Codex, Kiro and Antigravity transcripts.
4
+ *
5
+ * `legacyClaudeReadSession` / `legacyCodexReadSession` are verbatim copies of
6
+ * the pre-incremental `readSession` algorithms, kept here as an oracle. Kiro
7
+ * and Antigravity are checked against their own full `readSession`.
8
+ */
9
+
10
+ import * as fs from "fs";
11
+ import * as os from "os";
12
+ import * as path from "path";
13
+
14
+ import { AntigravitySessionParser } from "../../harnesses/antigravity/AntigravitySessionParser.js";
15
+ import { ClaudeSessionParser } from "../../harnesses/claude/ClaudeSessionParser.js";
16
+ import { CodexSessionParser } from "../../harnesses/codex/CodexSessionParser.js";
17
+ import { KiroSessionParser } from "../../harnesses/kiro/KiroSessionParser.js";
18
+ import { parseTimestamp, truncate } from "../../harnesses/shared.js";
19
+
20
+ const CONVERSATION_ENTRY_TYPES = new Set(["user", "assistant", "system", "progress", "thinking"]);
21
+
22
+ function legacyClaudeReadSession(
23
+ parser: ClaudeSessionParser,
24
+ filePath: string,
25
+ projectPath: string,
26
+ ) {
27
+ const p = parser as any;
28
+ const sessionId = path.basename(filePath, ".jsonl");
29
+ const content = fs.readFileSync(filePath, "utf-8");
30
+ const allLines = content.trim().split("\n");
31
+
32
+ let sessionStart: Date | null = null;
33
+ try {
34
+ const firstEntry = JSON.parse(allLines[0]);
35
+ const rawTs: string | undefined = firstEntry.timestamp || firstEntry.snapshot?.timestamp;
36
+ if (rawTs && !Number.isNaN(new Date(rawTs).getTime())) sessionStart = new Date(rawTs);
37
+ } catch {
38
+ /* malformed first line */
39
+ }
40
+
41
+ let lastEntryType: string | undefined;
42
+ let lastActive: Date | undefined;
43
+ let lastCwd: string | undefined;
44
+ let isInterrupted = false;
45
+ let lastUserMessage: string | undefined;
46
+ let firstUserMessage: string | undefined;
47
+
48
+ for (const line of allLines) {
49
+ try {
50
+ const entry = JSON.parse(line);
51
+ if (entry.timestamp) {
52
+ const ts = new Date(entry.timestamp);
53
+ if (!Number.isNaN(ts.getTime())) lastActive = ts;
54
+ }
55
+ if (typeof entry.cwd === "string" && entry.cwd.trim().length > 0) lastCwd = entry.cwd;
56
+ if (entry.type && CONVERSATION_ENTRY_TYPES.has(entry.type)) {
57
+ lastEntryType = entry.type;
58
+ if (entry.type === "user") {
59
+ const msgContent = entry.message?.content;
60
+ isInterrupted =
61
+ Array.isArray(msgContent) &&
62
+ msgContent.some(
63
+ (c: any) =>
64
+ (c.type === "text" && c.text?.includes("[Request interrupted")) ||
65
+ (c.type === "tool_result" && c.content?.includes("[Request interrupted")),
66
+ );
67
+ const text = p.extractUserMessageText(msgContent);
68
+ if (text) {
69
+ lastUserMessage = text;
70
+ if (!firstUserMessage) firstUserMessage = text;
71
+ }
72
+ } else {
73
+ isInterrupted = false;
74
+ }
75
+ }
76
+ } catch {
77
+ continue;
78
+ }
79
+ }
80
+
81
+ return {
82
+ sessionId,
83
+ projectPath: projectPath || lastCwd || "",
84
+ lastCwd,
85
+ sessionStart: sessionStart || lastActive || new Date(),
86
+ lastActive: lastActive || new Date(),
87
+ lastEntryType,
88
+ isInterrupted,
89
+ lastUserMessage,
90
+ firstUserMessage,
91
+ };
92
+ }
93
+
94
+ function legacyCodexReadSession(parser: CodexSessionParser, filePath: string) {
95
+ const p = parser as any;
96
+ const content = fs.readFileSync(filePath, "utf-8");
97
+ const allLines = content.trim().split("\n");
98
+ if (!allLines[0]) return null;
99
+
100
+ let metaEntry: any;
101
+ try {
102
+ metaEntry = JSON.parse(allLines[0]);
103
+ } catch {
104
+ return null;
105
+ }
106
+ if (metaEntry?.type !== "session_meta" || !metaEntry.payload?.id) return null;
107
+
108
+ const entries: any[] = [];
109
+ for (const line of allLines) {
110
+ try {
111
+ entries.push(JSON.parse(line));
112
+ } catch {
113
+ continue;
114
+ }
115
+ }
116
+
117
+ let lastEntry: any;
118
+ for (let i = entries.length - 1; i >= 0; i--) {
119
+ if (entries[i] && typeof entries[i].type === "string") {
120
+ lastEntry = entries[i];
121
+ break;
122
+ }
123
+ }
124
+ let summary = "Codex session active";
125
+ for (let i = entries.length - 1; i >= 0; i--) {
126
+ const message = p.extractEntryText(entries[i]);
127
+ if (message) {
128
+ summary = truncate(message, 120);
129
+ break;
130
+ }
131
+ }
132
+
133
+ const lastActive =
134
+ parseTimestamp(lastEntry?.timestamp) ||
135
+ parseTimestamp(metaEntry.payload.timestamp) ||
136
+ fs.statSync(filePath).mtime;
137
+ const sessionStart = parseTimestamp(metaEntry.payload.timestamp) || lastActive;
138
+
139
+ return {
140
+ sessionId: metaEntry.payload.id,
141
+ projectPath: metaEntry.payload.cwd || "",
142
+ summary,
143
+ sessionStart,
144
+ lastActive,
145
+ lastPayloadType: lastEntry ? p.normalizedPayloadType(lastEntry) : undefined,
146
+ };
147
+ }
148
+
149
+ const text = (value: string) => [{ type: "text", text: value }];
150
+
151
+ /** Synthetic transcripts covering the shapes used by the existing Claude fixtures. */
152
+ const claudeFixtures: Record<string, unknown[]> = {
153
+ basic: [
154
+ {
155
+ type: "user",
156
+ timestamp: "2026-03-10T10:00:00Z",
157
+ cwd: "/my/project",
158
+ message: { content: "hello" },
159
+ },
160
+ { type: "assistant", timestamp: "2026-03-10T10:01:00Z", message: { content: text("hi") } },
161
+ ],
162
+ interrupted: [
163
+ { type: "assistant", timestamp: "2026-03-10T10:00:00Z" },
164
+ {
165
+ type: "user",
166
+ timestamp: "2026-03-10T10:01:00Z",
167
+ message: { content: text("[Request interrupted by user for tool use]") },
168
+ },
169
+ ],
170
+ interruptedToolResult: [
171
+ {
172
+ type: "user",
173
+ timestamp: "2026-03-10T10:00:00Z",
174
+ message: { content: [{ type: "tool_result", content: "[Request interrupted by user]" }] },
175
+ },
176
+ ],
177
+ metadataTail: [
178
+ { type: "user", timestamp: "2026-03-10T10:00:00Z", message: { content: text("question") } },
179
+ { type: "assistant", timestamp: "2026-03-10T10:01:00Z" },
180
+ { type: "last-prompt", timestamp: "2026-03-10T10:02:00Z" },
181
+ { type: "file-history-snapshot", timestamp: "2026-03-10T10:03:00Z" },
182
+ ],
183
+ snapshotFirst: [
184
+ { type: "file-history-snapshot", snapshot: { timestamp: "2026-03-10T09:59:00Z" } },
185
+ {
186
+ type: "user",
187
+ timestamp: "2026-03-10T10:00:00Z",
188
+ cwd: "/repo",
189
+ message: { content: "start" },
190
+ },
191
+ { type: "assistant", timestamp: "2026-03-10T10:01:00Z" },
192
+ ],
193
+ multipleUsers: [
194
+ {
195
+ type: "user",
196
+ timestamp: "2026-03-10T10:00:00Z",
197
+ message: { content: text("first question") },
198
+ },
199
+ { type: "assistant", timestamp: "2026-03-10T10:01:00Z" },
200
+ {
201
+ type: "user",
202
+ timestamp: "2026-03-10T10:02:00Z",
203
+ message: { content: text("second question") },
204
+ },
205
+ { type: "assistant", timestamp: "2026-03-10T10:03:00Z" },
206
+ ],
207
+ commandsAndSkills: [
208
+ {
209
+ type: "user",
210
+ timestamp: "2026-03-10T10:00:00Z",
211
+ message: {
212
+ content:
213
+ "<command-message>review</command-message><command-name>/review</command-name><command-args>src</command-args>",
214
+ },
215
+ },
216
+ {
217
+ type: "user",
218
+ timestamp: "2026-03-10T10:01:00Z",
219
+ message: {
220
+ content: text("Base directory for this skill: /skills/x\n\nARGUMENTS: do the thing"),
221
+ },
222
+ },
223
+ { type: "user", timestamp: "2026-03-10T10:02:00Z", message: { content: "Tool loaded." } },
224
+ {
225
+ type: "user",
226
+ timestamp: "2026-03-10T10:03:00Z",
227
+ message: { content: "This session is being continued from a previous one" },
228
+ },
229
+ ],
230
+ uiStateTail: [
231
+ { type: "user", timestamp: "2026-05-30T06:17:57.189Z", message: { content: "hello" } },
232
+ {
233
+ type: "attachment",
234
+ timestamp: "2026-05-30T06:17:57.200Z",
235
+ attachment: { type: "task_reminder", content: [] },
236
+ },
237
+ { type: "permission-mode", timestamp: "2026-05-30T06:17:57.210Z", permissionMode: "default" },
238
+ { type: "ai-title", timestamp: "2026-05-30T06:17:57.220Z" },
239
+ ],
240
+ progressAndSystem: [
241
+ { type: "user", timestamp: "2026-03-10T10:00:00Z", message: { content: "go" } },
242
+ { type: "progress", timestamp: "2026-03-10T10:00:01Z" },
243
+ { type: "thinking", timestamp: "2026-03-10T10:00:02Z" },
244
+ { type: "system", timestamp: "2026-03-10T10:00:03Z", cwd: " " },
245
+ ],
246
+ noTimestamps: [{ type: "assistant" }, { type: "user", message: { content: "no time" } }],
247
+ invalidTimestamp: [
248
+ { type: "user", timestamp: "not-a-date", message: { content: "bad time" } },
249
+ { type: "assistant", timestamp: "2026-03-10T10:01:00Z" },
250
+ ],
251
+ cwdChanges: [
252
+ { type: "user", timestamp: "2026-03-10T10:00:00Z", cwd: "/a" },
253
+ { type: "assistant", timestamp: "2026-03-10T10:01:00Z", cwd: "/b" },
254
+ ],
255
+ empty: [],
256
+ };
257
+
258
+ /** Synthetic transcripts covering the shapes used by the existing Codex fixtures. */
259
+ const codexFixtures: Record<string, unknown[]> = {
260
+ legacyEvents: [
261
+ {
262
+ type: "session_meta",
263
+ payload: { id: "sess-1", timestamp: "2026-03-18T15:00:00Z", cwd: "/repo" },
264
+ },
265
+ {
266
+ type: "event",
267
+ timestamp: "2026-03-18T15:01:00Z",
268
+ payload: { type: "agent_reasoning", message: "Working on feature" },
269
+ },
270
+ ],
271
+ responseItems: [
272
+ {
273
+ type: "session_meta",
274
+ payload: { id: "sess-2", cwd: "/repo", timestamp: "2026-03-27T10:00:00Z" },
275
+ },
276
+ {
277
+ type: "response_item",
278
+ timestamp: "2026-03-27T10:00:01Z",
279
+ payload: {
280
+ type: "message",
281
+ role: "user",
282
+ content: [{ type: "input_text", text: "Fix the bug" }],
283
+ },
284
+ },
285
+ {
286
+ type: "event_msg",
287
+ timestamp: "2026-03-27T10:00:02Z",
288
+ payload: { type: "user_message", message: "Fix the bug" },
289
+ },
290
+ {
291
+ type: "response_item",
292
+ timestamp: "2026-03-27T10:00:03Z",
293
+ payload: {
294
+ type: "message",
295
+ role: "assistant",
296
+ content: [{ type: "output_text", text: "Done. ".repeat(40) }],
297
+ },
298
+ },
299
+ { type: "event_msg", timestamp: "2026-03-27T10:00:04Z", payload: { type: "token_count" } },
300
+ ],
301
+ itemCompleted: [
302
+ { type: "session_meta", payload: { id: "sess-3", cwd: "/repo" } },
303
+ {
304
+ type: "event_msg",
305
+ timestamp: "2026-03-27T10:00:01Z",
306
+ payload: { type: "item_completed", item: { type: "UserMessage", content: "hello" } },
307
+ },
308
+ {
309
+ type: "event_msg",
310
+ timestamp: "2026-03-27T10:00:02Z",
311
+ payload: {
312
+ type: "item_completed",
313
+ item: { type: "AgentMessage", content: [{ type: "text", text: "answer" }] },
314
+ },
315
+ },
316
+ { type: "event_msg", payload: { type: "item_completed", item: { type: "Reasoning" } } },
317
+ ],
318
+ turnAborted: [
319
+ { type: "session_meta", payload: { id: "sess-4", timestamp: "2026-03-18T15:00:00Z" } },
320
+ {
321
+ type: "event_msg",
322
+ timestamp: "2026-03-18T15:01:00Z",
323
+ payload: { type: "task_complete", message: "finished" },
324
+ },
325
+ { type: "event_msg", timestamp: "2026-03-18T15:02:00Z", payload: { type: "turn_aborted" } },
326
+ ],
327
+ untypedTail: [
328
+ { type: "session_meta", payload: { id: "sess-5", timestamp: "2026-03-18T15:00:00Z" } },
329
+ {
330
+ type: "event",
331
+ timestamp: "2026-03-18T15:01:00Z",
332
+ payload: { type: "agent_message", message: "hi" },
333
+ },
334
+ { payload: { message: "untyped trailing line" } },
335
+ ],
336
+ metaOnlyNoTimestamp: [{ type: "session_meta", payload: { id: "sess-6" } }],
337
+ notSessionMeta: [{ type: "event", payload: {} }],
338
+ metaWithoutId: [{ type: "session_meta", payload: { cwd: "/repo" } }],
339
+ empty: [],
340
+ };
341
+
342
+ const kiroText = (value: string) => [{ kind: "text", data: value }];
343
+ const kiroFixtures: Record<string, unknown[]> = {
344
+ promptAndReply: [
345
+ { kind: "Prompt", data: { content: kiroText("first"), meta: { timestamp: 1781098057 } } },
346
+ {
347
+ kind: "AssistantMessage",
348
+ timestamp: "2026-06-10T13:28:00Z",
349
+ data: { content: kiroText("ok") },
350
+ },
351
+ { kind: "Prompt", data: { content: kiroText("second"), meta: { timestamp: 1781098200 } } },
352
+ ],
353
+ toolUseLast: [
354
+ { kind: "Prompt", data: { content: kiroText("read it"), meta: { timestamp: 1781098057 } } },
355
+ {
356
+ kind: "AssistantMessage",
357
+ data: { content: [{ kind: "toolUse", data: { name: "fs_read", input: { path: "a" } } }] },
358
+ },
359
+ { kind: "ToolResults", data: { content: [{ kind: "toolResult", data: { result: "x" } }] } },
360
+ ],
361
+ untimedWithNonObjects: [
362
+ { kind: "Prompt", data: { content: kiroText("no clock") } },
363
+ null,
364
+ [1, 2],
365
+ "a string",
366
+ { kind: "AssistantMessage", data: { content: kiroText("reply") } },
367
+ ],
368
+ };
369
+
370
+ const agyFixtures: Record<string, unknown[]> = {
371
+ requestAndReply: [
372
+ {
373
+ type: "USER_INPUT",
374
+ created_at: "2026-09-28T10:00:00Z",
375
+ content: "<USER_REQUEST>\nfirst\n</USER_REQUEST>",
376
+ },
377
+ { type: "RUN_COMMAND", created_at: "2026-09-28T10:00:05Z", content: "ls" },
378
+ { type: "PLANNER_RESPONSE", created_at: "2026-09-28T10:00:09Z", content: "done" },
379
+ { type: "USER_INPUT", created_at: "2026-09-28T10:01:00Z", content: [{ text: "second" }] },
380
+ ],
381
+ outOfOrderTimestamps: [
382
+ { type: "USER_INPUT", created_at: "2026-09-28T10:05:00Z", content: "late" },
383
+ { type: "PLANNER_RESPONSE", created_at: "2026-09-28T10:01:00Z", content: "early" },
384
+ ],
385
+ untimedWithNonObjects: [
386
+ { type: "USER_INPUT", content: " " },
387
+ null,
388
+ { type: "USER_INPUT", content: "<USER_REQUEST></USER_REQUEST>" },
389
+ "a string",
390
+ { type: "PLANNER_RESPONSE", content: "reply" },
391
+ ],
392
+ };
393
+
394
+ type Fixture = { name: string; lines: string[]; trailingNewline: boolean };
395
+
396
+ function variants(fixtures: Record<string, unknown[]>): Fixture[] {
397
+ const out: Fixture[] = [];
398
+ for (const [name, entries] of Object.entries(fixtures)) {
399
+ const lines = entries.map((entry) => JSON.stringify(entry));
400
+ out.push({ name, lines, trailingNewline: true });
401
+ out.push({ name: `${name} (no trailing newline)`, lines, trailingNewline: false });
402
+ if (lines.length > 1) {
403
+ const noisy = [...lines];
404
+ noisy.splice(1, 0, "{not json", "", " ");
405
+ out.push({ name: `${name} (malformed + blank lines)`, lines: noisy, trailingNewline: true });
406
+ }
407
+ }
408
+ return out;
409
+ }
410
+
411
+ function render(fixture: Fixture): Buffer {
412
+ return Buffer.from(fixture.lines.join("\n") + (fixture.trailingNewline ? "\n" : ""));
413
+ }
414
+
415
+ /** Byte offsets to split an append at: every line boundary plus mid-line offsets. */
416
+ function splitPoints(buffer: Buffer): number[] {
417
+ const points = new Set<number>([0, buffer.length]);
418
+ for (let i = 0; i < buffer.length; i++) {
419
+ if (buffer[i] === 0x0a) {
420
+ points.add(i);
421
+ points.add(i + 1);
422
+ }
423
+ }
424
+ for (let i = 1; i < 8; i++) points.add(Math.floor((buffer.length * i) / 8));
425
+ return [...points].sort((a, b) => a - b);
426
+ }
427
+
428
+ describe("incremental session summaries match the full-file parse", () => {
429
+ let tmpDir: string;
430
+
431
+ beforeEach(() => {
432
+ vi.useFakeTimers({ toFake: ["Date"] });
433
+ vi.setSystemTime(new Date("2026-09-28T00:00:00Z"));
434
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "summary-equivalence-"));
435
+ });
436
+
437
+ afterEach(() => {
438
+ vi.useRealTimers();
439
+ fs.rmSync(tmpDir, { recursive: true, force: true });
440
+ });
441
+
442
+ it.each(variants(claudeFixtures))("Claude: $name", (fixture) => {
443
+ const buffer = render(fixture);
444
+ const filePath = path.join(tmpDir, "11111111-2222-3333-4444-555555555555.jsonl");
445
+
446
+ fs.writeFileSync(filePath, buffer);
447
+ const oracle = legacyClaudeReadSession(new ClaudeSessionParser(), filePath, "");
448
+ expect(new ClaudeSessionParser().readSession(filePath, "")).toEqual(oracle);
449
+
450
+ for (const split of splitPoints(buffer)) {
451
+ const parser = new ClaudeSessionParser();
452
+ fs.writeFileSync(filePath, buffer.subarray(0, split));
453
+ parser.readSessionIncremental(filePath, "");
454
+ fs.appendFileSync(filePath, buffer.subarray(split));
455
+ expect(parser.readSessionIncremental(filePath, ""), `split at ${split}`).toEqual(oracle);
456
+ expect(parser.readSessionIncremental(filePath, "")).toEqual(oracle);
457
+ }
458
+ });
459
+
460
+ it.each(variants(codexFixtures))("Codex: $name", (fixture) => {
461
+ const buffer = render(fixture);
462
+ const filePath = path.join(tmpDir, "rollout.jsonl");
463
+
464
+ fs.writeFileSync(filePath, buffer);
465
+ const oracle = legacyCodexReadSession(new CodexSessionParser(), filePath);
466
+ expect(new CodexSessionParser().readSession(filePath)).toEqual(oracle);
467
+
468
+ for (const split of splitPoints(buffer)) {
469
+ const parser = new CodexSessionParser();
470
+ fs.writeFileSync(filePath, buffer.subarray(0, split));
471
+ parser.readSessionIncremental(filePath);
472
+ fs.appendFileSync(filePath, buffer.subarray(split));
473
+ const expected = legacyCodexReadSession(parser, filePath);
474
+ expect(parser.readSessionIncremental(filePath), `split at ${split}`).toEqual(expected);
475
+ expect(parser.readSessionIncremental(filePath)).toEqual(expected);
476
+ }
477
+ });
478
+
479
+ it.each(variants(kiroFixtures))("Kiro: $name", (fixture) => {
480
+ const buffer = render(fixture);
481
+ const paths = {
482
+ sessionId: "kiro-session",
483
+ transcriptPath: path.join(tmpDir, "kiro-session.jsonl"),
484
+ metadataPath: path.join(tmpDir, "kiro-session.json"),
485
+ };
486
+
487
+ for (const split of splitPoints(buffer)) {
488
+ const parser = new KiroSessionParser();
489
+ fs.writeFileSync(paths.transcriptPath, buffer.subarray(0, split));
490
+ parser.readSessionIncremental(paths, "/repo");
491
+ fs.appendFileSync(paths.transcriptPath, buffer.subarray(split));
492
+ const expected = new KiroSessionParser().readSession(paths, "/repo");
493
+ expect(parser.readSessionIncremental(paths, "/repo"), `split at ${split}`).toEqual(expected);
494
+ expect(parser.readSessionIncremental(paths, "/repo")).toEqual(expected);
495
+ }
496
+ });
497
+
498
+ it.each(variants(agyFixtures))("Antigravity: $name", (fixture) => {
499
+ const buffer = render(fixture);
500
+ const filePath = path.join(tmpDir, "transcript.jsonl");
501
+ const read = (parser: AntigravitySessionParser, incremental: boolean) =>
502
+ incremental
503
+ ? parser.readSessionIncremental("conv", filePath, "/repo")
504
+ : parser.readSession("conv", filePath, "/repo");
505
+
506
+ for (const split of splitPoints(buffer)) {
507
+ const parser = new AntigravitySessionParser();
508
+ fs.writeFileSync(filePath, buffer.subarray(0, split));
509
+ read(parser, true);
510
+ fs.appendFileSync(filePath, buffer.subarray(split));
511
+ const expected = read(new AntigravitySessionParser(), false);
512
+ expect(read(parser, true), `split at ${split}`).toEqual(expected);
513
+ expect(read(parser, true)).toEqual(expected);
514
+ }
515
+ });
516
+ });
517
+
518
+ /**
519
+ * Bounded cold start: `[fixture, neutral padding, fixture]` is larger than the
520
+ * head + tail windows, each window covers one full copy of the fixture, and
521
+ * the padding never changes a summary field. The bounded summary (which skips
522
+ * the middle) must therefore equal the full-file parse.
523
+ */
524
+ describe("bounded cold-start summaries match the full-file parse", () => {
525
+ let tmpDir: string;
526
+
527
+ beforeEach(() => {
528
+ vi.useFakeTimers({ toFake: ["Date"] });
529
+ vi.setSystemTime(new Date("2026-09-28T00:00:00Z"));
530
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "bounded-equivalence-"));
531
+ });
532
+
533
+ afterEach(() => {
534
+ vi.useRealTimers();
535
+ fs.rmSync(tmpDir, { recursive: true, force: true });
536
+ });
537
+
538
+ function mirrored(fixture: Fixture, padLine: string) {
539
+ const window = Buffer.byteLength(fixture.lines.join("\n") + "\n") + 16;
540
+ const padCount = Math.ceil((2 * window) / padLine.length) + 4;
541
+ const padding = Array.from({ length: padCount }, () => padLine);
542
+ const buffer = render({ ...fixture, lines: [...fixture.lines, ...padding, ...fixture.lines] });
543
+ expect(buffer.length).toBeGreaterThan(2 * window);
544
+ return { buffer, bounds: { headBytes: window, tailBytes: window } };
545
+ }
546
+
547
+ it.each(variants(claudeFixtures))("Claude: $name", (fixture) => {
548
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({ type: "attachment" }));
549
+ const filePath = path.join(tmpDir, "11111111-2222-3333-4444-555555555555.jsonl");
550
+ fs.writeFileSync(filePath, buffer);
551
+
552
+ const parser = new ClaudeSessionParser({ summaryBounds: bounds });
553
+ const oracle = legacyClaudeReadSession(parser, filePath, "");
554
+
555
+ expect(parser.readSessionIncremental(filePath, "")).toEqual(oracle);
556
+ expect((parser as any).sessionCache.read(filePath).skippedBytes).toBeGreaterThan(0);
557
+ });
558
+
559
+ it.each(variants(codexFixtures))("Codex: $name", (fixture) => {
560
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({ payload: {} }));
561
+ const filePath = path.join(tmpDir, "rollout.jsonl");
562
+ fs.writeFileSync(filePath, buffer);
563
+
564
+ const parser = new CodexSessionParser({ summaryBounds: bounds });
565
+ const oracle = legacyCodexReadSession(parser, filePath);
566
+
567
+ expect(parser.readSessionIncremental(filePath)).toEqual(oracle);
568
+ expect((parser as any).sessionCache.read(filePath).skippedBytes).toBeGreaterThan(0);
569
+ });
570
+
571
+ it.each(variants(kiroFixtures))("Kiro: $name", (fixture) => {
572
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({ kind: "Checkpoint" }));
573
+ const paths = {
574
+ sessionId: "kiro-session",
575
+ transcriptPath: path.join(tmpDir, "kiro-session.jsonl"),
576
+ metadataPath: path.join(tmpDir, "kiro-session.json"),
577
+ };
578
+ fs.writeFileSync(paths.transcriptPath, buffer);
579
+
580
+ const parser = new KiroSessionParser({ summaryBounds: bounds });
581
+
582
+ expect(parser.readSessionIncremental(paths, "/repo")).toEqual(
583
+ new KiroSessionParser().readSession(paths, "/repo"),
584
+ );
585
+ expect((parser as any).sessionCache.read(paths.transcriptPath).skippedBytes).toBeGreaterThan(0);
586
+ });
587
+
588
+ it.each(variants(agyFixtures))("Antigravity: $name", (fixture) => {
589
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({ type: "CHECKPOINT" }));
590
+ const filePath = path.join(tmpDir, "transcript.jsonl");
591
+ fs.writeFileSync(filePath, buffer);
592
+
593
+ const parser = new AntigravitySessionParser({ summaryBounds: bounds });
594
+
595
+ expect(parser.readSessionIncremental("conv", filePath, "/repo")).toEqual(
596
+ new AntigravitySessionParser().readSession("conv", filePath, "/repo"),
597
+ );
598
+ expect((parser as any).sessionCache.read(filePath).skippedBytes).toBeGreaterThan(0);
599
+ });
600
+ });
601
+
602
+ /**
603
+ * Documented fallbacks when an entry lies only in the skipped middle of a
604
+ * bounded cold start: the field stays undefined (or its existing default); it
605
+ * is never filled from a later entry and never by a full scan.
606
+ */
607
+ describe("bounded cold start: cap-reached fallbacks", () => {
608
+ const bounds = { headBytes: 256, tailBytes: 256 };
609
+ const filler = (n: number, entry: unknown) =>
610
+ Array.from({ length: n }, () => JSON.stringify(entry));
611
+ const claudeFile = "11111111-2222-3333-4444-555555555555.jsonl";
612
+ let tmpDir: string;
613
+
614
+ beforeEach(() => {
615
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "bounded-fallback-"));
616
+ });
617
+
618
+ afterEach(() => {
619
+ fs.rmSync(tmpDir, { recursive: true, force: true });
620
+ });
621
+
622
+ function write(name: string, entries: unknown[]): string {
623
+ const filePath = path.join(tmpDir, name);
624
+ fs.writeFileSync(filePath, entries.map((entry) => JSON.stringify(entry)).join("\n") + "\n");
625
+ return filePath;
626
+ }
627
+
628
+ it("Claude: a first user message beyond the head cap stays undefined", () => {
629
+ const pad = filler(20, { type: "attachment", note: "x".repeat(40) }).map((l) => JSON.parse(l));
630
+ const filePath = write(claudeFile, [
631
+ { type: "file-history-snapshot", snapshot: { timestamp: "2026-03-10T09:00:00Z" } },
632
+ ...pad,
633
+ { type: "user", timestamp: "2026-03-10T10:00:00Z", message: { content: "first" } },
634
+ ...pad,
635
+ { type: "user", timestamp: "2026-03-10T11:00:00Z", message: { content: "latest" } },
636
+ { type: "assistant", timestamp: "2026-03-10T11:01:00Z", cwd: "/repo" },
637
+ ]);
638
+
639
+ const session = new ClaudeSessionParser({ summaryBounds: bounds }).readSessionIncremental(
640
+ filePath,
641
+ "",
642
+ );
643
+
644
+ expect(new ClaudeSessionParser().readSession(filePath, "")?.firstUserMessage).toBe("first");
645
+ expect(session).toMatchObject({
646
+ firstUserMessage: undefined,
647
+ lastUserMessage: "latest",
648
+ sessionStart: new Date("2026-03-10T09:00:00Z"),
649
+ lastActive: new Date("2026-03-10T11:01:00Z"),
650
+ lastEntryType: "assistant",
651
+ lastCwd: "/repo",
652
+ });
653
+ });
654
+
655
+ it("Claude: latest fields before the tail window stay undefined", () => {
656
+ const pad = filler(40, { type: "attachment", note: "x".repeat(40) }).map((l) => JSON.parse(l));
657
+ const filePath = write(claudeFile, [
658
+ {
659
+ type: "user",
660
+ timestamp: "2026-03-10T10:00:00Z",
661
+ cwd: "/repo",
662
+ message: { content: "only" },
663
+ },
664
+ ...pad,
665
+ ]);
666
+
667
+ const session = new ClaudeSessionParser({ summaryBounds: bounds }).readSessionIncremental(
668
+ filePath,
669
+ "",
670
+ );
671
+
672
+ // The head still supplies the session start and the first user message
673
+ expect(session).toMatchObject({
674
+ firstUserMessage: "only",
675
+ lastUserMessage: undefined,
676
+ lastEntryType: undefined,
677
+ lastCwd: undefined,
678
+ isInterrupted: false,
679
+ sessionStart: new Date("2026-03-10T10:00:00Z"),
680
+ });
681
+ });
682
+
683
+ it("Codex: keeps session_meta from the head and defaults fields missing from the tail", () => {
684
+ const pad = filler(40, { payload: { note: "x".repeat(40) } }).map((l) => JSON.parse(l));
685
+ const filePath = write("rollout.jsonl", [
686
+ {
687
+ type: "session_meta",
688
+ payload: { id: "sess-1", cwd: "/repo", timestamp: "2026-03-18T15:00:00Z" },
689
+ },
690
+ {
691
+ type: "event_msg",
692
+ timestamp: "2026-03-18T15:01:00Z",
693
+ payload: { type: "agent_message", message: "early" },
694
+ },
695
+ ...pad,
696
+ ]);
697
+
698
+ const session = new CodexSessionParser({ summaryBounds: bounds }).readSessionIncremental(
699
+ filePath,
700
+ );
701
+
702
+ expect(session).toMatchObject({
703
+ sessionId: "sess-1",
704
+ projectPath: "/repo",
705
+ summary: "Codex session active",
706
+ lastPayloadType: undefined,
707
+ sessionStart: new Date("2026-03-18T15:00:00Z"),
708
+ lastActive: new Date("2026-03-18T15:00:00Z"),
709
+ });
710
+ });
711
+
712
+ it("Codex: a session_meta line longer than the head cap yields no session", () => {
713
+ const pad = filler(40, {
714
+ type: "event_msg",
715
+ payload: { type: "agent_message", message: "hi" },
716
+ });
717
+ const filePath = write("rollout.jsonl", [
718
+ { type: "session_meta", payload: { id: "sess-1", base: "x".repeat(400) } },
719
+ ...pad.map((l) => JSON.parse(l)),
720
+ ]);
721
+
722
+ expect(
723
+ new CodexSessionParser({ summaryBounds: bounds }).readSessionIncremental(filePath),
724
+ ).toBeNull();
725
+ });
726
+ });