@ai-devkit/agent-manager 0.35.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (651) hide show
  1. package/dist/AgentManager.d.ts +9 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +21 -2
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +151 -3
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
  8. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
  9. package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
  10. package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
  11. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
  12. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
  13. package/dist/__tests__/capacity/claude.test.js +485 -0
  14. package/dist/__tests__/capacity/claude.test.js.map +1 -0
  15. package/dist/__tests__/capacity/openai.test.js +670 -0
  16. package/dist/__tests__/capacity/openai.test.js.map +1 -0
  17. package/dist/__tests__/capacity/wham.test.js +144 -0
  18. package/dist/__tests__/capacity/wham.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  20. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  21. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  22. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  24. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  25. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
  26. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  27. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  28. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  30. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  31. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  32. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  33. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  34. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  35. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  36. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  38. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  41. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  42. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  43. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  44. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  45. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  46. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  47. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  48. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  49. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  50. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  51. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  52. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  54. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  56. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  59. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  60. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  61. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  62. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  64. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  65. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  66. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  67. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  68. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  69. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  70. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  71. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  72. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  73. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  74. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  78. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  79. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  80. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  81. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  82. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  83. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
  84. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  90. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  91. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  92. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  94. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  95. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  96. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  97. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  98. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  99. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  105. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  106. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  107. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  108. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  109. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  110. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  111. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  112. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  113. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  114. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  115. package/dist/__tests__/utils/agents.test.js +72 -2
  116. package/dist/__tests__/utils/agents.test.js.map +1 -1
  117. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  118. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  119. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  120. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  121. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  122. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  123. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  124. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  125. package/dist/__tests__/utils/process.test.js +436 -2
  126. package/dist/__tests__/utils/process.test.js.map +1 -1
  127. package/dist/adapters/AgentAdapter.d.ts +25 -6
  128. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  129. package/dist/adapters/AgentAdapter.js +12 -3
  130. package/dist/adapters/AgentAdapter.js.map +1 -1
  131. package/dist/capacity/claude.d.ts +17 -0
  132. package/dist/capacity/claude.d.ts.map +1 -0
  133. package/dist/capacity/claude.js +271 -0
  134. package/dist/capacity/claude.js.map +1 -0
  135. package/dist/capacity/codex.d.ts +1 -2
  136. package/dist/capacity/codex.d.ts.map +1 -1
  137. package/dist/capacity/codex.js +5 -47
  138. package/dist/capacity/codex.js.map +1 -1
  139. package/dist/capacity/index.d.ts +11 -0
  140. package/dist/capacity/index.d.ts.map +1 -1
  141. package/dist/capacity/index.js +17 -0
  142. package/dist/capacity/index.js.map +1 -1
  143. package/dist/capacity/openai.d.ts +47 -0
  144. package/dist/capacity/openai.d.ts.map +1 -0
  145. package/dist/capacity/openai.js +307 -0
  146. package/dist/capacity/openai.js.map +1 -0
  147. package/dist/capacity/wham.d.ts +16 -0
  148. package/dist/capacity/wham.d.ts.map +1 -0
  149. package/dist/capacity/wham.js +66 -0
  150. package/dist/capacity/wham.js.map +1 -0
  151. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  152. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  153. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  154. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  155. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  156. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  157. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  158. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  159. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  160. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  161. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  162. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  163. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  164. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  165. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  166. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  167. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  169. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  170. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  171. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  172. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  173. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  174. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  175. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  176. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  177. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  178. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  179. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  180. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  181. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  182. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  183. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  184. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  185. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  186. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  187. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  190. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  191. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  192. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  193. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  195. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  196. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  197. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  198. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  199. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  200. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  201. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  202. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  203. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  204. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  205. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  206. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  207. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  208. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  209. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  210. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  211. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  212. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  213. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  214. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  215. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  216. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  217. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  218. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  219. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  220. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  221. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  222. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  223. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  224. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  225. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  226. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  227. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  228. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  229. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  230. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  231. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  232. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  233. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  234. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  235. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  236. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  237. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  238. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  239. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  240. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  241. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  242. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  243. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  244. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  245. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  246. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  247. package/dist/harnesses/gemini/fileSignature.js +9 -0
  248. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  249. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  250. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  251. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  252. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  253. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  254. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  255. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  256. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  257. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  258. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  259. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  260. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  262. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  263. package/dist/harnesses/index.d.ts +7 -0
  264. package/dist/harnesses/index.d.ts.map +1 -0
  265. package/dist/harnesses/index.js +27 -0
  266. package/dist/harnesses/index.js.map +1 -0
  267. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  268. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  269. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  270. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  271. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  272. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  273. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  274. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  275. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  276. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  277. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  278. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  279. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  280. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  281. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  282. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  283. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  284. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  285. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  286. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  287. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  288. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  289. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  290. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  291. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  292. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  293. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  294. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  295. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  296. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  297. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  298. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  299. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  300. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  301. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  303. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  304. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  305. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  306. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  307. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  308. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  309. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  310. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  311. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  312. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  313. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  314. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  315. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  316. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  317. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  318. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  319. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  320. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  321. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  322. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  323. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  324. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  325. package/dist/harnesses/shared.d.ts +41 -0
  326. package/dist/harnesses/shared.d.ts.map +1 -0
  327. package/dist/harnesses/shared.js +71 -0
  328. package/dist/harnesses/shared.js.map +1 -0
  329. package/dist/index.d.ts +28 -25
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +19 -16
  332. package/dist/index.js.map +1 -1
  333. package/dist/readiness/AgentReadiness.d.ts +1 -1
  334. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  335. package/dist/readiness/AgentReadiness.js.map +1 -1
  336. package/dist/runtime/ManagedAgentRuntime.js +3 -1
  337. package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
  338. package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
  339. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
  340. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  341. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  342. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  343. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  344. package/dist/utils/agents.d.ts +3 -2
  345. package/dist/utils/agents.d.ts.map +1 -1
  346. package/dist/utils/agents.js +61 -15
  347. package/dist/utils/agents.js.map +1 -1
  348. package/dist/utils/index.d.ts +2 -1
  349. package/dist/utils/index.d.ts.map +1 -1
  350. package/dist/utils/index.js +1 -1
  351. package/dist/utils/index.js.map +1 -1
  352. package/dist/utils/jsonlTail.d.ts +73 -0
  353. package/dist/utils/jsonlTail.d.ts.map +1 -0
  354. package/dist/utils/jsonlTail.js +238 -0
  355. package/dist/utils/jsonlTail.js.map +1 -0
  356. package/dist/utils/matching.d.ts +2 -0
  357. package/dist/utils/matching.d.ts.map +1 -1
  358. package/dist/utils/matching.js +3 -2
  359. package/dist/utils/matching.js.map +1 -1
  360. package/dist/utils/matchingConstants.d.ts +15 -0
  361. package/dist/utils/matchingConstants.d.ts.map +1 -0
  362. package/dist/utils/matchingConstants.js +14 -0
  363. package/dist/utils/matchingConstants.js.map +1 -0
  364. package/dist/utils/process.d.ts +38 -2
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +131 -43
  367. package/dist/utils/process.js.map +1 -1
  368. package/package.json +2 -1
  369. package/scripts/benchmark-cold-start.mjs +350 -0
  370. package/src/AgentManager.ts +26 -5
  371. package/src/__tests__/AgentManager.test.ts +141 -3
  372. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  373. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  374. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  375. package/src/__tests__/capacity/claude.test.ts +467 -0
  376. package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
  377. package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
  378. package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
  379. package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
  380. package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
  381. package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
  382. package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
  383. package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
  384. package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
  385. package/src/__tests__/capacity/openai.test.ts +560 -0
  386. package/src/__tests__/capacity/wham.test.ts +104 -0
  387. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  388. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  389. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  390. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
  391. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  392. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  393. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  394. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  395. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  396. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  397. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  398. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  399. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  400. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  401. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  402. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  403. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  404. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  405. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  406. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  407. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  408. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  409. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  410. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  411. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  412. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  413. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  414. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  415. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  416. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  417. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  418. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  419. package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
  420. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  421. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  422. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  423. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  424. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  425. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  426. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  427. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  428. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  429. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  430. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  431. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  432. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  433. package/src/__tests__/utils/agents.test.ts +83 -2
  434. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  435. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  436. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  437. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  438. package/src/__tests__/utils/process.test.ts +254 -0
  439. package/src/adapters/AgentAdapter.ts +37 -12
  440. package/src/capacity/claude.ts +313 -0
  441. package/src/capacity/codex.ts +25 -134
  442. package/src/capacity/index.ts +33 -4
  443. package/src/capacity/openai.ts +355 -0
  444. package/src/capacity/wham.ts +84 -0
  445. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  446. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  447. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  448. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  449. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  450. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  451. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  452. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  453. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  454. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  455. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  456. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  457. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  458. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  459. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  460. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  461. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  462. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  463. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  464. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  465. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  466. package/src/harnesses/gemini/fileSignature.ts +10 -0
  467. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  468. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  469. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  470. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  471. package/src/harnesses/index.ts +28 -0
  472. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  473. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  474. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  475. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  476. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  477. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  478. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  479. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  480. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  481. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  482. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  483. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  484. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  485. package/src/harnesses/shared.ts +119 -0
  486. package/src/index.ts +34 -23
  487. package/src/readiness/AgentReadiness.ts +4 -1
  488. package/src/runtime/ManagedAgentRuntime.ts +2 -0
  489. package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
  490. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  491. package/src/utils/agents.ts +62 -20
  492. package/src/utils/index.ts +2 -0
  493. package/src/utils/jsonlTail.ts +349 -0
  494. package/src/utils/matching.ts +3 -3
  495. package/src/utils/matchingConstants.ts +15 -0
  496. package/src/utils/process.ts +189 -45
  497. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  498. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  499. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  500. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  501. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  502. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  503. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  504. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  505. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  506. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  507. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  508. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  509. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  510. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  511. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  512. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  513. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  514. package/dist/adapters/index.d.ts +0 -10
  515. package/dist/adapters/index.d.ts.map +0 -1
  516. package/dist/adapters/index.js +0 -10
  517. package/dist/adapters/index.js.map +0 -1
  518. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  519. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  520. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  521. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  522. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  523. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  524. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  525. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  526. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  527. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  528. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  529. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  530. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  531. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  532. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  533. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  534. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  535. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  536. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  537. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  538. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  539. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  541. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  542. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  543. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  544. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  545. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  546. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  547. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  548. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  549. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  550. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  551. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  552. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  553. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  554. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  555. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  556. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  557. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  558. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  559. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  560. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  561. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  562. package/dist/providers/grok/GrokSessionParser.js +0 -122
  563. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  564. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  565. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  566. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  567. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  568. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  569. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  570. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  571. package/dist/providers/pi/PiAdapter.js.map +0 -1
  572. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  573. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  574. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  575. package/dist/providers/pi/PiSessionLocator.js +0 -86
  576. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  577. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  578. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  579. package/dist/providers/pi/PiSessionParser.js +0 -191
  580. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  581. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  582. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  583. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  584. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  585. package/src/adapters/index.ts +0 -15
  586. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  587. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  588. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  589. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  590. package/src/providers/grok/GrokSessionParser.ts +0 -166
  591. package/src/providers/pi/PiSessionLocator.ts +0 -110
  592. package/src/providers/pi/PiSessionParser.ts +0 -284
  593. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  594. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  595. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  596. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  597. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  598. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  600. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  601. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  602. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  603. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  604. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  605. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  606. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  607. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  608. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  609. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  610. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  611. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  612. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  613. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  614. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  615. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  616. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  617. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  618. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  619. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  620. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  621. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  622. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  623. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  624. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  625. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  626. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  627. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  628. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  629. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  630. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  631. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  632. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  633. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  634. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  635. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  636. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  637. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  638. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  639. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  640. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  641. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  642. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  643. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  644. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  645. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  646. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  647. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  648. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  649. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  650. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  651. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -0,0 +1,419 @@
