@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 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/adapters/PiAdapter.test.ts"],"sourcesContent":["/**\n * Tests for PiAdapter\n */\n\nimport type { MockedFunction } from 'vitest';\nimport * as fs from 'fs';\nimport * as os from 'os';\nimport * as path from 'path';\n\nimport { PiAdapter } from '../../adapters/PiAdapter.js';\nimport type { ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { AgentRegistry } from '../../utils/AgentRegistry.js';\nimport { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';\nimport { matchProcessesToSessions, generateAgentName } from '../../utils/matching.js';\n\nvi.mock('../../utils/process.js', async (importOriginal) => {\n const actual = await importOriginal() as typeof import('../../utils/process.js');\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock('../../utils/matching.js', () => ({\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 mockedMatchProcessesToSessions = matchProcessesToSessions as MockedFunction<typeof matchProcessesToSessions>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe('PiAdapter', () => {\n let adapter: PiAdapter;\n let tmpHome: string;\n let sessionsDir: string;\n\n beforeEach(() => {\n tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'pi-adapter-test-'));\n process.env.HOME = tmpHome;\n sessionsDir = path.join(tmpHome, '.pi', 'agent', 'sessions');\n fs.mkdirSync(sessionsDir, { recursive: true });\n\n adapter = new PiAdapter(new AgentRegistry(path.join(tmpHome, 'agents.json')));\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedMatchProcessesToSessions.mockReset();\n mockedGenerateAgentName.mockReset();\n\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) => (\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name)))\n ));\n mockedMatchProcessesToSessions.mockReturnValue([]);\n mockedGenerateAgentName.mockImplementation((cwd: string, pid: number) => {\n const folder = path.basename(cwd) || 'unknown';\n return `${folder} (${pid})`;\n });\n });\n\n afterEach(() => {\n fs.rmSync(tmpHome, { recursive: true, force: true });\n });\n\n it('exposes pi type', () => {\n expect(adapter.type).toBe('pi');\n });\n\n it('identifies Pi commands without matching unrelated paths', () => {\n expect(adapter.canHandle({ pid: 1, command: 'pi', cwd: '/repo', tty: 'ttys001' })).toBe(true);\n expect(adapter.canHandle({ pid: 2, command: '/usr/local/bin/PI --model x', cwd: '/repo', tty: 'ttys002' })).toBe(true);\n expect(adapter.canHandle({ pid: 3, command: 'node /opt/pi/bin/pi.js', cwd: '/repo', tty: 'ttys003' })).toBe(true);\n expect(adapter.canHandle({ pid: 4, command: 'node /repo/feature-pi-adapter/script.js', cwd: '/repo', tty: 'ttys004' })).toBe(false);\n expect(adapter.canHandle({ pid: 5, command: 'C:\\\\tools\\\\node.exe C:\\\\lib\\\\pi.js', cwd: '/repo', tty: 'ttys005' })).toBe(true);\n });\n\n it('rejects foreign executables from a hand-built snapshot context', async () => {\n const foreign: ProcessInfo = {\n pid: 6,\n command: 'claude --resume /Users/x/repos/pi/session.jsonl',\n cwd: '/repo',\n tty: 'ttys006',\n };\n\n expect(await adapter.detectAgents({ processes: [foreign] })).toEqual([]);\n });\n\n it('maps a running Pi process to the tracker session for its PID', async () => {\n const cwd = '/repo/project-a';\n const proc = makeProcess({ pid: 101, cwd });\n const sessionFile = writePiSession(cwd, [\n { type: 'session_meta', timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-101', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'implement Pi adapter' },\n { role: 'assistant', timestamp: new Date().toISOString(), content: 'working on it' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 101: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 101,\n projectPath: cwd,\n sessionId: 'sess-101',\n summary: 'implement Pi adapter',\n status: AgentStatus.WAITING,\n sessionFilePath: sessionFile,\n });\n expect(mockedMatchProcessesToSessions).not.toHaveBeenCalled();\n });\n\n it('truncates long user prompts in detected agent summaries', async () => {\n const cwd = '/repo/project-long-summary';\n const proc = makeProcess({ pid: 112, cwd });\n const longPrompt = 'x'.repeat(140);\n const sessionFile = writePiSession(cwd, [\n { type: 'session', timestamp: '2026-06-10T08:58:20.754Z', id: 'sess-long', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: longPrompt },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 112: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0].summary).toHaveLength(120);\n expect(agents[0].summary.endsWith('...')).toBe(true);\n });\n\n it('uses the filename session id fallback and reports running when the latest message is from the user', async () => {\n const cwd = '/repo/project-filename-fallback';\n const proc = makeProcess({ pid: 113, cwd });\n const sessionFile = writePiSessionWithFileName(cwd, 'plain-session.jsonl', [\n { role: 'user', timestamp: new Date().toISOString(), content: 'still working' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 113: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents[0]).toMatchObject({\n sessionId: 'plain-session',\n summary: 'still working',\n status: AgentStatus.RUNNING,\n });\n });\n\n it('falls back to legacy matching when sessions.json is missing', async () => {\n const cwd = '/repo/project-b';\n const proc = makeProcess({ pid: 202, cwd });\n const sessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-202' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'fallback matching please' },\n ]);\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-202',\n filePath: sessionFile,\n projectDir: path.dirname(sessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 202,\n projectPath: cwd,\n sessionId: 'sess-202',\n summary: 'fallback matching please',\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalledWith(\n [proc],\n expect.arrayContaining([\n expect.objectContaining({ filePath: sessionFile, resolvedCwd: cwd }),\n ]),\n );\n });\n\n it('ignores malformed tracker metadata and still falls back to legacy matching', async () => {\n const cwd = '/repo/project-c';\n const proc = makeProcess({ pid: 303, cwd });\n const sessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-303', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'recover from bad tracker' },\n ]);\n fs.writeFileSync(path.join(tmpHome, '.pi', 'agent', 'sessions.json'), '{bad json');\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-303',\n filePath: sessionFile,\n projectDir: path.dirname(sessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0].sessionId).toBe('sess-303');\n });\n\n it('falls back to legacy matching when a trusted tracker session is unparseable', async () => {\n const cwd = '/repo/project-bad-tracker-session';\n const proc = makeProcess({ pid: 304, cwd });\n const badSessionFile = writePiSessionWithFileName(cwd, 'bad.jsonl', ['{not json']);\n const fallbackSessionFile = writePiSession(cwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-304', cwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'fallback after bad tracker session' },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 304: badSessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n mockedMatchProcessesToSessions.mockReturnValue([\n {\n process: proc,\n session: {\n sessionId: 'sess-304',\n filePath: fallbackSessionFile,\n projectDir: path.dirname(fallbackSessionFile),\n birthtimeMs: Date.now(),\n resolvedCwd: cwd,\n },\n deltaMs: 0,\n },\n ]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n sessionId: 'sess-304',\n summary: 'fallback after bad tracker session',\n sessionFilePath: fallbackSessionFile,\n });\n expect(mockedMatchProcessesToSessions).toHaveBeenCalled();\n });\n\n it('does not trust tracker paths outside the Pi sessions directory', async () => {\n const cwd = '/repo/project-d';\n const proc = makeProcess({ pid: 404, cwd });\n const outside = path.join(tmpHome, 'outside.jsonl');\n fs.writeFileSync(outside, JSON.stringify({ role: 'user', content: 'nope' }));\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 404: outside }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n pid: 404,\n sessionId: 'pid-404',\n summary: 'Pi process running',\n });\n });\n\n it('returns a process-only agent when no session can be matched', async () => {\n const proc = makeProcess({ pid: 505, cwd: '/repo/project-e' });\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: 'pi',\n status: AgentStatus.RUNNING,\n pid: 505,\n projectPath: '/repo/project-e',\n sessionId: 'pid-505',\n summary: 'Pi process running',\n });\n });\n\n it('reads user and assistant conversation messages from JSONL', () => {\n const cwd = '/repo/project-f';\n const sessionFile = writePiSession(cwd, [\n { role: 'system', timestamp: '2026-06-10T08:58:20.000Z', content: 'hidden' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'hello pi' },\n { type: 'assistant', timestamp: '2026-06-10T08:58:22.000Z', message: { content: 'hello human' } },\n '{not json',\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'hello pi', timestamp: '2026-06-10T08:58:21.000Z' },\n { role: 'assistant', content: 'hello human', timestamp: '2026-06-10T08:58:22.000Z' },\n ]);\n });\n\n it('includes system entries only in verbose conversation mode', () => {\n const cwd = '/repo/project-verbose';\n const sessionFile = writePiSession(cwd, [\n { role: 'system', timestamp: '2026-06-10T08:58:20.000Z', content: 'model changed' },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'visible' },\n ]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'visible', timestamp: '2026-06-10T08:58:21.000Z' },\n ]);\n expect(adapter.getConversation(sessionFile, { verbose: true })).toEqual([\n { role: 'system', content: 'model changed', timestamp: '2026-06-10T08:58:20.000Z' },\n { role: 'user', content: 'visible', timestamp: '2026-06-10T08:58:21.000Z' },\n ]);\n });\n\n it('reads real Pi message entries with nested role and text parts', async () => {\n const cwd = '/repo/project-real';\n const proc = makeProcess({ pid: 606, cwd });\n const sessionFile = writePiSession(cwd, [\n { type: 'session', version: 3, id: 'sess-real', timestamp: '2026-06-10T13:27:17.581Z', cwd },\n { type: 'model_change', id: 'model-1', timestamp: '2026-06-10T13:27:17.655Z', modelId: 'claude-sonnet-4-6' },\n {\n type: 'message',\n id: 'msg-user',\n timestamp: '2026-06-10T13:27:37.975Z',\n message: {\n role: 'user',\n content: [{ type: 'text', text: 'hello' }],\n timestamp: 1781098057974,\n },\n },\n {\n type: 'message',\n id: 'msg-assistant',\n timestamp: '2026-06-10T13:27:40.161Z',\n message: {\n role: 'assistant',\n content: [{ type: 'text', text: 'Hello! How can I help you today?' }],\n provider: 'anthropic',\n model: 'claude-sonnet-4-6',\n timestamp: 1781098058012,\n },\n },\n ]);\n fs.writeFileSync(\n path.join(tmpHome, '.pi', 'agent', 'sessions.json'),\n JSON.stringify({ 606: sessionFile }),\n );\n mockedListAgentProcesses.mockReturnValue([proc]);\n\n expect(adapter.getConversation(sessionFile)).toEqual([\n { role: 'user', content: 'hello', timestamp: '2026-06-10T13:27:37.975Z' },\n { role: 'assistant', content: 'Hello! How can I help you today?', timestamp: '2026-06-10T13:27:40.161Z' },\n ]);\n\n const agents = await adapter.detectAgents();\n expect(agents[0]).toMatchObject({\n sessionId: 'sess-real',\n summary: 'hello',\n lastActive: new Date('2026-06-10T13:27:40.161Z'),\n });\n });\n\n it('lists historical sessions and applies cwd filtering', async () => {\n const matchingCwd = '/repo/project-g';\n const otherCwd = '/repo/project-h';\n const matchingSession = writePiSession(matchingCwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-g', cwd: matchingCwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'first matching message' },\n ]);\n writePiSession(otherCwd, [\n { timestamp: '2026-06-10T08:58:20.754Z', sessionId: 'sess-h', cwd: otherCwd },\n { role: 'user', timestamp: '2026-06-10T08:58:21.000Z', content: 'other message' },\n ]);\n\n const sessions = await adapter.listSessions({ cwd: matchingCwd });\n\n expect(sessions).toEqual([\n expect.objectContaining({\n type: 'pi',\n sessionId: 'sess-g',\n cwd: matchingCwd,\n firstUserMessage: 'first matching message',\n sessionFilePath: matchingSession,\n }),\n ]);\n });\n\n function makeProcess(overrides: Partial<ProcessInfo>): ProcessInfo {\n return {\n pid: 1,\n command: 'pi',\n cwd: '/repo',\n tty: 'ttys001',\n startTime: new Date('2026-06-10T08:58:20.000Z'),\n ...overrides,\n };\n }\n\n function writePiSession(cwd: string, entries: Array<Record<string, unknown> | string>): string {\n const projectDir = path.join(sessionsDir, encodeProjectDir(cwd));\n fs.mkdirSync(projectDir, { recursive: true });\n const sessionId = entries\n .map((entry) => typeof entry === 'string' ? undefined : entry.sessionId)\n .find((value): value is string => typeof value === 'string') ?? cryptoRandomSessionId();\n const filePath = path.join(projectDir, `2026-06-10T08-58-20-754Z_${sessionId}.jsonl`);\n fs.writeFileSync(\n filePath,\n entries.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry)).join('\\n'),\n );\n return filePath;\n }\n\n function writePiSessionWithFileName(cwd: string, fileName: string, entries: Array<Record<string, unknown> | string>): string {\n const projectDir = path.join(sessionsDir, encodeProjectDir(cwd));\n fs.mkdirSync(projectDir, { recursive: true });\n const filePath = path.join(projectDir, fileName);\n fs.writeFileSync(\n filePath,\n entries.map((entry) => typeof entry === 'string' ? entry : JSON.stringify(entry)).join('\\n'),\n );\n return filePath;\n }\n\n function encodeProjectDir(cwd: string): string {\n return cwd.replace(/\\//g, '-').replace(/^-?/, '--') + '--';\n }\n\n function cryptoRandomSessionId(): string {\n return `019eb0c1-06d2-71ed-90ee-${Math.random().toString(16).slice(2, 14).padEnd(12, '0')}`;\n }\n});\n"],"names":["fs","os","path","PiAdapter","AgentStatus","AgentRegistry","listAgentProcesses","enrichProcesses","captureProcessSnapshot","matchProcessesToSessions","generateAgentName","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedMatchProcessesToSessions","mockedGenerateAgentName","describe","adapter","tmpHome","sessionsDir","beforeEach","mkdtempSync","join","tmpdir","process","env","HOME","mkdirSync","recursive","mockReset","mockImplementation","procs","names","flatMap","name","mockReturnValue","cwd","pid","folder","basename","afterEach","rmSync","force","it","expect","type","toBe","canHandle","command","tty","foreign","detectAgents","processes","toEqual","proc","makeProcess","sessionFile","writePiSession","timestamp","sessionId","role","content","Date","toISOString","writeFileSync","JSON","stringify","agents","toHaveLength","toMatchObject","projectPath","summary","status","WAITING","sessionFilePath","not","toHaveBeenCalled","longPrompt","repeat","id","endsWith","writePiSessionWithFileName","RUNNING","session","filePath","projectDir","dirname","birthtimeMs","now","resolvedCwd","deltaMs","toHaveBeenCalledWith","arrayContaining","objectContaining","badSessionFile","fallbackSessionFile","outside","message","getConversation","verbose","version","modelId","text","provider","model","lastActive","matchingCwd","otherCwd","matchingSession","sessions","listSessions","firstUserMessage","overrides","startTime","entries","encodeProjectDir","map","entry","undefined","find","value","cryptoRandomSessionId","fileName","replace","Math","random","toString","slice","padEnd"],"mappings":"AAAA;;CAEC,GAGD,YAAYA,QAAQ,KAAK;AACzB,YAAYC,QAAQ,KAAK;AACzB,YAAYC,UAAU,OAAO;AAE7B,SAASC,SAAS,QAAQ,8BAA8B;AAExD,SAASC,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,aAAa,QAAQ,+BAA+B;AAC7D,SAASC,kBAAkB,EAAEC,eAAe,EAAEC,sBAAsB,QAAQ,yBAAyB;AACrG,SAASC,wBAAwB,EAAEC,iBAAiB,QAAQ,0BAA0B;AAEtFC,GAAGC,IAAI,CAAC,0BAA0B,OAAOC;IACrC,MAAMC,SAAS,MAAMD;IACrB,OAAO;QACH,GAAGC,MAAM;QACTR,oBAAoBK,GAAGI,EAAE;QACzBR,iBAAiBI,GAAGI,EAAE;QACtBP,wBAAwBG,GAAGI,EAAE;IACjC;AACJ;AAEAJ,GAAGC,IAAI,CAAC,2BAA2B,IAAO,CAAA;QACtCH,0BAA0BE,GAAGI,EAAE;QAC/BL,mBAAmBC,GAAGI,EAAE;IAC5B,CAAA;AAEA,MAAMC,2BAA2BV;AACjC,MAAMW,wBAAwBV;AAC9B,MAAMW,+BAA+BV;AACrC,MAAMW,iCAAiCV;AACvC,MAAMW,0BAA0BV;AAEhCW,SAAS,aAAa;IAClB,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IAEJC,WAAW;QACPF,UAAUvB,GAAG0B,WAAW,CAACxB,KAAKyB,IAAI,CAAC1B,GAAG2B,MAAM,IAAI;QAChDC,QAAQC,GAAG,CAACC,IAAI,GAAGR;QACnBC,cAActB,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS;QACjDvB,GAAGgC,SAAS,CAACR,aAAa;YAAES,WAAW;QAAK;QAE5CX,UAAU,IAAInB,UAAU,IAAIE,cAAcH,KAAKyB,IAAI,CAACJ,SAAS;QAC7DP,yBAAyBkB,SAAS;QAClCjB,sBAAsBiB,SAAS;QAC/BhB,6BAA6BgB,SAAS;QACtCf,+BAA+Be,SAAS;QACxCd,wBAAwBc,SAAS;QAEjCjB,sBAAsBkB,kBAAkB,CAAC,CAACC,QAAUA;QACpD,qGAAqG;QACrGlB,6BAA6BiB,kBAAkB,CAAC,OAAOE,QACnD9B,gBAAgB8B,MAAMC,OAAO,CAAC,CAACC,OAASjC,mBAAmBiC;QAE/DpB,+BAA+BqB,eAAe,CAAC,EAAE;QACjDpB,wBAAwBe,kBAAkB,CAAC,CAACM,KAAaC;YACrD,MAAMC,SAASzC,KAAK0C,QAAQ,CAACH,QAAQ;YACrC,OAAO,GAAGE,OAAO,EAAE,EAAED,IAAI,CAAC,CAAC;QAC/B;IACJ;IAEAG,UAAU;QACN7C,GAAG8C,MAAM,CAACvB,SAAS;YAAEU,WAAW;YAAMc,OAAO;QAAK;IACtD;IAEAC,GAAG,mBAAmB;QAClBC,OAAO3B,QAAQ4B,IAAI,EAAEC,IAAI,CAAC;IAC9B;IAEAH,GAAG,2DAA2D;QAC1DC,OAAO3B,QAAQ8B,SAAS,CAAC;YAAEV,KAAK;YAAGW,SAAS;YAAMZ,KAAK;YAASa,KAAK;QAAU,IAAIH,IAAI,CAAC;QACxFF,OAAO3B,QAAQ8B,SAAS,CAAC;YAAEV,KAAK;YAAGW,SAAS;YAA+BZ,KAAK;YAASa,KAAK;QAAU,IAAIH,IAAI,CAAC;QACjHF,OAAO3B,QAAQ8B,SAAS,CAAC;YAAEV,KAAK;YAAGW,SAAS;YAA0BZ,KAAK;YAASa,KAAK;QAAU,IAAIH,IAAI,CAAC;QAC5GF,OAAO3B,QAAQ8B,SAAS,CAAC;YAAEV,KAAK;YAAGW,SAAS;YAA2CZ,KAAK;YAASa,KAAK;QAAU,IAAIH,IAAI,CAAC;QAC7HF,OAAO3B,QAAQ8B,SAAS,CAAC;YAAEV,KAAK;YAAGW,SAAS;YAAsCZ,KAAK;YAASa,KAAK;QAAU,IAAIH,IAAI,CAAC;IAC5H;IAEAH,GAAG,kEAAkE;QACjE,MAAMO,UAAuB;YACzBb,KAAK;YACLW,SAAS;YACTZ,KAAK;YACLa,KAAK;QACT;QAEAL,OAAO,MAAM3B,QAAQkC,YAAY,CAAC;YAAEC,WAAW;gBAACF;aAAQ;QAAC,IAAIG,OAAO,CAAC,EAAE;IAC3E;IAEAV,GAAG,gEAAgE;QAC/D,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAMoB,cAAcC,eAAerB,KAAK;YACpC;gBAAES,MAAM;gBAAgBa,WAAW;gBAA4BC,WAAW;gBAAYvB;YAAI;YAC1F;gBAAEwB,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAAuB;YACvF;gBAAED,MAAM;gBAAaF,WAAW,IAAII,OAAOC,WAAW;gBAAIF,SAAS;YAAgB;SACtF;QACDlE,GAAGqE,aAAa,CACZnE,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS,kBACnC+C,KAAKC,SAAS,CAAC;YAAE,KAAKV;QAAY;QAEtC7C,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAE/C,MAAMa,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,QAAQC,YAAY,CAAC;QAC5BxB,OAAOuB,MAAM,CAAC,EAAE,EAAEE,aAAa,CAAC;YAC5BxB,MAAM;YACNR,KAAK;YACLiC,aAAalC;YACbuB,WAAW;YACXY,SAAS;YACTC,QAAQzE,YAAY0E,OAAO;YAC3BC,iBAAiBlB;QACrB;QACAZ,OAAO9B,gCAAgC6D,GAAG,CAACC,gBAAgB;IAC/D;IAEAjC,GAAG,2DAA2D;QAC1D,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAMyC,aAAa,IAAIC,MAAM,CAAC;QAC9B,MAAMtB,cAAcC,eAAerB,KAAK;YACpC;gBAAES,MAAM;gBAAWa,WAAW;gBAA4BqB,IAAI;gBAAa3C;YAAI;YAC/E;gBAAEwB,MAAM;gBAAQF,WAAW;gBAA4BG,SAASgB;YAAW;SAC9E;QACDlF,GAAGqE,aAAa,CACZnE,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS,kBACnC+C,KAAKC,SAAS,CAAC;YAAE,KAAKV;QAAY;QAEtC7C,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAE/C,MAAMa,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,MAAM,CAAC,EAAE,CAACI,OAAO,EAAEH,YAAY,CAAC;QACvCxB,OAAOuB,MAAM,CAAC,EAAE,CAACI,OAAO,CAACS,QAAQ,CAAC,QAAQlC,IAAI,CAAC;IACnD;IAEAH,GAAG,sGAAsG;QACrG,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAMoB,cAAcyB,2BAA2B7C,KAAK,uBAAuB;YACvE;gBAAEwB,MAAM;gBAAQF,WAAW,IAAII,OAAOC,WAAW;gBAAIF,SAAS;YAAgB;SACjF;QACDlE,GAAGqE,aAAa,CACZnE,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS,kBACnC+C,KAAKC,SAAS,CAAC;YAAE,KAAKV;QAAY;QAEtC7C,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAE/C,MAAMa,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,MAAM,CAAC,EAAE,EAAEE,aAAa,CAAC;YAC5BV,WAAW;YACXY,SAAS;YACTC,QAAQzE,YAAYmF,OAAO;QAC/B;IACJ;IAEAvC,GAAG,+DAA+D;QAC9D,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAMoB,cAAcC,eAAerB,KAAK;YACpC;gBAAEsB,WAAW;gBAA4BC,WAAW;YAAW;YAC/D;gBAAEC,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAA2B;SAC9F;QACDlD,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAC/CxC,+BAA+BqB,eAAe,CAAC;YAC3C;gBACIX,SAAS8B;gBACT6B,SAAS;oBACLxB,WAAW;oBACXyB,UAAU5B;oBACV6B,YAAYxF,KAAKyF,OAAO,CAAC9B;oBACzB+B,aAAazB,KAAK0B,GAAG;oBACrBC,aAAarD;gBACjB;gBACAsD,SAAS;YACb;SACH;QAED,MAAMvB,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,QAAQC,YAAY,CAAC;QAC5BxB,OAAOuB,MAAM,CAAC,EAAE,EAAEE,aAAa,CAAC;YAC5BxB,MAAM;YACNR,KAAK;YACLiC,aAAalC;YACbuB,WAAW;YACXY,SAAS;QACb;QACA3B,OAAO9B,gCAAgC6E,oBAAoB,CACvD;YAACrC;SAAK,EACNV,OAAOgD,eAAe,CAAC;YACnBhD,OAAOiD,gBAAgB,CAAC;gBAAET,UAAU5B;gBAAaiC,aAAarD;YAAI;SACrE;IAET;IAEAO,GAAG,8EAA8E;QAC7E,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAMoB,cAAcC,eAAerB,KAAK;YACpC;gBAAEsB,WAAW;gBAA4BC,WAAW;gBAAYvB;YAAI;YACpE;gBAAEwB,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAA2B;SAC9F;QACDlE,GAAGqE,aAAa,CAACnE,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS,kBAAkB;QACtEP,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAC/CxC,+BAA+BqB,eAAe,CAAC;YAC3C;gBACIX,SAAS8B;gBACT6B,SAAS;oBACLxB,WAAW;oBACXyB,UAAU5B;oBACV6B,YAAYxF,KAAKyF,OAAO,CAAC9B;oBACzB+B,aAAazB,KAAK0B,GAAG;oBACrBC,aAAarD;gBACjB;gBACAsD,SAAS;YACb;SACH;QAED,MAAMvB,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,QAAQC,YAAY,CAAC;QAC5BxB,OAAOuB,MAAM,CAAC,EAAE,CAACR,SAAS,EAAEb,IAAI,CAAC;IACrC;IAEAH,GAAG,+EAA+E;QAC9E,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAM0D,iBAAiBb,2BAA2B7C,KAAK,aAAa;YAAC;SAAY;QACjF,MAAM2D,sBAAsBtC,eAAerB,KAAK;YAC5C;gBAAEsB,WAAW;gBAA4BC,WAAW;gBAAYvB;YAAI;YACpE;gBAAEwB,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAAqC;SACxG;QACDlE,GAAGqE,aAAa,CACZnE,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS,kBACnC+C,KAAKC,SAAS,CAAC;YAAE,KAAK4B;QAAe;QAEzCnF,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAC/CxC,+BAA+BqB,eAAe,CAAC;YAC3C;gBACIX,SAAS8B;gBACT6B,SAAS;oBACLxB,WAAW;oBACXyB,UAAUW;oBACVV,YAAYxF,KAAKyF,OAAO,CAACS;oBACzBR,aAAazB,KAAK0B,GAAG;oBACrBC,aAAarD;gBACjB;gBACAsD,SAAS;YACb;SACH;QAED,MAAMvB,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,QAAQC,YAAY,CAAC;QAC5BxB,OAAOuB,MAAM,CAAC,EAAE,EAAEE,aAAa,CAAC;YAC5BV,WAAW;YACXY,SAAS;YACTG,iBAAiBqB;QACrB;QACAnD,OAAO9B,gCAAgC8D,gBAAgB;IAC3D;IAEAjC,GAAG,kEAAkE;QACjE,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAM4D,UAAUnG,KAAKyB,IAAI,CAACJ,SAAS;QACnCvB,GAAGqE,aAAa,CAACgC,SAAS/B,KAAKC,SAAS,CAAC;YAAEN,MAAM;YAAQC,SAAS;QAAO;QACzElE,GAAGqE,aAAa,CACZnE,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS,kBACnC+C,KAAKC,SAAS,CAAC;YAAE,KAAK8B;QAAQ;QAElCrF,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAE/C,MAAMa,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,QAAQC,YAAY,CAAC;QAC5BxB,OAAOuB,MAAM,CAAC,EAAE,EAAEE,aAAa,CAAC;YAC5BxB,MAAM;YACNR,KAAK;YACLsB,WAAW;YACXY,SAAS;QACb;IACJ;IAEA5B,GAAG,+DAA+D;QAC9D,MAAMW,OAAOC,YAAY;YAAElB,KAAK;YAAKD,KAAK;QAAkB;QAC5DzB,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAE/C,MAAMa,SAAS,MAAMlD,QAAQkC,YAAY;QAEzCP,OAAOuB,QAAQC,YAAY,CAAC;QAC5BxB,OAAOuB,MAAM,CAAC,EAAE,EAAEE,aAAa,CAAC;YAC5BxB,MAAM;YACN2B,QAAQzE,YAAYmF,OAAO;YAC3B7C,KAAK;YACLiC,aAAa;YACbX,WAAW;YACXY,SAAS;QACb;IACJ;IAEA5B,GAAG,6DAA6D;QAC5D,MAAMP,MAAM;QACZ,MAAMoB,cAAcC,eAAerB,KAAK;YACpC;gBAAEwB,MAAM;gBAAUF,WAAW;gBAA4BG,SAAS;YAAS;YAC3E;gBAAED,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAAW;YAC3E;gBAAEhB,MAAM;gBAAaa,WAAW;gBAA4BuC,SAAS;oBAAEpC,SAAS;gBAAc;YAAE;YAChG;SACH;QAEDjB,OAAO3B,QAAQiF,eAAe,CAAC1C,cAAcH,OAAO,CAAC;YACjD;gBAAEO,MAAM;gBAAQC,SAAS;gBAAYH,WAAW;YAA2B;YAC3E;gBAAEE,MAAM;gBAAaC,SAAS;gBAAeH,WAAW;YAA2B;SACtF;IACL;IAEAf,GAAG,6DAA6D;QAC5D,MAAMP,MAAM;QACZ,MAAMoB,cAAcC,eAAerB,KAAK;YACpC;gBAAEwB,MAAM;gBAAUF,WAAW;gBAA4BG,SAAS;YAAgB;YAClF;gBAAED,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAAU;SAC7E;QAEDjB,OAAO3B,QAAQiF,eAAe,CAAC1C,cAAcH,OAAO,CAAC;YACjD;gBAAEO,MAAM;gBAAQC,SAAS;gBAAWH,WAAW;YAA2B;SAC7E;QACDd,OAAO3B,QAAQiF,eAAe,CAAC1C,aAAa;YAAE2C,SAAS;QAAK,IAAI9C,OAAO,CAAC;YACpE;gBAAEO,MAAM;gBAAUC,SAAS;gBAAiBH,WAAW;YAA2B;YAClF;gBAAEE,MAAM;gBAAQC,SAAS;gBAAWH,WAAW;YAA2B;SAC7E;IACL;IAEAf,GAAG,iEAAiE;QAChE,MAAMP,MAAM;QACZ,MAAMkB,OAAOC,YAAY;YAAElB,KAAK;YAAKD;QAAI;QACzC,MAAMoB,cAAcC,eAAerB,KAAK;YACpC;gBAAES,MAAM;gBAAWuD,SAAS;gBAAGrB,IAAI;gBAAarB,WAAW;gBAA4BtB;YAAI;YAC3F;gBAAES,MAAM;gBAAgBkC,IAAI;gBAAWrB,WAAW;gBAA4B2C,SAAS;YAAoB;YAC3G;gBACIxD,MAAM;gBACNkC,IAAI;gBACJrB,WAAW;gBACXuC,SAAS;oBACLrC,MAAM;oBACNC,SAAS;wBAAC;4BAAEhB,MAAM;4BAAQyD,MAAM;wBAAQ;qBAAE;oBAC1C5C,WAAW;gBACf;YACJ;YACA;gBACIb,MAAM;gBACNkC,IAAI;gBACJrB,WAAW;gBACXuC,SAAS;oBACLrC,MAAM;oBACNC,SAAS;wBAAC;4BAAEhB,MAAM;4BAAQyD,MAAM;wBAAmC;qBAAE;oBACrEC,UAAU;oBACVC,OAAO;oBACP9C,WAAW;gBACf;YACJ;SACH;QACD/D,GAAGqE,aAAa,CACZnE,KAAKyB,IAAI,CAACJ,SAAS,OAAO,SAAS,kBACnC+C,KAAKC,SAAS,CAAC;YAAE,KAAKV;QAAY;QAEtC7C,yBAAyBwB,eAAe,CAAC;YAACmB;SAAK;QAE/CV,OAAO3B,QAAQiF,eAAe,CAAC1C,cAAcH,OAAO,CAAC;YACjD;gBAAEO,MAAM;gBAAQC,SAAS;gBAASH,WAAW;YAA2B;YACxE;gBAAEE,MAAM;gBAAaC,SAAS;gBAAoCH,WAAW;YAA2B;SAC3G;QAED,MAAMS,SAAS,MAAMlD,QAAQkC,YAAY;QACzCP,OAAOuB,MAAM,CAAC,EAAE,EAAEE,aAAa,CAAC;YAC5BV,WAAW;YACXY,SAAS;YACTkC,YAAY,IAAI3C,KAAK;QACzB;IACJ;IAEAnB,GAAG,uDAAuD;QACtD,MAAM+D,cAAc;QACpB,MAAMC,WAAW;QACjB,MAAMC,kBAAkBnD,eAAeiD,aAAa;YAChD;gBAAEhD,WAAW;gBAA4BC,WAAW;gBAAUvB,KAAKsE;YAAY;YAC/E;gBAAE9C,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAAyB;SAC5F;QACDJ,eAAekD,UAAU;YACrB;gBAAEjD,WAAW;gBAA4BC,WAAW;gBAAUvB,KAAKuE;YAAS;YAC5E;gBAAE/C,MAAM;gBAAQF,WAAW;gBAA4BG,SAAS;YAAgB;SACnF;QAED,MAAMgD,WAAW,MAAM5F,QAAQ6F,YAAY,CAAC;YAAE1E,KAAKsE;QAAY;QAE/D9D,OAAOiE,UAAUxD,OAAO,CAAC;YACrBT,OAAOiD,gBAAgB,CAAC;gBACpBhD,MAAM;gBACNc,WAAW;gBACXvB,KAAKsE;gBACLK,kBAAkB;gBAClBrC,iBAAiBkC;YACrB;SACH;IACL;IAEA,SAASrD,YAAYyD,SAA+B;QAChD,OAAO;YACH3E,KAAK;YACLW,SAAS;YACTZ,KAAK;YACLa,KAAK;YACLgE,WAAW,IAAInD,KAAK;YACpB,GAAGkD,SAAS;QAChB;IACJ;IAEA,SAASvD,eAAerB,GAAW,EAAE8E,OAAgD;QACjF,MAAM7B,aAAaxF,KAAKyB,IAAI,CAACH,aAAagG,iBAAiB/E;QAC3DzC,GAAGgC,SAAS,CAAC0D,YAAY;YAAEzD,WAAW;QAAK;QAC3C,MAAM+B,YAAYuD,QACbE,GAAG,CAAC,CAACC,QAAU,OAAOA,UAAU,WAAWC,YAAYD,MAAM1D,SAAS,EACtE4D,IAAI,CAAC,CAACC,QAA2B,OAAOA,UAAU,aAAaC;QACpE,MAAMrC,WAAWvF,KAAKyB,IAAI,CAAC+D,YAAY,CAAC,yBAAyB,EAAE1B,UAAU,MAAM,CAAC;QACpFhE,GAAGqE,aAAa,CACZoB,UACA8B,QAAQE,GAAG,CAAC,CAACC,QAAU,OAAOA,UAAU,WAAWA,QAAQpD,KAAKC,SAAS,CAACmD,QAAQ/F,IAAI,CAAC;QAE3F,OAAO8D;IACX;IAEA,SAASH,2BAA2B7C,GAAW,EAAEsF,QAAgB,EAAER,OAAgD;QAC/G,MAAM7B,aAAaxF,KAAKyB,IAAI,CAACH,aAAagG,iBAAiB/E;QAC3DzC,GAAGgC,SAAS,CAAC0D,YAAY;YAAEzD,WAAW;QAAK;QAC3C,MAAMwD,WAAWvF,KAAKyB,IAAI,CAAC+D,YAAYqC;QACvC/H,GAAGqE,aAAa,CACZoB,UACA8B,QAAQE,GAAG,CAAC,CAACC,QAAU,OAAOA,UAAU,WAAWA,QAAQpD,KAAKC,SAAS,CAACmD,QAAQ/F,IAAI,CAAC;QAE3F,OAAO8D;IACX;IAEA,SAAS+B,iBAAiB/E,GAAW;QACjC,OAAOA,IAAIuF,OAAO,CAAC,OAAO,KAAKA,OAAO,CAAC,OAAO,QAAQ;IAC1D;IAEA,SAASF;QACL,OAAO,CAAC,wBAAwB,EAAEG,KAAKC,MAAM,GAAGC,QAAQ,CAAC,IAAIC,KAAK,CAAC,GAAG,IAAIC,MAAM,CAAC,IAAI,MAAM;IAC/F;AACJ"}
@@ -1,128 +0,0 @@
1
- import fs from 'fs';
2
- import os from 'os';
3
- import path from 'path';
4
- import Database from 'better-sqlite3';
5
- import { afterEach, describe, expect, it } from 'vitest';
6
- import { DatabaseConnection } from '../../database/connection.js';
7
- import { getSchemaVersion } from '../../database/schema.js';
8
- const roots = [];
9
- afterEach(()=>{
10
- for (const root of roots.splice(0))fs.rmSync(root, {
11
- recursive: true,
12
- force: true
13
- });
14
- });
15
- function dbPath() {
16
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-db-'));
17
- roots.push(root);
18
- return path.join(root, 'state', 'agents.db');
19
- }
20
- describe('durable agents schema', ()=>{
21
- it('migrates to version 4 with durable constraints and indexes', ()=>{
22
- const connection = new DatabaseConnection({
23
- dbPath: dbPath()
24
- });
25
- expect(getSchemaVersion(connection)).toBe(4);
26
- const table = connection.queryOne("SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'durable_agents'");
27
- expect(table?.sql).toContain("DEFAULT 'durable'");
28
- expect(table?.sql).toContain("state IN ('ready','running','degraded')");
29
- expect(connection.query("SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'durable_agents'").map(({ name })=>name)).toEqual(expect.arrayContaining([
30
- 'idx_durable_agents_state',
31
- 'idx_durable_agents_list'
32
- ]));
33
- connection.close();
34
- });
35
- it('upgrades a version 3 database to nullable, unique provider sessions', ()=>{
36
- const file = dbPath();
37
- fs.mkdirSync(path.dirname(file), {
38
- recursive: true
39
- });
40
- const raw = new Database(file);
41
- raw.exec(`
42
- CREATE TABLE durable_agents (
43
- id TEXT PRIMARY KEY,
44
- provider_session_id TEXT NOT NULL UNIQUE
45
- );
46
- INSERT INTO durable_agents (id, provider_session_id) VALUES ('existing', 'existing-session');
47
- PRAGMA user_version = 3;
48
- `);
49
- raw.close();
50
- const connection = new DatabaseConnection({
51
- dbPath: file
52
- });
53
- expect(getSchemaVersion(connection)).toBe(4);
54
- expect(()=>connection.execute('INSERT INTO durable_agents (id, provider_session_id) VALUES (?, NULL)', [
55
- 'codex'
56
- ])).not.toThrow();
57
- expect(()=>connection.execute('INSERT INTO durable_agents (id, provider_session_id) VALUES (?, ?)', [
58
- 'duplicate',
59
- 'existing-session'
60
- ])).toThrow(/UNIQUE/i);
61
- connection.close();
62
- });
63
- it('enforces case-insensitive names and active-run consistency but permits new providers', ()=>{
64
- const connection = new DatabaseConnection({
65
- dbPath: dbPath()
66
- });
67
- const insert = (name, provider, state = 'ready')=>connection.execute(`
68
- INSERT INTO durable_agents (
69
- id, name, provider, mode, cwd, provider_session_id, state, session_health,
70
- created_at, updated_at
71
- ) VALUES (?, ?, ?, 'durable', '/tmp', ?, ?, 'uninitialized', ?, ?)
72
- `, [
73
- crypto.randomUUID(),
74
- name,
75
- provider,
76
- crypto.randomUUID(),
77
- state,
78
- new Date().toISOString(),
79
- new Date().toISOString()
80
- ]);
81
- expect(()=>insert('Alpha', 'future-provider')).not.toThrow();
82
- expect(()=>insert('alpha', 'claude')).toThrow(/UNIQUE/i);
83
- expect(()=>insert('Broken', 'claude', 'running')).toThrow(/CHECK/i);
84
- connection.close();
85
- });
86
- });
87
- describe('readonly DatabaseConnection', ()=>{
88
- it('opens an already migrated database without changing it', ()=>{
89
- const file = dbPath();
90
- const writable = new DatabaseConnection({
91
- dbPath: file
92
- });
93
- writable.close();
94
- const before = fs.statSync(file).mtimeMs;
95
- const readonly = new DatabaseConnection({
96
- dbPath: file,
97
- readonly: true
98
- });
99
- expect(readonly.queryOne('PRAGMA user_version')?.user_version).toBe(4);
100
- readonly.close();
101
- expect(fs.statSync(file).mtimeMs).toBe(before);
102
- });
103
- it('does not create a missing database or migrate an old one', ()=>{
104
- const missing = dbPath();
105
- expect(()=>new DatabaseConnection({
106
- dbPath: missing,
107
- readonly: true
108
- })).toThrow(/readonly.*exist/i);
109
- expect(fs.existsSync(missing)).toBe(false);
110
- fs.mkdirSync(path.dirname(missing), {
111
- recursive: true
112
- });
113
- const raw = new Database(missing);
114
- raw.pragma('user_version = 2');
115
- raw.close();
116
- expect(()=>new DatabaseConnection({
117
- dbPath: missing,
118
- readonly: true
119
- })).toThrow(/schema version 3/i);
120
- expect(new Database(missing, {
121
- readonly: true
122
- }).pragma('user_version', {
123
- simple: true
124
- })).toBe(2);
125
- });
126
- });
127
-
128
- //# sourceMappingURL=DurableAgentsDatabase.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../../src/__tests__/database/DurableAgentsDatabase.test.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport Database from 'better-sqlite3';\nimport { afterEach, describe, expect, it } from 'vitest';\nimport { DatabaseConnection } from '../../database/connection.js';\nimport { getSchemaVersion } from '../../database/schema.js';\n\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction dbPath(): string {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-db-'));\n roots.push(root);\n return path.join(root, 'state', 'agents.db');\n}\n\ndescribe('durable agents schema', () => {\n it('migrates to version 4 with durable constraints and indexes', () => {\n const connection = new DatabaseConnection({ dbPath: dbPath() });\n expect(getSchemaVersion(connection)).toBe(4);\n const table = connection.queryOne<{ sql: string }>(\n \"SELECT sql FROM sqlite_master WHERE type = 'table' AND name = 'durable_agents'\",\n );\n expect(table?.sql).toContain(\"DEFAULT 'durable'\");\n expect(table?.sql).toContain(\"state IN ('ready','running','degraded')\");\n expect(connection.query<{ name: string }>(\n \"SELECT name FROM sqlite_master WHERE type = 'index' AND tbl_name = 'durable_agents'\",\n ).map(({ name }) => name)).toEqual(expect.arrayContaining([\n 'idx_durable_agents_state', 'idx_durable_agents_list',\n ]));\n connection.close();\n });\n\n it('upgrades a version 3 database to nullable, unique provider sessions', () => {\n const file = dbPath();\n fs.mkdirSync(path.dirname(file), { recursive: true });\n const raw = new Database(file);\n raw.exec(`\n CREATE TABLE durable_agents (\n id TEXT PRIMARY KEY,\n provider_session_id TEXT NOT NULL UNIQUE\n );\n INSERT INTO durable_agents (id, provider_session_id) VALUES ('existing', 'existing-session');\n PRAGMA user_version = 3;\n `);\n raw.close();\n\n const connection = new DatabaseConnection({ dbPath: file });\n expect(getSchemaVersion(connection)).toBe(4);\n expect(() => connection.execute(\n 'INSERT INTO durable_agents (id, provider_session_id) VALUES (?, NULL)', ['codex'],\n )).not.toThrow();\n expect(() => connection.execute(\n 'INSERT INTO durable_agents (id, provider_session_id) VALUES (?, ?)', ['duplicate', 'existing-session'],\n )).toThrow(/UNIQUE/i);\n connection.close();\n });\n\n it('enforces case-insensitive names and active-run consistency but permits new providers', () => {\n const connection = new DatabaseConnection({ dbPath: dbPath() });\n const insert = (name: string, provider: string, state = 'ready') => connection.execute(`\n INSERT INTO durable_agents (\n id, name, provider, mode, cwd, provider_session_id, state, session_health,\n created_at, updated_at\n ) VALUES (?, ?, ?, 'durable', '/tmp', ?, ?, 'uninitialized', ?, ?)\n `, [crypto.randomUUID(), name, provider, crypto.randomUUID(), state, new Date().toISOString(), new Date().toISOString()]);\n expect(() => insert('Alpha', 'future-provider')).not.toThrow();\n expect(() => insert('alpha', 'claude')).toThrow(/UNIQUE/i);\n expect(() => insert('Broken', 'claude', 'running')).toThrow(/CHECK/i);\n connection.close();\n });\n});\n\ndescribe('readonly DatabaseConnection', () => {\n it('opens an already migrated database without changing it', () => {\n const file = dbPath();\n const writable = new DatabaseConnection({ dbPath: file });\n writable.close();\n const before = fs.statSync(file).mtimeMs;\n const readonly = new DatabaseConnection({ dbPath: file, readonly: true });\n expect(readonly.queryOne<{ user_version: number }>('PRAGMA user_version')?.user_version).toBe(4);\n readonly.close();\n expect(fs.statSync(file).mtimeMs).toBe(before);\n });\n\n it('does not create a missing database or migrate an old one', () => {\n const missing = dbPath();\n expect(() => new DatabaseConnection({ dbPath: missing, readonly: true })).toThrow(/readonly.*exist/i);\n expect(fs.existsSync(missing)).toBe(false);\n\n fs.mkdirSync(path.dirname(missing), { recursive: true });\n const raw = new Database(missing);\n raw.pragma('user_version = 2');\n raw.close();\n expect(() => new DatabaseConnection({ dbPath: missing, readonly: true })).toThrow(/schema version 3/i);\n expect(new Database(missing, { readonly: true }).pragma('user_version', { simple: true })).toBe(2);\n });\n});\n"],"names":["fs","os","path","Database","afterEach","describe","expect","it","DatabaseConnection","getSchemaVersion","roots","root","splice","rmSync","recursive","force","dbPath","mkdtempSync","join","tmpdir","push","connection","toBe","table","queryOne","sql","toContain","query","map","name","toEqual","arrayContaining","close","file","mkdirSync","dirname","raw","exec","execute","not","toThrow","insert","provider","state","crypto","randomUUID","Date","toISOString","writable","before","statSync","mtimeMs","readonly","user_version","missing","existsSync","pragma","simple"],"mappings":"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"}
@@ -1,109 +0,0 @@
1
- /**
2
- * Codex Adapter
3
- *
4
- * Detects running Codex agents by:
5
- * 1. Filtering Codex processes from a shared asynchronous process snapshot
6
- * 2. Using snapshot CWD and start-time enrichment
7
- * 3. Matching exact PID-to-session metadata from ~/.codex/ai-devkit/sessions.json
8
- * 4. Discovering session files from ~/.codex/sessions/YYYY/MM/DD/ via shared batchGetSessionFileBirthtimes()
9
- * 5. Setting resolvedCwd from session_meta first line
10
- * 6. Matching sessions to processes via shared matchProcessesToSessions()
11
- * 7. Extracting summary from last event entry in session JSONL
12
- */
13
- import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from './AgentAdapter.js';
14
- import { AgentRegistry } from '../utils/AgentRegistry.js';
15
- export declare class CodexAdapter implements AgentAdapter {
16
- readonly type: "codex";
17
- readonly processNames: readonly ["codex"];
18
- private static readonly IDLE_THRESHOLD_MINUTES;
19
- /** Include session files around process start day to recover long-lived processes. */
20
- private static readonly PROCESS_START_DAY_WINDOW_DAYS;
21
- private codexSessionsDir;
22
- private sessionMappingPath;
23
- private registry;
24
- constructor(registry?: AgentRegistry);
25
- canHandle(processInfo: ProcessInfo): boolean;
26
- /**
27
- * Detect running Codex agents
28
- */
29
- detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
30
- private mapSessionMappingMatches;
31
- private matchFromSessionMapping;
32
- private readSessionMapping;
33
- private toPid;
34
- private isTrustedSessionPath;
35
- private tryRegistryCache;
36
- /**
37
- * Match processes via `codex resume <uuid>` in their command line.
38
- * Resumed sessions predate the process, so birth-time proximity cannot
39
- * reliably pair them with the running PID.
40
- */
41
- private tryResumeMatching;
42
- private extractResumeSessionId;
43
- private findSessionFileById;
44
- private getCandidateSessionFiles;
45
- private mapDirectMatches;
46
- /**
47
- * Discover session files for the given processes.
48
- *
49
- * Uses process start times to determine which YYYY/MM/DD date directories
50
- * to scan (±1 day window), then batches stat calls across all directories.
51
- * Reads each file once and caches content for later parsing by parseSession().
52
- * Sets resolvedCwd from session_meta first line.
53
- */
54
- private discoverSessions;
55
- /**
56
- * Determine which date directories to scan based on process start times.
57
- * Returns only directories that actually exist.
58
- */
59
- private getDateDirs;
60
- private getDateDirsAroundDate;
61
- private toSessionDayKey;
62
- private tryParseUuidV7Date;
63
- /**
64
- * Parse session file content into CodexSession.
65
- * Uses cached content if available, otherwise reads from disk.
66
- */
67
- private parseSession;
68
- private mapSessionToAgent;
69
- private mapProcessOnlyAgent;
70
- private findLastEventEntry;
71
- private parseTimestamp;
72
- private parseMetaTimestampMs;
73
- private determineStatus;
74
- private extractSummary;
75
- private normalizedPayloadType;
76
- private extractEntryText;
77
- private truncate;
78
- private isCodexExecutable;
79
- /**
80
- * Read the full conversation from a Codex session JSONL file.
81
- *
82
- * Codex entries use either legacy payload.message fields or current
83
- * response_item/event_msg content arrays.
84
- */
85
- getConversation(sessionFilePath: string, options?: {
86
- verbose?: boolean;
87
- }): ConversationMessage[];
88
- private toConversationMessage;
89
- private mapCodexRole;
90
- private mapCodexItemRole;
91
- private mirroredMessageKey;
92
- private extractContentText;
93
- listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
94
- /**
95
- * Walk every YYYY/MM/DD directory under `codexSessionsDir` and return
96
- * absolute paths of `.jsonl` files. Tolerates malformed layouts
97
- * (skips entries that aren't directories at the expected depth).
98
- */
99
- private collectAllSessionFiles;
100
- private collectSessionFilesInDateDirs;
101
- /**
102
- * Read a Codex session JSONL file and produce a {@link SessionSummary}.
103
- * Returns null when the file is unreadable, has no `session_meta`, or
104
- * lacks a session id.
105
- */
106
- private fileToSessionSummary;
107
- private isSyntheticUserMessage;
108
- }
109
- //# sourceMappingURL=CodexAdapter.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"CodexAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/CodexAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,KAAK,EACR,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAM3B,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AA4D1D,qBAAa,YAAa,YAAW,YAAY;IAC7C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,YAAY,qBAAsB;IAE3C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IACnD,sFAAsF;IACtF,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,6BAA6B,CAAK;IAE1D,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,kBAAkB,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,QAAQ,GAAE,aAAuC;IAO7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C;;OAEG;IACG,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAqDzE,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,uBAAuB;IAuB/B,OAAO,CAAC,kBAAkB;IAwB1B,OAAO,CAAC,KAAK;IAQb,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,gBAAgB;IAiCxB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IA0BzB,OAAO,CAAC,sBAAsB;IAK9B,OAAO,CAAC,mBAAmB;IAiC3B,OAAO,CAAC,wBAAwB;IAWhC,OAAO,CAAC,gBAAgB;IAgBxB;;;;;;;OAOG;IACH,OAAO,CAAC,gBAAgB;IAsCxB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,qBAAqB;IAe7B,OAAO,CAAC,eAAe;IAOvB,OAAO,CAAC,kBAAkB;IAW1B;;;OAGG;IACH,OAAO,CAAC,YAAY;IAwDpB,OAAO,CAAC,iBAAiB;IAczB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,eAAe;IAmBvB,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,qBAAqB;IAmB7B,OAAO,CAAC,gBAAgB;IAYxB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,iBAAiB;IAKzB;;;;;OAKG;IACH,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IA8ChG,OAAO,CAAC,qBAAqB;IAwC7B,OAAO,CAAC,YAAY;IAMpB,OAAO,CAAC,gBAAgB;IAMxB,OAAO,CAAC,kBAAkB;IAS1B,OAAO,CAAC,kBAAkB;IAYpB,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBzE;;;;OAIG;IACH,OAAO,CAAC,sBAAsB;IA0B9B,OAAO,CAAC,6BAA6B;IAarC;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IA8D5B,OAAO,CAAC,sBAAsB;CAGjC"}