@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,486 @@
1
+ /**
2
+ * Refresh-path I/O tests for the Claude, Codex, Kiro and Antigravity adapters:
3
+ * repeated `listAgents()` calls must only read transcript bytes that changed.
4
+ */ import * as fs from "fs";
5
+ import * as os from "os";
6
+ import * as path from "path";
7
+ import { AgentManager } from "../../AgentManager.js";
8
+ import { ClaudeCodeAdapter } from "../../harnesses/claude/ClaudeCodeAdapter.js";
9
+ import { CodexAdapter } from "../../harnesses/codex/CodexAdapter.js";
10
+ import { AntigravityCliAdapter } from "../../harnesses/antigravity/AntigravityCliAdapter.js";
11
+ import { KiroAdapter } from "../../harnesses/kiro/KiroAdapter.js";
12
+ import { AgentRegistry } from "../../utils/AgentRegistry.js";
13
+ vi.mock("fs", async (importOriginal)=>{
14
+ const actual = await importOriginal();
15
+ return {
16
+ ...actual,
17
+ openSync: vi.fn(actual.openSync),
18
+ readSync: vi.fn(actual.readSync),
19
+ readFileSync: vi.fn(actual.readFileSync)
20
+ };
21
+ });
22
+ const mockedOpenSync = vi.mocked(fs.openSync);
23
+ const mockedReadSync = vi.mocked(fs.readSync);
24
+ const mockedReadFileSync = vi.mocked(fs.readFileSync);
25
+ /** Bytes read from `filePath` via readFileSync or fd reads since the last `resetReads()`. */ function bytesReadFrom(filePath) {
26
+ // fds are reused after close, so attribute each read to the latest open of that fd
27
+ const opens = mockedOpenSync.mock.calls.map((call, index)=>({
28
+ path: String(call[0]),
29
+ fd: mockedOpenSync.mock.results[index]?.value,
30
+ order: mockedOpenSync.mock.invocationCallOrder[index]
31
+ }));
32
+ let total = 0;
33
+ mockedReadSync.mock.calls.forEach((call, index)=>{
34
+ const result = mockedReadSync.mock.results[index];
35
+ const order = mockedReadSync.mock.invocationCallOrder[index];
36
+ const open = opens.filter((o)=>o.fd === call[0] && o.order < order).at(-1);
37
+ if (result?.type === "return" && open?.path === filePath) {
38
+ total += result.value;
39
+ }
40
+ });
41
+ mockedReadFileSync.mock.calls.forEach((call, index)=>{
42
+ const result = mockedReadFileSync.mock.results[index];
43
+ if (result?.type === "return" && String(call[0]) === filePath) {
44
+ total += Buffer.byteLength(result.value);
45
+ }
46
+ });
47
+ return total;
48
+ }
49
+ function resetReads() {
50
+ mockedOpenSync.mockClear();
51
+ mockedReadSync.mockClear();
52
+ mockedReadFileSync.mockClear();
53
+ }
54
+ function jsonl(entries) {
55
+ return entries.map((entry)=>`${JSON.stringify(entry)}\n`).join("");
56
+ }
57
+ describe("incremental transcript reads across listAgents() refreshes", ()=>{
58
+ let originalHome;
59
+ let tmpHome;
60
+ let processes;
61
+ let manager;
62
+ let claudeFile;
63
+ let codexFile;
64
+ let claudeAdapter;
65
+ let codexAdapter;
66
+ const startTime = new Date();
67
+ const claudePid = 71001;
68
+ const codexPid = 72001;
69
+ beforeEach(()=>{
70
+ originalHome = process.env.HOME;
71
+ tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), "incremental-refresh-"));
72
+ process.env.HOME = tmpHome;
73
+ // Claude: authoritative PID-file match to a synthetic transcript
74
+ const claudeSessionId = "11111111-2222-3333-4444-555555555555";
75
+ const projectDir = path.join(tmpHome, ".claude", "projects", "-repo-claude");
76
+ const sessionsDir = path.join(tmpHome, ".claude", "sessions");
77
+ fs.mkdirSync(projectDir, {
78
+ recursive: true
79
+ });
80
+ fs.mkdirSync(sessionsDir, {
81
+ recursive: true
82
+ });
83
+ claudeFile = path.join(projectDir, `${claudeSessionId}.jsonl`);
84
+ fs.writeFileSync(claudeFile, jsonl([
85
+ {
86
+ type: "user",
87
+ timestamp: startTime.toISOString(),
88
+ cwd: "/repo/claude",
89
+ message: {
90
+ content: "first task"
91
+ }
92
+ },
93
+ {
94
+ type: "assistant",
95
+ timestamp: startTime.toISOString(),
96
+ message: {
97
+ content: "x".repeat(300_000)
98
+ }
99
+ }
100
+ ]));
101
+ fs.writeFileSync(path.join(sessionsDir, `${claudePid}.json`), JSON.stringify({
102
+ pid: claudePid,
103
+ sessionId: claudeSessionId,
104
+ cwd: "/repo/claude",
105
+ startedAt: startTime.getTime(),
106
+ kind: "interactive",
107
+ entrypoint: "cli"
108
+ }));
109
+ // Codex: hook session mapping (pid → transcript path)
110
+ const codexSessionId = "019eabed-0000-7000-8000-000000000001";
111
+ const codexDir = path.join(tmpHome, ".codex", "sessions", "2026", "09", "28");
112
+ fs.mkdirSync(codexDir, {
113
+ recursive: true
114
+ });
115
+ codexFile = path.join(codexDir, `rollout-2026-09-28T00-00-00-${codexSessionId}.jsonl`);
116
+ fs.writeFileSync(codexFile, jsonl([
117
+ {
118
+ type: "session_meta",
119
+ payload: {
120
+ id: codexSessionId,
121
+ cwd: "/repo/codex",
122
+ timestamp: startTime.toISOString()
123
+ }
124
+ },
125
+ {
126
+ type: "event_msg",
127
+ timestamp: startTime.toISOString(),
128
+ payload: {
129
+ type: "user_message",
130
+ message: "y".repeat(300_000)
131
+ }
132
+ }
133
+ ]));
134
+ fs.mkdirSync(path.join(tmpHome, ".codex", "ai-devkit"), {
135
+ recursive: true
136
+ });
137
+ fs.writeFileSync(path.join(tmpHome, ".codex", "ai-devkit", "sessions.json"), JSON.stringify({
138
+ [codexPid]: codexFile
139
+ }));
140
+ processes = [
141
+ {
142
+ pid: claudePid,
143
+ command: "claude",
144
+ cwd: "/repo/claude",
145
+ tty: "ttys001",
146
+ startTime
147
+ },
148
+ {
149
+ pid: codexPid,
150
+ command: "codex",
151
+ cwd: "/repo/codex",
152
+ tty: "ttys002",
153
+ startTime
154
+ }
155
+ ];
156
+ const registry = new AgentRegistry(path.join(tmpHome, "agents.json"));
157
+ manager = new AgentManager(registry, async ()=>processes);
158
+ claudeAdapter = new ClaudeCodeAdapter();
159
+ codexAdapter = new CodexAdapter(registry);
160
+ manager.registerAdapter(claudeAdapter);
161
+ manager.registerAdapter(codexAdapter);
162
+ resetReads();
163
+ });
164
+ afterEach(()=>{
165
+ process.env.HOME = originalHome;
166
+ fs.rmSync(tmpHome, {
167
+ recursive: true,
168
+ force: true
169
+ });
170
+ });
171
+ function summaryOf(agents, pid) {
172
+ const agent = agents.find((candidate)=>candidate.pid === pid);
173
+ return {
174
+ sessionId: agent?.sessionId,
175
+ status: agent?.status,
176
+ summary: agent?.summary
177
+ };
178
+ }
179
+ it("reads 0 transcript bytes on a second refresh when nothing changed", async ()=>{
180
+ const first = await manager.listAgents();
181
+ expect(bytesReadFrom(claudeFile)).toBe(fs.statSync(claudeFile).size);
182
+ expect(bytesReadFrom(codexFile)).toBe(fs.statSync(codexFile).size);
183
+ resetReads();
184
+ const second = await manager.listAgents();
185
+ expect(bytesReadFrom(claudeFile)).toBe(0);
186
+ expect(bytesReadFrom(codexFile)).toBe(0);
187
+ expect(summaryOf(second, claudePid)).toEqual(summaryOf(first, claudePid));
188
+ expect(summaryOf(second, codexPid)).toEqual(summaryOf(first, codexPid));
189
+ });
190
+ it("reads at most the appended bytes plus 64 KiB after an append", async ()=>{
191
+ await manager.listAgents();
192
+ const claudeAppend = jsonl([
193
+ {
194
+ type: "user",
195
+ timestamp: new Date().toISOString(),
196
+ message: {
197
+ content: "follow-up task"
198
+ }
199
+ }
200
+ ]);
201
+ const codexAppend = jsonl([
202
+ {
203
+ type: "event_msg",
204
+ timestamp: new Date().toISOString(),
205
+ payload: {
206
+ type: "agent_message",
207
+ message: "done"
208
+ }
209
+ }
210
+ ]);
211
+ fs.appendFileSync(claudeFile, claudeAppend);
212
+ fs.appendFileSync(codexFile, codexAppend);
213
+ resetReads();
214
+ const agents = await manager.listAgents();
215
+ expect(bytesReadFrom(claudeFile)).toBeGreaterThan(0);
216
+ expect(bytesReadFrom(codexFile)).toBeGreaterThan(0);
217
+ expect(bytesReadFrom(claudeFile)).toBeLessThanOrEqual(Buffer.byteLength(claudeAppend) + 64 * 1024);
218
+ expect(bytesReadFrom(codexFile)).toBeLessThanOrEqual(Buffer.byteLength(codexAppend) + 64 * 1024);
219
+ expect(summaryOf(agents, claudePid).summary).toContain("follow-up task");
220
+ expect(summaryOf(agents, codexPid).summary).toContain("done");
221
+ });
222
+ it("reads at most 5 MiB (+1 byte) of a large transcript on a cold refresh, then only appends", async ()=>{
223
+ // ~12 MiB of history between the first and the latest turn
224
+ const history = jsonl(Array.from({
225
+ length: 48
226
+ }, ()=>({
227
+ type: "assistant",
228
+ timestamp: startTime.toISOString(),
229
+ message: {
230
+ content: "h".repeat(256 * 1024)
231
+ }
232
+ })));
233
+ const latest = new Date(startTime.getTime() + 60_000).toISOString();
234
+ fs.appendFileSync(claudeFile, history + jsonl([
235
+ {
236
+ type: "user",
237
+ timestamp: latest,
238
+ message: {
239
+ content: "latest claude task"
240
+ }
241
+ }
242
+ ]));
243
+ fs.appendFileSync(codexFile, history + jsonl([
244
+ {
245
+ type: "event_msg",
246
+ timestamp: latest,
247
+ payload: {
248
+ type: "agent_message",
249
+ message: "ok"
250
+ }
251
+ }
252
+ ]));
253
+ resetReads();
254
+ const agents = await manager.listAgents();
255
+ // 1 MiB head + 4 MiB tail, plus the byte before the tail window that tells
256
+ // whether the window starts on a line boundary
257
+ const limit = 5 * 1024 * 1024 + 1;
258
+ expect(fs.statSync(claudeFile).size).toBeGreaterThan(2 * limit);
259
+ expect(bytesReadFrom(claudeFile)).toBeLessThanOrEqual(limit);
260
+ expect(bytesReadFrom(codexFile)).toBeLessThanOrEqual(limit);
261
+ expect(summaryOf(agents, claudePid)).toMatchObject({
262
+ sessionId: "11111111-2222-3333-4444-555555555555",
263
+ summary: expect.stringContaining("latest claude task")
264
+ });
265
+ expect(summaryOf(agents, codexPid).summary).toContain("ok");
266
+ const append = jsonl([
267
+ {
268
+ type: "user",
269
+ timestamp: latest,
270
+ message: {
271
+ content: "follow-up after cold start"
272
+ }
273
+ }
274
+ ]);
275
+ fs.appendFileSync(claudeFile, append);
276
+ resetReads();
277
+ const refreshed = await manager.listAgents();
278
+ expect(bytesReadFrom(claudeFile)).toBe(Buffer.byteLength(append));
279
+ expect(summaryOf(refreshed, claudePid).summary).toContain("follow-up after cold start");
280
+ });
281
+ it("evicts cache entries for transcripts absent from the latest refresh", async ()=>{
282
+ await manager.listAgents();
283
+ expect(claudeAdapter.parser.sessionCache.size).toBe(1);
284
+ expect(codexAdapter.parser.sessionCache.size).toBe(1);
285
+ processes = [];
286
+ await manager.listAgents();
287
+ expect(claudeAdapter.parser.sessionCache.size).toBe(0);
288
+ expect(codexAdapter.parser.sessionCache.size).toBe(0);
289
+ });
290
+ });
291
+ describe("incremental Kiro and Antigravity transcript reads across listAgents() refreshes", ()=>{
292
+ let originalHome;
293
+ let originalAgyHome;
294
+ let tmpHome;
295
+ let processes;
296
+ let manager;
297
+ let kiroFile;
298
+ let agyFile;
299
+ let kiroAdapter;
300
+ let agyAdapter;
301
+ const startTime = new Date();
302
+ const kiroPid = 74001;
303
+ const agyPid = 75001;
304
+ const kiroPrompt = (text, at = startTime)=>({
305
+ kind: "Prompt",
306
+ data: {
307
+ content: [
308
+ {
309
+ kind: "text",
310
+ data: text
311
+ }
312
+ ],
313
+ meta: {
314
+ timestamp: at.getTime()
315
+ }
316
+ }
317
+ });
318
+ const kiroReply = (text)=>({
319
+ kind: "AssistantMessage",
320
+ data: {
321
+ content: [
322
+ {
323
+ kind: "text",
324
+ data: text
325
+ }
326
+ ]
327
+ }
328
+ });
329
+ const agyRequest = (text, at = startTime)=>({
330
+ type: "USER_INPUT",
331
+ created_at: at.toISOString(),
332
+ content: `<USER_REQUEST>\n${text}\n</USER_REQUEST>`
333
+ });
334
+ const agyReply = (text, at = startTime)=>({
335
+ type: "PLANNER_RESPONSE",
336
+ created_at: at.toISOString(),
337
+ content: text
338
+ });
339
+ beforeEach(()=>{
340
+ originalHome = process.env.HOME;
341
+ originalAgyHome = process.env.ANTIGRAVITY_CLI_HOME;
342
+ tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), "incremental-refresh-kiro-agy-"));
343
+ process.env.HOME = tmpHome;
344
+ process.env.ANTIGRAVITY_CLI_HOME = path.join(tmpHome, "antigravity");
345
+ // Kiro: a session lock held by the running kiro-cli
346
+ const kiroDir = path.join(tmpHome, ".kiro", "sessions", "cli");
347
+ fs.mkdirSync(kiroDir, {
348
+ recursive: true
349
+ });
350
+ kiroFile = path.join(kiroDir, "kiro-session.jsonl");
351
+ fs.writeFileSync(kiroFile, jsonl([
352
+ kiroPrompt("first task"),
353
+ kiroReply("x".repeat(300_000))
354
+ ]));
355
+ fs.writeFileSync(path.join(kiroDir, "kiro-session.json"), JSON.stringify({
356
+ session_id: "kiro-session",
357
+ cwd: "/repo/kiro"
358
+ }));
359
+ fs.writeFileSync(path.join(kiroDir, "kiro-session.lock"), JSON.stringify({
360
+ pid: kiroPid
361
+ }));
362
+ // Antigravity: the conversation registry maps the process cwd to the transcript
363
+ const agyId = "10485e13-2742-4e9e-b286-ac0606f0cb1e";
364
+ const agyLogs = path.join(tmpHome, "antigravity", "brain", agyId, ".system_generated", "logs");
365
+ fs.mkdirSync(agyLogs, {
366
+ recursive: true
367
+ });
368
+ fs.mkdirSync(path.join(tmpHome, "antigravity", "cache"), {
369
+ recursive: true
370
+ });
371
+ agyFile = path.join(agyLogs, "transcript.jsonl");
372
+ fs.writeFileSync(agyFile, jsonl([
373
+ agyRequest("first task"),
374
+ agyReply("y".repeat(300_000))
375
+ ]));
376
+ fs.writeFileSync(path.join(tmpHome, "antigravity", "cache", "last_conversations.json"), JSON.stringify({
377
+ "/repo/agy": agyId
378
+ }));
379
+ processes = [
380
+ {
381
+ pid: kiroPid,
382
+ command: "kiro-cli",
383
+ cwd: "/repo/kiro",
384
+ tty: "ttys003",
385
+ startTime
386
+ },
387
+ {
388
+ pid: agyPid,
389
+ command: "agy",
390
+ cwd: "/repo/agy",
391
+ tty: "ttys004",
392
+ startTime
393
+ }
394
+ ];
395
+ manager = new AgentManager(new AgentRegistry(path.join(tmpHome, "agents.json")), async ()=>processes);
396
+ kiroAdapter = new KiroAdapter();
397
+ agyAdapter = new AntigravityCliAdapter();
398
+ manager.registerAdapter(kiroAdapter);
399
+ manager.registerAdapter(agyAdapter);
400
+ resetReads();
401
+ });
402
+ afterEach(()=>{
403
+ process.env.HOME = originalHome;
404
+ if (originalAgyHome === undefined) delete process.env.ANTIGRAVITY_CLI_HOME;
405
+ else process.env.ANTIGRAVITY_CLI_HOME = originalAgyHome;
406
+ fs.rmSync(tmpHome, {
407
+ recursive: true,
408
+ force: true
409
+ });
410
+ });
411
+ function summaryOf(agents, pid) {
412
+ const agent = agents.find((candidate)=>candidate.pid === pid);
413
+ return {
414
+ sessionId: agent?.sessionId,
415
+ status: agent?.status,
416
+ summary: agent?.summary
417
+ };
418
+ }
419
+ it("reads 0 transcript bytes on a second refresh when nothing changed", async ()=>{
420
+ const first = await manager.listAgents();
421
+ expect(bytesReadFrom(kiroFile)).toBe(fs.statSync(kiroFile).size);
422
+ expect(bytesReadFrom(agyFile)).toBe(fs.statSync(agyFile).size);
423
+ expect(summaryOf(first, kiroPid).summary).toBe("first task");
424
+ expect(summaryOf(first, agyPid).summary).toBe("first task");
425
+ resetReads();
426
+ const second = await manager.listAgents();
427
+ expect(bytesReadFrom(kiroFile)).toBe(0);
428
+ expect(bytesReadFrom(agyFile)).toBe(0);
429
+ expect(summaryOf(second, kiroPid)).toEqual(summaryOf(first, kiroPid));
430
+ expect(summaryOf(second, agyPid)).toEqual(summaryOf(first, agyPid));
431
+ });
432
+ it("reads at most the appended bytes plus 64 KiB after an append", async ()=>{
433
+ await manager.listAgents();
434
+ const kiroAppend = jsonl([
435
+ kiroPrompt("follow-up task")
436
+ ]);
437
+ const agyAppend = jsonl([
438
+ agyRequest("follow-up task")
439
+ ]);
440
+ fs.appendFileSync(kiroFile, kiroAppend);
441
+ fs.appendFileSync(agyFile, agyAppend);
442
+ resetReads();
443
+ const agents = await manager.listAgents();
444
+ expect(bytesReadFrom(kiroFile)).toBeGreaterThan(0);
445
+ expect(bytesReadFrom(agyFile)).toBeGreaterThan(0);
446
+ expect(bytesReadFrom(kiroFile)).toBeLessThanOrEqual(Buffer.byteLength(kiroAppend) + 64 * 1024);
447
+ expect(bytesReadFrom(agyFile)).toBeLessThanOrEqual(Buffer.byteLength(agyAppend) + 64 * 1024);
448
+ expect(summaryOf(agents, kiroPid).summary).toBe("follow-up task");
449
+ expect(summaryOf(agents, agyPid).summary).toBe("follow-up task");
450
+ });
451
+ it("reads at most 5 MiB (+1 byte) of a large transcript on a cold refresh", async ()=>{
452
+ const latest = new Date(startTime.getTime() + 60_000);
453
+ const kiroHistory = jsonl(Array.from({
454
+ length: 48
455
+ }, ()=>kiroReply("h".repeat(256 * 1024))));
456
+ const agyHistory = jsonl(Array.from({
457
+ length: 48
458
+ }, ()=>agyReply("h".repeat(256 * 1024))));
459
+ fs.appendFileSync(kiroFile, kiroHistory + jsonl([
460
+ kiroPrompt("latest kiro task", latest)
461
+ ]));
462
+ fs.appendFileSync(agyFile, agyHistory + jsonl([
463
+ agyRequest("latest agy task", latest)
464
+ ]));
465
+ resetReads();
466
+ const agents = await manager.listAgents();
467
+ // 1 MiB head + 4 MiB tail, plus the byte before the tail window
468
+ const limit = 5 * 1024 * 1024 + 1;
469
+ expect(fs.statSync(kiroFile).size).toBeGreaterThan(2 * limit);
470
+ expect(bytesReadFrom(kiroFile)).toBeLessThanOrEqual(limit);
471
+ expect(bytesReadFrom(agyFile)).toBeLessThanOrEqual(limit);
472
+ expect(summaryOf(agents, kiroPid).summary).toBe("latest kiro task");
473
+ expect(summaryOf(agents, agyPid).summary).toBe("latest agy task");
474
+ });
475
+ it("evicts cache entries for transcripts absent from the latest refresh", async ()=>{
476
+ await manager.listAgents();
477
+ expect(kiroAdapter.parser.sessionCache.size).toBe(1);
478
+ expect(agyAdapter.parser.sessionCache.size).toBe(1);
479
+ processes = [];
480
+ await manager.listAgents();
481
+ expect(kiroAdapter.parser.sessionCache.size).toBe(0);
482
+ expect(agyAdapter.parser.sessionCache.size).toBe(0);
483
+ });
484
+ });
485
+
486
+ //# sourceMappingURL=IncrementalSessionRefresh.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/__tests__/adapters/IncrementalSessionRefresh.test.ts"],"sourcesContent":["/**\n * Refresh-path I/O tests for the Claude, Codex, Kiro and Antigravity adapters:\n * repeated `listAgents()` calls must only read transcript bytes that changed.\n */\n\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { AgentManager } from \"../../AgentManager.js\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { ClaudeCodeAdapter } from \"../../harnesses/claude/ClaudeCodeAdapter.js\";\nimport { CodexAdapter } from \"../../harnesses/codex/CodexAdapter.js\";\nimport { AntigravityCliAdapter } from \"../../harnesses/antigravity/AntigravityCliAdapter.js\";\nimport { KiroAdapter } from \"../../harnesses/kiro/KiroAdapter.js\";\nimport { AgentRegistry } from \"../../utils/AgentRegistry.js\";\n\nvi.mock(\"fs\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"fs\");\n return {\n ...actual,\n openSync: vi.fn(actual.openSync),\n readSync: vi.fn(actual.readSync),\n readFileSync: vi.fn(actual.readFileSync),\n };\n});\n\nconst mockedOpenSync = vi.mocked(fs.openSync);\nconst mockedReadSync = vi.mocked(fs.readSync);\nconst mockedReadFileSync = vi.mocked(fs.readFileSync);\n\n/** Bytes read from `filePath` via readFileSync or fd reads since the last `resetReads()`. */\nfunction bytesReadFrom(filePath: string): number {\n // fds are reused after close, so attribute each read to the latest open of that fd\n const opens = mockedOpenSync.mock.calls.map((call, index) => ({\n path: String(call[0]),\n fd: mockedOpenSync.mock.results[index]?.value as number,\n order: mockedOpenSync.mock.invocationCallOrder[index],\n }));\n\n let total = 0;\n mockedReadSync.mock.calls.forEach((call, index) => {\n const result = mockedReadSync.mock.results[index];\n const order = mockedReadSync.mock.invocationCallOrder[index];\n const open = opens.filter((o) => o.fd === call[0] && o.order < order).at(-1);\n if (result?.type === \"return\" && open?.path === filePath) {\n total += result.value as number;\n }\n });\n mockedReadFileSync.mock.calls.forEach((call, index) => {\n const result = mockedReadFileSync.mock.results[index];\n if (result?.type === \"return\" && String(call[0]) === filePath) {\n total += Buffer.byteLength(result.value as string | Buffer);\n }\n });\n return total;\n}\n\nfunction resetReads(): void {\n mockedOpenSync.mockClear();\n mockedReadSync.mockClear();\n mockedReadFileSync.mockClear();\n}\n\nfunction jsonl(entries: unknown[]): string {\n return entries.map((entry) => `${JSON.stringify(entry)}\\n`).join(\"\");\n}\n\ndescribe(\"incremental transcript reads across listAgents() refreshes\", () => {\n let originalHome: string | undefined;\n let tmpHome: string;\n let processes: ProcessInfo[];\n let manager: AgentManager;\n let claudeFile: string;\n let codexFile: string;\n let claudeAdapter: ClaudeCodeAdapter;\n let codexAdapter: CodexAdapter;\n\n const startTime = new Date();\n const claudePid = 71001;\n const codexPid = 72001;\n\n beforeEach(() => {\n originalHome = process.env.HOME;\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), \"incremental-refresh-\"));\n process.env.HOME = tmpHome;\n\n // Claude: authoritative PID-file match to a synthetic transcript\n const claudeSessionId = \"11111111-2222-3333-4444-555555555555\";\n const projectDir = path.join(tmpHome, \".claude\", \"projects\", \"-repo-claude\");\n const sessionsDir = path.join(tmpHome, \".claude\", \"sessions\");\n fs.mkdirSync(projectDir, { recursive: true });\n fs.mkdirSync(sessionsDir, { recursive: true });\n claudeFile = path.join(projectDir, `${claudeSessionId}.jsonl`);\n fs.writeFileSync(\n claudeFile,\n jsonl([\n {\n type: \"user\",\n timestamp: startTime.toISOString(),\n cwd: \"/repo/claude\",\n message: { content: \"first task\" },\n },\n {\n type: \"assistant\",\n timestamp: startTime.toISOString(),\n message: { content: \"x\".repeat(300_000) },\n },\n ]),\n );\n fs.writeFileSync(\n path.join(sessionsDir, `${claudePid}.json`),\n JSON.stringify({\n pid: claudePid,\n sessionId: claudeSessionId,\n cwd: \"/repo/claude\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n }),\n );\n\n // Codex: hook session mapping (pid → transcript path)\n const codexSessionId = \"019eabed-0000-7000-8000-000000000001\";\n const codexDir = path.join(tmpHome, \".codex\", \"sessions\", \"2026\", \"09\", \"28\");\n fs.mkdirSync(codexDir, { recursive: true });\n codexFile = path.join(codexDir, `rollout-2026-09-28T00-00-00-${codexSessionId}.jsonl`);\n fs.writeFileSync(\n codexFile,\n jsonl([\n {\n type: \"session_meta\",\n payload: { id: codexSessionId, cwd: \"/repo/codex\", timestamp: startTime.toISOString() },\n },\n {\n type: \"event_msg\",\n timestamp: startTime.toISOString(),\n payload: { type: \"user_message\", message: \"y\".repeat(300_000) },\n },\n ]),\n );\n fs.mkdirSync(path.join(tmpHome, \".codex\", \"ai-devkit\"), { recursive: true });\n fs.writeFileSync(\n path.join(tmpHome, \".codex\", \"ai-devkit\", \"sessions.json\"),\n JSON.stringify({ [codexPid]: codexFile }),\n );\n\n processes = [\n { pid: claudePid, command: \"claude\", cwd: \"/repo/claude\", tty: \"ttys001\", startTime },\n { pid: codexPid, command: \"codex\", cwd: \"/repo/codex\", tty: \"ttys002\", startTime },\n ];\n const registry = new AgentRegistry(path.join(tmpHome, \"agents.json\"));\n manager = new AgentManager(registry, async () => processes);\n claudeAdapter = new ClaudeCodeAdapter();\n codexAdapter = new CodexAdapter(registry);\n manager.registerAdapter(claudeAdapter);\n manager.registerAdapter(codexAdapter);\n resetReads();\n });\n\n afterEach(() => {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n function summaryOf(agents: Awaited<ReturnType<AgentManager[\"listAgents\"]>>, pid: number) {\n const agent = agents.find((candidate) => candidate.pid === pid);\n return { sessionId: agent?.sessionId, status: agent?.status, summary: agent?.summary };\n }\n\n it(\"reads 0 transcript bytes on a second refresh when nothing changed\", async () => {\n const first = await manager.listAgents();\n expect(bytesReadFrom(claudeFile)).toBe(fs.statSync(claudeFile).size);\n expect(bytesReadFrom(codexFile)).toBe(fs.statSync(codexFile).size);\n\n resetReads();\n const second = await manager.listAgents();\n\n expect(bytesReadFrom(claudeFile)).toBe(0);\n expect(bytesReadFrom(codexFile)).toBe(0);\n expect(summaryOf(second, claudePid)).toEqual(summaryOf(first, claudePid));\n expect(summaryOf(second, codexPid)).toEqual(summaryOf(first, codexPid));\n });\n\n it(\"reads at most the appended bytes plus 64 KiB after an append\", async () => {\n await manager.listAgents();\n\n const claudeAppend = jsonl([\n { type: \"user\", timestamp: new Date().toISOString(), message: { content: \"follow-up task\" } },\n ]);\n const codexAppend = jsonl([\n {\n type: \"event_msg\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"done\" },\n },\n ]);\n fs.appendFileSync(claudeFile, claudeAppend);\n fs.appendFileSync(codexFile, codexAppend);\n\n resetReads();\n const agents = await manager.listAgents();\n\n expect(bytesReadFrom(claudeFile)).toBeGreaterThan(0);\n expect(bytesReadFrom(codexFile)).toBeGreaterThan(0);\n expect(bytesReadFrom(claudeFile)).toBeLessThanOrEqual(\n Buffer.byteLength(claudeAppend) + 64 * 1024,\n );\n expect(bytesReadFrom(codexFile)).toBeLessThanOrEqual(\n Buffer.byteLength(codexAppend) + 64 * 1024,\n );\n expect(summaryOf(agents, claudePid).summary).toContain(\"follow-up task\");\n expect(summaryOf(agents, codexPid).summary).toContain(\"done\");\n });\n\n it(\"reads at most 5 MiB (+1 byte) of a large transcript on a cold refresh, then only appends\", async () => {\n // ~12 MiB of history between the first and the latest turn\n const history = jsonl(\n Array.from({ length: 48 }, () => ({\n type: \"assistant\",\n timestamp: startTime.toISOString(),\n message: { content: \"h\".repeat(256 * 1024) },\n })),\n );\n const latest = new Date(startTime.getTime() + 60_000).toISOString();\n fs.appendFileSync(\n claudeFile,\n history +\n jsonl([{ type: \"user\", timestamp: latest, message: { content: \"latest claude task\" } }]),\n );\n fs.appendFileSync(\n codexFile,\n history +\n jsonl([\n {\n type: \"event_msg\",\n timestamp: latest,\n payload: { type: \"agent_message\", message: \"ok\" },\n },\n ]),\n );\n resetReads();\n\n const agents = await manager.listAgents();\n\n // 1 MiB head + 4 MiB tail, plus the byte before the tail window that tells\n // whether the window starts on a line boundary\n const limit = 5 * 1024 * 1024 + 1;\n expect(fs.statSync(claudeFile).size).toBeGreaterThan(2 * limit);\n expect(bytesReadFrom(claudeFile)).toBeLessThanOrEqual(limit);\n expect(bytesReadFrom(codexFile)).toBeLessThanOrEqual(limit);\n expect(summaryOf(agents, claudePid)).toMatchObject({\n sessionId: \"11111111-2222-3333-4444-555555555555\",\n summary: expect.stringContaining(\"latest claude task\"),\n });\n expect(summaryOf(agents, codexPid).summary).toContain(\"ok\");\n\n const append = jsonl([\n { type: \"user\", timestamp: latest, message: { content: \"follow-up after cold start\" } },\n ]);\n fs.appendFileSync(claudeFile, append);\n resetReads();\n\n const refreshed = await manager.listAgents();\n expect(bytesReadFrom(claudeFile)).toBe(Buffer.byteLength(append));\n expect(summaryOf(refreshed, claudePid).summary).toContain(\"follow-up after cold start\");\n });\n\n it(\"evicts cache entries for transcripts absent from the latest refresh\", async () => {\n await manager.listAgents();\n expect((claudeAdapter as any).parser.sessionCache.size).toBe(1);\n expect((codexAdapter as any).parser.sessionCache.size).toBe(1);\n\n processes = [];\n await manager.listAgents();\n\n expect((claudeAdapter as any).parser.sessionCache.size).toBe(0);\n expect((codexAdapter as any).parser.sessionCache.size).toBe(0);\n });\n});\n\ndescribe(\"incremental Kiro and Antigravity transcript reads across listAgents() refreshes\", () => {\n let originalHome: string | undefined;\n let originalAgyHome: string | undefined;\n let tmpHome: string;\n let processes: ProcessInfo[];\n let manager: AgentManager;\n let kiroFile: string;\n let agyFile: string;\n let kiroAdapter: KiroAdapter;\n let agyAdapter: AntigravityCliAdapter;\n\n const startTime = new Date();\n const kiroPid = 74001;\n const agyPid = 75001;\n const kiroPrompt = (text: string, at = startTime) => ({\n kind: \"Prompt\",\n data: { content: [{ kind: \"text\", data: text }], meta: { timestamp: at.getTime() } },\n });\n const kiroReply = (text: string) => ({\n kind: \"AssistantMessage\",\n data: { content: [{ kind: \"text\", data: text }] },\n });\n const agyRequest = (text: string, at = startTime) => ({\n type: \"USER_INPUT\",\n created_at: at.toISOString(),\n content: `<USER_REQUEST>\\n${text}\\n</USER_REQUEST>`,\n });\n const agyReply = (text: string, at = startTime) => ({\n type: \"PLANNER_RESPONSE\",\n created_at: at.toISOString(),\n content: text,\n });\n\n beforeEach(() => {\n originalHome = process.env.HOME;\n originalAgyHome = process.env.ANTIGRAVITY_CLI_HOME;\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), \"incremental-refresh-kiro-agy-\"));\n process.env.HOME = tmpHome;\n process.env.ANTIGRAVITY_CLI_HOME = path.join(tmpHome, \"antigravity\");\n\n // Kiro: a session lock held by the running kiro-cli\n const kiroDir = path.join(tmpHome, \".kiro\", \"sessions\", \"cli\");\n fs.mkdirSync(kiroDir, { recursive: true });\n kiroFile = path.join(kiroDir, \"kiro-session.jsonl\");\n fs.writeFileSync(kiroFile, jsonl([kiroPrompt(\"first task\"), kiroReply(\"x\".repeat(300_000))]));\n fs.writeFileSync(\n path.join(kiroDir, \"kiro-session.json\"),\n JSON.stringify({ session_id: \"kiro-session\", cwd: \"/repo/kiro\" }),\n );\n fs.writeFileSync(path.join(kiroDir, \"kiro-session.lock\"), JSON.stringify({ pid: kiroPid }));\n\n // Antigravity: the conversation registry maps the process cwd to the transcript\n const agyId = \"10485e13-2742-4e9e-b286-ac0606f0cb1e\";\n const agyLogs = path.join(tmpHome, \"antigravity\", \"brain\", agyId, \".system_generated\", \"logs\");\n fs.mkdirSync(agyLogs, { recursive: true });\n fs.mkdirSync(path.join(tmpHome, \"antigravity\", \"cache\"), { recursive: true });\n agyFile = path.join(agyLogs, \"transcript.jsonl\");\n fs.writeFileSync(agyFile, jsonl([agyRequest(\"first task\"), agyReply(\"y\".repeat(300_000))]));\n fs.writeFileSync(\n path.join(tmpHome, \"antigravity\", \"cache\", \"last_conversations.json\"),\n JSON.stringify({ \"/repo/agy\": agyId }),\n );\n\n processes = [\n { pid: kiroPid, command: \"kiro-cli\", cwd: \"/repo/kiro\", tty: \"ttys003\", startTime },\n { pid: agyPid, command: \"agy\", cwd: \"/repo/agy\", tty: \"ttys004\", startTime },\n ];\n manager = new AgentManager(\n new AgentRegistry(path.join(tmpHome, \"agents.json\")),\n async () => processes,\n );\n kiroAdapter = new KiroAdapter();\n agyAdapter = new AntigravityCliAdapter();\n manager.registerAdapter(kiroAdapter);\n manager.registerAdapter(agyAdapter);\n resetReads();\n });\n\n afterEach(() => {\n process.env.HOME = originalHome;\n if (originalAgyHome === undefined) delete process.env.ANTIGRAVITY_CLI_HOME;\n else process.env.ANTIGRAVITY_CLI_HOME = originalAgyHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n function summaryOf(agents: Awaited<ReturnType<AgentManager[\"listAgents\"]>>, pid: number) {\n const agent = agents.find((candidate) => candidate.pid === pid);\n return { sessionId: agent?.sessionId, status: agent?.status, summary: agent?.summary };\n }\n\n it(\"reads 0 transcript bytes on a second refresh when nothing changed\", async () => {\n const first = await manager.listAgents();\n expect(bytesReadFrom(kiroFile)).toBe(fs.statSync(kiroFile).size);\n expect(bytesReadFrom(agyFile)).toBe(fs.statSync(agyFile).size);\n expect(summaryOf(first, kiroPid).summary).toBe(\"first task\");\n expect(summaryOf(first, agyPid).summary).toBe(\"first task\");\n\n resetReads();\n const second = await manager.listAgents();\n\n expect(bytesReadFrom(kiroFile)).toBe(0);\n expect(bytesReadFrom(agyFile)).toBe(0);\n expect(summaryOf(second, kiroPid)).toEqual(summaryOf(first, kiroPid));\n expect(summaryOf(second, agyPid)).toEqual(summaryOf(first, agyPid));\n });\n\n it(\"reads at most the appended bytes plus 64 KiB after an append\", async () => {\n await manager.listAgents();\n\n const kiroAppend = jsonl([kiroPrompt(\"follow-up task\")]);\n const agyAppend = jsonl([agyRequest(\"follow-up task\")]);\n fs.appendFileSync(kiroFile, kiroAppend);\n fs.appendFileSync(agyFile, agyAppend);\n\n resetReads();\n const agents = await manager.listAgents();\n\n expect(bytesReadFrom(kiroFile)).toBeGreaterThan(0);\n expect(bytesReadFrom(agyFile)).toBeGreaterThan(0);\n expect(bytesReadFrom(kiroFile)).toBeLessThanOrEqual(Buffer.byteLength(kiroAppend) + 64 * 1024);\n expect(bytesReadFrom(agyFile)).toBeLessThanOrEqual(Buffer.byteLength(agyAppend) + 64 * 1024);\n expect(summaryOf(agents, kiroPid).summary).toBe(\"follow-up task\");\n expect(summaryOf(agents, agyPid).summary).toBe(\"follow-up task\");\n });\n\n it(\"reads at most 5 MiB (+1 byte) of a large transcript on a cold refresh\", async () => {\n const latest = new Date(startTime.getTime() + 60_000);\n const kiroHistory = jsonl(Array.from({ length: 48 }, () => kiroReply(\"h\".repeat(256 * 1024))));\n const agyHistory = jsonl(Array.from({ length: 48 }, () => agyReply(\"h\".repeat(256 * 1024))));\n fs.appendFileSync(kiroFile, kiroHistory + jsonl([kiroPrompt(\"latest kiro task\", latest)]));\n fs.appendFileSync(agyFile, agyHistory + jsonl([agyRequest(\"latest agy task\", latest)]));\n resetReads();\n\n const agents = await manager.listAgents();\n\n // 1 MiB head + 4 MiB tail, plus the byte before the tail window\n const limit = 5 * 1024 * 1024 + 1;\n expect(fs.statSync(kiroFile).size).toBeGreaterThan(2 * limit);\n expect(bytesReadFrom(kiroFile)).toBeLessThanOrEqual(limit);\n expect(bytesReadFrom(agyFile)).toBeLessThanOrEqual(limit);\n expect(summaryOf(agents, kiroPid).summary).toBe(\"latest kiro task\");\n expect(summaryOf(agents, agyPid).summary).toBe(\"latest agy task\");\n });\n\n it(\"evicts cache entries for transcripts absent from the latest refresh\", async () => {\n await manager.listAgents();\n expect((kiroAdapter as any).parser.sessionCache.size).toBe(1);\n expect((agyAdapter as any).parser.sessionCache.size).toBe(1);\n\n processes = [];\n await manager.listAgents();\n\n expect((kiroAdapter as any).parser.sessionCache.size).toBe(0);\n expect((agyAdapter as any).parser.sessionCache.size).toBe(0);\n });\n});\n"],"names":["fs","os","path","AgentManager","ClaudeCodeAdapter","CodexAdapter","AntigravityCliAdapter","KiroAdapter","AgentRegistry","vi","mock","importOriginal","actual","openSync","fn","readSync","readFileSync","mockedOpenSync","mocked","mockedReadSync","mockedReadFileSync","bytesReadFrom","filePath","opens","calls","map","call","index","String","fd","results","value","order","invocationCallOrder","total","forEach","result","open","filter","o","at","type","Buffer","byteLength","resetReads","mockClear","jsonl","entries","entry","JSON","stringify","join","describe","originalHome","tmpHome","processes","manager","claudeFile","codexFile","claudeAdapter","codexAdapter","startTime","Date","claudePid","codexPid","beforeEach","process","env","HOME","mkdtempSync","tmpdir","claudeSessionId","projectDir","sessionsDir","mkdirSync","recursive","writeFileSync","timestamp","toISOString","cwd","message","content","repeat","pid","sessionId","startedAt","getTime","kind","entrypoint","codexSessionId","codexDir","payload","id","command","tty","registry","registerAdapter","afterEach","rmSync","force","summaryOf","agents","agent","find","candidate","status","summary","it","first","listAgents","expect","toBe","statSync","size","second","toEqual","claudeAppend","codexAppend","appendFileSync","toBeGreaterThan","toBeLessThanOrEqual","toContain","history","Array","from","length","latest","limit","toMatchObject","stringContaining","append","refreshed","parser","sessionCache","originalAgyHome","kiroFile","agyFile","kiroAdapter","agyAdapter","kiroPid","agyPid","kiroPrompt","text","data","meta","kiroReply","agyRequest","created_at","agyReply","ANTIGRAVITY_CLI_HOME","kiroDir","session_id","agyId","agyLogs","undefined","kiroAppend","agyAppend","kiroHistory","agyHistory"],"mappings":"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"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Guard (#257): built-in adapters must discover processes through the shared
3
+ * async snapshot (AgentDetectionContext / captureProcessSnapshot), never the
4
+ * synchronous listAgentProcesses / enrichProcesses helpers, which block the
5
+ * event loop with execFileSync on every refresh.
6
+ */ import * as fs from "fs";
7
+ import * as path from "path";
8
+ import { fileURLToPath } from "url";
9
+ const SRC_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), "..", "..");
10
+ const ADAPTER_DIRS = [
11
+ "adapters",
12
+ "harnesses"
13
+ ];
14
+ const SYNC_HELPERS = [
15
+ "listAgentProcesses",
16
+ "enrichProcesses"
17
+ ];
18
+ function listSourceFiles(dir) {
19
+ return fs.readdirSync(dir, {
20
+ withFileTypes: true
21
+ }).flatMap((entry)=>{
22
+ const full = path.join(dir, entry.name);
23
+ if (entry.isDirectory()) return listSourceFiles(full);
24
+ return entry.name.endsWith(".ts") && !entry.name.endsWith(".d.ts") ? [
25
+ full
26
+ ] : [];
27
+ });
28
+ }
29
+ /** Names imported by `import { ... } from "<utils/process or utils/index>"`. */ function importedUtilNames(source) {
30
+ const names = [];
31
+ const importRe = /import\s+(?:type\s+)?\{([^}]*)\}\s*from\s*["']([^"']+)["']/g;
32
+ for (const match of source.matchAll(importRe)){
33
+ if (!/\/utils(\/(process|index)(\.js)?)?$/.test(match[2])) continue;
34
+ for (const spec of match[1].split(",")){
35
+ const name = spec.trim().replace(/^type\s+/, "").split(/\s+as\s+/)[0];
36
+ if (name) names.push(name);
37
+ }
38
+ }
39
+ return names;
40
+ }
41
+ describe("adapter process discovery guard", ()=>{
42
+ it("finds adapter source files to check", ()=>{
43
+ const files = ADAPTER_DIRS.flatMap((dir)=>listSourceFiles(path.join(SRC_DIR, dir)));
44
+ expect(files.some((file)=>file.endsWith("AntigravityCliAdapter.ts"))).toBe(true);
45
+ });
46
+ it("no adapter imports the synchronous process helpers", ()=>{
47
+ const offenders = ADAPTER_DIRS.flatMap((dir)=>listSourceFiles(path.join(SRC_DIR, dir))).flatMap((file)=>importedUtilNames(fs.readFileSync(file, "utf-8")).filter((name)=>SYNC_HELPERS.includes(name)).map((name)=>`${path.relative(SRC_DIR, file)}: ${name}`)).sort();
48
+ expect(offenders).toEqual([]);
49
+ });
50
+ });
51
+
52
+ //# sourceMappingURL=adapterProcessImports.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/__tests__/adapters/adapterProcessImports.test.ts"],"sourcesContent":["/**\n * Guard (#257): built-in adapters must discover processes through the shared\n * async snapshot (AgentDetectionContext / captureProcessSnapshot), never the\n * synchronous listAgentProcesses / enrichProcesses helpers, which block the\n * event loop with execFileSync on every refresh.\n */\n\nimport * as fs from \"fs\";\nimport * as path from \"path\";\nimport { fileURLToPath } from \"url\";\n\nconst SRC_DIR = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\", \"..\");\nconst ADAPTER_DIRS = [\"adapters\", \"harnesses\"];\nconst SYNC_HELPERS = [\"listAgentProcesses\", \"enrichProcesses\"];\n\nfunction listSourceFiles(dir: string): string[] {\n return fs.readdirSync(dir, { withFileTypes: true }).flatMap((entry) => {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) return listSourceFiles(full);\n return entry.name.endsWith(\".ts\") && !entry.name.endsWith(\".d.ts\") ? [full] : [];\n });\n}\n\n/** Names imported by `import { ... } from \"<utils/process or utils/index>\"`. */\nfunction importedUtilNames(source: string): string[] {\n const names: string[] = [];\n const importRe = /import\\s+(?:type\\s+)?\\{([^}]*)\\}\\s*from\\s*[\"']([^\"']+)[\"']/g;\n for (const match of source.matchAll(importRe)) {\n if (!/\\/utils(\\/(process|index)(\\.js)?)?$/.test(match[2])) continue;\n for (const spec of match[1].split(\",\")) {\n const name = spec\n .trim()\n .replace(/^type\\s+/, \"\")\n .split(/\\s+as\\s+/)[0];\n if (name) names.push(name);\n }\n }\n return names;\n}\n\ndescribe(\"adapter process discovery guard\", () => {\n it(\"finds adapter source files to check\", () => {\n const files = ADAPTER_DIRS.flatMap((dir) => listSourceFiles(path.join(SRC_DIR, dir)));\n expect(files.some((file) => file.endsWith(\"AntigravityCliAdapter.ts\"))).toBe(true);\n });\n\n it(\"no adapter imports the synchronous process helpers\", () => {\n const offenders = ADAPTER_DIRS.flatMap((dir) => listSourceFiles(path.join(SRC_DIR, dir)))\n .flatMap((file) =>\n importedUtilNames(fs.readFileSync(file, \"utf-8\"))\n .filter((name) => SYNC_HELPERS.includes(name))\n .map((name) => `${path.relative(SRC_DIR, file)}: ${name}`),\n )\n .sort();\n\n expect(offenders).toEqual([]);\n });\n});\n"],"names":["fs","path","fileURLToPath","SRC_DIR","resolve","dirname","url","ADAPTER_DIRS","SYNC_HELPERS","listSourceFiles","dir","readdirSync","withFileTypes","flatMap","entry","full","join","name","isDirectory","endsWith","importedUtilNames","source","names","importRe","match","matchAll","test","spec","split","trim","replace","push","describe","it","files","expect","some","file","toBe","offenders","readFileSync","filter","includes","map","relative","sort","toEqual"],"mappings":"AAAA;;;;;CAKC,GAED,YAAYA,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAC7B,SAASC,aAAa,QAAQ,MAAM;AAEpC,MAAMC,UAAUF,KAAKG,OAAO,CAACH,KAAKI,OAAO,CAACH,cAAc,YAAYI,GAAG,IAAI,MAAM;AACjF,MAAMC,eAAe;IAAC;IAAY;CAAY;AAC9C,MAAMC,eAAe;IAAC;IAAsB;CAAkB;AAE9D,SAASC,gBAAgBC,GAAW;IAClC,OAAOV,GAAGW,WAAW,CAACD,KAAK;QAAEE,eAAe;IAAK,GAAGC,OAAO,CAAC,CAACC;QAC3D,MAAMC,OAAOd,KAAKe,IAAI,CAACN,KAAKI,MAAMG,IAAI;QACtC,IAAIH,MAAMI,WAAW,IAAI,OAAOT,gBAAgBM;QAChD,OAAOD,MAAMG,IAAI,CAACE,QAAQ,CAAC,UAAU,CAACL,MAAMG,IAAI,CAACE,QAAQ,CAAC,WAAW;YAACJ;SAAK,GAAG,EAAE;IAClF;AACF;AAEA,8EAA8E,GAC9E,SAASK,kBAAkBC,MAAc;IACvC,MAAMC,QAAkB,EAAE;IAC1B,MAAMC,WAAW;IACjB,KAAK,MAAMC,SAASH,OAAOI,QAAQ,CAACF,UAAW;QAC7C,IAAI,CAAC,sCAAsCG,IAAI,CAACF,KAAK,CAAC,EAAE,GAAG;QAC3D,KAAK,MAAMG,QAAQH,KAAK,CAAC,EAAE,CAACI,KAAK,CAAC,KAAM;YACtC,MAAMX,OAAOU,KACVE,IAAI,GACJC,OAAO,CAAC,YAAY,IACpBF,KAAK,CAAC,WAAW,CAAC,EAAE;YACvB,IAAIX,MAAMK,MAAMS,IAAI,CAACd;QACvB;IACF;IACA,OAAOK;AACT;AAEAU,SAAS,mCAAmC;IAC1CC,GAAG,uCAAuC;QACxC,MAAMC,QAAQ3B,aAAaM,OAAO,CAAC,CAACH,MAAQD,gBAAgBR,KAAKe,IAAI,CAACb,SAASO;QAC/EyB,OAAOD,MAAME,IAAI,CAAC,CAACC,OAASA,KAAKlB,QAAQ,CAAC,8BAA8BmB,IAAI,CAAC;IAC/E;IAEAL,GAAG,sDAAsD;QACvD,MAAMM,YAAYhC,aAAaM,OAAO,CAAC,CAACH,MAAQD,gBAAgBR,KAAKe,IAAI,CAACb,SAASO,OAChFG,OAAO,CAAC,CAACwB,OACRjB,kBAAkBpB,GAAGwC,YAAY,CAACH,MAAM,UACrCI,MAAM,CAAC,CAACxB,OAAST,aAAakC,QAAQ,CAACzB,OACvC0B,GAAG,CAAC,CAAC1B,OAAS,GAAGhB,KAAK2C,QAAQ,CAACzC,SAASkC,MAAM,EAAE,EAAEpB,MAAM,GAE5D4B,IAAI;QAEPV,OAAOI,WAAWO,OAAO,CAAC,EAAE;IAC9B;AACF"}