@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,209 @@
1
+ /**
2
+ * Incremental JSONL Summary
3
+ *
4
+ * Keeps a small per-file summary of append-only JSONL transcripts so repeated
5
+ * refreshes only parse bytes that were appended since the previous read.
6
+ *
7
+ * Usage:
8
+ * ```ts
9
+ * const summaries = new IncrementalJsonlSummary<MyState>({
10
+ * initial: () => ({ lastType: undefined }),
11
+ * reduce: (state, entry) => ({ ...state, lastType: (entry as any)?.type }),
12
+ * });
13
+ *
14
+ * const result = summaries.read(filePath); // { state, size, mtime, skippedBytes } | null
15
+ * summaries.prune(); // once per refresh: evict paths not read since the last prune
16
+ * ```
17
+ *
18
+ * Read rules, keyed by file path:
19
+ * - dev, ino, size and mtimeMs unchanged → cached state, 0 bytes read.
20
+ * - same dev/ino and size grew → read only the bytes after the last complete line.
21
+ * - anything else (first read, shrink, rotation, in-place rewrite) → rebuild.
22
+ *
23
+ * A rebuild of a file larger than `headBytes + tailBytes` (default 1 MiB +
24
+ * 4 MiB) is a bounded cold start rather than a full parse: it folds the
25
+ * complete lines in `[0, headBytes)`, calls `reducer.skip(state)`, then folds
26
+ * the lines that start inside `[size - tailBytes, size)`, including a line
27
+ * that starts exactly at `size - tailBytes` (one extra byte before the window
28
+ * is read to tell). Lines straddling a window edge are dropped. A field whose
29
+ * entries all sit in the skipped middle keeps whatever `skip` leaves; there is
30
+ * never a hidden full scan. The result's `skippedBytes` reports the unread
31
+ * middle, and the cache is seeded at end of file so later appends stay
32
+ * incremental.
33
+ *
34
+ * An unterminated last line is never folded into the committed state. If it
35
+ * already parses as JSON it is applied to the returned state only, and it is
36
+ * re-read (from its start offset) once more bytes arrive.
37
+ */ import * as fs from "fs";
38
+ export const DEFAULT_HEAD_BYTES = 1024 * 1024;
39
+ export const DEFAULT_TAIL_BYTES = 4 * 1024 * 1024;
40
+ const DEFAULT_CHUNK_SIZE = 1024 * 1024;
41
+ const NEWLINE = 0x0a;
42
+ /** Fold a whole JSONL string with a reducer (one-shot, uncached). */ export function reduceJsonlContent(reducer, content) {
43
+ let state = reducer.initial();
44
+ for (const line of content.split("\n")){
45
+ state = reduceLine(reducer, state, line);
46
+ }
47
+ return state;
48
+ }
49
+ export class IncrementalJsonlSummary {
50
+ reducer;
51
+ entries = new Map();
52
+ chunkSize;
53
+ bounds;
54
+ generation = 0;
55
+ constructor(reducer, options = {}){
56
+ this.reducer = reducer;
57
+ this.chunkSize = options.chunkSize ?? DEFAULT_CHUNK_SIZE;
58
+ this.bounds = options.bounds ?? {
59
+ headBytes: DEFAULT_HEAD_BYTES,
60
+ tailBytes: DEFAULT_TAIL_BYTES
61
+ };
62
+ }
63
+ /** Number of cached files. */ get size() {
64
+ return this.entries.size;
65
+ }
66
+ /** Return the summary of `filePath`, reading only what changed. Null if unreadable. */ read(filePath) {
67
+ let stat;
68
+ try {
69
+ stat = fs.statSync(filePath);
70
+ } catch {
71
+ this.entries.delete(filePath);
72
+ return null;
73
+ }
74
+ const cached = this.entries.get(filePath);
75
+ const sameFile = cached !== undefined && cached.dev === stat.dev && cached.ino === stat.ino;
76
+ if (sameFile && cached.size === stat.size && cached.mtimeMs === stat.mtimeMs) {
77
+ cached.seen = this.generation;
78
+ return toResult(cached);
79
+ }
80
+ const appended = sameFile && stat.size > cached.size;
81
+ const entry = appended ? {
82
+ ...cached
83
+ } : {
84
+ dev: stat.dev,
85
+ ino: stat.ino,
86
+ size: 0,
87
+ mtimeMs: 0,
88
+ mtime: stat.mtime,
89
+ offset: 0,
90
+ discarding: false,
91
+ committed: this.reducer.initial(),
92
+ state: this.reducer.initial(),
93
+ skippedBytes: 0,
94
+ seen: this.generation
95
+ };
96
+ try {
97
+ const fd = fs.openSync(filePath, "r");
98
+ try {
99
+ const bounds = this.bounds;
100
+ if (!appended && bounds && stat.size > bounds.headBytes + bounds.tailBytes) {
101
+ this.readBounded(fd, entry, stat.size, bounds);
102
+ } else {
103
+ this.readRange(fd, entry, stat.size);
104
+ }
105
+ } finally{
106
+ fs.closeSync(fd);
107
+ }
108
+ } catch {
109
+ this.entries.delete(filePath);
110
+ return null;
111
+ }
112
+ entry.mtimeMs = stat.mtimeMs;
113
+ entry.mtime = stat.mtime;
114
+ entry.seen = this.generation;
115
+ this.entries.set(filePath, entry);
116
+ return toResult(entry);
117
+ }
118
+ /** Evict entries not read since the previous `prune()` call. Call once per refresh. */ prune() {
119
+ for (const [filePath, entry] of this.entries){
120
+ if (entry.seen !== this.generation) {
121
+ this.entries.delete(filePath);
122
+ }
123
+ }
124
+ this.generation++;
125
+ }
126
+ /** Cold start: fold the head lines, `skip`, then the lines starting in the tail window. */ readBounded(fd, entry, size, { headBytes, tailBytes }) {
127
+ this.readRange(fd, entry, headBytes);
128
+ const tailStart = size - tailBytes;
129
+ const head = entry.committed;
130
+ entry.committed = this.reducer.skip ? this.reducer.skip(head) : head;
131
+ // Lines are only folded from their first byte, and tailStart may fall
132
+ // mid-line. Discard from one byte earlier (tailStart > headBytes >= 0): if
133
+ // that byte is the newline ending the previous line, discarding stops there
134
+ // and the line starting at tailStart is folded; otherwise the partial line
135
+ // is dropped up to its newline.
136
+ entry.offset = tailStart - 1;
137
+ entry.discarding = true;
138
+ entry.skippedBytes = tailStart - headBytes;
139
+ this.readRange(fd, entry, size);
140
+ }
141
+ /** Fold complete lines in `[entry.offset, end)` into `entry`. */ readRange(fd, entry, end) {
142
+ const chunk = Buffer.allocUnsafe(Math.min(this.chunkSize, Math.max(end - entry.offset, 1)));
143
+ let position = entry.offset;
144
+ let carry;
145
+ let committed = entry.committed;
146
+ let discarding = entry.discarding;
147
+ while(position < end){
148
+ const bytesRead = fs.readSync(fd, chunk, 0, Math.min(chunk.length, end - position), position);
149
+ if (bytesRead === 0) break;
150
+ position += bytesRead;
151
+ let lineStart = 0;
152
+ let newline = chunk.indexOf(NEWLINE, 0);
153
+ while(newline !== -1 && newline < bytesRead){
154
+ if (discarding) {
155
+ discarding = false;
156
+ } else {
157
+ const lineBytes = carry ? Buffer.concat([
158
+ carry,
159
+ chunk.subarray(lineStart, newline)
160
+ ]) : chunk.subarray(lineStart, newline);
161
+ committed = reduceLine(this.reducer, committed, lineBytes.toString("utf8"));
162
+ }
163
+ carry = undefined;
164
+ lineStart = newline + 1;
165
+ newline = chunk.indexOf(NEWLINE, lineStart);
166
+ }
167
+ if (lineStart < bytesRead && !discarding) {
168
+ const rest = Buffer.from(chunk.subarray(lineStart, bytesRead));
169
+ carry = carry ? Buffer.concat([
170
+ carry,
171
+ rest
172
+ ]) : rest;
173
+ }
174
+ }
175
+ entry.committed = committed;
176
+ entry.discarding = discarding;
177
+ entry.offset = position - (carry?.length ?? 0);
178
+ entry.size = position;
179
+ entry.state = carry ? reduceTentative(this.reducer, committed, carry.toString("utf8")) : committed;
180
+ }
181
+ }
182
+ function toResult(entry) {
183
+ return {
184
+ state: entry.state,
185
+ size: entry.size,
186
+ mtime: entry.mtime,
187
+ skippedBytes: entry.skippedBytes
188
+ };
189
+ }
190
+ function reduceLine(reducer, state, line) {
191
+ if (!/\S/.test(line)) return state;
192
+ let entry;
193
+ try {
194
+ entry = JSON.parse(line);
195
+ } catch {
196
+ entry = undefined;
197
+ }
198
+ return reducer.reduce(state, entry);
199
+ }
200
+ /** Apply an unterminated line only if it is already valid JSON (i.e. fully written). */ function reduceTentative(reducer, state, line) {
201
+ if (!/\S/.test(line)) return state;
202
+ try {
203
+ return reducer.reduce(state, JSON.parse(line));
204
+ } catch {
205
+ return state;
206
+ }
207
+ }
208
+
209
+ //# sourceMappingURL=IncrementalJsonlSummary.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/utils/IncrementalJsonlSummary.ts"],"sourcesContent":["/**\n * Incremental JSONL Summary\n *\n * Keeps a small per-file summary of append-only JSONL transcripts so repeated\n * refreshes only parse bytes that were appended since the previous read.\n *\n * Usage:\n * ```ts\n * const summaries = new IncrementalJsonlSummary<MyState>({\n * initial: () => ({ lastType: undefined }),\n * reduce: (state, entry) => ({ ...state, lastType: (entry as any)?.type }),\n * });\n *\n * const result = summaries.read(filePath); // { state, size, mtime, skippedBytes } | null\n * summaries.prune(); // once per refresh: evict paths not read since the last prune\n * ```\n *\n * Read rules, keyed by file path:\n * - dev, ino, size and mtimeMs unchanged → cached state, 0 bytes read.\n * - same dev/ino and size grew → read only the bytes after the last complete line.\n * - anything else (first read, shrink, rotation, in-place rewrite) → rebuild.\n *\n * A rebuild of a file larger than `headBytes + tailBytes` (default 1 MiB +\n * 4 MiB) is a bounded cold start rather than a full parse: it folds the\n * complete lines in `[0, headBytes)`, calls `reducer.skip(state)`, then folds\n * the lines that start inside `[size - tailBytes, size)`, including a line\n * that starts exactly at `size - tailBytes` (one extra byte before the window\n * is read to tell). Lines straddling a window edge are dropped. A field whose\n * entries all sit in the skipped middle keeps whatever `skip` leaves; there is\n * never a hidden full scan. The result's `skippedBytes` reports the unread\n * middle, and the cache is seeded at end of file so later appends stay\n * incremental.\n *\n * An unterminated last line is never folded into the committed state. If it\n * already parses as JSON it is applied to the returned state only, and it is\n * re-read (from its start offset) once more bytes arrive.\n */\n\nimport * as fs from \"fs\";\n\n/**\n * Pure fold over the entries of a JSONL file.\n *\n * `reduce` receives each non-blank line in file order: the parsed JSON value,\n * or `undefined` when the line is not valid JSON. It must return a new state\n * rather than mutate `state`, and the state should stay O(1) in file size\n * (no entry arrays or raw file contents).\n *\n * `skip` is called once when a bounded cold start skips the middle of a file,\n * between the head lines and the tail lines. It returns the state the tail\n * lines fold onto: keep what the head established (e.g. the first entry) and\n * reset fields that track the latest entry, so those come only from lines\n * actually read. Without `skip`, tail lines fold straight onto the head state.\n */\nexport interface JsonlSummaryReducer<S> {\n initial(): S;\n reduce(state: S, entry: unknown): S;\n skip?(state: S): S;\n}\n\nexport interface JsonlSummaryResult<S> {\n state: S;\n /** File size in bytes when the state was computed. */\n size: number;\n /** File mtime (`fs.Stats.mtime`) when the state was computed. */\n mtime: Date;\n /** Bytes the bounded cold start did not read; 0 when the whole file was parsed. */\n skippedBytes: number;\n}\n\nexport interface JsonlSummaryBounds {\n /** Bytes scanned from the start of the file on a cold start. */\n headBytes: number;\n /** Bytes scanned at the end of the file on a cold start. */\n tailBytes: number;\n}\n\nexport interface IncrementalJsonlSummaryOptions {\n /** Bytes read per `fs.readSync` call. */\n chunkSize?: number;\n /** Cold-start scan bounds; `false` parses rebuilt files from byte 0. */\n bounds?: JsonlSummaryBounds | false;\n}\n\ninterface CacheEntry<S> {\n dev: number;\n ino: number;\n size: number;\n mtimeMs: number;\n mtime: Date;\n /** Byte offset just past the last newline folded into `committed`. */\n offset: number;\n /** `offset` is mid-line: drop bytes up to and including the next newline. */\n discarding: boolean;\n /** State after every newline-terminated line. */\n committed: S;\n /** `committed` plus the unterminated last line, when it parses as JSON. */\n state: S;\n /** Bytes the cold start did not read. */\n skippedBytes: number;\n /** Prune generation in which this entry was last read. */\n seen: number;\n}\n\nexport const DEFAULT_HEAD_BYTES = 1024 * 1024;\nexport const DEFAULT_TAIL_BYTES = 4 * 1024 * 1024;\nconst DEFAULT_CHUNK_SIZE = 1024 * 1024;\nconst NEWLINE = 0x0a;\n\n/** Fold a whole JSONL string with a reducer (one-shot, uncached). */\nexport function reduceJsonlContent<S>(reducer: JsonlSummaryReducer<S>, content: string): S {\n let state = reducer.initial();\n for (const line of content.split(\"\\n\")) {\n state = reduceLine(reducer, state, line);\n }\n return state;\n}\n\nexport class IncrementalJsonlSummary<S> {\n private readonly entries = new Map<string, CacheEntry<S>>();\n private readonly chunkSize: number;\n private readonly bounds: JsonlSummaryBounds | false;\n private generation = 0;\n\n constructor(\n private readonly reducer: JsonlSummaryReducer<S>,\n options: IncrementalJsonlSummaryOptions = {},\n ) {\n this.chunkSize = options.chunkSize ?? DEFAULT_CHUNK_SIZE;\n this.bounds = options.bounds ?? {\n headBytes: DEFAULT_HEAD_BYTES,\n tailBytes: DEFAULT_TAIL_BYTES,\n };\n }\n\n /** Number of cached files. */\n get size(): number {\n return this.entries.size;\n }\n\n /** Return the summary of `filePath`, reading only what changed. Null if unreadable. */\n read(filePath: string): JsonlSummaryResult<S> | null {\n let stat: fs.Stats;\n try {\n stat = fs.statSync(filePath);\n } catch {\n this.entries.delete(filePath);\n return null;\n }\n\n const cached = this.entries.get(filePath);\n const sameFile = cached !== undefined && cached.dev === stat.dev && cached.ino === stat.ino;\n\n if (sameFile && cached.size === stat.size && cached.mtimeMs === stat.mtimeMs) {\n cached.seen = this.generation;\n return toResult(cached);\n }\n\n const appended = sameFile && stat.size > cached.size;\n const entry: CacheEntry<S> = appended\n ? { ...cached }\n : {\n dev: stat.dev,\n ino: stat.ino,\n size: 0,\n mtimeMs: 0,\n mtime: stat.mtime,\n offset: 0,\n discarding: false,\n committed: this.reducer.initial(),\n state: this.reducer.initial(),\n skippedBytes: 0,\n seen: this.generation,\n };\n\n try {\n const fd = fs.openSync(filePath, \"r\");\n try {\n const bounds = this.bounds;\n if (!appended && bounds && stat.size > bounds.headBytes + bounds.tailBytes) {\n this.readBounded(fd, entry, stat.size, bounds);\n } else {\n this.readRange(fd, entry, stat.size);\n }\n } finally {\n fs.closeSync(fd);\n }\n } catch {\n this.entries.delete(filePath);\n return null;\n }\n\n entry.mtimeMs = stat.mtimeMs;\n entry.mtime = stat.mtime;\n entry.seen = this.generation;\n this.entries.set(filePath, entry);\n return toResult(entry);\n }\n\n /** Evict entries not read since the previous `prune()` call. Call once per refresh. */\n prune(): void {\n for (const [filePath, entry] of this.entries) {\n if (entry.seen !== this.generation) {\n this.entries.delete(filePath);\n }\n }\n this.generation++;\n }\n\n /** Cold start: fold the head lines, `skip`, then the lines starting in the tail window. */\n private readBounded(\n fd: number,\n entry: CacheEntry<S>,\n size: number,\n { headBytes, tailBytes }: JsonlSummaryBounds,\n ): void {\n this.readRange(fd, entry, headBytes);\n\n const tailStart = size - tailBytes;\n const head = entry.committed;\n entry.committed = this.reducer.skip ? this.reducer.skip(head) : head;\n // Lines are only folded from their first byte, and tailStart may fall\n // mid-line. Discard from one byte earlier (tailStart > headBytes >= 0): if\n // that byte is the newline ending the previous line, discarding stops there\n // and the line starting at tailStart is folded; otherwise the partial line\n // is dropped up to its newline.\n entry.offset = tailStart - 1;\n entry.discarding = true;\n entry.skippedBytes = tailStart - headBytes;\n this.readRange(fd, entry, size);\n }\n\n /** Fold complete lines in `[entry.offset, end)` into `entry`. */\n private readRange(fd: number, entry: CacheEntry<S>, end: number): void {\n const chunk = Buffer.allocUnsafe(Math.min(this.chunkSize, Math.max(end - entry.offset, 1)));\n let position = entry.offset;\n let carry: Buffer | undefined;\n let committed = entry.committed;\n let discarding = entry.discarding;\n\n while (position < end) {\n const bytesRead = fs.readSync(fd, chunk, 0, Math.min(chunk.length, end - position), position);\n if (bytesRead === 0) break;\n position += bytesRead;\n\n let lineStart = 0;\n let newline = chunk.indexOf(NEWLINE, 0);\n while (newline !== -1 && newline < bytesRead) {\n if (discarding) {\n discarding = false;\n } else {\n const lineBytes = carry\n ? Buffer.concat([carry, chunk.subarray(lineStart, newline)])\n : chunk.subarray(lineStart, newline);\n committed = reduceLine(this.reducer, committed, lineBytes.toString(\"utf8\"));\n }\n carry = undefined;\n lineStart = newline + 1;\n newline = chunk.indexOf(NEWLINE, lineStart);\n }\n\n if (lineStart < bytesRead && !discarding) {\n const rest = Buffer.from(chunk.subarray(lineStart, bytesRead));\n carry = carry ? Buffer.concat([carry, rest]) : rest;\n }\n }\n\n entry.committed = committed;\n entry.discarding = discarding;\n entry.offset = position - (carry?.length ?? 0);\n entry.size = position;\n entry.state = carry\n ? reduceTentative(this.reducer, committed, carry.toString(\"utf8\"))\n : committed;\n }\n}\n\nfunction toResult<S>(entry: CacheEntry<S>): JsonlSummaryResult<S> {\n return {\n state: entry.state,\n size: entry.size,\n mtime: entry.mtime,\n skippedBytes: entry.skippedBytes,\n };\n}\n\nfunction reduceLine<S>(reducer: JsonlSummaryReducer<S>, state: S, line: string): S {\n if (!/\\S/.test(line)) return state;\n let entry: unknown;\n try {\n entry = JSON.parse(line);\n } catch {\n entry = undefined;\n }\n return reducer.reduce(state, entry);\n}\n\n/** Apply an unterminated line only if it is already valid JSON (i.e. fully written). */\nfunction reduceTentative<S>(reducer: JsonlSummaryReducer<S>, state: S, line: string): S {\n if (!/\\S/.test(line)) return state;\n try {\n return reducer.reduce(state, JSON.parse(line));\n } catch {\n return state;\n }\n}\n"],"names":["fs","DEFAULT_HEAD_BYTES","DEFAULT_TAIL_BYTES","DEFAULT_CHUNK_SIZE","NEWLINE","reduceJsonlContent","reducer","content","state","initial","line","split","reduceLine","IncrementalJsonlSummary","entries","Map","chunkSize","bounds","generation","options","headBytes","tailBytes","size","read","filePath","stat","statSync","delete","cached","get","sameFile","undefined","dev","ino","mtimeMs","seen","toResult","appended","entry","mtime","offset","discarding","committed","skippedBytes","fd","openSync","readBounded","readRange","closeSync","set","prune","tailStart","head","skip","end","chunk","Buffer","allocUnsafe","Math","min","max","position","carry","bytesRead","readSync","length","lineStart","newline","indexOf","lineBytes","concat","subarray","toString","rest","from","reduceTentative","test","JSON","parse","reduce"],"mappings":"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"}
@@ -1,5 +1,6 @@
1
- import type { AgentType } from "../adapters/AgentAdapter.js";
2
- export type StartableAgentType = Extract<AgentType, "claude" | "codex" | "copilot" | "gemini_cli" | "grok_cli" | "opencode" | "pi">;
1
+ import type { AGENT_TYPES } from "../adapters/AgentAdapter.js";
2
+ /** Every built-in harness can be started, so each needs an {@link AGENTS} entry. */
3
+ export type StartableAgentType = (typeof AGENT_TYPES)[number];
3
4
  export interface AgentConfig {
4
5
  /** Shell command to launch the agent (sent to tmux via `send-keys`). */
5
6
  command: string;
@@ -1 +1 @@
1
- {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,6BAA6B,CAAC;AAE7D,MAAM,MAAM,kBAAkB,GAAG,OAAO,CACtC,SAAS,EACT,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,YAAY,GAAG,UAAU,GAAG,UAAU,GAAG,IAAI,CAC/E,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,kBAAkB,EAAE,WAAW,CAQ1D,CAAC"}
1
+ {"version":3,"file":"agents.d.ts","sourceRoot":"","sources":["../../src/utils/agents.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAG/D,oFAAoF;AACpF,MAAM,MAAM,kBAAkB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC;AAE9D,MAAM,WAAW,WAAW;IAC1B,wEAAwE;IACxE,OAAO,EAAE,MAAM,CAAC;IAChB,yEAAyE;IACzE,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC;CACzC;AAED;;;;GAIG;AACH,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,kBAAkB,EAAE,WAAW,CAU1D,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import path from "path";
2
+ import { executablePath } from "./process.js";
2
3
  /**
3
4
  * Per-agent configuration: launch command plus a matcher that recognizes the
4
5
  * agent's process in `ps` output. Each matcher knows that agent's distribution
@@ -24,6 +25,10 @@ import path from "path";
24
25
  command: "grok",
25
26
  matches: matchArgv0("grok")
26
27
  },
28
+ antigravity_cli: {
29
+ command: "agy",
30
+ matches: matchArgv0("agy")
31
+ },
27
32
  opencode: {
28
33
  command: "opencode",
29
34
  matches: matchArgv0("opencode")
@@ -33,38 +38,79 @@ import path from "path";
33
38
  matches: matchAnyBasename([
34
39
  "pi"
35
40
  ])
41
+ },
42
+ kiro: {
43
+ command: "kiro-cli",
44
+ matches: matchAnyBasename([
45
+ "kiro-cli",
46
+ "kiro"
47
+ ])
36
48
  }
37
49
  };
50
+ /**
51
+ * Matchers read a `ps` command line, where argv is joined with spaces. argv[0]
52
+ * is resolved with {@link executablePath} so executables installed under
53
+ * directories containing spaces are recognised, while arguments are never
54
+ * folded into the executable path unless that combined path is a real file.
55
+ *
56
+ * The filesystem is consulted only when a token after the first could be part
57
+ * of a matching argv[0]; commands whose first token already decides the match,
58
+ * or that contain no candidate token at all, are handled with string checks.
59
+ */ const ABSOLUTE_PATH = /^(?:\/|[a-zA-Z]:[\\/])/;
60
+ const PATH_SEPARATOR = /[\\/]/;
61
+ function basenameOf(token) {
62
+ return path.basename(token).toLowerCase();
63
+ }
64
+ function tokensOf(psCommand) {
65
+ return psCommand.trim().split(/\s+/).filter(Boolean);
66
+ }
67
+ /** Split a command line into its resolved argv[0] and the remaining argument tokens. */ function splitArgv0(psCommand) {
68
+ const command = psCommand.trim();
69
+ const argv0 = executablePath(command);
70
+ return {
71
+ argv0,
72
+ args: tokensOf(command.slice(argv0.length))
73
+ };
74
+ }
75
+ /** Whether argv[0] may span several tokens, i.e. a later path-like token satisfies `test`. */ function mayContinueArgv0(tokens, test) {
76
+ return ABSOLUTE_PATH.test(tokens[0]) && tokens.slice(1).some((token)=>PATH_SEPARATOR.test(token) && test(token));
77
+ }
38
78
  function matchArgv0(name) {
39
79
  const lower = name.toLowerCase();
80
+ const test = (token)=>basenameOf(token) === lower;
40
81
  return (psCommand)=>{
41
- const token = psCommand.trim().split(/\s+/)[0];
42
- return token ? path.basename(token).toLowerCase() === lower : false;
82
+ const tokens = tokensOf(psCommand);
83
+ if (tokens.length === 0) return false;
84
+ if (test(tokens[0])) return true;
85
+ return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));
43
86
  };
44
87
  }
45
88
  function matchArgv0Name(name) {
46
89
  const lower = name.toLowerCase();
90
+ const test = (token)=>token.toLowerCase().includes(lower);
47
91
  return (psCommand)=>{
48
- const token = psCommand.trim().split(/\s+/)[0];
49
- return token ? token.toLowerCase().includes(lower) : false;
92
+ const tokens = tokensOf(psCommand);
93
+ if (tokens.length === 0) return false;
94
+ if (test(tokens[0])) return true;
95
+ return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));
50
96
  };
51
97
  }
