@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
@@ -1,7 +1,14 @@
1
1
  import * as fs from "fs";
2
2
  import * as path from "path";
3
- import type { ConversationMessage } from "../../adapters/AgentAdapter.js";
3
+ import type { ConversationMessage, ConversationOptions } from "../../adapters/AgentAdapter.js";
4
4
  import { AgentStatus } from "../../adapters/AgentAdapter.js";
5
+ import {
6
+ IncrementalJsonlSummary,
7
+ reduceJsonlContent,
8
+ type JsonlSummaryBounds,
9
+ type JsonlSummaryReducer,
10
+ } from "../../utils/IncrementalJsonlSummary.js";
11
+ import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
5
12
 
6
13
  /**
7
14
  * Content block within a Claude Code JSONL message entry.
@@ -51,6 +58,23 @@ export interface ClaudeSession {
51
58
  firstUserMessage?: string;
52
59
  }
53
60
 
61
+ /**
62
+ * O(1) running summary folded from session entries; `toSession` turns it into
63
+ * a `ClaudeSession`. Timestamps are epoch ms so cached state stays immutable.
64
+ */
65
+ interface ClaudeSummaryState {
66
+ seenFirstLine: boolean;
67
+ /** A bounded cold start skipped the middle: later lines are not the session's first. */
68
+ pastHead?: boolean;
69
+ sessionStartMs?: number;
70
+ lastActiveMs?: number;
71
+ lastCwd?: string;
72
+ lastEntryType?: string;
73
+ isInterrupted: boolean;
74
+ lastUserMessage?: string;
75
+ firstUserMessage?: string;
76
+ }
77
+
54
78
  /**
55
79
  * Top-level JSONL entry types that represent conversation/agent state.
56
80
  *
@@ -63,6 +87,11 @@ export interface ClaudeSession {
63
87
  */
64
88
  const CONVERSATION_ENTRY_TYPES = new Set(["user", "assistant", "system", "progress", "thinking"]);
65
89
 
90
+ export interface ClaudeSessionParserOptions {
91
+ /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */
92
+ summaryBounds?: JsonlSummaryBounds | false;
93
+ }
94
+
66
95
  /**
67
96
  * Parses Claude Code session JSONL files into structured data.
68
97
  *
@@ -71,6 +100,17 @@ const CONVERSATION_ENTRY_TYPES = new Set(["user", "assistant", "system", "progre
71
100
  * event (user turn, assistant response, tool call, etc.).
72
101
  */
73
102
  export class ClaudeSessionParser {
103
+ /** Incremental reader backing `getConversation({ tail })`. */
104
+ private readonly tailReader = new JsonlTailReader();
105
+
106
+ private readonly sessionCache: IncrementalJsonlSummary<ClaudeSummaryState>;
107
+
108
+ constructor(options: ClaudeSessionParserOptions = {}) {
109
+ this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {
110
+ bounds: options.summaryBounds,
111
+ });
112
+ }
113
+
74
114
  /**
75
115
  * Parse a session JSONL file into a ClaudeSession summary.
76
116
  *
@@ -81,8 +121,6 @@ export class ClaudeSessionParser {
81
121
  * Returns null if the file is unreadable or empty.
82
122
  */
