@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
@@ -2,153 +2,147 @@
2
2
  * Tests for utils/session.ts
3
3
  */
4
4
 
5
- import type { MockedFunction } from 'vitest';
5
+ import type { MockedFunction } from "vitest";
6
6
 
7
- import * as fs from 'fs';
8
- import { batchGetSessionFileBirthtimes } from '../../utils/session.js';
7
+ import * as fs from "fs";
8
+ import { batchGetSessionFileBirthtimes } from "../../utils/session.js";
9
9
 
10
- vi.mock('fs', () => ({
11
- readdirSync: vi.fn(),
12
- statSync: vi.fn(),
10
+ vi.mock("fs", () => ({
11
+ readdirSync: vi.fn(),
12
+ statSync: vi.fn(),
13
13
  }));
14
14
 
15
15
  const mockedReaddirSync = fs.readdirSync as MockedFunction<typeof fs.readdirSync>;
16
16
  const mockedStatSync = fs.statSync as MockedFunction<typeof fs.statSync>;
17
17
 
18
- describe('batchGetSessionFileBirthtimes', () => {
19
- beforeEach(() => {
20
- mockedReaddirSync.mockReset();
21
- mockedStatSync.mockReset();
18
+ describe("batchGetSessionFileBirthtimes", () => {
19
+ beforeEach(() => {
20
+ mockedReaddirSync.mockReset();
21
+ mockedStatSync.mockReset();
22
+ });
23
+
24
+ it("should parse session files correctly", () => {
25
+ mockedReaddirSync.mockReturnValue(["abc123.jsonl", "def456.jsonl"] as unknown as ReturnType<
26
+ typeof fs.readdirSync
27
+ >);
28
+ mockedStatSync
29
+ .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)
30
+ .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);
31
+
32
+ const results = batchGetSessionFileBirthtimes(["/home/.claude/projects/my-app"]);
33
+
34
+ expect(results).toHaveLength(2);
35
+ expect(results[0]).toEqual({
36
+ sessionId: "abc123",
37
+ filePath: "/home/.claude/projects/my-app/abc123.jsonl",
38
+ projectDir: "/home/.claude/projects/my-app",
39
+ birthtimeMs: 1710800324000,
40
+ resolvedCwd: "",
22
41
  });
23
-
24
- it('should parse session files correctly', () => {
25
- mockedReaddirSync.mockReturnValue([
26
- 'abc123.jsonl',
27
- 'def456.jsonl',
28
- ] as unknown as ReturnType<typeof fs.readdirSync>);
29
- mockedStatSync
30
- .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)
31
- .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);
32
-
33
- const results = batchGetSessionFileBirthtimes(['/home/.claude/projects/my-app']);
34
-
35
- expect(results).toHaveLength(2);
36
- expect(results[0]).toEqual({
37
- sessionId: 'abc123',
38
- filePath: '/home/.claude/projects/my-app/abc123.jsonl',
39
- projectDir: '/home/.claude/projects/my-app',
40
- birthtimeMs: 1710800324000,
41
- resolvedCwd: '',
42
- });
43
- expect(results[1].sessionId).toBe('def456');
44
- expect(results[1].birthtimeMs).toBe(1710800500000);
45
- });
46
-
47
- it('should return empty array for empty dirs list', () => {
48
- expect(batchGetSessionFileBirthtimes([])).toEqual([]);
49
- expect(mockedReaddirSync).not.toHaveBeenCalled();
50
- });
51
-
52
- it('should return empty array on readdir failure', () => {
53
- mockedReaddirSync.mockImplementation(() => {
54
- throw new Error('ENOENT');
55
- });
56
-
57
- expect(batchGetSessionFileBirthtimes(['/some/dir'])).toEqual([]);
42
+ expect(results[1].sessionId).toBe("def456");
43
+ expect(results[1].birthtimeMs).toBe(1710800500000);
44
+ });
45
+
46
+ it("should return empty array for empty dirs list", () => {
47
+ expect(batchGetSessionFileBirthtimes([])).toEqual([]);
48
+ expect(mockedReaddirSync).not.toHaveBeenCalled();
49
+ });
50
+
51
+ it("should return empty array on readdir failure", () => {
52
+ mockedReaddirSync.mockImplementation(() => {
53
+ throw new Error("ENOENT");
58
54
  });
59
55
 
60
- it('should skip files with invalid birthtime (0 or negative)', () => {
61
- mockedReaddirSync.mockReturnValue([
62
- 'bad.jsonl',
63
- 'negative.jsonl',
64
- 'good.jsonl',
65
- ] as unknown as ReturnType<typeof fs.readdirSync>);
66
- mockedStatSync
67
- .mockReturnValueOnce({ birthtimeMs: 0 } as fs.Stats)
68
- .mockReturnValueOnce({ birthtimeMs: -1 } as fs.Stats)
69
- .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);
70
-
71
- const results = batchGetSessionFileBirthtimes(['/dir']);
72
- expect(results).toHaveLength(1);
73
- expect(results[0].sessionId).toBe('good');
74
- });
75
-
76
- it('should skip non-jsonl files', () => {
77
- mockedReaddirSync.mockReturnValue([
78
- 'sessions-index.json',
79
- 'abc123.jsonl',
80
- ] as unknown as ReturnType<typeof fs.readdirSync>);
81
- mockedStatSync
82
- .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);
83
-
84
- const results = batchGetSessionFileBirthtimes(['/dir']);
85
- expect(results).toHaveLength(1);
86
- expect(results[0].sessionId).toBe('abc123');
87
- });
88
-
89
- it('should handle empty directory', () => {
90
- mockedReaddirSync.mockReturnValue([] as unknown as ReturnType<typeof fs.readdirSync>);
91
- expect(batchGetSessionFileBirthtimes(['/dir'])).toEqual([]);
92
- });
93
-
94
- it('should handle UUID session IDs', () => {
95
- mockedReaddirSync.mockReturnValue([
96
- '068e7b1f-cff5-4c94-bf69-b9acd32d765c.jsonl',
97
- ] as unknown as ReturnType<typeof fs.readdirSync>);
98
- mockedStatSync
99
- .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);
100
-
101
- const results = batchGetSessionFileBirthtimes(['/dir']);
102
- expect(results).toHaveLength(1);
103
- expect(results[0].sessionId).toBe('068e7b1f-cff5-4c94-bf69-b9acd32d765c');
104
- });
105
-
106
- it('should leave resolvedCwd empty', () => {
107
- mockedReaddirSync.mockReturnValue([
108
- 'abc.jsonl',
109
- ] as unknown as ReturnType<typeof fs.readdirSync>);
110
- mockedStatSync
111
- .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);
112
-
113
- const results = batchGetSessionFileBirthtimes(['/dir']);
114
- expect(results[0].resolvedCwd).toBe('');
115
- });
116
-
117
- it('should enumerate multiple directories', () => {
118
- mockedReaddirSync
119
- .mockReturnValueOnce([
120
- 'sess1.jsonl',
121
- 'sess3.jsonl',
122
- ] as unknown as ReturnType<typeof fs.readdirSync>)
123
- .mockReturnValueOnce([
124
- 'sess2.jsonl',
125
- ] as unknown as ReturnType<typeof fs.readdirSync>);
126
- mockedStatSync
127
- .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)
128
- .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats)
129
- .mockReturnValueOnce({ birthtimeMs: 1710800400000 } as fs.Stats);
130
-
131
- const results = batchGetSessionFileBirthtimes(['/projects/app-a', '/projects/app-b']);
132
-
133
- expect(mockedReaddirSync).toHaveBeenCalledTimes(2);
134
-
135
- expect(results).toHaveLength(3);
136
- expect(results[0].projectDir).toBe('/projects/app-a');
137
- expect(results[1].projectDir).toBe('/projects/app-a');
138
- expect(results[2].projectDir).toBe('/projects/app-b');
139
- });
140
-
141
- it('should skip files where statSync fails', () => {
142
- mockedReaddirSync.mockReturnValue([
143
- 'good.jsonl',
144
- 'gone.jsonl',
145
- ] as unknown as ReturnType<typeof fs.readdirSync>);
146
- mockedStatSync
147
- .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)
148
- .mockImplementationOnce(() => { throw new Error('ENOENT'); });
149
-
150
- const results = batchGetSessionFileBirthtimes(['/dir']);
151
- expect(results).toHaveLength(1);
152
- expect(results[0].sessionId).toBe('good');
153
- });
56
+ expect(batchGetSessionFileBirthtimes(["/some/dir"])).toEqual([]);
57
+ });
58
+
59
+ it("should skip files with invalid birthtime (0 or negative)", () => {
60
+ mockedReaddirSync.mockReturnValue([
61
+ "bad.jsonl",
62
+ "negative.jsonl",
63
+ "good.jsonl",
64
+ ] as unknown as ReturnType<typeof fs.readdirSync>);
65
+ mockedStatSync
66
+ .mockReturnValueOnce({ birthtimeMs: 0 } as fs.Stats)
67
+ .mockReturnValueOnce({ birthtimeMs: -1 } as fs.Stats)
68
+ .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);
69
+
70
+ const results = batchGetSessionFileBirthtimes(["/dir"]);
71
+ expect(results).toHaveLength(1);
72
+ expect(results[0].sessionId).toBe("good");
73
+ });
74
+
75
+ it("should skip non-jsonl files", () => {
76
+ mockedReaddirSync.mockReturnValue([
77
+ "sessions-index.json",
78
+ "abc123.jsonl",
79
+ ] as unknown as ReturnType<typeof fs.readdirSync>);
80
+ mockedStatSync.mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);
81
+
82
+ const results = batchGetSessionFileBirthtimes(["/dir"]);
83
+ expect(results).toHaveLength(1);
84
+ expect(results[0].sessionId).toBe("abc123");
85
+ });
86
+
87
+ it("should handle empty directory", () => {
88
+ mockedReaddirSync.mockReturnValue([] as unknown as ReturnType<typeof fs.readdirSync>);
89
+ expect(batchGetSessionFileBirthtimes(["/dir"])).toEqual([]);
90
+ });
91
+
92
+ it("should handle UUID session IDs", () => {
93
+ mockedReaddirSync.mockReturnValue([
94
+ "068e7b1f-cff5-4c94-bf69-b9acd32d765c.jsonl",
95
+ ] as unknown as ReturnType<typeof fs.readdirSync>);
96
+ mockedStatSync.mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);
97
+
98
+ const results = batchGetSessionFileBirthtimes(["/dir"]);
99
+ expect(results).toHaveLength(1);
100
+ expect(results[0].sessionId).toBe("068e7b1f-cff5-4c94-bf69-b9acd32d765c");
101
+ });
102
+
103
+ it("should leave resolvedCwd empty", () => {
104
+ mockedReaddirSync.mockReturnValue(["abc.jsonl"] as unknown as ReturnType<
105
+ typeof fs.readdirSync
106
+ >);
107
+ mockedStatSync.mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);
108
+
109
+ const results = batchGetSessionFileBirthtimes(["/dir"]);
110
+ expect(results[0].resolvedCwd).toBe("");
111
+ });
112
+
113
+ it("should enumerate multiple directories", () => {
114
+ mockedReaddirSync
115
+ .mockReturnValueOnce(["sess1.jsonl", "sess3.jsonl"] as unknown as ReturnType<
116
+ typeof fs.readdirSync
117
+ >)
118
+ .mockReturnValueOnce(["sess2.jsonl"] as unknown as ReturnType<typeof fs.readdirSync>);
119
+ mockedStatSync
120
+ .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)
121
+ .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats)
122
+ .mockReturnValueOnce({ birthtimeMs: 1710800400000 } as fs.Stats);
123
+
124
+ const results = batchGetSessionFileBirthtimes(["/projects/app-a", "/projects/app-b"]);
125
+
126
+ expect(mockedReaddirSync).toHaveBeenCalledTimes(2);
127
+
128
+ expect(results).toHaveLength(3);
129
+ expect(results[0].projectDir).toBe("/projects/app-a");
130
+ expect(results[1].projectDir).toBe("/projects/app-a");
131
+ expect(results[2].projectDir).toBe("/projects/app-b");
132
+ });
133
+
134
+ it("should skip files where statSync fails", () => {
135
+ mockedReaddirSync.mockReturnValue(["good.jsonl", "gone.jsonl"] as unknown as ReturnType<
136
+ typeof fs.readdirSync
137
+ >);
138
+ mockedStatSync
139
+ .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)
140
+ .mockImplementationOnce(() => {
141
+ throw new Error("ENOENT");
142
+ });
143
+
144
+ const results = batchGetSessionFileBirthtimes(["/dir"]);
145
+ expect(results).toHaveLength(1);
146
+ expect(results[0].sessionId).toBe("good");
147
+ });
154
148
  });
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * Agent Adapter Interface
3
- *
3
+ *
4
4
  * Defines the contract for detecting and managing different types of AI agents.
