@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,40 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { describe, expect, it } from "vitest";
5
+ import { MATCH_TOLERANCE_MS as reExported } from "../../utils/matching.js";
6
+ import { MATCH_TOLERANCE_MS } from "../../utils/matchingConstants.js";
7
+
8
+ const SRC_DIR = fileURLToPath(new URL("../../", import.meta.url));
9
+ const CONSTANTS_FILE = path.join(SRC_DIR, "utils", "matchingConstants.ts");
10
+ /** `3 * 60 * 1000`, `180000`, `180_000`, or `3 * 60_000` written in source. */
11
+ const TOLERANCE_LITERAL = /\b3\s*\*\s*60\s*\*\s*1_?000\b|\b180_?000\b|\b3\s*\*\s*60_?000\b/;
12
+
13
+ function listSourceFiles(dir: string): string[] {
14
+ const files: string[] = [];
15
+ for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
16
+ const full = path.join(dir, entry.name);
17
+ if (entry.isDirectory()) {
18
+ if (entry.name !== "__tests__") files.push(...listSourceFiles(full));
19
+ } else if (entry.name.endsWith(".ts")) {
20
+ files.push(full);
21
+ }
22
+ }
23
+ return files;
24
+ }
25
+
26
+ describe("MATCH_TOLERANCE_MS", () => {
27
+ it("is 3 minutes and re-exported unchanged from utils/matching", () => {
28
+ expect(MATCH_TOLERANCE_MS).toBe(3 * 60 * 1000);
29
+ expect(reExported).toBe(MATCH_TOLERANCE_MS);
30
+ });
31
+
32
+ it("is not duplicated as a literal elsewhere in agent-manager source", () => {
33
+ const offenders = listSourceFiles(SRC_DIR)
34
+ .filter((file) => file !== CONSTANTS_FILE)
35
+ .filter((file) => TOLERANCE_LITERAL.test(fs.readFileSync(file, "utf8")))
36
+ .map((file) => path.relative(SRC_DIR, file));
37
+
38
+ expect(offenders).toEqual([]);
39
+ });
40
+ });
@@ -4,6 +4,9 @@
4
4
 
5
5
  import type { MockedFunction } from "vitest";
6
6
 
7
+ import * as fs from "fs";
8
+ import * as os from "os";
9
+ import * as path from "path";
7
10
  import { execFile, execFileSync } from "child_process";