83
123
  readSession(filePath: string, projectPath: string): ClaudeSession | null {
84
- const sessionId = path.basename(filePath, ".jsonl");
85
-
86
124
  let content: string;
87
125
  try {
88
126
  content = fs.readFileSync(filePath, "utf-8");
@@ -90,74 +128,113 @@ export class ClaudeSessionParser {
90
128
  return null;
91
129
  }
92
130
 
93
- const allLines = content.trim().split("\n");
94
- if (allLines.length === 0) {
95
- return null;
96
- }
131
+ return this.toSession(filePath, projectPath, reduceJsonlContent(this.summaryReducer, content));
132
+ }
97
133
 
98
- const sessionStart = this.parseSessionStart(allLines[0]);
134
+ /**
135
+ * Same result as `readSession`, but backed by a per-instance incremental
136
+ * cache so repeated refreshes only parse bytes appended since the last call.
137
+ * Call `pruneSessionCache()` once per refresh to evict files no longer read.
138
+ *
139
+ * The first read of a large transcript is a bounded head + tail scan (see
140
+ * `summaryReducer.skip`); fields whose entries lie only in the skipped
141
+ * middle fall back to their defaults instead of forcing a full parse.
142
+ */
143
+ readSessionIncremental(filePath: string, projectPath: string): ClaudeSession | null {
144
+ const result = this.sessionCache.read(filePath);
145
+ return result ? this.toSession(filePath, projectPath, result.state) : null;
146
+ }
99
147
 
100
- let lastEntryType: string | undefined;
101
- let lastActive: Date | undefined;
102
- let lastCwd: string | undefined;
103
- let isInterrupted = false;
104
- let lastUserMessage: string | undefined;
105
- let firstUserMessage: string | undefined;
148
+ /** Evict cached summaries for files not read since the previous prune. */
149
+ pruneSessionCache(): void {
150
+ this.sessionCache.prune();
151
+ }
106
152
 
107
- for (const line of allLines) {
108
- try {
109
- const entry: SessionEntry = JSON.parse(line);
153
+ /**
154
+ * Fold one JSONL entry into the O(1) session summary. Mirrors the fields
155
+ * `readSession` exposes: session start comes from the first line only;
156
+ * everything else tracks the latest matching entry.
157
+ *
158
+ * `skip` (bounded cold start) keeps the head's session start and first user
159
+ * message and clears every "latest" field, so those come from the tail only:
160
+ * a first user message beyond the head stays undefined, and a last user
161
+ * message before the tail window stays undefined.
162
+ */
163
+ private readonly summaryReducer: JsonlSummaryReducer<ClaudeSummaryState> = {
164
+ initial: () => ({ seenFirstLine: false, isInterrupted: false }),
165
+ reduce: (state, value) => {
166
+ const next: ClaudeSummaryState = { ...state, seenFirstLine: true };
167
+ if (!state.seenFirstLine) {
168
+ next.sessionStartMs = this.parseSessionStart(value);
169
+ }
170
+ if (!value || typeof value !== "object") {
171
+ return next;
172
+ }
110
173
 
111
- if (entry.timestamp) {
112
- const ts = new Date(entry.timestamp);
113
- if (!Number.isNaN(ts.getTime())) {
114
- lastActive = ts;
115
- }
174
+ const entry = value as SessionEntry;
175
+ if (entry.timestamp) {
176
+ const ts = new Date(entry.timestamp).getTime();
177
+ if (!Number.isNaN(ts)) {
178
+ next.lastActiveMs = ts;
116
179
  }
180
+ }
117
181
 
118
- if (typeof entry.cwd === "string" && entry.cwd.trim().length > 0) {
119
- lastCwd = entry.cwd;
120
- }
182
+ if (typeof entry.cwd === "string" && entry.cwd.trim().length > 0) {
183
+ next.lastCwd = entry.cwd;
184
+ }
121
185
 
122
- if (entry.type && CONVERSATION_ENTRY_TYPES.has(entry.type)) {
123
- lastEntryType = entry.type;
124
-
125
- if (entry.type === "user") {
126
- const msgContent = entry.message?.content;
127
- isInterrupted =
128
- Array.isArray(msgContent) &&
129
- msgContent.some(
130
- (c) =>
131
- (c.type === "text" && c.text?.includes("[Request interrupted")) ||
132
- (c.type === "tool_result" && c.content?.includes("[Request interrupted")),
133
- );
134
-
135
- const text = this.extractUserMessageText(msgContent);
136
- if (text) {
137
- lastUserMessage = text;
138
- if (!firstUserMessage) {
139
- firstUserMessage = text;
140
- }
186
+ if (entry.type && CONVERSATION_ENTRY_TYPES.has(entry.type)) {
187
+ next.lastEntryType = entry.type;
188
+
189
+ if (entry.type === "user") {
190
+ const msgContent = entry.message?.content;
191
+ next.isInterrupted =
192
+ Array.isArray(msgContent) &&
193
+ msgContent.some(
194
+ (c) =>
195
+ (c.type === "text" && c.text?.includes("[Request interrupted")) ||
196
+ (c.type === "tool_result" && c.content?.includes("[Request interrupted")),
197
+ );
198
+
199
+ const text = this.extractUserMessageText(msgContent);
200
+ if (text) {
201
+ next.lastUserMessage = text;
202
+ if (!next.firstUserMessage && !state.pastHead) {
203
+ next.firstUserMessage = text;
141
204
  }
142
- } else {
143
- isInterrupted = false;
144
205
  }
206
+ } else {
207
+ next.isInterrupted = false;
145
208
  }
146
- } catch {
147
- continue;
148
209
  }
149
- }
150
210
 
211
+ return next;
212
+ },
213
+ skip: (state) => ({
214
+ seenFirstLine: true,
215
+ pastHead: true,
216
+ sessionStartMs: state.sessionStartMs,
217
+ firstUserMessage: state.firstUserMessage,
218
+ isInterrupted: false,
219
+ }),
220
+ };
221
+
222
+ private toSession(
223
+ filePath: string,
224
+ projectPath: string,
225
+ state: ClaudeSummaryState,
226
+ ): ClaudeSession {
227
+ const sessionStartMs = state.sessionStartMs ?? state.lastActiveMs;
151
228
  return {
152
- sessionId,
153
- projectPath: projectPath || lastCwd || "",
154
- lastCwd,
155
- sessionStart: sessionStart || lastActive || new Date(),
156
- lastActive: lastActive || new Date(),
157
- lastEntryType,
158
- isInterrupted,
159
- lastUserMessage,
160
- firstUserMessage,
229
+ sessionId: path.basename(filePath, ".jsonl"),
230
+ projectPath: projectPath || state.lastCwd || "",
231
+ lastCwd: state.lastCwd,
232
+ sessionStart: sessionStartMs !== undefined ? new Date(sessionStartMs) : new Date(),
233
+ lastActive: state.lastActiveMs !== undefined ? new Date(state.lastActiveMs) : new Date(),
234
+ lastEntryType: state.lastEntryType,
235
+ isInterrupted: state.isInterrupted,
236
+ lastUserMessage: state.lastUserMessage,
237
+ firstUserMessage: state.firstUserMessage,
161
238
  };
162
239
  }
163
240
 
@@ -199,10 +276,20 @@ export class ClaudeSessionParser {
199
276
  * Read the full conversation from a session JSONL file.
200
277
  *
201
278
  * Default mode returns only text content from user/assistant/system messages.
202
- * Verbose mode also includes tool_use and tool_result blocks.
279
+ * Verbose mode also includes tool_use and tool_result blocks. With `tail`,
280
+ * only the last N messages are read (from the end of the file).
203
281
  */
204
- getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
282
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {
205
283
  const verbose = options?.verbose ?? false;
284
+ const tail = normalizeTail(options?.tail);
285
+ if (tail !== undefined) {
286
+ return this.tailReader.read(
287
+ sessionFilePath,
288
+ tail,
289
+ { parseLine: (line) => this.lineToMessage(line, verbose) },
290
+ String(verbose),
291
+ );
292
+ }
206
293
 
207
294
  let content: string;
208
295
  try {
@@ -215,58 +302,63 @@ export class ClaudeSessionParser {
215
302
  const messages: ConversationMessage[] = [];
216
303
 
217
304
  for (const line of lines) {
218
- let entry: SessionEntry;
219
- try {
220
- entry = JSON.parse(line);
221
- } catch {
222
- continue;
223
- }
305
+ const message = this.lineToMessage(line, verbose);
306
+ if (message) messages.push(message);
307
+ }
224
308
 
225
- let role: ConversationMessage["role"];
226
- if (entry.type === "user") {
227
- role = "user";
228
- } else if (entry.type === "assistant") {
229
- role = "assistant";
230
- } else if (entry.type === "system") {
231
- role = "system";
232
- } else {
233
- continue;
234
- }
309
+ return messages;
310
+ }
235
311
 
236
- const text = this.extractConversationContent(entry.message?.content, role, verbose);
237
- if (!text) continue;
312
+ /** Convert one JSONL line into a conversation message, or null when it is not one. */
313
+ private lineToMessage(line: string, verbose: boolean): ConversationMessage | null {
314
+ let entry: SessionEntry;
315
+ try {
316
+ entry = JSON.parse(line);
317
+ } catch {
318
+ return null;
319
+ }
238
320
 
239
- messages.push({
240
- role,
241
- content: text,
242
- timestamp: entry.timestamp,
243
- });
321
+ let role: ConversationMessage["role"];
322
+ if (entry.type === "user") {
323
+ role = "user";
324
+ } else if (entry.type === "assistant") {
325
+ role = "assistant";
326
+ } else if (entry.type === "system") {
327
+ role = "system";
328
+ } else {
329
+ return null;
244
330
  }
245
331
 
246
- return messages;
332
+ const text = this.extractConversationContent(entry.message?.content, role, verbose);
333
+ if (!text) return null;
334
+
335
+ return {
336
+ role,
337
+ content: text,
338
+ timestamp: entry.timestamp,
339
+ };
247
340
  }
248
341
 
249
342
  /**
250
- * Parse session start time from the first JSONL line.
343
+ * Parse session start time (epoch ms) from the first JSONL entry.
251
344
  *
252
345
  * Claude Code may emit a "file-history-snapshot" as the first entry,
253
346
  * which stores its timestamp inside "snapshot.timestamp" rather than
254
347
  * at the root level.
255
348
  */
256
- private parseSessionStart(firstLine: string): Date | null {
257
- try {
258
- const firstEntry = JSON.parse(firstLine);
259
- const rawTs: string | undefined = firstEntry.timestamp || firstEntry.snapshot?.timestamp;
260
- if (rawTs) {
261
- const ts = new Date(rawTs);
262
- if (!Number.isNaN(ts.getTime())) {
263
- return ts;
264
- }
349
+ private parseSessionStart(firstEntry: unknown): number | undefined {
350
+ if (!firstEntry || typeof firstEntry !== "object") {
351
+ return undefined;
352
+ }
353
+ const entry = firstEntry as { timestamp?: string; snapshot?: { timestamp?: string } };
354
+ const rawTs = entry.timestamp || entry.snapshot?.timestamp;
355
+ if (rawTs) {
356
+ const ts = new Date(rawTs).getTime();
357
+ if (!Number.isNaN(ts)) {
358
+ return ts;
265
359
  }
266
- } catch {
267
- /* malformed first line */
268
360
  }
269
- return null;
361
+ return undefined;
270
362
  }
271
363
 
272
364
  /**
@@ -5,21 +5,143 @@ import type {
5
5
  AgentInfo,
6
6
  ProcessInfo,
7
7
  ConversationMessage,
8
+ ConversationOptions,
8
9
  SessionSummary,
9
10
  ListSessionsOptions,
10
11
  AgentDetectionContext,
11
12
  } from "../../adapters/AgentAdapter.js";
12
- import {
13
- captureProcessSnapshot,
14
- executableBasename,
15
- filterByProcessNames,
16
- } from "../../utils/process.js";
17
- import { safeReadFile } from "../../utils/session.js";
13
+ import { executablePath } from "../../utils/process.js";
18
14
  import { AgentRegistry } from "../../utils/AgentRegistry.js";
19
15
  import { CodexAgentMapper } from "./CodexAgentMapper.js";
20
16
  import { CodexSessionLocator, type CodexDirectMatch } from "./CodexSessionLocator.js";
21
17
  import { CodexSessionMapping } from "./CodexSessionMapping.js";
22
18
  import { CodexSessionParser } from "./CodexSessionParser.js";
19
+ import { findHarnessProcesses, homeDir, matchesExecutable } from "../shared.js";
20
+
21
+ /**
22
+ * Codex subcommands that never own a local agent session: long-running helpers
23
+ * (app-server, sandbox, MCP/exec servers) and short-lived management commands.
24
+ * Interactive `codex`, `resume`, `fork`, `exec` and `review` remain detected.
25
+ *
26
+ * Classification of `review`, `cloud` and `agents` checked against Codex CLI
27
+ * 0.157.1 (source tag rust-v0.157.1, codex-rs/cli/src/main.rs):
28
+ * - `review` is detected: it runs as `codex exec review`, starting a
29
+ * non-ephemeral thread in-process (source `exec`, originator `codex_exec`), so
30
+ * it writes a `session_meta` rollout under ~/.codex/sessions like `codex exec`.
31
+ * - `cloud` is excluded: it browses and applies Codex Cloud tasks over HTTP and
32
+ * never starts a local thread or rollout.
33
+ * - `agents` is excluded: it opens a dashboard over every session on the shared
34
+ * app-server daemon without starting a thread of its own; the daemon, not
35
+ * this process, owns and writes those sessions' rollouts.
36
+ */
37
+ const CODEX_HELPER_SUBCOMMANDS = new Set([
38
+ "agents",
39
+ "app",
40
+ "app-server",
41
+ "apply",
42
+ "a",
43
+ "archive",
44
+ "cloud",
45
+ "cloud-tasks",
46
+ "completion",
47
+ "debug",
48
+ "delete",
49
+ "doctor",
50
+ "exec-server",
51
+ "features",
52
+ "help",
53
+ "login",
54
+ "logout",
55
+ "mcp",
56
+ "mcp-server",
57
+ "migrate-rollouts",
58
+ "plugin",
59
+ "queue",
60
+ "remote-control",
61
+ "responses-api-proxy",
62
+ "sandbox",
63
+ "stdio-to-uds",
64
+ "unarchive",
65
+ "update",
66
+ ]);
67
+
68
+ /**
69
+ * Known root Codex subcommand names and aliases, including the hidden ones in
70
+ * Codex CLI 0.157.1. A variadic flag's values stop at these, as clap stops there.
71
+ */
72
+ const CODEX_SUBCOMMANDS = new Set([
73
+ ...CODEX_HELPER_SUBCOMMANDS,
74
+ "e",
75
+ "exec",
76
+ "execpolicy",
77
+ "fork",
78
+ "resume",
79
+ "review",
80
+ "tcp-tunnel",
81
+ ]);
82
+
83
+ /** Global Codex flags that consume the following argument as their value. */
84
+ const CODEX_VALUE_FLAGS = new Set([
85
+ "-c",
86
+ "--config",
87
+ "-m",
88
+ "--model",
89
+ "-p",
90
+ "--profile",
91
+ "-s",
92
+ "--sandbox",
93
+ "-a",
94
+ "--ask-for-approval",
95
+ "-C",
96
+ "--cd",
97
+ "--add-dir",
98
+ "--enable",
99
+ "--disable",
100
+ "--local-provider",
101
+ "--remote",
102
+ "--remote-auth-token-env",
103
+ ]);
104
+
105
+ /**
106
+ * Global Codex flags that take one or more values (clap `num_args = 1..`).
107
+ * `-i, --image <FILE>...` is the only one in Codex CLI 0.157.1.
108
+ */
109
+ const CODEX_VARIADIC_VALUE_FLAGS = new Set(["-i", "--image"]);
110
+
111
+ const CODEX_APP_SERVER_DAEMON_DIR = "app-server-daemon";
112
+
113
+ function isCodexHelperCommand(command: string): boolean {
114
+ const trimmed = command.trim();
115
+ // Resolve argv[0] first so an install path containing spaces is not read as arguments.
116
+ const executable = executablePath(trimmed);
117
+ const args = trimmed.slice(executable.length).trim().split(/\s+/).filter(Boolean);
118
+ if (executable.replace(/\\/g, "/").split("/").includes(CODEX_APP_SERVER_DAEMON_DIR)) {
119
+ return true;
120
+ }
121
+
122
+ const subcommand = firstPositionalArgument(args);
123
+ return subcommand !== undefined && CODEX_HELPER_SUBCOMMANDS.has(subcommand);
124
+ }
125
+
126
+ function firstPositionalArgument(args: string[]): string | undefined {
127
+ for (let index = 0; index < args.length; index++) {
128
+ const arg = args[index];
129
+ if (arg === "--") return undefined;
130
+ if (!arg.startsWith("-")) return arg;
131
+ if (arg.includes("=")) continue;
132
+ if (CODEX_VALUE_FLAGS.has(arg)) {
133
+ index++;
134
+ } else if (CODEX_VARIADIC_VALUE_FLAGS.has(arg)) {
135
+ // Like clap, take values until the next flag or subcommand name.
136
+ while (index + 1 < args.length && isVariadicFlagValue(args[index + 1])) index++;
137
+ }
138
+ }
139
+ return undefined;
140
+ }
141
+
142
+ function isVariadicFlagValue(arg: string): boolean {
143
+ return !arg.startsWith("-") && !CODEX_SUBCOMMANDS.has(arg);
144
+ }
23
145
 
24
146
  interface MappedAgentResult {
25
147
  agents: AgentInfo[];
@@ -35,22 +157,32 @@ export class CodexAdapter implements AgentAdapter {
35
157
  private readonly mapper: CodexAgentMapper;
36
158
  private readonly codexSessionsDir: string;
37
159
  private readonly sessionMappingPath: string;
160
+ private locator?: CodexSessionLocator;
38
161
 
39
162
  constructor(registry: AgentRegistry = AgentRegistry.default()) {
40
- const homeDir = process.env.HOME || process.env.USERPROFILE || "";
41
163
  this.registry = registry;
42
164
  this.parser = new CodexSessionParser();
43
165
  this.mapper = new CodexAgentMapper(this.parser);
44
- this.codexSessionsDir = path.join(homeDir, ".codex", "sessions");
45
- this.sessionMappingPath = path.join(homeDir, ".codex", "ai-devkit", "sessions.json");
166
+ this.codexSessionsDir = path.join(homeDir(), ".codex", "sessions");
167
+ this.sessionMappingPath = path.join(homeDir(), ".codex", "ai-devkit", "sessions.json");
46
168
  }
47
169
 
48
170
  canHandle(processInfo: ProcessInfo): boolean {
49
- const base = executableBasename(processInfo.command);
50
- return base === "codex" || base === "codex.exe";
171
+ return (
172
+ matchesExecutable(processInfo.command, "codex") && !isCodexHelperCommand(processInfo.command)
173
+ );
51
174
  }
52
175
 
53
176
  async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
177
+ try {
178
+ return await this.detectRunningAgents(context);
179
+ } finally {
180
+ // Drop cached summaries for sessions that were not part of this refresh
181
+ this.parser.pruneSessionCache();
182
+ }
183
+ }
184
+
185
+ private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
54
186
  const processes = await this.getCodexProcesses(context);
55
187
  if (processes.length === 0) return [];
56
188
 
@@ -59,10 +191,7 @@ export class CodexAdapter implements AgentAdapter {
59
191
  const locatorResult = this.createLocator().matchRunningProcesses(cacheResult.fallback);
60
192
 
61
193
  const directResult = this.mapDirectMatches(locatorResult.direct);
62
- const legacyResult = this.mapLegacyMatches(
63
- locatorResult.legacyMatches,
64
- locatorResult.contentCache,
65
- );
194
+ const legacyResult = this.mapLegacyMatches(locatorResult.legacyMatches);
66
195
  const unmatchedProcesses = this.findUnmatchedProcesses(locatorResult.fallback, [
67
196
  ...directResult.agents,
68
197
  ...legacyResult.agents,
@@ -78,7 +207,7 @@ export class CodexAdapter implements AgentAdapter {
78
207
  ];
79
208
  }
80
209
 
81
- getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
210
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {
82
211
  return this.parser.getConversation(sessionFilePath, options);
83
212
  }
84
213
 
@@ -104,13 +233,13 @@ export class CodexAdapter implements AgentAdapter {
104
233
  }
105
234
 
106
235
  private async getCodexProcesses(context?: AgentDetectionContext): Promise<ProcessInfo[]> {
107
- const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));
108
- const relevant = filterByProcessNames(snapshot, this.processNames);
109
- return relevant.filter((processInfo) => this.canHandle(processInfo));
236
+ return (await findHarnessProcesses(this, context)).processes;
110
237
  }
111
238
 
239
+ /** Reused across refreshes so the locator's session_meta and negative caches persist. */
112
240
  private createLocator(): CodexSessionLocator {
113
- return new CodexSessionLocator({ sessionsDir: this.codexSessionsDir }, this.parser);
241
+ this.locator ??= new CodexSessionLocator({ sessionsDir: this.codexSessionsDir }, this.parser);
242
+ return this.locator;
114
243
  }
115
244
 
116
245
  private createSessionMapping(): CodexSessionMapping {
@@ -125,7 +254,7 @@ export class CodexAdapter implements AgentAdapter {
125
254
  const agents: AgentInfo[] = [];
126
255
 
127
256
  for (const match of matches) {
128
- const session = this.parser.readSession(match.filePath);
257
+ const session = this.parser.readSessionIncremental(match.filePath);
129
258
  if (session) {
130
259
  agents.push(this.mapper.mapSessionToAgent(session, match.process, match.filePath));
131
260
  } else {
@@ -153,8 +282,7 @@ export class CodexAdapter implements AgentAdapter {
153
282
  continue;
154
283
  }
155
284
 
156
- const content = safeReadFile(entry.sessionFilePath);
157
- const session = this.parser.readSession(entry.sessionFilePath, content);
285
+ const session = this.parser.readSessionIncremental(entry.sessionFilePath);
158
286
  if (!session) {
159
287
  fallback.push(processInfo);
160
288
  continue;
@@ -171,7 +299,7 @@ export class CodexAdapter implements AgentAdapter {
171
299
  const fallback: ProcessInfo[] = [];
172
300
 
173
301
  for (const match of matches) {
174
- const session = this.parser.readSession(match.sessionFile.filePath);
302
+ const session = this.parser.readSessionIncremental(match.sessionFile.filePath);
175
303
  if (session) {
176
304
  agents.push(
177
305
  this.mapper.mapSessionToAgent(session, match.process, match.sessionFile.filePath),
@@ -186,16 +314,12 @@ export class CodexAdapter implements AgentAdapter {
186
314
 
187
315
  private mapLegacyMatches(
188
316
  matches: Array<{ process: ProcessInfo; session: { filePath: string } }>,
189
- contentCache: Map<string, string>,
190
317
  ): MappedAgentResult {
191
318
  const agents: AgentInfo[] = [];
192
319
  const fallback: ProcessInfo[] = [];
193
320
 
194
321
  for (const match of matches) {
195
- const session = this.parser.readSession(
196
- match.session.filePath,
197
- contentCache.get(match.session.filePath),
198
- );
322
+ const session = this.parser.readSessionIncremental(match.session.filePath);
199
323
  if (session) {
200
324
  agents.push(this.mapper.mapSessionToAgent(session, match.process, match.session.filePath));
201
325
  } else {
@@ -1,7 +1,7 @@
1
1
  import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
2
- import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
2
  import { generateAgentName } from "../../utils/matching.js";
4
3
  import type { CodexSessionParser, CodexSession } from "./CodexSessionParser.js";
4
+ import { processOnlyAgent } from "../shared.js";
5
5
 
6
6
  export class CodexAgentMapper {
7
7
  constructor(private readonly parser: CodexSessionParser) {}
@@ -21,15 +21,6 @@ export class CodexAgentMapper {
21
21
  }
22
22
 
23
23
  mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {
24
- return {
25
- name: generateAgentName(processInfo.cwd || "", processInfo.pid),
26
- type: "codex",
27
- status: AgentStatus.RUNNING,
28
- summary: "Codex process running",
29
- pid: processInfo.pid,
30
- projectPath: processInfo.cwd || "",
31
- sessionId: `pid-${processInfo.pid}`,
32
- lastActive: new Date(),
33
- };
24
+ return processOnlyAgent("codex", processInfo, { summary: "Codex process running" });
34
25
  }
35
26
  }