5
5
  * Each adapter is responsible for detecting agents of a specific type (e.g., claude).
6
6
  */
@@ -8,83 +8,91 @@
8
8
  /**
9
9
  * Type of AI agent
10
10
  */
11
- export type AgentType = 'claude' | 'gemini_cli' | 'grok_cli' | 'codex' | 'opencode' | 'copilot' | 'pi' | 'other';
11
+ export type AgentType =
12
+ | "claude"
13
+ | "gemini_cli"
14
+ | "grok_cli"
15
+ | "codex"
16
+ | "opencode"
17
+ | "copilot"
18
+ | "pi"
19
+ | "other";
12
20
 
13
21
  /**
14
22
  * Current status of an agent
15
23
  */
16
24
  export enum AgentStatus {
17
- RUNNING = 'running',
18
- WAITING = 'waiting',
19
- IDLE = 'idle',
20
- UNKNOWN = 'unknown'
25
+ RUNNING = "running",
26
+ WAITING = "waiting",
27
+ IDLE = "idle",
28
+ UNKNOWN = "unknown",
21
29
  }
22
30
 
23
31
  /**
24
32
  * Information about a detected agent
25
33
  */
26
34
  export interface AgentInfo {
27
- /** Project-based name (e.g., "ai-devkit" or "ai-devkit (merry)") */
28
- name: string;
35
+ /** Project-based name (e.g., "ai-devkit" or "ai-devkit (merry)") */
36
+ name: string;
29
37
 
30
- /** Type of agent */
31
- type: AgentType;
38
+ /** Type of agent */
39
+ type: AgentType;
32
40
 
33
- /** Current status */
34
- status: AgentStatus;
41
+ /** Current status */
42
+ status: AgentStatus;
35
43
 
36
- /** Last user prompt from history */
37
- summary: string;
44
+ /** Last user prompt from history */
45
+ summary: string;
38
46
 
39
- /** Process ID */
40
- pid: number;
47
+ /** Process ID */
48
+ pid: number;
41
49
 
42
- /** Working directory/project path */
43
- projectPath: string;
50
+ /** Working directory/project path */
51
+ projectPath: string;
44
52
 
45
- /** Session UUID */
46
- sessionId: string;
53
+ /** Session UUID */
54
+ sessionId: string;
47
55
 
48
- /** Timestamp of last activity */
49
- lastActive: Date;
56
+ /** Timestamp of last activity */
57
+ lastActive: Date;
50
58
 
51
- /** Whether the live process is pinned in the agent console */
52
- pinned?: boolean;
59
+ /** Whether the live process is pinned in the agent console */
60
+ pinned?: boolean;
53
61
 
54
- /** Path to the session JSONL file on disk */
55
- sessionFilePath?: string;
62
+ /** Path to the session JSONL file on disk */
63
+ sessionFilePath?: string;
56
64
  }
