@ai-devkit/agent-manager 0.36.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. package/dist/AgentManager.d.ts +9 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +21 -2
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +151 -3
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
  8. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
  9. package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
  10. package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
  11. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
  12. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
  13. package/dist/__tests__/capacity/openai.test.js +12 -14
  14. package/dist/__tests__/capacity/openai.test.js.map +1 -1
  15. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  16. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  17. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  18. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  20. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  21. package/dist/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.js +103 -22
  22. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  24. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  25. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  26. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  27. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  28. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  30. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  31. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  32. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  33. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  34. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  35. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  36. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  38. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  41. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  42. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  43. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  44. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  45. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  46. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  47. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  48. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  49. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  50. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  51. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  52. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  54. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  56. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  59. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  60. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  61. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  62. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  64. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  65. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  66. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  67. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  68. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  69. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  70. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  71. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  72. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  73. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  74. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  78. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  79. package/dist/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.js +137 -82
  80. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  81. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  82. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  83. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  84. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  90. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  91. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  92. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  93. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  94. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  95. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  96. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  97. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  98. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  99. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  105. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  106. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  107. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  108. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  109. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  110. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  111. package/dist/__tests__/utils/agents.test.js +66 -2
  112. package/dist/__tests__/utils/agents.test.js.map +1 -1
  113. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  114. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  115. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  116. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  117. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  118. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  119. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  120. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  121. package/dist/__tests__/utils/process.test.js +436 -2
  122. package/dist/__tests__/utils/process.test.js.map +1 -1
  123. package/dist/adapters/AgentAdapter.d.ts +25 -6
  124. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  125. package/dist/adapters/AgentAdapter.js +12 -3
  126. package/dist/adapters/AgentAdapter.js.map +1 -1
  127. package/dist/capacity/openai.d.ts +0 -1
  128. package/dist/capacity/openai.d.ts.map +1 -1
  129. package/dist/capacity/openai.js +0 -5
  130. package/dist/capacity/openai.js.map +1 -1
  131. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  132. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  133. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  134. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  135. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  136. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  137. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  138. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  139. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  140. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  141. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  142. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  143. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  144. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  145. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  146. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  147. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  148. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  149. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  150. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  151. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  152. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  153. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  154. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  155. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  156. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  157. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  158. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  159. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  160. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  161. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  162. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  163. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  164. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  165. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  166. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  167. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  169. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  170. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  171. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  172. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  173. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  174. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  175. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  176. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  177. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  178. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  179. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  180. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  181. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  182. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  183. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  184. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  185. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  186. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  187. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  190. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  191. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  192. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  193. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  195. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  196. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  197. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  198. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  199. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  200. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  201. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  202. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  203. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  204. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  205. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  206. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  207. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  208. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  209. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  210. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  211. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  212. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  213. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  214. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  215. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  216. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  217. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  218. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  219. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  220. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  221. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  222. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  223. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  224. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  225. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  226. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  227. package/dist/harnesses/gemini/fileSignature.js +9 -0
  228. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  229. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  230. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  231. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  232. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  233. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  234. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  235. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  236. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  237. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  238. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  239. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  240. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  241. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  242. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  243. package/dist/harnesses/index.d.ts +7 -0
  244. package/dist/harnesses/index.d.ts.map +1 -0
  245. package/dist/harnesses/index.js +27 -0
  246. package/dist/harnesses/index.js.map +1 -0
  247. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  248. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  249. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  250. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  251. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  252. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  253. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  254. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  255. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  256. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  257. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  258. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  259. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  260. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  262. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  263. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  264. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  265. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  266. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  267. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  268. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  269. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  270. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  271. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  272. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  273. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  274. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  275. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  276. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  277. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  278. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  279. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  280. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  281. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  282. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  283. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  284. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  285. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  286. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  287. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  288. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  289. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  290. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  291. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  292. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  293. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  294. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  295. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  296. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  297. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  298. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  299. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  300. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  301. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  303. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  304. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  305. package/dist/harnesses/shared.d.ts +41 -0
  306. package/dist/harnesses/shared.d.ts.map +1 -0
  307. package/dist/harnesses/shared.js +71 -0
  308. package/dist/harnesses/shared.js.map +1 -0
  309. package/dist/index.d.ts +26 -25
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +18 -17
  312. package/dist/index.js.map +1 -1
  313. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  314. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  315. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  316. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  317. package/dist/utils/agents.d.ts +3 -2
  318. package/dist/utils/agents.d.ts.map +1 -1
  319. package/dist/utils/agents.js +50 -15
  320. package/dist/utils/agents.js.map +1 -1
  321. package/dist/utils/index.d.ts +2 -1
  322. package/dist/utils/index.d.ts.map +1 -1
  323. package/dist/utils/index.js +1 -1
  324. package/dist/utils/index.js.map +1 -1
  325. package/dist/utils/jsonlTail.d.ts +73 -0
  326. package/dist/utils/jsonlTail.d.ts.map +1 -0
  327. package/dist/utils/jsonlTail.js +238 -0
  328. package/dist/utils/jsonlTail.js.map +1 -0
  329. package/dist/utils/matching.d.ts +2 -0
  330. package/dist/utils/matching.d.ts.map +1 -1
  331. package/dist/utils/matching.js +3 -2
  332. package/dist/utils/matching.js.map +1 -1
  333. package/dist/utils/matchingConstants.d.ts +15 -0
  334. package/dist/utils/matchingConstants.d.ts.map +1 -0
  335. package/dist/utils/matchingConstants.js +14 -0
  336. package/dist/utils/matchingConstants.js.map +1 -0
  337. package/dist/utils/process.d.ts +38 -2
  338. package/dist/utils/process.d.ts.map +1 -1
  339. package/dist/utils/process.js +131 -43
  340. package/dist/utils/process.js.map +1 -1
  341. package/package.json +2 -1
  342. package/scripts/benchmark-cold-start.mjs +350 -0
  343. package/src/AgentManager.ts +26 -5
  344. package/src/__tests__/AgentManager.test.ts +141 -3
  345. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  346. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  347. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  348. package/src/__tests__/capacity/openai.test.ts +5 -15
  349. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  350. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  351. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  352. package/src/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.ts +97 -25
  353. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  354. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  355. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  356. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  357. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  358. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  359. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  360. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  361. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  362. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  363. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  364. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  365. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  366. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  367. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  368. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  369. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  370. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  371. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  372. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  373. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  374. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  375. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  376. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  377. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  378. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  379. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  380. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  381. package/src/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.ts +127 -109
  382. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  383. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  384. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  385. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  386. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  387. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  388. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  389. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  390. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  391. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  392. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  393. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  394. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  395. package/src/__tests__/utils/agents.test.ts +76 -2
  396. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  397. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  398. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  399. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  400. package/src/__tests__/utils/process.test.ts +254 -0
  401. package/src/adapters/AgentAdapter.ts +37 -14
  402. package/src/capacity/openai.ts +0 -6
  403. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  404. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  405. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  406. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  407. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  408. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  409. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  410. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  411. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  412. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  413. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  414. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  415. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  416. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  417. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  418. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  419. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  420. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  421. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  422. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  423. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  424. package/src/harnesses/gemini/fileSignature.ts +10 -0
  425. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  426. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  427. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  428. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  429. package/src/harnesses/index.ts +28 -0
  430. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  431. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  432. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  433. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  434. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  435. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  436. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  437. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  438. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  439. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  440. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  441. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  442. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  443. package/src/harnesses/shared.ts +119 -0
  444. package/src/index.ts +26 -24
  445. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  446. package/src/utils/agents.ts +60 -28
  447. package/src/utils/index.ts +2 -0
  448. package/src/utils/jsonlTail.ts +349 -0
  449. package/src/utils/matching.ts +3 -3
  450. package/src/utils/matchingConstants.ts +15 -0
  451. package/src/utils/process.ts +189 -45
  452. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
  453. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  454. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  455. package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
  456. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  457. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  458. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  459. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  460. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  461. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  462. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  463. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  464. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  465. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  466. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  467. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  468. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  469. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  470. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  471. package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
  472. package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
  473. package/dist/adapters/AntigravityCliAdapter.js +0 -273
  474. package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
  475. package/dist/adapters/KiroAdapter.d.ts +0 -46
  476. package/dist/adapters/KiroAdapter.d.ts.map +0 -1
  477. package/dist/adapters/KiroAdapter.js +0 -344
  478. package/dist/adapters/KiroAdapter.js.map +0 -1
  479. package/dist/adapters/index.d.ts +0 -12
  480. package/dist/adapters/index.d.ts.map +0 -1
  481. package/dist/adapters/index.js +0 -12
  482. package/dist/adapters/index.js.map +0 -1
  483. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  484. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  485. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  486. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  487. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  488. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  489. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  490. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  491. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  492. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  493. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  494. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  495. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  496. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  497. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  498. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  499. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  500. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  501. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  502. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  503. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  504. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  505. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  506. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  507. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  508. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  509. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  510. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  511. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  512. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  513. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  514. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  515. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  516. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  517. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  518. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  519. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  520. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  521. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  522. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  523. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  524. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  525. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  526. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  527. package/dist/providers/grok/GrokSessionParser.js +0 -122
  528. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  529. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  530. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  531. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  532. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  533. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  534. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  535. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  536. package/dist/providers/pi/PiAdapter.js.map +0 -1
  537. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  538. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  539. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/pi/PiSessionLocator.js +0 -86
  541. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  542. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  543. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  544. package/dist/providers/pi/PiSessionParser.js +0 -191
  545. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  546. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  547. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  548. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  549. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  550. package/src/adapters/AntigravityCliAdapter.ts +0 -356
  551. package/src/adapters/KiroAdapter.ts +0 -456
  552. package/src/adapters/index.ts +0 -17
  553. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  554. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  555. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  556. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  557. package/src/providers/grok/GrokSessionParser.ts +0 -166
  558. package/src/providers/pi/PiSessionLocator.ts +0 -110
  559. package/src/providers/pi/PiSessionParser.ts +0 -284
  560. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  561. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  562. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  563. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  564. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  565. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  566. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  567. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  568. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  569. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  570. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  571. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  572. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  573. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  574. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  575. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  576. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  577. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  578. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  579. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  580. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  581. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  582. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  583. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  584. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  585. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  586. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  587. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  588. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  589. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  590. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  591. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  592. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  593. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  594. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  595. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  596. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  597. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  598. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  600. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  601. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  602. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  603. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  604. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  605. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  606. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  607. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  608. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  609. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  610. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  611. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  612. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  613. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  614. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  615. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  616. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  617. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  618. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -0,0 +1,133 @@
