@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,414 @@
1
+ import * as fs from "fs";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+
5
+ import {
6
+ DEFAULT_HEAD_BYTES,
7
+ DEFAULT_TAIL_BYTES,
8
+ IncrementalJsonlSummary,
9
+ reduceJsonlContent,
10
+ type JsonlSummaryReducer,
11
+ } from "../../utils/IncrementalJsonlSummary.js";
12
+
13
+ vi.mock("fs", async (importOriginal) => {
14
+ const actual = (await importOriginal()) as typeof import("fs");
15
+ return { ...actual, readSync: vi.fn(actual.readSync), readFileSync: vi.fn(actual.readFileSync) };
16
+ });
17
+
18
+ const mockedReadSync = vi.mocked(fs.readSync);
19
+ const mockedReadFileSync = vi.mocked(fs.readFileSync);
20
+
21
+ /** Records every parsed entry (malformed lines as "<bad>") plus a running count. */
22
+ interface RecordingState {
23
+ count: number;
24
+ entries: unknown[];
25
+ }
26
+
27
+ const recordingReducer: JsonlSummaryReducer<RecordingState> = {
28
+ initial: () => ({ count: 0, entries: [] }),
29
+ reduce: (state, entry) => ({
30
+ count: state.count + 1,
31
+ entries: [...state.entries, entry === undefined ? "<bad>" : entry],
32
+ }),
33
+ };
34
+
35
+ function bytesRead(): number {
36
+ let total = 0;
37
+ for (const result of mockedReadSync.mock.results) {
38
+ if (result.type === "return") total += result.value as number;
39
+ }
40
+ for (const result of mockedReadFileSync.mock.results) {
41
+ if (result.type === "return") total += Buffer.byteLength(result.value as string | Buffer);
42
+ }
43
+ return total;
44
+ }
45
+
46
+ function line(value: unknown): string {
47
+ return `${JSON.stringify(value)}\n`;
48
+ }
49
+
50
+ describe("reduceJsonlContent", () => {
51
+ it("folds non-blank lines, passing undefined for malformed JSON", () => {
52
+ const state = reduceJsonlContent(recordingReducer, '\n \n{"a":1}\nnot json\n\n{"b":2}');
53
+ expect(state.entries).toEqual([{ a: 1 }, "<bad>", { b: 2 }]);
54
+ });
55
+
56
+ it("returns the initial state for empty content", () => {
57
+ expect(reduceJsonlContent(recordingReducer, "")).toEqual({ count: 0, entries: [] });
58
+ });
59
+ });
60
+
61
+ describe("IncrementalJsonlSummary", () => {
62
+ let tmpDir: string;
63
+ let filePath: string;
64
+ let cache: IncrementalJsonlSummary<RecordingState>;
65
+
66
+ beforeEach(() => {
67
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "incremental-jsonl-"));
68
+ filePath = path.join(tmpDir, "session.jsonl");
69
+ cache = new IncrementalJsonlSummary(recordingReducer);
70
+ mockedReadSync.mockClear();
71
+ mockedReadFileSync.mockClear();
72
+ });
73
+
74
+ afterEach(() => {
75
+ fs.rmSync(tmpDir, { recursive: true, force: true });
76
+ });
77
+
78
+ it("returns null for a missing file", () => {
79
+ expect(cache.read(path.join(tmpDir, "missing.jsonl"))).toBeNull();
80
+ expect(cache.size).toBe(0);
81
+ });
82
+
83
+ it("summarizes a file and reports its size and mtime", () => {
84
+ fs.writeFileSync(filePath, line({ a: 1 }) + line({ b: 2 }));
85
+ const stat = fs.statSync(filePath);
86
+
87
+ const result = cache.read(filePath);
88
+
89
+ expect(result?.state.entries).toEqual([{ a: 1 }, { b: 2 }]);
90
+ expect(result?.size).toBe(stat.size);
91
+ expect(result?.mtime).toEqual(stat.mtime);
92
+ });
93
+
94
+ it("reads 0 bytes when the file is unchanged", () => {
95
+ fs.writeFileSync(filePath, line({ a: 1 }) + line({ b: 2 }));
96
+ const first = cache.read(filePath);
97
+ mockedReadSync.mockClear();
98
+ mockedReadFileSync.mockClear();
99
+
100
+ const second = cache.read(filePath);
101
+
102
+ expect(bytesRead()).toBe(0);
103
+ expect(second?.state).toEqual(first?.state);
104
+ });
105
+
106
+ it("reads only the appended bytes when the file grows", () => {
107
+ fs.writeFileSync(filePath, line({ a: "x".repeat(200_000) }));
108
+ cache.read(filePath);
109
+ mockedReadSync.mockClear();
110
+
111
+ const appended = line({ b: 2 }) + line({ c: 3 });
112
+ fs.appendFileSync(filePath, appended);
113
+ const result = cache.read(filePath);
114
+
115
+ expect(bytesRead()).toBe(Buffer.byteLength(appended));
116
+ expect(result?.state.entries.slice(1)).toEqual([{ b: 2 }, { c: 3 }]);
117
+ expect(result?.state.count).toBe(3);
118
+ });
119
+
120
+ it("handles lines spanning read chunks and multi-byte characters", () => {
121
+ const small = new IncrementalJsonlSummary(recordingReducer, { chunkSize: 7 });
122
+ const entries = [{ text: "héllo wörld 👋" }, { text: "日本語のテキスト" }, { n: 3 }];
123
+ fs.writeFileSync(filePath, entries.map(line).join(""));
124
+
125
+ expect(small.read(filePath)?.state.entries).toEqual(entries);
126
+ });
127
+
128
+ it("does not reduce an unterminated line until it is complete, without duplicating it", () => {
129
+ fs.writeFileSync(filePath, line({ a: 1 }) + '{"b":');
130
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }]);
131
+
132
+ fs.appendFileSync(filePath, "2");
133
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }]);
134
+
135
+ fs.appendFileSync(filePath, "}\n");
136
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }]);
137
+
138
+ fs.appendFileSync(filePath, line({ c: 3 }));
139
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }, { c: 3 }]);
140
+ });
141
+
142
+ it("includes a valid unterminated last line in the result but re-reads it once terminated", () => {
143
+ fs.writeFileSync(filePath, line({ a: 1 }) + '{"b":2}');
144
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }]);
145
+
146
+ fs.appendFileSync(filePath, "\n" + line({ c: 3 }));
147
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { b: 2 }, { c: 3 }]);
148
+ });
149
+
150
+ it("matches a one-shot fold for every split point of an appended file", () => {
151
+ const content = [
152
+ line({ a: 1 }),
153
+ "\n",
154
+ "garbage\n",
155
+ line({ b: "ünïcode" }),
156
+ line({ c: [1, 2, 3] }),
157
+ '{"d":4}',
158
+ ].join("");
159
+ const buffer = Buffer.from(content);
160
+ const expected = reduceJsonlContent(recordingReducer, content);
161
+
162
+ for (let split = 0; split <= buffer.length; split++) {
163
+ const splitCache = new IncrementalJsonlSummary(recordingReducer, { chunkSize: 5 });
164
+ fs.writeFileSync(filePath, buffer.subarray(0, split));
165
+ splitCache.read(filePath);
166
+ fs.appendFileSync(filePath, buffer.subarray(split));
167
+ expect(splitCache.read(filePath)?.state).toEqual(expected);
168
+ }
169
+ });
170
+
171
+ it("rebuilds when the file shrinks", () => {
172
+ fs.writeFileSync(filePath, line({ a: 1 }) + line({ b: 2 }));
173
+ cache.read(filePath);
174
+
175
+ fs.writeFileSync(filePath, line({ z: 9 }));
176
+
177
+ expect(cache.read(filePath)?.state.entries).toEqual([{ z: 9 }]);
178
+ });
179
+
180
+ it("rebuilds when the file is replaced by a different inode", () => {
181
+ fs.writeFileSync(filePath, line({ a: 1 }));
182
+ cache.read(filePath);
183
+
184
+ const replacement = path.join(tmpDir, "replacement.jsonl");
185
+ fs.writeFileSync(replacement, line({ a: 1 }) + line({ rotated: true }));
186
+ fs.renameSync(replacement, filePath);
187
+
188
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { rotated: true }]);
189
+ });
190
+
191
+ it("rebuilds when the size is unchanged but the mtime moved", () => {
192
+ fs.writeFileSync(filePath, line({ a: 1 }));
193
+ cache.read(filePath);
194
+
195
+ fs.writeFileSync(filePath, line({ b: 2 }));
196
+ const future = new Date(Date.now() + 10_000);
197
+ fs.utimesSync(filePath, future, future);
198
+
199
+ expect(cache.read(filePath)?.state.entries).toEqual([{ b: 2 }]);
200
+ });
201
+
202
+ it("drops the entry when a cached file disappears", () => {
203
+ fs.writeFileSync(filePath, line({ a: 1 }));
204
+ cache.read(filePath);
205
+ fs.rmSync(filePath);
206
+
207
+ expect(cache.read(filePath)).toBeNull();
208
+ expect(cache.size).toBe(0);
209
+ });
210
+
211
+ it("evicts entries not read since the previous prune", () => {
212
+ const other = path.join(tmpDir, "other.jsonl");
213
+ fs.writeFileSync(filePath, line({ a: 1 }));
214
+ fs.writeFileSync(other, line({ b: 2 }));
215
+
216
+ cache.read(filePath);
217
+ cache.read(other);
218
+ cache.prune();
219
+ expect(cache.size).toBe(2);
220
+
221
+ cache.read(filePath);
222
+ cache.prune();
223
+ expect(cache.size).toBe(1);
224
+
225
+ cache.prune();
226
+ expect(cache.size).toBe(0);
227
+ });
228
+
229
+ it("keeps only reducer state and stat metadata per entry", () => {
230
+ fs.writeFileSync(filePath, line({ a: "x".repeat(10_000) }) + '{"partial":');
231
+ cache.read(filePath);
232
+
233
+ const entry = (cache as any).entries.get(filePath);
234
+ expect(Object.keys(entry).sort()).toEqual(
235
+ [
236
+ "committed",
237
+ "dev",
238
+ "discarding",
239
+ "ino",
240
+ "mtime",
241
+ "mtimeMs",
242
+ "offset",
243
+ "seen",
244
+ "size",
245
+ "skippedBytes",
246
+ "state",
247
+ ].sort(),
248
+ );
249
+ });
250
+ });
251
+
252
+ describe("IncrementalJsonlSummary bounded cold start", () => {
253
+ let tmpDir: string;
254
+ let filePath: string;
255
+
256
+ /** Records entries plus how many times the middle of the file was skipped. */
257
+ interface GapState extends RecordingState {
258
+ gaps: number;
259
+ }
260
+ const gapReducer: JsonlSummaryReducer<GapState> = {
261
+ initial: () => ({ count: 0, entries: [], gaps: 0 }),
262
+ reduce: (state, entry) => ({
263
+ ...state,
264
+ count: state.count + 1,
265
+ entries: [...state.entries, entry === undefined ? "<bad>" : entry],
266
+ }),
267
+ skip: (state) => ({ ...state, gaps: state.gaps + 1 }),
268
+ };
269
+
270
+ const bounds = { headBytes: 64, tailBytes: 128 };
271
+ const pad = (n: number) => line({ pad: "p".repeat(n) });
272
+
273
+ beforeEach(() => {
274
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "bounded-jsonl-"));
275
+ filePath = path.join(tmpDir, "session.jsonl");
276
+ mockedReadSync.mockClear();
277
+ mockedReadFileSync.mockClear();
278
+ });
279
+
280
+ afterEach(() => {
281
+ fs.rmSync(tmpDir, { recursive: true, force: true });
282
+ });
283
+
284
+ it("parses the whole file when it fits within head + tail", () => {
285
+ const content = line({ a: 1 }) + pad(100) + line({ z: 9 });
286
+ expect(Buffer.byteLength(content)).toBeLessThanOrEqual(192);
287
+ fs.writeFileSync(filePath, content);
288
+
289
+ const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);
290
+
291
+ expect(result?.state).toEqual(reduceJsonlContent(gapReducer, content));
292
+ expect(result?.skippedBytes).toBe(0);
293
+ });
294
+
295
+ it("folds head lines, then skip(), then tail lines, reading at most head + tail + 1 bytes", () => {
296
+ const tail = line({ y: 8 }) + line({ z: 9 });
297
+ const content = line({ a: 1 }) + pad(40) + pad(1000) + pad(40) + tail;
298
+ fs.writeFileSync(filePath, content);
299
+
300
+ const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);
301
+
302
+ // +1: the byte before the tail window tells whether it starts on a line boundary
303
+ expect(bytesRead()).toBeLessThanOrEqual(bounds.headBytes + bounds.tailBytes + 1);
304
+ expect(result?.state.gaps).toBe(1);
305
+ expect(result?.state.entries[0]).toEqual({ a: 1 });
306
+ expect(result?.state.entries.slice(-2)).toEqual([{ y: 8 }, { z: 9 }]);
307
+ expect(result?.state.entries).not.toContainEqual({ pad: "p".repeat(1000) });
308
+ expect(result?.size).toBe(Buffer.byteLength(content));
309
+ expect(result?.skippedBytes).toBe(Buffer.byteLength(content) - 64 - 128);
310
+ });
311
+
312
+ it("drops lines that straddle the head cap or the tail window start", () => {
313
+ const content = line({ a: 1 }) + pad(500) + line({ z: 9 });
314
+ fs.writeFileSync(filePath, content);
315
+
316
+ const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);
317
+
318
+ expect(result?.state.entries).toEqual([{ a: 1 }, { z: 9 }]);
319
+ });
320
+
321
+ it("folds the first tail line when the tail window starts exactly on a line boundary", () => {
322
+ const tail = line({ y: 8 }) + line({ z: 9 });
323
+ fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + tail);
324
+
325
+ const result = new IncrementalJsonlSummary(gapReducer, {
326
+ bounds: { headBytes: 64, tailBytes: Buffer.byteLength(tail) },
327
+ }).read(filePath);
328
+
329
+ expect(result?.skippedBytes).toBeGreaterThan(0);
330
+ expect(result?.state.entries).toEqual([{ a: 1 }, { y: 8 }, { z: 9 }]);
331
+ });
332
+
333
+ it("still drops the partial line when the tail window starts one byte into it", () => {
334
+ const tail = line({ y: 8 }) + line({ z: 9 });
335
+ fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + tail);
336
+
337
+ const result = new IncrementalJsonlSummary(gapReducer, {
338
+ bounds: { headBytes: 64, tailBytes: Buffer.byteLength(tail) - 1 },
339
+ }).read(filePath);
340
+
341
+ expect(result?.state.entries).toEqual([{ a: 1 }, { z: 9 }]);
342
+ });
343
+
344
+ it("folds nothing from a tail window that holds no line start", () => {
345
+ const content = line({ a: 1 }) + line({ big: "b".repeat(1000) });
346
+ fs.writeFileSync(filePath, content);
347
+
348
+ const result = new IncrementalJsonlSummary(gapReducer, { bounds }).read(filePath);
349
+
350
+ expect(result?.state.entries).toEqual([{ a: 1 }]);
351
+ expect(result?.state.gaps).toBe(1);
352
+ });
353
+
354
+ it("seeds the cache at end of file, so later appends read only the new bytes", () => {
355
+ const cache = new IncrementalJsonlSummary(gapReducer, { bounds });
356
+ fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + line({ z: 9 }));
357
+ cache.read(filePath);
358
+ mockedReadSync.mockClear();
359
+
360
+ const appended = line({ n: 10 });
361
+ fs.appendFileSync(filePath, appended);
362
+ const result = cache.read(filePath);
363
+
364
+ expect(bytesRead()).toBe(Buffer.byteLength(appended));
365
+ expect(result?.state.entries.slice(-2)).toEqual([{ z: 9 }, { n: 10 }]);
366
+ expect(result?.state.gaps).toBe(1);
367
+ expect(result?.skippedBytes).toBeGreaterThan(0);
368
+ });
369
+
370
+ it("resynchronises on the next newline when the tail window ended inside a line", () => {
371
+ const cache = new IncrementalJsonlSummary(gapReducer, { bounds });
372
+ fs.writeFileSync(filePath, line({ a: 1 }) + '{"big":"' + "b".repeat(1000));
373
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }]);
374
+
375
+ fs.appendFileSync(filePath, '"}\n' + line({ n: 10 }));
376
+
377
+ expect(cache.read(filePath)?.state.entries).toEqual([{ a: 1 }, { n: 10 }]);
378
+ });
379
+
380
+ it("uses the bounded scan again when rebuilding a replaced file", () => {
381
+ const cache = new IncrementalJsonlSummary(gapReducer, { bounds });
382
+ fs.writeFileSync(filePath, line({ a: 1 }));
383
+ cache.read(filePath);
384
+
385
+ const replacement = path.join(tmpDir, "replacement.jsonl");
386
+ fs.writeFileSync(replacement, line({ b: 2 }) + pad(1000) + line({ z: 9 }));
387
+ fs.renameSync(replacement, filePath);
388
+ mockedReadSync.mockClear();
389
+
390
+ const result = cache.read(filePath);
391
+ // +1: the byte before the tail window tells whether it starts on a line boundary
392
+ expect(bytesRead()).toBeLessThanOrEqual(bounds.headBytes + bounds.tailBytes + 1);
393
+ expect(result?.state.entries).toEqual([{ b: 2 }, { z: 9 }]);
394
+ });
395
+
396
+ it("folds tail lines straight onto the head state when the reducer has no skip()", () => {
397
+ fs.writeFileSync(filePath, line({ a: 1 }) + pad(1000) + line({ z: 9 }));
398
+ const result = new IncrementalJsonlSummary(recordingReducer, { bounds }).read(filePath);
399
+ expect(result?.state).toEqual({ count: 2, entries: [{ a: 1 }, { z: 9 }] });
400
+ });
401
+
402
+ it("parses from byte 0 when bounds are disabled", () => {
403
+ const content = line({ a: 1 }) + pad(1000) + line({ z: 9 });
404
+ fs.writeFileSync(filePath, content);
405
+ const result = new IncrementalJsonlSummary(gapReducer, { bounds: false }).read(filePath);
406
+ expect(result?.state).toEqual(reduceJsonlContent(gapReducer, content));
407
+ expect(result?.skippedBytes).toBe(0);
408
+ });
409
+
410
+ it("defaults to a 1 MiB head and 4 MiB tail", () => {
411
+ expect(DEFAULT_HEAD_BYTES).toBe(1024 * 1024);
412
+ expect(DEFAULT_TAIL_BYTES).toBe(4 * 1024 * 1024);
413
+ });
414
+ });
@@ -1,5 +1,8 @@
1
- import { describe, expect, it } from "vitest";
2
- import { AGENTS } from "../../../src/utils/agents.js";
1
+ import * as fs from "fs";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+ import { afterEach, beforeEach, describe, expect, it } from "vitest";
5
+ import { AGENTS } from "../../utils/agents.js";
3
6
 
