@ai-devkit/agent-manager 0.32.0 → 0.33.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 (519) hide show
  1. package/dist/AgentManager.d.ts +3 -3
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +80 -79
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +413 -388
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
  8. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  9. package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
  10. package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
  11. package/dist/__tests__/adapters/CopilotAdapter.test.js +254 -248
  12. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
  14. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
  15. package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
  16. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  17. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
  18. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  19. package/dist/__tests__/capacity/codex.test.js +93 -93
  20. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  21. package/dist/__tests__/capacity/index.test.js +17 -17
  22. package/dist/__tests__/capacity/index.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  24. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  26. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  28. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  29. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  30. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  31. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  32. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  34. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  36. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  37. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  38. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  39. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  40. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  42. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  43. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  44. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  45. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  46. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  47. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  48. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  49. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  50. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  51. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  52. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  53. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  54. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  55. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  56. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
  57. package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
  58. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
  59. package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
  60. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
  61. package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
  62. package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
  63. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
  64. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
  65. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
  66. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  67. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
  68. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
  69. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
  70. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
  71. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
  72. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
  73. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
  74. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
  75. package/dist/__tests__/readiness/AgentReadiness.test.js +134 -134
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  77. package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
  78. package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
  79. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +452 -0
  80. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  81. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  82. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  84. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  85. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  86. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  88. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  89. package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
  90. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  91. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  92. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  94. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  95. package/dist/__tests__/utils/agents.test.js +17 -17
  96. package/dist/__tests__/utils/agents.test.js.map +1 -1
  97. package/dist/__tests__/utils/matching.test.js +92 -92
  98. package/dist/__tests__/utils/matching.test.js.map +1 -1
  99. package/dist/__tests__/utils/process.test.js +108 -108
  100. package/dist/__tests__/utils/process.test.js.map +1 -1
  101. package/dist/__tests__/utils/session.test.js +53 -53
  102. package/dist/__tests__/utils/session.test.js.map +1 -1
  103. package/dist/adapters/AgentAdapter.d.ts +2 -2
  104. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  105. package/dist/adapters/AgentAdapter.js +1 -1
  106. package/dist/adapters/AgentAdapter.js.map +1 -1
  107. package/dist/adapters/CopilotAdapter.d.ts +2 -2
  108. package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
  109. package/dist/adapters/CopilotAdapter.js +51 -51
  110. package/dist/adapters/CopilotAdapter.js.map +1 -1
  111. package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
  112. package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
  113. package/dist/adapters/GeminiCliAdapter.js +86 -86
  114. package/dist/adapters/GeminiCliAdapter.js.map +1 -1
  115. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  116. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  117. package/dist/adapters/GrokCliAdapter.js +80 -80
  118. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  119. package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
  120. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  121. package/dist/adapters/OpenCodeAdapter.js +37 -36
  122. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  123. package/dist/adapters/index.d.ts +9 -9
  124. package/dist/adapters/index.d.ts.map +1 -1
  125. package/dist/adapters/index.js +8 -8
  126. package/dist/adapters/index.js.map +1 -1
  127. package/dist/capacity/codex.d.ts +3 -3
  128. package/dist/capacity/codex.d.ts.map +1 -1
  129. package/dist/capacity/codex.js +57 -57
  130. package/dist/capacity/codex.js.map +1 -1
  131. package/dist/capacity/index.d.ts +3 -3
  132. package/dist/capacity/index.d.ts.map +1 -1
  133. package/dist/capacity/index.js +8 -8
  134. package/dist/capacity/index.js.map +1 -1
  135. package/dist/capacity/types.d.ts +1 -1
  136. package/dist/capacity/types.js.map +1 -1
  137. package/dist/database/connection.d.ts +1 -1
  138. package/dist/database/connection.d.ts.map +1 -1
  139. package/dist/database/connection.js +15 -15
  140. package/dist/database/connection.js.map +1 -1
  141. package/dist/database/index.d.ts +3 -3
  142. package/dist/database/index.d.ts.map +1 -1
  143. package/dist/database/index.js +2 -2
  144. package/dist/database/index.js.map +1 -1
  145. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  146. package/dist/database/schema.d.ts +1 -1
  147. package/dist/database/schema.d.ts.map +1 -1
  148. package/dist/database/schema.js +7 -7
  149. package/dist/database/schema.js.map +1 -1
  150. package/dist/durable/DurableAgent.d.ts +9 -9
  151. package/dist/durable/DurableAgent.d.ts.map +1 -1
  152. package/dist/durable/DurableAgent.js +16 -16
  153. package/dist/durable/DurableAgent.js.map +1 -1
  154. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  155. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  156. package/dist/durable/DurableAgentRepository.js +49 -48
  157. package/dist/durable/DurableAgentRepository.js.map +1 -1
  158. package/dist/durable/process.d.ts +1 -1
  159. package/dist/durable/process.d.ts.map +1 -1
  160. package/dist/durable/process.js +14 -14
  161. package/dist/durable/process.js.map +1 -1
  162. package/dist/durable/run.d.ts +2 -2
  163. package/dist/durable/run.d.ts.map +1 -1
  164. package/dist/durable/run.js +6 -6
  165. package/dist/durable/run.js.map +1 -1
  166. package/dist/durable/utils.d.ts +1 -1
  167. package/dist/durable/utils.d.ts.map +1 -1
  168. package/dist/durable/utils.js +4 -4
  169. package/dist/durable/utils.js.map +1 -1
  170. package/dist/index.d.ts +46 -43
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -26
  173. package/dist/index.js.map +1 -1
  174. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  175. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  176. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  177. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  178. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  179. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  180. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  181. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  183. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  184. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  185. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  186. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  187. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  188. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  189. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  190. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  191. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  192. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  194. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  195. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  196. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  197. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  198. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  199. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  200. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  201. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  202. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  203. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  204. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  205. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  206. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  207. package/dist/providers/codex/CodexAdapter.js +162 -0
  208. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  209. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  210. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  211. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  212. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  213. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  214. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  215. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  216. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  217. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  218. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  219. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  220. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  221. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  222. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  223. package/dist/providers/codex/CodexSessionParser.js +262 -0
  224. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  225. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  226. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  227. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  229. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  230. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  231. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  232. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  233. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  234. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  235. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  236. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  237. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  238. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  239. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  240. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  241. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  242. package/dist/providers/pi/PiAdapter.js +153 -0
  243. package/dist/providers/pi/PiAdapter.js.map +1 -0
  244. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  245. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  246. package/dist/providers/pi/PiAgentMapper.js +37 -0
  247. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  248. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  249. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  250. package/dist/providers/pi/PiSessionLocator.js +79 -0
  251. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  252. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  253. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  254. package/dist/providers/pi/PiSessionParser.js +191 -0
  255. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  256. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  257. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  258. package/dist/providers/pi/PiSessionTracker.js +69 -0
  259. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  260. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  261. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  262. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  263. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  264. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  265. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  266. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  267. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  268. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  269. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  270. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  271. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  272. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  273. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  274. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  275. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  276. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  277. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  278. package/dist/readiness/AgentReadiness.d.ts +6 -6
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  280. package/dist/readiness/AgentReadiness.js +130 -130
  281. package/dist/readiness/AgentReadiness.js.map +1 -1
  282. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  283. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  284. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  285. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  286. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  287. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  288. package/dist/runtime/RuntimeFactory.js +11 -0
  289. package/dist/runtime/RuntimeFactory.js.map +1 -0
  290. package/dist/runtime/errors.d.ts +27 -0
  291. package/dist/runtime/errors.d.ts.map +1 -0
  292. package/dist/runtime/errors.js +42 -0
  293. package/dist/runtime/errors.js.map +1 -0
  294. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
  295. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  296. package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
  297. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  298. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  299. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  300. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  301. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  302. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  303. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  304. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  305. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  306. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
  307. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  308. package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
  309. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  310. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  311. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  312. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  313. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  314. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  315. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  316. package/dist/runtime/tmux/PidPolling.js +24 -0
  317. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  318. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  319. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  320. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  321. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  322. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  323. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  324. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  325. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  326. package/dist/runtime/types.d.ts +54 -0
  327. package/dist/runtime/types.d.ts.map +1 -0
  328. package/dist/runtime/types.js +3 -0
  329. package/dist/runtime/types.js.map +1 -0
  330. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  331. package/dist/terminal/TerminalFocusManager.js +50 -50
  332. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  333. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  334. package/dist/terminal/TmuxManager.js +47 -47
  335. package/dist/terminal/TmuxManager.js.map +1 -1
  336. package/dist/terminal/TtyWriter.d.ts +1 -1
  337. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  338. package/dist/terminal/TtyWriter.js +89 -89
  339. package/dist/terminal/TtyWriter.js.map +1 -1
  340. package/dist/terminal/index.d.ts +4 -4
  341. package/dist/terminal/index.js +3 -3
  342. package/dist/terminal/index.js.map +1 -1
  343. package/dist/utils/AgentRegistry.d.ts +10 -2
  344. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  345. package/dist/utils/AgentRegistry.js +57 -24
  346. package/dist/utils/AgentRegistry.js.map +1 -1
  347. package/dist/utils/agent-requests.d.ts.map +1 -1
  348. package/dist/utils/agent-requests.js +5 -5
  349. package/dist/utils/agent-requests.js.map +1 -1
  350. package/dist/utils/agents.d.ts +2 -2
  351. package/dist/utils/agents.d.ts.map +1 -1
  352. package/dist/utils/agents.js +15 -15
  353. package/dist/utils/agents.js.map +1 -1
  354. package/dist/utils/applescript.js +1 -1
  355. package/dist/utils/applescript.js.map +1 -1
  356. package/dist/utils/index.d.ts +6 -6
  357. package/dist/utils/index.d.ts.map +1 -1
  358. package/dist/utils/index.js +4 -4
  359. package/dist/utils/index.js.map +1 -1
  360. package/dist/utils/matching.d.ts +2 -2
  361. package/dist/utils/matching.d.ts.map +1 -1
  362. package/dist/utils/matching.js +4 -4
  363. package/dist/utils/matching.js.map +1 -1
  364. package/dist/utils/process.d.ts +1 -1
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +74 -74
  367. package/dist/utils/process.js.map +1 -1
  368. package/dist/utils/session.d.ts +1 -1
  369. package/dist/utils/session.d.ts.map +1 -1
  370. package/dist/utils/session.js +7 -7
  371. package/dist/utils/session.js.map +1 -1
  372. package/dist/utils/sortAgents.d.ts +2 -2
  373. package/dist/utils/sortAgents.d.ts.map +1 -1
  374. package/dist/utils/sortAgents.js +5 -5
  375. package/dist/utils/sortAgents.js.map +1 -1
  376. package/package.json +18 -19
  377. package/src/AgentManager.ts +283 -281
  378. package/src/__tests__/AgentManager.test.ts +917 -907
  379. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  380. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  381. package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
  382. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
  383. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  384. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
  385. package/src/__tests__/capacity/codex.test.ts +178 -91
  386. package/src/__tests__/capacity/index.test.ts +27 -18
  387. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  388. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  389. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  390. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  391. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  392. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  393. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  394. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  395. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  396. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  397. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  398. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  399. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  400. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  401. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  402. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  403. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  404. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  405. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  406. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  407. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  408. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  409. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  410. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  411. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  412. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  413. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  414. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  415. package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
  416. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  417. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
  418. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  419. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  420. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  421. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  422. package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
  423. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  424. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  425. package/src/__tests__/utils/agents.test.ts +20 -20
  426. package/src/__tests__/utils/matching.test.ts +206 -171
  427. package/src/__tests__/utils/process.test.ts +276 -262
  428. package/src/__tests__/utils/session.test.ts +133 -139
  429. package/src/adapters/AgentAdapter.ts +134 -126
  430. package/src/adapters/CopilotAdapter.ts +405 -395
  431. package/src/adapters/GeminiCliAdapter.ts +598 -600
  432. package/src/adapters/GrokCliAdapter.ts +353 -342
  433. package/src/adapters/OpenCodeAdapter.ts +285 -259
  434. package/src/adapters/index.ts +15 -9
  435. package/src/capacity/codex.ts +137 -84
  436. package/src/capacity/index.ts +18 -13
  437. package/src/capacity/types.ts +1 -1
  438. package/src/database/connection.ts +73 -68
  439. package/src/database/index.ts +6 -6
  440. package/src/database/migrations/005_agent_runtime.sql +2 -0
  441. package/src/database/schema.ts +40 -38
  442. package/src/durable/DurableAgent.ts +85 -85
  443. package/src/durable/DurableAgentRepository.ts +409 -260
  444. package/src/durable/process.ts +22 -21
  445. package/src/durable/run.ts +61 -51
  446. package/src/durable/utils.ts +46 -41
  447. package/src/index.ts +144 -103
  448. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  449. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  450. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  451. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  452. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  453. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  454. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  455. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  456. package/src/providers/codex/CodexAdapter.ts +205 -0
  457. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  458. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  459. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  460. package/src/providers/codex/CodexSessionParser.ts +385 -0
  461. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  462. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  463. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  464. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  465. package/src/providers/pi/PiAdapter.ts +183 -0
  466. package/src/providers/pi/PiAgentMapper.ts +36 -0
  467. package/src/providers/pi/PiSessionLocator.ts +95 -0
  468. package/src/providers/pi/PiSessionParser.ts +284 -0
  469. package/src/providers/pi/PiSessionTracker.ts +87 -0
  470. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  471. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  472. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  473. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  474. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  475. package/src/readiness/AgentReadiness.ts +585 -513
  476. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  477. package/src/runtime/RuntimeFactory.ts +13 -0
  478. package/src/runtime/errors.ts +50 -0
  479. package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
  480. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  481. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  482. package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
  483. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  484. package/src/runtime/tmux/PidPolling.ts +34 -0
  485. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  486. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  487. package/src/runtime/types.ts +56 -0
  488. package/src/terminal/TerminalFocusManager.ts +215 -212
  489. package/src/terminal/TmuxManager.ts +99 -92
  490. package/src/terminal/TtyWriter.ts +203 -194
  491. package/src/terminal/index.ts +4 -4
  492. package/src/utils/AgentRegistry.ts +299 -238
  493. package/src/utils/agent-requests.ts +16 -16
  494. package/src/utils/agents.ts +41 -38
  495. package/src/utils/applescript.ts +4 -4
  496. package/src/utils/index.ts +12 -6
  497. package/src/utils/matching.ts +43 -43
  498. package/src/utils/process.ts +261 -258
  499. package/src/utils/session.ts +66 -66
  500. package/src/utils/sortAgents.ts +35 -33
  501. package/tsconfig.json +2 -8
  502. package/vitest.config.ts +16 -16
  503. package/.eslintrc.json +0 -31
  504. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  505. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  506. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  507. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  508. package/dist/adapters/CodexAdapter.d.ts +0 -109
  509. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  510. package/dist/adapters/CodexAdapter.js +0 -710
  511. package/dist/adapters/CodexAdapter.js.map +0 -1
  512. package/dist/adapters/PiAdapter.d.ts +0 -63
  513. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  514. package/dist/adapters/PiAdapter.js +0 -453
  515. package/dist/adapters/PiAdapter.js.map +0 -1
  516. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  517. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  518. package/src/adapters/CodexAdapter.ts +0 -923
  519. package/src/adapters/PiAdapter.ts +0 -598
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/adapters/CodexAdapter.test.ts"],"sourcesContent":["/**\n * Tests for CodexAdapter\n */\n\nimport type { MockedFunction } from 'vitest';\nimport * as fs from 'fs';\nimport * as path from 'path';\n\nimport { CodexAdapter } from '../../adapters/CodexAdapter.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { AgentRegistry, type RegistryEntry } from '../../utils/AgentRegistry.js';\nimport { listAgentProcesses, enrichProcesses, captureProcessSnapshot } 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';\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('../../utils/session') 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<typeof captureProcessSnapshot>;\nconst mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes as MockedFunction<typeof batchGetSessionFileBirthtimes>;\nconst mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<typeof matchProcessesToSessions>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe('CodexAdapter', () => {\n let adapter: CodexAdapter;\n\n beforeEach(() => {\n adapter = new CodexAdapter();\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 expose codex type', () => {\n expect(adapter.type).toBe('codex');\n });\n });\n\n describe('canHandle', () => {\n it('should return true for codex commands', () => {\n expect(adapter.canHandle({ pid: 1, command: 'codex', cwd: '/repo', tty: 'ttys001' })).toBe(true);\n });\n\n it('should return true for codex with full path (case-insensitive)', () => {\n expect(adapter.canHandle({\n pid: 2,\n command: '/usr/local/bin/CODEX --sandbox workspace-write',\n cwd: '/repo',\n tty: 'ttys002',\n })).toBe(true);\n });\n\n it('should return false for non-codex processes', () => {\n expect(adapter.canHandle({ pid: 3, command: 'node app.js', cwd: '/repo', tty: 'ttys003' })).toBe(false);\n });\n\n it('should return false for processes with \"codex\" only in path arguments', () => {\n expect(adapter.canHandle({\n pid: 4,\n command: 'node /worktrees/feature-codex-adapter-agent-manager-package/node_modules/nx/src/daemon/server/start.js',\n cwd: '/repo',\n tty: 'ttys004',\n })).toBe(false);\n });\n });\n\n describe('detectAgents', () => {\n async function useRealSessionMatcher(): Promise<void> {\n const actualMatching = await vi.importActual<typeof import('../../utils/matching.js')>('../../utils/matching.js');\n mockedMatchProcessesToSessions.mockImplementation(actualMatching.matchProcessesToSessions);\n }\n\n it('should return empty list when no codex process is running', async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith('codex');\n });\n\n it('should return process-only agents when no sessions discovered', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001' },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // No sessions dir → discoverSessions returns []\n (adapter as any).codexSessionsDir = '/nonexistent/sessions';\n\n const agents = await adapter.detectAgents();\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: 'pid-100',\n summary: 'Codex process running',\n });\n });\n\n it('should detect agents with matched sessions', async () => {\n const processes: ProcessInfo[] = [\n {\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 ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n // Set up sessions dir with date directory\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n // Create session file with recent timestamps so status isn't idle\n const now = new Date();\n const recentTs = now.toISOString();\n const sessionFile = path.join(dateDir, 'sess-abc.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-abc', timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'Implement adapter flow' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: 'sess-abc',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-03-18T15:00:05Z').getTime(),\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(sessionFiles);\n\n const matches: MatchResult[] = [\n {\n process: processes[0],\n session: { ...sessionFiles[0], resolvedCwd: '/repo-a' },\n deltaMs: 5000,\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: 'codex',\n status: AgentStatus.RUNNING,\n pid: 100,\n projectPath: '/repo-a',\n sessionId: 'sess-abc',\n summary: 'Implement adapter flow',\n });\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match when session_meta timestamp and file birthtime both align with process start', async () => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const sessionTimestamp = '2026-03-18T15:00:05.000Z';\n const processes: ProcessInfo[] = [\n {\n pid: 101,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-aligned.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-aligned', timestamp: sessionTimestamp, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: sessionTimestamp, payload: { type: 'token_count', message: 'Aligned session' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-aligned',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date(sessionTimestamp).getTime(),\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 101,\n sessionId: 'sess-aligned',\n summary: 'Aligned session',\n });\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match late-created session files using session_meta timestamp', async () => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const sessionTimestamp = '2026-03-18T15:00:10.000Z';\n const lateBirthtime = new Date('2026-03-18T15:05:30.000Z').getTime();\n const processes: ProcessInfo[] = [\n {\n pid: 102,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-late.jsonl');\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-late', timestamp: sessionTimestamp, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: sessionTimestamp, payload: { type: 'token_count', message: 'Late file session' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-late',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: lateBirthtime,\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 102,\n sessionId: 'sess-late',\n summary: 'Late file session',\n });\n expect(mockedMatchProcessesToSessions.mock.calls[0][1][0].birthtimeMs).toBe(new Date(sessionTimestamp).getTime());\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it.each<[string, string | undefined]>([\n ['missing', undefined],\n ['invalid', 'not-a-date'],\n ])('should fall back to file birthtime when session_meta timestamp is %s', async (_label, metaTimestamp) => {\n await useRealSessionMatcher();\n const processStart = new Date('2026-03-18T15:00:00.000Z');\n const fileBirthtime = new Date('2026-03-18T15:00:20.000Z').getTime();\n const processes: ProcessInfo[] = [\n {\n pid: 103,\n command: 'codex',\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: processStart,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const payload: { id: string; cwd: string; timestamp?: string } = { id: `sess-${_label}`, cwd: '/repo-a' };\n if (metaTimestamp !== undefined) {\n payload.timestamp = metaTimestamp;\n }\n\n const sessionFile = path.join(dateDir, `sess-${_label}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:00:30.000Z', payload: { type: 'token_count', message: `${_label} timestamp session` } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: `sess-${_label}`,\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: fileBirthtime,\n resolvedCwd: '',\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe(`sess-${_label}`);\n expect(mockedMatchProcessesToSessions.mock.calls[0][1][0].birthtimeMs).toBe(fileBirthtime);\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: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n { pid: 200, command: 'codex', cwd: '/repo-b', tty: 'ttys002', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const now = new Date();\n const dateDir = path.join(\n sessionsDir,\n String(now.getFullYear()),\n String(now.getMonth() + 1).padStart(2, '0'),\n String(now.getDate()).padStart(2, '0'),\n );\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'only-session.jsonl');\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'only-session', timestamp: now.toISOString(), cwd: '/repo-a' } }),\n );\n\n (adapter as any).codexSessionsDir = sessionsDir;\n\n const sessionFiles: SessionFile[] = [\n {\n sessionId: 'only-session',\n filePath: sessionFile,\n projectDir: dateDir,\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: '/repo-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.RUNNING);\n\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should match resumed sessions by id even when the JSONL predates the process', async () => {\n const sessionId = '019eabed-4079-7071-9531-b853ddd9914e';\n const processes: ProcessInfo[] = [\n {\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 ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '09');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const recentTs = new Date().toISOString();\n const sessionFile = path.join(dateDir, `rollout-2026-06-09T12-28-33-${sessionId}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: sessionId, timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'resumed codex conversation' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n const collectAllSpy = vi.spyOn(adapter as any, 'collectAllSessionFiles');\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(collectAllSpy).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 });\n expect(agents[0].summary).toBe('resumed codex conversation');\n } finally {\n collectAllSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should fall back to all session files for non-time-sortable resume ids', async () => {\n const sessionId = 'aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee';\n const processes: ProcessInfo[] = [\n {\n pid: 88020,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-v4-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '01', '02');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const recentTs = new Date().toISOString();\n const sessionFile = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: sessionId, timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'legacy id conversation' } }),\n ].join('\\n'));\n\n (adapter as any).codexSessionsDir = sessionsDir;\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n const collectAllSpy = vi.spyOn(adapter as any, 'collectAllSessionFiles');\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(collectAllSpy).toHaveBeenCalledOnce();\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 88020,\n sessionId,\n sessionFilePath: sessionFile,\n });\n } finally {\n collectAllSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should fall back to process-only when a resumed session becomes unreadable after direct matching', async () => {\n const sessionId = '019eabed-4079-7071-9531-b853ddd9914e';\n const processes: ProcessInfo[] = [\n {\n pid: 88019,\n command: `codex resume ${sessionId}`,\n cwd: '/repo-a',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T12:00:00.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-gone-'));\n const sessionsDir = path.join(tmpDir, 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '09');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, `rollout-2026-06-09T12-28-33-${sessionId}.jsonl`);\n\n (adapter as any).codexSessionsDir = sessionsDir;\n const findSpy = vi.spyOn(adapter as any, 'findSessionFileById').mockReturnValue({\n sessionId,\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: Date.now(),\n resolvedCwd: '/repo-a',\n });\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n try {\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 88019,\n sessionId: 'pid-88019',\n projectPath: '/repo-a',\n });\n expect(agents[0].sessionFilePath).toBeUndefined();\n } finally {\n findSpy.mockRestore();\n fs.rmSync(tmpDir, { recursive: true, force: true });\n }\n });\n\n it('should map a running Codex process from the hook session mapping', async () => {\n const originalHome = process.env.HOME;\n const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-mapping-'));\n process.env.HOME = tmpHome;\n\n try {\n const mappedAdapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n const sessionsDir = path.join(tmpHome, '.codex', 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '26');\n const mappingPath = path.join(tmpHome, '.codex', 'ai-devkit', 'sessions.json');\n const sessionFile = path.join(dateDir, 'rollout-2026-06-26T09-56-12-sess-mapped.jsonl');\n const recentTs = new Date().toISOString();\n\n fs.mkdirSync(dateDir, { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(sessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-mapped', timestamp: recentTs, cwd: '/repo-mapped' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'agent_message', message: 'mapped conversation' } }),\n ].join('\\n'));\n fs.writeFileSync(mappingPath, JSON.stringify({ 5151: sessionFile }));\n\n const processes: ProcessInfo[] = [\n {\n pid: 5151,\n command: 'codex',\n cwd: '/repo-mapped',\n tty: 'ttys001',\n startTime: new Date('2026-06-26T09:56:12.000Z'),\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'codex',\n pid: 5151,\n sessionId: 'sess-mapped',\n projectPath: '/repo-mapped',\n summary: 'mapped conversation',\n sessionFilePath: sessionFile,\n });\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n } finally {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n }\n });\n\n it('should fall back to legacy matching when mapped session file cannot be parsed', async () => {\n const originalHome = process.env.HOME;\n const tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-mapping-fallback-'));\n process.env.HOME = tmpHome;\n\n try {\n const mappedAdapter = new CodexAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n const sessionsDir = path.join(tmpHome, '.codex', 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '26');\n const mappingPath = path.join(tmpHome, '.codex', 'ai-devkit', 'sessions.json');\n const badSessionFile = path.join(dateDir, 'bad.jsonl');\n const fallbackSessionFile = path.join(dateDir, 'fallback.jsonl');\n const recentTs = new Date().toISOString();\n\n fs.mkdirSync(dateDir, { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(badSessionFile, '{not-json');\n fs.writeFileSync(fallbackSessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-fallback', timestamp: recentTs, cwd: '/repo-fallback' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'fallback conversation' } }),\n ].join('\\n'));\n fs.writeFileSync(mappingPath, JSON.stringify({ 6161: badSessionFile }));\n\n const processes: ProcessInfo[] = [\n {\n pid: 6161,\n command: 'codex',\n cwd: '/repo-fallback',\n tty: 'ttys001',\n startTime: new Date('2026-06-26T09:56:12.000Z'),\n },\n ];\n const fallbackSession: SessionFile = {\n sessionId: 'sess-fallback',\n filePath: fallbackSessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-06-26T09:56:15.000Z').getTime(),\n resolvedCwd: '',\n };\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([fallbackSession]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: processes[0],\n session: { ...fallbackSession, resolvedCwd: '/repo-fallback' },\n deltaMs: 3000,\n },\n ]);\n\n const agents = await mappedAdapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 6161,\n sessionId: 'sess-fallback',\n summary: 'fallback conversation',\n sessionFilePath: fallbackSessionFile,\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledWith(\n [processes[0]],\n expect.arrayContaining([expect.objectContaining({ filePath: fallbackSessionFile })]),\n );\n } finally {\n process.env.HOME = originalHome;\n fs.rmSync(tmpHome, { recursive: true, force: true });\n }\n });\n });\n\n describe('detectAgents — registry cache short-circuit', () => {\n let tmpDir: string;\n let regPath: string;\n let registry: AgentRegistry;\n let cachedAdapter: CodexAdapter;\n let sessionFilePath: string;\n\n function registerEntry(over: Partial<RegistryEntry> = {}): void {\n registry.register({\n name: 'codex-100',\n type: 'codex',\n pid: 100,\n tmuxSession: '',\n cwd: '/repo-a',\n startedAt: '2026-05-30T00:00:00.000Z',\n sessionId: 'sess-cached',\n sessionFilePath,\n ...over,\n });\n }\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-cache-'));\n regPath = path.join(tmpDir, 'agents.json');\n registry = new AgentRegistry(regPath);\n cachedAdapter = new CodexAdapter(registry);\n\n const recentTs = new Date().toISOString();\n sessionFilePath = path.join(tmpDir, 'sess-cached.jsonl');\n fs.writeFileSync(sessionFilePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-cached', timestamp: recentTs, cwd: '/repo-a' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'Hello from cache' } }),\n ].join('\\n'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('short-circuits matching when registry has a valid entry', async () => {\n registerEntry();\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\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: 'sess-cached',\n sessionFilePath,\n summary: 'Hello from cache',\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n });\n\n it('uses the hook session mapping instead of a stale registry entry for the same live pid', async () => {\n registerEntry();\n const sessionsDir = path.join(tmpDir, '.codex', 'sessions');\n const dateDir = path.join(sessionsDir, '2026', '06', '26');\n const mappingPath = path.join(tmpDir, '.codex', 'ai-devkit', 'sessions.json');\n const currentSessionFile = path.join(dateDir, 'sess-current.jsonl');\n const recentTs = new Date().toISOString();\n\n fs.mkdirSync(dateDir, { recursive: true });\n fs.mkdirSync(path.dirname(mappingPath), { recursive: true });\n fs.writeFileSync(currentSessionFile, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-current', timestamp: recentTs, cwd: '/repo-current' } }),\n JSON.stringify({ type: 'event', timestamp: recentTs, payload: { type: 'token_count', message: 'Hello from current mapping' } }),\n ].join('\\n'));\n fs.writeFileSync(mappingPath, JSON.stringify({ 100: currentSessionFile }));\n\n (cachedAdapter as any).codexSessionsDir = sessionsDir;\n (cachedAdapter as any).sessionMappingPath = mappingPath;\n\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-current', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\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: 'sess-current',\n sessionFilePath: currentSessionFile,\n summary: 'Hello from current mapping',\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();\n });\n\n it('falls through when no registry entry exists for the pid', async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n });\n\n it('falls through when registry entry type does not match', async () => {\n registerEntry({ type: 'claude' });\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it('falls through when the cached session file no longer exists', async () => {\n registerEntry({ sessionFilePath: path.join(tmpDir, 'deleted.jsonl') });\n const processes: ProcessInfo[] = [\n { pid: 100, command: 'codex', cwd: '/repo-a', tty: 'ttys001', startTime: new Date() },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n (cachedAdapter as any).codexSessionsDir = '/nonexistent';\n\n const agents = await cachedAdapter.detectAgents();\n\n expect(agents[0].sessionId).toBe('pid-100');\n });\n });\n\n describe('discoverSessions', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should return empty when sessions dir does not exist', () => {\n (adapter as any).codexSessionsDir = path.join(tmpDir, 'nonexistent');\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const { sessions } = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date() },\n ]);\n expect(sessions).toEqual([]);\n });\n\n it('should scan date directories based on process start times', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n // Create date dir for 2026-03-18\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n // Create session file with meta\n const sessionFile = path.join(dateDir, 'sess1.jsonl');\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess1', cwd: '/repo-a' } }),\n );\n\n const mockFiles: SessionFile[] = [\n {\n sessionId: 'sess1',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: 1710800324000,\n resolvedCwd: '',\n },\n ];\n mockedBatchGetSessionFileBirthtimes.mockReturnValue(mockFiles);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo-a', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n const { sessions, contentCache } = discoverSessions(processes);\n expect(sessions).toHaveLength(1);\n expect(sessions[0].resolvedCwd).toBe('/repo-a');\n expect(contentCache.has(sessionFile)).toBe(true);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n });\n\n it('should scan ±1 day window around process start time', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n // Create date dirs for 17, 18, 19\n for (const day of ['17', '18', '19']) {\n fs.mkdirSync(path.join(sessionsDir, '2026', '03', day), { recursive: true });\n }\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([]);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n discoverSessions(processes);\n expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);\n // Should scan all 3 date dirs\n const dirs = mockedBatchGetSessionFileBirthtimes.mock.calls[0][0] as string[];\n expect(dirs).toHaveLength(3);\n });\n\n it('should handle session files without session_meta', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'bad.jsonl');\n fs.writeFileSync(sessionFile, JSON.stringify({ type: 'event', payload: {} }));\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n { sessionId: 'bad', filePath: sessionFile, projectDir: dateDir, birthtimeMs: 1710800324000, resolvedCwd: '' },\n ]);\n\n const processes = [\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ];\n\n const { sessions } = discoverSessions(processes);\n expect(sessions[0].resolvedCwd).toBe('');\n });\n\n it('should use session_meta timestamp as the matching birthtime when valid', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const sessionFile = path.join(dateDir, 'sess-meta-time.jsonl');\n const metaTimestamp = '2026-03-18T15:00:05.000Z';\n fs.writeFileSync(sessionFile,\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-meta-time', timestamp: metaTimestamp, cwd: '/repo-a' } }),\n );\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'sess-meta-time',\n filePath: sessionFile,\n projectDir: dateDir,\n birthtimeMs: new Date('2026-03-18T15:05:30.000Z').getTime(),\n resolvedCwd: '',\n },\n ]);\n\n const { sessions } = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo-a', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ]);\n\n expect(sessions[0].resolvedCwd).toBe('/repo-a');\n expect(sessions[0].birthtimeMs).toBe(new Date(metaTimestamp).getTime());\n });\n\n it('should tolerate malformed session_meta and unreadable files', () => {\n const sessionsDir = path.join(tmpDir, 'sessions');\n (adapter as any).codexSessionsDir = sessionsDir;\n const discoverSessions = (adapter as any).discoverSessions.bind(adapter);\n\n const dateDir = path.join(sessionsDir, '2026', '03', '18');\n fs.mkdirSync(dateDir, { recursive: true });\n\n const malformedFile = path.join(dateDir, 'malformed.jsonl');\n const missingFile = path.join(dateDir, 'missing.jsonl');\n fs.writeFileSync(malformedFile, '{not valid json');\n\n mockedBatchGetSessionFileBirthtimes.mockReturnValue([\n {\n sessionId: 'malformed',\n filePath: malformedFile,\n projectDir: dateDir,\n birthtimeMs: 1710800324000,\n resolvedCwd: '',\n },\n {\n sessionId: 'missing',\n filePath: missingFile,\n projectDir: dateDir,\n birthtimeMs: 1710800325000,\n resolvedCwd: '',\n },\n ]);\n\n const result = discoverSessions([\n { pid: 1, command: 'codex', cwd: '/repo', tty: '', startTime: new Date('2026-03-18T15:00:00Z') },\n ]);\n\n expect(result.sessions).toHaveLength(2);\n expect(result.sessions[0].resolvedCwd).toBe('');\n expect(result.sessions[1].resolvedCwd).toBe('');\n expect(result.contentCache.has(malformedFile)).toBe(true);\n expect(result.contentCache.has(missingFile)).toBe(false);\n });\n });\n\n describe('findSessionFileById', () => {\n let tmpDir: string;\n let sessionsDir: string;\n const sessionId = 'aaaaaaaa-bbbb-4ccc-dddd-eeeeeeeeeeee';\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-resume-find-'));\n sessionsDir = path.join(tmpDir, 'sessions');\n fs.mkdirSync(path.join(sessionsDir, '2026', '03', '18'), { recursive: true });\n (adapter as any).codexSessionsDir = sessionsDir;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeResumeSession(timestamp?: string): string {\n const filePath = path.join(sessionsDir, '2026', '03', '18', `${sessionId}.jsonl`);\n const payload: { id: string; cwd: string; timestamp?: string } = { id: sessionId, cwd: '/repo-a' };\n if (timestamp !== undefined) {\n payload.timestamp = timestamp;\n }\n fs.writeFileSync(filePath, JSON.stringify({ type: 'session_meta', payload }));\n return filePath;\n }\n\n it('should return session_meta timestamp as birthtimeMs when valid', () => {\n const metaTimestamp = '2026-03-18T15:00:05.000Z';\n writeResumeSession(metaTimestamp);\n const findSessionFileById = (adapter as any).findSessionFileById.bind(adapter);\n\n const session = findSessionFileById(sessionId);\n\n expect(session).toMatchObject({\n sessionId,\n resolvedCwd: '/repo-a',\n birthtimeMs: new Date(metaTimestamp).getTime(),\n });\n });\n\n it.each<[string, string | undefined]>([\n ['missing', undefined],\n ['invalid', 'not-a-date'],\n ])('should fall back to stat birthtimeMs when session_meta timestamp is %s', (_label, metaTimestamp) => {\n const sessionFile = writeResumeSession(metaTimestamp);\n const stat = fs.statSync(sessionFile);\n const findSessionFileById = (adapter as any).findSessionFileById.bind(adapter);\n\n const session = findSessionFileById(sessionId);\n\n expect(session).not.toBeNull();\n expect(session.birthtimeMs).toBe(stat.birthtimeMs);\n });\n });\n\n describe('helper methods', () => {\n describe('determineStatus', () => {\n it('should return \"waiting\" for agent_message events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'agent_message',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"waiting\" for task_complete events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'task_complete',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"waiting\" for turn_aborted events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'turn_aborted',\n })).toBe(AgentStatus.WAITING);\n });\n\n it('should return \"running\" for active events', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(),\n lastPayloadType: 'token_count',\n })).toBe(AgentStatus.RUNNING);\n });\n\n it('should return \"idle\" when session exceeds threshold', () => {\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n expect(determineStatus({\n lastActive: new Date(Date.now() - 10 * 60 * 1000),\n lastPayloadType: 'token_count',\n })).toBe(AgentStatus.IDLE);\n });\n });\n\n describe('parseSession', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-test-'));\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n it('should parse session file with meta and events', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'session.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-1', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_reasoning', message: 'Working on feature' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session).toMatchObject({\n sessionId: 'sess-1',\n projectPath: '/repo',\n summary: 'Working on feature',\n lastPayloadType: 'agent_reasoning',\n });\n expect(session.sessionStart.toISOString()).toBe('2026-03-18T15:00:00.000Z');\n });\n\n it('should parse from cached content without reading disk', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const content = [\n JSON.stringify({ type: 'session_meta', payload: { id: 'cached-1', timestamp: '2026-03-18T15:00:00Z', cwd: '/cached' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: 'Cached result' } }),\n ].join('\\n');\n\n const session = parseSession(content, '/nonexistent/path.jsonl');\n expect(session).toMatchObject({\n sessionId: 'cached-1',\n projectPath: '/cached',\n summary: 'Cached result',\n });\n });\n\n it('should return null for non-existent file', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n expect(parseSession(undefined, path.join(tmpDir, 'nonexistent.jsonl'))).toBeNull();\n });\n\n it('should return null when first line is not session_meta', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'bad.jsonl');\n fs.writeFileSync(filePath, JSON.stringify({ type: 'event', payload: {} }));\n expect(parseSession(undefined, filePath)).toBeNull();\n });\n\n it('should return null when session_meta has no id', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'no-id.jsonl');\n fs.writeFileSync(filePath, JSON.stringify({ type: 'session_meta', payload: { cwd: '/repo' } }));\n expect(parseSession(undefined, filePath)).toBeNull();\n });\n\n it('should extract summary from last event message', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'summary.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-2', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_reasoning', message: 'First message' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:02:00Z', payload: { type: 'agent_message', message: 'Last message' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Last message');\n });\n\n it('should extract summary from current Codex response_item messages', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'response-item-summary.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-ri', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({\n type: 'response_item',\n timestamp: '2026-03-18T15:01:00Z',\n payload: {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'Parsed from current schema' }],\n },\n }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Parsed from current schema');\n expect(session.lastPayloadType).toBe('agent_message');\n });\n\n it('should treat completed Codex AgentMessage events as waiting for list status', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const determineStatus = (adapter as any).determineStatus.bind(adapter);\n const filePath = path.join(tmpDir, 'agent-message-status.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-am', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({\n type: 'event_msg',\n timestamp: new Date().toISOString(),\n payload: {\n type: 'item_completed',\n item: {\n type: 'AgentMessage',\n content: [{ type: 'Text', text: 'Waiting for the user now' }],\n },\n },\n }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Waiting for the user now');\n expect(session.lastPayloadType).toBe('agent_message');\n expect(determineStatus(session)).toBe(AgentStatus.WAITING);\n });\n\n it('should handle malformed JSON lines gracefully', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'malformed.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-m', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n 'not valid json',\n '{\"incomplete\": true',\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: 'Valid message' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session).not.toBeNull();\n expect(session.sessionId).toBe('sess-m');\n expect(session.summary).toBe('Valid message');\n });\n\n it('should default summary when no messages found', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const filePath = path.join(tmpDir, 'no-msg.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-3', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'token_count' } }),\n ].join('\\n'));\n\n const session = parseSession(undefined, filePath);\n expect(session.summary).toBe('Codex session active');\n });\n\n it('should return null for empty content', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n expect(parseSession('', '/fake/path.jsonl')).toBeNull();\n expect(parseSession(' \\n \\n ', '/fake/path.jsonl')).toBeNull();\n });\n\n it('should truncate long summary to 120 chars', () => {\n const parseSession = (adapter as any).parseSession.bind(adapter);\n const longMsg = 'A'.repeat(200);\n const content = [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-t', timestamp: '2026-03-18T15:00:00Z', cwd: '/repo' } }),\n JSON.stringify({ type: 'event', timestamp: '2026-03-18T15:01:00Z', payload: { type: 'agent_message', message: longMsg } }),\n ].join('\\n');\n\n const session = parseSession(content, '/fake/path.jsonl');\n expect(session.summary).toHaveLength(120);\n expect(session.summary.endsWith('...')).toBe(true);\n });\n });\n });\n\n describe('getConversation', () => {\n let tmpDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-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 agent messages', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Fix the bug' } },\n { type: 'event', timestamp: '2026-03-27T10:00:05Z', payload: { type: 'agent_message', message: 'I found the issue' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0]).toEqual({ role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' });\n expect(messages[1]).toEqual({ role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' });\n });\n\n it('should parse Codex response_item message records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:01Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'Fix the bug' }],\n },\n },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'I found the issue' }],\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n expect(messages[0]).toEqual({ role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' });\n expect(messages[1]).toEqual({ role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' });\n });\n\n it('should parse completed Codex AgentMessage event records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'item_completed',\n item: {\n type: 'AgentMessage',\n content: [{ type: 'Text', text: 'I found the issue' }],\n },\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([\n { role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05Z' },\n ]);\n });\n\n it('should not duplicate mirrored current Codex message records', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:01Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'Fix the bug' }],\n internal_chat_message_metadata_passthrough: { turn_id: 'turn-1' },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:01.001Z',\n payload: {\n type: 'item_completed',\n turn_id: 'turn-1',\n item: {\n type: 'UserMessage',\n content: [{ type: 'text', text: 'Fix the bug' }],\n },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2026-03-27T10:00:05Z',\n payload: {\n type: 'item_completed',\n turn_id: 'turn-1',\n item: {\n type: 'AgentMessage',\n id: 'msg-1',\n content: [{ type: 'Text', text: 'I found the issue' }],\n },\n },\n },\n {\n type: 'response_item',\n timestamp: '2026-03-27T10:00:05.005Z',\n payload: {\n type: 'message',\n id: 'msg-1',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'I found the issue' }],\n internal_chat_message_metadata_passthrough: { turn_id: 'turn-1' },\n },\n },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toEqual([\n { role: 'user', content: 'Fix the bug', timestamp: '2026-03-27T10:00:01Z' },\n { role: 'assistant', content: 'I found the issue', timestamp: '2026-03-27T10:00:05.005Z' },\n ]);\n });\n\n it('should skip session_meta entry', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('user');\n });\n\n it('should map task_complete to assistant role', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:05Z', payload: { type: 'task_complete', message: 'Task finished successfully' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('assistant');\n expect(messages[0].content).toBe('Task finished successfully');\n });\n\n it('should skip non-conversation types in default mode', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'exec_command', message: 'Running npm test' } },\n { type: 'event', timestamp: '2026-03-27T10:00:03Z', payload: { type: 'agent_message', message: 'Done' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(2);\n });\n\n it('should include non-conversation types as system in verbose mode', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'exec_command', message: 'Running npm test' } },\n ]);\n\n const messages = adapter.getConversation(filePath, { verbose: true });\n expect(messages).toHaveLength(1);\n expect(messages[0].role).toBe('system');\n expect(messages[0].content).toBe('Running npm test');\n });\n\n it('should handle malformed JSON lines gracefully', () => {\n const filePath = path.join(tmpDir, 'malformed.jsonl');\n fs.writeFileSync(filePath, [\n JSON.stringify({ type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } }),\n 'invalid json line',\n JSON.stringify({ type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: 'Hello' } }),\n ].join('\\n'));\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\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 skip entries with empty payload message', () => {\n const filePath = writeJsonl([\n { type: 'session_meta', payload: { id: 'sess-1', cwd: '/repo', timestamp: '2026-03-27T10:00:00Z' } },\n { type: 'event', timestamp: '2026-03-27T10:00:01Z', payload: { type: 'user_message', message: '' } },\n { type: 'event', timestamp: '2026-03-27T10:00:02Z', payload: { type: 'agent_message', message: 'Response' } },\n ]);\n\n const messages = adapter.getConversation(filePath);\n expect(messages).toHaveLength(1);\n expect(messages[0].content).toBe('Response');\n });\n });\n\n describe('listSessions', () => {\n let tmpDir: string;\n let sessionsDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-list-'));\n sessionsDir = path.join(tmpDir, 'sessions');\n fs.mkdirSync(sessionsDir, { recursive: true });\n (adapter as any).codexSessionsDir = sessionsDir;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeCodexSession(dateDir: string, sessionId: string, lines: object[]): string {\n fs.mkdirSync(dateDir, { recursive: true });\n const filePath = path.join(dateDir, `${sessionId}.jsonl`);\n fs.writeFileSync(filePath, lines.map((l) => JSON.stringify(l)).join('\\n'));\n return filePath;\n }\n\n it('returns empty when sessions dir does not exist', async () => {\n fs.rmSync(sessionsDir, { recursive: true, force: true });\n const result = await adapter.listSessions();\n expect(result).toEqual([]);\n });\n\n it('walks every YYYY/MM/DD dir and returns all sessions', async () => {\n const dayA = path.join(sessionsDir, '2025', '01', '01');\n const dayB = path.join(sessionsDir, '2025', '02', '03');\n writeCodexSession(dayA, 'sess-a', [\n { type: 'session_meta', payload: { id: 'sess-a', cwd: '/repo-a', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'msg-a' } },\n ]);\n writeCodexSession(dayB, 'sess-b', [\n { type: 'session_meta', payload: { id: 'sess-b', cwd: '/repo-b', timestamp: '2025-02-03T00:00:00Z' } },\n { type: 'event', timestamp: '2025-02-03T00:00:01Z', payload: { type: 'user_message', message: 'msg-b' } },\n ]);\n\n const result = await adapter.listSessions();\n\n expect(result).toHaveLength(2);\n const byId = Object.fromEntries(result.map((r) => [r.sessionId, r]));\n expect(byId['sess-a']).toMatchObject({\n type: 'codex',\n cwd: '/repo-a',\n firstUserMessage: 'msg-a',\n });\n expect(byId['sess-b']).toMatchObject({\n type: 'codex',\n cwd: '/repo-b',\n firstUserMessage: 'msg-b',\n });\n });\n\n it('applies strict-equality cwd filter against session_meta cwd', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'keep', [\n { type: 'session_meta', payload: { id: 'keep', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'yes' } },\n ]);\n writeCodexSession(day, 'drop', [\n { type: 'session_meta', payload: { id: 'drop', cwd: '/other', timestamp: '2025-01-01T00:01:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:01:01Z', payload: { type: 'user_message', message: 'no' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe('keep');\n });\n\n it('skips files without a session_meta first line', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'bad', [\n { type: 'event', timestamp: '2025-01-01T00:00:00Z', payload: { type: 'user_message', message: 'orphan' } },\n ]);\n writeCodexSession(day, 'good', [\n { type: 'session_meta', payload: { id: 'good', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'user_message', message: 'ok' } },\n ]);\n\n const result = await adapter.listSessions();\n expect(result).toHaveLength(1);\n expect(result[0].sessionId).toBe('good');\n });\n\n it('captures the first user_message as firstUserMessage', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 's', [\n { type: 'session_meta', payload: { id: 's', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'agent_message', message: 'preamble' } },\n { type: 'event', timestamp: '2025-01-01T00:00:02Z', payload: { type: 'user_message', message: 'first user' } },\n { type: 'event', timestamp: '2025-01-01T00:00:03Z', payload: { type: 'user_message', message: 'second user' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('first user');\n });\n\n it('captures the first current Codex response_item user message as firstUserMessage', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'response-item-user', [\n { type: 'session_meta', payload: { id: 'response-item-user', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n {\n type: 'response_item',\n timestamp: '2025-01-01T00:00:00.500Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: '<environment_context>\\n <cwd>/repo</cwd>\\n</environment_context>' }],\n },\n },\n {\n type: 'response_item',\n timestamp: '2025-01-01T00:00:01Z',\n payload: {\n type: 'message',\n role: 'assistant',\n content: [{ type: 'output_text', text: 'preamble' }],\n },\n },\n {\n type: 'response_item',\n timestamp: '2025-01-01T00:00:02Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'first current user' }],\n },\n },\n {\n type: 'response_item',\n timestamp: '2025-01-01T00:00:03Z',\n payload: {\n type: 'message',\n role: 'user',\n content: [{ type: 'input_text', text: 'second current user' }],\n },\n },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('first current user');\n });\n\n it('captures the first current Codex event_msg user message as firstUserMessage', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 'event-msg-user', [\n { type: 'session_meta', payload: { id: 'event-msg-user', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n {\n type: 'event_msg',\n timestamp: '2025-01-01T00:00:01Z',\n payload: {\n type: 'item_completed',\n item: {\n type: 'AgentMessage',\n content: [{ type: 'Text', text: 'preamble' }],\n },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2025-01-01T00:00:02Z',\n payload: {\n type: 'item_completed',\n item: {\n type: 'UserMessage',\n content: [{ type: 'text', text: 'first event user' }],\n },\n },\n },\n {\n type: 'event_msg',\n timestamp: '2025-01-01T00:00:03Z',\n payload: {\n type: 'item_completed',\n item: {\n type: 'UserMessage',\n content: [{ type: 'text', text: 'second event user' }],\n },\n },\n },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('first event user');\n });\n\n it('returns empty firstUserMessage when no user_message exists', async () => {\n const day = path.join(sessionsDir, '2025', '01', '01');\n writeCodexSession(day, 's', [\n { type: 'session_meta', payload: { id: 's', cwd: '/repo', timestamp: '2025-01-01T00:00:00Z' } },\n { type: 'event', timestamp: '2025-01-01T00:00:01Z', payload: { type: 'agent_message', message: 'agent only' } },\n ]);\n\n const result = await adapter.listSessions({ cwd: '/repo' });\n expect(result).toHaveLength(1);\n expect(result[0].firstUserMessage).toBe('');\n });\n });\n});\n"],"names":["fs","path","CodexAdapter","AgentStatus","AgentRegistry","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","canHandle","command","tty","useRealSessionMatcher","actualMatching","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","codexSessionsDir","toHaveLength","toMatchObject","status","RUNNING","projectPath","sessionId","summary","startTime","Date","tmpDir","mkdtempSync","join","tmpdir","sessionsDir","dateDir","mkdirSync","recursive","now","recentTs","toISOString","sessionFile","writeFileSync","JSON","stringify","payload","id","timestamp","message","sessionFiles","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","matches","process","session","deltaMs","rmSync","force","processStart","sessionTimestamp","lateBirthtime","calls","each","undefined","_label","metaTimestamp","fileBirthtime","String","getFullYear","getMonth","padStart","getDate","matched","find","a","unmatched","collectAllSpy","spyOn","not","toHaveBeenCalled","sessionFilePath","mockRestore","toHaveBeenCalledOnce","findSpy","toBeUndefined","originalHome","env","HOME","tmpHome","mappedAdapter","mappingPath","dirname","badSessionFile","fallbackSessionFile","fallbackSession","arrayContaining","objectContaining","regPath","registry","cachedAdapter","registerEntry","over","register","tmuxSession","startedAt","afterEach","currentSessionFile","sessionMappingPath","discoverSessions","bind","sessions","mockFiles","contentCache","has","toHaveBeenCalledTimes","day","dirs","malformedFile","missingFile","result","writeResumeSession","findSessionFileById","stat","statSync","toBeNull","determineStatus","lastActive","lastPayloadType","WAITING","IDLE","parseSession","sessionStart","content","role","text","item","longMsg","repeat","endsWith","writeJsonl","lines","map","l","messages","getConversation","internal_chat_message_metadata_passthrough","turn_id","verbose","writeCodexSession","listSessions","dayA","dayB","byId","Object","fromEntries","r","firstUserMessage"],"mappings":"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"}
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 });\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","entries","day","split","map","entry","overrides","runtime","runtimeRef","startedAt"],"mappings":"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"}