1
+ /**
2
+ * Subprocess budget tests for AntigravityCliAdapter (#257).
3
+ *
4
+ * `child_process` is mocked so every spawn is recorded; the real process
5
+ * utilities and AgentManager run on top of it. Detection must never use the
6
+ * synchronous child_process APIs and must reuse the shared snapshot.
7
+ */
8
+
9
+ import * as fs from "fs";
10
+ import * as os from "os";
11
+ import * as path from "path";
12
+ import * as childProcess from "child_process";
13
+
14
+ import { AntigravityCliAdapter } from "../../../harnesses/antigravity/AntigravityCliAdapter.js";
15
+ import type { ProcessInfo } from "../../../adapters/AgentAdapter.js";
16
+ import { AgentManager } from "../../../AgentManager.js";
17
+ import { AgentRegistry } from "../../../utils/AgentRegistry.js";
18
+ import { createProcessSnapshotCapture } from "../../../utils/process.js";
19
+
20
+ vi.mock("child_process", async (importOriginal) => {
21
+ const actual = (await importOriginal()) as typeof import("child_process");
22
+ const forbidden = (name: string) =>
23
+ vi.fn(() => {
24
+ throw new Error(`unexpected child_process.${name} call`);
25
+ });
26
+ return {
27
+ ...actual,
28
+ execFile: vi.fn(),
29
+ exec: forbidden("exec"),
30
+ spawn: forbidden("spawn"),
31
+ execFileSync: forbidden("execFileSync"),
32
+ execSync: forbidden("execSync"),
33
+ spawnSync: forbidden("spawnSync"),
34
+ };
35
+ });
36
+
37
+ const AGY_PID = 4242;
38
+ const AGY_CWD = "/Users/dev/my-project";
39
+
40
+ type ExecFileCallback = (error: Error | null, stdout: string, stderr: string) => void;
41
+
42
+ /** Fake `ps`/`lsof` output for one running agy process plus an unrelated one. */
43
+ function fakeExecFile(file: string, args: readonly string[]): string {
44
+ if (file === "ps" && args[0] === "-axo") {
45
+ return [`${AGY_PID} 1 ttys010 /usr/local/bin/agy`, "77 1 ttys011 node server.js"].join("\n");
46
+ }
47
+ if (file === "lsof") return `p${AGY_PID}\nn${AGY_CWD}\n`;
48
+ if (file === "ps" && args[0] === "-o") return `${AGY_PID} Wed Mar 18 23:18:01 2026\n`;
49
+ throw new Error(`unexpected execFile ${file} ${args.join(" ")}`);
50
+ }
51
+
52
+ const mockedExecFile = childProcess.execFile as unknown as ReturnType<typeof vi.fn>;
53
+ const syncApis = ["execFileSync", "execSync", "spawnSync"] as const;
54
+ const allSpawnApis = [...syncApis, "execFile", "exec", "spawn"] as const;
55
+
56
+ function callCount(api: (typeof allSpawnApis)[number]): number {
57
+ return (childProcess[api] as unknown as ReturnType<typeof vi.fn>).mock.calls.length;
58
+ }
59
+
60
+ describe("AntigravityCliAdapter subprocess usage", () => {
61
+ let base: string;
62
+
63
+ beforeEach(() => {
64
+ base = fs.mkdtempSync(path.join(os.tmpdir(), "agy-subprocess-test-"));
65
+ process.env.ANTIGRAVITY_CLI_HOME = base;
66
+ for (const api of allSpawnApis) {
67
+ (childProcess[api] as unknown as ReturnType<typeof vi.fn>).mockClear();
68
+ }
69
+ mockedExecFile.mockImplementation(
70
+ (file: string, args: readonly string[], _opts: unknown, cb: ExecFileCallback) => {
71
+ try {
72
+ cb(null, fakeExecFile(file, args), "");
73
+ } catch (error) {
74
+ cb(error as Error, "", "");
75
+ }
76
+ },
77
+ );
78
+ });
79
+
80
+ afterEach(() => {
81
+ delete process.env.ANTIGRAVITY_CLI_HOME;
82
+ fs.rmSync(base, { recursive: true, force: true });
83
+ });
84
+
85
+ it("spawns no subprocess when the injected snapshot has no agy process", async () => {
86
+ const adapter = new AntigravityCliAdapter();
87
+ const snapshot: ProcessInfo[] = [{ pid: 77, command: "node server.js", cwd: "/x", tty: "" }];
88
+
89
+ expect(await adapter.detectAgents({ processes: snapshot })).toEqual([]);
90
+
91
+ for (const api of allSpawnApis) expect(callCount(api)).toBe(0);
92
+ });
93
+
94
+ it("spawns no subprocess when the injected snapshot contains an agy process", async () => {
95
+ const adapter = new AntigravityCliAdapter();
96
+ const snapshot: ProcessInfo[] = [
97
+ { pid: AGY_PID, command: "agy", cwd: AGY_CWD, tty: "ttys010", startTime: new Date() },
98
+ ];
99
+
100
+ const agents = await adapter.detectAgents({ processes: snapshot });
101
+
102
+ expect(agents.map((agent) => agent.pid)).toEqual([AGY_PID]);
103
+ for (const api of allSpawnApis) expect(callCount(api)).toBe(0);
104
+ });
105
+
106
+ it("never calls synchronous child_process APIs when capturing its own snapshot", async () => {
107
+ const adapter = new AntigravityCliAdapter();
108
+
109
+ const agents = await adapter.detectAgents();
110
+
111
+ expect(agents).toHaveLength(1);
112
+ expect(agents[0]).toMatchObject({ pid: AGY_PID, projectPath: AGY_CWD });
113
+ for (const api of syncApis) expect(callCount(api)).toBe(0);
114
+ });
115
+
116
+ it("makes a full listAgents() refresh spawn exactly one ps + lsof + ps lstart set", async () => {
117
+ // A fresh capture: the shared one caches start times from earlier tests (#266).
118
+ const manager = new AgentManager(
119
+ new AgentRegistry(path.join(base, "agents.json")),
120
+ createProcessSnapshotCapture(),
121
+ );
122
+ manager.registerAdapter(new AntigravityCliAdapter());
123
+
124
+ const agents = await manager.listAgents();
125
+
126
+ expect(agents.map((agent) => agent.pid)).toEqual([AGY_PID]);
127
+ const spawned = mockedExecFile.mock.calls.map(
128
+ ([file, args]) => `${file} ${(args as string[])[0]}`,
129
+ );
130
+ expect(spawned.sort()).toEqual(["lsof -a", "ps -axo", "ps -o"]);
131
+ for (const api of syncApis) expect(callCount(api)).toBe(0);
132
+ });
133
+ });
@@ -11,23 +11,28 @@ import * as fs from "fs";
11
11
  import * as os from "os";
