@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
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/adapters/ClaudeCodeAdapter.test.ts"],"sourcesContent":["/**\n * Tests for ClaudeCodeAdapter\n */\n\nimport type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as path from \"path\";\n\nimport { ClaudeCodeAdapter } from \"../../providers/claude/ClaudeCodeAdapter.js\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n listAgentProcesses,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"../../utils/process.js\";\nimport { batchGetSessionFileBirthtimes } from \"../../utils/session.js\";\nimport type { SessionFile } from \"../../utils/session.js\";\nimport { matchProcessesToSessions, generateAgentName } from \"../../utils/matching.js\";\nimport type { MatchResult } from \"../../utils/matching.js\";\nimport * as os from \"os\";\nvi.mock(\"../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../utils/session.js\", async () => {\n const actual = (await vi.importActual(\n \"../../utils/session\",\n )) as typeof import(\"../../utils/session\");\n return {\n ...actual,\n batchGetSessionFileBirthtimes: vi.fn(),\n };\n});\n\nvi.mock(\"../../utils/matching.js\", () => ({\n matchProcessesToSessions: vi.fn(),\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<\n typeof batchGetSessionFileBirthtimes\n>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<\n typeof matchProcessesToSessions\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\ndescribe(\"ClaudeCodeAdapter\", () => {\n let adapter: ClaudeCodeAdapter;\n\n beforeEach(() => {\n adapter = new ClaudeCodeAdapter();\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedBatchGetSessionFileBirthtimes.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n // Default: enrichProcesses returns what it receives\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n // Default: generateAgentName returns \"folder (pid)\"\n mockedGenerateAgentName.mockImplementation((cwd, pid) => {\n const folder = path.basename(cwd) || \"unknown\";\n return `${folder} (${pid})`;\n });\n });\n\n describe(\"initialization\", () => {\n it(\"should create adapter with correct type\", () => {\n expect(adapter.type).toBe(\"claude\");\n });\n });\n\n describe(\"canHandle\", () => {\n it(\"should return true for claude processes\", () => {\n const processInfo = {\n pid: 12345,\n command: \"claude\",\n cwd: \"/test\",\n tty: \"ttys001\",\n };\n\n expect(adapter.canHandle(processInfo)).toBe(true);\n });\n\n it(\"should return true for claude executable with full path\", () => {\n const processInfo = {\n pid: 12345,\n command: \"/usr/local/bin/claude --some-flag\",\n cwd: \"/test\",\n tty: \"ttys001\",\n };\n\n expect(adapter.canHandle(processInfo)).toBe(true);\n });\n\n it(\"should return true for CLAUDE (case-insensitive)\", () => {\n const processInfo = {\n pid: 12345,\n command: \"/usr/local/bin/CLAUDE --continue\",\n cwd: \"/test\",\n tty: \"ttys001\",\n };\n\n expect(adapter.canHandle(processInfo)).toBe(true);\n });\n\n it(\"should return false for non-claude processes\", () => {\n const processInfo = {\n pid: 12345,\n command: \"node\",\n cwd: \"/test\",\n tty: \"ttys001\",\n };\n\n expect(adapter.canHandle(processInfo)).toBe(false);\n });\n\n it('should return false for processes with \"claude\" only in path arguments', () => {\n const processInfo = {\n pid: 12345,\n command: \"/usr/local/bin/node /path/to/claude-worktree/node_modules/nx/start.js\",\n cwd: \"/test\",\n tty: \"ttys001\",\n };\n\n expect(adapter.canHandle(processInfo)).toBe(false);\n });\n });\n\n describe(\"detectAgents\", () => {\n it(\"should return empty array if no claude processes running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"claude\");\n });\n\n it(\"should return process-only agents when no sessions discovered\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 777, command: \"claude\", cwd: \"/project/app\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // No projects dir → discoverSessions returns []\n (adapter as any).projectsDir = \"/nonexistent/path\";\n\n const agents = await adapter.detectAgents();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"claude\",\n status: AgentStatus.IDLE,\n pid: 777,\n projectPath: \"/project/app\",\n sessionId: \"pid-777\",\n summary: \"Unknown\",\n });\n });\n\n it(\"should detect agents with matched sessions\", async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 12345,\n command: \"claude\",\n cwd: \"/Users/test/my-project\",\n tty: \"ttys001\",\n startTime: new Date(\"2026-03-18T23:18:01.000Z\"),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // Set up projects dir with encoded directory name\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-test-\"));\n const projectsDir = path.join(tmpDir, \"projects\");\n // Claude encodes /Users/test/my-project → -Users-test-my-project\n const projDir = path.join(projectsDir, \"-Users-test-my-project\");\n fs.mkdirSync(projDir, { recursive: true });\n\n // Create session file\n const sessionFile = path.join(projDir, \"session-1.jsonl\");\n fs.writeFileSync(\n sessionFile,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-18T23:18:44Z\",\n cwd: \"/Users/test/my-project\",\n message: { content: \"Investigate failing tests\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-18T23:19:00Z\" }),\n ].join(\"\\n\"),\n );\n\n (adapter as any).projectsDir = projectsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: \"session-1\",\n filePath: sessionFile,\n projectDir: projDir,\n birthtimeMs: new Date(\"2026-03-18T23:18:44Z\").getTime(),\n resolvedCwd: \"\",\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(sessionFiles);\n\n const matches: MatchResult[] = [\n {\n process: processes[0],\n session: { ...sessionFiles[0], resolvedCwd: \"/Users/test/my-project\" },\n deltaMs: 43000,\n },\n ];\n mockedMatchProcessesToSessions.mockReturnValue(matches);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"claude\",\n status: AgentStatus.WAITING,\n pid: 12345,\n projectPath: \"/Users/test/my-project\",\n sessionId: \"session-1\",\n });\n expect(agents[0].summary).toContain(\"Investigate failing tests\");\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"should fall back to process-only for unmatched processes\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"claude\", cwd: \"/project-a\", tty: \"ttys001\", startTime: new Date() },\n { pid: 200, command: \"claude\", cwd: \"/project-b\", tty: \"ttys002\", startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // Set up projects dir with encoded directory names\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-test-\"));\n const projectsDir = path.join(tmpDir, \"projects\");\n // /project-a → -project-a, /project-b → -project-b\n const projDirA = path.join(projectsDir, \"-project-a\");\n const projDirB = path.join(projectsDir, \"-project-b\");\n fs.mkdirSync(projDirA, { recursive: true });\n fs.mkdirSync(projDirB, { recursive: true });\n\n const sessionFile = path.join(projDirA, \"only-session.jsonl\");\n fs.writeFileSync(\n sessionFile,\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-18T23:19:00Z\" }),\n );\n\n (adapter as any).projectsDir = projectsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: \"only-session\",\n filePath: sessionFile,\n projectDir: projDirA,\n birthtimeMs: Date.now(),\n resolvedCwd: \"\",\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(sessionFiles);\n\n // Only process 100 matches\n const matches: MatchResult[] = [\n {\n process: processes[0],\n session: { ...sessionFiles[0], resolvedCwd: \"/project-a\" },\n deltaMs: 5000,\n },\n ];\n mockedMatchProcessesToSessions.mockReturnValue(matches);\n\n const agents = await adapter.detectAgents();\n expect(agents).toHaveLength(2);\n\n const matched = agents.find((a) => a.pid === 100);\n const unmatched = agents.find((a) => a.pid === 200);\n expect(matched?.sessionId).toBe(\"only-session\");\n expect(unmatched?.sessionId).toBe(\"pid-200\");\n expect(unmatched?.status).toBe(AgentStatus.IDLE);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"should handle process with empty cwd in process-only fallback\", async () => {\n const processes: ProcessInfo[] = [{ pid: 300, command: \"claude\", cwd: \"\", tty: \"ttys003\" }];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n (adapter as any).projectsDir = \"/nonexistent\";\n\n const agents = await adapter.detectAgents();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 300,\n sessionId: \"pid-300\",\n summary: \"Unknown\",\n projectPath: \"\",\n });\n });\n\n it(\"should match via --resume <uuid> in command line and skip PID-file/legacy\", async () => {\n const sessionId = \"0555f803-7eca-4fc6-a1e0-34dbf86b33b2\";\n const processes: ProcessInfo[] = [\n {\n pid: 41920,\n command: `claude --resume ${sessionId}`,\n cwd: \"/project/resumed\",\n tty: \"ttys001\",\n startTime: new Date(),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-resume-\"));\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-resumed\");\n fs.mkdirSync(projDir, { recursive: true });\n\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n jsonlPath,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/resumed\",\n message: { content: \"resumed conversation\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: new Date().toISOString() }),\n ].join(\"\\n\"),\n );\n\n (adapter as any).projectsDir = projectsDir;\n (adapter as any).sessionsDir = path.join(tmpDir, \"sessions\"); // empty — no PID file\n\n const agents = await adapter.detectAgents();\n\n // Legacy matching helpers must NOT have been consulted — resume match was authoritative\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"claude\",\n pid: 41920,\n sessionId,\n projectPath: \"/project/resumed\",\n });\n expect(agents[0].summary).toContain(\"resumed conversation\");\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"should fall through when --resume points to a JSONL that does not exist\", async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 41921,\n command: \"claude --resume aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee\",\n cwd: \"/project/missing\",\n tty: \"ttys001\",\n startTime: new Date(),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // No projects dir, no PID file → both matchers fail → process-only\n (adapter as any).projectsDir = \"/nonexistent\";\n (adapter as any).sessionsDir = \"/nonexistent\";\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe(\"pid-41921\");\n expect(agents[0].status).toBe(AgentStatus.IDLE);\n });\n\n it(\"should use PID file for direct match and skip legacy matching for that process\", async () => {\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n { pid: 55001, command: \"claude\", cwd: \"/project/direct\", tty: \"ttys001\", startTime },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-pid-test-\"));\n const sessionsDir = path.join(tmpDir, \"sessions\");\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-direct\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n fs.mkdirSync(projDir, { recursive: true });\n\n const sessionId = \"pid-file-session\";\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n jsonlPath,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/direct\",\n message: { content: \"hello from pid file\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: new Date().toISOString() }),\n ].join(\"\\n\"),\n );\n\n fs.writeFileSync(\n path.join(sessionsDir, \"55001.json\"),\n JSON.stringify({\n pid: 55001,\n sessionId,\n cwd: \"/project/direct\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n }),\n );\n\n (adapter as any).sessionsDir = sessionsDir;\n (adapter as any).projectsDir = projectsDir;\n\n const agents = await adapter.detectAgents();\n\n // Legacy matching utilities should NOT have been called (all processes matched via PID file)\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"claude\",\n pid: 55001,\n sessionId,\n projectPath: \"/project/direct\",\n status: AgentStatus.WAITING,\n });\n expect(agents[0].summary).toContain(\"hello from pid file\");\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"should prefer PID-file live status over JSONL-derived status and surface waitingFor in summary\", async () => {\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n { pid: 55050, command: \"claude\", cwd: \"/project/wait\", tty: \"ttys001\", startTime },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-pid-wait-\"));\n const sessionsDir = path.join(tmpDir, \"sessions\");\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-wait\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n fs.mkdirSync(projDir, { recursive: true });\n\n const sessionId = \"wait-session\";\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n // PID file's live status must win over JSONL-derived status.\n fs.writeFileSync(\n jsonlPath,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/wait\",\n message: { content: \"/reddit-commenter\" },\n }),\n JSON.stringify({\n type: \"permission-mode\",\n timestamp: new Date().toISOString(),\n permissionMode: \"default\",\n }),\n ].join(\"\\n\"),\n );\n\n fs.writeFileSync(\n path.join(sessionsDir, \"55050.json\"),\n JSON.stringify({\n pid: 55050,\n sessionId,\n cwd: \"/project/wait\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n status: \"waiting\",\n waitingFor: \"approve Read\",\n }),\n );\n\n (adapter as any).sessionsDir = sessionsDir;\n (adapter as any).projectsDir = projectsDir;\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].status).toBe(AgentStatus.WAITING);\n expect(agents[0].summary).toContain(\"/reddit-commenter\");\n expect(agents[0].summary).toContain(\"waiting for approve Read\");\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should resolve PID-file status: \"idle\" to AgentStatus.IDLE even when JSONL would say UNKNOWN', async () => {\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n { pid: 55051, command: \"claude\", cwd: \"/project/idle\", tty: \"ttys001\", startTime },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-pid-idle-\"));\n const sessionsDir = path.join(tmpDir, \"sessions\");\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-idle\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n fs.mkdirSync(projDir, { recursive: true });\n\n const sessionId = \"idle-session\";\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n jsonlPath,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/idle\",\n message: { content: \"hello\" },\n }),\n JSON.stringify({\n type: \"permission-mode\",\n timestamp: new Date().toISOString(),\n permissionMode: \"default\",\n }),\n ].join(\"\\n\"),\n );\n\n fs.writeFileSync(\n path.join(sessionsDir, \"55051.json\"),\n JSON.stringify({\n pid: 55051,\n sessionId,\n cwd: \"/project/idle\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n status: \"idle\",\n }),\n );\n\n (adapter as any).sessionsDir = sessionsDir;\n (adapter as any).projectsDir = projectsDir;\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].status).toBe(AgentStatus.IDLE);\n // No waitingFor in PID file → summary is just the last user message\n expect(agents[0].summary).toBe(\"hello\");\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"should fall back to JSONL-derived status when PID-file status is missing or unrecognized\", async () => {\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n { pid: 55052, command: \"claude\", cwd: \"/project/legacy\", tty: \"ttys001\", startTime },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-pid-nostat-\"));\n const sessionsDir = path.join(tmpDir, \"sessions\");\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-legacy\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n fs.mkdirSync(projDir, { recursive: true });\n\n const sessionId = \"legacy-session\";\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n // Last entry is assistant → JSONL parser yields WAITING.\n fs.writeFileSync(\n jsonlPath,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/legacy\",\n message: { content: \"do the thing\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: new Date().toISOString() }),\n ].join(\"\\n\"),\n );\n\n // PID file with unrecognized status string — adapter must ignore it and use parser\n fs.writeFileSync(\n path.join(sessionsDir, \"55052.json\"),\n JSON.stringify({\n pid: 55052,\n sessionId,\n cwd: \"/project/legacy\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n status: \"fantastical-future-state\",\n }),\n );\n\n (adapter as any).sessionsDir = sessionsDir;\n (adapter as any).projectsDir = projectsDir;\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].status).toBe(AgentStatus.WAITING);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"should pick up live status from PID file even when matched via --resume\", async () => {\n const sessionId = \"aaaaaaaa-1111-2222-3333-444444444444\";\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n {\n pid: 55053,\n command: `claude --resume ${sessionId}`,\n cwd: \"/project/resume-wait\",\n tty: \"ttys001\",\n startTime,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-resume-wait-\"));\n const sessionsDir = path.join(tmpDir, \"sessions\");\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-resume-wait\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n fs.mkdirSync(projDir, { recursive: true });\n\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n jsonlPath,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/resume-wait\",\n message: { content: \"resumed work\" },\n }),\n JSON.stringify({\n type: \"permission-mode\",\n timestamp: new Date().toISOString(),\n permissionMode: \"default\",\n }),\n ].join(\"\\n\"),\n );\n\n fs.writeFileSync(\n path.join(sessionsDir, \"55053.json\"),\n JSON.stringify({\n pid: 55053,\n sessionId,\n cwd: \"/project/resume-wait\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n status: \"waiting\",\n waitingFor: \"approve Bash\",\n }),\n );\n\n (adapter as any).sessionsDir = sessionsDir;\n (adapter as any).projectsDir = projectsDir;\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].status).toBe(AgentStatus.WAITING);\n expect(agents[0].summary).toContain(\"resumed work\");\n expect(agents[0].summary).toContain(\"waiting for approve Bash\");\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it(\"should fall back to process-only when direct-matched JSONL becomes unreadable\", async () => {\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n { pid: 66001, command: \"claude\", cwd: \"/project/gone\", tty: \"ttys001\", startTime },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-gone-\"));\n const sessionsDir = path.join(tmpDir, \"sessions\");\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-gone\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n fs.mkdirSync(projDir, { recursive: true });\n\n const sessionId = \"gone-session\";\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n jsonlPath,\n JSON.stringify({ type: \"assistant\", timestamp: new Date().toISOString() }),\n );\n fs.writeFileSync(\n path.join(sessionsDir, \"66001.json\"),\n JSON.stringify({\n pid: 66001,\n sessionId,\n cwd: \"/project/gone\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n }),\n );\n\n (adapter as any).sessionsDir = sessionsDir;\n (adapter as any).projectsDir = projectsDir;\n\n // Simulate JSONL disappearing between existence check and read\n vi.spyOn((adapter as any).parser, \"readSession\").mockReturnValueOnce(null);\n\n const agents = await adapter.detectAgents();\n\n // matchedPids.delete called → process falls back to IDLE\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe(\"pid-66001\");\n expect(agents[0].status).toBe(AgentStatus.IDLE);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n vi.restoreAllMocks();\n });\n\n it(\"should fall back to process-only when legacy-matched JSONL becomes unreadable\", async () => {\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n { pid: 66002, command: \"claude\", cwd: \"/project/legacy-gone\", tty: \"ttys001\", startTime },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-lgone-\"));\n const projectsDir = path.join(tmpDir, \"projects\");\n const projDir = path.join(projectsDir, \"-project-legacy-gone\");\n fs.mkdirSync(projDir, { recursive: true });\n\n const sessionId = \"legacy-gone-session\";\n const jsonlPath = path.join(projDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n jsonlPath,\n JSON.stringify({ type: \"assistant\", timestamp: new Date().toISOString() }),\n );\n\n // No PID file → process goes to legacy fallback\n (adapter as any).sessionsDir = path.join(tmpDir, \"no-sessions\");\n (adapter as any).projectsDir = projectsDir;\n\n const legacySessionFile = {\n sessionId,\n filePath: jsonlPath,\n projectDir: projDir,\n birthtimeMs: startTime.getTime(),\n resolvedCwd: \"/project/legacy-gone\",\n };\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([legacySessionFile]);\n mockedMatchProcessesToSessions.mockReturnValue([\n { process: processes[0], session: legacySessionFile, deltaMs: 500 },\n ]);\n\n // Simulate JSONL disappearing between match and read\n vi.spyOn((adapter as any).parser, \"readSession\").mockReturnValueOnce(null);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe(\"pid-66002\");\n expect(agents[0].status).toBe(AgentStatus.IDLE);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n vi.restoreAllMocks();\n });\n\n it(\"should mix direct PID-file matches and legacy matches across processes\", async () => {\n const startTime = new Date();\n const processes: ProcessInfo[] = [\n { pid: 55002, command: \"claude\", cwd: \"/project/alpha\", tty: \"ttys001\", startTime },\n { pid: 55003, command: \"claude\", cwd: \"/project/beta\", tty: \"ttys002\", startTime },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-mix-test-\"));\n const sessionsDir = path.join(tmpDir, \"sessions\");\n const projectsDir = path.join(tmpDir, \"projects\");\n const projAlpha = path.join(projectsDir, \"-project-alpha\");\n const projBeta = path.join(projectsDir, \"-project-beta\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n fs.mkdirSync(projAlpha, { recursive: true });\n fs.mkdirSync(projBeta, { recursive: true });\n\n // PID file only for process 55002\n const directSessionId = \"direct-session\";\n const directJsonl = path.join(projAlpha, `${directSessionId}.jsonl`);\n fs.writeFileSync(\n directJsonl,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/alpha\",\n message: { content: \"direct question\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: new Date().toISOString() }),\n ].join(\"\\n\"),\n );\n fs.writeFileSync(\n path.join(sessionsDir, \"55002.json\"),\n JSON.stringify({\n pid: 55002,\n sessionId: directSessionId,\n cwd: \"/project/alpha\",\n startedAt: startTime.getTime(),\n kind: \"interactive\",\n entrypoint: \"cli\",\n }),\n );\n\n // Legacy session file for process 55003\n const legacySessionId = \"legacy-session\";\n const legacyJsonl = path.join(projBeta, `${legacySessionId}.jsonl`);\n fs.writeFileSync(\n legacyJsonl,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: new Date().toISOString(),\n cwd: \"/project/beta\",\n message: { content: \"legacy question\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: new Date().toISOString() }),\n ].join(\"\\n\"),\n );\n\n (adapter as any).sessionsDir = sessionsDir;\n (adapter as any).projectsDir = projectsDir;\n\n // Mock legacy matching for process 55003\n const legacySessionFile = {\n sessionId: legacySessionId,\n filePath: legacyJsonl,\n projectDir: projBeta,\n birthtimeMs: startTime.getTime(),\n resolvedCwd: \"/project/beta\",\n };\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([legacySessionFile]);\n mockedMatchProcessesToSessions.mockReturnValue([\n { process: processes[1], session: legacySessionFile, deltaMs: 1000 },\n ]);\n\n const agents = await adapter.detectAgents();\n\n // Legacy matching called only for fallback process (55003)\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledTimes(1);\n expect(mockedMatchProcessesToSessions.mock.calls[0][0]).toEqual([processes[1]]);\n\n expect(agents).toHaveLength(2);\n const alpha = agents.find((a) => a.pid === 55002);\n const beta = agents.find((a) => a.pid === 55003);\n expect(alpha?.sessionId).toBe(directSessionId);\n expect(beta?.sessionId).toBe(legacySessionId);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n });\n\n describe(\"helper methods\", () => {\n describe(\"determineStatus\", () => {\n it('should return \"unknown\" for sessions with no last entry type', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.UNKNOWN);\n });\n\n it('should return \"waiting\" for assistant entries', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n lastEntryType: \"assistant\",\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"waiting\" for user interruption', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n lastEntryType: \"user\",\n isInterrupted: true,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"running\" for user/progress entries', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n lastEntryType: \"user\",\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.RUNNING);\n });\n\n it(\"should not override status based on age (process is running)\", () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const oldDate = new Date(Date.now() - 10 * 60 * 1000);\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: oldDate,\n lastActive: oldDate,\n lastEntryType: \"assistant\",\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"idle\" for system entries', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n lastEntryType: \"system\",\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.IDLE);\n });\n\n it('should return \"running\" for thinking entries', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n lastEntryType: \"thinking\",\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.RUNNING);\n });\n\n it('should return \"running\" for progress entries', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n lastEntryType: \"progress\",\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.RUNNING);\n });\n\n it('should return \"unknown\" for unrecognized entry types', () => {\n const determineStatus = (adapter as any).parser.determineStatus.bind(\n (adapter as any).parser,\n );\n\n const session = {\n sessionId: \"test\",\n projectPath: \"/test\",\n sessionStart: new Date(),\n lastActive: new Date(),\n lastEntryType: \"some_other_type\",\n isInterrupted: false,\n };\n\n expect(determineStatus(session)).toBe(AgentStatus.UNKNOWN);\n });\n });\n\n describe(\"extractUserMessageText\", () => {\n it(\"should extract plain string content\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n expect(extract(\"hello world\")).toBe(\"hello world\");\n });\n\n it(\"should extract text from array content blocks\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n\n const content = [\n { type: \"tool_result\", content: \"some result\" },\n { type: \"text\", text: \"user question\" },\n ];\n expect(extract(content)).toBe(\"user question\");\n });\n\n it(\"should return undefined for empty/null content\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n\n expect(extract(undefined)).toBeUndefined();\n expect(extract(\"\")).toBeUndefined();\n expect(extract([])).toBeUndefined();\n });\n\n it(\"should parse command-message tags\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n\n const msg =\n \"<command-message><command-name>commit</command-name><command-args>fix bug</command-args></command-message>\";\n expect(extract(msg)).toBe(\"commit fix bug\");\n });\n\n it(\"should parse command-message without args\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n\n const msg = \"<command-message><command-name>help</command-name></command-message>\";\n expect(extract(msg)).toBe(\"help\");\n });\n\n it(\"should extract ARGUMENTS from skill expansion\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n\n const msg =\n \"Base directory for this skill: /some/path\\n\\nSome instructions\\n\\nARGUMENTS: implement the feature\";\n expect(extract(msg)).toBe(\"implement the feature\");\n });\n\n it(\"should return undefined for skill expansion without ARGUMENTS\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n\n const msg = \"Base directory for this skill: /some/path\\n\\nSome instructions only\";\n expect(extract(msg)).toBeUndefined();\n });\n\n it(\"should filter noise messages\", () => {\n const extract = (adapter as any).parser[\"extractUserMessageText\"].bind(\n (adapter as any).parser,\n );\n\n expect(extract(\"[Request interrupted by user]\")).toBeUndefined();\n expect(extract(\"Tool loaded.\")).toBeUndefined();\n expect(\n extract(\"This session is being continued from a previous conversation\"),\n ).toBeUndefined();\n });\n });\n\n describe(\"parseCommandMessage\", () => {\n it(\"should return undefined for malformed command-message\", () => {\n const parse = (adapter as any).parser[\"parseCommandMessage\"].bind((adapter as any).parser);\n expect(parse(\"<command-message>no tags</command-message>\")).toBeUndefined();\n });\n });\n });\n\n describe(\"file I/O methods\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-test-\"));\n (adapter as any).projectsDir = path.join(tmpDir, \"projects\");\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n describe(\"readSession\", () => {\n it(\"should parse session file with timestamps, cwd, and entry type\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"test-session.jsonl\");\n const lines = [\n JSON.stringify({ type: \"user\", timestamp: \"2026-03-10T10:00:00Z\", cwd: \"/my/project\" }),\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-10T10:01:00Z\" }),\n ];\n fs.writeFileSync(filePath, lines.join(\"\\n\"));\n\n const session = readSession(filePath, \"/my/project\");\n expect(session).toMatchObject({\n sessionId: \"test-session\",\n projectPath: \"/my/project\",\n lastCwd: \"/my/project\",\n lastEntryType: \"assistant\",\n isInterrupted: false,\n });\n expect(session.sessionStart.toISOString()).toBe(\"2026-03-10T10:00:00.000Z\");\n expect(session.lastActive.toISOString()).toBe(\"2026-03-10T10:01:00.000Z\");\n });\n\n it(\"should detect user interruption\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"interrupted.jsonl\");\n const lines = [\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-10T10:00:00Z\",\n message: {\n content: [{ type: \"text\", text: \"[Request interrupted by user for tool use]\" }],\n },\n }),\n ];\n fs.writeFileSync(filePath, lines.join(\"\\n\"));\n\n const session = readSession(filePath, \"/test\");\n expect(session.isInterrupted).toBe(true);\n expect(session.lastEntryType).toBe(\"user\");\n });\n\n it(\"should return session with defaults for empty file\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"empty.jsonl\");\n fs.writeFileSync(filePath, \"\");\n\n const session = readSession(filePath, \"/test\");\n expect(session).not.toBeNull();\n expect(session.lastEntryType).toBeUndefined();\n });\n\n it(\"should return null for non-existent file\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n expect(readSession(path.join(tmpDir, \"nonexistent.jsonl\"), \"/test\")).toBeNull();\n });\n\n it(\"should skip metadata entry types for lastEntryType\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"metadata-test.jsonl\");\n const lines = [\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-10T10:00:00Z\",\n message: { content: \"hello\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-10T10:01:00Z\" }),\n JSON.stringify({ type: \"last-prompt\", timestamp: \"2026-03-10T10:02:00Z\" }),\n JSON.stringify({ type: \"file-history-snapshot\", timestamp: \"2026-03-10T10:03:00Z\" }),\n ];\n fs.writeFileSync(filePath, lines.join(\"\\n\"));\n\n const session = readSession(filePath, \"/test\");\n expect(session.lastEntryType).toBe(\"assistant\");\n });\n\n it(\"should parse snapshot.timestamp from file-history-snapshot first entry\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"snapshot-ts.jsonl\");\n const lines = [\n JSON.stringify({\n type: \"file-history-snapshot\",\n snapshot: { timestamp: \"2026-03-10T09:55:00Z\", files: [] },\n }),\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-10T10:00:00Z\",\n message: { content: \"test\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-10T10:01:00Z\" }),\n ];\n fs.writeFileSync(filePath, lines.join(\"\\n\"));\n\n const session = readSession(filePath, \"/test\");\n expect(session.sessionStart.toISOString()).toBe(\"2026-03-10T09:55:00.000Z\");\n expect(session.lastActive.toISOString()).toBe(\"2026-03-10T10:01:00.000Z\");\n });\n\n it(\"should extract lastUserMessage from session entries\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"user-msg.jsonl\");\n const lines = [\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-10T10:00:00Z\",\n message: { content: \"first question\" },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-10T10:01:00Z\" }),\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-10T10:02:00Z\",\n message: { content: [{ type: \"text\", text: \"second question\" }] },\n }),\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-10T10:03:00Z\" }),\n ];\n fs.writeFileSync(filePath, lines.join(\"\\n\"));\n\n const session = readSession(filePath, \"/test\");\n expect(session.lastUserMessage).toBe(\"second question\");\n });\n\n it(\"should use lastCwd as projectPath when projectPath is empty\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"no-project.jsonl\");\n const lines = [\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-10T10:00:00Z\",\n cwd: \"/derived/path\",\n message: { content: \"test\" },\n }),\n ];\n fs.writeFileSync(filePath, lines.join(\"\\n\"));\n\n const session = readSession(filePath, \"\");\n expect(session.projectPath).toBe(\"/derived/path\");\n });\n\n it(\"should handle malformed JSON lines gracefully\", () => {\n const readSession = (adapter as any).parser.readSession.bind((adapter as any).parser);\n\n const filePath = path.join(tmpDir, \"malformed.jsonl\");\n const lines = [\n \"not json\",\n JSON.stringify({ type: \"assistant\", timestamp: \"2026-03-10T10:00:00Z\" }),\n ];\n fs.writeFileSync(filePath, lines.join(\"\\n\"));\n\n const session = readSession(filePath, \"/test\");\n expect(session).not.toBeNull();\n expect(session.lastEntryType).toBe(\"assistant\");\n });\n });\n });\n\n describe(\"getConversation\", () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-conv-\"));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeJsonl(lines: object[]): string {\n const filePath = path.join(tmpDir, \"session.jsonl\");\n fs.writeFileSync(filePath, lines.map((l) => JSON.stringify(l)).join(\"\\n\"));\n return filePath;\n }\n\n it(\"should parse user and assistant text messages\", () => {\n const filePath = writeJsonl([\n { type: \"user\", timestamp: \"2026-03-27T10:00:00Z\", message: { content: \"Hello\" } },\n {\n type: \"assistant\",\n timestamp: \"2026-03-27T10:00:05Z\",\n message: { content: [{ type: \"text\", text: \"Hi there!\" }] },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0]).toEqual({\n role: \"user\",\n content: \"Hello\",\n timestamp: \"2026-03-27T10:00:00Z\",\n });\n expect(messages[1]).toEqual({\n role: \"assistant\",\n content: \"Hi there!\",\n timestamp: \"2026-03-27T10:00:05Z\",\n });\n });\n\n it(\"should skip metadata entry types\", () => {\n const filePath = writeJsonl([\n { type: \"file-history-snapshot\", timestamp: \"2026-03-27T10:00:00Z\", snapshot: {} },\n { type: \"last-prompt\", timestamp: \"2026-03-27T10:00:00Z\" },\n { type: \"user\", timestamp: \"2026-03-27T10:00:01Z\", message: { content: \"Fix bug\" } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].content).toBe(\"Fix bug\");\n });\n\n it(\"should skip progress and thinking entries\", () => {\n const filePath = writeJsonl([\n { type: \"user\", timestamp: \"2026-03-27T10:00:00Z\", message: { content: \"Hello\" } },\n { type: \"progress\", timestamp: \"2026-03-27T10:00:01Z\", data: {} },\n { type: \"thinking\", timestamp: \"2026-03-27T10:00:02Z\" },\n {\n type: \"assistant\",\n timestamp: \"2026-03-27T10:00:03Z\",\n message: { content: [{ type: \"text\", text: \"Done\" }] },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0].role).toBe(\"user\");\n expect(messages[1].role).toBe(\"assistant\");\n });\n\n it(\"should include system messages\", () => {\n const filePath = writeJsonl([\n {\n type: \"system\",\n timestamp: \"2026-03-27T10:00:00Z\",\n message: { content: \"System initialized\" },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0]).toEqual({\n role: \"system\",\n content: \"System initialized\",\n timestamp: \"2026-03-27T10:00:00Z\",\n });\n });\n\n it(\"should skip tool_use and tool_result blocks in default mode\", () => {\n const filePath = writeJsonl([\n {\n type: \"assistant\",\n timestamp: \"2026-03-27T10:00:00Z\",\n message: {\n content: [\n { type: \"text\", text: \"Let me read the file.\" },\n { type: \"tool_use\", name: \"Read\", input: { file_path: \"/src/app.ts\" } },\n ],\n },\n },\n {\n type: \"user\",\n timestamp: \"2026-03-27T10:00:01Z\",\n message: {\n content: [\n { type: \"tool_result\", tool_use_id: \"toolu_1\", content: \"file contents here\" },\n ],\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].content).toBe(\"Let me read the file.\");\n });\n\n it(\"should include tool_use and tool_result blocks in verbose mode\", () => {\n const filePath = writeJsonl([\n {\n type: \"assistant\",\n timestamp: \"2026-03-27T10:00:00Z\",\n message: {\n content: [\n { type: \"text\", text: \"Let me read the file.\" },\n { type: \"tool_use\", name: \"Read\", input: { file_path: \"/src/app.ts\" } },\n ],\n },\n },\n {\n type: \"user\",\n timestamp: \"2026-03-27T10:00:01Z\",\n message: {\n content: [\n { type: \"tool_result\", tool_use_id: \"toolu_1\", content: \"file contents here\" },\n ],\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath, { verbose: true });\n expect(messages).toHaveLength(2);\n expect(messages[0].content).toContain(\"[Tool: Read]\");\n expect(messages[0].content).toContain(\"/src/app.ts\");\n expect(messages[1].content).toContain(\"[Tool Result]\");\n });\n\n it(\"should handle tool_result errors in verbose mode\", () => {\n const filePath = writeJsonl([\n {\n type: \"user\",\n timestamp: \"2026-03-27T10:00:00Z\",\n message: {\n content: [\n {\n type: \"tool_result\",\n tool_use_id: \"toolu_1\",\n content: \"Something went wrong\",\n is_error: true,\n },\n ],\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath, { verbose: true });\n expect(messages).toHaveLength(1);\n expect(messages[0].content).toContain(\"[Tool Error]\");\n });\n\n it(\"should handle malformed JSON lines gracefully\", () => {\n const filePath = path.join(tmpDir, \"malformed.jsonl\");\n fs.writeFileSync(\n filePath,\n [\n JSON.stringify({\n type: \"user\",\n timestamp: \"2026-03-27T10:00:00Z\",\n message: { content: \"Hello\" },\n }),\n \"this is not valid json\",\n JSON.stringify({\n type: \"assistant\",\n timestamp: \"2026-03-27T10:00:01Z\",\n message: { content: [{ type: \"text\", text: \"World\" }] },\n }),\n ].join(\"\\n\"),\n );\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n });\n\n it(\"should return empty array for missing file\", () => {\n const messages = adapter.getConversation(\"/nonexistent/path.jsonl\");\n expect(messages).toEqual([]);\n });\n\n it(\"should return empty array for empty file\", () => {\n const filePath = path.join(tmpDir, \"empty.jsonl\");\n fs.writeFileSync(filePath, \"\");\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([]);\n });\n\n it(\"should filter noise messages from user entries\", () => {\n const filePath = writeJsonl([\n {\n type: \"user\",\n timestamp: \"2026-03-27T10:00:00Z\",\n message: { content: [{ type: \"text\", text: \"[Request interrupted by user]\" }] },\n },\n { type: \"user\", timestamp: \"2026-03-27T10:00:01Z\", message: { content: \"Tool loaded.\" } },\n { type: \"user\", timestamp: \"2026-03-27T10:00:02Z\", message: { content: \"Real question\" } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].content).toBe(\"Real question\");\n });\n });\n\n describe(\"listSessions\", () => {\n let tmpDir: string;\n let projectsDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"claude-list-\"));\n projectsDir = path.join(tmpDir, \"projects\");\n fs.mkdirSync(projectsDir, { recursive: true });\n (adapter as any).projectsDir = projectsDir;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeSession(projectDir: string, sessionId: string, lines: object[]): string {\n fs.mkdirSync(projectDir, { recursive: true });\n const filePath = path.join(projectDir, `${sessionId}.jsonl`);\n fs.writeFileSync(filePath, lines.map((l) => JSON.stringify(l)).join(\"\\n\"));\n return filePath;\n }\n\n it(\"returns empty when projects dir does not exist\", async () => {\n fs.rmSync(projectsDir, { recursive: true, force: true });\n const result = await adapter.listSessions();\n expect(result).toEqual([]);\n });\n\n it(\"returns sessions from a single cwd-scoped project dir\", async () => {\n const cwd = \"/Users/test/proj\";\n const projDir = path.join(projectsDir, \"-Users-test-proj\");\n const filePath = writeSession(projDir, \"sess-1\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd,\n message: { content: \"first prompt\" },\n },\n { type: \"assistant\", timestamp: \"2025-01-01T00:01:00Z\" },\n ]);\n\n const result = await adapter.listSessions({ cwd });\n\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: \"claude\",\n sessionId: \"sess-1\",\n cwd,\n firstUserMessage: \"first prompt\",\n sessionFilePath: filePath,\n });\n expect(result[0].lastActive).toBeInstanceOf(Date);\n expect(result[0].startedAt).toBeInstanceOf(Date);\n });\n\n it(\"lists sessions from all project dirs when no cwd filter\", async () => {\n const cwdA = \"/Users/test/proj-a\";\n const cwdB = \"/Users/test/proj-b\";\n writeSession(path.join(projectsDir, \"-Users-test-proj-a\"), \"a\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd: cwdA,\n message: { content: \"msg-a\" },\n },\n ]);\n writeSession(path.join(projectsDir, \"-Users-test-proj-b\"), \"b\", [\n {\n type: \"user\",\n timestamp: \"2025-01-02T00:00:00Z\",\n cwd: cwdB,\n message: { content: \"msg-b\" },\n },\n ]);\n\n const result = await adapter.listSessions();\n\n expect(result).toHaveLength(2);\n expect(result.map((r) => r.sessionId).sort()).toEqual([\"a\", \"b\"]);\n const cwds = result.map((r) => r.cwd).sort();\n expect(cwds).toEqual([cwdA, cwdB]);\n });\n\n it(\"finds an exact session ID without returning other project sessions\", async () => {\n const wantedPath = writeSession(path.join(projectsDir, \"-repo-a\"), \"wanted\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd: \"/repo-a\",\n message: { content: \"wanted prompt\" },\n },\n ]);\n writeSession(path.join(projectsDir, \"-repo-b\"), \"other\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd: \"/repo-b\",\n message: { content: \"other prompt\" },\n },\n ]);\n\n await expect(adapter.findSessionsById(\"wanted\")).resolves.toEqual([\n expect.objectContaining({ sessionId: \"wanted\", sessionFilePath: wantedPath }),\n ]);\n });\n\n it(\"drops sessions whose recorded cwd does not match opts.cwd (strict equality)\", async () => {\n const cwdReal = \"/Users/test/foo\";\n const cwdRequested = \"/Users/test/foo/sub\";\n writeSession(path.join(projectsDir, \"-Users-test-foo\"), \"s\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd: cwdReal,\n message: { content: \"hi\" },\n },\n ]);\n\n // Encoded dir for the requested cwd doesn't exist → return []\n const result = await adapter.listSessions({ cwd: cwdRequested });\n expect(result).toEqual([]);\n });\n\n it(\"drops sessions whose recorded cwd disagrees with the encoded dir\", async () => {\n // Edge case: encoded dir lookup matches, but session content\n // records a different cwd. Strict-equality filter must reject.\n const requested = \"/Users/test/proj\";\n const projDir = path.join(projectsDir, \"-Users-test-proj\");\n writeSession(projDir, \"s\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd: \"/different/path\",\n message: { content: \"mismatch\" },\n },\n ]);\n\n const result = await adapter.listSessions({ cwd: requested });\n expect(result).toEqual([]);\n });\n\n it(\"finds sessions whose recorded cwd lives in a different encoded dir (worktree case)\", async () => {\n // Real-world case: Claude Code is launched in /repo, then chdirs into\n // /repo/.worktrees/feature. The session file is stored under the\n // ENCODED launch dir, but its content records the worktree path.\n // listSessions({ cwd: worktree }) must still find it.\n const launchDir = path.join(projectsDir, \"-repo\");\n const worktreeCwd = \"/repo/.worktrees/feature\";\n writeSession(launchDir, \"wt\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd: worktreeCwd,\n message: { content: \"in worktree\" },\n },\n ]);\n\n const result = await adapter.listSessions({ cwd: worktreeCwd });\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n sessionId: \"wt\",\n cwd: worktreeCwd,\n firstUserMessage: \"in worktree\",\n });\n });\n\n it(\"skips malformed session files\", async () => {\n const cwd = \"/Users/test/p\";\n const projDir = path.join(projectsDir, \"-Users-test-p\");\n fs.mkdirSync(projDir, { recursive: true });\n fs.writeFileSync(path.join(projDir, \"bad.jsonl\"), \"not valid json\");\n writeSession(projDir, \"good\", [\n { type: \"user\", timestamp: \"2025-01-01T00:00:00Z\", cwd, message: { content: \"ok\" } },\n ]);\n\n const result = await adapter.listSessions({ cwd });\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe(\"good\");\n });\n\n it(\"captures first user message after filtering noise\", async () => {\n const cwd = \"/Users/test/q\";\n writeSession(path.join(projectsDir, \"-Users-test-q\"), \"s\", [\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:00Z\",\n cwd,\n message: { content: \"Tool loaded.\" },\n },\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:01Z\",\n cwd,\n message: { content: \"real first prompt\" },\n },\n {\n type: \"user\",\n timestamp: \"2025-01-01T00:00:02Z\",\n cwd,\n message: { content: \"second prompt\" },\n },\n ]);\n\n const result = await adapter.listSessions({ cwd });\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe(\"real first prompt\");\n });\n\n it(\"returns empty firstUserMessage when no user message exists\", async () => {\n const cwd = \"/Users/test/empty\";\n writeSession(path.join(projectsDir, \"-Users-test-empty\"), \"s\", [\n { type: \"assistant\", timestamp: \"2025-01-01T00:00:00Z\" },\n ]);\n\n const result = await adapter.listSessions({ cwd });\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe(\"\");\n });\n });\n});\n"],"names":["fs","path","ClaudeCodeAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","batchGetSessionFileBirthtimes","matchProcessesToSessions","generateAgentName","os","vi","mock","importOriginal","actual","fn","importActual","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedBatchGetSessionFileBirthtimes","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","adapter","beforeEach","mockReset","mockImplementation","procs","names","flatMap","name","cwd","pid","folder","basename","it","expect","type","toBe","processInfo","command","tty","canHandle","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","projectsDir","toHaveLength","toMatchObject","status","IDLE","projectPath","sessionId","summary","startTime","Date","tmpDir","mkdtempSync","join","tmpdir","projDir","mkdirSync","recursive","sessionFile","writeFileSync","JSON","stringify","timestamp","message","content","sessionFiles","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","matches","process","session","deltaMs","WAITING","toContain","rmSync","force","projDirA","projDirB","now","matched","find","a","unmatched","jsonlPath","toISOString","sessionsDir","not","toHaveBeenCalled","startedAt","kind","entrypoint","permissionMode","waitingFor","spyOn","parser","mockReturnValueOnce","restoreAllMocks","legacySessionFile","projAlpha","projBeta","directSessionId","directJsonl","legacySessionId","legacyJsonl","toHaveBeenCalledTimes","calls","alpha","beta","determineStatus","bind","sessionStart","lastActive","isInterrupted","UNKNOWN","lastEntryType","RUNNING","oldDate","extract","text","undefined","toBeUndefined","msg","parse","afterEach","readSession","lines","lastCwd","toBeNull","snapshot","files","lastUserMessage","writeJsonl","map","l","messages","getConversation","role","data","input","file_path","tool_use_id","verbose","is_error","writeSession","result","listSessions","firstUserMessage","sessionFilePath","toBeInstanceOf","cwdA","cwdB","r","sort","cwds","wantedPath","findSessionsById","resolves","objectContaining","cwdReal","cwdRequested","requested","launchDir","worktreeCwd"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/adapters/CodexAdapter.test.ts"],"sourcesContent":["import type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { CodexAdapter } from \"../../providers/codex/CodexAdapter.js\";\nimport { AgentStatus, type ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../../utils/AgentRegistry.js\";\nimport { batchGetSessionFileBirthtimes, type SessionFile } from \"../../utils/session.js\";\nimport {\n captureProcessSnapshot,\n enrichProcesses,\n listAgentProcesses,\n} from \"../../utils/process.js\";\nimport {\n generateAgentName,\n matchProcessesToSessions,\n type MatchResult,\n} from \"../../utils/matching.js\";\n\nvi.mock(\"../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../utils/session.js\", async () => {\n const actual = (await vi.importActual(\n \"../../utils/session\",\n )) as typeof import(\"../../utils/session\");\n return {\n ...actual,\n batchGetSessionFileBirthtimes: vi.fn(),\n };\n});\n\nvi.mock(\"../../utils/matching.js\", () => ({\n matchProcessesToSessions: vi.fn(),\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<\n typeof batchGetSessionFileBirthtimes\n>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<\n typeof matchProcessesToSessions\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"CodexAdapter\", () => {\n let originalHome: string | undefined;\n let tmpHome: string;\n let adapter: CodexAdapter;\n\n beforeEach(() => {\n originalHome = process.env.HOME;\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-adapter-\"));\n process.env.HOME = tmpHome;\n\n adapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, \"agents.json\")));\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedBatchGetSessionFileBirthtimes.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((processes) => processes);\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (cwd, pid) => `${path.basename(cwd) || \"unknown\"} (${pid})`,\n );\n });\n\n afterEach(() => {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n it(\"exposes codex type and handles Codex executable names only\", () => {\n expect(adapter.type).toBe(\"codex\");\n expect(adapter.canHandle({ pid: 1, command: \"codex\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/usr/local/bin/CODEX --sandbox workspace-write\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n expect(\n adapter.canHandle({ pid: 3, command: \"node app.js\", cwd: \"/repo\", tty: \"ttys003\" }),\n ).toBe(false);\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /worktrees/feature-codex-adapter-agent-manager-package/server.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n });\n\n it(\"returns no agents when no Codex process is running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n await expect(adapter.detectAgents()).resolves.toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"codex\");\n });\n\n it(\"returns process-only agents when no session files are discovered\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"codex\", cwd: \"/repo-a\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n\n await expect(adapter.detectAgents()).resolves.toMatchObject([\n {\n type: \"codex\",\n status: AgentStatus.RUNNING,\n pid: 100,\n projectPath: \"/repo-a\",\n sessionId: \"pid-100\",\n summary: \"Codex process running\",\n },\n ]);\n });\n\n it(\"maps a running Codex process through legacy session matching\", async () => {\n const processInfo: ProcessInfo = {\n pid: 100,\n command: \"codex\",\n cwd: \"/repo-a\",\n tty: \"ttys001\",\n startTime: new Date(\"2026-03-18T15:00:00.000Z\"),\n };\n const { sessionFile, dateDir } = writeSession(\"sess-abc\", \"/repo-a\", [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Implement adapter flow\" },\n },\n ]);\n const candidate: SessionFile = {\n sessionId: \"sess-abc\",\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date(\"2026-03-18T15:00:05Z\").getTime(),\n resolvedCwd: \"\",\n };\n const matches: MatchResult[] = [\n { process: processInfo, session: { ...candidate, resolvedCwd: \"/repo-a\" }, deltaMs: 5000 },\n ];\n\n mockedListAgentProcesses.mockReturnValue([processInfo]);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([candidate]);\n mockedMatchProcessesToSessions.mockReturnValue(matches);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"codex\",\n status: AgentStatus.RUNNING,\n pid: 100,\n projectPath: \"/repo-a\",\n sessionId: \"sess-abc\",\n summary: \"Implement adapter flow\",\n });\n });\n\n it(\"maps resumed sessions directly by id\", async () => {\n const sessionId = \"019eabed-4079-7071-9531-b853ddd9914e\";\n const processInfo: ProcessInfo = {\n pid: 88018,\n command: `codex resume ${sessionId}`,\n cwd: \"/repo-a\",\n tty: \"ttys001\",\n startTime: new Date(\"2026-06-10T12:00:00.000Z\"),\n };\n const { sessionFile } = writeSession(\n sessionId,\n \"/repo-a\",\n [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"resumed codex conversation\" },\n },\n ],\n \"2026/06/09\",\n );\n\n mockedListAgentProcesses.mockReturnValue([processInfo]);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"codex\",\n pid: 88018,\n sessionId,\n projectPath: \"/repo-a\",\n sessionFilePath: sessionFile,\n summary: \"resumed codex conversation\",\n });\n });\n\n it(\"uses hook session mapping before a stale registry entry for the same pid\", async () => {\n const registry = new AgentRegistry(path.join(tmpHome, \"agents.json\"));\n const staleSession = path.join(tmpHome, \"stale.jsonl\");\n fs.writeFileSync(\n staleSession,\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: \"stale\", timestamp: new Date().toISOString(), cwd: \"/repo-stale\" },\n }),\n JSON.stringify({\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"stale\" },\n }),\n ].join(\"\\n\"),\n );\n registry.register(registryEntry({ sessionFilePath: staleSession }));\n\n const mappedAdapter = new CodexAdapter(registry);\n const { sessionFile } = writeSession(\n \"current\",\n \"/repo-current\",\n [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"agent_message\", message: \"Hello from current mapping\" },\n },\n ],\n \"2026/06/26\",\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({ 100: sessionFile }),\n );\n\n mockedListAgentProcesses.mockReturnValue([\n { pid: 100, command: \"codex\", cwd: \"/repo-current\", tty: \"ttys001\", startTime: new Date() },\n ]);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 100,\n sessionId: \"current\",\n sessionFilePath: sessionFile,\n summary: \"Hello from current mapping\",\n });\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it(\"uses a valid registry cache entry before scanning sessions\", async () => {\n const registry = new AgentRegistry(path.join(tmpHome, \"agents.json\"));\n const { sessionFile } = writeSession(\"cached\", \"/repo-a\", [\n {\n type: \"event\",\n timestamp: new Date().toISOString(),\n payload: { type: \"token_count\", message: \"Hello from cache\" },\n },\n ]);\n registry.register(registryEntry({ sessionId: \"cached\", sessionFilePath: sessionFile }));\n\n const cachedAdapter = new CodexAdapter(registry);\n mockedListAgentProcesses.mockReturnValue([\n { pid: 100, command: \"codex\", cwd: \"/repo-a\", tty: \"ttys001\", startTime: new Date() },\n ]);\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"codex\",\n pid: 100,\n sessionId: \"cached\",\n sessionFilePath: sessionFile,\n summary: \"Hello from cache\",\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n });\n\n it(\"delegates conversation parsing and historical session listing\", async () => {\n const { sessionFile } = writeSession(\n \"listed\",\n \"/repo\",\n [\n {\n type: \"event\",\n timestamp: \"2025-01-01T00:00:01Z\",\n payload: { type: \"user_message\", message: \"first user\" },\n },\n {\n type: \"event\",\n timestamp: \"2025-01-01T00:00:02Z\",\n payload: { type: \"agent_message\", message: \"answer\" },\n },\n ],\n \"2025/01/01\",\n );\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: \"user\", content: \"first user\", timestamp: \"2025-01-01T00:00:01Z\" },\n { role: \"assistant\", content: \"answer\", timestamp: \"2025-01-01T00:00:02Z\" },\n ]);\n await expect(adapter.listSessions({ cwd: \"/repo\" })).resolves.toMatchObject([\n {\n type: \"codex\",\n sessionId: \"listed\",\n cwd: \"/repo\",\n firstUserMessage: \"first user\",\n sessionFilePath: sessionFile,\n },\n ]);\n await expect(adapter.findSessionsById(\"listed\")).resolves.toMatchObject([\n {\n type: \"codex\",\n sessionId: \"listed\",\n sessionFilePath: sessionFile,\n },\n ]);\n });\n\n function writeSession(\n sessionId: string,\n cwd: string,\n entries: object[],\n day = \"2026/03/18\",\n ): { sessionFile: string; dateDir: string } {\n const dateDir = path.join(tmpHome, \".codex\", \"sessions\", ...day.split(\"/\"));\n fs.mkdirSync(dateDir, { recursive: true });\n const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n sessionFile,\n [\n JSON.stringify({\n type: \"session_meta\",\n payload: { id: sessionId, timestamp: \"2026-03-18T15:00:00Z\", cwd },\n }),\n ...entries.map((entry) => JSON.stringify(entry)),\n ].join(\"\\n\"),\n );\n return { sessionFile, dateDir };\n }\n\n function registryEntry(overrides: Partial<RegistryEntry> = {}): RegistryEntry {\n return {\n name: \"codex-100\",\n type: \"codex\",\n pid: 100,\n runtime: \"tmux\",\n runtimeRef: null,\n cwd: \"/repo-a\",\n startedAt: \"2026-05-30T00:00:00.000Z\",\n sessionId: \"cached\",\n sessionFilePath: \"\",\n ...overrides,\n };\n }\n});\n"],"names":["fs","os","path","CodexAdapter","AgentStatus","AgentRegistry","batchGetSessionFileBirthtimes","captureProcessSnapshot","enrichProcesses","listAgentProcesses","generateAgentName","matchProcessesToSessions","vi","mock","importOriginal","actual","fn","importActual","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedBatchGetSessionFileBirthtimes","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","originalHome","tmpHome","adapter","beforeEach","process","env","HOME","mkdtempSync","join","tmpdir","mockReset","mockImplementation","processes","names","flatMap","name","cwd","pid","basename","afterEach","rmSync","recursive","force","it","expect","type","toBe","canHandle","command","tty","mockReturnValue","detectAgents","resolves","toEqual","toHaveBeenCalledWith","toMatchObject","status","RUNNING","projectPath","sessionId","summary","processInfo","startTime","Date","sessionFile","dateDir","writeSession","timestamp","toISOString","payload","message","candidate","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","matches","session","deltaMs","agents","toHaveLength","not","toHaveBeenCalled","sessionFilePath","registry","staleSession","writeFileSync","JSON","stringify","id","register","registryEntry","mappedAdapter","mkdirSync","cachedAdapter","getConversation","role","content","listSessions","firstUserMessage","findSessionsById","entries","day","split","map","entry","overrides","runtime","runtimeRef","startedAt"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/adapters/KiroAdapter.test.ts"],"sourcesContent":["/**\n * Tests for KiroAdapter\n */\n\nimport type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { KiroAdapter } from \"../../adapters/KiroAdapter.js\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n listAgentProcesses,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"../../utils/process.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\n\nvi.mock(\"../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../utils/matching.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../utils/matching.js\");\n return {\n ...actual,\n generateAgentName: vi.fn(),\n };\n});\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"KiroAdapter\", () => {\n let adapter: KiroAdapter;\n let tmpHome: string;\n let sessionsDir: string;\n\n beforeEach(() => {\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), \"kiro-adapter-test-\"));\n process.env.HOME = tmpHome;\n sessionsDir = path.join(tmpHome, \".kiro\", \"sessions\", \"cli\");\n fs.mkdirSync(sessionsDir, { recursive: true });\n\n adapter = new KiroAdapter();\n\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation((cwd: string, pid: number) => {\n const folder = path.basename(cwd) || \"unknown\";\n return `${folder} (${pid})`;\n });\n });\n\n afterEach(() => {\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n describe(\"initialization\", () => {\n it(\"exposes the kiro type and process names\", () => {\n expect(adapter.type).toBe(\"kiro\");\n expect(adapter.processNames).toEqual([\"kiro-cli\", \"kiro\", \"kiro-cli-chat\", \"node\"]);\n });\n });\n\n describe(\"canHandle\", () => {\n it(\"identifies Kiro commands without matching unrelated paths\", () => {\n expect(adapter.canHandle({ pid: 1, command: \"kiro-cli\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/usr/local/bin/kiro --model x\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n expect(\n adapter.canHandle({\n pid: 3,\n command: \"node /opt/kiro/bin/kiro-cli.js\",\n cwd: \"/repo\",\n tty: \"ttys003\",\n }),\n ).toBe(true);\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /repo/feature-kiro-adapter/script.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n expect(\n adapter.canHandle({\n pid: 5,\n command: \"kiro-cli chat\",\n cwd: \"/repo\",\n tty: \"ttys005\",\n }),\n ).toBe(true);\n expect(\n adapter.canHandle({\n pid: 6,\n command: \"bun /opt/kiro/bin/kiro-cli.js\",\n cwd: \"/repo\",\n tty: \"ttys006\",\n }),\n ).toBe(true);\n expect(\n adapter.canHandle({\n pid: 7,\n command: \"node /usr/local/bin/ai-devkit agent start --type kiro\",\n cwd: \"/repo\",\n tty: \"ttys007\",\n }),\n ).toBe(false);\n expect(\n adapter.canHandle({\n pid: 8,\n command: \"node server.js --name kiro\",\n cwd: \"/repo\",\n tty: \"ttys008\",\n }),\n ).toBe(false);\n expect(\n adapter.canHandle({\n pid: 9,\n command: \"kiro-cli-chat acp\",\n cwd: \"/repo\",\n tty: \"ttys009\",\n }),\n ).toBe(false);\n });\n });\n\n describe(\"detectAgents\", () => {\n it(\"returns [] when there are no Kiro processes\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n expect(await adapter.detectAgents()).toEqual([]);\n });\n\n it(\"maps a running Kiro process through its session lock and metadata\", async () => {\n const cwd = \"/repo/project-a\";\n const proc = makeProcess({ pid: 101, cwd: \"/process/cwd\" });\n const updatedAt = new Date().toISOString();\n const sessionFile = writeKiroSession(\n \"sess-101\",\n cwd,\n [prompt(\"implement Kiro adapter\", 1781098057), assistantText(\"working on it\")],\n 101,\n updatedAt,\n );\n mockedCaptureProcessSnapshot.mockResolvedValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"kiro\",\n pid: 101,\n projectPath: cwd,\n sessionId: \"sess-101\",\n summary: \"implement Kiro adapter\",\n status: AgentStatus.WAITING,\n sessionFilePath: sessionFile,\n lastActive: new Date(updatedAt),\n });\n });\n\n it(\"matches a lock held by a kiro-cli-chat acp descendant when bun is not collected\", async () => {\n const cwd = \"/repo/project-a\";\n const sessionFile = writeKiroSession(\n \"sess-acp\",\n cwd,\n [prompt(\"implement Kiro adapter\", 1781098057), assistantText(\"working on it\")],\n 55236,\n );\n const kiro = makeProcess({ pid: 55111, command: \"kiro-cli\", cwd: \"/process/cwd\", ppid: 1 });\n const chat = makeProcess({\n pid: 55168,\n command: \"kiro-cli-chat chat\",\n ppid: 55111,\n tty: \"ttys001\",\n });\n const acp = makeProcess({\n pid: 55236,\n command: \"kiro-cli-chat acp\",\n ppid: 55198,\n tty: \"ttys001\",\n });\n mockedCaptureProcessSnapshot.mockResolvedValue([kiro, chat, acp]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([\n expect.objectContaining({\n type: \"kiro\",\n pid: 55111,\n projectPath: cwd,\n sessionId: \"sess-acp\",\n summary: \"implement Kiro adapter\",\n sessionFilePath: sessionFile,\n }),\n ]);\n });\n\n it(\"walks a collected kiro-cli-chat parent chain to the owning kiro-cli\", async () => {\n const sessionFile = writeKiroSession(\n \"sess-owner\",\n \"/repo/owner\",\n [prompt(\"owned session\", 1781098057)],\n 55236,\n );\n const owner = makeProcess({ pid: 55111, command: \"kiro-cli\", cwd: \"/repo/owner\", ppid: 1 });\n const other = makeProcess({ pid: 66111, command: \"kiro-cli\", cwd: \"/repo/other\", ppid: 1 });\n const chat = makeProcess({ pid: 55168, command: \"kiro-cli-chat chat\", ppid: 55111 });\n const acp = makeProcess({ pid: 55236, command: \"kiro-cli-chat acp\", ppid: 55168 });\n mockedCaptureProcessSnapshot.mockResolvedValue([owner, other, chat, acp]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([\n expect.objectContaining({\n pid: 55111,\n projectPath: \"/repo/owner\",\n sessionId: \"sess-owner\",\n sessionFilePath: sessionFile,\n }),\n expect.objectContaining({ pid: 66111, sessionId: \"pid-66111\" }),\n ]);\n });\n\n it(\"does not attach a session through tty ?? or an ambiguous tty\", async () => {\n writeKiroSession(\"sess-unknown-tty\", \"/repo/unknown\", [prompt(\"hello\", 1781098057)], 55236);\n const unknownTty = makeProcess({ pid: 55111, command: \"kiro-cli\", tty: \"??\", ppid: 1 });\n const unknownAcp = makeProcess({\n pid: 55236,\n command: \"kiro-cli-chat acp\",\n tty: \"??\",\n ppid: 55198,\n });\n mockedCaptureProcessSnapshot.mockResolvedValue([unknownTty, unknownAcp]);\n\n expect(await adapter.detectAgents()).toEqual([\n expect.objectContaining({ pid: 55111, sessionId: \"pid-55111\" }),\n ]);\n\n writeKiroSession(\"sess-shared-tty\", \"/repo/shared\", [prompt(\"hello\", 1781098057)], 66236);\n const first = makeProcess({ pid: 55111, command: \"kiro-cli\", tty: \"ttys001\", ppid: 1 });\n const second = makeProcess({ pid: 66111, command: \"kiro-cli\", tty: \"ttys001\", ppid: 1 });\n const sharedAcp = makeProcess({\n pid: 66236,\n command: \"kiro-cli-chat acp\",\n tty: \"ttys001\",\n ppid: 55198,\n });\n mockedCaptureProcessSnapshot.mockResolvedValue([first, second, sharedAcp]);\n\n expect(await adapter.detectAgents()).toEqual([\n expect.objectContaining({ pid: 55111, sessionId: \"pid-55111\" }),\n expect.objectContaining({ pid: 66111, sessionId: \"pid-66111\" }),\n ]);\n });\n\n it(\"uses a supplied process snapshot instead of scanning again\", async () => {\n const proc = makeProcess({ pid: 606, cwd: \"/repo/context\" });\n mockedCaptureProcessSnapshot.mockResolvedValue([makeProcess({ pid: 999 })]);\n\n const agents = await adapter.detectAgents({ processes: [proc] });\n\n expect(mockedCaptureProcessSnapshot).not.toHaveBeenCalled();\n expect(agents).toEqual([\n expect.objectContaining({\n pid: 606,\n projectPath: \"/repo/context\",\n sessionId: \"pid-606\",\n }),\n ]);\n });\n\n it(\"uses only a lock whose PID belongs to a running Kiro process\", async () => {\n writeKiroSession(\"ended-session\", \"/repo/ended\", [prompt(\"old conversation\", 1781098057)]);\n writeKiroSession(\n \"other-process\",\n \"/repo/other\",\n [prompt(\"other conversation\", 1781098057)],\n 999,\n );\n const proc = makeProcess({ pid: 202, cwd: \"/repo/current\" });\n mockedCaptureProcessSnapshot.mockResolvedValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([\n expect.objectContaining({\n pid: 202,\n projectPath: \"/repo/current\",\n sessionId: \"pid-202\",\n summary: \"Kiro process running\",\n }),\n ]);\n });\n\n it(\"ignores malformed lock files\", async () => {\n writeKiroSession(\"bad-lock\", \"/repo/project\", [prompt(\"hello\", 1781098057)]);\n fs.writeFileSync(path.join(sessionsDir, \"bad-lock.lock\"), \"{bad json\");\n const proc = makeProcess({ pid: 303, cwd: \"/repo/project\" });\n mockedCaptureProcessSnapshot.mockResolvedValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0]).toMatchObject({ sessionId: \"pid-303\" });\n });\n\n it(\"reports running while the latest assistant event invokes a tool\", async () => {\n writeKiroSession(\n \"tool-session\",\n \"/repo/project\",\n [\n prompt(\"inspect the file\", Math.floor(Date.now() / 1000)),\n assistantTool(\"fs_read\", { path: \"/repo/project/file.ts\" }),\n ],\n 404,\n new Date().toISOString(),\n );\n const proc = makeProcess({ pid: 404, cwd: \"/repo/project\" });\n mockedCaptureProcessSnapshot.mockResolvedValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0].status).toBe(AgentStatus.RUNNING);\n });\n\n it(\"returns a process-only agent when the locked transcript is missing\", async () => {\n fs.writeFileSync(path.join(sessionsDir, \"missing.lock\"), JSON.stringify({ pid: 505 }));\n const proc = makeProcess({ pid: 505, cwd: \"/repo/project-e\" });\n mockedCaptureProcessSnapshot.mockResolvedValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([\n expect.objectContaining({\n type: \"kiro\",\n status: AgentStatus.RUNNING,\n pid: 505,\n projectPath: \"/repo/project-e\",\n sessionId: \"pid-505\",\n summary: \"Kiro process running\",\n }),\n ]);\n });\n });\n\n describe(\"getConversation\", () => {\n it(\"reads real Kiro prompt and assistant message envelopes\", () => {\n const sessionFile = writeKiroSession(\"conversation\", \"/repo/project-f\", [\n prompt(\"hello kiro\", 1781098057),\n assistantText(\"Hello! How can I help?\"),\n \"{not json\",\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: \"user\", content: \"hello kiro\", timestamp: \"2026-06-10T13:27:37.000Z\" },\n { role: \"assistant\", content: \"Hello! How can I help?\", timestamp: undefined },\n ]);\n });\n\n it(\"includes Kiro tool use and results only in verbose conversation mode\", () => {\n const sessionFile = writeKiroSession(\"tools\", \"/repo/project-tools\", [\n prompt(\"read package.json\", 1781098057),\n assistantTool(\"fs_read\", { path: \"package.json\" }),\n toolResult(\"contents\", \"success\"),\n assistantText(\"Done.\"),\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: \"user\", content: \"read package.json\", timestamp: \"2026-06-10T13:27:37.000Z\" },\n { role: \"assistant\", content: \"Done.\", timestamp: undefined },\n ]);\n expect(adapter.getConversation(sessionFile, { verbose: true })).toEqual([\n { role: \"user\", content: \"read package.json\", timestamp: \"2026-06-10T13:27:37.000Z\" },\n {\n role: \"assistant\",\n content: '[Tool: fs_read] {\"path\":\"package.json\"}',\n timestamp: undefined,\n },\n { role: \"system\", content: \"[Tool Result] contents\", timestamp: undefined },\n { role: \"assistant\", content: \"Done.\", timestamp: undefined },\n ]);\n });\n });\n\n describe(\"listSessions\", () => {\n it(\"lists historical sessions using metadata and applies cwd filtering\", async () => {\n const matchingCwd = \"/repo/project-g\";\n const matchingSession = writeKiroSession(\"sess-g\", matchingCwd, [\n prompt(\"first matching message\", 1781098057),\n assistantText(\"response\"),\n ]);\n writeKiroSession(\"sess-h\", \"/repo/project-h\", [prompt(\"other message\", 1781098057)]);\n\n const sessions = await adapter.listSessions({ cwd: matchingCwd });\n\n expect(sessions).toEqual([\n expect.objectContaining({\n type: \"kiro\",\n sessionId: \"sess-g\",\n cwd: matchingCwd,\n firstUserMessage: \"first matching message\",\n startedAt: new Date(\"2026-06-10T13:27:17.000Z\"),\n lastActive: new Date(\"2026-06-10T13:27:40.000Z\"),\n sessionFilePath: matchingSession,\n }),\n ]);\n });\n });\n\n function makeProcess(overrides: Partial<ProcessInfo>): ProcessInfo {\n return {\n pid: 1,\n command: \"kiro-cli chat\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n startTime: new Date(\"2026-06-10T13:27:17.000Z\"),\n ...overrides,\n };\n }\n\n function writeKiroSession(\n sessionId: string,\n cwd: string,\n entries: Array<Record<string, unknown> | string>,\n pid?: number,\n updatedAt = \"2026-06-10T13:27:40.000Z\",\n ): string {\n fs.writeFileSync(\n path.join(sessionsDir, `${sessionId}.json`),\n JSON.stringify({\n session_id: sessionId,\n cwd,\n created_at: \"2026-06-10T13:27:17.000Z\",\n updated_at: updatedAt,\n title: \"Session title\",\n }),\n );\n const filePath = path.join(sessionsDir, `${sessionId}.jsonl`);\n fs.writeFileSync(\n filePath,\n entries\n .map((entry) => (typeof entry === \"string\" ? entry : JSON.stringify(entry)))\n .join(\"\\n\"),\n );\n if (pid !== undefined) {\n fs.writeFileSync(\n path.join(sessionsDir, `${sessionId}.lock`),\n JSON.stringify({\n pid,\n started_at: \"2026-06-10T13:27:17.000Z\",\n }),\n );\n }\n return filePath;\n }\n\n function prompt(text: string, timestamp: number): Record<string, unknown> {\n return {\n version: \"v1\",\n kind: \"Prompt\",\n data: {\n content: [{ kind: \"text\", data: text }],\n meta: { timestamp },\n },\n };\n }\n\n function assistantText(text: string): Record<string, unknown> {\n return {\n version: \"v1\",\n kind: \"AssistantMessage\",\n data: { content: [{ kind: \"text\", data: text }] },\n };\n }\n\n function assistantTool(name: string, input: Record<string, unknown>): Record<string, unknown> {\n return {\n version: \"v1\",\n kind: \"AssistantMessage\",\n data: {\n content: [\n {\n kind: \"toolUse\",\n data: { toolUseId: \"tool-1\", name, input },\n },\n ],\n },\n };\n }\n\n function toolResult(result: string, status: string): Record<string, unknown> {\n return {\n version: \"v1\",\n kind: \"ToolResults\",\n data: {\n content: [\n {\n kind: \"toolResult\",\n data: { toolUseId: \"tool-1\", status, result },\n },\n ],\n },\n };\n }\n});\n"],"names":["fs","os","path","KiroAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","generateAgentName","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedGenerateAgentName","describe","adapter","tmpHome","sessionsDir","beforeEach","mkdtempSync","join","tmpdir","process","env","HOME","mkdirSync","recursive","mockReset","mockImplementation","procs","names","flatMap","name","cwd","pid","folder","basename","afterEach","rmSync","force","it","expect","type","toBe","processNames","toEqual","canHandle","command","tty","mockReturnValue","detectAgents","proc","makeProcess","updatedAt","Date","toISOString","sessionFile","writeKiroSession","prompt","assistantText","mockResolvedValue","agents","toHaveLength","toMatchObject","projectPath","sessionId","summary","status","WAITING","sessionFilePath","lastActive","kiro","ppid","chat","acp","objectContaining","owner","other","unknownTty","unknownAcp","first","second","sharedAcp","processes","not","toHaveBeenCalled","writeFileSync","Math","floor","now","assistantTool","RUNNING","JSON","stringify","getConversation","role","content","timestamp","undefined","toolResult","verbose","matchingCwd","matchingSession","sessions","listSessions","firstUserMessage","startedAt","overrides","startTime","entries","session_id","created_at","updated_at","title","filePath","map","entry","started_at","text","version","kind","data","meta","input","toolUseId","result"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/durable/CodexCliProbe.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\n\ndescribe(\"CodexCliProbe\", () => {\n it(\"validates version, exec JSON/stdin, and resume capabilities without a model call\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexCliProbe\");\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"codex-cli 0.147.0\", stderr: \"\" })\n .mockResolvedValueOnce({\n stdout: \"Usage: codex exec [PROMPT]\\n--json\\n- read from stdin\\nresume\",\n stderr: \"\",\n })\n .mockResolvedValueOnce({\n stdout: \"Usage: codex exec resume [SESSION_ID] [PROMPT]\\n--json\\n- stdin\",\n stderr: \"\",\n });\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n\n await expect(new Probe({ executable: \"fake-codex\", exec }).validate()).resolves.toEqual({\n executable: \"fake-codex\",\n version: \"codex-cli 0.147.0\",\n });\n expect(exec.mock.calls).toEqual([\n [\"fake-codex\", [\"--version\"]],\n [\"fake-codex\", [\"exec\", \"--help\"]],\n [\"fake-codex\", [\"exec\", \"resume\", \"--help\"]],\n ]);\n });\n\n it(\"rejects unsupported and unavailable CLIs with bounded sanitized errors\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const unsupported = new Probe({\n exec: vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume\", stderr: \"\" }),\n });\n await expect(unsupported.validate()).rejects.toMatchObject({ code: \"CODEX_CLI_UNSUPPORTED\" });\n const missingCommands = new Probe({\n exec: vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"\", stderr: \"\" }),\n });\n await expect(missingCommands.validate()).rejects.toMatchObject({\n code: \"CODEX_CLI_UNSUPPORTED\",\n });\n\n const unavailable = new Probe({\n exec: vi.fn().mockRejectedValue(new Error(`bad\\0${\"x\".repeat(1000)}`)),\n });\n const error = await unavailable.validate().catch((value: Error & { code: string }) => value);\n expect(error.code).toBe(\"CODEX_CLI_UNAVAILABLE\");\n expect(error.message).not.toContain(\"\\0\");\n expect(error.message.length).toBeLessThan(600);\n });\n\n it(\"reports an empty version response as unknown\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \" \\n\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec --json -\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume --json -\", stderr: \"\" });\n await expect(new Probe({ exec }).validate()).resolves.toMatchObject({ version: \"unknown\" });\n });\n\n it(\"requires a standalone stdin dash rather than accepting flag hyphens\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec --json\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume --json\", stderr: \"\" });\n await expect(new Probe({ exec }).validate()).rejects.toMatchObject({\n code: \"CODEX_CLI_UNSUPPORTED\",\n });\n });\n});\n"],"names":["describe","expect","it","vi","api","toHaveProperty","exec","fn","mockResolvedValueOnce","stdout","stderr","Probe","CodexCliProbe","executable","validate","resolves","toEqual","version","mock","calls","unsupported","rejects","toMatchObject","code","missingCommands","unavailable","mockRejectedValue","Error","repeat","error","catch","value","toBe","message","not","toContain","length","toBeLessThan"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/durable/CodexDurableAgentRepository.test.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { DurableAgentRepository } from \"../../durable/DurableAgentRepository.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst OTHER_SESSION = \"33333333-3333-4333-8333-333333333333\";\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction fixture() {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-durable-repository-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector = { getIdentity: (pid: number) => ({ pid, startedAt: \"owner-start\" }) };\n return {\n cwd,\n repository: new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n }),\n };\n}\n\ndescribe(\"Codex durable-agent repository binding\", () => {\n it(\"creates Codex agents unbound and binds during the owned run\", async () => {\n const { cwd, repository } = fixture();\n const agent = await repository.create({ name: \"reviewer\", cwd, provider: \"codex\" });\n expect(agent).toMatchObject({ provider: \"codex\", mode: \"durable\", providerSessionId: null });\n\n const run = await repository.acquireRun(agent.id);\n const bound = await repository.bindProviderSession(agent.id, run.token, SESSION);\n expect(bound.providerSessionId).toBe(SESSION);\n await expect(\n repository.bindProviderSession(agent.id, run.token, SESSION),\n ).resolves.toMatchObject({ providerSessionId: SESSION });\n });\n\n it(\"rejects invalid, stale, replacement, and duplicate bindings\", async () => {\n const { cwd, repository } = fixture();\n const first = await repository.create({ name: \"first\", cwd, provider: \"codex\" });\n const second = await repository.create({ name: \"second\", cwd, provider: \"codex\" });\n const firstRun = await repository.acquireRun(first.id);\n const secondRun = await repository.acquireRun(second.id);\n\n await expect(repository.bindProviderSession(first.id, \"stale\", SESSION)).rejects.toMatchObject({\n code: \"DURABLE_AGENT_REPOSITORY\",\n });\n await expect(\n repository.bindProviderSession(first.id, firstRun.token, \"invalid\"),\n ).rejects.toMatchObject({ code: \"DURABLE_AGENT_REPOSITORY\" });\n await repository.bindProviderSession(first.id, firstRun.token, SESSION);\n await expect(\n repository.bindProviderSession(first.id, firstRun.token, OTHER_SESSION),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n await expect(\n repository.bindProviderSession(second.id, secondRun.token, SESSION),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","DurableAgentRepository","SESSION","OTHER_SESSION","roots","root","splice","rmSync","recursive","force","fixture","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","processInspector","getIdentity","pid","startedAt","repository","dbPath","agent","create","name","provider","toMatchObject","mode","providerSessionId","run","acquireRun","id","bound","bindProviderSession","token","toBe","resolves","first","second","firstRun","secondRun","rejects","code"],"mappings":"AAAA,OAAOA,QAAQ,UAAU;AACzB,OAAOC,QAAQ,UAAU;AACzB,OAAOC,UAAU,YAAY;AAC7B,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AACzD,SAASC,sBAAsB,QAAQ,0CAA0C;AAEjF,MAAMC,UAAU;AAChB,MAAMC,gBAAgB;AACtB,MAAMC,QAAkB,EAAE;AAE1BP,UAAU;IACR,KAAK,MAAMQ,QAAQD,MAAME,MAAM,CAAC,GAAIZ,GAAGa,MAAM,CAACF,MAAM;QAAEG,WAAW;QAAMC,OAAO;IAAK;AACrF;AAEA,SAASC;IACP,MAAML,OAAOX,GAAGiB,WAAW,CAACf,KAAKgB,IAAI,CAACjB,GAAGkB,MAAM,IAAI;IACnDT,MAAMU,IAAI,CAACT;IACX,MAAMU,MAAMnB,KAAKgB,IAAI,CAACP,MAAM;IAC5BX,GAAGsB,SAAS,CAACD;IACb,MAAME,mBAAmB;QAAEC,aAAa,CAACC,MAAiB,CAAA;gBAAEA;gBAAKC,WAAW;YAAc,CAAA;IAAG;IAC7F,OAAO;QACLL;QACAM,YAAY,IAAIpB,uBAAuB;YACrCqB,QAAQ1B,KAAKgB,IAAI,CAACP,MAAM;YACxBY;QACF;IACF;AACF;AAEAnB,SAAS,0CAA0C;IACjDE,GAAG,+DAA+D;QAChE,MAAM,EAAEe,GAAG,EAAEM,UAAU,EAAE,GAAGX;QAC5B,MAAMa,QAAQ,MAAMF,WAAWG,MAAM,CAAC;YAAEC,MAAM;YAAYV;YAAKW,UAAU;QAAQ;QACjF3B,OAAOwB,OAAOI,aAAa,CAAC;YAAED,UAAU;YAASE,MAAM;YAAWC,mBAAmB;QAAK;QAE1F,MAAMC,MAAM,MAAMT,WAAWU,UAAU,CAACR,MAAMS,EAAE;QAChD,MAAMC,QAAQ,MAAMZ,WAAWa,mBAAmB,CAACX,MAAMS,EAAE,EAAEF,IAAIK,KAAK,EAAEjC;QACxEH,OAAOkC,MAAMJ,iBAAiB,EAAEO,IAAI,CAAClC;QACrC,MAAMH,OACJsB,WAAWa,mBAAmB,CAACX,MAAMS,EAAE,EAAEF,IAAIK,KAAK,EAAEjC,UACpDmC,QAAQ,CAACV,aAAa,CAAC;YAAEE,mBAAmB3B;QAAQ;IACxD;IAEAF,GAAG,+DAA+D;QAChE,MAAM,EAAEe,GAAG,EAAEM,UAAU,EAAE,GAAGX;QAC5B,MAAM4B,QAAQ,MAAMjB,WAAWG,MAAM,CAAC;YAAEC,MAAM;YAASV;YAAKW,UAAU;QAAQ;QAC9E,MAAMa,SAAS,MAAMlB,WAAWG,MAAM,CAAC;YAAEC,MAAM;YAAUV;YAAKW,UAAU;QAAQ;QAChF,MAAMc,WAAW,MAAMnB,WAAWU,UAAU,CAACO,MAAMN,EAAE;QACrD,MAAMS,YAAY,MAAMpB,WAAWU,UAAU,CAACQ,OAAOP,EAAE;QAEvD,MAAMjC,OAAOsB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAE,SAAS9B,UAAUwC,OAAO,CAACf,aAAa,CAAC;YAC7FgB,MAAM;QACR;QACA,MAAM5C,OACJsB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAEQ,SAASL,KAAK,EAAE,YACzDO,OAAO,CAACf,aAAa,CAAC;YAAEgB,MAAM;QAA2B;QAC3D,MAAMtB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAEQ,SAASL,KAAK,EAAEjC;QAC/D,MAAMH,OACJsB,WAAWa,mBAAmB,CAACI,MAAMN,EAAE,EAAEQ,SAASL,KAAK,EAAEhC,gBACzDuC,OAAO,CAACf,aAAa,CAAC;YAAEgB,MAAM;QAAyB;QACzD,MAAM5C,OACJsB,WAAWa,mBAAmB,CAACK,OAAOP,EAAE,EAAES,UAAUN,KAAK,EAAEjC,UAC3DwC,OAAO,CAACf,aAAa,CAAC;YAAEgB,MAAM;QAAyB;IAC3D;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/durable/CodexPrintAgent.integration.test.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport {\n CodexPrintError,\n CodexPrintAgentService,\n DurableAgentRepository,\n type ProcessInspector,\n} from \"../../index.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\ndescribe(\"Codex print-agent fake-provider journey\", () => {\n it(\"creates unbound, then binds and explicitly resumes the provider-minted session\", async () => {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-print-integration-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector: ProcessInspector = {\n getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),\n };\n const repository = new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n });\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"process-42\" });\n await request.onSession(SESSION);\n return {\n sessionId: SESSION,\n result: `answer:${request.prompt}`,\n messages: [`answer:${request.prompt}`],\n exitCode: 0,\n };\n }),\n };\n const service = new CodexPrintAgentService({\n repository,\n probe: { validate: vi.fn() },\n runner,\n });\n\n const created = await service.create({ name: \"reviewer\", cwd });\n expect(created).toMatchObject({\n provider: \"codex\",\n providerSessionId: null,\n sessionHealth: \"uninitialized\",\n });\n\n const first = await service.send(created.id, \"first secret\");\n expect(first).toMatchObject({ result: \"answer:first secret\" });\n const bound = await repository.getById(created.id);\n expect(bound?.providerSessionId).toBe(first.sessionId);\n await expect(service.send(created.id, \"follow up\")).resolves.toMatchObject({\n result: \"answer:follow up\",\n });\n\n expect(runner.run.mock.calls[0][0].agent).toMatchObject({ providerSessionId: null });\n expect(runner.run.mock.calls[1][0].agent).toMatchObject({ providerSessionId: SESSION });\n });\n\n it(\"retains a first-run binding when the provider fails after thread start\", async () => {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-print-bind-failure-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector: ProcessInspector = {\n getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),\n };\n const repository = new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n });\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"process-42\" });\n await request.onSession(SESSION);\n throw new CodexPrintError(\"Codex print run failed.\", \"CODEX_PROCESS\");\n }),\n };\n const service = new CodexPrintAgentService({\n repository,\n probe: { validate: vi.fn() },\n runner,\n });\n const created = await service.create({ name: \"reviewer\", cwd });\n\n await expect(service.send(created.id, \"secret\")).rejects.toMatchObject({\n code: \"CODEX_PROCESS\",\n });\n expect(await repository.getById(created.id)).toMatchObject({\n providerSessionId: SESSION,\n state: \"degraded\",\n sessionHealth: \"unknown\",\n });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","vi","CodexPrintError","CodexPrintAgentService","DurableAgentRepository","SESSION","roots","root","splice","rmSync","recursive","force","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","processInspector","getIdentity","pid","startedAt","repository","dbPath","runner","run","fn","mockImplementation","request","onSpawn","onSession","sessionId","result","prompt","messages","exitCode","service","probe","validate","created","create","name","toMatchObject","provider","providerSessionId","sessionHealth","first","send","id","bound","getById","toBe","resolves","mock","calls","agent","rejects","code","state"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/durable/CodexPrintAgentService.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst base = {\n id: \"id\",\n name: \"reviewer\",\n provider: \"codex\",\n providerSessionId: null,\n sessionHealth: \"uninitialized\",\n};\n\ndescribe(\"CodexPrintAgentService\", () => {\n it(\"constructs default non-billable dependencies without invoking them\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new () => any;\n expect(new Service().repository).toBeDefined();\n });\n\n it(\"validates before provider-aware create and never runs Codex\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexPrintAgentService\");\n const probe = {\n validate: vi.fn().mockResolvedValue({ executable: \"codex\", version: \"0.147.0\" }),\n };\n const repository = { create: vi.fn().mockResolvedValue(base), list: vi.fn() };\n const runner = { run: vi.fn() };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n await new Service({ repository, probe, runner }).create({ name: \"reviewer\", cwd: \"/project\" });\n expect(repository.create).toHaveBeenCalledWith({\n name: \"reviewer\",\n cwd: \"/project\",\n provider: \"codex\",\n });\n expect(runner.run).not.toHaveBeenCalled();\n });\n\n it(\"binds during first send and explicitly resumes later sends\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const repository = {\n list: vi.fn(),\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi\n .fn()\n .mockResolvedValueOnce({ agent: base, token: \"one\" })\n .mockResolvedValueOnce({\n agent: { ...base, providerSessionId: SESSION, sessionHealth: \"healthy\" },\n token: \"two\",\n }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"start\" });\n await request.onSession(SESSION);\n return { sessionId: SESSION, result: \"answer\", messages: [\"answer\"], exitCode: 0 };\n }),\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner,\n executable: \"fake-codex\",\n });\n\n await service.send(\"reviewer\", \"first\");\n await service.send(\"reviewer\", \"later\");\n\n expect(repository.bindProviderSession).toHaveBeenNthCalledWith(1, \"id\", \"one\", SESSION);\n expect(repository.bindProviderSession).toHaveBeenNthCalledWith(2, \"id\", \"two\", SESSION);\n expect(repository.completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({\n status: \"succeeded\",\n sessionHealth: \"healthy\",\n }),\n );\n });\n\n it(\"records mismatch separately from unknown failures\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const ErrorType = api.CodexPrintError as new (message: string, code: string) => Error;\n const completeRun = vi.fn();\n const repository = {\n list: vi.fn(),\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun,\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner: {\n run: vi.fn().mockRejectedValue(new ErrorType(\"mismatch\", \"CODEX_SESSION_MISMATCH\")),\n },\n });\n await expect(service.send(\"reviewer\", \"x\")).rejects.toMatchObject({\n code: \"CODEX_SESSION_MISMATCH\",\n });\n expect(completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({ sessionHealth: \"mismatch\" }),\n );\n });\n\n it(\"rejects a non-Codex target without acquiring or mutating it\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const repository = {\n resolve: vi.fn().mockResolvedValue({ ...base, provider: \"claude\" }),\n acquireRun: vi.fn(),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner: { run: vi.fn() } }).send(\n \"reviewer\",\n \"x\",\n ),\n ).rejects.toMatchObject({ code: \"CODEX_UNSUPPORTED\" });\n expect(repository.acquireRun).not.toHaveBeenCalled();\n expect(repository.completeRun).not.toHaveBeenCalled();\n });\n\n it(\"does not turn a successful completion write failure into a second completion\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const completionFailure = new Error(\"completion failed\");\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn().mockRejectedValue(completionFailure),\n };\n const runner = {\n run: vi.fn().mockResolvedValue({\n sessionId: SESSION,\n result: \"answer\",\n messages: [\"answer\"],\n exitCode: 0,\n }),\n };\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner }).send(\"reviewer\", \"x\"),\n ).rejects.toBe(completionFailure);\n expect(repository.completeRun).toHaveBeenCalledOnce();\n });\n\n it(\"records a repository binding conflict as a session mismatch\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const BindingError = api.CodexPrintError as new (message: string, code: string) => Error;\n const completeRun = vi.fn();\n const repository = {\n list: vi.fn(),\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi\n .fn()\n .mockRejectedValue(new BindingError(\"binding mismatch\", \"CODEX_SESSION_MISMATCH\")),\n completeRun,\n };\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSession(SESSION);\n return { sessionId: SESSION, result: \"x\", messages: [\"x\"], exitCode: 0 };\n }),\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner }).send(\"reviewer\", \"x\"),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n expect(completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({ sessionHealth: \"mismatch\" }),\n );\n });\n\n it(\"rejects missing and ambiguous records before acquiring a run\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const repository = {\n list: vi.fn(),\n create: vi.fn(),\n resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([base, base]),\n acquireRun: vi.fn(),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner: { run: vi.fn() },\n });\n await expect(service.send(\"missing\", \"x\")).rejects.toMatchObject({\n code: \"DURABLE_AGENT_NOT_FOUND\",\n });\n await expect(service.send(\"ambiguous\", \"x\")).rejects.toMatchObject({\n code: \"CODEX_UNSUPPORTED\",\n });\n expect(repository.acquireRun).not.toHaveBeenCalled();\n });\n});\n"],"names":["describe","expect","it","vi","SESSION","base","id","name","provider","providerSessionId","sessionHealth","api","Service","CodexPrintAgentService","repository","toBeDefined","toHaveProperty","probe","validate","fn","mockResolvedValue","executable","version","create","list","runner","run","cwd","toHaveBeenCalledWith","not","toHaveBeenCalled","resolve","acquireRun","mockResolvedValueOnce","agent","token","recordProviderProcess","bindProviderSession","completeRun","mockImplementation","request","onSpawn","pid","startedAt","onSession","sessionId","result","messages","exitCode","service","send","toHaveBeenNthCalledWith","objectContaining","status","ErrorType","CodexPrintError","mockRejectedValue","rejects","toMatchObject","code","completionFailure","Error","toBe","toHaveBeenCalledOnce","BindingError"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/durable/CodexPrintRunner.test.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { PassThrough, Writable } from \"node:stream\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport type { CodexDurableAgent } from \"../../index.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\n\nfunction agent(providerSessionId: string | null = null): CodexDurableAgent {\n return {\n id: \"11111111-1111-4111-8111-111111111111\",\n name: \"reviewer\",\n provider: \"codex\",\n mode: \"durable\",\n cwd: \"/project\",\n providerSessionId,\n state: \"running\",\n sessionHealth: \"uninitialized\",\n createdAt: \"\",\n updatedAt: \"\",\n lastActiveAt: null,\n lastResult: null,\n activeRun: null,\n };\n}\n\nfunction fakeSpawn(lines: string[], exitCode = 0, chunks = false) {\n const promptChunks: Buffer[] = [];\n const child = new EventEmitter() as any;\n child.pid = 4242;\n child.stdout = new PassThrough();\n child.stderr = new PassThrough();\n child.kill = vi.fn();\n child.stdin = new Writable({\n write(chunk, _encoding, callback) {\n promptChunks.push(Buffer.from(chunk));\n callback();\n },\n final(callback) {\n const output = lines.join(\"\\n\");\n if (chunks) {\n const bytes = Buffer.from(output);\n child.stdout.write(bytes.subarray(0, 7));\n child.stdout.write(bytes.subarray(7));\n } else child.stdout.write(output);\n child.stdout.end();\n queueMicrotask(() => child.emit(\"close\", exitCode, null));\n callback();\n },\n });\n const spawn = vi.fn(() => child);\n return { child, spawn, promptChunks };\n}\n\nfunction events(session = SESSION): string[] {\n return [\n JSON.stringify({ type: \"thread.started\", thread_id: session }),\n JSON.stringify({ type: \"turn.started\" }),\n JSON.stringify({ type: \"future.event\", anything: true }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"first\" } }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"final\" } }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ];\n}\n\nasync function runner(fixture: ReturnType<typeof fakeSpawn>, maxLineBytes?: number) {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexPrintRunner\");\n const Runner = api.CodexPrintRunner as new (options: unknown) => any;\n return new Runner({\n spawn: fixture.spawn,\n maxLineBytes,\n processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: \"provider-start\" }),\n },\n });\n}\n\ndescribe(\"CodexPrintRunner\", () => {\n it(\"constructs default process dependencies without spawning\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const Runner = api.CodexPrintRunner as new () => any;\n expect(new Runner()).toBeDefined();\n });\n\n it(\"binds an initial thread before returning ordered assistant output\", async () => {\n const fixture = fakeSpawn(events(), 0, true);\n const instance = await runner(fixture);\n const order: string[] = [];\n const result = await instance.run({\n agent: agent(),\n prompt: \"secret prompt\",\n executable: \"fake-codex\",\n onSpawn: async () => {\n expect(fixture.promptChunks).toHaveLength(0);\n order.push(\"spawn\");\n },\n onSession: async (id: string) => {\n expect(id).toBe(SESSION);\n order.push(\"session\");\n },\n });\n\n expect(order).toEqual([\"spawn\", \"session\"]);\n expect(fixture.spawn).toHaveBeenCalledWith(\n \"fake-codex\",\n [\"exec\", \"--json\", \"-\"],\n expect.objectContaining({\n cwd: \"/project\",\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }),\n );\n expect(JSON.stringify(fixture.spawn.mock.calls)).not.toContain(\"secret prompt\");\n expect(Buffer.concat(fixture.promptChunks).toString()).toBe(\"secret prompt\");\n expect(result).toEqual({\n sessionId: SESSION,\n result: \"final\",\n messages: [\"first\", \"final\"],\n exitCode: 0,\n });\n });\n\n it(\"resumes the exact stored UUID and rejects a mismatch\", async () => {\n const mismatch = \"33333333-3333-4333-8333-333333333333\";\n const fixture = fakeSpawn(events(mismatch));\n const instance = await runner(fixture);\n await expect(\n instance.run({\n agent: agent(SESSION),\n prompt: \"later\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n expect(fixture.spawn.mock.calls[0]![1]).toEqual([\"exec\", \"resume\", \"--json\", SESSION, \"-\"]);\n });\n\n it.each([\n [\"malformed JSON\", [\"{bad\\n\"], \"CODEX_PROTOCOL\"],\n [\"non-object JSON\", [\"[]\\n\"], \"CODEX_PROTOCOL\"],\n [\"truncated JSON\", [\"{}\"], \"CODEX_PROTOCOL\"],\n [\n \"missing thread\",\n [\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"x\" } }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ],\n \"CODEX_PROTOCOL\",\n ],\n [\n \"missing assistant\",\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ],\n \"CODEX_RESULT_MISSING\",\n ],\n [\n \"missing completion\",\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"x\" } }),\n \"\",\n ],\n \"CODEX_PROTOCOL\",\n ],\n ])(\"rejects %s\", async (_name, lines, code) => {\n const fixture = fakeSpawn(lines as string[]);\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code });\n });\n\n it(\"rejects oversized output, non-zero exit, and missing process identity without leaking stderr\", async () => {\n const oversized = fakeSpawn([`${\"x\".repeat(20)}\\n`]);\n await expect(\n (await runner(oversized, 10)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n const oversizedWithoutNewline = fakeSpawn([\"x\".repeat(20)]);\n await expect(\n (await runner(oversizedWithoutNewline, 10)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n\n const failed = fakeSpawn(events(), 1);\n failed.child.stderr.end(\"secret-looking provider diagnostic\");\n await expect(\n (await runner(failed)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n\n const missing = fakeSpawn([]);\n missing.child.pid = undefined;\n await expect(\n (await runner(missing)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n });\n\n it(\"rejects invalid or duplicate thread identities\", async () => {\n for (const lines of [\n [JSON.stringify({ type: \"thread.started\", thread_id: \"bad\" }), \"\"],\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n \"\",\n ],\n ]) {\n const fixture = fakeSpawn(lines);\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n }\n });\n\n it(\"classifies callback processing failure and kills when spawn persistence fails\", async () => {\n const callbackFailure = fakeSpawn(events());\n await expect(\n (await runner(callbackFailure)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn().mockRejectedValue(new Error(\"storage unavailable\")),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n\n const spawnFailure = fakeSpawn([]);\n const failure = new Error(\"cannot persist process\");\n await expect(\n (await runner(spawnFailure)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn().mockRejectedValue(failure),\n onSession: vi.fn(),\n }),\n ).rejects.toBe(failure);\n expect(spawnFailure.child.kill).toHaveBeenCalledOnce();\n });\n\n it(\"rejects an unverifiable positive PID\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n const fixture = fakeSpawn([]);\n const Runner = api.CodexPrintRunner as new (options: unknown) => any;\n const instance = new Runner({\n spawn: fixture.spawn,\n processInspector: { getIdentity: () => null },\n });\n await expect(\n instance.run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n expect(fixture.child.kill).toHaveBeenCalledOnce();\n });\n\n it(\"classifies a child spawn error as a process failure\", async () => {\n const fixture = fakeSpawn([]);\n fixture.child.stdin = new Writable({\n write(_chunk, _encoding, callback) {\n callback();\n },\n final(callback) {\n queueMicrotask(() => fixture.child.emit(\"error\", new Error(\"spawn failed\")));\n callback();\n },\n });\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n });\n});\n"],"names":["EventEmitter","PassThrough","Writable","describe","expect","it","vi","SESSION","agent","providerSessionId","id","name","provider","mode","cwd","state","sessionHealth","createdAt","updatedAt","lastActiveAt","lastResult","activeRun","fakeSpawn","lines","exitCode","chunks","promptChunks","child","pid","stdout","stderr","kill","fn","stdin","write","chunk","_encoding","callback","push","Buffer","from","final","output","join","bytes","subarray","end","queueMicrotask","emit","spawn","events","session","JSON","stringify","type","thread_id","anything","item","text","runner","fixture","maxLineBytes","api","toHaveProperty","Runner","CodexPrintRunner","processInspector","getIdentity","startedAt","toBeDefined","instance","order","result","run","prompt","executable","onSpawn","toHaveLength","onSession","toBe","toEqual","toHaveBeenCalledWith","objectContaining","shell","stdio","mock","calls","not","toContain","concat","toString","sessionId","messages","mismatch","rejects","toMatchObject","code","each","_name","oversized","repeat","oversizedWithoutNewline","failed","missing","undefined","callbackFailure","mockRejectedValue","Error","spawnFailure","failure","toHaveBeenCalledOnce","_chunk"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/print/ClaudeCliProbe.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\nimport { ClaudeCliProbe } from \"../../providers/claude/durable/ClaudeCliProbe.js\";\n\ndescribe(\"ClaudeCliProbe\", () => {\n it(\"validates only version/help and requires the print session flags\", async () => {\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"2.1.220\\n\", stderr: \"\" })\n .mockResolvedValueOnce({\n stdout: \"--print --session-id --resume --output-format stream-json\",\n stderr: \"\",\n });\n\n await expect(new ClaudeCliProbe({ exec }).validate()).resolves.toEqual({\n executable: \"claude\",\n version: \"2.1.220\",\n });\n expect(exec.mock.calls).toEqual([\n [\"claude\", [\"--version\"]],\n [\"claude\", [\"--help\"]],\n ]);\n });\n\n it(\"rejects a CLI missing a required capability\", async () => {\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"old\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"--print only\", stderr: \"\" });\n\n await expect(new ClaudeCliProbe({ exec }).validate()).rejects.toMatchObject({\n code: \"CLAUDE_CLI_UNSUPPORTED\",\n });\n });\n});\n"],"names":["describe","expect","it","vi","ClaudeCliProbe","exec","fn","mockResolvedValueOnce","stdout","stderr","validate","resolves","toEqual","executable","version","mock","calls","rejects","toMatchObject","code"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAS;AAClD,SAASC,cAAc,QAAQ,mDAAmD;AAElFJ,SAAS,kBAAkB;IACzBE,GAAG,oEAAoE;QACrE,MAAMG,OAAOF,GACVG,EAAE,GACFC,qBAAqB,CAAC;YAAEC,QAAQ;YAAaC,QAAQ;QAAG,GACxDF,qBAAqB,CAAC;YACrBC,QAAQ;YACRC,QAAQ;QACV;QAEF,MAAMR,OAAO,IAAIG,eAAe;YAAEC;QAAK,GAAGK,QAAQ,IAAIC,QAAQ,CAACC,OAAO,CAAC;YACrEC,YAAY;YACZC,SAAS;QACX;QACAb,OAAOI,KAAKU,IAAI,CAACC,KAAK,EAAEJ,OAAO,CAAC;YAC9B;gBAAC;gBAAU;oBAAC;iBAAY;aAAC;YACzB;gBAAC;gBAAU;oBAAC;iBAAS;aAAC;SACvB;IACH;IAEAV,GAAG,+CAA+C;QAChD,MAAMG,OAAOF,GACVG,EAAE,GACFC,qBAAqB,CAAC;YAAEC,QAAQ;YAAOC,QAAQ;QAAG,GAClDF,qBAAqB,CAAC;YAAEC,QAAQ;YAAgBC,QAAQ;QAAG;QAE9D,MAAMR,OAAO,IAAIG,eAAe;YAAEC;QAAK,GAAGK,QAAQ,IAAIO,OAAO,CAACC,aAAa,CAAC;YAC1EC,MAAM;QACR;IACF;AACF"}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/print/ClaudePrintAgent.integration.test.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport {\n ClaudePrintAgentService,\n DurableAgentRepository,\n type ProcessInspector,\n} from \"../../index.js\";\n\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\ndescribe(\"Claude durable-agent fake-provider journey\", () => {\n it(\"creates without invocation, then starts and resumes the same session through stdin\", async () => {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"durable-agent-integration-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector: ProcessInspector = {\n getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),\n };\n const repository = new DurableAgentRepository({\n dbPath: path.join(root, \"state\", \"agents.db\"),\n processInspector,\n });\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"process-42\" });\n return {\n sessionId: request.agent.providerSessionId,\n result: `answer:${request.prompt}`,\n exitCode: 0,\n };\n }),\n };\n const service = new ClaudePrintAgentService({\n repository,\n probe: { validate: vi.fn() },\n runner,\n });\n\n const created = await service.create({ name: \"reviewer\", cwd });\n\n await expect(service.send(created.id, \"first secret\")).resolves.toMatchObject({\n result: \"answer:first secret\",\n });\n await expect(service.send(created.id, \"follow up\")).resolves.toMatchObject({\n result: \"answer:follow up\",\n });\n\n expect(runner.run.mock.calls[0][0]).toMatchObject({ firstRun: true, prompt: \"first secret\" });\n expect(runner.run.mock.calls[1][0]).toMatchObject({ firstRun: false, prompt: \"follow up\" });\n\n const persisted = await repository.getById(created.id);\n expect(persisted).toMatchObject({ state: \"ready\", sessionHealth: \"healthy\" });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","vi","ClaudePrintAgentService","DurableAgentRepository","roots","root","splice","rmSync","recursive","force","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","processInspector","getIdentity","pid","startedAt","repository","dbPath","runner","run","fn","mockImplementation","request","onSpawn","sessionId","agent","providerSessionId","result","prompt","exitCode","service","probe","validate","created","create","name","send","id","resolves","toMatchObject","mock","calls","firstRun","persisted","getById","state","sessionHealth"],"mappings":"AAAA,OAAOA,QAAQ,UAAU;AACzB,OAAOC,QAAQ,UAAU;AACzB,OAAOC,UAAU,YAAY;AAC7B,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAS;AAC7D,SACEC,uBAAuB,EACvBC,sBAAsB,QAEjB,iBAAiB;AAExB,MAAMC,QAAkB,EAAE;AAE1BP,UAAU;IACR,KAAK,MAAMQ,QAAQD,MAAME,MAAM,CAAC,GAAIZ,GAAGa,MAAM,CAACF,MAAM;QAAEG,WAAW;QAAMC,OAAO;IAAK;AACrF;AAEAX,SAAS,8CAA8C;IACrDE,GAAG,sFAAsF;QACvF,MAAMK,OAAOX,GAAGgB,WAAW,CAACd,KAAKe,IAAI,CAAChB,GAAGiB,MAAM,IAAI;QACnDR,MAAMS,IAAI,CAACR;QACX,MAAMS,MAAMlB,KAAKe,IAAI,CAACN,MAAM;QAC5BX,GAAGqB,SAAS,CAACD;QACb,MAAME,mBAAqC;YACzCC,aAAa,CAACC,MAAS,CAAA;oBAAEA;oBAAKC,WAAW,CAAC,QAAQ,EAAED,KAAK;gBAAC,CAAA;QAC5D;QACA,MAAME,aAAa,IAAIjB,uBAAuB;YAC5CkB,QAAQzB,KAAKe,IAAI,CAACN,MAAM,SAAS;YACjCW;QACF;QACA,MAAMM,SAAS;YACbC,KAAKtB,GAAGuB,EAAE,GAAGC,kBAAkB,CAAC,OAAOC;gBACrC,MAAMA,QAAQC,OAAO,CAAC;oBAAET,KAAK;oBAAIC,WAAW;gBAAa;gBACzD,OAAO;oBACLS,WAAWF,QAAQG,KAAK,CAACC,iBAAiB;oBAC1CC,QAAQ,CAAC,OAAO,EAAEL,QAAQM,MAAM,EAAE;oBAClCC,UAAU;gBACZ;YACF;QACF;QACA,MAAMC,UAAU,IAAIhC,wBAAwB;YAC1CkB;YACAe,OAAO;gBAAEC,UAAUnC,GAAGuB,EAAE;YAAG;YAC3BF;QACF;QAEA,MAAMe,UAAU,MAAMH,QAAQI,MAAM,CAAC;YAAEC,MAAM;YAAYzB;QAAI;QAE7D,MAAMf,OAAOmC,QAAQM,IAAI,CAACH,QAAQI,EAAE,EAAE,iBAAiBC,QAAQ,CAACC,aAAa,CAAC;YAC5EZ,QAAQ;QACV;QACA,MAAMhC,OAAOmC,QAAQM,IAAI,CAACH,QAAQI,EAAE,EAAE,cAAcC,QAAQ,CAACC,aAAa,CAAC;YACzEZ,QAAQ;QACV;QAEAhC,OAAOuB,OAAOC,GAAG,CAACqB,IAAI,CAACC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAEF,aAAa,CAAC;YAAEG,UAAU;YAAMd,QAAQ;QAAe;QAC3FjC,OAAOuB,OAAOC,GAAG,CAACqB,IAAI,CAACC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAEF,aAAa,CAAC;YAAEG,UAAU;YAAOd,QAAQ;QAAY;QAEzF,MAAMe,YAAY,MAAM3B,WAAW4B,OAAO,CAACX,QAAQI,EAAE;QACrD1C,OAAOgD,WAAWJ,aAAa,CAAC;YAAEM,OAAO;YAASC,eAAe;QAAU;IAC7E;AACF"}