4
7
  describe("AGENTS", () => {
5
8
  it("includes Copilot as a startable agent", () => {
@@ -21,4 +24,82 @@ describe("AGENTS", () => {
21
24
  expect(AGENTS.grok_cli.matches("/Users/dev/.grok/bin/grok --always-approve")).toBe(true);
22
25
  expect(AGENTS.grok_cli.matches("node /repo/feature-grok-cli/script.js")).toBe(false);
23
26
  });
27
+
28
+ it("includes Kiro as a startable agent", () => {
29
+ expect(AGENTS.kiro.command).toBe("kiro-cli");
30
+ expect(AGENTS.kiro.matches("kiro-cli")).toBe(true);
31
+ expect(AGENTS.kiro.matches("/usr/local/bin/kiro --model x")).toBe(true);
32
+ expect(AGENTS.kiro.matches("node /repo/feature-kiro-adapter/script.js")).toBe(false);
33
+ });
34
+
35
+ it("matches Gemini as argv[0] or as a script argument", () => {
36
+ expect(AGENTS.gemini_cli.matches("gemini --yolo")).toBe(true);
37
+ expect(AGENTS.gemini_cli.matches("node --no-warnings /usr/local/bin/gemini")).toBe(true);
38
+ expect(AGENTS.gemini_cli.matches("node /repo/gemini-tools/script.js")).toBe(false);
39
+ });
40
+ });
41
+
42
+ describe("AGENTS matchers with executables under paths containing spaces", () => {
43
+ let root: string;
44
+
45
+ function install(relativePath: string): string {
46
+ const fullPath = path.join(root, relativePath);
47
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
48
+ fs.writeFileSync(fullPath, "");
49
+ return fullPath;
50
+ }
51
+
52
+ beforeEach(() => {
53
+ root = fs.mkdtempSync(path.join(os.tmpdir(), "agents-spaces-"));
54
+ });
55
+
56
+ afterEach(() => {
57
+ fs.rmSync(root, { recursive: true, force: true });
58
+ });
59
+
60
+ it("recognises argv[0] under a spaced directory (matchArgv0)", () => {
61
+ const codex = install("Applications/Some App.app/Contents/Resources/codex");
62
+ const claude = install("Users/dev/My Tools/bin/claude");
63
+
64
+ expect(AGENTS.codex.matches(`${codex} --sandbox workspace-write`)).toBe(true);
65
+ expect(AGENTS.codex.matches(codex)).toBe(true);
66
+ expect(AGENTS.claude.matches(`${claude} --continue`)).toBe(true);
67
+ expect(AGENTS.claude.matches(`${codex} exec --cd /repo`)).toBe(false);
68
+ });
69
+
70
+ it("recognises argv[0] under a spaced directory by name (matchArgv0Name)", () => {
71
+ const copilot = install("opt/Home Brew/Caskroom/copilot-cli/1.0.60/copilot");
72
+
73
+ expect(AGENTS.copilot.matches(`${copilot} --allow-all-tools`)).toBe(true);
74
+ });
75
+
76
+ it("does not treat arguments containing spaces as the executable", () => {
77
+ const vim = install("usr/bin/vim");
78
+ const codex = install("Applications/Some App.app/Contents/Resources/codex");
79
+
80
+ expect(AGENTS.claude.matches(`${vim} My Notes/claude`)).toBe(false);
81
+ expect(AGENTS.claude.matches(`${codex} exec review the Other Dir/claude`)).toBe(false);
82
+ expect(AGENTS.copilot.matches(`${vim} Some Dir/copilot-cli/notes.md`)).toBe(false);
83
+ expect(AGENTS.claude.matches("/usr/bin/vim My Notes/claude")).toBe(false);
84
+ });
85
+
86
+ it("recognises a spaced argv[0] in the any-token matchers", () => {
87
+ const pi = install("Users/dev/Node Tools/bin/pi");
88
+ const kiro = install("Applications/Kiro CLI.app/Contents/MacOS/kiro-cli");
89
+ const node = install("Applications/Dev Tools/node/bin/node");
90
+
91
+ expect(AGENTS.pi.matches(`${pi} --model x`)).toBe(true);
92
+ expect(AGENTS.kiro.matches(`${kiro} chat`)).toBe(true);
93
+ expect(AGENTS.gemini_cli.matches(`${node} /Users/dev/.npm/bin/gemini --yolo`)).toBe(true);
94
+ expect(AGENTS.pi.matches(`${node} /opt/pi-tools/script.js`)).toBe(false);
95
+ });
96
+
97
+ it("does not match words inside a spaced argv[0] directory in the any-token matchers", () => {
98
+ const node = install("opt/Dev pi gemini/bin/node");
99
+
100
+ expect(AGENTS.pi.matches(`${node} /repo/script.js`)).toBe(false);
101
+ expect(AGENTS.gemini_cli.matches(`${node} /repo/script.js`)).toBe(false);
102
+ expect(AGENTS.gemini_cli.matches(`${node} /repo/bin/gemini`)).toBe(true);
103
+ expect(AGENTS.pi.matches(`${node} --title pi`)).toBe(true);
104
+ });
24
105
  });
@@ -0,0 +1,193 @@
1
+ /**
2
+ * Large-transcript measurement for `getConversation({ tail })` (issue #260).
3
+ *
4
+ * Skipped by default. Run with:
5
+ * AI_DEVKIT_TAIL_BENCH=1 npx vitest run src/__tests__/utils/conversationTail.bench.test.ts
6
+ *
7
+ * Generates a synthetic ~400 MB transcript per adapter under os.tmpdir(),
8
+ * counts bytes read through `fs`, and checks the acceptance limits: the first
9
+ * tail read reads <= 2 MB in <= 50 ms, and a poll after appending K bytes
10
+ * reads <= K + 64 KiB. The file is deleted afterwards.
11
+ */
12
+ import * as fs from "fs";
13
+ import * as os from "os";
14
+ import * as path from "path";
15
+ import { afterAll, beforeAll, describe, expect, it, vi } from "vitest";
16
+ import { ClaudeSessionParser } from "../../harnesses/claude/ClaudeSessionParser.js";
17
+ import { CodexSessionParser } from "../../harnesses/codex/CodexSessionParser.js";
18
+
19
+ const readBytes = vi.hoisted(() => ({ total: 0 }));
20
+
21
+ vi.mock("fs", async (importOriginal) => {
22
+ const actual = await importOriginal<typeof import("fs")>();
23
+ const readSync = ((...args: Parameters<typeof actual.readSync>) => {
24
+ const n = (actual.readSync as (...a: unknown[]) => number)(...args);
25
+ readBytes.total += n;
26
+ return n;
27
+ }) as typeof actual.readSync;
28
+ const readFileSync = ((...args: Parameters<typeof actual.readFileSync>) => {
29
+ const out = (actual.readFileSync as (...a: unknown[]) => string | Buffer)(...args);
30
+ readBytes.total += typeof out === "string" ? Buffer.byteLength(out) : out.length;
31
+ return out;
32
+ }) as typeof actual.readFileSync;
33
+ return { ...actual, readSync, readFileSync, default: { ...actual, readSync, readFileSync } };
34
+ });
35
+
36
+ const TARGET_BYTES = 400 * 1024 * 1024;
37
+ const TAIL = 20;
38
+ const MB = 1024 * 1024;
39
+
40
+ function writeLargeFile(file: string, header: string[], turn: (i: number) => string[]): void {
41
+ const fd = fs.openSync(file, "w");
42
+ try {
43
+ fs.writeSync(fd, header.map((l) => l + "\n").join(""));
44
+ let written = 0;
45
+ let i = 0;
46
+ while (written < TARGET_BYTES) {
47
+ const parts: string[] = [];
48
+ for (let k = 0; k < 500; k++, i++) {
49
+ for (const line of turn(i)) parts.push(line, "\n");
50
+ }
51
+ const block = parts.join("");
52
+ fs.writeSync(fd, block);
53
+ written += Buffer.byteLength(block);
54
+ }
55
+ } finally {
56
+ fs.closeSync(fd);
57
+ }
58
+ }
59
+
60
+ const filler = "x".repeat(2000);
61
+
62
+ const adapters = [
63
+ {
64
+ name: "codex",
65
+ create: () => new CodexSessionParser(),
66
+ header: [JSON.stringify({ type: "session_meta", payload: { id: "bench", cwd: "/repo" } })],
67
+ turn: (i: number) => {
68
+ const turnId = `t${i}`;
69
+ return [
70
+ JSON.stringify({
71
+ type: "response_item",
72
+ timestamp: "2026-01-01T00:00:00Z",
73
+ payload: {
74
+ type: "message",
75
+ role: "user",
76
+ content: [{ type: "input_text", text: `question ${i}` }],
77
+ internal_chat_message_metadata_passthrough: { turn_id: turnId },
78
+ },
79
+ }),
80
+ JSON.stringify({
81
+ type: "event_msg",
82
+ payload: {
83
+ type: "item_completed",
84
+ turn_id: turnId,
85
+ item: { type: "UserMessage", content: [{ type: "text", text: `question ${i}` }] },
86
+ },
87
+ }),
88
+ JSON.stringify({
89
+ type: "response_item",
90
+ payload: { type: "function_call_output", output: filler },
91
+ }),
92
+ JSON.stringify({
93
+ type: "event_msg",
94
+ payload: { type: "agent_message", message: `answer ${i}` },
95
+ }),
96
+ ];
97
+ },
98
+ appendTurn: (i: number) =>
99
+ JSON.stringify({
100
+ type: "event_msg",
101
+ payload: { type: "agent_message", message: `appended ${i}` },
102
+ }),
103
+ },
104
+ {
105
+ name: "claude",
106
+ create: () => new ClaudeSessionParser(),
107
+ header: [JSON.stringify({ type: "file-history-snapshot", snapshot: {} })],
108
+ turn: (i: number) => [
109
+ JSON.stringify({ type: "user", message: { content: `question ${i}` } }),
110
+ JSON.stringify({
111
+ type: "assistant",
112
+ message: { content: [{ type: "tool_use", name: "Bash", input: { command: "ls" } }] },
113
+ }),
114
+ JSON.stringify({
115
+ type: "user",
116
+ message: { content: [{ type: "tool_result", content: filler }] },
117
+ }),
118
+ JSON.stringify({
119
+ type: "assistant",
120
+ message: { content: [{ type: "text", text: `answer ${i}` }] },
121
+ }),
122
+ ],
123
+ appendTurn: (i: number) =>
124
+ JSON.stringify({
125
+ type: "assistant",
126
+ message: { content: [{ type: "text", text: `appended ${i}` }] },
127
+ }),
128
+ },
129
+ ];
130
+
131
+ describe.skipIf(!process.env.AI_DEVKIT_TAIL_BENCH)(
132
+ "getConversation tail on a 400 MB transcript",
133
+ () => {
134
+ let tmpDir: string;
135
+
136
+ beforeAll(() => {
137
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "tail-bench-"));
138
+ });
139
+
140
+ afterAll(() => {
141
+ fs.rmSync(tmpDir, { recursive: true, force: true });
142
+ });
143
+
144
+ it.each(adapters)(
145
+ "$name: first call and incremental polls stay within the byte/time budget",
146
+ (adapter) => {
147
+ const file = path.join(tmpDir, `${adapter.name}.jsonl`);
148
+ writeLargeFile(file, adapter.header, adapter.turn);
149
+ const size = fs.statSync(file).size;
150
+ expect(size).toBeGreaterThanOrEqual(TARGET_BYTES);
151
+
152
+ const parser = adapter.create();
153
+ readBytes.total = 0;
154
+ const rssBefore = process.memoryUsage().rss;
155
+ const start = performance.now();
156
+ const messages = parser.getConversation(file, { tail: TAIL });
157
+ const firstMs = performance.now() - start;
158
+ const firstRead = readBytes.total;
159
+ const rssDelta = process.memoryUsage().rss - rssBefore;
160
+
161
+ expect(messages).toHaveLength(TAIL);
162
+ expect(messages.at(-1)?.content).toMatch(/^answer \d+$/);
163
+
164
+ const polls: string[] = [];
165
+ for (let round = 0; round < 3; round++) {
166
+ const appended = adapter.appendTurn(round) + "\n";
167
+ fs.appendFileSync(file, appended);
168
+ readBytes.total = 0;
169
+ const t0 = performance.now();
170
+ const next = parser.getConversation(file, { tail: TAIL });
171
+ const pollMs = performance.now() - t0;
172
+ expect(next.at(-1)?.content).toBe(`appended ${round}`);
173
+ expect(next).toHaveLength(TAIL);
174
+ const k = Buffer.byteLength(appended);
175
+ expect(readBytes.total).toBeLessThanOrEqual(k + 64 * 1024);
176
+ polls.push(`K=${k}B read=${readBytes.total}B ${pollMs.toFixed(2)}ms`);
177
+ }
178
+
179
+ console.log(
180
+ `[${adapter.name}] file=${(size / MB).toFixed(1)} MB first call: ` +
181
+ `read=${(firstRead / 1024).toFixed(1)} KiB, ${firstMs.toFixed(2)} ms, ` +
182
+ `rssDelta=${(rssDelta / MB).toFixed(1)} MB; polls: ${polls.join("; ")}`,
183
+ );
184
+
185
+ expect(firstRead).toBeLessThanOrEqual(2 * MB);
186
+ expect(firstMs).toBeLessThanOrEqual(50);
187
+
188
+ fs.rmSync(file, { force: true });
189
+ },
190
+ 120_000,
191
+ );
192
+ },
193
+ );