1
+ import type { MockedFunction } from "vitest";
2
+ import * as fs from "fs";
3
+ import * as os from "os";
4
+ import * as path from "path";
5
+ import type { ProcessInfo } from "../../../adapters/AgentAdapter.js";
6
+ import { CodexSessionLocator } from "../../../harnesses/codex/CodexSessionLocator.js";
7
+ import { batchGetSessionFileBirthtimes, type SessionFile } from "../../../utils/session.js";
8
+ import { matchProcessesToSessions, type MatchResult } from "../../../utils/matching.js";
9
+
10
+ vi.mock("fs", async () => {
11
+ const actual = (await vi.importActual("fs")) as typeof import("fs");
12
+ const wrapped = {
13
+ ...actual,
14
+ readSync: vi.fn(actual.readSync),
15
+ readFileSync: vi.fn(actual.readFileSync),
16
+ };
17
+ return { ...wrapped, default: wrapped };
18
+ });
19
+
20
+ vi.mock("../../../utils/session.js", async () => {
21
+ const actual = (await vi.importActual(
22
+ "../../../utils/session",
23
+ )) as typeof import("../../../utils/session");
24
+ return {
25
+ ...actual,
26
+ batchGetSessionFileBirthtimes: vi.fn(),
27
+ };
28
+ });
29
+
30
+ vi.mock("../../../utils/matching.js", async () => {
31
+ const actual = (await vi.importActual(
32
+ "../../../utils/matching",
33
+ )) as typeof import("../../../utils/matching");
34
+ return {
35
+ ...actual,
36
+ matchProcessesToSessions: vi.fn(),
37
+ };
38
+ });
39
+
40
+ const mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<
41
+ typeof batchGetSessionFileBirthtimes
42
+ >;
43
+ const mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<
44
+ typeof matchProcessesToSessions
45
+ >;
46
+
47
+ describe("CodexSessionLocator", () => {
48
+ let tmpDir: string;
49
+ let sessionsDir: string;
50
+ let locator: CodexSessionLocator;
51
+
52
+ beforeEach(() => {
53
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "codex-locator-"));
54
+ sessionsDir = path.join(tmpDir, "sessions");
55
+ locator = new CodexSessionLocator({ sessionsDir });
56
+ mockedBatchGetSessionFileBirthtimes.mockReset();
57
+ mockedMatchProcessesToSessions.mockReset();
58
+ });
59
+
60
+ afterEach(() => {
61
+ fs.rmSync(tmpDir, { recursive: true, force: true });
62
+ });
63
+
64
+ it("discovers live sessions from the process start day window and applies session_meta cwd and timestamp", () => {
65
+ const dateDir = path.join(sessionsDir, "2026", "03", "18");
66
+ fs.mkdirSync(dateDir, { recursive: true });
67
+ const sessionFile = path.join(dateDir, "sess-meta-time.jsonl");
68
+ fs.writeFileSync(
69
+ sessionFile,
70
+ JSON.stringify({
71
+ type: "session_meta",
72
+ payload: { id: "sess-meta-time", timestamp: "2026-03-18T15:00:05.000Z", cwd: "/repo-a" },
73
+ }),
74
+ );
75
+ mockedBatchGetSessionFileBirthtimes.mockReturnValue([
76
+ {
77
+ sessionId: "sess-meta-time",
78
+ filePath: sessionFile,
79
+ projectDir: dateDir,
80
+ birthtimeMs: new Date("2026-03-18T15:05:30.000Z").getTime(),
81
+ resolvedCwd: "",
82
+ },
83
+ ]);
84
+
85
+ const result = locator.discoverLiveSessions([
86
+ {
87
+ pid: 1,
88
+ command: "codex",
89
+ cwd: "/repo-a",
90
+ tty: "",
91
+ startTime: new Date("2026-03-18T15:00:00Z"),
92
+ },
93
+ ]);
94
+
95
+ expect(result.sessions).toHaveLength(1);
96
+ expect(result.sessions[0]).toMatchObject({
97
+ resolvedCwd: "/repo-a",
98
+ birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime(),
99
+ });
100
+ expect(result).not.toHaveProperty("contentCache");
101
+ expect(mockedBatchGetSessionFileBirthtimes.mock.calls[0][0]).toEqual([dateDir]);
102
+ });
103
+
104
+ it("matches resumed UUIDv7 sessions directly without legacy matching", () => {
105
+ const sessionId = "019eabed-4079-7071-9531-b853ddd9914e";
106
+ const sessionFile = writeSession(sessionId, "2026/06/09");
107
+ const processInfo: ProcessInfo = {
108
+ pid: 88018,
109
+ command: `codex resume ${sessionId}`,
110
+ cwd: "/repo-a",
111
+ tty: "ttys001",
112
+ startTime: new Date("2026-06-10T12:00:00.000Z"),
113
+ };
114
+
115
+ const result = locator.matchRunningProcesses([processInfo]);
116
+
117
+ expect(result.direct).toHaveLength(1);
118
+ expect(result.direct[0]).toMatchObject({
119
+ process: processInfo,
120
+ sessionFile: { sessionId, filePath: sessionFile, resolvedCwd: "/repo-a" },
121
+ });
122
+ expect(result.fallback).toEqual([]);
123
+ expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();
124
+ expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();
125
+ });
126
+
127
+ it("falls back to walking all session files for non-time-sortable resume ids", () => {
128
+ const sessionId = "aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee";
129
+ const sessionFile = writeSession(sessionId, "2026/01/02");
130
+
131
+ const result = locator.matchRunningProcesses([
132
+ { pid: 42, command: `codex resume ${sessionId}`, cwd: "/repo-a", tty: "ttys001" },
133
+ ]);
134
+
135
+ expect(result.direct[0].sessionFile.filePath).toBe(sessionFile);
136
+ });
137
+
138
+ it("passes unmatched processes and discovered sessions to legacy matching", () => {
139
+ const dateDir = path.join(sessionsDir, "2026", "03", "18");
140
+ fs.mkdirSync(dateDir, { recursive: true });
141
+ const candidate: SessionFile = {
142
+ sessionId: "sess",
143
+ filePath: path.join(dateDir, "sess.jsonl"),
144
+ projectDir: dateDir,
145
+ birthtimeMs: new Date("2026-03-18T15:00:05Z").getTime(),
146
+ resolvedCwd: "",
147
+ };
148
+ fs.writeFileSync(
149
+ candidate.filePath,
150
+ JSON.stringify({
151
+ type: "session_meta",
152
+ payload: { id: "sess", cwd: "/repo-a", timestamp: "2026-03-18T15:00:05Z" },
153
+ }),
154
+ );
155
+ const processInfo: ProcessInfo = {
156
+ pid: 100,
157
+ command: "codex",
158
+ cwd: "/repo-a",
159
+ tty: "ttys001",
160
+ startTime: new Date("2026-03-18T15:00:00Z"),
161
+ };
162
+ const legacyMatch: MatchResult = {
163
+ process: processInfo,
164
+ session: { ...candidate, resolvedCwd: "/repo-a" },
165
+ deltaMs: 5000,
166
+ };
167
+
168
+ mockedBatchGetSessionFileBirthtimes.mockReturnValue([candidate]);
169
+ mockedMatchProcessesToSessions.mockReturnValue([legacyMatch]);
170
+
171
+ const result = locator.matchRunningProcesses([processInfo]);
172
+
173
+ expect(result.direct).toEqual([]);
174
+ expect(result.fallback).toEqual([processInfo]);
175
+ expect(result.legacyMatches).toEqual([legacyMatch]);
176
+ expect(result).not.toHaveProperty("contentCache");
177
+ });
178
+
179
+ describe("bounded session_meta discovery", () => {
180
+ const HEAD_LIMIT_BYTES = 64 * 1024;
181
+ const dayDirParts = ["2026", "03", "18"];
182
+ const mockedReadSync = fs.readSync as MockedFunction<typeof fs.readSync>;
183
+ const mockedReadFileSync = fs.readFileSync as MockedFunction<typeof fs.readFileSync>;
184
+ let dateDir: string;
185
+ let nowMs: number;
186
+ let actualBatch: typeof batchGetSessionFileBirthtimes;
187
+
188
+ const processInfo: ProcessInfo = {
189
+ pid: 4242,
190
+ command: "codex",
191
+ cwd: "/repo-a",
192
+ tty: "ttys009",
193
+ startTime: new Date("2026-03-18T15:00:00Z"),
194
+ };
195
+
196
+ beforeEach(async () => {
197
+ dateDir = path.join(sessionsDir, ...dayDirParts);
198
+ fs.mkdirSync(dateDir, { recursive: true });
199
+ nowMs = new Date("2026-03-18T16:00:00Z").getTime();
200
+ locator = new CodexSessionLocator({ sessionsDir, now: () => nowMs });
201
+ actualBatch = (
202
+ (await vi.importActual("../../../utils/session")) as typeof import("../../../utils/session")
203
+ ).batchGetSessionFileBirthtimes;
204
+ mockedBatchGetSessionFileBirthtimes.mockImplementation(actualBatch);
205
+ mockedMatchProcessesToSessions.mockReturnValue([]);
206
+ mockedReadSync.mockClear();
207
+ mockedReadFileSync.mockClear();
208
+ });
209
+
210
+ it("reads at most 64 KiB of a 100 MB session file", () => {
211
+ const filePath = writeMetaSession("big", "/repo-big", 100 * 1024 * 1024);
212
+
213
+ const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);
214
+
215
+ expect(sessions).toHaveLength(1);
216
+ expect(sessions[0]).toMatchObject({
217
+ filePath,
218
+ resolvedCwd: "/repo-big",
219
+ birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime(),
220
+ });
221
+ expect(bytesRead()).toBeGreaterThan(0);
222
+ expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);
223
+ });
224
+
225
+ it("extracts cwd and timestamp when the session_meta line exceeds 64 KiB", () => {
226
+ const filePath = path.join(dateDir, "long-meta.jsonl");
227
+ fs.writeFileSync(
228
+ filePath,
229
+ JSON.stringify({
230
+ timestamp: "2026-03-18T15:00:04.000Z",
231
+ type: "session_meta",
232
+ payload: {
233
+ id: "long-meta",
234
+ timestamp: "2026-03-18T15:00:05.000Z",
235
+ cwd: '/repo "quoted"',
236
+ instructions: "x".repeat(300 * 1024),
237
+ },
238
+ }) + "\n",
239
+ );
240
+
241
+ const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);
242
+
243
+ expect(sessions[0]).toMatchObject({
244
+ resolvedCwd: '/repo "quoted"',
245
+ birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime(),
246
+ });
247
+ expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);
248
+ });
249
+
250
+ it("leaves files without a session_meta first line unresolved", () => {
251
+ const filePath = path.join(dateDir, "not-meta.jsonl");
252
+ fs.writeFileSync(filePath, JSON.stringify({ type: "event", payload: { cwd: "/x" } }) + "\n");
253
+ const birthtimeMs = fs.statSync(filePath).birthtimeMs;
254
+
255
+ const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);
256
+
257
+ expect(sessions[0]).toMatchObject({ resolvedCwd: "", birthtimeMs });
258
+ });
259
+
260
+ it("reads 0 bytes on later refreshes while session files only grow", () => {
261
+ const filePath = writeMetaSession("grow", "/repo-a");
262
+ mockedMatchProcessesToSessions.mockImplementation((_procs, sessions) => [
263
+ { process: processInfo, session: sessions[0], deltaMs: 5000 },
264
+ ]);
265
+
266
+ const first = locator.matchRunningProcesses([processInfo]);
267
+ expect(first.legacyMatches).toHaveLength(1);
268
+ expect(bytesRead()).toBeGreaterThan(0);
269
+
270
+ fs.appendFileSync(filePath, JSON.stringify({ type: "event", payload: {} }) + "\n");
271
+ mockedReadSync.mockClear();
272
+ mockedReadFileSync.mockClear();
273
+
274
+ const second = locator.matchRunningProcesses([processInfo]);
275
+
276
+ expect(second.legacyMatches).toHaveLength(1);
277
+ expect(second.legacyMatches[0].session).toMatchObject({
278
+ filePath,
279
+ resolvedCwd: "/repo-a",
280
+ birthtimeMs: new Date("2026-03-18T15:00:05.000Z").getTime(),
281
+ });
282
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
283
+ expect(bytesRead()).toBe(0);
284
+ });
285
+
286
+ it("rereads a session head when the file is replaced", () => {
287
+ const filePath = writeMetaSession("replaced", "/repo-old");
288
+ locator.discoverSessionFilesInDateDirs([dateDir]);
289
+
290
+ const tmpFile = path.join(tmpDir, "replacement.jsonl");
291
+ fs.writeFileSync(tmpFile, metaLine("replaced", "/repo-new") + "\n");
292
+ fs.renameSync(tmpFile, filePath);
293
+ mockedReadSync.mockClear();
294
+
295
+ const { sessions } = locator.discoverSessionFilesInDateDirs([dateDir]);
296
+
297
+ expect(sessions[0].resolvedCwd).toBe("/repo-new");
298
+ expect(bytesRead()).toBeGreaterThan(0);
299
+ });
300
+
301
+ it("does not rescan an unmatched process until its date directories change", () => {
302
+ writeMetaSession("other", "/repo-other");
303
+ setDirMtime(dateDir, new Date("2026-01-01T00:00:00Z"));
304
+
305
+ const first = locator.matchRunningProcesses([processInfo]);
306
+ expect(first.fallback).toEqual([processInfo]);
307
+ expect(first.legacyMatches).toEqual([]);
308
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
309
+
310
+ mockedReadSync.mockClear();
311
+ nowMs += 5_000;
312
+ const second = locator.matchRunningProcesses([processInfo]);
313
+
314
+ expect(second.fallback).toEqual([processInfo]);
315
+ expect(second.legacyMatches).toEqual([]);
316
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
317
+ expect(mockedMatchProcessesToSessions).toHaveBeenCalledTimes(1);
318
+ expect(bytesRead()).toBe(0);
319
+
320
+ const newFile = writeMetaSession("new-session", "/repo-a");
321
+ nowMs += 5_000;
322
+ locator.matchRunningProcesses([processInfo]);
323
+
324
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
325
+ expect(mockedMatchProcessesToSessions).toHaveBeenCalledTimes(2);
326
+ const rescannedPaths = mockedMatchProcessesToSessions.mock.calls[1][1].map(
327
+ (session) => session.filePath,
328
+ );
329
+ expect(rescannedPaths).toContain(newFile);
330
+ expect(bytesRead()).toBeGreaterThan(0);
331
+ expect(bytesRead()).toBeLessThanOrEqual(HEAD_LIMIT_BYTES);
332
+ });
333
+
334
+ it("rescans a newly created adjacent date directory for an unmatched process", () => {
335
+ locator.matchRunningProcesses([processInfo]);
336
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
337
+
338
+ const nextDayDir = path.join(sessionsDir, "2026", "03", "19");
339
+ fs.mkdirSync(nextDayDir, { recursive: true });
340
+ nowMs += 1_000;
341
+ locator.matchRunningProcesses([processInfo]);
342
+
343
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
344
+ expect(mockedBatchGetSessionFileBirthtimes.mock.calls[1][0]).toContain(nextDayDir);
345
+ });
346
+
347
+ it("re-checks an unmatched process at most every 30 seconds with unchanged directories", () => {
348
+ writeMetaSession("other", "/repo-other");
349
+ setDirMtime(dateDir, new Date("2026-01-01T00:00:00Z"));
350
+ locator.matchRunningProcesses([processInfo]);
351
+ mockedReadSync.mockClear();
352
+
353
+ nowMs += 29_999;
354
+ locator.matchRunningProcesses([processInfo]);
355
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
356
+
357
+ nowMs += 1;
358
+ locator.matchRunningProcesses([processInfo]);
359
+ expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(2);
360
+ expect(bytesRead()).toBe(0);
361
+ });
362
+
363
+ it("scans a new process even when another process is negatively cached", () => {
364
+ writeMetaSession("other", "/repo-other");
365
+ locator.matchRunningProcesses([processInfo]);
366
+ const other: ProcessInfo = { ...processInfo, pid: 5151 };
367
+
368
+ const result = locator.matchRunningProcesses([processInfo, other]);
369
+
370
+ expect(mockedMatchProcessesToSessions).toHaveBeenLastCalledWith([other], expect.any(Array));
371
+ expect(result.fallback).toEqual([processInfo, other]);
372
+ });
373
+
374
+ function metaLine(id: string, cwd: string): string {
375
+ return JSON.stringify({
376
+ type: "session_meta",
377
+ payload: { id, timestamp: "2026-03-18T15:00:05.000Z", cwd },
378
+ });
379
+ }
380
+
381
+ function writeMetaSession(id: string, cwd: string, totalBytes?: number): string {
382
+ const filePath = path.join(dateDir, `${id}.jsonl`);
383
+ fs.writeFileSync(filePath, metaLine(id, cwd) + "\n");
384
+ if (totalBytes !== undefined) fs.truncateSync(filePath, totalBytes);
385
+ return filePath;
386
+ }
387
+
388
+ function setDirMtime(dir: string, date: Date): void {
389
+ fs.utimesSync(dir, date, date);
390
+ }
391
+
392
+ function bytesRead(): number {
393
+ let total = 0;
394
+ for (const result of mockedReadSync.mock.results) {
395
+ if (result.type === "return" && typeof result.value === "number") total += result.value;
396
+ }
397
+ mockedReadFileSync.mock.calls.forEach((call, index) => {
398
+ if (!String(call[0]).startsWith(sessionsDir)) return;
399
+ const result = mockedReadFileSync.mock.results[index];
400
+ if (result?.type === "return") total += Buffer.byteLength(result.value as string | Buffer);
401
+ });
402
+ return total;
403
+ }
404
+ });
405
+
406
+ function writeSession(sessionId: string, day: string): string {
407
+ const dateDir = path.join(sessionsDir, ...day.split("/"));
408
+ fs.mkdirSync(dateDir, { recursive: true });
409
+ const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);
410
+ fs.writeFileSync(
411
+ sessionFile,
412
+ JSON.stringify({
413
+ type: "session_meta",
414
+ payload: { id: sessionId, timestamp: "2026-03-18T15:00:05.000Z", cwd: "/repo-a" },
415
+ }),
416
+ );
417
+ return sessionFile;
418
+ }
419
+ });
@@ -2,7 +2,7 @@ import * as fs from "fs";
2
2
  import * as os from "os";