52
98
  function matchAnyToken(name) {
53
- const lower = name.toLowerCase();
54
- return (psCommand)=>{
55
- for (const token of psCommand.trim().split(/\s+/)){
56
- if (path.basename(token).toLowerCase() === lower) return true;
57
- }
58
- return false;
59
- };
99
+ return matchAnyBasename([
100
+ name
101
+ ]);
60
102
  }
61
103
  function matchAnyBasename(names) {
62
104
  const lowers = new Set(names.map((name)=>name.toLowerCase()));
105
+ const test = (token)=>lowers.has(basenameOf(token));
63
106
  return (psCommand)=>{
64
- for (const token of psCommand.trim().split(/\s+/)){
65
- if (lowers.has(path.basename(token).toLowerCase())) return true;
66
- }
67
- return false;
107
+ const tokens = tokensOf(psCommand);
108
+ if (tokens.length === 0) return false;
109
+ if (test(tokens[0])) return true;
110
+ if (!tokens.slice(1).some(test)) return false;
111
+ if (!ABSOLUTE_PATH.test(tokens[0])) return true;
112
+ const { argv0, args } = splitArgv0(psCommand);
113
+ return test(argv0) || args.some(test);
68
114
  };
69
115
  }
70
116
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/agents.ts"],"sourcesContent":["import path from \"path\";\nimport type { AgentType } from \"../adapters/AgentAdapter.js\";\n\nexport type StartableAgentType = Extract<\n AgentType,\n \"claude\" | \"codex\" | \"copilot\" | \"gemini_cli\" | \"grok_cli\" | \"opencode\" | \"pi\"\n>;\n\nexport interface AgentConfig {\n /** Shell command to launch the agent (sent to tmux via `send-keys`). */\n command: string;\n /** Returns true if the given `ps` command line belongs to this agent. */\n matches: (psCommand: string) => boolean;\n}\n\n/**\n * Per-agent configuration: launch command plus a matcher that recognizes the\n * agent's process in `ps` output. Each matcher knows that agent's distribution\n * quirks (e.g. gemini ships as a Node script so its real binary is in argv[1..]).\n */\nexport const AGENTS: Record<StartableAgentType, AgentConfig> = {\n claude: { command: \"claude\", matches: matchArgv0(\"claude\") },\n codex: { command: \"codex\", matches: matchArgv0(\"codex\") },\n copilot: { command: \"copilot\", matches: matchArgv0Name(\"copilot-cli\") },\n gemini_cli: { command: \"gemini\", matches: matchAnyToken(\"gemini\") },\n grok_cli: { command: \"grok\", matches: matchArgv0(\"grok\") },\n opencode: { command: \"opencode\", matches: matchArgv0(\"opencode\") },\n pi: { command: \"pi\", matches: matchAnyBasename([\"pi\"]) },\n};\n\nfunction matchArgv0(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n return (psCommand) => {\n const token = psCommand.trim().split(/\\s+/)[0];\n return token ? path.basename(token).toLowerCase() === lower : false;\n };\n}\n\nfunction matchArgv0Name(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n return (psCommand) => {\n const token = psCommand.trim().split(/\\s+/)[0];\n return token ? token.toLowerCase().includes(lower) : false;\n };\n}\n\nfunction matchAnyToken(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n return (psCommand) => {\n for (const token of psCommand.trim().split(/\\s+/)) {\n if (path.basename(token).toLowerCase() === lower) return true;\n }\n return false;\n };\n}\n\nfunction matchAnyBasename(names: string[]): (psCommand: string) => boolean {\n const lowers = new Set(names.map((name) => name.toLowerCase()));\n return (psCommand) => {\n for (const token of psCommand.trim().split(/\\s+/)) {\n if (lowers.has(path.basename(token).toLowerCase())) return true;\n }\n return false;\n };\n}\n"],"names":["path","AGENTS","claude","command","matches","matchArgv0","codex","copilot","matchArgv0Name","gemini_cli","matchAnyToken","grok_cli","opencode","pi","matchAnyBasename","name","lower","toLowerCase","psCommand","token","trim","split","basename","includes","names","lowers","Set","map","has"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AAexB;;;;CAIC,GACD,OAAO,MAAMC,SAAkD;IAC7DC,QAAQ;QAAEC,SAAS;QAAUC,SAASC,WAAW;IAAU;IAC3DC,OAAO;QAAEH,SAAS;QAASC,SAASC,WAAW;IAAS;IACxDE,SAAS;QAAEJ,SAAS;QAAWC,SAASI,eAAe;IAAe;IACtEC,YAAY;QAAEN,SAAS;QAAUC,SAASM,cAAc;IAAU;IAClEC,UAAU;QAAER,SAAS;QAAQC,SAASC,WAAW;IAAQ;IACzDO,UAAU;QAAET,SAAS;QAAYC,SAASC,WAAW;IAAY;IACjEQ,IAAI;QAAEV,SAAS;QAAMC,SAASU,iBAAiB;YAAC;SAAK;IAAE;AACzD,EAAE;AAEF,SAAST,WAAWU,IAAY;IAC9B,MAAMC,QAAQD,KAAKE,WAAW;IAC9B,OAAO,CAACC;QACN,MAAMC,QAAQD,UAAUE,IAAI,GAAGC,KAAK,CAAC,MAAM,CAAC,EAAE;QAC9C,OAAOF,QAAQnB,KAAKsB,QAAQ,CAACH,OAAOF,WAAW,OAAOD,QAAQ;IAChE;AACF;AAEA,SAASR,eAAeO,IAAY;IAClC,MAAMC,QAAQD,KAAKE,WAAW;IAC9B,OAAO,CAACC;QACN,MAAMC,QAAQD,UAAUE,IAAI,GAAGC,KAAK,CAAC,MAAM,CAAC,EAAE;QAC9C,OAAOF,QAAQA,MAAMF,WAAW,GAAGM,QAAQ,CAACP,SAAS;IACvD;AACF;AAEA,SAASN,cAAcK,IAAY;IACjC,MAAMC,QAAQD,KAAKE,WAAW;IAC9B,OAAO,CAACC;QACN,KAAK,MAAMC,SAASD,UAAUE,IAAI,GAAGC,KAAK,CAAC,OAAQ;YACjD,IAAIrB,KAAKsB,QAAQ,CAACH,OAAOF,WAAW,OAAOD,OAAO,OAAO;QAC3D;QACA,OAAO;IACT;AACF;AAEA,SAASF,iBAAiBU,KAAe;IACvC,MAAMC,SAAS,IAAIC,IAAIF,MAAMG,GAAG,CAAC,CAACZ,OAASA,KAAKE,WAAW;IAC3D,OAAO,CAACC;QACN,KAAK,MAAMC,SAASD,UAAUE,IAAI,GAAGC,KAAK,CAAC,OAAQ;YACjD,IAAII,OAAOG,GAAG,CAAC5B,KAAKsB,QAAQ,CAACH,OAAOF,WAAW,KAAK,OAAO;QAC7D;QACA,OAAO;IACT;AACF"}
1
+ {"version":3,"sources":["../../src/utils/agents.ts"],"sourcesContent":["import path from \"path\";\nimport type { AGENT_TYPES } from \"../adapters/AgentAdapter.js\";\nimport { executablePath } from \"./process.js\";\n\n/** Every built-in harness can be started, so each needs an {@link AGENTS} entry. */\nexport type StartableAgentType = (typeof AGENT_TYPES)[number];\n\nexport interface AgentConfig {\n /** Shell command to launch the agent (sent to tmux via `send-keys`). */\n command: string;\n /** Returns true if the given `ps` command line belongs to this agent. */\n matches: (psCommand: string) => boolean;\n}\n\n/**\n * Per-agent configuration: launch command plus a matcher that recognizes the\n * agent's process in `ps` output. Each matcher knows that agent's distribution\n * quirks (e.g. gemini ships as a Node script so its real binary is in argv[1..]).\n */\nexport const AGENTS: Record<StartableAgentType, AgentConfig> = {\n claude: { command: \"claude\", matches: matchArgv0(\"claude\") },\n codex: { command: \"codex\", matches: matchArgv0(\"codex\") },\n copilot: { command: \"copilot\", matches: matchArgv0Name(\"copilot-cli\") },\n gemini_cli: { command: \"gemini\", matches: matchAnyToken(\"gemini\") },\n grok_cli: { command: \"grok\", matches: matchArgv0(\"grok\") },\n antigravity_cli: { command: \"agy\", matches: matchArgv0(\"agy\") },\n opencode: { command: \"opencode\", matches: matchArgv0(\"opencode\") },\n pi: { command: \"pi\", matches: matchAnyBasename([\"pi\"]) },\n kiro: { command: \"kiro-cli\", matches: matchAnyBasename([\"kiro-cli\", \"kiro\"]) },\n};\n\n/**\n * Matchers read a `ps` command line, where argv is joined with spaces. argv[0]\n * is resolved with {@link executablePath} so executables installed under\n * directories containing spaces are recognised, while arguments are never\n * folded into the executable path unless that combined path is a real file.\n *\n * The filesystem is consulted only when a token after the first could be part\n * of a matching argv[0]; commands whose first token already decides the match,\n * or that contain no candidate token at all, are handled with string checks.\n */\nconst ABSOLUTE_PATH = /^(?:\\/|[a-zA-Z]:[\\\\/])/;\nconst PATH_SEPARATOR = /[\\\\/]/;\n\nfunction basenameOf(token: string): string {\n return path.basename(token).toLowerCase();\n}\n\nfunction tokensOf(psCommand: string): string[] {\n return psCommand.trim().split(/\\s+/).filter(Boolean);\n}\n\n/** Split a command line into its resolved argv[0] and the remaining argument tokens. */\nfunction splitArgv0(psCommand: string): { argv0: string; args: string[] } {\n const command = psCommand.trim();\n const argv0 = executablePath(command);\n return { argv0, args: tokensOf(command.slice(argv0.length)) };\n}\n\n/** Whether argv[0] may span several tokens, i.e. a later path-like token satisfies `test`. */\nfunction mayContinueArgv0(tokens: string[], test: (token: string) => boolean): boolean {\n return (\n ABSOLUTE_PATH.test(tokens[0]) &&\n tokens.slice(1).some((token) => PATH_SEPARATOR.test(token) && test(token))\n );\n}\n\nfunction matchArgv0(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => basenameOf(token) === lower;\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchArgv0Name(name: string): (psCommand: string) => boolean {\n const lower = name.toLowerCase();\n const test = (token: string) => token.toLowerCase().includes(lower);\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n return mayContinueArgv0(tokens, test) && test(executablePath(psCommand));\n };\n}\n\nfunction matchAnyToken(name: string): (psCommand: string) => boolean {\n return matchAnyBasename([name]);\n}\n\nfunction matchAnyBasename(names: string[]): (psCommand: string) => boolean {\n const lowers = new Set(names.map((name) => name.toLowerCase()));\n const test = (token: string) => lowers.has(basenameOf(token));\n return (psCommand) => {\n const tokens = tokensOf(psCommand);\n if (tokens.length === 0) return false;\n if (test(tokens[0])) return true;\n if (!tokens.slice(1).some(test)) return false;\n if (!ABSOLUTE_PATH.test(tokens[0])) return true;\n\n const { argv0, args } = splitArgv0(psCommand);\n return test(argv0) || args.some(test);\n };\n}\n"],"names":["path","executablePath","AGENTS","claude","command","matches","matchArgv0","codex","copilot","matchArgv0Name","gemini_cli","matchAnyToken","grok_cli","antigravity_cli","opencode","pi","matchAnyBasename","kiro","ABSOLUTE_PATH","PATH_SEPARATOR","basenameOf","token","basename","toLowerCase","tokensOf","psCommand","trim","split","filter","Boolean","splitArgv0","argv0","args","slice","length","mayContinueArgv0","tokens","test","some","name","lower","includes","names","lowers","Set","map","has"],"mappings":"AAAA,OAAOA,UAAU,OAAO;AAExB,SAASC,cAAc,QAAQ,eAAe;AAY9C;;;;CAIC,GACD,OAAO,MAAMC,SAAkD;IAC7DC,QAAQ;QAAEC,SAAS;QAAUC,SAASC,WAAW;IAAU;IAC3DC,OAAO;QAAEH,SAAS;QAASC,SAASC,WAAW;IAAS;IACxDE,SAAS;QAAEJ,SAAS;QAAWC,SAASI,eAAe;IAAe;IACtEC,YAAY;QAAEN,SAAS;QAAUC,SAASM,cAAc;IAAU;IAClEC,UAAU;QAAER,SAAS;QAAQC,SAASC,WAAW;IAAQ;IACzDO,iBAAiB;QAAET,SAAS;QAAOC,SAASC,WAAW;IAAO;IAC9DQ,UAAU;QAAEV,SAAS;QAAYC,SAASC,WAAW;IAAY;IACjES,IAAI;QAAEX,SAAS;QAAMC,SAASW,iBAAiB;YAAC;SAAK;IAAE;IACvDC,MAAM;QAAEb,SAAS;QAAYC,SAASW,iBAAiB;YAAC;YAAY;SAAO;IAAE;AAC/E,EAAE;AAEF;;;;;;;;;CASC,GACD,MAAME,gBAAgB;AACtB,MAAMC,iBAAiB;AAEvB,SAASC,WAAWC,KAAa;IAC/B,OAAOrB,KAAKsB,QAAQ,CAACD,OAAOE,WAAW;AACzC;AAEA,SAASC,SAASC,SAAiB;IACjC,OAAOA,UAAUC,IAAI,GAAGC,KAAK,CAAC,OAAOC,MAAM,CAACC;AAC9C;AAEA,sFAAsF,GACtF,SAASC,WAAWL,SAAiB;IACnC,MAAMrB,UAAUqB,UAAUC,IAAI;IAC9B,MAAMK,QAAQ9B,eAAeG;IAC7B,OAAO;QAAE2B;QAAOC,MAAMR,SAASpB,QAAQ6B,KAAK,CAACF,MAAMG,MAAM;IAAG;AAC9D;AAEA,4FAA4F,GAC5F,SAASC,iBAAiBC,MAAgB,EAAEC,IAAgC;IAC1E,OACEnB,cAAcmB,IAAI,CAACD,MAAM,CAAC,EAAE,KAC5BA,OAAOH,KAAK,CAAC,GAAGK,IAAI,CAAC,CAACjB,QAAUF,eAAekB,IAAI,CAAChB,UAAUgB,KAAKhB;AAEvE;AAEA,SAASf,WAAWiC,IAAY;IAC9B,MAAMC,QAAQD,KAAKhB,WAAW;IAC9B,MAAMc,OAAO,CAAChB,QAAkBD,WAAWC,WAAWmB;IACtD,OAAO,CAACf;QACN,MAAMW,SAASZ,SAASC;QACxB,IAAIW,OAAOF,MAAM,KAAK,GAAG,OAAO;QAChC,IAAIG,KAAKD,MAAM,CAAC,EAAE,GAAG,OAAO;QAC5B,OAAOD,iBAAiBC,QAAQC,SAASA,KAAKpC,eAAewB;IAC/D;AACF;AAEA,SAAShB,eAAe8B,IAAY;IAClC,MAAMC,QAAQD,KAAKhB,WAAW;IAC9B,MAAMc,OAAO,CAAChB,QAAkBA,MAAME,WAAW,GAAGkB,QAAQ,CAACD;IAC7D,OAAO,CAACf;QACN,MAAMW,SAASZ,SAASC;QACxB,IAAIW,OAAOF,MAAM,KAAK,GAAG,OAAO;QAChC,IAAIG,KAAKD,MAAM,CAAC,EAAE,GAAG,OAAO;QAC5B,OAAOD,iBAAiBC,QAAQC,SAASA,KAAKpC,eAAewB;IAC/D;AACF;AAEA,SAASd,cAAc4B,IAAY;IACjC,OAAOvB,iBAAiB;QAACuB;KAAK;AAChC;AAEA,SAASvB,iBAAiB0B,KAAe;IACvC,MAAMC,SAAS,IAAIC,IAAIF,MAAMG,GAAG,CAAC,CAACN,OAASA,KAAKhB,WAAW;IAC3D,MAAMc,OAAO,CAAChB,QAAkBsB,OAAOG,GAAG,CAAC1B,WAAWC;IACtD,OAAO,CAACI;QACN,MAAMW,SAASZ,SAASC;QACxB,IAAIW,OAAOF,MAAM,KAAK,GAAG,OAAO;QAChC,IAAIG,KAAKD,MAAM,CAAC,EAAE,GAAG,OAAO;QAC5B,IAAI,CAACA,OAAOH,KAAK,CAAC,GAAGK,IAAI,CAACD,OAAO,OAAO;QACxC,IAAI,CAACnB,cAAcmB,IAAI,CAACD,MAAM,CAAC,EAAE,GAAG,OAAO;QAE3C,MAAM,EAAEL,KAAK,EAAEC,IAAI,EAAE,GAAGF,WAAWL;QACnC,OAAOY,KAAKN,UAAUC,KAAKM,IAAI,CAACD;IAClC;AACF"}
@@ -1,4 +1,5 @@
1
- export { listAgentProcesses, batchGetProcessCwds, batchGetProcessStartTimes, enrichProcesses, captureProcessSnapshot, } from "./process.js";
1
+ export { listAgentProcesses, batchGetProcessCwds, batchGetProcessStartTimes, enrichProcesses, captureProcessSnapshot, createProcessSnapshotCapture, } from "./process.js";
2
+ export type { ProcessExec, ProcessSnapshotCapture, ProcessSnapshotOptions } from "./process.js";
2
3
  export { getProcessTty } from "./process.js";
3
4
  export { batchGetSessionFileBirthtimes } from "./session.js";
4
5
  export type { SessionFile } from "./session.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,GACvB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EACzB,eAAe,EACf,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,cAAc,CAAC;AACtB,YAAY,EAAE,WAAW,EAAE,sBAAsB,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAChG,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAC7D,YAAY,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAE,wBAAwB,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAC5E,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC"}
