@ai-devkit/agent-manager 0.31.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 +301 -0
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
  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 -41
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -25
  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 +67 -0
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -0
  280. package/dist/readiness/AgentReadiness.js +614 -0
  281. package/dist/readiness/AgentReadiness.js.map +1 -0
  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 +242 -0
  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 +145 -86
  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 +727 -0
  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,22 +1,22 @@
1
1
  /**
2
2
  * Tests for utils/session.ts
3
- */ import * as fs from 'fs';
4
- import { batchGetSessionFileBirthtimes } from '../../utils/session.js';
5
- vi.mock('fs', ()=>({
3
+ */ import * as fs from "fs";
4
+ import { batchGetSessionFileBirthtimes } from "../../utils/session.js";
5
+ vi.mock("fs", ()=>({
6
6
  readdirSync: vi.fn(),
7
7
  statSync: vi.fn()
8
8
  }));
9
9
  const mockedReaddirSync = fs.readdirSync;
10
10
  const mockedStatSync = fs.statSync;
11
- describe('batchGetSessionFileBirthtimes', ()=>{
11
+ describe("batchGetSessionFileBirthtimes", ()=>{
12
12
  beforeEach(()=>{
13
13
  mockedReaddirSync.mockReset();
14
14
  mockedStatSync.mockReset();
15
15
  });
16
- it('should parse session files correctly', ()=>{
16
+ it("should parse session files correctly", ()=>{
17
17
  mockedReaddirSync.mockReturnValue([
18
- 'abc123.jsonl',
19
- 'def456.jsonl'
18
+ "abc123.jsonl",
19
+ "def456.jsonl"
20
20
  ]);
21
21
  mockedStatSync.mockReturnValueOnce({
22
22
  birthtimeMs: 1710800324000
@@ -24,36 +24,36 @@ describe('batchGetSessionFileBirthtimes', ()=>{
24
24
  birthtimeMs: 1710800500000
25
25
  });
26
26
  const results = batchGetSessionFileBirthtimes([
27
- '/home/.claude/projects/my-app'
27
+ "/home/.claude/projects/my-app"
28
28
  ]);
29
29
  expect(results).toHaveLength(2);
30
30
  expect(results[0]).toEqual({
31
- sessionId: 'abc123',
32
- filePath: '/home/.claude/projects/my-app/abc123.jsonl',
33
- projectDir: '/home/.claude/projects/my-app',
31
+ sessionId: "abc123",
32
+ filePath: "/home/.claude/projects/my-app/abc123.jsonl",
33
+ projectDir: "/home/.claude/projects/my-app",
34
34
  birthtimeMs: 1710800324000,
35
- resolvedCwd: ''
35
+ resolvedCwd: ""
36
36
  });
37
- expect(results[1].sessionId).toBe('def456');
37
+ expect(results[1].sessionId).toBe("def456");
38
38
  expect(results[1].birthtimeMs).toBe(1710800500000);
39
39
  });
40
- it('should return empty array for empty dirs list', ()=>{
40
+ it("should return empty array for empty dirs list", ()=>{
41
41
  expect(batchGetSessionFileBirthtimes([])).toEqual([]);
42
42
  expect(mockedReaddirSync).not.toHaveBeenCalled();
43
43
  });
44
- it('should return empty array on readdir failure', ()=>{
44
+ it("should return empty array on readdir failure", ()=>{
45
45
  mockedReaddirSync.mockImplementation(()=>{
46
- throw new Error('ENOENT');
46
+ throw new Error("ENOENT");
47
47
  });
48
48
  expect(batchGetSessionFileBirthtimes([
49
- '/some/dir'
49
+ "/some/dir"
50
50
  ])).toEqual([]);
51
51
  });
52
- it('should skip files with invalid birthtime (0 or negative)', ()=>{
52
+ it("should skip files with invalid birthtime (0 or negative)", ()=>{
53
53
  mockedReaddirSync.mockReturnValue([
54
- 'bad.jsonl',
55
- 'negative.jsonl',
56
- 'good.jsonl'
54
+ "bad.jsonl",
55
+ "negative.jsonl",
56
+ "good.jsonl"
57
57
  ]);
58
58
  mockedStatSync.mockReturnValueOnce({
59
59
  birthtimeMs: 0
@@ -63,62 +63,62 @@ describe('batchGetSessionFileBirthtimes', ()=>{
63
63
  birthtimeMs: 1710800324000
64
64
  });
65
65
  const results = batchGetSessionFileBirthtimes([
66
- '/dir'
66
+ "/dir"
67
67
  ]);
68
68
  expect(results).toHaveLength(1);
69
- expect(results[0].sessionId).toBe('good');
69
+ expect(results[0].sessionId).toBe("good");
70
70
  });
71
- it('should skip non-jsonl files', ()=>{
71
+ it("should skip non-jsonl files", ()=>{
72
72
  mockedReaddirSync.mockReturnValue([
73
- 'sessions-index.json',
74
- 'abc123.jsonl'
73
+ "sessions-index.json",
74
+ "abc123.jsonl"
75
75
  ]);
76
76
  mockedStatSync.mockReturnValueOnce({
77
77
  birthtimeMs: 1710800500000
78
78
  });
79
79
  const results = batchGetSessionFileBirthtimes([
80
- '/dir'
80
+ "/dir"
81
81
  ]);
82
82
  expect(results).toHaveLength(1);
83
- expect(results[0].sessionId).toBe('abc123');
83
+ expect(results[0].sessionId).toBe("abc123");
84
84
  });
85
- it('should handle empty directory', ()=>{
85
+ it("should handle empty directory", ()=>{
86
86
  mockedReaddirSync.mockReturnValue([]);
87
87
  expect(batchGetSessionFileBirthtimes([
88
- '/dir'
88
+ "/dir"
89
89
  ])).toEqual([]);
90
90
  });
91
- it('should handle UUID session IDs', ()=>{
91
+ it("should handle UUID session IDs", ()=>{
92
92
  mockedReaddirSync.mockReturnValue([
93
- '068e7b1f-cff5-4c94-bf69-b9acd32d765c.jsonl'
93
+ "068e7b1f-cff5-4c94-bf69-b9acd32d765c.jsonl"
94
94
  ]);
95
95
  mockedStatSync.mockReturnValueOnce({
96
96
  birthtimeMs: 1710800324000
97
97
  });
98
98
  const results = batchGetSessionFileBirthtimes([
99
- '/dir'
99
+ "/dir"
100
100
  ]);
101
101
  expect(results).toHaveLength(1);
102
- expect(results[0].sessionId).toBe('068e7b1f-cff5-4c94-bf69-b9acd32d765c');
102
+ expect(results[0].sessionId).toBe("068e7b1f-cff5-4c94-bf69-b9acd32d765c");
103
103
  });
104
- it('should leave resolvedCwd empty', ()=>{
104
+ it("should leave resolvedCwd empty", ()=>{
105
105
  mockedReaddirSync.mockReturnValue([
106
- 'abc.jsonl'
106
+ "abc.jsonl"
107
107
  ]);
108
108
  mockedStatSync.mockReturnValueOnce({
109
109
  birthtimeMs: 1710800324000
110
110
  });
111
111
  const results = batchGetSessionFileBirthtimes([
112
- '/dir'
112
+ "/dir"
113
113
  ]);
114
- expect(results[0].resolvedCwd).toBe('');
114
+ expect(results[0].resolvedCwd).toBe("");
115
115
  });
116
- it('should enumerate multiple directories', ()=>{
116
+ it("should enumerate multiple directories", ()=>{
117
117
  mockedReaddirSync.mockReturnValueOnce([
118
- 'sess1.jsonl',
119
- 'sess3.jsonl'
118
+ "sess1.jsonl",
119
+ "sess3.jsonl"
120
120
  ]).mockReturnValueOnce([
121
- 'sess2.jsonl'
121
+ "sess2.jsonl"
122
122
  ]);
123
123
  mockedStatSync.mockReturnValueOnce({
124
124
  birthtimeMs: 1710800324000
@@ -128,30 +128,30 @@ describe('batchGetSessionFileBirthtimes', ()=>{
128
128
  birthtimeMs: 1710800400000
129
129
  });
130
130
  const results = batchGetSessionFileBirthtimes([
131
- '/projects/app-a',
132
- '/projects/app-b'
131
+ "/projects/app-a",
132
+ "/projects/app-b"
133
133
  ]);
134
134
  expect(mockedReaddirSync).toHaveBeenCalledTimes(2);
135
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');
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
139
  });
140
- it('should skip files where statSync fails', ()=>{
140
+ it("should skip files where statSync fails", ()=>{
141
141
  mockedReaddirSync.mockReturnValue([
142
- 'good.jsonl',
143
- 'gone.jsonl'
142
+ "good.jsonl",
143
+ "gone.jsonl"
144
144
  ]);
145
145
  mockedStatSync.mockReturnValueOnce({
146
146
  birthtimeMs: 1710800324000
147
147
  }).mockImplementationOnce(()=>{
148
- throw new Error('ENOENT');
148
+ throw new Error("ENOENT");
149
149
  });
150
150
  const results = batchGetSessionFileBirthtimes([
151
- '/dir'
151
+ "/dir"
152
152
  ]);
153
153
  expect(results).toHaveLength(1);
154
- expect(results[0].sessionId).toBe('good');
154
+ expect(results[0].sessionId).toBe("good");
155
155
  });
156
156
  });
157
157
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/utils/session.test.ts"],"sourcesContent":["/**\n * Tests for utils/session.ts\n */\n\nimport type { MockedFunction } from 'vitest';\n\nimport * as fs from 'fs';\nimport { batchGetSessionFileBirthtimes } from '../../utils/session.js';\n\nvi.mock('fs', () => ({\n readdirSync: vi.fn(),\n statSync: vi.fn(),\n}));\n\nconst mockedReaddirSync = fs.readdirSync as MockedFunction<typeof fs.readdirSync>;\nconst mockedStatSync = fs.statSync as MockedFunction<typeof fs.statSync>;\n\ndescribe('batchGetSessionFileBirthtimes', () => {\n beforeEach(() => {\n mockedReaddirSync.mockReset();\n mockedStatSync.mockReset();\n });\n\n it('should parse session files correctly', () => {\n mockedReaddirSync.mockReturnValue([\n 'abc123.jsonl',\n 'def456.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes(['/home/.claude/projects/my-app']);\n\n expect(results).toHaveLength(2);\n expect(results[0]).toEqual({\n sessionId: 'abc123',\n filePath: '/home/.claude/projects/my-app/abc123.jsonl',\n projectDir: '/home/.claude/projects/my-app',\n birthtimeMs: 1710800324000,\n resolvedCwd: '',\n });\n expect(results[1].sessionId).toBe('def456');\n expect(results[1].birthtimeMs).toBe(1710800500000);\n });\n\n it('should return empty array for empty dirs list', () => {\n expect(batchGetSessionFileBirthtimes([])).toEqual([]);\n expect(mockedReaddirSync).not.toHaveBeenCalled();\n });\n\n it('should return empty array on readdir failure', () => {\n mockedReaddirSync.mockImplementation(() => {\n throw new Error('ENOENT');\n });\n\n expect(batchGetSessionFileBirthtimes(['/some/dir'])).toEqual([]);\n });\n\n it('should skip files with invalid birthtime (0 or negative)', () => {\n mockedReaddirSync.mockReturnValue([\n 'bad.jsonl',\n 'negative.jsonl',\n 'good.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 0 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: -1 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes(['/dir']);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe('good');\n });\n\n it('should skip non-jsonl files', () => {\n mockedReaddirSync.mockReturnValue([\n 'sessions-index.json',\n 'abc123.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes(['/dir']);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe('abc123');\n });\n\n it('should handle empty directory', () => {\n mockedReaddirSync.mockReturnValue([] as unknown as ReturnType<typeof fs.readdirSync>);\n expect(batchGetSessionFileBirthtimes(['/dir'])).toEqual([]);\n });\n\n it('should handle UUID session IDs', () => {\n mockedReaddirSync.mockReturnValue([\n '068e7b1f-cff5-4c94-bf69-b9acd32d765c.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes(['/dir']);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe('068e7b1f-cff5-4c94-bf69-b9acd32d765c');\n });\n\n it('should leave resolvedCwd empty', () => {\n mockedReaddirSync.mockReturnValue([\n 'abc.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes(['/dir']);\n expect(results[0].resolvedCwd).toBe('');\n });\n\n it('should enumerate multiple directories', () => {\n mockedReaddirSync\n .mockReturnValueOnce([\n 'sess1.jsonl',\n 'sess3.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>)\n .mockReturnValueOnce([\n 'sess2.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800400000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes(['/projects/app-a', '/projects/app-b']);\n\n expect(mockedReaddirSync).toHaveBeenCalledTimes(2);\n\n expect(results).toHaveLength(3);\n expect(results[0].projectDir).toBe('/projects/app-a');\n expect(results[1].projectDir).toBe('/projects/app-a');\n expect(results[2].projectDir).toBe('/projects/app-b');\n });\n\n it('should skip files where statSync fails', () => {\n mockedReaddirSync.mockReturnValue([\n 'good.jsonl',\n 'gone.jsonl',\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)\n .mockImplementationOnce(() => { throw new Error('ENOENT'); });\n\n const results = batchGetSessionFileBirthtimes(['/dir']);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe('good');\n });\n});\n"],"names":["fs","batchGetSessionFileBirthtimes","vi","mock","readdirSync","fn","statSync","mockedReaddirSync","mockedStatSync","describe","beforeEach","mockReset","it","mockReturnValue","mockReturnValueOnce","birthtimeMs","results","expect","toHaveLength","toEqual","sessionId","filePath","projectDir","resolvedCwd","toBe","not","toHaveBeenCalled","mockImplementation","Error","toHaveBeenCalledTimes","mockImplementationOnce"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/__tests__/utils/session.test.ts"],"sourcesContent":["/**\n * Tests for utils/session.ts\n */\n\nimport type { MockedFunction } from \"vitest\";\n\nimport * as fs from \"fs\";\nimport { batchGetSessionFileBirthtimes } from \"../../utils/session.js\";\n\nvi.mock(\"fs\", () => ({\n readdirSync: vi.fn(),\n statSync: vi.fn(),\n}));\n\nconst mockedReaddirSync = fs.readdirSync as MockedFunction<typeof fs.readdirSync>;\nconst mockedStatSync = fs.statSync as MockedFunction<typeof fs.statSync>;\n\ndescribe(\"batchGetSessionFileBirthtimes\", () => {\n beforeEach(() => {\n mockedReaddirSync.mockReset();\n mockedStatSync.mockReset();\n });\n\n it(\"should parse session files correctly\", () => {\n mockedReaddirSync.mockReturnValue([\"abc123.jsonl\", \"def456.jsonl\"] as unknown as ReturnType<\n typeof fs.readdirSync\n >);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes([\"/home/.claude/projects/my-app\"]);\n\n expect(results).toHaveLength(2);\n expect(results[0]).toEqual({\n sessionId: \"abc123\",\n filePath: \"/home/.claude/projects/my-app/abc123.jsonl\",\n projectDir: \"/home/.claude/projects/my-app\",\n birthtimeMs: 1710800324000,\n resolvedCwd: \"\",\n });\n expect(results[1].sessionId).toBe(\"def456\");\n expect(results[1].birthtimeMs).toBe(1710800500000);\n });\n\n it(\"should return empty array for empty dirs list\", () => {\n expect(batchGetSessionFileBirthtimes([])).toEqual([]);\n expect(mockedReaddirSync).not.toHaveBeenCalled();\n });\n\n it(\"should return empty array on readdir failure\", () => {\n mockedReaddirSync.mockImplementation(() => {\n throw new Error(\"ENOENT\");\n });\n\n expect(batchGetSessionFileBirthtimes([\"/some/dir\"])).toEqual([]);\n });\n\n it(\"should skip files with invalid birthtime (0 or negative)\", () => {\n mockedReaddirSync.mockReturnValue([\n \"bad.jsonl\",\n \"negative.jsonl\",\n \"good.jsonl\",\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 0 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: -1 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes([\"/dir\"]);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe(\"good\");\n });\n\n it(\"should skip non-jsonl files\", () => {\n mockedReaddirSync.mockReturnValue([\n \"sessions-index.json\",\n \"abc123.jsonl\",\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync.mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes([\"/dir\"]);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe(\"abc123\");\n });\n\n it(\"should handle empty directory\", () => {\n mockedReaddirSync.mockReturnValue([] as unknown as ReturnType<typeof fs.readdirSync>);\n expect(batchGetSessionFileBirthtimes([\"/dir\"])).toEqual([]);\n });\n\n it(\"should handle UUID session IDs\", () => {\n mockedReaddirSync.mockReturnValue([\n \"068e7b1f-cff5-4c94-bf69-b9acd32d765c.jsonl\",\n ] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync.mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes([\"/dir\"]);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe(\"068e7b1f-cff5-4c94-bf69-b9acd32d765c\");\n });\n\n it(\"should leave resolvedCwd empty\", () => {\n mockedReaddirSync.mockReturnValue([\"abc.jsonl\"] as unknown as ReturnType<\n typeof fs.readdirSync\n >);\n mockedStatSync.mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes([\"/dir\"]);\n expect(results[0].resolvedCwd).toBe(\"\");\n });\n\n it(\"should enumerate multiple directories\", () => {\n mockedReaddirSync\n .mockReturnValueOnce([\"sess1.jsonl\", \"sess3.jsonl\"] as unknown as ReturnType<\n typeof fs.readdirSync\n >)\n .mockReturnValueOnce([\"sess2.jsonl\"] as unknown as ReturnType<typeof fs.readdirSync>);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800500000 } as fs.Stats)\n .mockReturnValueOnce({ birthtimeMs: 1710800400000 } as fs.Stats);\n\n const results = batchGetSessionFileBirthtimes([\"/projects/app-a\", \"/projects/app-b\"]);\n\n expect(mockedReaddirSync).toHaveBeenCalledTimes(2);\n\n expect(results).toHaveLength(3);\n expect(results[0].projectDir).toBe(\"/projects/app-a\");\n expect(results[1].projectDir).toBe(\"/projects/app-a\");\n expect(results[2].projectDir).toBe(\"/projects/app-b\");\n });\n\n it(\"should skip files where statSync fails\", () => {\n mockedReaddirSync.mockReturnValue([\"good.jsonl\", \"gone.jsonl\"] as unknown as ReturnType<\n typeof fs.readdirSync\n >);\n mockedStatSync\n .mockReturnValueOnce({ birthtimeMs: 1710800324000 } as fs.Stats)\n .mockImplementationOnce(() => {\n throw new Error(\"ENOENT\");\n });\n\n const results = batchGetSessionFileBirthtimes([\"/dir\"]);\n expect(results).toHaveLength(1);\n expect(results[0].sessionId).toBe(\"good\");\n });\n});\n"],"names":["fs","batchGetSessionFileBirthtimes","vi","mock","readdirSync","fn","statSync","mockedReaddirSync","mockedStatSync","describe","beforeEach","mockReset","it","mockReturnValue","mockReturnValueOnce","birthtimeMs","results","expect","toHaveLength","toEqual","sessionId","filePath","projectDir","resolvedCwd","toBe","not","toHaveBeenCalled","mockImplementation","Error","toHaveBeenCalledTimes","mockImplementationOnce"],"mappings":"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"}
@@ -7,7 +7,7 @@
7
7
  /**
8
8
  * Type of AI agent
9
9
  */
10
- export type AgentType = 'claude' | 'gemini_cli' | 'grok_cli' | 'codex' | 'opencode' | 'copilot' | 'pi' | 'other';
10
+ export type AgentType = "claude" | "gemini_cli" | "grok_cli" | "codex" | "opencode" | "copilot" | "pi" | "other";
11
11
  /**
12
12
  * Current status of an agent
13
13
  */
@@ -63,7 +63,7 @@ export interface ProcessInfo {
63
63
  * A single message in a conversation
64
64
  */
65
65
  export interface ConversationMessage {
66
- role: 'user' | 'assistant' | 'system';
66
+ role: "user" | "assistant" | "system";
67
67
  content: string;
68
68
  timestamp?: string;
69
69
  }
@@ -1 +1 @@
1
- {"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/AgentAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/AgentAdapter.ts"],"names":[],"mappings":"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"}
@@ -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
  */ /**
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/AgentAdapter.ts"],"sourcesContent":["/**\n * Agent Adapter Interface\n * \n * Defines the contract for detecting and managing different types of AI agents.\n * Each adapter is responsible for detecting agents of a specific type (e.g., claude).\n */\n\n/**\n * Type of AI agent\n */\nexport type AgentType = 'claude' | 'gemini_cli' | 'grok_cli' | 'codex' | 'opencode' | 'copilot' | 'pi' | 'other';\n\n/**\n * Current status of an agent\n */\nexport enum AgentStatus {\n RUNNING = 'running',\n WAITING = 'waiting',\n IDLE = 'idle',\n UNKNOWN = 'unknown'\n}\n\n/**\n * Information about a detected agent\n */\nexport interface AgentInfo {\n /** Project-based name (e.g., \"ai-devkit\" or \"ai-devkit (merry)\") */\n name: string;\n\n /** Type of agent */\n type: AgentType;\n\n /** Current status */\n status: AgentStatus;\n\n /** Last user prompt from history */\n summary: string;\n\n /** Process ID */\n pid: number;\n\n /** Working directory/project path */\n projectPath: string;\n\n /** Session UUID */\n sessionId: string;\n\n /** Timestamp of last activity */\n lastActive: Date;\n\n /** Whether the live process is pinned in the agent console */\n pinned?: boolean;\n\n /** Path to the session JSONL file on disk */\n sessionFilePath?: string;\n}\n\n/**\n * Information about a running process\n */\nexport interface ProcessInfo {\n /** Process ID */\n pid: number;\n\n /** Parent process ID, populated by process discovery when available */\n ppid?: number;\n\n /** Process command */\n command: string;\n\n /** Working directory */\n cwd: string;\n\n /** Terminal TTY (e.g., \"ttys030\") */\n tty: string;\n\n /** Process start time, populated by process enrichment */\n startTime?: Date;\n}\n\n/**\n * A single message in a conversation\n */\nexport interface ConversationMessage {\n role: 'user' | 'assistant' | 'system';\n content: string;\n timestamp?: string;\n}\n\n/**\n * A historical session discovered on disk (running or not).\n *\n * Used by `listSessions` to surface enough context for a user to identify\n * a session and resume it via the originating tool's resume command.\n */\nexport interface SessionSummary {\n /** Tool that produced this session */\n type: AgentType;\n\n /**\n * ID accepted by the tool's resume command. Adapters MUST pass this\n * through verbatim — no normalization, no encoding/decoding — so it\n * round-trips into `claude --resume <id>` (and equivalents).\n */\n sessionId: string;\n\n /** Working directory the session was started in (best-known value) */\n cwd: string;\n\n /**\n * Trimmed first user message; empty string if none. Adapters apply\n * the same noise-filter their existing parsers use (skip tool_result\n * blocks, request-interruption notices, system-injected skill\n * content). The CLI table renderer substitutes a placeholder for\n * empty values; JSON output keeps the empty string raw.\n */\n firstUserMessage: string;\n\n /** Last activity timestamp (from session content; falls back to file mtime) */\n lastActive: Date;\n\n /** Session start time (from session content; falls back to file birthtime/mtime) */\n startedAt: Date;\n\n /** Absolute path to the session file on disk (debug/diagnostics) */\n sessionFilePath: string;\n}\n\n/**\n * Filters passed by the CLI to {@link AgentAdapter.listSessions}.\n *\n * The CLI is the source of truth for filter defaults and semantics\n * (e.g. cwd defaults to process.cwd(); --all clears it). Adapters apply\n * the values they receive — they don't invent defaults.\n */\nexport interface ListSessionsOptions {\n /**\n * Filter to sessions whose recorded cwd matches this path using strict\n * equality (no prefix/ancestor matching in v1). Undefined = no cwd\n * filter.\n */\n cwd?: string;\n\n /**\n * Filter to a single tool. Enforced by `AgentManager.listSessions`,\n * which skips adapters whose `type` doesn't match. Adapters MAY\n * ignore this field — by the time their `listSessions` runs, the\n * type filter is already satisfied. Undefined = include every\n * registered adapter.\n */\n type?: AgentType;\n}\n\nexport interface AgentDetectionContext {\n /** One enriched process snapshot shared across this manager refresh. */\n readonly processes: readonly ProcessInfo[];\n}\n\n/**\n * Agent Adapter Interface\n *\n * Implementations must provide detection logic for a specific agent type.\n */\nexport interface AgentAdapter {\n /** Type of agent this adapter handles */\n readonly type: AgentType;\n\n /** Executable basenames required for shared process discovery. */\n readonly processNames?: readonly string[];\n\n /**\n * Detect running agents of this type\n * @returns List of detected agents\n */\n detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;\n\n /**\n * Check if this adapter can handle the given process\n * @param processInfo Process information\n * @returns True if this adapter can handle the process\n */\n canHandle(processInfo: ProcessInfo): boolean;\n\n /**\n * Read the full conversation from a session file\n * @param sessionFilePath Path to the session JSONL file\n * @param options.verbose Include tool call/result details\n * @returns Array of conversation messages\n */\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[];\n\n /**\n * Enumerate historical sessions for this tool from disk.\n *\n * Applies `opts.cwd` as a strict-equality filter when set. Returns\n * {@link SessionSummary} entries unsorted; sorting and global filters\n * are handled by `AgentManager` and the CLI.\n *\n * @param opts Filter options computed by the CLI\n * @returns Array of sessions discovered on disk\n */\n listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;\n}\n"],"names":["AgentStatus"],"mappings":"AAAA;;;;;CAKC,GAED;;CAEC,GAGD;;CAEC,GACD,OAAO,IAAA,AAAKA,qCAAAA;;;;;WAAAA;MAKX"}
1
+ {"version":3,"sources":["../../src/adapters/AgentAdapter.ts"],"sourcesContent":["/**\n * Agent Adapter Interface\n *\n * Defines the contract for detecting and managing different types of AI agents.\n * Each adapter is responsible for detecting agents of a specific type (e.g., claude).\n */\n\n/**\n * Type of AI agent\n */\nexport type AgentType =\n | \"claude\"\n | \"gemini_cli\"\n | \"grok_cli\"\n | \"codex\"\n | \"opencode\"\n | \"copilot\"\n | \"pi\"\n | \"other\";\n\n/**\n * Current status of an agent\n */\nexport enum AgentStatus {\n RUNNING = \"running\",\n WAITING = \"waiting\",\n IDLE = \"idle\",\n UNKNOWN = \"unknown\",\n}\n\n/**\n * Information about a detected agent\n */\nexport interface AgentInfo {\n /** Project-based name (e.g., \"ai-devkit\" or \"ai-devkit (merry)\") */\n name: string;\n\n /** Type of agent */\n type: AgentType;\n\n /** Current status */\n status: AgentStatus;\n\n /** Last user prompt from history */\n summary: string;\n\n /** Process ID */\n pid: number;\n\n /** Working directory/project path */\n projectPath: string;\n\n /** Session UUID */\n sessionId: string;\n\n /** Timestamp of last activity */\n lastActive: Date;\n\n /** Whether the live process is pinned in the agent console */\n pinned?: boolean;\n\n /** Path to the session JSONL file on disk */\n sessionFilePath?: string;\n}\n\n/**\n * Information about a running process\n */\nexport interface ProcessInfo {\n /** Process ID */\n pid: number;\n\n /** Parent process ID, populated by process discovery when available */\n ppid?: number;\n\n /** Process command */\n command: string;\n\n /** Working directory */\n cwd: string;\n\n /** Terminal TTY (e.g., \"ttys030\") */\n tty: string;\n\n /** Process start time, populated by process enrichment */\n startTime?: Date;\n}\n\n/**\n * A single message in a conversation\n */\nexport interface ConversationMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n}\n\n/**\n * A historical session discovered on disk (running or not).\n *\n * Used by `listSessions` to surface enough context for a user to identify\n * a session and resume it via the originating tool's resume command.\n */\nexport interface SessionSummary {\n /** Tool that produced this session */\n type: AgentType;\n\n /**\n * ID accepted by the tool's resume command. Adapters MUST pass this\n * through verbatim — no normalization, no encoding/decoding — so it\n * round-trips into `claude --resume <id>` (and equivalents).\n */\n sessionId: string;\n\n /** Working directory the session was started in (best-known value) */\n cwd: string;\n\n /**\n * Trimmed first user message; empty string if none. Adapters apply\n * the same noise-filter their existing parsers use (skip tool_result\n * blocks, request-interruption notices, system-injected skill\n * content). The CLI table renderer substitutes a placeholder for\n * empty values; JSON output keeps the empty string raw.\n */\n firstUserMessage: string;\n\n /** Last activity timestamp (from session content; falls back to file mtime) */\n lastActive: Date;\n\n /** Session start time (from session content; falls back to file birthtime/mtime) */\n startedAt: Date;\n\n /** Absolute path to the session file on disk (debug/diagnostics) */\n sessionFilePath: string;\n}\n\n/**\n * Filters passed by the CLI to {@link AgentAdapter.listSessions}.\n *\n * The CLI is the source of truth for filter defaults and semantics\n * (e.g. cwd defaults to process.cwd(); --all clears it). Adapters apply\n * the values they receive — they don't invent defaults.\n */\nexport interface ListSessionsOptions {\n /**\n * Filter to sessions whose recorded cwd matches this path using strict\n * equality (no prefix/ancestor matching in v1). Undefined = no cwd\n * filter.\n */\n cwd?: string;\n\n /**\n * Filter to a single tool. Enforced by `AgentManager.listSessions`,\n * which skips adapters whose `type` doesn't match. Adapters MAY\n * ignore this field — by the time their `listSessions` runs, the\n * type filter is already satisfied. Undefined = include every\n * registered adapter.\n */\n type?: AgentType;\n}\n\nexport interface AgentDetectionContext {\n /** One enriched process snapshot shared across this manager refresh. */\n readonly processes: readonly ProcessInfo[];\n}\n\n/**\n * Agent Adapter Interface\n *\n * Implementations must provide detection logic for a specific agent type.\n */\nexport interface AgentAdapter {\n /** Type of agent this adapter handles */\n readonly type: AgentType;\n\n /** Executable basenames required for shared process discovery. */\n readonly processNames?: readonly string[];\n\n /**\n * Detect running agents of this type\n * @returns List of detected agents\n */\n detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;\n\n /**\n * Check if this adapter can handle the given process\n * @param processInfo Process information\n * @returns True if this adapter can handle the process\n */\n canHandle(processInfo: ProcessInfo): boolean;\n\n /**\n * Read the full conversation from a session file\n * @param sessionFilePath Path to the session JSONL file\n * @param options.verbose Include tool call/result details\n * @returns Array of conversation messages\n */\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[];\n\n /**\n * Enumerate historical sessions for this tool from disk.\n *\n * Applies `opts.cwd` as a strict-equality filter when set. Returns\n * {@link SessionSummary} entries unsorted; sorting and global filters\n * are handled by `AgentManager` and the CLI.\n *\n * @param opts Filter options computed by the CLI\n * @returns Array of sessions discovered on disk\n */\n listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;\n}\n"],"names":["AgentStatus"],"mappings":"AAAA;;;;;CAKC,GAED;;CAEC,GAWD;;CAEC,GACD,OAAO,IAAA,AAAKA,qCAAAA;;;;;WAAAA;MAKX"}
@@ -8,8 +8,8 @@
8
8
  * 4. Reading events.jsonl as the primary session/conversation source
9
9
  * 5. Reading workspace.yaml as a flat fallback metadata source
10
10
  */
11
- import type { AgentAdapter, AgentInfo, ConversationMessage, ListSessionsOptions, ProcessInfo, SessionSummary, AgentDetectionContext } from './AgentAdapter.js';
12
- import { AgentRegistry } from '../utils/AgentRegistry.js';
11
+ import type { AgentAdapter, AgentInfo, ConversationMessage, ListSessionsOptions, ProcessInfo, SessionSummary, AgentDetectionContext } from "./AgentAdapter.js";
12
+ import { AgentRegistry } from "../utils/AgentRegistry.js";
13
13
  export declare class CopilotAdapter implements AgentAdapter {
14
14
  readonly type: "copilot";
15
15
  readonly processNames: readonly ["copilot"];
@@ -1 +1 @@
1
- {"version":3,"file":"CopilotAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/CopilotAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACR,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,qBAAqB,EACxB,MAAM,mBAAmB,CAAC;AAW3B,OAAO,EAAE,aAAa,EAAsB,MAAM,2BAA2B,CAAC;AAiE9E,qBAAa,cAAe,YAAW,YAAY;IAC/C,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,YAAY,uBAAwB;IAE7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAQ1C;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAKnC;IAEH,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,QAAQ,GAAE,aAAuC;IAM7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsCzE,OAAO,CAAC,wBAAwB;IAahC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAwB1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsBzE,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,cAAc;IAiCtB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,eAAe;IAiCvB,OAAO,CAAC,oBAAoB;IAU5B,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;IASpB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,mBAAmB;CAI9B"}
1
+ {"version":3,"file":"CopilotAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/CopilotAdapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,mBAAmB,EACnB,mBAAmB,EACnB,WAAW,EACX,cAAc,EACd,qBAAqB,EACtB,MAAM,mBAAmB,CAAC;AAW3B,OAAO,EAAE,aAAa,EAAsB,MAAM,2BAA2B,CAAC;AAiE9E,qBAAa,cAAe,YAAW,YAAY;IACjD,QAAQ,CAAC,IAAI,EAAG,SAAS,CAAU;IACnC,QAAQ,CAAC,YAAY,uBAAwB;IAE7C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAK;IACnD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,qBAAqB,CAQ1C;IACH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAKnC;IAEH,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAgB;gBAEpB,QAAQ,GAAE,aAAuC;IAM7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAsCzE,OAAO,CAAC,wBAAwB;IAahC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAwB1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAsBzE,OAAO,CAAC,eAAe;IAcvB,OAAO,CAAC,mBAAmB;IAgB3B,OAAO,CAAC,cAAc;IAqCtB,OAAO,CAAC,UAAU;IAKlB,OAAO,CAAC,eAAe;IAqCvB,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,aAAa;IA0BrB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IAevB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;IAiBxB,OAAO,CAAC,iBAAiB;IAezB,OAAO,CAAC,mBAAmB;IAa3B,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,cAAc;IAMtB,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,mBAAmB;CAI5B"}
@@ -7,38 +7,38 @@
7
7
  * 3. Mapping active ~/.copilot/session-state/{sessionId}/inuse.{pid}.lock files to processes
8
8
  * 4. Reading events.jsonl as the primary session/conversation source
9
9
  * 5. Reading workspace.yaml as a flat fallback metadata source
10
- */ import * as path from 'path';
11
- import { AgentStatus } from './AgentAdapter.js';
12
- import { captureProcessSnapshot, executableBasename, filterByProcessNames, findWrapperProcess, findWrapperProcessPids } from '../utils/process.js';
13
- import { generateAgentName } from '../utils/matching.js';
14
- import { isDirectory, safeReadFile, safeReaddir, safeStat } from '../utils/session.js';
15
- import { AgentRegistry } from '../utils/AgentRegistry.js';
10
+ */ import * as path from "path";
11
+ import { AgentStatus } from "./AgentAdapter.js";
12
+ import { captureProcessSnapshot, executableBasename, filterByProcessNames, findWrapperProcess, findWrapperProcessPids } from "../utils/process.js";
13
+ import { generateAgentName } from "../utils/matching.js";
14
+ import { isDirectory, safeReadFile, safeReaddir, safeStat } from "../utils/session.js";
15
+ import { AgentRegistry } from "../utils/AgentRegistry.js";
16
16
  export class CopilotAdapter {
17
- type = 'copilot';
17
+ type = "copilot";
18
18
  processNames = [
19
- 'copilot'
19
+ "copilot"
20
20
  ];
21
21
  static IDLE_THRESHOLD_MINUTES = 5;
22
22
  static VERBOSE_SYSTEM_EVENTS = new Set([
23
- 'system.message',
24
- 'session.info',
25
- 'session.warning',
26
- 'tool.execution_start',
27
- 'tool.execution_complete',
28
- 'function',
29
- 'abort'
23
+ "system.message",
24
+ "session.info",
25
+ "session.warning",
26
+ "tool.execution_start",
27
+ "tool.execution_complete",
28
+ "function",
29
+ "abort"
30
30
  ]);
31
31
  static WAITING_EVENTS = new Set([
32
- 'assistant.message',
33
- 'assistant.turn_end',
34
- 'session.shutdown',
35
- 'abort'
32
+ "assistant.message",
33
+ "assistant.turn_end",
34
+ "session.shutdown",
35
+ "abort"
36
36
  ]);
37
37
  sessionStateDir;
38
38
  registry;
39
39
  constructor(registry = AgentRegistry.default()){
40
- const homeDir = process.env.HOME || process.env.USERPROFILE || '';
41
- this.sessionStateDir = path.join(homeDir, '.copilot', 'session-state');
40
+ const homeDir = process.env.HOME || process.env.USERPROFILE || "";
41
+ this.sessionStateDir = path.join(homeDir, ".copilot", "session-state");
42
42
  this.registry = registry;
43
43
  }
44
44
  canHandle(processInfo) {
@@ -155,8 +155,8 @@ export class CopilotAdapter {
155
155
  return locks;
156
156
  }
157
157
  readSessionDir(sessionDir, fallbackSessionId) {
158
- const eventsFilePath = path.join(sessionDir, 'events.jsonl');
159
- const workspace = this.readWorkspace(path.join(sessionDir, 'workspace.yaml'));
158
+ const eventsFilePath = path.join(sessionDir, "events.jsonl");
159
+ const workspace = this.readWorkspace(path.join(sessionDir, "workspace.yaml"));
160
160
  const entries = this.readEvents(eventsFilePath);
161
161
  if (entries.length === 0 && !this.hasWorkspaceMetadata(workspace)) {
162
162
  return null;
@@ -165,13 +165,13 @@ export class CopilotAdapter {
165
165
  const sessionStart = workspace.createdAt || fileStat?.birthtime || new Date();
166
166
  const eventSummary = this.summarizeEvents(entries, {
167
167
  sessionId: workspace.id || fallbackSessionId,
168
- projectPath: workspace.cwd || '',
168
+ projectPath: workspace.cwd || "",
169
169
  sessionStart,
170
170
  lastActive: workspace.updatedAt || fileStat?.mtime || sessionStart,
171
- firstUserMessage: '',
172
- lastText: ''
171
+ firstUserMessage: "",
172
+ lastText: ""
173
173
  });
174
- const summary = eventSummary.firstUserMessage || eventSummary.lastText || workspace.name || 'Copilot session active';
174
+ const summary = eventSummary.firstUserMessage || eventSummary.lastText || workspace.name || "Copilot session active";
175
175
  return {
176
176
  sessionId: eventSummary.sessionId,
177
177
  projectPath: eventSummary.projectPath,
@@ -199,7 +199,7 @@ export class CopilotAdapter {
199
199
  if (entry.type) {
200
200
  summary.lastEventType = entry.type;
201
201
  }
202
- if (entry.type === 'session.start') {
202
+ if (entry.type === "session.start") {
203
203
  summary.sessionId = entry.data?.sessionId || summary.sessionId;
204
204
  summary.projectPath = entry.data?.context?.cwd || summary.projectPath;
205
205
  summary.sessionStart = this.parseTimestamp(entry.data?.startTime) || timestamp || summary.sessionStart;
@@ -207,10 +207,10 @@ export class CopilotAdapter {
207
207
  }
208
208
  const text = this.extractEventText(entry, false);
209
209
  if (!text) continue;
210
- if (!summary.firstUserMessage && entry.type === 'user.message') {
210
+ if (!summary.firstUserMessage && entry.type === "user.message") {
211
211
  summary.firstUserMessage = text;
212
212
  }
213
- if (entry.type === 'user.message' || entry.type === 'assistant.message') {
213
+ if (entry.type === "user.message" || entry.type === "assistant.message") {
214
214
  summary.lastText = text;
215
215
  }
216
216
  }
@@ -223,21 +223,21 @@ export class CopilotAdapter {
223
223
  const content = safeReadFile(filePath);
224
224
  if (content === undefined) return {};
225
225
  const values = new Map();
226
- for (const rawLine of content.split('\n')){
226
+ for (const rawLine of content.split("\n")){
227
227
  const line = rawLine.trim();
228
- if (!line || line.startsWith('#')) continue;
229
- const idx = line.indexOf(':');
228
+ if (!line || line.startsWith("#")) continue;
229
+ const idx = line.indexOf(":");
230
230
  if (idx === -1) continue;
231
231
  const key = line.slice(0, idx).trim();
232
232
  const value = this.stripYamlScalar(line.slice(idx + 1).trim());
233
233
  values.set(key, value);
234
234
  }
235
235
  return {
236
- id: values.get('id'),
237
- cwd: values.get('cwd'),
238
- name: values.get('name'),
239
- createdAt: this.parseTimestamp(values.get('created_at')) || undefined,
240
- updatedAt: this.parseTimestamp(values.get('updated_at')) || undefined
236
+ id: values.get("id"),
237
+ cwd: values.get("cwd"),
238
+ name: values.get("name"),
239
+ createdAt: this.parseTimestamp(values.get("created_at")) || undefined,
240
+ updatedAt: this.parseTimestamp(values.get("updated_at")) || undefined
241
241
  };
242
242
  }
243
243
  stripYamlScalar(value) {
@@ -248,7 +248,7 @@ export class CopilotAdapter {
248
248
  }
249
249
  parseEventLines(content) {
250
250
  const entries = [];
251
- for (const line of content.trim().split('\n')){
251
+ for (const line of content.trim().split("\n")){
252
252
  const trimmed = line.trim();
253
253
  if (!trimmed) continue;
254
254
  try {
@@ -260,27 +260,27 @@ export class CopilotAdapter {
260
260
  return entries;
261
261
  }
262
262
  roleForEvent(type, verbose) {
263
- if (type === 'user.message') return 'user';
264
- if (type === 'assistant.message') return 'assistant';
263
+ if (type === "user.message") return "user";
264
+ if (type === "assistant.message") return "assistant";
265
265
  if (verbose && type !== undefined && CopilotAdapter.VERBOSE_SYSTEM_EVENTS.has(type)) {
266
- return 'system';
266
+ return "system";
267
267
  }
268
268
  return null;
269
269
  }
270
270
  extractEventText(entry, verbose) {
271
271
  const data = entry.data;
272
- if (!data) return '';
273
- const raw = data.content || data.message || data.text || data.result?.content || data.result?.detailedContent || (verbose ? data.output : '') || '';
274
- if (typeof raw !== 'string') return '';
272
+ if (!data) return "";
273
+ const raw = data.content || data.message || data.text || data.result?.content || data.result?.detailedContent || (verbose ? data.output : "") || "";
274
+ if (typeof raw !== "string") return "";
275
275
  return raw.trim();
276
276
  }
277
277
  mapSessionToAgent(session, proc) {
278
- const projectPath = session.projectPath || proc.cwd || '';
278
+ const projectPath = session.projectPath || proc.cwd || "";
279
279
  return {
280
280
  name: generateAgentName(projectPath, proc.pid),
281
281
  type: this.type,
282
282
  status: this.determineStatus(session),
283
- summary: session.summary || 'Copilot session active',
283
+ summary: session.summary || "Copilot session active",
284
284
  pid: proc.pid,
285
285
  projectPath,
286
286
  sessionId: session.sessionId,
@@ -290,12 +290,12 @@ export class CopilotAdapter {
290
290
  }
291
291
  mapProcessOnlyAgent(proc) {
292
292
  return {
293
- name: generateAgentName(proc.cwd || '', proc.pid),
293
+ name: generateAgentName(proc.cwd || "", proc.pid),
294
294
  type: this.type,
295
295
  status: AgentStatus.RUNNING,
296
- summary: 'Copilot process running',
296
+ summary: "Copilot process running",
297
297
  pid: proc.pid,
298
- projectPath: proc.cwd || '',
298
+ projectPath: proc.cwd || "",
299
299
  sessionId: `pid-${proc.pid}`,
300
300
  lastActive: new Date()
301
301
  };
@@ -322,7 +322,7 @@ export class CopilotAdapter {
322
322
  }
323
323
  isCopilotExecutable(command) {
324
324
  const base = executableBasename(command);
325
- return base === 'copilot' || base === 'copilot.exe';
325
+ return base === "copilot" || base === "copilot.exe";
326
326
  }
327
327
  }
328
328