@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,1089 @@
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
+ */ import * as fs from "fs";
9
+ import * as os from "os";
10
+ import * as path from "path";
11
+ import { AntigravitySessionParser } from "../../harnesses/antigravity/AntigravitySessionParser.js";
12
+ import { ClaudeSessionParser } from "../../harnesses/claude/ClaudeSessionParser.js";
13
+ import { CodexSessionParser } from "../../harnesses/codex/CodexSessionParser.js";
14
+ import { KiroSessionParser } from "../../harnesses/kiro/KiroSessionParser.js";
15
+ import { parseTimestamp, truncate } from "../../harnesses/shared.js";
16
+ const CONVERSATION_ENTRY_TYPES = new Set([
17
+ "user",
18
+ "assistant",
19
+ "system",
20
+ "progress",
21
+ "thinking"
22
+ ]);
23
+ function legacyClaudeReadSession(parser, filePath, projectPath) {
24
+ const p = parser;
25
+ const sessionId = path.basename(filePath, ".jsonl");
26
+ const content = fs.readFileSync(filePath, "utf-8");
27
+ const allLines = content.trim().split("\n");
28
+ let sessionStart = null;
29
+ try {
30
+ const firstEntry = JSON.parse(allLines[0]);
31
+ const rawTs = firstEntry.timestamp || firstEntry.snapshot?.timestamp;
32
+ if (rawTs && !Number.isNaN(new Date(rawTs).getTime())) sessionStart = new Date(rawTs);
33
+ } catch {
34
+ /* malformed first line */ }
35
+ let lastEntryType;
36
+ let lastActive;
37
+ let lastCwd;
38
+ let isInterrupted = false;
39
+ let lastUserMessage;
40
+ let firstUserMessage;
41
+ for (const line of allLines){
42
+ try {
43
+ const entry = JSON.parse(line);
44
+ if (entry.timestamp) {
45
+ const ts = new Date(entry.timestamp);
46
+ if (!Number.isNaN(ts.getTime())) lastActive = ts;
47
+ }
48
+ if (typeof entry.cwd === "string" && entry.cwd.trim().length > 0) lastCwd = entry.cwd;
49
+ if (entry.type && CONVERSATION_ENTRY_TYPES.has(entry.type)) {
50
+ lastEntryType = entry.type;
51
+ if (entry.type === "user") {
52
+ const msgContent = entry.message?.content;
53
+ isInterrupted = Array.isArray(msgContent) && msgContent.some((c)=>c.type === "text" && c.text?.includes("[Request interrupted") || c.type === "tool_result" && c.content?.includes("[Request interrupted"));
54
+ const text = p.extractUserMessageText(msgContent);
55
+ if (text) {
56
+ lastUserMessage = text;
57
+ if (!firstUserMessage) firstUserMessage = text;
58
+ }
59
+ } else {
60
+ isInterrupted = false;
61
+ }
62
+ }
63
+ } catch {
64
+ continue;
65
+ }
66
+ }
67
+ return {
68
+ sessionId,
69
+ projectPath: projectPath || lastCwd || "",
70
+ lastCwd,
71
+ sessionStart: sessionStart || lastActive || new Date(),
72
+ lastActive: lastActive || new Date(),
73
+ lastEntryType,
74
+ isInterrupted,
75
+ lastUserMessage,
76
+ firstUserMessage
77
+ };
78
+ }
79
+ function legacyCodexReadSession(parser, filePath) {
80
+ const p = parser;
81
+ const content = fs.readFileSync(filePath, "utf-8");
82
+ const allLines = content.trim().split("\n");
83
+ if (!allLines[0]) return null;
84
+ let metaEntry;
85
+ try {
86
+ metaEntry = JSON.parse(allLines[0]);
87
+ } catch {
88
+ return null;
89
+ }
90
+ if (metaEntry?.type !== "session_meta" || !metaEntry.payload?.id) return null;
91
+ const entries = [];
92
+ for (const line of allLines){
93
+ try {
94
+ entries.push(JSON.parse(line));
95
+ } catch {
96
+ continue;
97
+ }
98
+ }
99
+ let lastEntry;
100
+ for(let i = entries.length - 1; i >= 0; i--){
101
+ if (entries[i] && typeof entries[i].type === "string") {
102
+ lastEntry = entries[i];
103
+ break;
104
+ }
105
+ }
106
+ let summary = "Codex session active";
107
+ for(let i = entries.length - 1; i >= 0; i--){
108
+ const message = p.extractEntryText(entries[i]);
109
+ if (message) {
110
+ summary = truncate(message, 120);
111
+ break;
112
+ }
113
+ }
114
+ const lastActive = parseTimestamp(lastEntry?.timestamp) || parseTimestamp(metaEntry.payload.timestamp) || fs.statSync(filePath).mtime;
115
+ const sessionStart = parseTimestamp(metaEntry.payload.timestamp) || lastActive;
116
+ return {
117
+ sessionId: metaEntry.payload.id,
118
+ projectPath: metaEntry.payload.cwd || "",
119
+ summary,
120
+ sessionStart,
121
+ lastActive,
122
+ lastPayloadType: lastEntry ? p.normalizedPayloadType(lastEntry) : undefined
123
+ };
124
+ }
125
+ const text = (value)=>[
126
+ {
127
+ type: "text",
128
+ text: value
129
+ }
130
+ ];
131
+ /** Synthetic transcripts covering the shapes used by the existing Claude fixtures. */ const claudeFixtures = {
132
+ basic: [
133
+ {
134
+ type: "user",
135
+ timestamp: "2026-03-10T10:00:00Z",
136
+ cwd: "/my/project",
137
+ message: {
138
+ content: "hello"
139
+ }
140
+ },
141
+ {
142
+ type: "assistant",
143
+ timestamp: "2026-03-10T10:01:00Z",
144
+ message: {
145
+ content: text("hi")
146
+ }
147
+ }
148
+ ],
149
+ interrupted: [
150
+ {
151
+ type: "assistant",
152
+ timestamp: "2026-03-10T10:00:00Z"
153
+ },
154
+ {
155
+ type: "user",
156
+ timestamp: "2026-03-10T10:01:00Z",
157
+ message: {
158
+ content: text("[Request interrupted by user for tool use]")
159
+ }
160
+ }
161
+ ],
162
+ interruptedToolResult: [
163
+ {
164
+ type: "user",
165
+ timestamp: "2026-03-10T10:00:00Z",
166
+ message: {
167
+ content: [
168
+ {
169
+ type: "tool_result",
170
+ content: "[Request interrupted by user]"
171
+ }
172
+ ]
173
+ }
174
+ }
175
+ ],
176
+ metadataTail: [
177
+ {
178
+ type: "user",
179
+ timestamp: "2026-03-10T10:00:00Z",
180
+ message: {
181
+ content: text("question")
182
+ }
183
+ },
184
+ {
185
+ type: "assistant",
186
+ timestamp: "2026-03-10T10:01:00Z"
187
+ },
188
+ {
189
+ type: "last-prompt",
190
+ timestamp: "2026-03-10T10:02:00Z"
191
+ },
192
+ {
193
+ type: "file-history-snapshot",
194
+ timestamp: "2026-03-10T10:03:00Z"
195
+ }
196
+ ],
197
+ snapshotFirst: [
198
+ {
199
+ type: "file-history-snapshot",
200
+ snapshot: {
201
+ timestamp: "2026-03-10T09:59:00Z"
202
+ }
203
+ },
204
+ {
205
+ type: "user",
206
+ timestamp: "2026-03-10T10:00:00Z",
207
+ cwd: "/repo",
208
+ message: {
209
+ content: "start"
210
+ }
211
+ },
212
+ {
213
+ type: "assistant",
214
+ timestamp: "2026-03-10T10:01:00Z"
215
+ }
216
+ ],
217
+ multipleUsers: [
218
+ {
219
+ type: "user",
220
+ timestamp: "2026-03-10T10:00:00Z",
221
+ message: {
222
+ content: text("first question")
223
+ }
224
+ },
225
+ {
226
+ type: "assistant",
227
+ timestamp: "2026-03-10T10:01:00Z"
228
+ },
229
+ {
230
+ type: "user",
231
+ timestamp: "2026-03-10T10:02:00Z",
232
+ message: {
233
+ content: text("second question")
234
+ }
235
+ },
236
+ {
237
+ type: "assistant",
238
+ timestamp: "2026-03-10T10:03:00Z"
239
+ }
240
+ ],
241
+ commandsAndSkills: [
242
+ {
243
+ type: "user",
244
+ timestamp: "2026-03-10T10:00:00Z",
245
+ message: {
246
+ content: "<command-message>review</command-message><command-name>/review</command-name><command-args>src</command-args>"
247
+ }
248
+ },
249
+ {
250
+ type: "user",
251
+ timestamp: "2026-03-10T10:01:00Z",
252
+ message: {
253
+ content: text("Base directory for this skill: /skills/x\n\nARGUMENTS: do the thing")
254
+ }
255
+ },
256
+ {
257
+ type: "user",
258
+ timestamp: "2026-03-10T10:02:00Z",
259
+ message: {
260
+ content: "Tool loaded."
261
+ }
262
+ },
263
+ {
264
+ type: "user",
265
+ timestamp: "2026-03-10T10:03:00Z",
266
+ message: {
267
+ content: "This session is being continued from a previous one"
268
+ }
269
+ }
270
+ ],
271
+ uiStateTail: [
272
+ {
273
+ type: "user",
274
+ timestamp: "2026-05-30T06:17:57.189Z",
275
+ message: {
276
+ content: "hello"
277
+ }
278
+ },
279
+ {
280
+ type: "attachment",
281
+ timestamp: "2026-05-30T06:17:57.200Z",
282
+ attachment: {
283
+ type: "task_reminder",
284
+ content: []
285
+ }
286
+ },
287
+ {
288
+ type: "permission-mode",
289
+ timestamp: "2026-05-30T06:17:57.210Z",
290
+ permissionMode: "default"
291
+ },
292
+ {
293
+ type: "ai-title",
294
+ timestamp: "2026-05-30T06:17:57.220Z"
295
+ }
296
+ ],
297
+ progressAndSystem: [
298
+ {
299
+ type: "user",
300
+ timestamp: "2026-03-10T10:00:00Z",
301
+ message: {
302
+ content: "go"
303
+ }
304
+ },
305
+ {
306
+ type: "progress",
307
+ timestamp: "2026-03-10T10:00:01Z"
308
+ },
309
+ {
310
+ type: "thinking",
311
+ timestamp: "2026-03-10T10:00:02Z"
312
+ },
313
+ {
314
+ type: "system",
315
+ timestamp: "2026-03-10T10:00:03Z",
316
+ cwd: " "
317
+ }
318
+ ],
319
+ noTimestamps: [
320
+ {
321
+ type: "assistant"
322
+ },
323
+ {
324
+ type: "user",
325
+ message: {
326
+ content: "no time"
327
+ }
328
+ }
329
+ ],
330
+ invalidTimestamp: [
331
+ {
332
+ type: "user",
333
+ timestamp: "not-a-date",
334
+ message: {
335
+ content: "bad time"
336
+ }
337
+ },
338
+ {
339
+ type: "assistant",
340
+ timestamp: "2026-03-10T10:01:00Z"
341
+ }
342
+ ],
343
+ cwdChanges: [
344
+ {
345
+ type: "user",
346
+ timestamp: "2026-03-10T10:00:00Z",
347
+ cwd: "/a"
348
+ },
349
+ {
350
+ type: "assistant",
351
+ timestamp: "2026-03-10T10:01:00Z",
352
+ cwd: "/b"
353
+ }
354
+ ],
355
+ empty: []
356
+ };
357
+ /** Synthetic transcripts covering the shapes used by the existing Codex fixtures. */ const codexFixtures = {
358
+ legacyEvents: [
359
+ {
360
+ type: "session_meta",
361
+ payload: {
362
+ id: "sess-1",
363
+ timestamp: "2026-03-18T15:00:00Z",
364
+ cwd: "/repo"
365
+ }
366
+ },
367
+ {
368
+ type: "event",
369
+ timestamp: "2026-03-18T15:01:00Z",
370
+ payload: {
371
+ type: "agent_reasoning",
372
+ message: "Working on feature"
373
+ }
374
+ }
375
+ ],
376
+ responseItems: [
377
+ {
378
+ type: "session_meta",
379
+ payload: {
380
+ id: "sess-2",
381
+ cwd: "/repo",
382
+ timestamp: "2026-03-27T10:00:00Z"
383
+ }
384
+ },
385
+ {
386
+ type: "response_item",
387
+ timestamp: "2026-03-27T10:00:01Z",
388
+ payload: {
389
+ type: "message",
390
+ role: "user",
391
+ content: [
392
+ {
393
+ type: "input_text",
394
+ text: "Fix the bug"
395
+ }
396
+ ]
397
+ }
398
+ },
399
+ {
400
+ type: "event_msg",
401
+ timestamp: "2026-03-27T10:00:02Z",
402
+ payload: {
403
+ type: "user_message",
404
+ message: "Fix the bug"
405
+ }
406
+ },
407
+ {
408
+ type: "response_item",
409
+ timestamp: "2026-03-27T10:00:03Z",
410
+ payload: {
411
+ type: "message",
412
+ role: "assistant",
413
+ content: [
414
+ {
415
+ type: "output_text",
416
+ text: "Done. ".repeat(40)
417
+ }
418
+ ]
419
+ }
420
+ },
421
+ {
422
+ type: "event_msg",
423
+ timestamp: "2026-03-27T10:00:04Z",
424
+ payload: {
425
+ type: "token_count"
426
+ }
427
+ }
428
+ ],
429
+ itemCompleted: [
430
+ {
431
+ type: "session_meta",
432
+ payload: {
433
+ id: "sess-3",
434
+ cwd: "/repo"
435
+ }
436
+ },
437
+ {
438
+ type: "event_msg",
439
+ timestamp: "2026-03-27T10:00:01Z",
440
+ payload: {
441
+ type: "item_completed",
442
+ item: {
443
+ type: "UserMessage",
444
+ content: "hello"
445
+ }
446
+ }
447
+ },
448
+ {
449
+ type: "event_msg",
450
+ timestamp: "2026-03-27T10:00:02Z",
451
+ payload: {
452
+ type: "item_completed",
453
+ item: {
454
+ type: "AgentMessage",
455
+ content: [
456
+ {
457
+ type: "text",
458
+ text: "answer"
459
+ }
460
+ ]
461
+ }
462
+ }
463
+ },
464
+ {
465
+ type: "event_msg",
466
+ payload: {
467
+ type: "item_completed",
468
+ item: {
469
+ type: "Reasoning"
470
+ }
471
+ }
472
+ }
473
+ ],
474
+ turnAborted: [
475
+ {
476
+ type: "session_meta",
477
+ payload: {
478
+ id: "sess-4",
479
+ timestamp: "2026-03-18T15:00:00Z"
480
+ }
481
+ },
482
+ {
483
+ type: "event_msg",
484
+ timestamp: "2026-03-18T15:01:00Z",
485
+ payload: {
486
+ type: "task_complete",
487
+ message: "finished"
488
+ }
489
+ },
490
+ {
491
+ type: "event_msg",
492
+ timestamp: "2026-03-18T15:02:00Z",
493
+ payload: {
494
+ type: "turn_aborted"
495
+ }
496
+ }
497
+ ],
498
+ untypedTail: [
499
+ {
500
+ type: "session_meta",
501
+ payload: {
502
+ id: "sess-5",
503
+ timestamp: "2026-03-18T15:00:00Z"
504
+ }
505
+ },
506
+ {
507
+ type: "event",
508
+ timestamp: "2026-03-18T15:01:00Z",
509
+ payload: {
510
+ type: "agent_message",
511
+ message: "hi"
512
+ }
513
+ },
514
+ {
515
+ payload: {
516
+ message: "untyped trailing line"
517
+ }
518
+ }
519
+ ],
520
+ metaOnlyNoTimestamp: [
521
+ {
522
+ type: "session_meta",
523
+ payload: {
524
+ id: "sess-6"
525
+ }
526
+ }
527
+ ],
528
+ notSessionMeta: [
529
+ {
530
+ type: "event",
531
+ payload: {}
532
+ }
533
+ ],
534
+ metaWithoutId: [
535
+ {
536
+ type: "session_meta",
537
+ payload: {
538
+ cwd: "/repo"
539
+ }
540
+ }
541
+ ],
542
+ empty: []
543
+ };
544
+ const kiroText = (value)=>[
545
+ {
546
+ kind: "text",
547
+ data: value
548
+ }
549
+ ];
550
+ const kiroFixtures = {
551
+ promptAndReply: [
552
+ {
553
+ kind: "Prompt",
554
+ data: {
555
+ content: kiroText("first"),
556
+ meta: {
557
+ timestamp: 1781098057
558
+ }
559
+ }
560
+ },
561
+ {
562
+ kind: "AssistantMessage",
563
+ timestamp: "2026-06-10T13:28:00Z",
564
+ data: {
565
+ content: kiroText("ok")
566
+ }
567
+ },
568
+ {
569
+ kind: "Prompt",
570
+ data: {
571
+ content: kiroText("second"),
572
+ meta: {
573
+ timestamp: 1781098200
574
+ }
575
+ }
576
+ }
577
+ ],
578
+ toolUseLast: [
579
+ {
580
+ kind: "Prompt",
581
+ data: {
582
+ content: kiroText("read it"),
583
+ meta: {
584
+ timestamp: 1781098057
585
+ }
586
+ }
587
+ },
588
+ {
589
+ kind: "AssistantMessage",
590
+ data: {
591
+ content: [
592
+ {
593
+ kind: "toolUse",
594
+ data: {
595
+ name: "fs_read",
596
+ input: {
597
+ path: "a"
598
+ }
599
+ }
600
+ }
601
+ ]
602
+ }
603
+ },
604
+ {
605
+ kind: "ToolResults",
606
+ data: {
607
+ content: [
608
+ {
609
+ kind: "toolResult",
610
+ data: {
611
+ result: "x"
612
+ }
613
+ }
614
+ ]
615
+ }
616
+ }
617
+ ],
618
+ untimedWithNonObjects: [
619
+ {
620
+ kind: "Prompt",
621
+ data: {
622
+ content: kiroText("no clock")
623
+ }
624
+ },
625
+ null,
626
+ [
627
+ 1,
628
+ 2
629
+ ],
630
+ "a string",
631
+ {
632
+ kind: "AssistantMessage",
633
+ data: {
634
+ content: kiroText("reply")
635
+ }
636
+ }
637
+ ]
638
+ };
639
+ const agyFixtures = {
640
+ requestAndReply: [
641
+ {
642
+ type: "USER_INPUT",
643
+ created_at: "2026-09-28T10:00:00Z",
644
+ content: "<USER_REQUEST>\nfirst\n</USER_REQUEST>"
645
+ },
646
+ {
647
+ type: "RUN_COMMAND",
648
+ created_at: "2026-09-28T10:00:05Z",
649
+ content: "ls"
650
+ },
651
+ {
652
+ type: "PLANNER_RESPONSE",
653
+ created_at: "2026-09-28T10:00:09Z",
654
+ content: "done"
655
+ },
656
+ {
657
+ type: "USER_INPUT",
658
+ created_at: "2026-09-28T10:01:00Z",
659
+ content: [
660
+ {
661
+ text: "second"
662
+ }
663
+ ]
664
+ }
665
+ ],
666
+ outOfOrderTimestamps: [
667
+ {
668
+ type: "USER_INPUT",
669
+ created_at: "2026-09-28T10:05:00Z",
670
+ content: "late"
671
+ },
672
+ {
673
+ type: "PLANNER_RESPONSE",
674
+ created_at: "2026-09-28T10:01:00Z",
675
+ content: "early"
676
+ }
677
+ ],
678
+ untimedWithNonObjects: [
679
+ {
680
+ type: "USER_INPUT",
681
+ content: " "
682
+ },
683
+ null,
684
+ {
685
+ type: "USER_INPUT",
686
+ content: "<USER_REQUEST></USER_REQUEST>"
687
+ },
688
+ "a string",
689
+ {
690
+ type: "PLANNER_RESPONSE",
691
+ content: "reply"
692
+ }
693
+ ]
694
+ };
695
+ function variants(fixtures) {
696
+ const out = [];
697
+ for (const [name, entries] of Object.entries(fixtures)){
698
+ const lines = entries.map((entry)=>JSON.stringify(entry));
699
+ out.push({
700
+ name,
701
+ lines,
702
+ trailingNewline: true
703
+ });
704
+ out.push({
705
+ name: `${name} (no trailing newline)`,
706
+ lines,
707
+ trailingNewline: false
708
+ });
709
+ if (lines.length > 1) {
710
+ const noisy = [
711
+ ...lines
712
+ ];
713
+ noisy.splice(1, 0, "{not json", "", " ");
714
+ out.push({
715
+ name: `${name} (malformed + blank lines)`,
716
+ lines: noisy,
717
+ trailingNewline: true
718
+ });
719
+ }
720
+ }
721
+ return out;
722
+ }
723
+ function render(fixture) {
724
+ return Buffer.from(fixture.lines.join("\n") + (fixture.trailingNewline ? "\n" : ""));
725
+ }
726
+ /** Byte offsets to split an append at: every line boundary plus mid-line offsets. */ function splitPoints(buffer) {
727
+ const points = new Set([
728
+ 0,
729
+ buffer.length
730
+ ]);
731
+ for(let i = 0; i < buffer.length; i++){
732
+ if (buffer[i] === 0x0a) {
733
+ points.add(i);
734
+ points.add(i + 1);
735
+ }
736
+ }
737
+ for(let i = 1; i < 8; i++)points.add(Math.floor(buffer.length * i / 8));
738
+ return [
739
+ ...points
740
+ ].sort((a, b)=>a - b);
741
+ }
742
+ describe("incremental session summaries match the full-file parse", ()=>{
743
+ let tmpDir;
744
+ beforeEach(()=>{
745
+ vi.useFakeTimers({
746
+ toFake: [
747
+ "Date"
748
+ ]
749
+ });
750
+ vi.setSystemTime(new Date("2026-09-28T00:00:00Z"));
751
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "summary-equivalence-"));
752
+ });
753
+ afterEach(()=>{
754
+ vi.useRealTimers();
755
+ fs.rmSync(tmpDir, {
756
+ recursive: true,
757
+ force: true
758
+ });
759
+ });
760
+ it.each(variants(claudeFixtures))("Claude: $name", (fixture)=>{
761
+ const buffer = render(fixture);
762
+ const filePath = path.join(tmpDir, "11111111-2222-3333-4444-555555555555.jsonl");
763
+ fs.writeFileSync(filePath, buffer);
764
+ const oracle = legacyClaudeReadSession(new ClaudeSessionParser(), filePath, "");
765
+ expect(new ClaudeSessionParser().readSession(filePath, "")).toEqual(oracle);
766
+ for (const split of splitPoints(buffer)){
767
+ const parser = new ClaudeSessionParser();
768
+ fs.writeFileSync(filePath, buffer.subarray(0, split));
769
+ parser.readSessionIncremental(filePath, "");
770
+ fs.appendFileSync(filePath, buffer.subarray(split));
771
+ expect(parser.readSessionIncremental(filePath, ""), `split at ${split}`).toEqual(oracle);
772
+ expect(parser.readSessionIncremental(filePath, "")).toEqual(oracle);
773
+ }
774
+ });
775
+ it.each(variants(codexFixtures))("Codex: $name", (fixture)=>{
776
+ const buffer = render(fixture);
777
+ const filePath = path.join(tmpDir, "rollout.jsonl");
778
+ fs.writeFileSync(filePath, buffer);
779
+ const oracle = legacyCodexReadSession(new CodexSessionParser(), filePath);
780
+ expect(new CodexSessionParser().readSession(filePath)).toEqual(oracle);
781
+ for (const split of splitPoints(buffer)){
782
+ const parser = new CodexSessionParser();
783
+ fs.writeFileSync(filePath, buffer.subarray(0, split));
784
+ parser.readSessionIncremental(filePath);
785
+ fs.appendFileSync(filePath, buffer.subarray(split));
786
+ const expected = legacyCodexReadSession(parser, filePath);
787
+ expect(parser.readSessionIncremental(filePath), `split at ${split}`).toEqual(expected);
788
+ expect(parser.readSessionIncremental(filePath)).toEqual(expected);
789
+ }
790
+ });
791
+ it.each(variants(kiroFixtures))("Kiro: $name", (fixture)=>{
792
+ const buffer = render(fixture);
793
+ const paths = {
794
+ sessionId: "kiro-session",
795
+ transcriptPath: path.join(tmpDir, "kiro-session.jsonl"),
796
+ metadataPath: path.join(tmpDir, "kiro-session.json")
797
+ };
798
+ for (const split of splitPoints(buffer)){
799
+ const parser = new KiroSessionParser();
800
+ fs.writeFileSync(paths.transcriptPath, buffer.subarray(0, split));
801
+ parser.readSessionIncremental(paths, "/repo");
802
+ fs.appendFileSync(paths.transcriptPath, buffer.subarray(split));
803
+ const expected = new KiroSessionParser().readSession(paths, "/repo");
804
+ expect(parser.readSessionIncremental(paths, "/repo"), `split at ${split}`).toEqual(expected);
805
+ expect(parser.readSessionIncremental(paths, "/repo")).toEqual(expected);
806
+ }
807
+ });
808
+ it.each(variants(agyFixtures))("Antigravity: $name", (fixture)=>{
809
+ const buffer = render(fixture);
810
+ const filePath = path.join(tmpDir, "transcript.jsonl");
811
+ const read = (parser, incremental)=>incremental ? parser.readSessionIncremental("conv", filePath, "/repo") : parser.readSession("conv", filePath, "/repo");
812
+ for (const split of splitPoints(buffer)){
813
+ const parser = new AntigravitySessionParser();
814
+ fs.writeFileSync(filePath, buffer.subarray(0, split));
815
+ read(parser, true);
816
+ fs.appendFileSync(filePath, buffer.subarray(split));
817
+ const expected = read(new AntigravitySessionParser(), false);
818
+ expect(read(parser, true), `split at ${split}`).toEqual(expected);
819
+ expect(read(parser, true)).toEqual(expected);
820
+ }
821
+ });
822
+ });
823
+ /**
824
+ * Bounded cold start: `[fixture, neutral padding, fixture]` is larger than the
825
+ * head + tail windows, each window covers one full copy of the fixture, and
826
+ * the padding never changes a summary field. The bounded summary (which skips
827
+ * the middle) must therefore equal the full-file parse.
828
+ */ describe("bounded cold-start summaries match the full-file parse", ()=>{
829
+ let tmpDir;
830
+ beforeEach(()=>{
831
+ vi.useFakeTimers({
832
+ toFake: [
833
+ "Date"
834
+ ]
835
+ });
836
+ vi.setSystemTime(new Date("2026-09-28T00:00:00Z"));
837
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "bounded-equivalence-"));
838
+ });
839
+ afterEach(()=>{
840
+ vi.useRealTimers();
841
+ fs.rmSync(tmpDir, {
842
+ recursive: true,
843
+ force: true
844
+ });
845
+ });
846
+ function mirrored(fixture, padLine) {
847
+ const window = Buffer.byteLength(fixture.lines.join("\n") + "\n") + 16;
848
+ const padCount = Math.ceil(2 * window / padLine.length) + 4;
849
+ const padding = Array.from({
850
+ length: padCount
851
+ }, ()=>padLine);
852
+ const buffer = render({
853
+ ...fixture,
854
+ lines: [
855
+ ...fixture.lines,
856
+ ...padding,
857
+ ...fixture.lines
858
+ ]
859
+ });
860
+ expect(buffer.length).toBeGreaterThan(2 * window);
861
+ return {
862
+ buffer,
863
+ bounds: {
864
+ headBytes: window,
865
+ tailBytes: window
866
+ }
867
+ };
868
+ }
869
+ it.each(variants(claudeFixtures))("Claude: $name", (fixture)=>{
870
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({
871
+ type: "attachment"
872
+ }));
873
+ const filePath = path.join(tmpDir, "11111111-2222-3333-4444-555555555555.jsonl");
874
+ fs.writeFileSync(filePath, buffer);
875
+ const parser = new ClaudeSessionParser({
876
+ summaryBounds: bounds
877
+ });
878
+ const oracle = legacyClaudeReadSession(parser, filePath, "");
879
+ expect(parser.readSessionIncremental(filePath, "")).toEqual(oracle);
880
+ expect(parser.sessionCache.read(filePath).skippedBytes).toBeGreaterThan(0);
881
+ });
882
+ it.each(variants(codexFixtures))("Codex: $name", (fixture)=>{
883
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({
884
+ payload: {}
885
+ }));
886
+ const filePath = path.join(tmpDir, "rollout.jsonl");
887
+ fs.writeFileSync(filePath, buffer);
888
+ const parser = new CodexSessionParser({
889
+ summaryBounds: bounds
890
+ });
891
+ const oracle = legacyCodexReadSession(parser, filePath);
892
+ expect(parser.readSessionIncremental(filePath)).toEqual(oracle);
893
+ expect(parser.sessionCache.read(filePath).skippedBytes).toBeGreaterThan(0);
894
+ });
895
+ it.each(variants(kiroFixtures))("Kiro: $name", (fixture)=>{
896
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({
897
+ kind: "Checkpoint"
898
+ }));
899
+ const paths = {
900
+ sessionId: "kiro-session",
901
+ transcriptPath: path.join(tmpDir, "kiro-session.jsonl"),
902
+ metadataPath: path.join(tmpDir, "kiro-session.json")
903
+ };
904
+ fs.writeFileSync(paths.transcriptPath, buffer);
905
+ const parser = new KiroSessionParser({
906
+ summaryBounds: bounds
907
+ });
908
+ expect(parser.readSessionIncremental(paths, "/repo")).toEqual(new KiroSessionParser().readSession(paths, "/repo"));
909
+ expect(parser.sessionCache.read(paths.transcriptPath).skippedBytes).toBeGreaterThan(0);
910
+ });
911
+ it.each(variants(agyFixtures))("Antigravity: $name", (fixture)=>{
912
+ const { buffer, bounds } = mirrored(fixture, JSON.stringify({
913
+ type: "CHECKPOINT"
914
+ }));
915
+ const filePath = path.join(tmpDir, "transcript.jsonl");
916
+ fs.writeFileSync(filePath, buffer);
917
+ const parser = new AntigravitySessionParser({
918
+ summaryBounds: bounds
919
+ });
920
+ expect(parser.readSessionIncremental("conv", filePath, "/repo")).toEqual(new AntigravitySessionParser().readSession("conv", filePath, "/repo"));
921
+ expect(parser.sessionCache.read(filePath).skippedBytes).toBeGreaterThan(0);
922
+ });
923
+ });
924
+ /**
925
+ * Documented fallbacks when an entry lies only in the skipped middle of a
926
+ * bounded cold start: the field stays undefined (or its existing default); it
927
+ * is never filled from a later entry and never by a full scan.
928
+ */ describe("bounded cold start: cap-reached fallbacks", ()=>{
929
+ const bounds = {
930
+ headBytes: 256,
931
+ tailBytes: 256
932
+ };
933
+ const filler = (n, entry)=>Array.from({
934
+ length: n
935
+ }, ()=>JSON.stringify(entry));
936
+ const claudeFile = "11111111-2222-3333-4444-555555555555.jsonl";
937
+ let tmpDir;
938
+ beforeEach(()=>{
939
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "bounded-fallback-"));
940
+ });
941
+ afterEach(()=>{
942
+ fs.rmSync(tmpDir, {
943
+ recursive: true,
944
+ force: true
945
+ });
946
+ });
947
+ function write(name, entries) {
948
+ const filePath = path.join(tmpDir, name);
949
+ fs.writeFileSync(filePath, entries.map((entry)=>JSON.stringify(entry)).join("\n") + "\n");
950
+ return filePath;
951
+ }
952
+ it("Claude: a first user message beyond the head cap stays undefined", ()=>{
953
+ const pad = filler(20, {
954
+ type: "attachment",
955
+ note: "x".repeat(40)
956
+ }).map((l)=>JSON.parse(l));
957
+ const filePath = write(claudeFile, [
958
+ {
959
+ type: "file-history-snapshot",
960
+ snapshot: {
961
+ timestamp: "2026-03-10T09:00:00Z"
962
+ }
963
+ },
964
+ ...pad,
965
+ {
966
+ type: "user",
967
+ timestamp: "2026-03-10T10:00:00Z",
968
+ message: {
969
+ content: "first"
970
+ }
971
+ },
972
+ ...pad,
973
+ {
974
+ type: "user",
975
+ timestamp: "2026-03-10T11:00:00Z",
976
+ message: {
977
+ content: "latest"
978
+ }
979
+ },
980
+ {
981
+ type: "assistant",
982
+ timestamp: "2026-03-10T11:01:00Z",
983
+ cwd: "/repo"
984
+ }
985
+ ]);
986
+ const session = new ClaudeSessionParser({
987
+ summaryBounds: bounds
988
+ }).readSessionIncremental(filePath, "");
989
+ expect(new ClaudeSessionParser().readSession(filePath, "")?.firstUserMessage).toBe("first");
990
+ expect(session).toMatchObject({
991
+ firstUserMessage: undefined,
992
+ lastUserMessage: "latest",
993
+ sessionStart: new Date("2026-03-10T09:00:00Z"),
994
+ lastActive: new Date("2026-03-10T11:01:00Z"),
995
+ lastEntryType: "assistant",
996
+ lastCwd: "/repo"
997
+ });
998
+ });
999
+ it("Claude: latest fields before the tail window stay undefined", ()=>{
1000
+ const pad = filler(40, {
1001
+ type: "attachment",
1002
+ note: "x".repeat(40)
1003
+ }).map((l)=>JSON.parse(l));
1004
+ const filePath = write(claudeFile, [
1005
+ {
1006
+ type: "user",
1007
+ timestamp: "2026-03-10T10:00:00Z",
1008
+ cwd: "/repo",
1009
+ message: {
1010
+ content: "only"
1011
+ }
1012
+ },
1013
+ ...pad
1014
+ ]);
1015
+ const session = new ClaudeSessionParser({
1016
+ summaryBounds: bounds
1017
+ }).readSessionIncremental(filePath, "");
1018
+ // The head still supplies the session start and the first user message
1019
+ expect(session).toMatchObject({
1020
+ firstUserMessage: "only",
1021
+ lastUserMessage: undefined,
1022
+ lastEntryType: undefined,
1023
+ lastCwd: undefined,
1024
+ isInterrupted: false,
1025
+ sessionStart: new Date("2026-03-10T10:00:00Z")
1026
+ });
1027
+ });
1028
+ it("Codex: keeps session_meta from the head and defaults fields missing from the tail", ()=>{
1029
+ const pad = filler(40, {
1030
+ payload: {
1031
+ note: "x".repeat(40)
1032
+ }
1033
+ }).map((l)=>JSON.parse(l));
1034
+ const filePath = write("rollout.jsonl", [
1035
+ {
1036
+ type: "session_meta",
1037
+ payload: {
1038
+ id: "sess-1",
1039
+ cwd: "/repo",
1040
+ timestamp: "2026-03-18T15:00:00Z"
1041
+ }
1042
+ },
1043
+ {
1044
+ type: "event_msg",
1045
+ timestamp: "2026-03-18T15:01:00Z",
1046
+ payload: {
1047
+ type: "agent_message",
1048
+ message: "early"
1049
+ }
1050
+ },
1051
+ ...pad
1052
+ ]);
1053
+ const session = new CodexSessionParser({
1054
+ summaryBounds: bounds
1055
+ }).readSessionIncremental(filePath);
1056
+ expect(session).toMatchObject({
1057
+ sessionId: "sess-1",
1058
+ projectPath: "/repo",
1059
+ summary: "Codex session active",
1060
+ lastPayloadType: undefined,
1061
+ sessionStart: new Date("2026-03-18T15:00:00Z"),
1062
+ lastActive: new Date("2026-03-18T15:00:00Z")
1063
+ });
1064
+ });
1065
+ it("Codex: a session_meta line longer than the head cap yields no session", ()=>{
1066
+ const pad = filler(40, {
1067
+ type: "event_msg",
1068
+ payload: {
1069
+ type: "agent_message",
1070
+ message: "hi"
1071
+ }
1072
+ });
1073
+ const filePath = write("rollout.jsonl", [
1074
+ {
1075
+ type: "session_meta",
1076
+ payload: {
1077
+ id: "sess-1",
1078
+ base: "x".repeat(400)
1079
+ }
1080
+ },
1081
+ ...pad.map((l)=>JSON.parse(l))
1082
+ ]);
1083
+ expect(new CodexSessionParser({
1084
+ summaryBounds: bounds
1085
+ }).readSessionIncremental(filePath)).toBeNull();
1086
+ });
1087
+ });
1088
+
1089
+ //# sourceMappingURL=SessionSummaryEquivalence.test.js.map