@@ -1,4 +1,4 @@
1
- export { listAgentProcesses, batchGetProcessCwds, batchGetProcessStartTimes, enrichProcesses, captureProcessSnapshot } from "./process.js";
1
+ export { listAgentProcesses, batchGetProcessCwds, batchGetProcessStartTimes, enrichProcesses, captureProcessSnapshot, createProcessSnapshotCapture } from "./process.js";
2
2
  export { getProcessTty } from "./process.js";
3
3
  export { batchGetSessionFileBirthtimes } from "./session.js";
4
4
  export { matchProcessesToSessions, generateAgentName } from "./matching.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export {\n listAgentProcesses,\n batchGetProcessCwds,\n batchGetProcessStartTimes,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"./process.js\";\nexport { getProcessTty } from \"./process.js\";\nexport { batchGetSessionFileBirthtimes } from \"./session.js\";\nexport type { SessionFile } from \"./session.js\";\nexport { matchProcessesToSessions, generateAgentName } from \"./matching.js\";\nexport type { MatchResult } from \"./matching.js\";\n"],"names":["listAgentProcesses","batchGetProcessCwds","batchGetProcessStartTimes","enrichProcesses","captureProcessSnapshot","getProcessTty","batchGetSessionFileBirthtimes","matchProcessesToSessions","generateAgentName"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,mBAAmB,EACnBC,yBAAyB,EACzBC,eAAe,EACfC,sBAAsB,QACjB,eAAe;AACtB,SAASC,aAAa,QAAQ,eAAe;AAC7C,SAASC,6BAA6B,QAAQ,eAAe;AAE7D,SAASC,wBAAwB,EAAEC,iBAAiB,QAAQ,gBAAgB"}
1
+ {"version":3,"sources":["../../src/utils/index.ts"],"sourcesContent":["export {\n listAgentProcesses,\n batchGetProcessCwds,\n batchGetProcessStartTimes,\n enrichProcesses,\n captureProcessSnapshot,\n createProcessSnapshotCapture,\n} from \"./process.js\";\nexport type { ProcessExec, ProcessSnapshotCapture, ProcessSnapshotOptions } from \"./process.js\";\nexport { getProcessTty } from \"./process.js\";\nexport { batchGetSessionFileBirthtimes } from \"./session.js\";\nexport type { SessionFile } from \"./session.js\";\nexport { matchProcessesToSessions, generateAgentName } from \"./matching.js\";\nexport type { MatchResult } from \"./matching.js\";\n"],"names":["listAgentProcesses","batchGetProcessCwds","batchGetProcessStartTimes","enrichProcesses","captureProcessSnapshot","createProcessSnapshotCapture","getProcessTty","batchGetSessionFileBirthtimes","matchProcessesToSessions","generateAgentName"],"mappings":"AAAA,SACEA,kBAAkB,EAClBC,mBAAmB,EACnBC,yBAAyB,EACzBC,eAAe,EACfC,sBAAsB,EACtBC,4BAA4B,QACvB,eAAe;AAEtB,SAASC,aAAa,QAAQ,eAAe;AAC7C,SAASC,6BAA6B,QAAQ,eAAe;AAE7D,SAASC,wBAAwB,EAAEC,iBAAiB,QAAQ,gBAAgB"}
@@ -0,0 +1,73 @@
1
+ /**
2
+ * Tail reader for append-only JSONL transcripts.
3
+ *
4
+ * Reading the last N conversation messages from a large transcript should not
5
+ * require reading (and JSON-parsing) the whole file. This reader:
6
+ *
7
+ * 1. On the first call for a file, reads backward from the end in fixed-size
8
+ * chunks until enough messages are collected (or the start is reached).
9
+ * 2. Remembers `{dev, ino, offset}` plus a small window of parsed items, and
10
+ * on later calls parses only bytes appended since `offset`.
11
+ * 3. Resets (re-reads from the end) when the file is truncated or replaced by
12
+ * a different inode.
13
+ *
14
+ * Each adapter supplies a {@link JsonlTailSource}: `parseLine` maps one raw
15
+ * line to a candidate item (or null) and the optional `finalize` turns a
16
+ * contiguous window of items into messages. `finalize` exists for formats
17
+ * where one line's visibility depends on other lines (e.g. Codex drops an
18
+ * `event_msg` mirrored by a `response_item`); line-independent formats can
19
+ * omit it and return a {@link ConversationMessage} directly from `parseLine`.
20
+ */
21
+ import type { ConversationMessage } from "../adapters/AgentAdapter.js";
22
+ /**
23
+ * Normalize a `tail` option: a positive integer, or undefined for "full
24
+ * conversation" (the pre-existing behaviour).
25
+ */
26
+ export declare function normalizeTail(tail: number | undefined): number | undefined;
27
+ /** Keep the last `tail` messages of an already fully-parsed conversation. */
28
+ export declare function sliceTail<T>(messages: T[], tail: number | undefined): T[];
29
+ export declare const DEFAULT_TAIL_CHUNK_SIZE: number;
30
+ export interface JsonlTailSource<Item> {
31
+ /** Map one raw JSONL line (no trailing newline) to an item, or null to skip it. */
32
+ parseLine(line: string): Item | null;
33
+ /**
34
+ * Convert a contiguous window of items (oldest first) into messages. Must
35
+ * behave like the adapter's full parse restricted to that window. Defaults
36
+ * to treating every item as a {@link ConversationMessage}.
37
+ */
38
+ finalize?(items: Item[]): ConversationMessage[];
39
+ }
40
+ export interface JsonlTailReaderOptions {
41
+ /** Bytes read per backward step. Defaults to 64 KiB. */
42
+ chunkSize?: number;
43
+ /** Number of (file, variant, tail) windows kept in the LRU cache. */
44
+ maxFiles?: number;
45
+ }
46
+ export declare class JsonlTailReader {
47
+ private readonly chunkSize;
48
+ private readonly maxFiles;
49
+ private readonly cache;
50
+ constructor(options?: JsonlTailReaderOptions);
51
+ /**
52
+ * Return the last `tail` messages of `filePath`.
53
+ *
54
+ * @param variant Cache discriminator for sources whose output differs by
55
+ * option (e.g. verbose vs. non-verbose).
56
+ * @param overscan Extra messages collected beyond `tail` before trimming,
57
+ * for sources whose `finalize` looks at neighbouring lines.
58
+ */
59
+ read<Item>(filePath: string, tail: number, source: JsonlTailSource<Item>, variant?: string, overscan?: number): ConversationMessage[];
60
+ /** Forget all cached windows. */
61
+ clear(): void;
62
+ private readBackward;
63
+ /**
64
+ * Parse bytes appended since the cached offset. Returns null when the
65
+ * bytes before the offset no longer match (file rewritten in place).
66
+ */
67
+ private readAppended;
68
+ private parse;
69
+ private countMessages;
70
+ private finish;
71
+ private touch;
72
+ }
73
+ //# sourceMappingURL=jsonlTail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonlTail.d.ts","sourceRoot":"","sources":["../../src/utils/jsonlTail.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAGH,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAEvE;;;GAGG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAI1E;AAED,6EAA6E;AAC7E,wBAAgB,SAAS,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,EAAE,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,CAAC,EAAE,CAGzE;AAED,eAAO,MAAM,uBAAuB,QAAY,CAAC;AAKjD,MAAM,WAAW,eAAe,CAAC,IAAI;IACnC,mFAAmF;IACnF,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,IAAI,CAAC;IACrC;;;;OAIG;IACH,QAAQ,CAAC,CAAC,KAAK,EAAE,IAAI,EAAE,GAAG,mBAAmB,EAAE,CAAC;CACjD;AAED,MAAM,WAAW,sBAAsB;IACrC,wDAAwD;IACxD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAoBD,qBAAa,eAAe;IAC1B,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;IAClC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAgC;gBAE1C,OAAO,GAAE,sBAA2B;IAKhD;;;;;;;OAOG;IACH,IAAI,CAAC,IAAI,EACP,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,eAAe,CAAC,IAAI,CAAC,EAC7B,OAAO,SAAK,EACZ,QAAQ,SAAI,GACX,mBAAmB,EAAE;IAuDxB,iCAAiC;IACjC,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,YAAY;IAkEpB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAoDpB,OAAO,CAAC,KAAK;IAMb,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,MAAM;IAad,OAAO,CAAC,KAAK;CASd"}