8
11
  import {
9
12
  listAgentProcesses,
@@ -13,8 +16,13 @@ import {
13
16
  findWrapperProcess,
14
17
  findWrapperProcessPids,
15
18
  captureProcessSnapshot,
19
+ createProcessSnapshotCapture,
16
20
  filterByProcessNames,
21
+ executableBasename,
22
+ executablePath,
23
+ type ProcessExec,
17
24
  } from "../../utils/process.js";
25
+ import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
18
26
 
19
27
  vi.mock("child_process", () => ({
20
28
  execFile: vi.fn(),
@@ -79,6 +87,167 @@ describe("captureProcessSnapshot", () => {
79
87
  });
80
88
  });
81
89
 
90
+ describe("createProcessSnapshotCapture", () => {
91
+ interface FakeProcess {
92
+ pid: number;
93
+ ppid?: number;
94
+ command: string;
95
+ cwd?: string;
96
+ lstart?: string;
97
+ }
98
+
99
+ function createFakeExec(initial: FakeProcess[]) {
100
+ let table = initial;
101
+ const calls: Array<{ file: string; args: readonly string[] }> = [];
102
+ const pidsArg = (args: readonly string[]) =>
103
+ args[args.indexOf("-p") + 1].split(",").map((pid) => parseInt(pid, 10));
104
+ const exec: ProcessExec = async (file, args) => {
105
+ calls.push({ file, args });
106
+ if (file === "ps" && args.includes("-axo")) {
107
+ return table.map((p) => `${p.pid} ${p.ppid ?? 1} s001 ${p.command}`).join("\n");
108
+ }
109
+ const requested = new Set(pidsArg(args));
110
+ const rows = table.filter((p) => requested.has(p.pid));
111
+ if (file === "lsof") {
112
+ return rows.map((p) => `p${p.pid}\nn${p.cwd ?? "/"}`).join("\n");
113
+ }
114
+ if (file === "ps" && args.some((arg) => arg.includes("lstart="))) {
115
+ return rows.map((p) => `${p.pid} ${p.lstart ?? "Wed Mar 18 23:18:01 2026"}`).join("\n");
116
+ }
117
+ throw new Error(`unexpected command: ${file} ${args.join(" ")}`);
118
+ };
119
+ return {
120
+ exec,
121
+ calls,
122
+ setTable: (next: FakeProcess[]) => {
123
+ table = next;
124
+ },
125
+ enrichedPids: (file: "lsof" | "lstart") =>
126
+ calls
127
+ .filter((call) =>
128
+ file === "lsof"
129
+ ? call.file === "lsof"
130
+ : call.args.some((arg) => arg.includes("lstart=")),
131
+ )
132
+ .map((call) => pidsArg(call.args)),
133
+ };
134
+ }
135
+
136
+ const isGemini = (process: ProcessInfo) => /gemini/.test(process.command);
137
+
138
+ it("enriches only candidate PIDs but still returns every name-matched process", async () => {
139
+ const fake = createFakeExec([
140
+ { pid: 10, command: "node /opt/gemini.js", cwd: "/g" },
141
+ { pid: 11, command: "node /opt/vite.js", cwd: "/v" },
142
+ { pid: 12, command: "/usr/bin/unrelated" },
143
+ ]);
144
+ const capture = createProcessSnapshotCapture({ exec: fake.exec });
145
+
146
+ const snapshot = await capture(["node"], { isCandidate: isGemini });
147
+
148
+ expect(snapshot.map((process) => process.pid)).toEqual([10, 11]);
149
+ expect(snapshot[0]).toMatchObject({ cwd: "/g", startTime: expect.any(Date) });
150
+ expect(snapshot[1].cwd).toBe("");
151
+ expect(snapshot[1].startTime).toBeUndefined();
152
+ expect(fake.enrichedPids("lsof")).toEqual([[10]]);
153
+ expect(fake.enrichedPids("lstart")).toEqual([[10]]);
154
+ });
155
+
156
+ it("enriches every name-matched process when no candidate predicate is given", async () => {
157
+ const fake = createFakeExec([
158
+ { pid: 10, command: "node /opt/gemini.js" },
159
+ { pid: 11, command: "node /opt/vite.js" },
160
+ ]);
161
+ const capture = createProcessSnapshotCapture({ exec: fake.exec });
162
+
163
+ await capture(["node"]);
164
+
165
+ expect(fake.enrichedPids("lsof")).toEqual([[10, 11]]);
166
+ expect(fake.enrichedPids("lstart")).toEqual([[10, 11]]);
167
+ });
168
+
169
+ it("spawns only the base ps when no process is a candidate", async () => {
170
+ const fake = createFakeExec([
171
+ { pid: 11, command: "node /opt/vite.js" },
172
+ { pid: 12, command: "node /opt/eslint-server.js" },
173
+ ]);
174
+ const capture = createProcessSnapshotCapture({ exec: fake.exec });
175
+
176
+ const snapshot = await capture(["node"], { isCandidate: isGemini });
177
+
178
+ expect(snapshot.map((process) => process.pid)).toEqual([11, 12]);
179
+ expect(fake.calls).toHaveLength(1);
180
+ expect(fake.calls[0].args).toContain("-axo");
181
+ });
182
+
183
+ it("fetches start times once per live PID across refreshes, but cwd every refresh", async () => {
184
+ const fake = createFakeExec([
185
+ { pid: 10, command: "node /opt/gemini.js", lstart: "Wed Mar 18 23:18:01 2026" },
186
+ ]);
187
+ const capture = createProcessSnapshotCapture({ exec: fake.exec });
188
+
189
+ const first = await capture(["node"], { isCandidate: isGemini });
190
+ fake.setTable([
191
+ { pid: 10, command: "node /opt/gemini.js", lstart: "Wed Mar 18 23:18:01 2026" },
192
+ { pid: 20, command: "node /opt/gemini.js", lstart: "Thu Mar 19 10:00:00 2026" },
193
+ ]);
194
+ const second = await capture(["node"], { isCandidate: isGemini });
195
+ const third = await capture(["node"], { isCandidate: isGemini });
196
+
197
+ expect(fake.enrichedPids("lstart")).toEqual([[10], [20]]);
198
+ expect(fake.enrichedPids("lsof")).toEqual([[10], [10, 20], [10, 20]]);
199
+ expect(second[0].startTime).toEqual(first[0].startTime);
200
+ expect(third.map((process) => process.startTime)).toEqual([
201
+ new Date("Wed Mar 18 23:18:01 2026"),
202
+ new Date("Thu Mar 19 10:00:00 2026"),
203
+ ]);
204
+ });
205
+
206
+ it("refetches the start time when a PID is reused by a different process", async () => {
207
+ const fake = createFakeExec([
208
+ { pid: 10, command: "node /opt/gemini.js", lstart: "Wed Mar 18 23:18:01 2026" },
209
+ ]);
210
+ const capture = createProcessSnapshotCapture({ exec: fake.exec });
211
+
212
+ await capture(["node"], { isCandidate: isGemini });
213
+ fake.setTable([
214
+ { pid: 10, command: "node /opt/gemini.js --resume", lstart: "Fri Mar 20 08:00:00 2026" },
215
+ ]);
216
+ const reused = await capture(["node"], { isCandidate: isGemini });
217
+
218
+ expect(fake.enrichedPids("lstart")).toEqual([[10], [10]]);
219
+ expect(reused[0].startTime).toEqual(new Date("Fri Mar 20 08:00:00 2026"));
220
+ });
221
+
222
+ it("forgets cached start times once the PID disappears", async () => {
223
+ const fake = createFakeExec([
224
+ { pid: 10, command: "node /opt/gemini.js", lstart: "Wed Mar 18 23:18:01 2026" },
225
+ ]);
226
+ const capture = createProcessSnapshotCapture({ exec: fake.exec });
227
+
228
+ await capture(["node"], { isCandidate: isGemini });
229
+ fake.setTable([]);
230
+ await capture(["node"], { isCandidate: isGemini });
231
+ fake.setTable([
232
+ { pid: 10, command: "node /opt/gemini.js", lstart: "Fri Mar 20 08:00:00 2026" },
233
+ ]);
234
+ const restarted = await capture(["node"], { isCandidate: isGemini });
235
+
236
+ expect(fake.enrichedPids("lstart")).toEqual([[10], [10]]);
237
+ expect(restarted[0].startTime).toEqual(new Date("Fri Mar 20 08:00:00 2026"));
238
+ });
239
+
240
+ it("retries start times that could not be read", async () => {
241
+ const fake = createFakeExec([{ pid: 10, command: "node /opt/gemini.js", lstart: "garbage" }]);
242
+ const capture = createProcessSnapshotCapture({ exec: fake.exec });
243
+
244
+ await capture(["node"], { isCandidate: isGemini });
245
+ await capture(["node"], { isCandidate: isGemini });
246
+
247
+ expect(fake.enrichedPids("lstart")).toEqual([[10], [10]]);
248
+ });
249
+ });
250
+
82
251
  describe("filterByProcessNames", () => {
83
252
  it("matches only argv[0] and normalizes Windows paths and executable suffixes", () => {
84
253
  const processes: ProcessInfo[] = [
@@ -92,6 +261,91 @@ describe("filterByProcessNames", () => {
92
261
  });
93
262
  });
94
263
 
264
+ describe("executables installed under paths containing spaces", () => {
265
+ let root: string;
266
+ let codexPath: string;
267
+ let nodePath: string;
268
+ let editorPath: string;
269
+
270
+ function install(relativePath: string): string {
271
+ const fullPath = path.join(root, relativePath);
272
+ fs.mkdirSync(path.dirname(fullPath), { recursive: true });
273
+ fs.writeFileSync(fullPath, "");
274
+ return fullPath;
275
+ }
276
+
277
+ beforeEach(() => {
278
+ mockedExecFileSync.mockReset();
279
+ root = fs.mkdtempSync(path.join(os.tmpdir(), "process-spaces-"));
280
+ codexPath = install("Applications/Some App.app/Contents/Resources/codex");
281
+ nodePath = install("Applications/Dev Tools/node/bin/node");
282
+ editorPath = install("usr/bin/vim");
283
+ });
284
+
285
+ afterEach(() => {
286
+ fs.rmSync(root, { recursive: true, force: true });
287
+ });
288
+
289
+ it("recovers argv[0] when its directory contains spaces", () => {
290
+ expect(executableBasename(`${codexPath} exec --cd /repo`)).toBe("codex");
291
+ expect(executablePath(`${codexPath} exec --cd /repo`)).toBe(codexPath);
292
+ expect(executableBasename(`${nodePath} /Users/me/.npm/bin/gemini --yolo`)).toBe("node");
293
+ });
294
+
295
+ it("does not treat arguments containing spaces as part of the executable path", () => {
296
+ expect(executableBasename(`${editorPath} My Notes/claude`)).toBe("vim");
297
+ expect(executableBasename(`${codexPath} exec fix the Other Dir/claude bug`)).toBe("codex");
298
+ expect(executableBasename("/usr/local/bin/node --title my agent/claude")).toBe("node");
299
+ });
300
+
301
+ it("keeps the first-token behaviour for commands without spaces in the path", () => {
302
+ expect(executableBasename("claude")).toBe("claude");
303
+ expect(executableBasename("/usr/local/bin/CLAUDE --continue")).toBe("claude");
304
+ expect(executableBasename("C:\\tools\\node.exe C:\\bin\\pi.js")).toBe("node.exe");
305
+ expect(executableBasename(" ")).toBe("");
306
+ });
307
+
308
+ it("matches spaced executables by name in filterByProcessNames", () => {
309
+ const processes: ProcessInfo[] = [
310
+ { pid: 1, command: `${codexPath} resume --last`, cwd: "", tty: "" },
311
+ { pid: 2, command: `${nodePath} /opt/gemini.js`, cwd: "", tty: "" },
312
+ { pid: 3, command: `${editorPath} Some App.app/Contents/Resources/codex`, cwd: "", tty: "" },
313
+ { pid: 4, command: `${codexPath} exec review My Folder/claude`, cwd: "", tty: "" },
314
+ ];
315
+
316
+ expect(filterByProcessNames(processes, ["codex"])).toEqual([processes[0], processes[3]]);
317
+ expect(filterByProcessNames(processes, ["node"])).toEqual([processes[1]]);
318
+ expect(filterByProcessNames(processes, ["claude"])).toEqual([]);
319
+ });
320
+
321
+ it("captures spaced executables with a single base ps call", async () => {
322
+ const calls: Array<{ file: string; args: readonly string[] }> = [];
323
+ const exec: ProcessExec = async (file, args) => {
324
+ calls.push({ file, args });
325
+ if (file === "ps" && args.includes("-axo")) {
326
+ return [
327
+ `100 1 s001 ${codexPath} --sandbox workspace-write`,
328
+ `200 1 s002 ${editorPath} Some App.app/Contents/Resources/codex`,
329
+ ].join("\n");
330
+ }
331
+ return "";
332
+ };
333
+ const capture = createProcessSnapshotCapture({ exec });
334
+
335
+ const snapshot = await capture(["codex"]);
336
+
337
+ expect(snapshot.map((process) => process.pid)).toEqual([100]);
338
+ expect(snapshot[0].command).toBe(`${codexPath} --sandbox workspace-write`);
339
+ expect(calls.filter((call) => call.args.includes("-axo"))).toHaveLength(1);
340
+ });
341
+
342
+ it("lists spaced executables in listAgentProcesses", () => {
343
+ mockedExecFileSync.mockReturnValue(`100 1 s001 ${codexPath} exec --json\n`);
344
+
345
+ expect(listAgentProcesses("codex").map((process) => process.pid)).toEqual([100]);
346
+ });
347
+ });
348
+
95
349
  describe("listAgentProcesses", () => {
96
350
  beforeEach(() => {
97
351
  mockedExecFileSync.mockReset();
@@ -5,20 +5,23 @@
5
5
  * Each adapter is responsible for detecting agents of a specific type (e.g., claude).
6
6
  */
7
7
 
8
+ /** Every built-in harness type, in the order the CLI lists them. */
9
+ export const AGENT_TYPES = [
10
+ "claude",
11
+ "codex",
12
+ "gemini_cli",
13
+ "grok_cli",
14
+ "kiro",
15
+ "antigravity_cli",
16
+ "opencode",
17
+ "copilot",
18
+ "pi",
19
+ ] as const;
20
+
8
21
  /**
9
22
  * Type of AI agent
10
23
  */
11
- export type AgentType =
12
- | "claude"
13
- | "gemini_cli"
14
- | "grok_cli"
15
- | "kiro"
16
- | "antigravity_cli"
17
- | "codex"
18
- | "opencode"
19
- | "copilot"
20
- | "pi"
21
- | "other";
24
+ export type AgentType = (typeof AGENT_TYPES)[number] | "other";
22
25
 
23
26
  /**
24
27
  * Current status of an agent
@@ -97,6 +100,25 @@ export interface ConversationMessage {
97
100
  timestamp?: string;
98
101
  }
99
102
 
103
+ /**
104
+ * Options for {@link AgentAdapter.getConversation}.
105
+ */
106
+ export interface ConversationOptions {
107
+ /** Include tool call/result details */
108
+ verbose?: boolean;
109
+ /**
110
+ * Return only the last `tail` messages (after verbose filtering). When
111
+ * omitted or not a positive integer, the full conversation is returned.
112
+ *
113
+ * JSONL-backed adapters read backward from the end of the file and, on
114
+ * later calls, parse only appended bytes, so cost is proportional to the
115
+ * tail rather than the transcript size. Adapters backed by a single JSON
116
+ * document (Gemini) or a database (OpenCode) still read the whole source
117
+ * and slice; callers should keep an mtime cache for those.
118
+ */
119
+ tail?: number;
120
+ }
121
+
100
122
  /**
101
123
  * A historical session discovered on disk (running or not).
102
124
  *
@@ -192,12 +214,13 @@ export interface AgentAdapter {
192
214
  canHandle(processInfo: ProcessInfo): boolean;
193
215
 
194
216
  /**
195
- * Read the full conversation from a session file
217
+ * Read the conversation from a session file
196
218
  * @param sessionFilePath Path to the session JSONL file
197
219
  * @param options.verbose Include tool call/result details
220
+ * @param options.tail Return only the last N messages (see {@link ConversationOptions.tail})
198
221
  * @returns Array of conversation messages
199
222
  */
200
- getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[];
223
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
201
224
 
202
225
  /**
203
226
  * Enumerate historical sessions for this tool from disk.
@@ -214,7 +237,7 @@ export interface AgentAdapter {
214
237
  /**
215
238
  * Resolve exact historical session matches without enumerating every summary.
216
239
  *
217
- * Built-in adapters implement this using their provider-native storage shape.
240
+ * Built-in adapters implement this using their harness-native storage shape.
218
241
  * The method remains optional so external adapters can fall back to
219
242
  * {@link listSessions} until they adopt direct lookup.
220
243
  */
@@ -109,12 +109,6 @@ export async function resolveOpenAiCredential(
109
109
  throw new Error(MISSING_API_KEY_MESSAGE);
110
110
  }
111
111
 
112
- export async function resolveOpenAiApiKey(options: OpenAiCredentialOptions = {}): Promise<string> {
113
- const credential = await resolveOpenAiCredential(options);
114
- if (credential.kind === "platform") return credential.key;
115
- throw new Error(MISSING_API_KEY_MESSAGE);
116
- }
117
-
118
112
  function bucketTokens(value: unknown): number {
119
113
  const results = Array.isArray(value) ? value : [];
120
114
  return results.reduce(
@@ -0,0 +1,34 @@
1
+ import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { generateAgentName } from "../../utils/matching.js";
3
+ import { processOnlyAgent } from "../shared.js";
4
+ import { AntigravitySessionParser, type AntigravitySession } from "./AntigravitySessionParser.js";
5
+
6
+ export interface AntigravitySessionAgentInput {
7
+ session: AntigravitySession;
8
+ processInfo: ProcessInfo;
9
+ }
10
+
11
+ export class AntigravityAgentMapper {
12
+ constructor(private readonly parser: AntigravitySessionParser = new AntigravitySessionParser()) {}
13
+
14
+ mapSessionToAgent({ session, processInfo }: AntigravitySessionAgentInput): AgentInfo {
15
+ return {
16
+ name: generateAgentName(session.projectPath, processInfo.pid),
17
+ type: "antigravity_cli",
18
+ status: this.parser.determineStatus(session),
19
+ summary: session.lastUserMessage || "Antigravity CLI session active",
20
+ pid: processInfo.pid,
21
+ projectPath: session.projectPath,
22
+ sessionId: session.sessionId,
23
+ lastActive: session.lastActive,
24
+ sessionFilePath: session.sessionFilePath,
25
+ };
26
+ }
27
+
28
+ mapProcessOnlyAgent(processInfo: ProcessInfo, cwd: string): AgentInfo {
29
+ return processOnlyAgent("antigravity_cli", processInfo, {
30
+ summary: "Antigravity CLI process running",
31
+ cwd,
32
+ });
33
+ }
34
+ }
@@ -0,0 +1,126 @@
1
+ import type {
2
+ AgentAdapter,
3
+ AgentDetectionContext,
4
+ AgentInfo,
5
+ ProcessInfo,
6
+ ConversationMessage,
7
+ ConversationOptions,
8
+ SessionSummary,
9
+ ListSessionsOptions,
10
+ } from "../../adapters/AgentAdapter.js";
11
+ import { findHarnessProcesses, matchesExecutable } from "../shared.js";
12
+ import { AntigravityAgentMapper } from "./AntigravityAgentMapper.js";
13
+ import { AntigravitySessionLocator } from "./AntigravitySessionLocator.js";
14
+ import { AntigravitySessionParser, type AntigravitySession } from "./AntigravitySessionParser.js";
15
+
16
+ /**
17
+ * Antigravity CLI Adapter
18
+ *
19
+ * Detects running Antigravity CLI agents (Google's `agy` native binary) by:
20
+ * 1. Filtering `agy` processes from the shared process snapshot.
21
+ * 2. Resolving each process to its conversation via
22
+ * ~/.gemini/antigravity-cli/cache/last_conversations.json, a
23
+ * `{ <cwd>: <conversationId> }` map keyed by the process cwd.
24
+ * 3. Reading brain/<conversationId>/.system_generated/logs/transcript.jsonl;
25
+ * the last user request is the summary.
26
+ *
27
+ * This is the runtime side of Antigravity, independent of the `antigravity`
28
+ * environment that configures the Antigravity IDE.
29
+ */
30
+ export class AntigravityCliAdapter implements AgentAdapter {
31
+ readonly type = "antigravity_cli" as const;
32
+ readonly processNames = ["agy"] as const;
33
+
34
+ private parser: AntigravitySessionParser;
35
+ private mapper: AntigravityAgentMapper;
36
+ private locator: AntigravitySessionLocator;
37
+
38
+ constructor() {
39
+ this.parser = new AntigravitySessionParser();
40
+ this.mapper = new AntigravityAgentMapper(this.parser);
41
+ this.locator = new AntigravitySessionLocator();
42
+ }
43
+
44
+ canHandle(processInfo: ProcessInfo): boolean {
45
+ return matchesExecutable(processInfo.command, "agy");
46
+ }
47
+
48
+ async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
49
+ try {
50
+ return await this.detectRunningAgents(context);
51
+ } finally {
52
+ // Drop cached summaries for sessions that were not part of this refresh
53
+ this.parser.pruneSessionCache();
54
+ }
55
+ }
56
+
57
+ private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
58
+ const { processes } = await findHarnessProcesses(this, context);
59
+ if (processes.length === 0) {
60
+ return [];
61
+ }
62
+
63
+ const agents: AgentInfo[] = [];
64
+ for (const { process: proc, cwd, conversation } of this.locator.matchRunningProcesses(
65
+ processes,
66
+ )) {
67
+ const session = conversation
68
+ ? this.parser.readSessionIncremental(
69
+ conversation.conversationId,
70
+ conversation.transcriptPath,
71
+ cwd,
72
+ )
73
+ : null;
74
+ if (session) {
75
+ agents.push(this.mapper.mapSessionToAgent({ session, processInfo: proc }));
76
+ } else {
77
+ agents.push(this.mapper.mapProcessOnlyAgent(proc, cwd));
78
+ }
79
+ }
80
+ return agents;
81
+ }
82
+
83
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {
84
+ return this.parser.getConversation(sessionFilePath, options);
85
+ }
86
+
87
+ async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {
88
+ const filterCwd = opts?.cwd;
89
+ const summaries: SessionSummary[] = [];
90
+
91
+ for (const { cwd, conversationId, transcriptPath } of this.locator.listConversations()) {
92
+ if (filterCwd !== undefined && cwd !== filterCwd) continue;
93
+
94
+ const session = this.parser.readSession(conversationId, transcriptPath, cwd);
95
+ if (!session) continue;
96
+
97
+ summaries.push(this.toSessionSummary(session));
98
+ }
99
+
100
+ return summaries;
101
+ }
102
+
103
+ /** Only registered conversations are listed, so look the id up in the registry. */
104
+ async findSessionsById(sessionId: string): Promise<SessionSummary[]> {
105
+ const summaries: SessionSummary[] = [];
106
+ for (const { cwd, conversationId, transcriptPath } of this.locator.listConversations()) {
107
+ if (conversationId !== sessionId) continue;
108
+
109
+ const session = this.parser.readSession(conversationId, transcriptPath, cwd);
110
+ if (session) summaries.push(this.toSessionSummary(session));
111
+ }
112
+ return summaries;
113
+ }
114
+
115
+ private toSessionSummary(session: AntigravitySession): SessionSummary {
116
+ return {
117
+ type: this.type,
118
+ sessionId: session.sessionId,
119
+ cwd: session.projectPath,
120
+ firstUserMessage: session.firstUserMessage || "",
121
+ lastActive: session.lastActive,
122
+ startedAt: session.sessionStart,
123
+ sessionFilePath: session.sessionFilePath,
124
+ };
125
+ }
126
+ }
@@ -0,0 +1,75 @@
1
+ import * as path from "path";
2
+ import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
3
+ import { safeReadFile } from "../../utils/session.js";
4
+ import { homeDir } from "../shared.js";
5
+
6
+ const REGISTRY_FILE = path.join("cache", "last_conversations.json");
7
+ const BRAIN_DIR = "brain";
8
+ const TRANSCRIPT_REL = path.join(".system_generated", "logs", "transcript.jsonl");
9
+
10
+ /** A workspace cwd and the conversation the CLI last used there. */
11
+ export interface AntigravityConversationRef {
12
+ cwd: string;
13
+ conversationId: string;
14
+ transcriptPath: string;
15
+ }
16
+
17
+ /** A live `agy` process paired with its cwd and (if registered) conversation. */
18
+ export interface AntigravityProcessMatch {
19
+ process: ProcessInfo;
20
+ cwd: string;
21
+ conversation: AntigravityConversationRef | null;
22
+ }
23
+
24
+ export interface AntigravitySessionLocatorOptions {
25
+ /** Overrides the base dir (defaults to ANTIGRAVITY_CLI_HOME or ~/.gemini/antigravity-cli). */
26
+ baseDir?: string;
27
+ }
28
+
29
+ export class AntigravitySessionLocator {
30
+ private readonly baseDir: string;
31
+
32
+ constructor(options: AntigravitySessionLocatorOptions = {}) {
33
+ this.baseDir =
34
+ options.baseDir ??
35
+ (process.env.ANTIGRAVITY_CLI_HOME || path.join(homeDir(), ".gemini", "antigravity-cli"));
36
+ }
37
+
38
+ /** Pair live processes with their conversation, joined on the process cwd. */
39
+ matchRunningProcesses(processes: ProcessInfo[]): AntigravityProcessMatch[] {
40
+ const byCwd = new Map(this.listConversations().map((ref) => [ref.cwd, ref]));
41
+ return processes.map((proc) => {
42
+ const cwd = proc.cwd || "";
43
+ return { process: proc, cwd, conversation: byCwd.get(cwd) ?? null };
44
+ });
45
+ }
46
+
47
+ /**
48
+ * Read cache/last_conversations.json, a `{ <cwd>: <conversationId> }` map the
49
+ * CLI rewrites as the current conversation per workspace changes.
50
+ */
51
+ listConversations(): AntigravityConversationRef[] {
52
+ const content = safeReadFile(path.join(this.baseDir, REGISTRY_FILE));
53
+ if (content === undefined) return [];
54
+
55
+ let parsed: unknown;
56
+ try {
57
+ parsed = JSON.parse(content);
58
+ } catch {
59
+ return [];
60
+ }
61
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return [];
62
+
63
+ const refs: AntigravityConversationRef[] = [];
64
+ for (const [cwd, conversationId] of Object.entries(parsed as Record<string, unknown>)) {
65
+ if (cwd && typeof conversationId === "string" && conversationId) {
66
+ refs.push({ cwd, conversationId, transcriptPath: this.transcriptPath(conversationId) });
67
+ }
68
+ }
69
+ return refs;
70
+ }
71
+
72
+ private transcriptPath(conversationId: string): string {
73
+ return path.join(this.baseDir, BRAIN_DIR, conversationId, TRANSCRIPT_REL);
74
+ }
75
+ }