@ai-devkit/agent-manager 0.36.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 (618) 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/openai.test.js +12 -14
  14. package/dist/__tests__/capacity/openai.test.js.map +1 -1
  15. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  16. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  17. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  18. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  20. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  21. package/dist/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.js +103 -22
  22. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  24. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  25. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  26. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  27. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  28. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  30. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  31. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  32. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  33. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  34. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  35. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  36. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  38. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  41. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  42. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  43. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  44. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  45. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  46. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  47. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  48. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  49. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  50. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  51. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  52. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  54. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  56. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  59. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  60. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  61. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  62. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  64. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  65. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  66. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  67. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  68. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  69. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  70. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  71. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  72. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  73. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  74. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  78. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  79. package/dist/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.js +137 -82
  80. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  81. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  82. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  83. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  84. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  90. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  91. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  92. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  93. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  94. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  95. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  96. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  97. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  98. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  99. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  105. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  106. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  107. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  108. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  109. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  110. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  111. package/dist/__tests__/utils/agents.test.js +66 -2
  112. package/dist/__tests__/utils/agents.test.js.map +1 -1
  113. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  114. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  115. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  116. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  117. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  118. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  119. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  120. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  121. package/dist/__tests__/utils/process.test.js +436 -2
  122. package/dist/__tests__/utils/process.test.js.map +1 -1
  123. package/dist/adapters/AgentAdapter.d.ts +25 -6
  124. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  125. package/dist/adapters/AgentAdapter.js +12 -3
  126. package/dist/adapters/AgentAdapter.js.map +1 -1
  127. package/dist/capacity/openai.d.ts +0 -1
  128. package/dist/capacity/openai.d.ts.map +1 -1
  129. package/dist/capacity/openai.js +0 -5
  130. package/dist/capacity/openai.js.map +1 -1
  131. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  132. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  133. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  134. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  135. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  136. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  137. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  138. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  139. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  140. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  141. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  142. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  143. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  144. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  145. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  146. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  147. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  148. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  149. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  150. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  151. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  152. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  153. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  154. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  155. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  156. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  157. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  158. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  159. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  160. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  161. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  162. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  163. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  164. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  165. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  166. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  167. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  169. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  170. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  171. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  172. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  173. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  174. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  175. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  176. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  177. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  178. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  179. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  180. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  181. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  182. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  183. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  184. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  185. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  186. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  187. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  190. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  191. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  192. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  193. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  195. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  196. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  197. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  198. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  199. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  200. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  201. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  202. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  203. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  204. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  205. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  206. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  207. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  208. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  209. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  210. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  211. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  212. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  213. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  214. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  215. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  216. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  217. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  218. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  219. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  220. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  221. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  222. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  223. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  224. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  225. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  226. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  227. package/dist/harnesses/gemini/fileSignature.js +9 -0
  228. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  229. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  230. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  231. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  232. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  233. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  234. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  235. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  236. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  237. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  238. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  239. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  240. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  241. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  242. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  243. package/dist/harnesses/index.d.ts +7 -0
  244. package/dist/harnesses/index.d.ts.map +1 -0
  245. package/dist/harnesses/index.js +27 -0
  246. package/dist/harnesses/index.js.map +1 -0
  247. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  248. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  249. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  250. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  251. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  252. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  253. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  254. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  255. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  256. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  257. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  258. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  259. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  260. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  262. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  263. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  264. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  265. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  266. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  267. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  268. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  269. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  270. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  271. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  272. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  273. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  274. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  275. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  276. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  277. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  278. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  279. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  280. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  281. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  282. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  283. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  284. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  285. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  286. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  287. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  288. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  289. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  290. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  291. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  292. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  293. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  294. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  295. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  296. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  297. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  298. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  299. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  300. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  301. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  303. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  304. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  305. package/dist/harnesses/shared.d.ts +41 -0
  306. package/dist/harnesses/shared.d.ts.map +1 -0
  307. package/dist/harnesses/shared.js +71 -0
  308. package/dist/harnesses/shared.js.map +1 -0
  309. package/dist/index.d.ts +26 -25
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +18 -17
  312. package/dist/index.js.map +1 -1
  313. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  314. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  315. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  316. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  317. package/dist/utils/agents.d.ts +3 -2
  318. package/dist/utils/agents.d.ts.map +1 -1
  319. package/dist/utils/agents.js +50 -15
  320. package/dist/utils/agents.js.map +1 -1
  321. package/dist/utils/index.d.ts +2 -1
  322. package/dist/utils/index.d.ts.map +1 -1
  323. package/dist/utils/index.js +1 -1
  324. package/dist/utils/index.js.map +1 -1
  325. package/dist/utils/jsonlTail.d.ts +73 -0
  326. package/dist/utils/jsonlTail.d.ts.map +1 -0
  327. package/dist/utils/jsonlTail.js +238 -0
  328. package/dist/utils/jsonlTail.js.map +1 -0
  329. package/dist/utils/matching.d.ts +2 -0
  330. package/dist/utils/matching.d.ts.map +1 -1
  331. package/dist/utils/matching.js +3 -2
  332. package/dist/utils/matching.js.map +1 -1
  333. package/dist/utils/matchingConstants.d.ts +15 -0
  334. package/dist/utils/matchingConstants.d.ts.map +1 -0
  335. package/dist/utils/matchingConstants.js +14 -0
  336. package/dist/utils/matchingConstants.js.map +1 -0
  337. package/dist/utils/process.d.ts +38 -2
  338. package/dist/utils/process.d.ts.map +1 -1
  339. package/dist/utils/process.js +131 -43
  340. package/dist/utils/process.js.map +1 -1
  341. package/package.json +2 -1
  342. package/scripts/benchmark-cold-start.mjs +350 -0
  343. package/src/AgentManager.ts +26 -5
  344. package/src/__tests__/AgentManager.test.ts +141 -3
  345. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  346. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  347. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  348. package/src/__tests__/capacity/openai.test.ts +5 -15
  349. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  350. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  351. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  352. package/src/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.ts +97 -25
  353. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  354. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  355. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  356. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  357. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  358. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  359. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  360. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  361. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  362. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  363. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  364. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  365. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  366. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  367. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  368. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  369. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  370. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  371. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  372. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  373. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  374. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  375. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  376. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  377. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  378. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  379. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  380. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  381. package/src/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.ts +127 -109
  382. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  383. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  384. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  385. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  386. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  387. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  388. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  389. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  390. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  391. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  392. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  393. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  394. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  395. package/src/__tests__/utils/agents.test.ts +76 -2
  396. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  397. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  398. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  399. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  400. package/src/__tests__/utils/process.test.ts +254 -0
  401. package/src/adapters/AgentAdapter.ts +37 -14
  402. package/src/capacity/openai.ts +0 -6
  403. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  404. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  405. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  406. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  407. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  408. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  409. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  410. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  411. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  412. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  413. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  414. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  415. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  416. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  417. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  418. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  419. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  420. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  421. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  422. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  423. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  424. package/src/harnesses/gemini/fileSignature.ts +10 -0
  425. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  426. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  427. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  428. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  429. package/src/harnesses/index.ts +28 -0
  430. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  431. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  432. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  433. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  434. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  435. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  436. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  437. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  438. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  439. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  440. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  441. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  442. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  443. package/src/harnesses/shared.ts +119 -0
  444. package/src/index.ts +26 -24
  445. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  446. package/src/utils/agents.ts +60 -28
  447. package/src/utils/index.ts +2 -0
  448. package/src/utils/jsonlTail.ts +349 -0
  449. package/src/utils/matching.ts +3 -3
  450. package/src/utils/matchingConstants.ts +15 -0
  451. package/src/utils/process.ts +189 -45
  452. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
  453. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  454. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  455. package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
  456. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  457. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  458. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  459. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  460. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  461. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  462. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  463. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  464. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  465. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  466. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  467. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  468. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  469. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  470. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  471. package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
  472. package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
  473. package/dist/adapters/AntigravityCliAdapter.js +0 -273
  474. package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
  475. package/dist/adapters/KiroAdapter.d.ts +0 -46
  476. package/dist/adapters/KiroAdapter.d.ts.map +0 -1
  477. package/dist/adapters/KiroAdapter.js +0 -344
  478. package/dist/adapters/KiroAdapter.js.map +0 -1
  479. package/dist/adapters/index.d.ts +0 -12
  480. package/dist/adapters/index.d.ts.map +0 -1
  481. package/dist/adapters/index.js +0 -12
  482. package/dist/adapters/index.js.map +0 -1
  483. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  484. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  485. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  486. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  487. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  488. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  489. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  490. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  491. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  492. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  493. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  494. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  495. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  496. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  497. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  498. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  499. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  500. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  501. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  502. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  503. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  504. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  505. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  506. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  507. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  508. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  509. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  510. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  511. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  512. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  513. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  514. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  515. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  516. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  517. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  518. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  519. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  520. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  521. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  522. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  523. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  524. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  525. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  526. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  527. package/dist/providers/grok/GrokSessionParser.js +0 -122
  528. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  529. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  530. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  531. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  532. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  533. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  534. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  535. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  536. package/dist/providers/pi/PiAdapter.js.map +0 -1
  537. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  538. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  539. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/pi/PiSessionLocator.js +0 -86
  541. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  542. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  543. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  544. package/dist/providers/pi/PiSessionParser.js +0 -191
  545. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  546. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  547. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  548. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  549. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  550. package/src/adapters/AntigravityCliAdapter.ts +0 -356
  551. package/src/adapters/KiroAdapter.ts +0 -456
  552. package/src/adapters/index.ts +0 -17
  553. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  554. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  555. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  556. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  557. package/src/providers/grok/GrokSessionParser.ts +0 -166
  558. package/src/providers/pi/PiSessionLocator.ts +0 -110
  559. package/src/providers/pi/PiSessionParser.ts +0 -284
  560. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  561. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  562. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  563. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  564. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  565. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  566. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  567. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  568. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  569. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  570. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  571. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  572. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  573. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  574. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  575. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  576. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  577. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  578. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  579. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  580. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  581. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  582. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  583. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  584. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  585. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  586. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  587. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  588. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  589. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  590. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  591. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  592. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  593. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  594. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  595. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  596. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  597. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  598. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  600. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  601. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  602. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  603. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  604. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  605. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  606. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  607. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  608. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  609. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  610. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  611. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  612. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  613. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  614. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  615. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  616. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  617. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  618. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -0,0 +1,350 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Cold-start session summary benchmark (issue #261).
4
+ *
5
+ * Generates synthetic transcripts under os.tmpdir(), measures them against
6
+ * the built package in dist/, and deletes them afterwards:
7
+ *
8
+ * 1. First summary of one large Claude transcript (default 400 MB):
9
+ * bytes read and wall time of a cold `readSessionIncremental`.
10
+ * 2. Cold `listAgents()` over N agents (default 30, half Claude, half Codex)
11
+ * with ~1 GB of transcripts in total, run in a fresh child process to
12
+ * report wall time and peak RSS.
13
+ *
14
+ * To keep disk use to one transcript at a time, the listAgents fixture
15
+ * hard-links one transcript per provider under N session paths; each path is
16
+ * still summarised independently.
17
+ *
18
+ * Usage (after `npm run build`):
19
+ * node scripts/benchmark-cold-start.mjs [--size-mb=400] [--agents=30] [--total-mb=1024]
20
+ */
21
+
22
+ import { spawnSync } from "child_process";
23
+ import * as fs from "fs";
24
+ import { createRequire, syncBuiltinESMExports } from "module";
25
+ import * as os from "os";
26
+ import * as path from "path";
27
+ import { fileURLToPath } from "url";
28
+
29
+ const here = path.dirname(fileURLToPath(import.meta.url));
30
+ const dist = path.join(here, "..", "dist");
31
+ const MiB = 1024 * 1024;
32
+
33
+ const args = Object.fromEntries(
34
+ process.argv
35
+ .slice(2)
36
+ .filter((arg) => arg.startsWith("--"))
37
+ .map((arg) => {
38
+ const [key, value] = arg.slice(2).split("=");
39
+ return [key, value ?? "true"];
40
+ }),
41
+ );
42
+
43
+ if (args["list-child"]) {
44
+ await runListChild(args["list-child"], Number(args.agents));
45
+ } else {
46
+ await main();
47
+ }
48
+
49
+ async function main() {
50
+ const sizeMb = Number(args["size-mb"] ?? 400);
51
+ const agents = Number(args.agents ?? 30);
52
+ const totalMb = Number(args["total-mb"] ?? 1024);
53
+
54
+ console.log(`Free disk (tmpdir): ${freeDiskMb()} MB`);
55
+ await benchmarkSingleFile(sizeMb);
56
+ benchmarkListAgents(agents, totalMb);
57
+ }
58
+
59
+ /** Count bytes returned by fs.readSync / fs.readFileSync (as seen by ESM importers). */
60
+ function instrumentReads() {
61
+ const require = createRequire(import.meta.url);
62
+ const cjsFs = require("fs");
63
+ const counter = { bytes: 0 };
64
+ const readSync = cjsFs.readSync;
65
+ const readFileSync = cjsFs.readFileSync;
66
+ cjsFs.readSync = function (...callArgs) {
67
+ const n = readSync.apply(this, callArgs);
68
+ counter.bytes += n;
69
+ return n;
70
+ };
71
+ cjsFs.readFileSync = function (...callArgs) {
72
+ const out = readFileSync.apply(this, callArgs);
73
+ counter.bytes += typeof out === "string" ? Buffer.byteLength(out) : out.length;
74
+ return out;
75
+ };
76
+ syncBuiltinESMExports();
77
+ return counter;
78
+ }
79
+
80
+ async function benchmarkSingleFile(sizeMb) {
81
+ const counter = instrumentReads();
82
+ const { ClaudeSessionParser } = await import(
83
+ path.join(dist, "providers", "claude", "ClaudeSessionParser.js")
84
+ );
85
+
86
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "ai-devkit-cold-start-"));
87
+ const filePath = path.join(dir, "11111111-2222-3333-4444-555555555555.jsonl");
88
+ try {
89
+ writeClaudeTranscript(filePath, sizeMb * MiB);
90
+ const size = fs.statSync(filePath).size;
91
+
92
+ const timings = [];
93
+ let bytes = 0;
94
+ let session;
95
+ for (let run = 0; run < 5; run++) {
96
+ const parser = new ClaudeSessionParser();
97
+ counter.bytes = 0;
98
+ const start = process.hrtime.bigint();
99
+ session = parser.readSessionIncremental(filePath, "");
100
+ timings.push(Number(process.hrtime.bigint() - start) / 1e6);
101
+ bytes = counter.bytes;
102
+ }
103
+
104
+ const full = new ClaudeSessionParser({ summaryBounds: false });
105
+ counter.bytes = 0;
106
+ const fullStart = process.hrtime.bigint();
107
+ const fullSession = full.readSessionIncremental(filePath, "");
108
+ const fullMs = Number(process.hrtime.bigint() - fullStart) / 1e6;
109
+
110
+ console.log(`\n[1] First summary of a ${(size / MiB).toFixed(0)} MiB Claude transcript`);
111
+ console.log(` bounded: read ${(bytes / MiB).toFixed(2)} MiB, ${fmtTimings(timings)}`);
112
+ console.log(
113
+ ` full parse (bounds: false): read ${(counter.bytes / MiB).toFixed(0)} MiB, ${fullMs.toFixed(0)} ms`,
114
+ );
115
+ console.log(` bounded summary:`, pick(session));
116
+ console.log(` full summary: `, pick(fullSession));
117
+ } finally {
118
+ fs.rmSync(dir, { recursive: true, force: true });
119
+ }
120
+ }
121
+
122
+ function benchmarkListAgents(agents, totalMb) {
123
+ const home = fs.mkdtempSync(path.join(os.tmpdir(), "ai-devkit-cold-list-"));
124
+ try {
125
+ const perFile = Math.floor((totalMb * MiB) / agents);
126
+ const claudeCount = Math.ceil(agents / 2);
127
+ const codexCount = agents - claudeCount;
128
+ const startTime = new Date();
129
+
130
+ const projectDir = path.join(home, ".claude", "projects", "-repo");
131
+ const pidDir = path.join(home, ".claude", "sessions");
132
+ const codexDir = path.join(home, ".codex", "sessions", "2026", "09", "28");
133
+ fs.mkdirSync(projectDir, { recursive: true });
134
+ fs.mkdirSync(pidDir, { recursive: true });
135
+ fs.mkdirSync(codexDir, { recursive: true });
136
+ fs.mkdirSync(path.join(home, ".codex", "ai-devkit"), { recursive: true });
137
+
138
+ const claudeSource = path.join(home, "claude-source.jsonl");
139
+ const codexSource = path.join(home, "codex-source.jsonl");
140
+ writeClaudeTranscript(claudeSource, perFile);
141
+ writeCodexTranscript(codexSource, perFile, "019eabed-0000-7000-8000-000000000000");
142
+
143
+ const processes = [];
144
+ for (let i = 0; i < claudeCount; i++) {
145
+ const pid = 81000 + i;
146
+ const sessionId = `11111111-2222-3333-4444-${String(i).padStart(12, "0")}`;
147
+ fs.linkSync(claudeSource, path.join(projectDir, `${sessionId}.jsonl`));
148
+ fs.writeFileSync(
149
+ path.join(pidDir, `${pid}.json`),
150
+ JSON.stringify({
151
+ pid,
152
+ sessionId,
153
+ cwd: "/repo",
154
+ startedAt: startTime.getTime(),
155
+ kind: "interactive",
156
+ entrypoint: "cli",
157
+ }),
158
+ );
159
+ processes.push({ pid, command: "claude", cwd: "/repo", tty: `ttys${i}`, startTime });
160
+ }
161
+ const mapping = {};
162
+ for (let i = 0; i < codexCount; i++) {
163
+ const pid = 82000 + i;
164
+ const sessionId = `019eabed-0000-7000-8000-${String(i).padStart(12, "0")}`;
165
+ const filePath = path.join(codexDir, `rollout-2026-09-28T00-00-00-${sessionId}.jsonl`);
166
+ fs.linkSync(codexSource, filePath);
167
+ mapping[pid] = filePath;
168
+ processes.push({ pid, command: "codex", cwd: "/repo", tty: `ttys${100 + i}`, startTime });
169
+ }
170
+ fs.writeFileSync(
171
+ path.join(home, ".codex", "ai-devkit", "sessions.json"),
172
+ JSON.stringify(mapping),
173
+ );
174
+ fs.writeFileSync(path.join(home, "processes.json"), JSON.stringify(processes));
175
+
176
+ const logical = agents * fs.statSync(claudeSource).size;
177
+ const child = spawnSync(
178
+ process.execPath,
179
+ [fileURLToPath(import.meta.url), `--list-child=${home}`, `--agents=${agents}`],
180
+ { encoding: "utf8", env: { ...process.env, HOME: home } },
181
+ );
182
+ console.log(
183
+ `\n[2] Cold listAgents(): ${agents} agents, ${(logical / MiB).toFixed(0)} MiB of transcripts`,
184
+ );
185
+ process.stdout.write(child.stdout);
186
+ process.stderr.write(child.stderr);
187
+ } finally {
188
+ fs.rmSync(home, { recursive: true, force: true });
189
+ }
190
+ }
191
+
192
+ async function runListChild(home, agents) {
193
+ const { AgentManager, ClaudeCodeAdapter, CodexAdapter } = await import(
194
+ path.join(dist, "index.js")
195
+ );
196
+ const { AgentRegistry } = await import(path.join(dist, "utils", "AgentRegistry.js"));
197
+ const processes = JSON.parse(fs.readFileSync(path.join(home, "processes.json"), "utf8")).map(
198
+ (p) => ({ ...p, startTime: new Date(p.startTime) }),
199
+ );
200
+ const registry = new AgentRegistry(path.join(home, "agents.json"));
201
+ const manager = new AgentManager(registry, async () => processes);
202
+ manager.registerAdapter(new ClaudeCodeAdapter());
203
+ manager.registerAdapter(new CodexAdapter(registry));
204
+
205
+ const rssBefore = process.memoryUsage().rss;
206
+ const start = process.hrtime.bigint();
207
+ const listed = await manager.listAgents();
208
+ const ms = Number(process.hrtime.bigint() - start) / 1e6;
209
+ const peakRss = process.resourceUsage().maxRSS * 1024;
210
+
211
+ const warmStart = process.hrtime.bigint();
212
+ await manager.listAgents();
213
+ const warmMs = Number(process.hrtime.bigint() - warmStart) / 1e6;
214
+
215
+ console.log(` agents listed: ${listed.length}/${agents}`);
216
+ console.log(
217
+ ` cold listAgents: ${ms.toFixed(0)} ms (second, cached refresh: ${warmMs.toFixed(1)} ms)`,
218
+ );
219
+ console.log(
220
+ ` RSS before: ${(rssBefore / MiB).toFixed(0)} MiB, peak RSS: ${(peakRss / MiB).toFixed(0)} MiB`,
221
+ );
222
+ }
223
+
224
+ /** Realistic-ish Claude transcript: first prompt, bulky tool traffic, latest turn at the end. */
225
+ function writeClaudeTranscript(filePath, targetBytes) {
226
+ const ts = (min) => new Date(Date.UTC(2026, 8, 28, 0, min)).toISOString();
227
+ const head = [
228
+ { type: "file-history-snapshot", snapshot: { timestamp: ts(0) } },
229
+ {
230
+ type: "user",
231
+ timestamp: ts(0),
232
+ cwd: "/repo",
233
+ message: { content: "first task: refactor the parser" },
234
+ },
235
+ ];
236
+ const block = [
237
+ {
238
+ type: "assistant",
239
+ timestamp: ts(1),
240
+ cwd: "/repo",
241
+ message: {
242
+ content: [{ type: "tool_use", name: "Read", input: { file_path: "/repo/a.ts" } }],
243
+ },
244
+ },
245
+ {
246
+ type: "user",
247
+ timestamp: ts(1),
248
+ cwd: "/repo",
249
+ message: { content: [{ type: "tool_result", content: "x".repeat(48 * 1024) }] },
250
+ },
251
+ { type: "progress", timestamp: ts(2) },
252
+ {
253
+ type: "assistant",
254
+ timestamp: ts(2),
255
+ cwd: "/repo",
256
+ message: { content: [{ type: "text", text: "y".repeat(4096) }] },
257
+ },
258
+ {
259
+ type: "user",
260
+ timestamp: ts(3),
261
+ cwd: "/repo",
262
+ message: { content: "please continue with the next file" },
263
+ },
264
+ ];
265
+ const tail = [
266
+ {
267
+ type: "user",
268
+ timestamp: ts(58),
269
+ cwd: "/repo",
270
+ message: { content: "latest task: write the benchmark" },
271
+ },
272
+ {
273
+ type: "assistant",
274
+ timestamp: ts(59),
275
+ cwd: "/repo",
276
+ message: { content: [{ type: "text", text: "done" }] },
277
+ },
278
+ ];
279
+ writeTranscript(filePath, targetBytes, head, block, tail);
280
+ }
281
+
282
+ function writeCodexTranscript(filePath, targetBytes, sessionId) {
283
+ const ts = (min) => new Date(Date.UTC(2026, 8, 28, 0, min)).toISOString();
284
+ const head = [
285
+ {
286
+ type: "session_meta",
287
+ payload: {
288
+ id: sessionId,
289
+ cwd: "/repo",
290
+ timestamp: ts(0),
291
+ base_instructions: { text: "i".repeat(20_000) },
292
+ },
293
+ },
294
+ ];
295
+ const block = [
296
+ {
297
+ type: "response_item",
298
+ timestamp: ts(1),
299
+ payload: { type: "function_call_output", output: "o".repeat(48 * 1024) },
300
+ },
301
+ { type: "event_msg", timestamp: ts(2), payload: { type: "agent_message", message: "working" } },
302
+ ];
303
+ const tail = [
304
+ {
305
+ type: "event_msg",
306
+ timestamp: ts(59),
307
+ payload: { type: "task_complete", message: "latest codex result" },
308
+ },
309
+ ];
310
+ writeTranscript(filePath, targetBytes, head, block, tail);
311
+ }
312
+
313
+ function writeTranscript(filePath, targetBytes, head, block, tail) {
314
+ const toJsonl = (entries) => entries.map((entry) => `${JSON.stringify(entry)}\n`).join("");
315
+ const blockBuf = Buffer.from(toJsonl(block).repeat(16));
316
+ const headBuf = Buffer.from(toJsonl(head));
317
+ const tailBuf = Buffer.from(toJsonl(tail));
318
+ const fd = fs.openSync(filePath, "w");
319
+ try {
320
+ fs.writeSync(fd, headBuf);
321
+ let written = headBuf.length;
322
+ while (written + blockBuf.length + tailBuf.length <= targetBytes) {
323
+ fs.writeSync(fd, blockBuf);
324
+ written += blockBuf.length;
325
+ }
326
+ fs.writeSync(fd, tailBuf);
327
+ } finally {
328
+ fs.closeSync(fd);
329
+ }
330
+ }
331
+
332
+ function pick(session) {
333
+ if (!session) return session;
334
+ const { firstUserMessage, lastUserMessage, lastEntryType, lastActive, sessionStart } = session;
335
+ return { firstUserMessage, lastUserMessage, lastEntryType, lastActive, sessionStart };
336
+ }
337
+
338
+ function fmtTimings(timings) {
339
+ const sorted = [...timings].sort((a, b) => a - b);
340
+ return `min ${sorted[0].toFixed(1)} ms, median ${sorted[Math.floor(sorted.length / 2)].toFixed(1)} ms (${timings.length} cold runs)`;
341
+ }
342
+
343
+ function freeDiskMb() {
344
+ try {
345
+ const stats = fs.statfsSync(os.tmpdir());
346
+ return Math.floor((stats.bavail * stats.bsize) / MiB);
347
+ } catch {
348
+ return "unknown";
349
+ }
350
+ }
@@ -19,7 +19,11 @@ import {
19
19
  type AgentRuntimeProvider,
20
20
  type RegistryEntry,
21
21
  } from "./utils/AgentRegistry.js";