57
65
 
58
66
  /**
59
67
  * Information about a running process
60
68
  */
61
69
  export interface ProcessInfo {
62
- /** Process ID */
63
- pid: number;
70
+ /** Process ID */
71
+ pid: number;
64
72
 
65
- /** Parent process ID, populated by process discovery when available */
66
- ppid?: number;
73
+ /** Parent process ID, populated by process discovery when available */
74
+ ppid?: number;
67
75
 
68
- /** Process command */
69
- command: string;
76
+ /** Process command */
77
+ command: string;
70
78
 
71
- /** Working directory */
72
- cwd: string;
79
+ /** Working directory */
80
+ cwd: string;
73
81
 
74
- /** Terminal TTY (e.g., "ttys030") */
75
- tty: string;
82
+ /** Terminal TTY (e.g., "ttys030") */
83
+ tty: string;
76
84
 
77
- /** Process start time, populated by process enrichment */
78
- startTime?: Date;
85
+ /** Process start time, populated by process enrichment */
86
+ startTime?: Date;
79
87
  }
80
88
 
81
89
  /**
82
90
  * A single message in a conversation
83
91
  */
84
92
  export interface ConversationMessage {
85
- role: 'user' | 'assistant' | 'system';
86
- content: string;
87
- timestamp?: string;
93
+ role: "user" | "assistant" | "system";
94
+ content: string;
95
+ timestamp?: string;
88
96
  }