3
3
  import * as path from "path";
4
4
  import type { ProcessInfo } from "../../../adapters/AgentAdapter.js";
5
- import { CodexSessionMapping } from "../../../providers/codex/CodexSessionMapping.js";
5
+ import { CodexSessionMapping } from "../../../harnesses/codex/CodexSessionMapping.js";
6
6
 
7
7
  describe("CodexSessionMapping", () => {
8
8
  let tmpDir: string;
@@ -2,7 +2,7 @@ import * as fs from "fs";
2
2
  import * as os from "os";
3
3
  import * as path from "path";
4
4
  import { AgentStatus } from "../../../adapters/AgentAdapter.js";
5
- import { CodexSessionParser } from "../../../providers/codex/CodexSessionParser.js";
5
+ import { CodexSessionParser } from "../../../harnesses/codex/CodexSessionParser.js";
6
6
 
7
7
  describe("CodexSessionParser", () => {
8
8
  let tmpDir: string;
@@ -2,7 +2,7 @@ import { describe, expect, it, vi } from "vitest";
2
2
 
3
3
  describe("CodexCliProbe", () => {
4
4
  it("validates version, exec JSON/stdin, and resume capabilities without a model call", async () => {
5
- const api = (await import("../../index.js")) as Record<string, unknown>;
5
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
6
6
  expect(api).toHaveProperty("CodexCliProbe");
7
7
  const exec = vi
8
8
  .fn()
@@ -29,7 +29,7 @@ describe("CodexCliProbe", () => {
29
29
  });
30
30
 
31
31
  it("rejects unsupported and unavailable CLIs with bounded sanitized errors", async () => {
32
- const api = (await import("../../index.js")) as Record<string, unknown>;
32
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
33
33
  const Probe = api.CodexCliProbe as new (options: unknown) => any;
34
34
  const unsupported = new Probe({
35
35
  exec: vi
@@ -60,7 +60,7 @@ describe("CodexCliProbe", () => {
60
60
  });
61
61
 
62
62
  it("reports an empty version response as unknown", async () => {
63
- const api = (await import("../../index.js")) as Record<string, unknown>;
63
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
64
64
  const Probe = api.CodexCliProbe as new (options: unknown) => any;
65
65
  const exec = vi
66
66
  .fn()
@@ -71,7 +71,7 @@ describe("CodexCliProbe", () => {
71
71
  });
72
72
 
73
73
  it("requires a standalone stdin dash rather than accepting flag hyphens", async () => {
74
- const api = (await import("../../index.js")) as Record<string, unknown>;
74
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
75
75
  const Probe = api.CodexCliProbe as new (options: unknown) => any;
76
76
  const exec = vi
77
77
  .fn()
@@ -2,7 +2,7 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { afterEach, describe, expect, it } from "vitest";
5
- import { DurableAgentRepository } from "../../durable/DurableAgentRepository.js";
5
+ import { DurableAgentRepository } from "../../../../durable/DurableAgentRepository.js";
6
6
 
7
7
  const SESSION = "22222222-2222-4222-8222-222222222222";
8
8
  const OTHER_SESSION = "33333333-3333-4333-8333-333333333333";
@@ -7,7 +7,7 @@ import {
7
7
  CodexPrintAgentService,
8
8
  DurableAgentRepository,
9
9
  type ProcessInspector,
10
- } from "../../index.js";
10
+ } from "../../../../index.js";
11
11
 
12
12
  const SESSION = "22222222-2222-4222-8222-222222222222";
13
13
  const roots: string[] = [];
@@ -10,19 +10,13 @@ const base = {
10
10
  };
11
11
 
12
12
  describe("CodexPrintAgentService", () => {
13
- it("constructs default non-billable dependencies without invoking them", async () => {
14
- const api = (await import("../../index.js")) as Record<string, unknown>;
15
- const Service = api.CodexPrintAgentService as new () => any;
16
- expect(new Service().repository).toBeDefined();
17
- });
18
-
19
13
  it("validates before provider-aware create and never runs Codex", async () => {
20
- const api = (await import("../../index.js")) as Record<string, unknown>;
14
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
21
15
  expect(api).toHaveProperty("CodexPrintAgentService");
22
16
  const probe = {
23
17
  validate: vi.fn().mockResolvedValue({ executable: "codex", version: "0.147.0" }),
24
18
  };
25
- const repository = { create: vi.fn().mockResolvedValue(base), list: vi.fn() };
19
+ const repository = { create: vi.fn().mockResolvedValue(base) };
26
20
  const runner = { run: vi.fn() };
27
21
  const Service = api.CodexPrintAgentService as new (options: unknown) => any;
28
22
  await new Service({ repository, probe, runner }).create({ name: "reviewer", cwd: "/project" });
@@ -35,9 +29,8 @@ describe("CodexPrintAgentService", () => {
35
29
  });
36
30
 
37
31
  it("binds during first send and explicitly resumes later sends", async () => {
38
- const api = (await import("../../index.js")) as Record<string, unknown>;
32
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
39
33
  const repository = {
40
- list: vi.fn(),
41
34
  resolve: vi.fn().mockResolvedValue(base),
42
35
  acquireRun: vi
43
36
  .fn()
@@ -81,11 +74,10 @@ describe("CodexPrintAgentService", () => {
81
74
  });
82
75
 
83
76
  it("records mismatch separately from unknown failures", async () => {
84
- const api = (await import("../../index.js")) as Record<string, unknown>;
77
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
85
78
  const ErrorType = api.CodexPrintError as new (message: string, code: string) => Error;
86
79
  const completeRun = vi.fn();
87
80
  const repository = {
88
- list: vi.fn(),
89
81
  resolve: vi.fn().mockResolvedValue(base),
90
82
  acquireRun: vi.fn().mockResolvedValue({ agent: base, token: "one" }),
91
83
  recordProviderProcess: vi.fn(),
@@ -111,7 +103,7 @@ describe("CodexPrintAgentService", () => {
111
103
  });
112
104
 
113
105
  it("rejects a non-Codex target without acquiring or mutating it", async () => {
114
- const api = (await import("../../index.js")) as Record<string, unknown>;
106
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
115
107
  const Service = api.CodexPrintAgentService as new (options: unknown) => any;
116
108
  const repository = {
117
109
  resolve: vi.fn().mockResolvedValue({ ...base, provider: "claude" }),
@@ -132,7 +124,7 @@ describe("CodexPrintAgentService", () => {
132
124
  });
133
125
 
134
126
  it("does not turn a successful completion write failure into a second completion", async () => {
135
- const api = (await import("../../index.js")) as Record<string, unknown>;
127
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
136
128
  const Service = api.CodexPrintAgentService as new (options: unknown) => any;
137
129
  const completionFailure = new Error("completion failed");
138
130
  const repository = {
@@ -158,11 +150,10 @@ describe("CodexPrintAgentService", () => {
158
150
  });
159
151
 
160
152
  it("records a repository binding conflict as a session mismatch", async () => {
161
- const api = (await import("../../index.js")) as Record<string, unknown>;
153
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
162
154
  const BindingError = api.CodexPrintError as new (message: string, code: string) => Error;
163
155
  const completeRun = vi.fn();
164
156
  const repository = {
165
- list: vi.fn(),
166
157
  resolve: vi.fn().mockResolvedValue(base),
167
158
  acquireRun: vi.fn().mockResolvedValue({ agent: base, token: "one" }),
168
159
  recordProviderProcess: vi.fn(),
@@ -190,10 +181,9 @@ describe("CodexPrintAgentService", () => {
190
181
  });
191
182
 
192
183
  it("rejects missing and ambiguous records before acquiring a run", async () => {
193
- const api = (await import("../../index.js")) as Record<string, unknown>;
184
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
194
185
  const Service = api.CodexPrintAgentService as new (options: unknown) => any;
195
186
  const repository = {
196
- list: vi.fn(),
197
187
  create: vi.fn(),
198
188
  resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([base, base]),
199
189
  acquireRun: vi.fn(),
@@ -1,7 +1,7 @@
1
1
  import { EventEmitter } from "node:events";
2
2
  import { PassThrough, Writable } from "node:stream";
3
3
  import { describe, expect, it, vi } from "vitest";
4
- import type { CodexDurableAgent } from "../../index.js";
4
+ import type { CodexDurableAgent } from "../../../../index.js";
5
5
 
6
6
  const SESSION = "22222222-2222-4222-8222-222222222222";
7
7
 
@@ -64,7 +64,7 @@ function events(session = SESSION): string[] {
64
64
  }
65
65
 
66
66
  async function runner(fixture: ReturnType<typeof fakeSpawn>, maxLineBytes?: number) {
67
- const api = (await import("../../index.js")) as Record<string, unknown>;
67
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
68
68
  expect(api).toHaveProperty("CodexPrintRunner");
69
69
  const Runner = api.CodexPrintRunner as new (options: unknown) => any;
70
70
  return new Runner({
@@ -77,12 +77,6 @@ async function runner(fixture: ReturnType<typeof fakeSpawn>, maxLineBytes?: numb
77
77
  }
78
78
 
79
79
  describe("CodexPrintRunner", () => {
80
- it("constructs default process dependencies without spawning", async () => {
81
- const api = (await import("../../index.js")) as Record<string, unknown>;
82
- const Runner = api.CodexPrintRunner as new () => any;
83
- expect(new Runner()).toBeDefined();
84
- });
85
-
86
80
  it("binds an initial thread before returning ordered assistant output", async () => {
87
81
  const fixture = fakeSpawn(events(), 0, true);
88
82
  const instance = await runner(fixture);
@@ -268,7 +262,7 @@ describe("CodexPrintRunner", () => {
268
262
  });
269
263
 
270
264
  it("rejects an unverifiable positive PID", async () => {
271
- const api = (await import("../../index.js")) as Record<string, unknown>;
265
+ const api = (await import("../../../../index.js")) as Record<string, unknown>;
272
266
  const fixture = fakeSpawn([]);
273
267
  const Runner = api.CodexPrintRunner as new (options: unknown) => any;
274
268
  const instance = new Runner({
@@ -7,7 +7,7 @@ import * as fs from "fs";
7
7
  import * as os from "os";
8
8
  import * as path from "path";
9
9
 
10
- import { CopilotAdapter } from "../../../providers/copilot/CopilotAdapter.js";
10
+ import { CopilotAdapter } from "../../../harnesses/copilot/CopilotAdapter.js";
11
11
  import type { ProcessInfo } from "../../../adapters/AgentAdapter.js";
12
12
  import { AgentStatus } from "../../../adapters/AgentAdapter.js";
13
13
  import {