@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,11 +1,11 @@
1
- import * as fs from 'fs';
2
- import * as os from 'os';
3
- import * as path from 'path';
4
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
5
- import { AgentStatus } from '../../../adapters/AgentAdapter.js';
6
- import { ClaudeSessionLocator } from '../../../providers/claude/ClaudeSessionLocator.js';
7
- import { batchGetSessionFileBirthtimes } from '../../../utils/session.js';
8
- vi.mock('../../../utils/session.js', async (importOriginal)=>{
1
+ import * as fs from "fs";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { AgentStatus } from "../../../adapters/AgentAdapter.js";
6
+ import { ClaudeSessionLocator } from "../../../providers/claude/ClaudeSessionLocator.js";
7
+ import { batchGetSessionFileBirthtimes } from "../../../utils/session.js";
8
+ vi.mock("../../../utils/session.js", async (importOriginal)=>{
9
9
  const actual = await importOriginal();
10
10
  return {
11
11
  ...actual,
@@ -15,17 +15,17 @@ vi.mock('../../../utils/session.js', async (importOriginal)=>{
15
15
  const mockedBatchGetSessionFileBirthtimes = batchGetSessionFileBirthtimes;
16
16
  const tmpDirs = [];
17
17
  function makeTmpDir() {
18
- const dir = fs.mkdtempSync(path.join(os.tmpdir(), 'claude-locator-test-'));
18
+ const dir = fs.mkdtempSync(path.join(os.tmpdir(), "claude-locator-test-"));
19
19
  tmpDirs.push(dir);
20
20
  return dir;
21
21
  }
22
22
  function makeProcess(overrides = {}) {
23
23
  return {
24
24
  pid: 123,
25
- command: 'claude',
26
- cwd: '/repo/my-app',
27
- tty: 'ttys001',
28
- startTime: new Date('2026-08-23T10:00:00.000Z'),
25
+ command: "claude",
26
+ cwd: "/repo/my-app",
27
+ tty: "ttys001",
28
+ startTime: new Date("2026-08-23T10:00:00.000Z"),
29
29
  ...overrides
30
30
  };
31
31
  }
@@ -35,7 +35,7 @@ function makeProcess(overrides = {}) {
35
35
  /** `getProjectDir` is private; bound here so the encoding tests read cleanly. */ function bindProjectDir(locator) {
36
36
  return locator.getProjectDir.bind(locator);
37
37
  }
38
- describe('ClaudeSessionLocator', ()=>{
38
+ describe("ClaudeSessionLocator", ()=>{
39
39
  beforeEach(()=>{
40
40
  mockedBatchGetSessionFileBirthtimes.mockReset();
41
41
  });
@@ -47,13 +47,13 @@ describe('ClaudeSessionLocator', ()=>{
47
47
  });
48
48
  }
49
49
  });
50
- it('matches resumed sessions directly and carries live PID status metadata', ()=>{
50
+ it("matches resumed sessions directly and carries live PID status metadata", ()=>{
51
51
  const root = makeTmpDir();
52
- const projectsDir = path.join(root, 'projects');
53
- const sessionsDir = path.join(root, 'sessions');
54
- const cwd = '/repo/my-app';
55
- const sessionId = '12345678-1234-1234-1234-123456789abc';
56
- const projectDir = path.join(projectsDir, '-repo-my-app');
52
+ const projectsDir = path.join(root, "projects");
53
+ const sessionsDir = path.join(root, "sessions");
54
+ const cwd = "/repo/my-app";
55
+ const sessionId = "12345678-1234-1234-1234-123456789abc";
56
+ const projectDir = path.join(projectsDir, "-repo-my-app");
57
57
  const sessionFile = path.join(projectDir, `${sessionId}.jsonl`);
58
58
  fs.mkdirSync(projectDir, {
59
59
  recursive: true
@@ -61,16 +61,16 @@ describe('ClaudeSessionLocator', ()=>{
61
61
  fs.mkdirSync(sessionsDir, {
62
62
  recursive: true
63
63
  });
64
- fs.writeFileSync(sessionFile, '{}\n');
65
- fs.writeFileSync(path.join(sessionsDir, '123.json'), JSON.stringify({
64
+ fs.writeFileSync(sessionFile, "{}\n");
65
+ fs.writeFileSync(path.join(sessionsDir, "123.json"), JSON.stringify({
66
66
  pid: 123,
67
67
  sessionId,
68
68
  cwd,
69
- startedAt: new Date('2026-08-23T10:00:00.000Z').getTime(),
70
- kind: 'interactive',
71
- entrypoint: 'cli',
72
- status: 'waiting',
73
- waitingFor: 'approve Read'
69
+ startedAt: new Date("2026-08-23T10:00:00.000Z").getTime(),
70
+ kind: "interactive",
71
+ entrypoint: "cli",
72
+ status: "waiting",
73
+ waitingFor: "approve Read"
74
74
  }));
75
75
  const locator = new ClaudeSessionLocator({
76
76
  projectsDir,
@@ -86,7 +86,7 @@ describe('ClaudeSessionLocator', ()=>{
86
86
  expect(matches.legacyMatches).toEqual([]);
87
87
  expect(matches.direct[0]).toMatchObject({
88
88
  pidStatus: AgentStatus.WAITING,
89
- waitingFor: 'approve Read',
89
+ waitingFor: "approve Read",
90
90
  sessionFile: {
91
91
  sessionId,
92
92
  filePath: sessionFile,
@@ -95,72 +95,72 @@ describe('ClaudeSessionLocator', ()=>{
95
95
  }
96
96
  });
97
97
  });
98
- describe('discoverLiveSessions', ()=>{
98
+ describe("discoverLiveSessions", ()=>{
99
99
  let tmpDir;
100
100
  let projectsDir;
101
101
  let locator;
102
102
  beforeEach(()=>{
103
103
  tmpDir = makeTmpDir();
104
- projectsDir = path.join(tmpDir, 'projects');
104
+ projectsDir = path.join(tmpDir, "projects");
105
105
  locator = new ClaudeSessionLocator({
106
106
  projectsDir,
107
- sessionsDir: path.join(tmpDir, 'sessions')
107
+ sessionsDir: path.join(tmpDir, "sessions")
108
108
  });
109
109
  });
110
- it('should return empty when projects dir does not exist', ()=>{
110
+ it("should return empty when projects dir does not exist", ()=>{
111
111
  const missing = new ClaudeSessionLocator({
112
- projectsDir: path.join(tmpDir, 'nonexistent'),
113
- sessionsDir: path.join(tmpDir, 'sessions')
112
+ projectsDir: path.join(tmpDir, "nonexistent"),
113
+ sessionsDir: path.join(tmpDir, "sessions")
114
114
  });
115
115
  const result = missing.discoverLiveSessions([
116
116
  {
117
117
  pid: 1,
118
- command: 'claude',
119
- cwd: '/test',
120
- tty: ''
118
+ command: "claude",
119
+ cwd: "/test",
120
+ tty: ""
121
121
  }
122
122
  ]);
123
123
  expect(result).toEqual([]);
124
124
  });
125
- it('should scan only directories matching process CWDs', ()=>{
125
+ it("should scan only directories matching process CWDs", ()=>{
126
126
  // /my/project → -my-project (encoded dir)
127
- const encodedDir = path.join(projectsDir, '-my-project');
127
+ const encodedDir = path.join(projectsDir, "-my-project");
128
128
  fs.mkdirSync(encodedDir, {
129
129
  recursive: true
130
130
  });
131
131
  // Also create another dir that should NOT be scanned
132
- const otherDir = path.join(projectsDir, '-other-project');
132
+ const otherDir = path.join(projectsDir, "-other-project");
133
133
  fs.mkdirSync(otherDir, {
134
134
  recursive: true
135
135
  });
136
136
  const mockFiles = [
137
137
  {
138
- sessionId: 's1',
139
- filePath: path.join(encodedDir, 's1.jsonl'),
138
+ sessionId: "s1",
139
+ filePath: path.join(encodedDir, "s1.jsonl"),
140
140
  projectDir: encodedDir,
141
141
  birthtimeMs: 1710800324000,
142
- resolvedCwd: ''
142
+ resolvedCwd: ""
143
143
  }
144
144
  ];
145
145
  mockedBatchGetSessionFileBirthtimes.mockReturnValue(mockFiles);
146
146
  const processes = [
147
147
  {
148
148
  pid: 1,
149
- command: 'claude',
150
- cwd: '/my/project',
151
- tty: ''
149
+ command: "claude",
150
+ cwd: "/my/project",
151
+ tty: ""
152
152
  }
153
153
  ];
154
154
  const result = locator.discoverLiveSessions(processes);
155
155
  expect(result).toHaveLength(1);
156
- expect(result[0].resolvedCwd).toBe('/my/project');
156
+ expect(result[0].resolvedCwd).toBe("/my/project");
157
157
  // batchGetSessionFileBirthtimes called once with all dirs
158
158
  expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledTimes(1);
159
159
  expect(mockedBatchGetSessionFileBirthtimes).toHaveBeenCalledWith([
160
160
  encodedDir
161
161
  ]);
162
162
  });
163
- it('should return empty when encoded dir does not exist', ()=>{
163
+ it("should return empty when encoded dir does not exist", ()=>{
164
164
  fs.mkdirSync(projectsDir, {
165
165
  recursive: true
166
166
  });
@@ -168,40 +168,40 @@ describe('ClaudeSessionLocator', ()=>{
168
168
  const result = locator.discoverLiveSessions([
169
169
  {
170
170
  pid: 1,
171
- command: 'claude',
172
- cwd: '/test',
173
- tty: ''
171
+ command: "claude",
172
+ cwd: "/test",
173
+ tty: ""
174
174
  }
175
175
  ]);
176
176
  expect(result).toEqual([]);
177
177
  expect(mockedBatchGetSessionFileBirthtimes).not.toHaveBeenCalled();
178
178
  });
179
- it('should deduplicate when multiple processes share same CWD', ()=>{
180
- const encodedDir = path.join(projectsDir, '-my-project');
179
+ it("should deduplicate when multiple processes share same CWD", ()=>{
180
+ const encodedDir = path.join(projectsDir, "-my-project");
181
181
  fs.mkdirSync(encodedDir, {
182
182
  recursive: true
183
183
  });
184
184
  mockedBatchGetSessionFileBirthtimes.mockReturnValue([
185
185
  {
186
- sessionId: 's1',
187
- filePath: path.join(encodedDir, 's1.jsonl'),
186
+ sessionId: "s1",
187
+ filePath: path.join(encodedDir, "s1.jsonl"),
188
188
  projectDir: encodedDir,
189
189
  birthtimeMs: 1710800324000,
190
- resolvedCwd: ''
190
+ resolvedCwd: ""
191
191
  }
192
192
  ]);
193
193
  const processes = [
194
194
  {
195
195
  pid: 1,
196
- command: 'claude',
197
- cwd: '/my/project',
198
- tty: ''
196
+ command: "claude",
197
+ cwd: "/my/project",
198
+ tty: ""
199
199
  },
200
200
  {
201
201
  pid: 2,
202
- command: 'claude',
203
- cwd: '/my/project',
204
- tty: ''
202
+ command: "claude",
203
+ cwd: "/my/project",
204
+ tty: ""
205
205
  }
206
206
  ];
207
207
  const result = locator.discoverLiveSessions(processes);
@@ -212,30 +212,30 @@ describe('ClaudeSessionLocator', ()=>{
212
212
  ]);
213
213
  expect(result).toHaveLength(1);
214
214
  });
215
- it('should skip processes with empty cwd', ()=>{
215
+ it("should skip processes with empty cwd", ()=>{
216
216
  fs.mkdirSync(projectsDir, {
217
217
  recursive: true
218
218
  });
219
219
  const result = locator.discoverLiveSessions([
220
220
  {
221
221
  pid: 1,
222
- command: 'claude',
223
- cwd: '',
224
- tty: ''
222
+ command: "claude",
223
+ cwd: "",
224
+ tty: ""
225
225
  }
226
226
  ]);
227
227
  expect(result).toEqual([]);
228
228
  });
229
229
  });
230
- describe('tryPidFileMatching', ()=>{
230
+ describe("tryPidFileMatching", ()=>{
231
231
  let tmpDir;
232
232
  let sessionsDir;
233
233
  let projectsDir;
234
234
  let tryMatch;
235
235
  beforeEach(()=>{
236
236
  tmpDir = makeTmpDir();
237
- sessionsDir = path.join(tmpDir, 'sessions');
238
- projectsDir = path.join(tmpDir, 'projects');
237
+ sessionsDir = path.join(tmpDir, "sessions");
238
+ projectsDir = path.join(tmpDir, "projects");
239
239
  fs.mkdirSync(sessionsDir, {
240
240
  recursive: true
241
241
  });
@@ -244,11 +244,11 @@ describe('ClaudeSessionLocator', ()=>{
244
244
  sessionsDir
245
245
  }));
246
246
  });
247
- const makeProc = (pid, cwd = '/project/test', startTime)=>({
247
+ const makeProc = (pid, cwd = "/project/test", startTime)=>({
248
248
  pid,
249
- command: 'claude',
249
+ command: "claude",
250
250
  cwd,
251
- tty: 'ttys001',
251
+ tty: "ttys001",
252
252
  startTime
253
253
  });
254
254
  const writePidFile = (pid, sessionId, cwd, startedAt)=>{
@@ -257,41 +257,41 @@ describe('ClaudeSessionLocator', ()=>{
257
257
  sessionId,
258
258
  cwd,
259
259
  startedAt,
260
- kind: 'interactive',
261
- entrypoint: 'cli'
260
+ kind: "interactive",
261
+ entrypoint: "cli"
262
262
  }));
263
263
  };
264
264
  const writeJsonl = (cwd, sessionId)=>{
265
- const encoded = cwd.replace(/[^a-zA-Z0-9]/g, '-');
265
+ const encoded = cwd.replace(/[^a-zA-Z0-9]/g, "-");
266
266
  const projDir = path.join(projectsDir, encoded);
267
267
  fs.mkdirSync(projDir, {
268
268
  recursive: true
269
269
  });
270
270
  const filePath = path.join(projDir, `${sessionId}.jsonl`);
271
271
  fs.writeFileSync(filePath, JSON.stringify({
272
- type: 'assistant',
272
+ type: "assistant",
273
273
  timestamp: new Date().toISOString()
274
274
  }));
275
275
  return filePath;
276
276
  };
277
- it('should return direct match when PID file and JSONL both exist within time tolerance', ()=>{
277
+ it("should return direct match when PID file and JSONL both exist within time tolerance", ()=>{
278
278
  const startTime = new Date();
279
- const proc = makeProc(1001, '/project/test', startTime);
280
- writePidFile(1001, 'session-abc', '/project/test', startTime.getTime());
281
- writeJsonl('/project/test', 'session-abc');
279
+ const proc = makeProc(1001, "/project/test", startTime);
280
+ writePidFile(1001, "session-abc", "/project/test", startTime.getTime());
281
+ writeJsonl("/project/test", "session-abc");
282
282
  const { direct, fallback } = tryMatch([
283
283
  proc
284
284
  ]);
285
285
  expect(direct).toHaveLength(1);
286
286
  expect(fallback).toHaveLength(0);
287
- expect(direct[0].sessionFile.sessionId).toBe('session-abc');
288
- expect(direct[0].sessionFile.resolvedCwd).toBe('/project/test');
287
+ expect(direct[0].sessionFile.sessionId).toBe("session-abc");
288
+ expect(direct[0].sessionFile.resolvedCwd).toBe("/project/test");
289
289
  expect(direct[0].process.pid).toBe(1001);
290
290
  });
291
- it('should fall back when PID file exists but JSONL is missing', ()=>{
291
+ it("should fall back when PID file exists but JSONL is missing", ()=>{
292
292
  const startTime = new Date();
293
- const proc = makeProc(1002, '/project/test', startTime);
294
- writePidFile(1002, 'nonexistent-session', '/project/test', startTime.getTime());
293
+ const proc = makeProc(1002, "/project/test", startTime);
294
+ writePidFile(1002, "nonexistent-session", "/project/test", startTime.getTime());
295
295
  // No JSONL file written
296
296
  const { direct, fallback } = tryMatch([
297
297
  proc
@@ -300,32 +300,32 @@ describe('ClaudeSessionLocator', ()=>{
300
300
  expect(fallback).toHaveLength(1);
301
301
  expect(fallback[0].pid).toBe(1002);
302
302
  });
303
- it('should fall back when startedAt is stale (>60s from proc.startTime)', ()=>{
303
+ it("should fall back when startedAt is stale (>60s from proc.startTime)", ()=>{
304
304
  const startTime = new Date();
305
305
  const staleTime = startTime.getTime() - 90_000; // 90 seconds earlier
306
- const proc = makeProc(1003, '/project/test', startTime);
307
- writePidFile(1003, 'stale-session', '/project/test', staleTime);
308
- writeJsonl('/project/test', 'stale-session');
306
+ const proc = makeProc(1003, "/project/test", startTime);
307
+ writePidFile(1003, "stale-session", "/project/test", staleTime);
308
+ writeJsonl("/project/test", "stale-session");
309
309
  const { direct, fallback } = tryMatch([
310
310
  proc
311
311
  ]);
312
312
  expect(direct).toHaveLength(0);
313
313
  expect(fallback).toHaveLength(1);
314
314
  });
315
- it('should accept PID file when startedAt is within 60s tolerance', ()=>{
315
+ it("should accept PID file when startedAt is within 60s tolerance", ()=>{
316
316
  const startTime = new Date();
317
317
  const closeTime = startTime.getTime() - 30_000; // 30 seconds earlier — within tolerance
318
- const proc = makeProc(1004, '/project/test', startTime);
319
- writePidFile(1004, 'close-session', '/project/test', closeTime);
320
- writeJsonl('/project/test', 'close-session');
318
+ const proc = makeProc(1004, "/project/test", startTime);
319
+ writePidFile(1004, "close-session", "/project/test", closeTime);
320
+ writeJsonl("/project/test", "close-session");
321
321
  const { direct, fallback } = tryMatch([
322
322
  proc
323
323
  ]);
324
324
  expect(direct).toHaveLength(1);
325
325
  expect(fallback).toHaveLength(0);
326
326
  });
327
- it('should fall back when PID file is absent', ()=>{
328
- const proc = makeProc(1005, '/project/test', new Date());
327
+ it("should fall back when PID file is absent", ()=>{
328
+ const proc = makeProc(1005, "/project/test", new Date());
329
329
  // No PID file written
330
330
  const { direct, fallback } = tryMatch([
331
331
  proc
@@ -333,9 +333,9 @@ describe('ClaudeSessionLocator', ()=>{
333
333
  expect(direct).toHaveLength(0);
334
334
  expect(fallback).toHaveLength(1);
335
335
  });
336
- it('should fall back when PID file contains malformed JSON', ()=>{
337
- const proc = makeProc(1006, '/project/test', new Date());
338
- fs.writeFileSync(path.join(sessionsDir, '1006.json'), 'not valid json {{{');
336
+ it("should fall back when PID file contains malformed JSON", ()=>{
337
+ const proc = makeProc(1006, "/project/test", new Date());
338
+ fs.writeFileSync(path.join(sessionsDir, "1006.json"), "not valid json {{{");
339
339
  expect(()=>{
340
340
  const { direct, fallback } = tryMatch([
341
341
  proc
@@ -344,28 +344,28 @@ describe('ClaudeSessionLocator', ()=>{
344
344
  expect(fallback).toHaveLength(1);
345
345
  }).not.toThrow();
346
346
  });
347
- it('should fall back for all processes when sessions dir does not exist', ()=>{
347
+ it("should fall back for all processes when sessions dir does not exist", ()=>{
348
348
  const missingSessions = bindPidFileMatching(new ClaudeSessionLocator({
349
349
  projectsDir,
350
- sessionsDir: path.join(tmpDir, 'nonexistent-sessions')
350
+ sessionsDir: path.join(tmpDir, "nonexistent-sessions")
351
351
  }));
352
352
  const processes = [
353
- makeProc(2001, '/a', new Date()),
354
- makeProc(2002, '/b', new Date())
353
+ makeProc(2001, "/a", new Date()),
354
+ makeProc(2002, "/b", new Date())
355
355
  ];
356
356
  const { direct, fallback } = missingSessions(processes);
357
357
  expect(direct).toHaveLength(0);
358
358
  expect(fallback).toHaveLength(2);
359
359
  });
360
- it('should correctly split mixed processes (some with PID files, some without)', ()=>{
360
+ it("should correctly split mixed processes (some with PID files, some without)", ()=>{
361
361
  const startTime = new Date();
362
- const proc1 = makeProc(3001, '/project/one', startTime);
363
- const proc2 = makeProc(3002, '/project/two', startTime);
364
- const proc3 = makeProc(3003, '/project/three', startTime);
365
- writePidFile(3001, 'session-one', '/project/one', startTime.getTime());
366
- writeJsonl('/project/one', 'session-one');
367
- writePidFile(3003, 'session-three', '/project/three', startTime.getTime());
368
- writeJsonl('/project/three', 'session-three');
362
+ const proc1 = makeProc(3001, "/project/one", startTime);
363
+ const proc2 = makeProc(3002, "/project/two", startTime);
364
+ const proc3 = makeProc(3003, "/project/three", startTime);
365
+ writePidFile(3001, "session-one", "/project/one", startTime.getTime());
366
+ writeJsonl("/project/one", "session-one");
367
+ writePidFile(3003, "session-three", "/project/three", startTime.getTime());
368
+ writeJsonl("/project/three", "session-three");
369
369
  // proc2 has no PID file
370
370
  const { direct, fallback } = tryMatch([
371
371
  proc1,
@@ -380,10 +380,10 @@ describe('ClaudeSessionLocator', ()=>{
380
380
  ]);
381
381
  expect(fallback[0].pid).toBe(3002);
382
382
  });
383
- it('should skip stale-file check when proc.startTime is undefined', ()=>{
384
- const proc = makeProc(4001, '/project/test', undefined); // no startTime
385
- writePidFile(4001, 'no-time-session', '/project/test', Date.now() - 999_999);
386
- writeJsonl('/project/test', 'no-time-session');
383
+ it("should skip stale-file check when proc.startTime is undefined", ()=>{
384
+ const proc = makeProc(4001, "/project/test", undefined); // no startTime
385
+ writePidFile(4001, "no-time-session", "/project/test", Date.now() - 999_999);
386
+ writeJsonl("/project/test", "no-time-session");
387
387
  const { direct, fallback } = tryMatch([
388
388
  proc
389
389
  ]);
@@ -392,43 +392,43 @@ describe('ClaudeSessionLocator', ()=>{
392
392
  expect(fallback).toHaveLength(0);
393
393
  });
394
394
  });
395
- describe('getProjectDir', ()=>{
395
+ describe("getProjectDir", ()=>{
396
396
  let tmpDir;
397
397
  let projectsDir;
398
398
  let encode;
399
399
  beforeEach(()=>{
400
400
  tmpDir = makeTmpDir();
401
- projectsDir = path.join(tmpDir, 'projects');
401
+ projectsDir = path.join(tmpDir, "projects");
402
402
  encode = bindProjectDir(new ClaudeSessionLocator({
403
403
  projectsDir,
404
- sessionsDir: path.join(tmpDir, 'sessions')
404
+ sessionsDir: path.join(tmpDir, "sessions")
405
405
  }));
406
406
  });
407
- it('should replace path separators with hyphens', ()=>{
408
- expect(encode('/Users/foo/bar')).toBe(path.join(projectsDir, '-Users-foo-bar'));
407
+ it("should replace path separators with hyphens", ()=>{
408
+ expect(encode("/Users/foo/bar")).toBe(path.join(projectsDir, "-Users-foo-bar"));
409
409
  });
410
- it('should encode underscores as hyphens (matches Claude Code CLI)', ()=>{
411
- expect(encode('/Users/foo/my_project')).toBe(path.join(projectsDir, '-Users-foo-my-project'));
410
+ it("should encode underscores as hyphens (matches Claude Code CLI)", ()=>{
411
+ expect(encode("/Users/foo/my_project")).toBe(path.join(projectsDir, "-Users-foo-my-project"));
412
412
  });
413
- it('should encode dots as hyphens', ()=>{
414
- expect(encode('/Users/foo/.worktrees/x')).toBe(path.join(projectsDir, '-Users-foo--worktrees-x'));
413
+ it("should encode dots as hyphens", ()=>{
414
+ expect(encode("/Users/foo/.worktrees/x")).toBe(path.join(projectsDir, "-Users-foo--worktrees-x"));
415
415
  });
416
- it('should collide paths that differ only in non-alphanumeric chars', ()=>{
416
+ it("should collide paths that differ only in non-alphanumeric chars", ()=>{
417
417
  // The encoding is intentionally lossy — callers must
418
418
  // disambiguate via session JSONL contents, not dir name.
419
- expect(encode('/a/b_c')).toBe(encode('/a/b-c'));
420
- expect(encode('/a/b_c')).toBe(encode('/a/b.c'));
419
+ expect(encode("/a/b_c")).toBe(encode("/a/b-c"));
420
+ expect(encode("/a/b_c")).toBe(encode("/a/b.c"));
421
421
  });
422
- it('should resolve to a real session dir when cwd contains underscores', ()=>{
423
- const cwd = '/Users/foo/my_project';
424
- const expectedDir = path.join(projectsDir, '-Users-foo-my-project');
422
+ it("should resolve to a real session dir when cwd contains underscores", ()=>{
423
+ const cwd = "/Users/foo/my_project";
424
+ const expectedDir = path.join(projectsDir, "-Users-foo-my-project");
425
425
  fs.mkdirSync(expectedDir, {
426
426
  recursive: true
427
427
  });
428
- const sessionFile = path.join(expectedDir, 'session-underscore.jsonl');
429
- fs.writeFileSync(sessionFile, '');
428
+ const sessionFile = path.join(expectedDir, "session-underscore.jsonl");
429
+ fs.writeFileSync(sessionFile, "");
430
430
  expect(encode(cwd)).toBe(expectedDir);
431
- expect(fs.existsSync(path.join(encode(cwd), 'session-underscore.jsonl'))).toBe(true);
431
+ expect(fs.existsSync(path.join(encode(cwd), "session-underscore.jsonl"))).toBe(true);
432
432
  });
433
433
  });
434
434
  });