89
97
 
90
98
  /**
@@ -94,36 +102,36 @@ export interface ConversationMessage {
94
102
  * a session and resume it via the originating tool's resume command.
95
103
  */
96
104
  export interface SessionSummary {
97
- /** Tool that produced this session */
98
- type: AgentType;
99
-
100
- /**
101
- * ID accepted by the tool's resume command. Adapters MUST pass this
102
- * through verbatim — no normalization, no encoding/decoding — so it
103
- * round-trips into `claude --resume <id>` (and equivalents).
104
- */
105
- sessionId: string;
106
-
107
- /** Working directory the session was started in (best-known value) */
108
- cwd: string;
109
-
110
- /**
111
- * Trimmed first user message; empty string if none. Adapters apply
112
- * the same noise-filter their existing parsers use (skip tool_result
113
- * blocks, request-interruption notices, system-injected skill
114
- * content). The CLI table renderer substitutes a placeholder for
115
- * empty values; JSON output keeps the empty string raw.
116
- */
117
- firstUserMessage: string;
118
-
119
- /** Last activity timestamp (from session content; falls back to file mtime) */
120
- lastActive: Date;
121
-
122
- /** Session start time (from session content; falls back to file birthtime/mtime) */
123
- startedAt: Date;
124
-
125
- /** Absolute path to the session file on disk (debug/diagnostics) */
126
- sessionFilePath: string;
105
+ /** Tool that produced this session */
106
+ type: AgentType;
107
+
108
+ /**
109
+ * ID accepted by the tool's resume command. Adapters MUST pass this
110
+ * through verbatim — no normalization, no encoding/decoding — so it
111
+ * round-trips into `claude --resume <id>` (and equivalents).
112
+ */
113
+ sessionId: string;
114
+
115
+ /** Working directory the session was started in (best-known value) */
116
+ cwd: string;
117
+
118
+ /**
119
+ * Trimmed first user message; empty string if none. Adapters apply
120
+ * the same noise-filter their existing parsers use (skip tool_result
121
+ * blocks, request-interruption notices, system-injected skill
122
+ * content). The CLI table renderer substitutes a placeholder for
123
+ * empty values; JSON output keeps the empty string raw.
124
+ */
125
+ firstUserMessage: string;
126
+
127
+ /** Last activity timestamp (from session content; falls back to file mtime) */
128
+ lastActive: Date;
129
+
130
+ /** Session start time (from session content; falls back to file birthtime/mtime) */
131
+ startedAt: Date;
132
+
133
+ /** Absolute path to the session file on disk (debug/diagnostics) */
134
+ sessionFilePath: string;
127
135
  }