12
12
  import * as path from "path";
13
13
 
14
- import { AntigravityCliAdapter } from "../../adapters/AntigravityCliAdapter.js";
15
- import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
16
- import { AgentStatus } from "../../adapters/AgentAdapter.js";
17
- import { listAgentProcesses, enrichProcesses } from "../../utils/process.js";
18
- import { generateAgentName } from "../../utils/matching.js";
19
-
20
- vi.mock("../../utils/process.js", async (importOriginal) => {
21
- const actual = (await importOriginal()) as typeof import("../../utils/process.js");
14
+ import { AntigravityCliAdapter } from "../../../harnesses/antigravity/AntigravityCliAdapter.js";
15
+ import type { ProcessInfo } from "../../../adapters/AgentAdapter.js";
16
+ import { AgentStatus } from "../../../adapters/AgentAdapter.js";
17
+ import {
18
+ listAgentProcesses,
19
+ enrichProcesses,
20
+ captureProcessSnapshot,
21
+ } from "../../../utils/process.js";
22
+ import { generateAgentName } from "../../../utils/matching.js";
23
+
24
+ vi.mock("../../../utils/process.js", async (importOriginal) => {
25
+ const actual = (await importOriginal()) as typeof import("../../../utils/process.js");
22
26
  return {
23
27
  ...actual,
24
28
  listAgentProcesses: vi.fn(),
25
29
  enrichProcesses: vi.fn(),
30
+ captureProcessSnapshot: vi.fn(),
26
31
  };
27
32
  });
28
33
 
29
- vi.mock("../../utils/matching.js", async (importOriginal) => {
30
- const actual = (await importOriginal()) as typeof import("../../utils/matching.js");
34
+ vi.mock("../../../utils/matching.js", async (importOriginal) => {
35
+ const actual = (await importOriginal()) as typeof import("../../../utils/matching.js");
31
36
  return {
32
37
  ...actual,
33
38
  generateAgentName: vi.fn(),
@@ -36,6 +41,9 @@ vi.mock("../../utils/matching.js", async (importOriginal) => {
36
41
 
37
42
  const mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;
38
43
  const mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;
44
+ const mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<
45
+ typeof captureProcessSnapshot
46
+ >;
39
47
  const mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;
40
48
 
41
49
  const CONVERSATION_ID = "10485e13-2742-4e9e-b286-ac0606f0cb1e";
@@ -82,6 +90,7 @@ describe("AntigravityCliAdapter", () => {
82
90
 
83
91
  mockedListAgentProcesses.mockReset();
84
92
  mockedEnrichProcesses.mockReset();
93
+ mockedCaptureProcessSnapshot.mockReset();
85
94
  mockedGenerateAgentName.mockReset();
86
95
 
87
96
  mockedEnrichProcesses.mockImplementation((procs) => procs);
@@ -133,10 +142,9 @@ describe("AntigravityCliAdapter", () => {
133
142
  };
134
143
  }
135
144
 
136
- describe("initialization", () => {
137
- it("exposes the antigravity_cli type", () => {
138
- expect(adapter.type).toBe("antigravity_cli");
139
- });
145
+ it("exposes the antigravity_cli type and the agy process name", () => {
146
+ expect(adapter.type).toBe("antigravity_cli");
147
+ expect(adapter.processNames).toEqual(["agy"]);
140
148
  });
141
149
 
142
150
  describe("canHandle", () => {
@@ -156,21 +164,51 @@ describe("AntigravityCliAdapter", () => {
156
164
  expect(adapter.canHandle(proc({ command: "node app.js" }))).toBe(false);
157
165
  });
158
166
 
167
+ it("returns true for agy installed under a path containing spaces", () => {
168
+ const executable = path.join(base, "Antigravity App.app", "bin", "agy");
169
+ fs.mkdirSync(path.dirname(executable), { recursive: true });
170
+ fs.writeFileSync(executable, "");
171
+
172
+ expect(adapter.canHandle(proc({ command: `${executable} --prompt fix it` }))).toBe(true);
173
+ expect(adapter.canHandle(proc({ command: "/usr/bin/vim My Notes/agy" }))).toBe(false);
174
+ });
175
+
159
176
  it('returns false when "agy" appears only in an argument path', () => {
160
177
  expect(adapter.canHandle(proc({ command: "node /path/to/agy-thing.js" }))).toBe(false);
161
178
  });
162
179
  });
163
180
 
164
181
  describe("detectAgents", () => {
165
- it("returns [] when there are no agy processes", async () => {
166
- mockedListAgentProcesses.mockReturnValue([]);
182
+ it("uses context.processes when provided and never captures its own snapshot", async () => {
183
+ writeTranscript({});
184
+ writeRegistry({ [cwd]: CONVERSATION_ID });
185
+
186
+ const agents = await adapter.detectAgents({
187
+ processes: [proc(), proc({ pid: 7, command: "node server.js" })],
188
+ });
189
+
190
+ expect(agents.map((a) => a.pid)).toEqual([4242]);
191
+ expect(agents[0].sessionId).toBe(CONVERSATION_ID);
192
+ expect(mockedCaptureProcessSnapshot).not.toHaveBeenCalled();
193
+ expect(mockedListAgentProcesses).not.toHaveBeenCalled();
194
+ expect(mockedEnrichProcesses).not.toHaveBeenCalled();
195
+ });
196
+
197
+ it("falls back to the async captureProcessSnapshot without context", async () => {
198
+ mockedCaptureProcessSnapshot.mockResolvedValue([]);
199
+
167
200
  expect(await adapter.detectAgents()).toEqual([]);
201
+ expect(mockedCaptureProcessSnapshot).toHaveBeenCalledWith(["agy"], {
202
+ isCandidate: expect.any(Function),
203
+ });
204
+ expect(mockedListAgentProcesses).not.toHaveBeenCalled();
205
+ expect(mockedEnrichProcesses).not.toHaveBeenCalled();
168
206
  });
169
207
 
170
208
  it("resolves the conversation via last_conversations.json (cwd -> id)", async () => {
171
209
  writeTranscript({});
172
210
  writeRegistry({ [cwd]: CONVERSATION_ID });
173
- mockedListAgentProcesses.mockReturnValue([proc()]);
211
+ mockedCaptureProcessSnapshot.mockResolvedValue([proc()]);
174
212
 
175
213
  const agents = await adapter.detectAgents();
176
214
 
@@ -190,7 +228,7 @@ describe("AntigravityCliAdapter", () => {
190
228
  it("falls back to a process-only RUNNING agent when the cwd is not in the registry", async () => {
191
229
  writeTranscript({});
192
230
  writeRegistry({ "/some/other/cwd": CONVERSATION_ID });
193
- mockedListAgentProcesses.mockReturnValue([proc()]);
231
+ mockedCaptureProcessSnapshot.mockResolvedValue([proc()]);
194
232
 
195
233
  const agents = await adapter.detectAgents();
196
234
 
@@ -203,7 +241,7 @@ describe("AntigravityCliAdapter", () => {
203
241
  it("is process-only when the mapped conversation has no transcript", async () => {
204
242
  writeTranscript({ transcript: false });
205
243
  writeRegistry({ [cwd]: CONVERSATION_ID });
206
- mockedListAgentProcesses.mockReturnValue([proc()]);
244
+ mockedCaptureProcessSnapshot.mockResolvedValue([proc()]);
207
245
 
208
246
  const agents = await adapter.detectAgents();
209
247
 
@@ -220,10 +258,10 @@ describe("AntigravityCliAdapter", () => {
220
258
  ]);
221
259
  });
222
260
 
223
- it("accepts a bare conversation id and skips malformed lines", () => {
261
+ it("skips malformed lines", () => {
224
262
  const file = writeTranscript({ records: [userRecord("hi")] });
225
263
  fs.appendFileSync(file, "\n{bad json");
226
- expect(adapter.getConversation(CONVERSATION_ID)).toEqual([{ role: "user", content: "hi" }]);
264
+ expect(adapter.getConversation(file)).toEqual([{ role: "user", content: "hi" }]);
227
265
  });
228
266
 
229
267
  it("excludes SYSTEM records unless verbose", () => {
@@ -260,14 +298,14 @@ describe("AntigravityCliAdapter", () => {
260
298
  records: [userRecord("go"), toolRecord("ran: echo hi"), modelRecord("done")],
261
299
  });
262
300
  writeRegistry({ [cwd]: CONVERSATION_ID });
263
- mockedListAgentProcesses.mockReturnValue([proc()]);
301
+ mockedCaptureProcessSnapshot.mockResolvedValue([proc()]);
264
302
  expect((await detectFirst()).status).toBe(AgentStatus.WAITING);
265
303
  });
266
304
 
267
305
  it("marks RUNNING when the last transcript turn is a USER_INPUT message", async () => {
268
306
  writeTranscript({ records: [userRecord("still there?")] });
269
307
  writeRegistry({ [cwd]: CONVERSATION_ID });
270
- mockedListAgentProcesses.mockReturnValue([proc()]);
308
+ mockedCaptureProcessSnapshot.mockResolvedValue([proc()]);
271
309
  expect((await detectFirst()).status).toBe(AgentStatus.RUNNING);
272
310
  });
273
311
 
@@ -275,14 +313,14 @@ describe("AntigravityCliAdapter", () => {
275
313
  const old = new Date(Date.now() - 10 * 60 * 1000);
276
314
  writeTranscript({ records: [userRecord("go", old)] });
277
315
  writeRegistry({ [cwd]: CONVERSATION_ID });
278
- mockedListAgentProcesses.mockReturnValue([proc()]);
316
+ mockedCaptureProcessSnapshot.mockResolvedValue([proc()]);
279
317
  expect((await detectFirst()).status).toBe(AgentStatus.IDLE);
280
318
  });
281
319
 
282
320
  it("uses the last user request as the agent summary", async () => {
283
321
  writeTranscript({ records: [userRecord("refactor the parser"), modelRecord("on it")] });
284
322
  writeRegistry({ [cwd]: CONVERSATION_ID });
285
- mockedListAgentProcesses.mockReturnValue([proc()]);
323
+ mockedCaptureProcessSnapshot.mockResolvedValue([proc()]);
286
324
  expect((await detectFirst()).summary).toBe("refactor the parser");
287
325
  });
288
326
  });
@@ -292,6 +330,16 @@ describe("AntigravityCliAdapter", () => {
292
330
  expect(await adapter.listSessions()).toEqual([]);
293
331
  });
294
332
 
333
+ it("ignores a malformed registry and non-string conversation ids", async () => {
334
+ writeTranscript({});
335
+ fs.mkdirSync(path.join(base, "cache"), { recursive: true });
336
+ fs.writeFileSync(path.join(base, "cache", "last_conversations.json"), "{not json");
337
+ expect(await adapter.listSessions()).toEqual([]);
338
+
339
+ writeRegistry({ [cwd]: 42 as unknown as string, "/Users/dev/other": "" });
340
+ expect(await adapter.listSessions()).toEqual([]);
341
+ });
342
+
295
343
  it("lists sessions from the registry with cwd + first user message", async () => {
296
344
  writeTranscript({});
297
345
  writeRegistry({ [cwd]: CONVERSATION_ID });
@@ -321,4 +369,28 @@ describe("AntigravityCliAdapter", () => {
321
369
  expect(filtered[0].cwd).toBe("/Users/dev/project-a");
322
370
  });
323
371
  });
372
+
373
+ describe("findSessionsById", () => {
374
+ it("finds a registered conversation by id", async () => {
375
+ writeTranscript({});
376
+ writeRegistry({ [cwd]: CONVERSATION_ID });
377
+
378
+ expect(await adapter.findSessionsById(CONVERSATION_ID)).toEqual([
379
+ expect.objectContaining({
380
+ type: "antigravity_cli",
381
+ sessionId: CONVERSATION_ID,
382
+ cwd,
383
+ firstUserMessage: "fix the bug",
384
+ }),
385
+ ]);
386
+ });
387
+
388
+ it("ignores transcripts that are not in the registry, like listSessions", async () => {
389
+ writeTranscript({});
390
+ writeRegistry({});
391
+
392
+ expect(await adapter.findSessionsById(CONVERSATION_ID)).toEqual([]);
393
+ expect(await adapter.listSessions()).toEqual([]);
394
+ });
395
+ });
324
396
  });
@@ -0,0 +1,33 @@
1
+ import * as fs from "fs";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+
5
+ import { AGENT_TYPES } from "../../adapters/AgentAdapter.js";
6
+ import { createBuiltinAdapters } from "../../harnesses/index.js";
7
+ import { AgentRegistry } from "../../utils/AgentRegistry.js";
8
+
9
+ describe("createBuiltinAdapters", () => {
10
+ let tmpDir: string;
11
+
12
+ beforeEach(() => {
13
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "builtin-adapters-"));
14
+ // Several adapters default to AgentRegistry.default(), which opens ~/.ai-devkit/agents.db.
15
+ vi.spyOn(AgentRegistry, "default").mockReturnValue(
16
+ new AgentRegistry(path.join(tmpDir, "agents.json")),
17
+ );
18
+ });
19
+
20
+ afterEach(() => {
21
+ vi.restoreAllMocks();
22
+ fs.rmSync(tmpDir, { recursive: true, force: true });
23
+ });
24
+
25
+ it("returns exactly one adapter per built-in agent type", () => {
26
+ const adapters = createBuiltinAdapters();
27
+ try {
28
+ expect(adapters.map((adapter) => adapter.type).sort()).toEqual([...AGENT_TYPES].sort());
29
+ } finally {
30
+ for (const adapter of adapters) (adapter as { close?: () => void }).close?.();
31
+ }
32
+ });
33
+ });
@@ -1,8 +1,8 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
 
3
3
  import { AgentStatus, type ProcessInfo } from "../../../adapters/AgentAdapter.js";
4
- import { ClaudeAgentMapper } from "../../../providers/claude/ClaudeAgentMapper.js";
5
- import type { ClaudeSession } from "../../../providers/claude/ClaudeSessionParser.js";
4
+ import { ClaudeAgentMapper } from "../../../harnesses/claude/ClaudeAgentMapper.js";
5
+ import type { ClaudeSession } from "../../../harnesses/claude/ClaudeSessionParser.js";
6
6
  import type { SessionFile } from "../../../utils/session.js";
7
7
 
8
8
  function makeProcess(overrides: Partial<ProcessInfo> = {}): ProcessInfo {
@@ -65,7 +65,7 @@ describe("ClaudeAgentMapper", () => {
65
65
  });
66
66
  });
67
67
 
68
- it("maps unmatched processes to the existing process-only fallback shape", () => {
68
+ it("maps unmatched processes to the shared process-only placeholder", () => {
69
69
  const mapper = new ClaudeAgentMapper();
70
70
 
71
71
  const agent = mapper.mapProcessOnlyAgent(makeProcess({ pid: 456, cwd: "/repo/tooling" }));
@@ -73,8 +73,8 @@ describe("ClaudeAgentMapper", () => {
73
73
  expect(agent).toMatchObject({
74
74
  name: "tooling-456",
75
75
  type: "claude",
76
- status: AgentStatus.IDLE,
77
- summary: "Unknown",
76
+ status: AgentStatus.RUNNING,
77
+ summary: "Claude Code process running",
78
78
  pid: 456,
79
79
  projectPath: "/repo/tooling",
80
80
  sessionId: "pid-456",
@@ -6,21 +6,21 @@ import type { MockedFunction } from "vitest";
6
6
  import * as fs from "fs";
7
7
  import * as path from "path";
8
8
 
9
- import { ClaudeCodeAdapter } from "../../providers/claude/ClaudeCodeAdapter.js";
10
- import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
11
- import { AgentStatus } from "../../adapters/AgentAdapter.js";
9
+ import { ClaudeCodeAdapter } from "../../../harnesses/claude/ClaudeCodeAdapter.js";
10
+ import type { ProcessInfo } from "../../../adapters/AgentAdapter.js";
11
+ import { AgentStatus } from "../../../adapters/AgentAdapter.js";
12
12
  import {
13
13
  listAgentProcesses,
14
14
  enrichProcesses,
15
15
  captureProcessSnapshot,
16
- } from "../../utils/process.js";
17
- import { batchGetSessionFileBirthtimes } from "../../utils/session.js";
18
- import type { SessionFile } from "../../utils/session.js";
19
- import { matchProcessesToSessions, generateAgentName } from "../../utils/matching.js";
20
- import type { MatchResult } from "../../utils/matching.js";
16
+ } from "../../../utils/process.js";
17
+ import { batchGetSessionFileBirthtimes } from "../../../utils/session.js";
18
+ import type { SessionFile } from "../../../utils/session.js";
19
+ import { matchProcessesToSessions, generateAgentName } from "../../../utils/matching.js";
20
+ import type { MatchResult } from "../../../utils/matching.js";
21
21
  import * as os from "os";
22
- vi.mock("../../utils/process.js", async (importOriginal) => {
23
- const actual = (await importOriginal()) as typeof import("../../utils/process.js");
22
+ vi.mock("../../../utils/process.js", async (importOriginal) => {
23
+ const actual = (await importOriginal()) as typeof import("../../../utils/process.js");
24
24
  return {
25
25
  ...actual,
26
26
  listAgentProcesses: vi.fn(),
@@ -29,17 +29,17 @@ vi.mock("../../utils/process.js", async (importOriginal) => {
29
29
  };
30
30
  });
31
31
 
32
- vi.mock("../../utils/session.js", async () => {
32
+ vi.mock("../../../utils/session.js", async () => {
33
33
  const actual = (await vi.importActual(
34
- "../../utils/session",
35
- )) as typeof import("../../utils/session");
34
+ "../../../utils/session",
35
+ )) as typeof import("../../../utils/session");
36
36
  return {
37
37
  ...actual,
38
38
  batchGetSessionFileBirthtimes: vi.fn(),
39
39
  };
40
40
  });
41
41
 
42
- vi.mock("../../utils/matching.js", () => ({
42
+ vi.mock("../../../utils/matching.js", () => ({
43
43
  matchProcessesToSessions: vi.fn(),
44
44
  generateAgentName: vi.fn(),
45
45
  }));
@@ -131,6 +131,37 @@ describe("ClaudeCodeAdapter", () => {
131
131
  expect(adapter.canHandle(processInfo)).toBe(false);
132
132
  });
133
133
 
134
+ it("should return true for claude installed under a path containing spaces", () => {
135
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "claude-spaces-"));
136
+ try {
137
+ const executable = path.join(root, "Applications", "Some App.app", "Contents", "claude");
138
+ fs.mkdirSync(path.dirname(executable), { recursive: true });
139
+ fs.writeFileSync(executable, "");
140
+
141
+ expect(
142
+ adapter.canHandle({
143
+ pid: 12345,
144
+ command: `${executable} --resume abc --append-system-prompt be brief/codex`,
145
+ cwd: "/test",
146
+ tty: "ttys001",
147
+ }),
148
+ ).toBe(true);
149
+ } finally {
150
+ fs.rmSync(root, { recursive: true, force: true });
151
+ }
152
+ });
153
+
154
+ it("should return false when claude only appears in an argument containing spaces", () => {
155
+ expect(
156
+ adapter.canHandle({
157
+ pid: 12345,
158
+ command: "/usr/bin/vim My Notes/claude",
159
+ cwd: "/test",
160
+ tty: "ttys001",
161
+ }),
162
+ ).toBe(false);
163
+ });
164
+
134
165
  it('should return false for processes with "claude" only in path arguments', () => {
135
166
  const processInfo = {
136
167
  pid: 12345,
@@ -166,11 +197,11 @@ describe("ClaudeCodeAdapter", () => {
166
197
  expect(agents).toHaveLength(1);
167
198
  expect(agents[0]).toMatchObject({
168
199
  type: "claude",
169
- status: AgentStatus.IDLE,
200
+ status: AgentStatus.RUNNING,
170
201
  pid: 777,
171
202
  projectPath: "/project/app",
172
203
  sessionId: "pid-777",
173
- summary: "Unknown",
204
+ summary: "Claude Code process running",
174
205
  });
175
206
  });
176
207
 
@@ -299,7 +330,7 @@ describe("ClaudeCodeAdapter", () => {
299
330
  const unmatched = agents.find((a) => a.pid === 200);
300
331
  expect(matched?.sessionId).toBe("only-session");
301
332
  expect(unmatched?.sessionId).toBe("pid-200");
302
- expect(unmatched?.status).toBe(AgentStatus.IDLE);
333
+ expect(unmatched?.status).toBe(AgentStatus.RUNNING);
303
334
 
304
335
  fs.rmSync(tmpDir, { recursive: true, force: true });
305
336
  });
@@ -316,7 +347,7 @@ describe("ClaudeCodeAdapter", () => {
316
347
  expect(agents[0]).toMatchObject({
317
348
  pid: 300,
318
349
  sessionId: "pid-300",
319
- summary: "Unknown",
350
+ summary: "Claude Code process running",
320
351
  projectPath: "",
321
352
  });
322
353
  });
@@ -396,7 +427,7 @@ describe("ClaudeCodeAdapter", () => {
396
427
 
397
428
  expect(agents).toHaveLength(1);
398
429
  expect(agents[0].sessionId).toBe("pid-41921");
399
- expect(agents[0].status).toBe(AgentStatus.IDLE);
430
+ expect(agents[0].status).toBe(AgentStatus.RUNNING);
400
431
  });
401
432
 
402
433
  it("should use PID file for direct match and skip legacy matching for that process", async () => {
@@ -745,14 +776,14 @@ describe("ClaudeCodeAdapter", () => {
745
776
  (adapter as any).projectsDir = projectsDir;
746
777
 
747
778
  // Simulate JSONL disappearing between existence check and read
748
- vi.spyOn((adapter as any).parser, "readSession").mockReturnValueOnce(null);
779
+ vi.spyOn((adapter as any).parser, "readSessionIncremental").mockReturnValueOnce(null);
749
780
 
750
781
  const agents = await adapter.detectAgents();
751
782
 
752
783
  // matchedPids.delete called → process falls back to IDLE
753
784
  expect(agents).toHaveLength(1);
754
785
  expect(agents[0].sessionId).toBe("pid-66001");
755
- expect(agents[0].status).toBe(AgentStatus.IDLE);
786
+ expect(agents[0].status).toBe(AgentStatus.RUNNING);
756
787
 
757
788
  fs.rmSync(tmpDir, { recursive: true, force: true });
758
789
  vi.restoreAllMocks();
@@ -795,13 +826,13 @@ describe("ClaudeCodeAdapter", () => {
795
826
  ]);
796
827
 
797
828
  // Simulate JSONL disappearing between match and read
798
- vi.spyOn((adapter as any).parser, "readSession").mockReturnValueOnce(null);
829
+ vi.spyOn((adapter as any).parser, "readSessionIncremental").mockReturnValueOnce(null);
799
830
 
800
831
  const agents = await adapter.detectAgents();
801
832
 
802
833
  expect(agents).toHaveLength(1);
803
834
  expect(agents[0].sessionId).toBe("pid-66002");
804
- expect(agents[0].status).toBe(AgentStatus.IDLE);
835
+ expect(agents[0].status).toBe(AgentStatus.RUNNING);
805
836
 
806
837
  fs.rmSync(tmpDir, { recursive: true, force: true });
807
838
  vi.restoreAllMocks();
@@ -1150,7 +1181,6 @@ describe("ClaudeCodeAdapter", () => {
1150
1181
 
1151
1182
  beforeEach(() => {
1152
1183
  tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "claude-test-"));
1153
- (adapter as any).projectsDir = path.join(tmpDir, "projects");
1154
1184
  });
1155
1185
 
1156
1186
  afterEach(() => {
@@ -5,7 +5,7 @@ import * as path from "path";
5
5
  import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
6
6
 
7
7
  import { AgentStatus, type ProcessInfo } from "../../../adapters/AgentAdapter.js";
8
- import { ClaudeSessionLocator } from "../../../providers/claude/ClaudeSessionLocator.js";
8
+ import { ClaudeSessionLocator } from "../../../harnesses/claude/ClaudeSessionLocator.js";
9
9
  import { batchGetSessionFileBirthtimes } from "../../../utils/session.js";
10
10
  import type { SessionFile } from "../../../utils/session.js";
11
11
 
@@ -419,16 +419,5 @@ describe("ClaudeSessionLocator", () => {
419
419
  expect(encode("/a/b_c")).toBe(encode("/a/b-c"));
420
420
  expect(encode("/a/b_c")).toBe(encode("/a/b.c"));
421
421
  });
422
-
423
- it("should resolve to a real session dir when cwd contains underscores", () => {
424
- const cwd = "/Users/foo/my_project";
425
- const expectedDir = path.join(projectsDir, "-Users-foo-my-project");
426
- fs.mkdirSync(expectedDir, { recursive: true });
427
- const sessionFile = path.join(expectedDir, "session-underscore.jsonl");
428
- fs.writeFileSync(sessionFile, "");
429
-
430
- expect(encode(cwd)).toBe(expectedDir);
431
- expect(fs.existsSync(path.join(encode(cwd), "session-underscore.jsonl"))).toBe(true);
432
- });
433
422
  });
434
423
  });
@@ -1,12 +1,12 @@
1
1
  /**
2
- * Tests for providers/claude/ClaudeSessionParser.ts — focused on stripping
2
+ * Tests for harnesses/claude/ClaudeSessionParser.ts — focused on stripping
3
3
  * harness-injected XML tags from conversation content.
4
4
  */
5
5
 
6
6
  import * as fs from "fs";
7
7
  import * as os from "os";
8
8
  import * as path from "path";
9
- import { ClaudeSessionParser } from "../../providers/claude/ClaudeSessionParser.js";
9
+ import { ClaudeSessionParser } from "../../../harnesses/claude/ClaudeSessionParser.js";
10
10
 
11
11
  interface JsonlEntry {
12
12
  type: "user" | "assistant" | "system";
@@ -1,5 +1,5 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
- import { ClaudeCliProbe } from "../../providers/claude/durable/ClaudeCliProbe.js";
2
+ import { ClaudeCliProbe } from "../../../../harnesses/claude/durable/ClaudeCliProbe.js";
3
3
 
4
4
  describe("ClaudeCliProbe", () => {
5
5
  it("validates only version/help and requires the print session flags", async () => {
@@ -6,7 +6,7 @@ import {
6
6
  ClaudePrintAgentService,
7
7
  DurableAgentRepository,
8
8
  type ProcessInspector,
9
- } from "../../index.js";
9
+ } from "../../../../index.js";
10
10
 
11
11
  const roots: string[] = [];
12
12