@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
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from './AgentManager.js';\nexport { getCodexCapacityReport } from './capacity/index.js';\nexport type {\n CapacityProbeOptions,\n CapacityReport,\n CapacityWindow,\n} from './capacity/index.js';\n\nexport { ClaudeCodeAdapter } from './providers/claude/ClaudeCodeAdapter.js';\nexport { CodexAdapter } from './adapters/CodexAdapter.js';\nexport { CopilotAdapter } from './adapters/CopilotAdapter.js';\nexport { GeminiCliAdapter } from './adapters/GeminiCliAdapter.js';\nexport { GrokCliAdapter } from './adapters/GrokCliAdapter.js';\nexport { OpenCodeAdapter } from './adapters/OpenCodeAdapter.js';\nexport { PiAdapter } from './adapters/PiAdapter.js';\nexport { AgentStatus } from './adapters/AgentAdapter.js';\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from './adapters/AgentAdapter.js';\n\nexport { TerminalFocusManager, TerminalType } from './terminal/TerminalFocusManager.js';\nexport type { TerminalLocation } from './terminal/TerminalFocusManager.js';\nexport { TtyWriter } from './terminal/TtyWriter.js';\n\nexport type { ListAgentsOptions } from './AgentManager.js';\n\nexport { AgentRegistry, RenameNotFoundError, RenameConflictError } from './utils/AgentRegistry.js';\nexport type { AgentRegistryOptions, RegistryEntry } from './utils/AgentRegistry.js';\nexport { TmuxManager } from './terminal/TmuxManager.js';\nexport { AGENTS } from './utils/agents.js';\nexport type { AgentConfig, StartableAgentType } from './utils/agents.js';\n\nexport type { AgentRequest } from './utils/agent-requests.js';\nexport { getAgentRequestPath, readLatestAgentRequest, writeAgentRequest } from './utils/agent-requests.js';\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from './durable/DurableAgent.js';\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from './durable/DurableAgent.js';\nexport { DurableAgentRepository } from './durable/DurableAgentRepository.js';\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from './durable/DurableAgentRepository.js';\nexport { ClaudePrintAgentService } from './providers/claude/durable/ClaudePrintAgentService.js';\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from './providers/claude/durable/ClaudePrintAgentService.js';\nexport { CodexCliProbe } from './providers/codex/durable/CodexCliProbe.js';\nexport type { CodexCliProbeOptions } from './providers/codex/durable/CodexCliProbe.js';\nexport { CodexPrintRunner } from './providers/codex/durable/CodexPrintRunner.js';\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from './providers/codex/durable/CodexPrintRunner.js';\nexport { CodexPrintAgentService } from './providers/codex/durable/CodexPrintAgentService.js';\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from './providers/codex/durable/CodexPrintAgentService.js';\nexport { PiCliProbe } from './providers/pi/durable/PiCliProbe.js';\nexport type { PiCliProbeOptions } from './providers/pi/durable/PiCliProbe.js';\nexport { PiPrintRunner } from './providers/pi/durable/PiPrintRunner.js';\nexport type { PiPrintRunnerOptions, PiPrintRunRequest, PiPrintRunResult } from './providers/pi/durable/PiPrintRunner.js';\nexport { PiPrintAgentService } from './providers/pi/durable/PiPrintAgentService.js';\nexport type { PiPrintAgentServiceOptions, PiPrintSendResult } from './providers/pi/durable/PiPrintAgentService.js';\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","AgentRegistry","RenameNotFoundError","RenameConflictError","TmuxManager","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;AAO7D,SAASC,iBAAiB,QAAQ,0CAA0C;AAC5E,SAASC,YAAY,QAAQ,6BAA6B;AAC1D,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,gBAAgB,QAAQ,iCAAiC;AAClE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,0BAA0B;AACpD,SAASC,WAAW,QAAQ,6BAA6B;AAYzD,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,qCAAqC;AAExF,SAASC,SAAS,QAAQ,0BAA0B;AAIpD,SAASC,aAAa,EAAEC,mBAAmB,EAAEC,mBAAmB,QAAQ,2BAA2B;AAEnG,SAASC,WAAW,QAAQ,4BAA4B;AACxD,SAASC,MAAM,QAAQ,oBAAoB;AAI3C,SAASC,mBAAmB,EAAEC,sBAAsB,EAAEC,iBAAiB,QAAQ,4BAA4B;AAE3G,SACIC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,EACrBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACT,4BAA4B;AAiBnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAO7E,SAASC,uBAAuB,QAAQ,wDAAwD;AAKhG,SAASC,aAAa,QAAQ,6CAA6C;AAE3E,SAASC,gBAAgB,QAAQ,gDAAgD;AAMjF,SAASC,sBAAsB,QAAQ,sDAAsD;AAK7F,SAASC,UAAU,QAAQ,uCAAuC;AAElE,SAASC,aAAa,QAAQ,0CAA0C;AAExE,SAASC,mBAAmB,QAAQ,gDAAgD"}
1
+ {"version":3,"sources":["../src/index.ts"],"sourcesContent":["export { AgentManager, AgentNotRunningError } from \"./AgentManager.js\";\nexport { getCodexCapacityReport } from \"./capacity/index.js\";\nexport type { CapacityProbeOptions, CapacityReport, CapacityWindow } from \"./capacity/index.js\";\nexport {\n getAgentReadinessReport,\n getAgentReadinessReports,\n worstReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\nexport type {\n AgentReadinessOptions,\n AgentReadinessReport,\n AuthReadinessCheck,\n BuiltInSkillsReadinessCheck,\n DirectoryReadinessCheck,\n ExecutableReadinessCheck,\n IntegrationReadinessCheck,\n ReadinessAgentType,\n ReadinessAuthState,\n ReadinessCheck,\n ReadinessStatus,\n} from \"./readiness/AgentReadiness.js\";\n\nexport { ClaudeCodeAdapter } from \"./providers/claude/ClaudeCodeAdapter.js\";\nexport { CodexAdapter } from \"./providers/codex/CodexAdapter.js\";\nexport { CopilotAdapter } from \"./adapters/CopilotAdapter.js\";\nexport { GeminiCliAdapter } from \"./adapters/GeminiCliAdapter.js\";\nexport { GrokCliAdapter } from \"./adapters/GrokCliAdapter.js\";\nexport { OpenCodeAdapter } from \"./adapters/OpenCodeAdapter.js\";\nexport { PiAdapter } from \"./providers/pi/PiAdapter.js\";\nexport { AgentStatus } from \"./adapters/AgentAdapter.js\";\nexport type {\n AgentAdapter,\n AgentType,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"./adapters/AgentAdapter.js\";\n\nexport { TerminalFocusManager, TerminalType } from \"./terminal/TerminalFocusManager.js\";\nexport type { TerminalLocation } from \"./terminal/TerminalFocusManager.js\";\nexport { TtyWriter } from \"./terminal/TtyWriter.js\";\n\nexport type { ListAgentsOptions } from \"./AgentManager.js\";\n\nexport {\n AgentRegistry,\n RenameNotFoundError,\n RenameConflictError,\n AGENT_RUNTIME_PROVIDERS,\n parseTmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport type {\n AgentRegistryOptions,\n RegistryEntry,\n AgentRuntimeProvider,\n TmuxRuntimeRef,\n} from \"./utils/AgentRegistry.js\";\nexport { TmuxManager } from \"./terminal/TmuxManager.js\";\nexport type { AgentRuntimeAvailability, InteractiveAgentRuntime } from \"./runtime/types.js\";\nexport {\n startAgent,\n stopAgent,\n focusAgent,\n sendAgentPrompt,\n TmuxUnavailableError,\n AgentNameInUseError,\n AgentPidPollTimeoutError,\n AgentRuntimeUnavailableError,\n AgentTerminalNotFoundError,\n DEFAULT_PID_POLL_INTERVAL_MS,\n DEFAULT_PID_POLL_TIMEOUT_MS,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport type {\n FocusAgentDeps,\n StartAgentDeps,\n StartAgentOptions,\n StopAgentDeps,\n StopAgentResult,\n FocusAgentResult,\n SendAgentPromptDeps,\n} from \"./runtime/ManagedAgentRuntime.js\";\nexport { AGENTS } from \"./utils/agents.js\";\nexport type { AgentConfig, StartableAgentType } from \"./utils/agents.js\";\n\nexport type { AgentRequest } from \"./utils/agent-requests.js\";\nexport {\n getAgentRequestPath,\n readLatestAgentRequest,\n writeAgentRequest,\n} from \"./utils/agent-requests.js\";\n\nexport {\n AGENT_MODES,\n DurableAgentError,\n DurableAgentBusyError,\n DurableAgentNotFoundError,\n DurableAgentRepositoryError,\n DurableAgentNameConflictError,\n ClaudePrintError,\n CodexPrintError,\n PiPrintError,\n} from \"./durable/DurableAgent.js\";\nexport type {\n DurableAgent,\n DurableAgentBase,\n ClaudeDurableAgent,\n CodexDurableAgent,\n PiDurableAgent,\n DurableProvider,\n CodexPrintErrorCode,\n DurableAgentState,\n DurableSessionHealth,\n DurableRunStatus,\n DurableActiveRun,\n DurableLastResult,\n PiPrintErrorCode,\n ProcessIdentity,\n} from \"./durable/DurableAgent.js\";\nexport { DurableAgentRepository } from \"./durable/DurableAgentRepository.js\";\nexport type {\n CreateDurableAgentInput,\n DurableAgentRepositoryOptions,\n ProcessInspector,\n DurableRunCompletion,\n} from \"./durable/DurableAgentRepository.js\";\nexport { ClaudePrintAgentService } from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport type {\n ClaudePrintAgentServiceOptions,\n ClaudePrintSendResult,\n} from \"./providers/claude/durable/ClaudePrintAgentService.js\";\nexport { CodexCliProbe } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport type { CodexCliProbeOptions } from \"./providers/codex/durable/CodexCliProbe.js\";\nexport { CodexPrintRunner } from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport type {\n CodexPrintRunnerOptions,\n CodexPrintRunRequest,\n CodexPrintRunResult,\n} from \"./providers/codex/durable/CodexPrintRunner.js\";\nexport { CodexPrintAgentService } from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport type {\n CodexPrintAgentServiceOptions,\n CodexPrintSendResult,\n} from \"./providers/codex/durable/CodexPrintAgentService.js\";\nexport { PiCliProbe } from \"./providers/pi/durable/PiCliProbe.js\";\nexport type { PiCliProbeOptions } from \"./providers/pi/durable/PiCliProbe.js\";\nexport { PiPrintRunner } from \"./providers/pi/durable/PiPrintRunner.js\";\nexport type {\n PiPrintRunnerOptions,\n PiPrintRunRequest,\n PiPrintRunResult,\n} from \"./providers/pi/durable/PiPrintRunner.js\";\nexport { PiPrintAgentService } from \"./providers/pi/durable/PiPrintAgentService.js\";\nexport type {\n PiPrintAgentServiceOptions,\n PiPrintSendResult,\n} from \"./providers/pi/durable/PiPrintAgentService.js\";\n"],"names":["AgentManager","AgentNotRunningError","getCodexCapacityReport","getAgentReadinessReport","getAgentReadinessReports","worstReadinessStatus","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","OpenCodeAdapter","PiAdapter","AgentStatus","TerminalFocusManager","TerminalType","TtyWriter","AgentRegistry","RenameNotFoundError","RenameConflictError","AGENT_RUNTIME_PROVIDERS","parseTmuxRuntimeRef","TmuxManager","startAgent","stopAgent","focusAgent","sendAgentPrompt","TmuxUnavailableError","AgentNameInUseError","AgentPidPollTimeoutError","AgentRuntimeUnavailableError","AgentTerminalNotFoundError","DEFAULT_PID_POLL_INTERVAL_MS","DEFAULT_PID_POLL_TIMEOUT_MS","AGENTS","getAgentRequestPath","readLatestAgentRequest","writeAgentRequest","AGENT_MODES","DurableAgentError","DurableAgentBusyError","DurableAgentNotFoundError","DurableAgentRepositoryError","DurableAgentNameConflictError","ClaudePrintError","CodexPrintError","PiPrintError","DurableAgentRepository","ClaudePrintAgentService","CodexCliProbe","CodexPrintRunner","CodexPrintAgentService","PiCliProbe","PiPrintRunner","PiPrintAgentService"],"mappings":"AAAA,SAASA,YAAY,EAAEC,oBAAoB,QAAQ,oBAAoB;AACvE,SAASC,sBAAsB,QAAQ,sBAAsB;AAE7D,SACEC,uBAAuB,EACvBC,wBAAwB,EACxBC,oBAAoB,QACf,gCAAgC;AAevC,SAASC,iBAAiB,QAAQ,0CAA0C;AAC5E,SAASC,YAAY,QAAQ,oCAAoC;AACjE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,gBAAgB,QAAQ,iCAAiC;AAClE,SAASC,cAAc,QAAQ,+BAA+B;AAC9D,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,8BAA8B;AACxD,SAASC,WAAW,QAAQ,6BAA6B;AAYzD,SAASC,oBAAoB,EAAEC,YAAY,QAAQ,qCAAqC;AAExF,SAASC,SAAS,QAAQ,0BAA0B;AAIpD,SACEC,aAAa,EACbC,mBAAmB,EACnBC,mBAAmB,EACnBC,uBAAuB,EACvBC,mBAAmB,QACd,2BAA2B;AAOlC,SAASC,WAAW,QAAQ,4BAA4B;AAExD,SACEC,UAAU,EACVC,SAAS,EACTC,UAAU,EACVC,eAAe,EACfC,oBAAoB,EACpBC,mBAAmB,EACnBC,wBAAwB,EACxBC,4BAA4B,EAC5BC,0BAA0B,EAC1BC,4BAA4B,EAC5BC,2BAA2B,QACtB,mCAAmC;AAU1C,SAASC,MAAM,QAAQ,oBAAoB;AAI3C,SACEC,mBAAmB,EACnBC,sBAAsB,EACtBC,iBAAiB,QACZ,4BAA4B;AAEnC,SACEC,WAAW,EACXC,iBAAiB,EACjBC,qBAAqB,EACrBC,yBAAyB,EACzBC,2BAA2B,EAC3BC,6BAA6B,EAC7BC,gBAAgB,EAChBC,eAAe,EACfC,YAAY,QACP,4BAA4B;AAiBnC,SAASC,sBAAsB,QAAQ,sCAAsC;AAO7E,SAASC,uBAAuB,QAAQ,wDAAwD;AAKhG,SAASC,aAAa,QAAQ,6CAA6C;AAE3E,SAASC,gBAAgB,QAAQ,gDAAgD;AAMjF,SAASC,sBAAsB,QAAQ,sDAAsD;AAK7F,SAASC,UAAU,QAAQ,uCAAuC;AAElE,SAASC,aAAa,QAAQ,0CAA0C;AAMxE,SAASC,mBAAmB,QAAQ,gDAAgD"}
@@ -1,7 +1,7 @@
1
- import type { AgentInfo, ProcessInfo } from '../../adapters/AgentAdapter.js';
2
- import { AgentStatus } from '../../adapters/AgentAdapter.js';
3
- import type { SessionFile } from '../../utils/session.js';
4
- import { ClaudeSessionParser, type ClaudeSession } from './ClaudeSessionParser.js';
1
+ import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import type { SessionFile } from "../../utils/session.js";
4
+ import { ClaudeSessionParser, type ClaudeSession } from "./ClaudeSessionParser.js";
5
5
  export interface ClaudeAgentLiveInfo {
6
6
  pidStatus?: AgentStatus;
7
7
  waitingFor?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAChC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,uBAAuB;IACpC,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAClC;AAED,qBAAa,iBAAiB;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,mBAA+C;IAEpF,iBAAiB,CAAC,EACd,OAAO,EACP,WAAW,EACX,WAAW,EACX,QAAQ,GACX,EAAE,uBAAuB,GAAG,SAAS;IAuBtC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAY3D"}
1
+ {"version":3,"file":"ClaudeAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEnF,MAAM,WAAW,mBAAmB;IAClC,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,aAAa,CAAC;IACvB,WAAW,EAAE,WAAW,CAAC;IACzB,WAAW,EAAE,WAAW,CAAC;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC;CAChC;AAED,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,mBAA+C;IAEpF,iBAAiB,CAAC,EAChB,OAAO,EACP,WAAW,EACX,WAAW,EACX,QAAQ,GACT,EAAE,uBAAuB,GAAG,SAAS;IAwBtC,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAYzD"}
@@ -1,6 +1,6 @@
1
- import { AgentStatus } from '../../adapters/AgentAdapter.js';
2
- import { generateAgentName } from '../../utils/matching.js';
3
- import { ClaudeSessionParser } from './ClaudeSessionParser.js';
1
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
2
+ import { generateAgentName } from "../../utils/matching.js";
3
+ import { ClaudeSessionParser } from "./ClaudeSessionParser.js";
4
4
  export class ClaudeAgentMapper {
5
5
  parser;
6
6
  constructor(parser = new ClaudeSessionParser()){
@@ -11,15 +11,15 @@ export class ClaudeAgentMapper {
11
11
  // status mis-classifies sessions whose latest entry is a UI-state
12
12
  // event like `permission-mode` or `ai-title`.
13
13
  const status = liveInfo?.pidStatus ?? this.parser.determineStatus(session);
14
- const baseSummary = session.lastUserMessage || 'Session started';
14
+ const baseSummary = session.lastUserMessage || "Session started";
15
15
  const summary = status === AgentStatus.WAITING && liveInfo?.waitingFor ? `${baseSummary} — waiting for ${liveInfo.waitingFor}` : baseSummary;
16
16
  return {
17
17
  name: generateAgentName(processInfo.cwd, processInfo.pid),
18
- type: 'claude',
18
+ type: "claude",
19
19
  status,
20
20
  summary,
21
21
  pid: processInfo.pid,
22
- projectPath: sessionFile.resolvedCwd || processInfo.cwd || '',
22
+ projectPath: sessionFile.resolvedCwd || processInfo.cwd || "",
23
23
  sessionId: sessionFile.sessionId,
24
24
  lastActive: session.lastActive,
25
25
  sessionFilePath: sessionFile.filePath
@@ -27,12 +27,12 @@ export class ClaudeAgentMapper {
27
27
  }
28
28
  mapProcessOnlyAgent(processInfo) {
29
29
  return {
30
- name: generateAgentName(processInfo.cwd || '', processInfo.pid),
31
- type: 'claude',
30
+ name: generateAgentName(processInfo.cwd || "", processInfo.pid),
31
+ type: "claude",
32
32
  status: AgentStatus.IDLE,
33
- summary: 'Unknown',
33
+ summary: "Unknown",
34
34
  pid: processInfo.pid,
35
- projectPath: processInfo.cwd || '',
35
+ projectPath: processInfo.cwd || "",
36
36
  sessionId: `pid-${processInfo.pid}`,
37
37
  lastActive: new Date()
38
38
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from '../../adapters/AgentAdapter.js';\nimport { AgentStatus } from '../../adapters/AgentAdapter.js';\nimport { generateAgentName } from '../../utils/matching.js';\nimport type { SessionFile } from '../../utils/session.js';\nimport { ClaudeSessionParser, type ClaudeSession } from './ClaudeSessionParser.js';\n\nexport interface ClaudeAgentLiveInfo {\n pidStatus?: AgentStatus;\n waitingFor?: string;\n}\n\nexport interface ClaudeSessionAgentInput {\n session: ClaudeSession;\n processInfo: ProcessInfo;\n sessionFile: SessionFile;\n liveInfo?: ClaudeAgentLiveInfo;\n}\n\nexport class ClaudeAgentMapper {\n constructor(private readonly parser: ClaudeSessionParser = new ClaudeSessionParser()) {}\n\n mapSessionToAgent({\n session,\n processInfo,\n sessionFile,\n liveInfo,\n }: ClaudeSessionAgentInput): AgentInfo {\n // Live PID-file status is authoritative when present — JSONL-derived\n // status mis-classifies sessions whose latest entry is a UI-state\n // event like `permission-mode` or `ai-title`.\n const status = liveInfo?.pidStatus ?? this.parser.determineStatus(session);\n const baseSummary = session.lastUserMessage || 'Session started';\n const summary = status === AgentStatus.WAITING && liveInfo?.waitingFor\n ? `${baseSummary} — waiting for ${liveInfo.waitingFor}`\n : baseSummary;\n\n return {\n name: generateAgentName(processInfo.cwd, processInfo.pid),\n type: 'claude',\n status,\n summary,\n pid: processInfo.pid,\n projectPath: sessionFile.resolvedCwd || processInfo.cwd || '',\n sessionId: sessionFile.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: sessionFile.filePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(processInfo.cwd || '', processInfo.pid),\n type: 'claude',\n status: AgentStatus.IDLE,\n summary: 'Unknown',\n pid: processInfo.pid,\n projectPath: processInfo.cwd || '',\n sessionId: `pid-${processInfo.pid}`,\n lastActive: new Date(),\n };\n }\n}\n"],"names":["AgentStatus","generateAgentName","ClaudeSessionParser","ClaudeAgentMapper","parser","mapSessionToAgent","session","processInfo","sessionFile","liveInfo","status","pidStatus","determineStatus","baseSummary","lastUserMessage","summary","WAITING","waitingFor","name","cwd","pid","type","projectPath","resolvedCwd","sessionId","lastActive","sessionFilePath","filePath","mapProcessOnlyAgent","IDLE","Date"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAE5D,SAASC,mBAAmB,QAA4B,2BAA2B;AAcnF,OAAO,MAAMC;;IACT,YAAY,AAAiBC,SAA8B,IAAIF,qBAAqB,CAAE;aAAzDE,SAAAA;IAA0D;IAEvFC,kBAAkB,EACdC,OAAO,EACPC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACc,EAAa;QACnC,qEAAqE;QACrE,kEAAkE;QAClE,8CAA8C;QAC9C,MAAMC,SAASD,UAAUE,aAAa,IAAI,CAACP,MAAM,CAACQ,eAAe,CAACN;QAClE,MAAMO,cAAcP,QAAQQ,eAAe,IAAI;QAC/C,MAAMC,UAAUL,WAAWV,YAAYgB,OAAO,IAAIP,UAAUQ,aACtD,GAAGJ,YAAY,eAAe,EAAEJ,SAASQ,UAAU,EAAE,GACrDJ;QAEN,OAAO;YACHK,MAAMjB,kBAAkBM,YAAYY,GAAG,EAAEZ,YAAYa,GAAG;YACxDC,MAAM;YACNX;YACAK;YACAK,KAAKb,YAAYa,GAAG;YACpBE,aAAad,YAAYe,WAAW,IAAIhB,YAAYY,GAAG,IAAI;YAC3DK,WAAWhB,YAAYgB,SAAS;YAChCC,YAAYnB,QAAQmB,UAAU;YAC9BC,iBAAiBlB,YAAYmB,QAAQ;QACzC;IACJ;IAEAC,oBAAoBrB,WAAwB,EAAa;QACrD,OAAO;YACHW,MAAMjB,kBAAkBM,YAAYY,GAAG,IAAI,IAAIZ,YAAYa,GAAG;YAC9DC,MAAM;YACNX,QAAQV,YAAY6B,IAAI;YACxBd,SAAS;YACTK,KAAKb,YAAYa,GAAG;YACpBE,aAAaf,YAAYY,GAAG,IAAI;YAChCK,WAAW,CAAC,IAAI,EAAEjB,YAAYa,GAAG,EAAE;YACnCK,YAAY,IAAIK;QACpB;IACJ;AACJ"}
1
+ {"version":3,"sources":["../../../src/providers/claude/ClaudeAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport type { SessionFile } from \"../../utils/session.js\";\nimport { ClaudeSessionParser, type ClaudeSession } from \"./ClaudeSessionParser.js\";\n\nexport interface ClaudeAgentLiveInfo {\n pidStatus?: AgentStatus;\n waitingFor?: string;\n}\n\nexport interface ClaudeSessionAgentInput {\n session: ClaudeSession;\n processInfo: ProcessInfo;\n sessionFile: SessionFile;\n liveInfo?: ClaudeAgentLiveInfo;\n}\n\nexport class ClaudeAgentMapper {\n constructor(private readonly parser: ClaudeSessionParser = new ClaudeSessionParser()) {}\n\n mapSessionToAgent({\n session,\n processInfo,\n sessionFile,\n liveInfo,\n }: ClaudeSessionAgentInput): AgentInfo {\n // Live PID-file status is authoritative when present — JSONL-derived\n // status mis-classifies sessions whose latest entry is a UI-state\n // event like `permission-mode` or `ai-title`.\n const status = liveInfo?.pidStatus ?? this.parser.determineStatus(session);\n const baseSummary = session.lastUserMessage || \"Session started\";\n const summary =\n status === AgentStatus.WAITING && liveInfo?.waitingFor\n ? `${baseSummary} — waiting for ${liveInfo.waitingFor}`\n : baseSummary;\n\n return {\n name: generateAgentName(processInfo.cwd, processInfo.pid),\n type: \"claude\",\n status,\n summary,\n pid: processInfo.pid,\n projectPath: sessionFile.resolvedCwd || processInfo.cwd || \"\",\n sessionId: sessionFile.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: sessionFile.filePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return {\n name: generateAgentName(processInfo.cwd || \"\", processInfo.pid),\n type: \"claude\",\n status: AgentStatus.IDLE,\n summary: \"Unknown\",\n pid: processInfo.pid,\n projectPath: processInfo.cwd || \"\",\n sessionId: `pid-${processInfo.pid}`,\n lastActive: new Date(),\n };\n }\n}\n"],"names":["AgentStatus","generateAgentName","ClaudeSessionParser","ClaudeAgentMapper","parser","mapSessionToAgent","session","processInfo","sessionFile","liveInfo","status","pidStatus","determineStatus","baseSummary","lastUserMessage","summary","WAITING","waitingFor","name","cwd","pid","type","projectPath","resolvedCwd","sessionId","lastActive","sessionFilePath","filePath","mapProcessOnlyAgent","IDLE","Date"],"mappings":"AACA,SAASA,WAAW,QAAQ,iCAAiC;AAC7D,SAASC,iBAAiB,QAAQ,0BAA0B;AAE5D,SAASC,mBAAmB,QAA4B,2BAA2B;AAcnF,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA8B,IAAIF,qBAAqB,CAAE;aAAzDE,SAAAA;IAA0D;IAEvFC,kBAAkB,EAChBC,OAAO,EACPC,WAAW,EACXC,WAAW,EACXC,QAAQ,EACgB,EAAa;QACrC,qEAAqE;QACrE,kEAAkE;QAClE,8CAA8C;QAC9C,MAAMC,SAASD,UAAUE,aAAa,IAAI,CAACP,MAAM,CAACQ,eAAe,CAACN;QAClE,MAAMO,cAAcP,QAAQQ,eAAe,IAAI;QAC/C,MAAMC,UACJL,WAAWV,YAAYgB,OAAO,IAAIP,UAAUQ,aACxC,GAAGJ,YAAY,eAAe,EAAEJ,SAASQ,UAAU,EAAE,GACrDJ;QAEN,OAAO;YACLK,MAAMjB,kBAAkBM,YAAYY,GAAG,EAAEZ,YAAYa,GAAG;YACxDC,MAAM;YACNX;YACAK;YACAK,KAAKb,YAAYa,GAAG;YACpBE,aAAad,YAAYe,WAAW,IAAIhB,YAAYY,GAAG,IAAI;YAC3DK,WAAWhB,YAAYgB,SAAS;YAChCC,YAAYnB,QAAQmB,UAAU;YAC9BC,iBAAiBlB,YAAYmB,QAAQ;QACvC;IACF;IAEAC,oBAAoBrB,WAAwB,EAAa;QACvD,OAAO;YACLW,MAAMjB,kBAAkBM,YAAYY,GAAG,IAAI,IAAIZ,YAAYa,GAAG;YAC9DC,MAAM;YACNX,QAAQV,YAAY6B,IAAI;YACxBd,SAAS;YACTK,KAAKb,YAAYa,GAAG;YACpBE,aAAaf,YAAYY,GAAG,IAAI;YAChCK,WAAW,CAAC,IAAI,EAAEjB,YAAYa,GAAG,EAAE;YACnCK,YAAY,IAAIK;QAClB;IACF;AACF"}
@@ -1,4 +1,4 @@
1
- import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from '../../adapters/AgentAdapter.js';
1
+ import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
2
2
  /**
3
3
  * Claude Code Adapter
4
4
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACR,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACxB,MAAM,gCAAgC,CAAC;AAOxC;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IAClD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,sBAAuB;IAE5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAU5B,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C,OAAO,CAAC,kBAAkB;IAKpB,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IA+DzE,OAAO,CAAC,aAAa;IAOrB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAI1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAiC5E"}
1
+ {"version":3,"file":"ClaudeCodeAdapter.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAWxC;;;;;;;;;GASG;AACH,qBAAa,iBAAkB,YAAW,YAAY;IACpD,QAAQ,CAAC,IAAI,EAAG,QAAQ,CAAU;IAClC,QAAQ,CAAC,YAAY,sBAAuB;IAE5C,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,WAAW,CAAS;;IAU5B,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAI5C,OAAO,CAAC,kBAAkB;IAKpB,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;IAmEzE,OAAO,CAAC,aAAa;IAOrB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,OAAO,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,mBAAmB,EAAE;IAI1F,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;CAiC1E"}
@@ -1,9 +1,9 @@
1
- import * as path from 'path';
2
- import { captureProcessSnapshot, executableBasename, filterByProcessNames } from '../../utils/process.js';
3
- import { safeStat } from '../../utils/session.js';
4
- import { ClaudeSessionParser } from './ClaudeSessionParser.js';
5
- import { ClaudeAgentMapper } from './ClaudeAgentMapper.js';
6
- import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
1
+ import * as path from "path";
2
+ import { captureProcessSnapshot, executableBasename, filterByProcessNames } from "../../utils/process.js";
3
+ import { safeStat } from "../../utils/session.js";
4
+ import { ClaudeSessionParser } from "./ClaudeSessionParser.js";
5
+ import { ClaudeAgentMapper } from "./ClaudeAgentMapper.js";
6
+ import { ClaudeSessionLocator } from "./ClaudeSessionLocator.js";
7
7
  /**
8
8
  * Claude Code Adapter
9
9
  *
@@ -14,18 +14,18 @@ import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
14
14
  * 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file
15
15
  * 5. Extracting summary from last user message in session JSONL
16
16
  */ export class ClaudeCodeAdapter {
17
- type = 'claude';
17
+ type = "claude";
18
18
  processNames = [
19
- 'claude'
19
+ "claude"
20
20
  ];
21
21
  parser;
22
22
  mapper;
23
23
  projectsDir;
24
24
  sessionsDir;
25
25
  constructor(){
26
- const homeDir = process.env.HOME || process.env.USERPROFILE || '';
27
- this.projectsDir = path.join(homeDir, '.claude', 'projects');
28
- this.sessionsDir = path.join(homeDir, '.claude', 'sessions');
26
+ const homeDir = process.env.HOME || process.env.USERPROFILE || "";
27
+ this.projectsDir = path.join(homeDir, ".claude", "projects");
28
+ this.sessionsDir = path.join(homeDir, ".claude", "sessions");
29
29
  this.parser = new ClaudeSessionParser();
30
30
  this.mapper = new ClaudeAgentMapper(this.parser);
31
31
  }
@@ -34,7 +34,7 @@ import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
34
34
  }
35
35
  isClaudeExecutable(command) {
36
36
  const base = executableBasename(command);
37
- return base === 'claude' || base === 'claude.exe';
37
+ return base === "claude" || base === "claude.exe";
38
38
  }
39
39
  async detectAgents(context) {
40
40
  const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);
@@ -113,10 +113,10 @@ import { ClaudeSessionLocator } from './ClaudeSessionLocator.js';
113
113
  if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;
114
114
  const stat = safeStat(filePath);
115
115
  summaries.push({
116
- type: 'claude',
116
+ type: "claude",
117
117
  sessionId: session.sessionId,
118
118
  cwd: recordedCwd,
119
- firstUserMessage: session.firstUserMessage || '',
119
+ firstUserMessage: session.firstUserMessage || "",
120
120
  lastActive: session.lastActive ?? stat?.mtime ?? new Date(),
121
121
  startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),
122
122
  sessionFilePath: filePath
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"sourcesContent":["import * as path from 'path';\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from '../../adapters/AgentAdapter.js';\nimport { captureProcessSnapshot, executableBasename, filterByProcessNames } from '../../utils/process.js';\nimport { safeStat } from '../../utils/session.js';\nimport { ClaudeSessionParser } from './ClaudeSessionParser.js';\nimport { ClaudeAgentMapper } from './ClaudeAgentMapper.js';\nimport { ClaudeSessionLocator } from './ClaudeSessionLocator.js';\n\n/**\n * Claude Code Adapter\n *\n * Detects Claude Code agents by:\n * 1. Filtering Claude processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json\n * 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file\n * 5. Extracting summary from last user message in session JSONL\n */\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly type = 'claude' as const;\n readonly processNames = ['claude'] as const;\n\n private parser: ClaudeSessionParser;\n private mapper: ClaudeAgentMapper;\n private projectsDir: string;\n private sessionsDir: string;\n\n constructor() {\n const homeDir = process.env.HOME || process.env.USERPROFILE || '';\n this.projectsDir = path.join(homeDir, '.claude', 'projects');\n this.sessionsDir = path.join(homeDir, '.claude', 'sessions');\n this.parser = new ClaudeSessionParser();\n this.mapper = new ClaudeAgentMapper(this.parser);\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isClaudeExecutable(processInfo.command);\n }\n\n private isClaudeExecutable(command: string): boolean {\n const base = executableBasename(command);\n return base === 'claude' || base === 'claude.exe';\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) {\n return [];\n }\n\n const { direct, legacyMatches } = this.createLocator().matchRunningProcesses(processes);\n\n const matchedPids = new Set([\n ...direct.map((d) => d.process.pid),\n ...legacyMatches.map((m) => m.process.pid),\n ]);\n\n const agents: AgentInfo[] = [];\n\n // Build agents from direct (resume + PID-file) matches\n for (const match of direct) {\n const { process: proc, sessionFile } = match;\n const sessionData = this.parser.readSession(sessionFile.filePath, sessionFile.resolvedCwd);\n if (sessionData) {\n agents.push(this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: proc,\n sessionFile,\n liveInfo: {\n pidStatus: match.pidStatus,\n waitingFor: match.waitingFor,\n },\n }));\n } else {\n matchedPids.delete(proc.pid);\n }\n }\n\n // Build agents from legacy matches\n for (const match of legacyMatches) {\n const sessionData = this.parser.readSession(\n match.session.filePath,\n match.session.resolvedCwd,\n );\n if (sessionData) {\n agents.push(this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: match.process,\n sessionFile: match.session,\n }));\n } else {\n matchedPids.delete(match.process.pid);\n }\n }\n\n // Any process with no match (direct or legacy) appears as IDLE\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid)) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n }\n }\n\n return agents;\n }\n\n private createLocator(): ClaudeSessionLocator {\n return new ClaudeSessionLocator({\n projectsDir: this.projectsDir,\n sessionsDir: this.sessionsDir,\n });\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const filterCwd = opts?.cwd;\n const candidates = this.createLocator().discoverHistoricalSessionFiles();\n const summaries: SessionSummary[] = [];\n\n for (const { filePath, defaultCwd } of candidates) {\n const session = this.parser.readSession(filePath, defaultCwd);\n if (!session) continue;\n\n // Drop sessions whose JSONL had no parseable conversation entries.\n // readSession is permissive (returns a shell record even when every\n // line fails to parse); listSessions needs at least one real entry\n // so we don't surface garbage files.\n if (!session.lastEntryType) continue;\n\n const recordedCwd = session.lastCwd || defaultCwd;\n if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;\n\n const stat = safeStat(filePath);\n\n summaries.push({\n type: 'claude',\n sessionId: session.sessionId,\n cwd: recordedCwd,\n firstUserMessage: session.firstUserMessage || '',\n lastActive: session.lastActive ?? stat?.mtime ?? new Date(),\n startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),\n sessionFilePath: filePath,\n });\n }\n\n return summaries;\n }\n}\n"],"names":["path","captureProcessSnapshot","executableBasename","filterByProcessNames","safeStat","ClaudeSessionParser","ClaudeAgentMapper","ClaudeSessionLocator","ClaudeCodeAdapter","type","processNames","parser","mapper","projectsDir","sessionsDir","homeDir","process","env","HOME","USERPROFILE","join","canHandle","processInfo","isClaudeExecutable","command","base","detectAgents","context","snapshot","processes","relevant","filter","length","direct","legacyMatches","createLocator","matchRunningProcesses","matchedPids","Set","map","d","pid","m","agents","match","proc","sessionFile","sessionData","readSession","filePath","resolvedCwd","push","mapSessionToAgent","session","liveInfo","pidStatus","waitingFor","delete","has","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","filterCwd","cwd","candidates","discoverHistoricalSessionFiles","summaries","defaultCwd","lastEntryType","recordedCwd","lastCwd","undefined","stat","sessionId","firstUserMessage","lastActive","mtime","Date","startedAt","sessionStart","birthtime"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/providers/claude/ClaudeCodeAdapter.ts"],"sourcesContent":["import * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport {\n captureProcessSnapshot,\n executableBasename,\n filterByProcessNames,\n} from \"../../utils/process.js\";\nimport { safeStat } from \"../../utils/session.js\";\nimport { ClaudeSessionParser } from \"./ClaudeSessionParser.js\";\nimport { ClaudeAgentMapper } from \"./ClaudeAgentMapper.js\";\nimport { ClaudeSessionLocator } from \"./ClaudeSessionLocator.js\";\n\n/**\n * Claude Code Adapter\n *\n * Detects Claude Code agents by:\n * 1. Filtering Claude processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Attempting authoritative PID-file matching via ~/.claude/sessions/<pid>.json\n * 4. Falling back to CWD+birthtime heuristic (matchProcessesToSessions) for processes without a PID file\n * 5. Extracting summary from last user message in session JSONL\n */\nexport class ClaudeCodeAdapter implements AgentAdapter {\n readonly type = \"claude\" as const;\n readonly processNames = [\"claude\"] as const;\n\n private parser: ClaudeSessionParser;\n private mapper: ClaudeAgentMapper;\n private projectsDir: string;\n private sessionsDir: string;\n\n constructor() {\n const homeDir = process.env.HOME || process.env.USERPROFILE || \"\";\n this.projectsDir = path.join(homeDir, \".claude\", \"projects\");\n this.sessionsDir = path.join(homeDir, \".claude\", \"sessions\");\n this.parser = new ClaudeSessionParser();\n this.mapper = new ClaudeAgentMapper(this.parser);\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isClaudeExecutable(processInfo.command);\n }\n\n private isClaudeExecutable(command: string): boolean {\n const base = executableBasename(command);\n return base === \"claude\" || base === \"claude.exe\";\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));\n const relevant = filterByProcessNames(snapshot, this.processNames);\n const processes = relevant.filter((process) => this.canHandle(process));\n if (processes.length === 0) {\n return [];\n }\n\n const { direct, legacyMatches } = this.createLocator().matchRunningProcesses(processes);\n\n const matchedPids = new Set([\n ...direct.map((d) => d.process.pid),\n ...legacyMatches.map((m) => m.process.pid),\n ]);\n\n const agents: AgentInfo[] = [];\n\n // Build agents from direct (resume + PID-file) matches\n for (const match of direct) {\n const { process: proc, sessionFile } = match;\n const sessionData = this.parser.readSession(sessionFile.filePath, sessionFile.resolvedCwd);\n if (sessionData) {\n agents.push(\n this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: proc,\n sessionFile,\n liveInfo: {\n pidStatus: match.pidStatus,\n waitingFor: match.waitingFor,\n },\n }),\n );\n } else {\n matchedPids.delete(proc.pid);\n }\n }\n\n // Build agents from legacy matches\n for (const match of legacyMatches) {\n const sessionData = this.parser.readSession(\n match.session.filePath,\n match.session.resolvedCwd,\n );\n if (sessionData) {\n agents.push(\n this.mapper.mapSessionToAgent({\n session: sessionData,\n processInfo: match.process,\n sessionFile: match.session,\n }),\n );\n } else {\n matchedPids.delete(match.process.pid);\n }\n }\n\n // Any process with no match (direct or legacy) appears as IDLE\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid)) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n }\n }\n\n return agents;\n }\n\n private createLocator(): ClaudeSessionLocator {\n return new ClaudeSessionLocator({\n projectsDir: this.projectsDir,\n sessionsDir: this.sessionsDir,\n });\n }\n\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const filterCwd = opts?.cwd;\n const candidates = this.createLocator().discoverHistoricalSessionFiles();\n const summaries: SessionSummary[] = [];\n\n for (const { filePath, defaultCwd } of candidates) {\n const session = this.parser.readSession(filePath, defaultCwd);\n if (!session) continue;\n\n // Drop sessions whose JSONL had no parseable conversation entries.\n // readSession is permissive (returns a shell record even when every\n // line fails to parse); listSessions needs at least one real entry\n // so we don't surface garbage files.\n if (!session.lastEntryType) continue;\n\n const recordedCwd = session.lastCwd || defaultCwd;\n if (filterCwd !== undefined && recordedCwd !== filterCwd) continue;\n\n const stat = safeStat(filePath);\n\n summaries.push({\n type: \"claude\",\n sessionId: session.sessionId,\n cwd: recordedCwd,\n firstUserMessage: session.firstUserMessage || \"\",\n lastActive: session.lastActive ?? stat?.mtime ?? new Date(),\n startedAt: session.sessionStart ?? stat?.birthtime ?? stat?.mtime ?? new Date(),\n sessionFilePath: filePath,\n });\n }\n\n return summaries;\n }\n}\n"],"names":["path","captureProcessSnapshot","executableBasename","filterByProcessNames","safeStat","ClaudeSessionParser","ClaudeAgentMapper","ClaudeSessionLocator","ClaudeCodeAdapter","type","processNames","parser","mapper","projectsDir","sessionsDir","homeDir","process","env","HOME","USERPROFILE","join","canHandle","processInfo","isClaudeExecutable","command","base","detectAgents","context","snapshot","processes","relevant","filter","length","direct","legacyMatches","createLocator","matchRunningProcesses","matchedPids","Set","map","d","pid","m","agents","match","proc","sessionFile","sessionData","readSession","filePath","resolvedCwd","push","mapSessionToAgent","session","liveInfo","pidStatus","waitingFor","delete","has","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","filterCwd","cwd","candidates","discoverHistoricalSessionFiles","summaries","defaultCwd","lastEntryType","recordedCwd","lastCwd","undefined","stat","sessionId","firstUserMessage","lastActive","mtime","Date","startedAt","sessionStart","birthtime"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
- import type { ProcessInfo } from '../../adapters/AgentAdapter.js';
2
- import { AgentStatus } from '../../adapters/AgentAdapter.js';
3
- import { type MatchResult } from '../../utils/matching.js';
4
- import { type SessionFile } from '../../utils/session.js';
1
+ import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import { type MatchResult } from "../../utils/matching.js";
4
+ import { type SessionFile } from "../../utils/session.js";
5
5
  /**
6
6
  * A process directly matched to a session via PID file (authoritative path).
7
7
  *
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeSessionLocator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAMH,KAAK,WAAW,EACnB,MAAM,wBAAwB,CAAC;AAyBhC;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAC9B,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,2BAA2B;IACxC,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,aAAa,EAAE,WAAW,EAAE,CAAC;CAChC;AAED,MAAM,WAAW,2BAA2B;IACxC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAKD,qBAAa,oBAAoB;IAC7B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,GAAE,2BAAgC;IAMrD;;;;;;;;;OASG;IACH,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,2BAA2B;IAe5E;;;;;;;;;;OAUG;IACH,8BAA8B,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBjF;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IA6B7D;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA8CzB,OAAO,CAAC,sBAAsB;IAK9B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAoB3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;CAsC7B"}
1
+ {"version":3,"file":"ClaudeSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/providers/claude/ClaudeSessionLocator.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAA4B,KAAK,WAAW,EAAE,MAAM,yBAAyB,CAAC;AACrF,OAAO,EAML,KAAK,WAAW,EACjB,MAAM,wBAAwB,CAAC;AAyBhC;;;;;;GAMG;AACH,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;IACzB,SAAS,CAAC,EAAE,WAAW,CAAC;IACxB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,2BAA2B;IAC1C,MAAM,EAAE,iBAAiB,EAAE,CAAC;IAC5B,aAAa,EAAE,WAAW,EAAE,CAAC;CAC9B;AAED,MAAM,WAAW,2BAA2B;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAKD,qBAAa,oBAAoB;IAC/B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;gBAEzB,OAAO,GAAE,2BAAgC;IAMrD;;;;;;;;;OASG;IACH,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,2BAA2B;IAe5E;;;;;;;;;;OAUG;IACH,8BAA8B,IAAI,KAAK,CAAC;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBjF;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,aAAa;IAKrB;;;;;;OAMG;IACH,oBAAoB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,WAAW,EAAE;IA6B7D;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IA8CzB,OAAO,CAAC,sBAAsB;IAK9B;;;;;;;;OAQG;IACH,OAAO,CAAC,mBAAmB;IAkB3B;;;;;OAKG;IACH,OAAO,CAAC,YAAY;IAapB;;;;;;;;;OASG;IACH,OAAO,CAAC,kBAAkB;CAsC3B"}
@@ -1,27 +1,27 @@
1
- import * as fs from 'fs';
2
- import * as path from 'path';
3
- import { AgentStatus } from '../../adapters/AgentAdapter.js';
4
- import { matchProcessesToSessions } from '../../utils/matching.js';
5
- import { batchGetSessionFileBirthtimes, isDirectory, listJsonl, safeReaddir, safeStat } from '../../utils/session.js';
1
+ import * as fs from "fs";
2
+ import * as path from "path";
3
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
4
+ import { matchProcessesToSessions } from "../../utils/matching.js";
5
+ import { batchGetSessionFileBirthtimes, isDirectory, listJsonl, safeReaddir, safeStat } from "../../utils/session.js";
6
6
  /** Maximum allowed delta (ms) between process start time and PID file startedAt. */ const PID_FILE_STALENESS_MS = 60000;
7
7
  export class ClaudeSessionLocator {
8
8
  projectsDir;
9
9
  sessionsDir;
10
10
  constructor(options = {}){
11
- const homeDir = process.env.HOME || process.env.USERPROFILE || '';
12
- this.projectsDir = options.projectsDir ?? path.join(homeDir, '.claude', 'projects');
13
- this.sessionsDir = options.sessionsDir ?? path.join(homeDir, '.claude', 'sessions');
11
+ const homeDir = process.env.HOME || process.env.USERPROFILE || "";
12
+ this.projectsDir = options.projectsDir ?? path.join(homeDir, ".claude", "projects");
13
+ this.sessionsDir = options.sessionsDir ?? path.join(homeDir, ".claude", "sessions");
14
14
  }
15
15
  /**
16
- * Pair live Claude processes with their session files.
17
- *
18
- * Runs three staged strategies, each handing its unmatched processes
19
- * to the next:
20
- * 1. `--resume <id>` on the command line — authoritative for resumed
21
- * sessions whose JSONL predates the process.
22
- * 2. PID-file matching via ~/.claude/sessions/<pid>.json.
23
- * 3. Legacy CWD+birthtime heuristic, for processes with no PID file.
24
- */ matchRunningProcesses(processes) {
16
+ * Pair live Claude processes with their session files.
17
+ *
18
+ * Runs three staged strategies, each handing its unmatched processes
19
+ * to the next:
20
+ * 1. `--resume <id>` on the command line — authoritative for resumed
21
+ * sessions whose JSONL predates the process.
22
+ * 2. PID-file matching via ~/.claude/sessions/<pid>.json.
23
+ * 3. Legacy CWD+birthtime heuristic, for processes with no PID file.
24
+ */ matchRunningProcesses(processes) {
25
25
  const { direct: resumeDirect, fallback: noResume } = this.tryResumeMatching(processes);
26
26
  const { direct: pidDirect, fallback } = this.tryPidFileMatching(noResume);
27
27
  const legacySessions = this.discoverLiveSessions(fallback);
@@ -35,16 +35,16 @@ export class ClaudeSessionLocator {
35
35
  };
36
36
  }
37
37
  /**
38
- * Discover candidate session files for listing historical sessions.
39
- *
40
- * Always walks every subdirectory of `projectsDir`. We can't use the
41
- * encoded-dir shortcut for the cwd-scoped path because Claude Code
42
- * indexes session files by where the *process was launched*, not by
43
- * the recorded `cwd` field inside the session — these diverge in
44
- * worktrees and similar setups. The cwd filter is applied later
45
- * against `session.lastCwd` so callers see exactly the sessions whose
46
- * recorded cwd matches.
47
- */ discoverHistoricalSessionFiles() {
38
+ * Discover candidate session files for listing historical sessions.
39
+ *
40
+ * Always walks every subdirectory of `projectsDir`. We can't use the
41
+ * encoded-dir shortcut for the cwd-scoped path because Claude Code
42
+ * indexes session files by where the *process was launched*, not by
43
+ * the recorded `cwd` field inside the session — these diverge in
44
+ * worktrees and similar setups. The cwd filter is applied later
45
+ * against `session.lastCwd` so callers see exactly the sessions whose
46
+ * recorded cwd matches.
47
+ */ discoverHistoricalSessionFiles() {
48
48
  const out = [];
49
49
  if (!isDirectory(this.projectsDir)) return out;
50
50
  for (const dirName of safeReaddir(this.projectsDir)){
@@ -54,7 +54,7 @@ export class ClaudeSessionLocator {
54
54
  // recorded cwd: '-Users-foo-bar' → '/Users/foo/bar'. Lossy for
55
55
  // paths containing '-'; session content's lastCwd overrides
56
56
  // this when available.
57
- const decoded = dirName.replace(/-/g, '/');
57
+ const decoded = dirName.replace(/-/g, "/");
58
58
  for (const name of listJsonl(projectDir)){
59
59
  out.push({
60
60
  filePath: path.join(projectDir, name),
@@ -65,28 +65,28 @@ export class ClaudeSessionLocator {
65
65
  return out;
66
66
  }
67
67
  /**
68
- * Derive the Claude Code project directory for a given CWD.
69
- *
70
- * Claude Code encodes paths by replacing every non-alphanumeric
71
- * character with '-', so '/', '_', '.', spaces, etc. all collapse:
72
- * /Users/foo/bar → -Users-foo-bar
73
- * /Users/foo/my_project → -Users-foo-my-project
74
- * /Users/foo/.worktrees/x → -Users-foo--worktrees-x
75
- *
76
- * The encoding is lossy — multiple real paths can collide on the
77
- * same encoded dir. Callers that need to disambiguate must read the
78
- * `cwd` field inside each session JSONL.
79
- */ getProjectDir(cwd) {
80
- const encoded = cwd.replace(/[^a-zA-Z0-9]/g, '-');
68
+ * Derive the Claude Code project directory for a given CWD.
69
+ *
70
+ * Claude Code encodes paths by replacing every non-alphanumeric
71
+ * character with '-', so '/', '_', '.', spaces, etc. all collapse:
72
+ * /Users/foo/bar → -Users-foo-bar
73
+ * /Users/foo/my_project → -Users-foo-my-project
74
+ * /Users/foo/.worktrees/x → -Users-foo--worktrees-x
75
+ *
76
+ * The encoding is lossy — multiple real paths can collide on the
77
+ * same encoded dir. Callers that need to disambiguate must read the
78
+ * `cwd` field inside each session JSONL.
79
+ */ getProjectDir(cwd) {
80
+ const encoded = cwd.replace(/[^a-zA-Z0-9]/g, "-");
81
81
  return path.join(this.projectsDir, encoded);
82
82
  }
83
83
  /**
84
- * Discover session files for the given processes.
85
- *
86
- * For each unique process CWD, encodes it to derive the expected
87
- * ~/.claude/projects/<encoded>/ directory, then gets session file birthtimes
88
- * via a single batched stat call across all directories.
89
- */ discoverLiveSessions(processes) {
84
+ * Discover session files for the given processes.
85
+ *
86
+ * For each unique process CWD, encodes it to derive the expected
87
+ * ~/.claude/projects/<encoded>/ directory, then gets session file birthtimes
88
+ * via a single batched stat call across all directories.
89
+ */ discoverLiveSessions(processes) {
90
90
  const dirToCwd = new Map();
91
91
  for (const proc of processes){
92
92
  if (!proc.cwd) continue;
@@ -104,16 +104,16 @@ export class ClaudeSessionLocator {
104
104
  ...dirToCwd.keys()
105
105
  ]);
106
106
  for (const file of files){
107
- file.resolvedCwd = dirToCwd.get(file.projectDir) || '';
107
+ file.resolvedCwd = dirToCwd.get(file.projectDir) || "";
108
108
  }
109
109
  return files;
110
110
  }
111
111
  /**
112
- * Match processes via `claude --resume <uuid>` in their command line.
113
- * This works for resumed sessions, where the JSONL was created earlier
114
- * (so its birthtime is far from the process startTime and the legacy
115
- * matcher can't pair them) and the PID file may also be misaligned.
116
- */ tryResumeMatching(processes) {
112
+ * Match processes via `claude --resume <uuid>` in their command line.
113
+ * This works for resumed sessions, where the JSONL was created earlier
114
+ * (so its birthtime is far from the process startTime and the legacy
115
+ * matcher can't pair them) and the PID file may also be misaligned.
116
+ */ tryResumeMatching(processes) {
117
117
  const direct = [];
118
118
  const fallback = [];
119
119
  for (const proc of processes){
@@ -157,17 +157,17 @@ export class ClaudeSessionLocator {
157
157
  return match?.[1] ?? null;
158
158
  }
159
159
  /**
160
- * Read and parse ~/.claude/sessions/<pid>.json, returning null on any
161
- * I/O / parse failure or when the file is stale relative to the live
162
- * process.
163
- *
164
- * "Stale" means the PID file's startedAt diverges from the process's
165
- * start time by more than {@link PID_FILE_STALENESS_MS} — typically
166
- * a previous Claude Code process recycled the same PID without cleanup.
167
- */ readMatchingPidFile(pid, procStartTime) {
160
+ * Read and parse ~/.claude/sessions/<pid>.json, returning null on any
161
+ * I/O / parse failure or when the file is stale relative to the live
162
+ * process.
163
+ *
164
+ * "Stale" means the PID file's startedAt diverges from the process's
165
+ * start time by more than {@link PID_FILE_STALENESS_MS} — typically
166
+ * a previous Claude Code process recycled the same PID without cleanup.
167
+ */ readMatchingPidFile(pid, procStartTime) {
168
168
  const pidFilePath = path.join(this.sessionsDir, `${pid}.json`);
169
169
  try {
170
- const entry = JSON.parse(fs.readFileSync(pidFilePath, 'utf-8'));
170
+ const entry = JSON.parse(fs.readFileSync(pidFilePath, "utf-8"));
171
171
  if (procStartTime) {
172
172
  const deltaMs = Math.abs(procStartTime.getTime() - entry.startedAt);
173
173
  if (deltaMs > PID_FILE_STALENESS_MS) {
@@ -180,32 +180,32 @@ export class ClaudeSessionLocator {
180
180
  }
181
181
  }
182
182
  /**
183
- * Map the PID file's live status string to {@link AgentStatus}.
184
- *
185
- * Returns undefined for missing / unrecognized values so the caller
186
- * can fall back to JSONL-derived heuristics.
187
- */ mapPidStatus(status) {
183
+ * Map the PID file's live status string to {@link AgentStatus}.
184
+ *
185
+ * Returns undefined for missing / unrecognized values so the caller
186
+ * can fall back to JSONL-derived heuristics.
187
+ */ mapPidStatus(status) {
188
188
  switch(status){
189
- case 'running':
189
+ case "running":
190
190
  return AgentStatus.RUNNING;
191
- case 'waiting':
191
+ case "waiting":
192
192
  return AgentStatus.WAITING;
193
- case 'idle':
193
+ case "idle":
194
194
  return AgentStatus.IDLE;
195
195
  default:
196
196
  return undefined;
197
197
  }
198
198
  }
199
199
  /**
200
- * Attempt to match each process to its session via ~/.claude/sessions/<pid>.json.
201
- *
202
- * Returns:
203
- * direct — processes matched authoritatively via PID file
204
- * fallback — processes with no valid PID file (sent to legacy matching)
205
- *
206
- * Per-process fallback triggers on: file absent, malformed JSON,
207
- * stale startedAt (>60s from proc.startTime), or missing JSONL.
208
- */ tryPidFileMatching(processes) {
200
+ * Attempt to match each process to its session via ~/.claude/sessions/<pid>.json.
201
+ *
202
+ * Returns:
203
+ * direct — processes matched authoritatively via PID file
204
+ * fallback — processes with no valid PID file (sent to legacy matching)
205
+ *
206
+ * Per-process fallback triggers on: file absent, malformed JSON,
207
+ * stale startedAt (>60s from proc.startTime), or missing JSONL.
208
+ */ tryPidFileMatching(processes) {
209
209
  const direct = [];
210
210
  const fallback = [];
211
211
  for (const proc of processes){