128
136
 
129
137
  /**
@@ -134,26 +142,26 @@ export interface SessionSummary {
134
142
  * the values they receive — they don't invent defaults.
135
143
  */
136
144
  export interface ListSessionsOptions {
137
- /**
138
- * Filter to sessions whose recorded cwd matches this path using strict
139
- * equality (no prefix/ancestor matching in v1). Undefined = no cwd
140
- * filter.
141
- */
142
- cwd?: string;
143
-
144
- /**
145
- * Filter to a single tool. Enforced by `AgentManager.listSessions`,
146
- * which skips adapters whose `type` doesn't match. Adapters MAY
147
- * ignore this field — by the time their `listSessions` runs, the
148
- * type filter is already satisfied. Undefined = include every
149
- * registered adapter.
150
- */
151
- type?: AgentType;
145
+ /**
146
+ * Filter to sessions whose recorded cwd matches this path using strict
147
+ * equality (no prefix/ancestor matching in v1). Undefined = no cwd
148
+ * filter.
149
+ */
150
+ cwd?: string;
151
+
152
+ /**
153
+ * Filter to a single tool. Enforced by `AgentManager.listSessions`,
154
+ * which skips adapters whose `type` doesn't match. Adapters MAY
155
+ * ignore this field — by the time their `listSessions` runs, the
156
+ * type filter is already satisfied. Undefined = include every
157
+ * registered adapter.
158
+ */
159
+ type?: AgentType;
152
160
  }