22
- import { captureProcessSnapshot, filterByProcessNames } from "./utils/process.js";
22
+ import {
23
+ captureProcessSnapshot,
24
+ filterByProcessNames,
25
+ type ProcessSnapshotCapture,
26
+ } from "./utils/process.js";
23
27
  import {
24
28
  findMatchingHerdrPane,
25
29
  fetchHerdrAgentPanes,
@@ -27,8 +31,6 @@ import {
27
31
  type HerdrAgentPane,
28
32
  } from "./runtime/herdr/HerdrAgentDiscovery.js";
29
33
 
30
- type ProcessSnapshotCapture = (namePatterns: readonly string[]) => Promise<ProcessInfo[]>;
31
-
32
34
  export interface ListAgentsOptions {
33
35
  /**
34
36
  * Sort key for the returned list. Defaults to `status`, which orders
@@ -169,7 +171,9 @@ export class AgentManager {
169
171
  let processes: readonly ProcessInfo[] = [];
170
172
  if (processNames.length > 0) {
171
173
  try {
172
- processes = await this.captureSnapshot(processNames);
174
+ processes = await this.captureSnapshot(processNames, {
175
+ isCandidate: (process) => this.isCandidateProcess(adapters, process),
176
+ });
173
177
  } catch {
174
178
  processes = [];
175
179
  }
@@ -237,6 +241,23 @@ export class AgentManager {
237
241
  return sortAgents(allAgents, sortKey);
238
242
  }
239
243
 
244
+ /**
245
+ * Only processes some adapter would actually handle are worth enriching
246
+ * with cwd/start time. Broad matchers such as "node" otherwise pull in
247
+ * every Node process on the machine.
248
+ */
249
+ private isCandidateProcess(adapters: readonly AgentAdapter[], process: ProcessInfo): boolean {
250
+ return adapters.some((adapter) => {
251
+ if (!adapter.processNames) return false;
252
+ if (filterByProcessNames([process], adapter.processNames).length === 0) return false;
253
+ try {
254
+ return adapter.canHandle(process);
255
+ } catch {
256
+ return false;
257
+ }
258
+ });
259
+ }
260
+
240
261
  private async resolveHerdrPanes(): Promise<readonly HerdrAgentPane[]> {
241
262
  const runtimeProvider = await this.resolveRuntimeProvider();
242
263
  if (runtimeProvider !== "herdr") return [];
@@ -347,7 +368,7 @@ export class AgentManager {
347
368
  return merged;
348
369
  }
349
370
 
350
- /** Resolve an exact historical session ID across the selected providers. */
371
+ /** Resolve an exact historical session ID across the selected harnesses. */
351
372
  async findSessionsById(
352
373
  sessionId: string,
353
374
  opts?: Pick<ListSessionsOptions, "type">,
@@ -16,6 +16,7 @@ import type {
16
16
  } from "../adapters/AgentAdapter.js";
17
17
  import { AgentStatus } from "../adapters/AgentAdapter.js";
18
18
  import { AgentRegistry, type RegistryEntry } from "../utils/AgentRegistry.js";
19
+ import { createProcessSnapshotCapture, type ProcessExec } from "../utils/process.js";
19
20
  import type { HerdrAgentPane } from "../runtime/herdr/HerdrAgentDiscovery.js";
20
21
 
21
22
  // Mock adapter for testing
@@ -204,7 +205,9 @@ describe("AgentManager", () => {
204
205
  await snapshotManager.listAgents();
205
206
 
206
207
  expect(captureSnapshot).toHaveBeenCalledTimes(1);
207
- expect(captureSnapshot).toHaveBeenCalledWith(["claude", "pi", "node"]);
208
+ expect(captureSnapshot).toHaveBeenCalledWith(["claude", "pi", "node"], {
209
+ isCandidate: expect.any(Function),
210
+ });
208
211
  expect(claude.detectAgents).toHaveBeenCalledWith({ processes: [processes[0]] });
209
212
  expect(pi.detectAgents).toHaveBeenCalledWith({ processes: [processes[1]] });
210
213
  });
@@ -242,13 +245,148 @@ describe("AgentManager", () => {
242
245
  await snapshotManager.listAgents();
243
246
 
244
247
  expect(captureSnapshot).toHaveBeenCalledTimes(1);
245
- expect(captureSnapshot).toHaveBeenCalledWith(["node", "codex", "pi", "claude"]);
248
+ expect(captureSnapshot).toHaveBeenCalledWith(["node", "codex", "pi", "claude"], {
249
+ isCandidate: expect.any(Function),
250
+ });
246
251
  expect(gemini.detectAgents).toHaveBeenCalledWith({ processes: [processes[0], processes[2]] });
247
252
  expect(codex.detectAgents).toHaveBeenCalledWith({ processes: [processes[1]] });
248
253
  expect(pi.detectAgents).toHaveBeenCalledWith({ processes: [processes[0], processes[2]] });
249
254
  expect(claude.detectAgents).toHaveBeenCalledWith({ processes: [processes[3]] });
250
255
  });
251
256
 
257
+ describe("candidate-only enrichment", () => {
258
+ const pidsArg = (args: readonly string[]) =>
259
+ args[args.indexOf("-p") + 1].split(",").map((pid) => parseInt(pid, 10));
260
+
261
+ function createExec(psLines: string[]) {
262
+ const exec = vi.fn<ProcessExec>(async (file, args) => {
263
+ if (file === "ps" && args.includes("-axo")) return psLines.join("\n");
264
+ if (file === "lsof")
265
+ return pidsArg(args)
266
+ .map((pid) => `p${pid}\nn/w/${pid}`)
267
+ .join("\n");
268
+ if (file === "ps") {
269
+ return pidsArg(args)
270
+ .map((pid) => `${pid} Wed Mar 18 23:18:01 2026`)
271
+ .join("\n");
272
+ }
273
+ throw new Error(`unexpected command: ${file}`);
274
+ });
275
+ const enriched = (kind: "lsof" | "lstart") =>
276
+ exec.mock.calls
277
+ .filter(([file, args]) =>
278
+ kind === "lsof" ? file === "lsof" : args.some((arg) => arg.includes("lstart=")),
279
+ )
280
+ .map(([, args]) => pidsArg(args));
281
+ return { exec, enriched };
282
+ }
283
+
284
+ const createAdapter = (
285
+ type: AgentType,
286
+ processNames: string[],
287
+ canHandle: (process: ProcessInfo) => boolean,
288
+ ) => ({
289
+ type,
290
+ processNames,
291
+ detectAgents: vi.fn(async () => []),
292
+ canHandle,
293
+ getConversation: () => [],
294
+ listSessions: async () => [],
295
+ });
296
+
297
+ const unrelatedNode = Array.from(
298
+ { length: 50 },
299
+ (_, index) => `${1000 + index} 1 ?? node /Applications/Tool${index}.app/helper.js`,
300
+ );
301
+
302
+ it("runs lsof and ps lstart only for PIDs some adapter can handle", async () => {
303
+ const { exec, enriched } = createExec([
304
+ ...unrelatedNode,
305
+ "200 1 s001 node /usr/local/bin/gemini",
306
+ "300 1 s002 node /usr/local/lib/pi.js",
307
+ "400 1 s003 codex exec --cd /repos/gemini",
308
+ ]);
309
+ const gemini = createAdapter("gemini_cli", ["node"], (p) => p.command.includes("gemini"));
310
+ const pi = createAdapter("pi", ["pi", "node"], (p) => p.command.includes("pi.js"));
311
+ const codex = createAdapter("codex", ["codex"], () => false);
312
+ const snapshotManager = new AgentManager(
313
+ new AgentRegistry(path.join(tmpDir, "candidate-agents.json")),
314
+ createProcessSnapshotCapture({ exec }),
315
+ );
316
+ snapshotManager.registerAdapter(gemini as AgentAdapter);
317
+ snapshotManager.registerAdapter(pi as AgentAdapter);
318
+ snapshotManager.registerAdapter(codex as AgentAdapter);
319
+
320
+ await snapshotManager.listAgents();
321
+
322
+ expect(enriched("lsof")).toEqual([[200, 300]]);
323
+ expect(enriched("lstart")).toEqual([[200, 300]]);
324
+ const geminiProcesses = gemini.detectAgents.mock.calls[0][0].processes as ProcessInfo[];
325
+ expect(geminiProcesses).toHaveLength(52);
326
+ expect(geminiProcesses.find((p) => p.pid === 200)).toMatchObject({ cwd: "/w/200" });
327
+ expect(geminiProcesses.find((p) => p.pid === 1000)).toMatchObject({ cwd: "" });
328
+ });
329
+
330
+ it("spawns only the base ps on a refresh with no candidate processes", async () => {
331
+ const { exec } = createExec(unrelatedNode);
332
+ const gemini = createAdapter("gemini_cli", ["node"], (p) => p.command.includes("gemini"));
333
+ const snapshotManager = new AgentManager(
334
+ new AgentRegistry(path.join(tmpDir, "no-candidate-agents.json")),
335
+ createProcessSnapshotCapture({ exec }),
336
+ );
337
+ snapshotManager.registerAdapter(gemini as AgentAdapter);
338
+
339
+ await snapshotManager.listAgents();
340
+ await snapshotManager.listAgents();
341
+
342
+ expect(exec).toHaveBeenCalledTimes(2);
343
+ for (const [file, args] of exec.mock.calls) {
344
+ expect(file).toBe("ps");
345
+ expect(args).toContain("-axo");
346
+ }
347
+ });
348
+
349
+ it("only checks canHandle for adapters whose executables match", async () => {
350
+ const { exec, enriched } = createExec(["200 1 s001 node /usr/local/bin/gemini"]);
351
+ const claude = createAdapter("claude", ["claude"], () => true);
352
+ const gemini = createAdapter("gemini_cli", ["node"], () => false);
353
+ const snapshotManager = new AgentManager(
354
+ new AgentRegistry(path.join(tmpDir, "scoped-candidate-agents.json")),
355
+ createProcessSnapshotCapture({ exec }),
356
+ );
357
+ snapshotManager.registerAdapter(claude as AgentAdapter);
358
+ snapshotManager.registerAdapter(gemini as AgentAdapter);
359
+
360
+ await snapshotManager.listAgents();
361
+
362
+ expect(enriched("lsof")).toEqual([]);
363
+ });
364
+
365
+ it("fetches start times once per PID across refreshes", async () => {
366
+ const { exec, enriched } = createExec([
367
+ ...unrelatedNode,
368
+ "200 1 s001 node /usr/local/bin/gemini",
369
+ ]);
370
+ const gemini = createAdapter("gemini_cli", ["node"], (p) => p.command.includes("gemini"));
371
+ const snapshotManager = new AgentManager(
372
+ new AgentRegistry(path.join(tmpDir, "cached-agents.json")),
373
+ createProcessSnapshotCapture({ exec }),
374
+ );
375
+ snapshotManager.registerAdapter(gemini as AgentAdapter);
376
+
377
+ await snapshotManager.listAgents();
378
+ await snapshotManager.listAgents();
379
+ await snapshotManager.listAgents();
380
+
381
+ expect(enriched("lstart")).toEqual([[200]]);
382
+ expect(enriched("lsof")).toEqual([[200], [200], [200]]);
383
+ const lastCall = gemini.detectAgents.mock.calls[2][0].processes as ProcessInfo[];
384
+ expect(lastCall.find((p) => p.pid === 200)?.startTime).toEqual(
385
+ new Date("Wed Mar 18 23:18:01 2026"),
386
+ );
387
+ });
388
+ });
389
+
252
390
  it("does not pass a snapshot context to legacy adapters", async () => {
253
391
  const captureSnapshot = vi.fn(async () => []);
254
392
  const legacy = new MockAdapter("claude");
@@ -1151,7 +1289,7 @@ describe("AgentManager", () => {
1151
1289
  expect(codex.lastListSessionsOpts).toBeUndefined();
1152
1290
  });
1153
1291
 
1154
- it("skips non-matching providers when type is supplied", async () => {
1292
+ it("skips non-matching harnesses when type is supplied", async () => {
1155
1293
  const claude = new MockAdapter("claude", [], false, [session("claude", "target")]);
1156
1294
  const codex = new MockAdapter("codex", [], false, [session("codex", "target")]);
1157
1295
  manager.registerAdapter(claude);