153
161
 
154
162
  export interface AgentDetectionContext {
155
- /** One enriched process snapshot shared across this manager refresh. */
156
- readonly processes: readonly ProcessInfo[];
163
+ /** One enriched process snapshot shared across this manager refresh. */
164
+ readonly processes: readonly ProcessInfo[];
157
165
  }
158
166
 
159
167
  /**
@@ -162,42 +170,42 @@ export interface AgentDetectionContext {
162
170
  * Implementations must provide detection logic for a specific agent type.
163
171
  */
164
172
  export interface AgentAdapter {
165
- /** Type of agent this adapter handles */
166
- readonly type: AgentType;
167
-
168
- /** Executable basenames required for shared process discovery. */
169
- readonly processNames?: readonly string[];
170
-
171
- /**
172
- * Detect running agents of this type
173
- * @returns List of detected agents
174
- */
175
- detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
176
-
177
- /**
178
- * Check if this adapter can handle the given process
179
- * @param processInfo Process information
180
- * @returns True if this adapter can handle the process
181
- */
182
- canHandle(processInfo: ProcessInfo): boolean;
183
-
184
- /**
185
- * Read the full conversation from a session file
186
- * @param sessionFilePath Path to the session JSONL file
187
- * @param options.verbose Include tool call/result details
188
- * @returns Array of conversation messages
189
- */
190
- getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[];
191
-
192
- /**
193
- * Enumerate historical sessions for this tool from disk.
194
- *
195
- * Applies `opts.cwd` as a strict-equality filter when set. Returns
196
- * {@link SessionSummary} entries unsorted; sorting and global filters
197
- * are handled by `AgentManager` and the CLI.
198
- *
199
- * @param opts Filter options computed by the CLI
200
- * @returns Array of sessions discovered on disk
201
- */
202
- listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
173
+ /** Type of agent this adapter handles */
174
+ readonly type: AgentType;
175
+
176
+ /** Executable basenames required for shared process discovery. */
177
+ readonly processNames?: readonly string[];
178
+
179
+ /**
180
+ * Detect running agents of this type
181
+ * @returns List of detected agents
182
+ */
183
+ detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
184
+
185
+ /**
186
+ * Check if this adapter can handle the given process
187
+ * @param processInfo Process information
188
+ * @returns True if this adapter can handle the process
189
+ */
190
+ canHandle(processInfo: ProcessInfo): boolean;
191
+
192
+ /**
193
+ * Read the full conversation from a session file
194
+ * @param sessionFilePath Path to the session JSONL file
195
+ * @param options.verbose Include tool call/result details
196
+ * @returns Array of conversation messages
197
+ */
198
+ getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[];
199
+
200
+ /**
201
+ * Enumerate historical sessions for this tool from disk.
202
+ *
203
+ * Applies `opts.cwd` as a strict-equality filter when set. Returns
204
+ * {@link SessionSummary} entries unsorted; sorting and global filters
205
+ * are handled by `AgentManager` and the CLI.
206
+ *
207
+ * @param opts Filter options computed by the CLI
208
+ * @returns Array of sessions discovered on disk
209
+ */
210
+ listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
203
211
  }