@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,7 +1,7 @@
1
- import fs from 'fs';
2
- import os from 'os';
3
- import path from 'path';
4
- import { afterEach, describe, expect, it } from 'vitest';
1
+ import fs from "fs";
2
+ import os from "os";
3
+ import path from "path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
5
  const tempDirs = [];
6
6
  afterEach(()=>{
7
7
  for (const dir of tempDirs.splice(0))fs.rmSync(dir, {
@@ -10,40 +10,40 @@ afterEach(()=>{
10
10
  });
11
11
  });
12
12
  async function loadStore() {
13
- const api = await import('../../index.js');
14
- expect(api).toHaveProperty('DurableAgentRepository');
13
+ const api = await import("../../index.js");
14
+ expect(api).toHaveProperty("DurableAgentRepository");
15
15
  return api.DurableAgentRepository;
16
16
  }
17
17
  function fixture() {
18
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-store-'));
18
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "durable-agent-store-"));
19
19
  tempDirs.push(root);
20
- const cwd = path.join(root, 'project');
20
+ const cwd = path.join(root, "project");
21
21
  fs.mkdirSync(cwd);
22
22
  return {
23
23
  root,
24
24
  cwd,
25
- dbPath: path.join(root, 'state', 'agents.db')
25
+ dbPath: path.join(root, "state", "agents.db")
26
26
  };
27
27
  }
28
- describe('DurableAgentRepository create/list/resolve', ()=>{
29
- it('creates distinct durable identities with a canonical cwd and lists them', async ()=>{
28
+ describe("DurableAgentRepository create/list/resolve", ()=>{
29
+ it("creates distinct durable identities with a canonical cwd and lists them", async ()=>{
30
30
  const DurableAgentRepository = await loadStore();
31
31
  const { cwd, dbPath } = fixture();
32
32
  const repository = new DurableAgentRepository({
33
33
  dbPath,
34
- now: ()=>new Date('2026-08-07T09:00:00Z')
34
+ now: ()=>new Date("2026-08-07T09:00:00Z")
35
35
  });
36
36
  const agent = await repository.create({
37
- name: 'reviewer',
37
+ name: "reviewer",
38
38
  cwd
39
39
  });
40
40
  expect(agent).toMatchObject({
41
- name: 'reviewer',
42
- provider: 'claude',
43
- mode: 'durable',
41
+ name: "reviewer",
42
+ provider: "claude",
43
+ mode: "durable",
44
44
  cwd: fs.realpathSync(cwd),
45
- state: 'ready',
46
- sessionHealth: 'uninitialized',
45
+ state: "ready",
46
+ sessionHealth: "uninitialized",
47
47
  activeRun: null
48
48
  });
49
49
  expect(agent.id).toMatch(/^[0-9a-f-]{36}$/);
@@ -54,52 +54,52 @@ describe('DurableAgentRepository create/list/resolve', ()=>{
54
54
  ]);
55
55
  expect(fs.existsSync(dbPath)).toBe(true);
56
56
  });
57
- it('resolves exact ids and names and rejects duplicate names', async ()=>{
57
+ it("resolves exact ids and names and rejects duplicate names", async ()=>{
58
58
  const DurableAgentRepository = await loadStore();
59
59
  const { cwd, dbPath } = fixture();
60
60
  const repository = new DurableAgentRepository({
61
61
  dbPath
62
62
  });
63
63
  const agent = await repository.create({
64
- name: 'Reviewer',
64
+ name: "Reviewer",
65
65
  cwd
66
66
  });
67
67
  expect(await repository.resolve(agent.id)).toMatchObject({
68
68
  id: agent.id
69
69
  });
70
- expect(await repository.resolve('reviewer')).toMatchObject({
70
+ expect(await repository.resolve("reviewer")).toMatchObject({
71
71
  id: agent.id
72
72
  });
73
- expect(await repository.resolve('view')).toBeNull();
73
+ expect(await repository.resolve("view")).toBeNull();
74
74
  await expect(repository.create({
75
- name: 'reviewer',
75
+ name: "reviewer",
76
76
  cwd
77
77
  })).rejects.toMatchObject({
78
- code: 'DURABLE_AGENT_NAME_CONFLICT'
78
+ code: "DURABLE_AGENT_NAME_CONFLICT"
79
79
  });
80
80
  });
81
- it('rejects a missing cwd', async ()=>{
81
+ it("rejects a missing cwd", async ()=>{
82
82
  const DurableAgentRepository = await loadStore();
83
83
  const { root, dbPath } = fixture();
84
84
  const repository = new DurableAgentRepository({
85
85
  dbPath
86
86
  });
87
87
  await expect(repository.create({
88
- name: 'missing',
89
- cwd: path.join(root, 'missing')
88
+ name: "missing",
89
+ cwd: path.join(root, "missing")
90
90
  })).rejects.toMatchObject({
91
- code: 'DURABLE_AGENT_REPOSITORY'
91
+ code: "DURABLE_AGENT_REPOSITORY"
92
92
  });
93
93
  });
94
94
  });
95
- describe('DurableAgentRepository run ownership', ()=>{
96
- it('fails fast when another exact owner is live and completes only for its token', async ()=>{
95
+ describe("DurableAgentRepository run ownership", ()=>{
96
+ it("fails fast when another exact owner is live and completes only for its token", async ()=>{
97
97
  const DurableAgentRepository = await loadStore();
98
98
  const { cwd, dbPath } = fixture();
99
99
  const live = new Map([
100
100
  [
101
101
  process.pid,
102
- 'owner-start'
102
+ "owner-start"
103
103
  ]
104
104
  ]);
105
105
  const processInspector = {
@@ -116,44 +116,44 @@ describe('DurableAgentRepository run ownership', ()=>{
116
116
  processInspector
117
117
  });
118
118
  const agent = await repository.create({
119
- name: 'runner',
119
+ name: "runner",
120
120
  cwd
121
121
  });
122
122
  const acquired = await repository.acquireRun(agent.id);
123
123
  await expect(repository.acquireRun(agent.id)).rejects.toMatchObject({
124
- code: 'DURABLE_AGENT_BUSY'
124
+ code: "DURABLE_AGENT_BUSY"
125
125
  });
126
- await expect(repository.completeRun(agent.id, 'wrong-token', {
127
- status: 'succeeded',
126
+ await expect(repository.completeRun(agent.id, "wrong-token", {
127
+ status: "succeeded",
128
128
  exitCode: 0,
129
- summary: 'done',
130
- sessionHealth: 'healthy'
129
+ summary: "done",
130
+ sessionHealth: "healthy"
131
131
  })).rejects.toMatchObject({
132
- code: 'DURABLE_AGENT_REPOSITORY'
132
+ code: "DURABLE_AGENT_REPOSITORY"
133
133
  });
134
134
  const completed = await repository.completeRun(agent.id, acquired.token, {
135
- status: 'succeeded',
135
+ status: "succeeded",
136
136
  exitCode: 0,
137
- summary: 'done',
138
- sessionHealth: 'healthy'
137
+ summary: "done",
138
+ sessionHealth: "healthy"
139
139
  });
140
140
  expect(completed).toMatchObject({
141
- state: 'ready',
142
- sessionHealth: 'healthy',
141
+ state: "ready",
142
+ sessionHealth: "healthy",
143
143
  activeRun: null
144
144
  });
145
145
  });
146
- it('retains busy for a live provider then recovers a dead run without signaling it', async ()=>{
146
+ it("retains busy for a live provider then recovers a dead run without signaling it", async ()=>{
147
147
  const DurableAgentRepository = await loadStore();
148
148
  const { cwd, dbPath } = fixture();
149
149
  const live = new Map([
150
150
  [
151
151
  process.pid,
152
- 'owner-start'
152
+ "owner-start"
153
153
  ],
154
154
  [
155
155
  4242,
156
- 'provider-start'
156
+ "provider-start"
157
157
  ]
158
158
  ]);
159
159
  const processInspector = {
@@ -170,41 +170,41 @@ describe('DurableAgentRepository run ownership', ()=>{
170
170
  processInspector
171
171
  });
172
172
  const agent = await first.create({
173
- name: 'recoverable',
173
+ name: "recoverable",
174
174
  cwd
175
175
  });
176
176
  const run = await first.acquireRun(agent.id);
177
177
  await first.recordProviderProcess(agent.id, run.token, {
178
178
  pid: 4242,
179
- startedAt: 'provider-start'
179
+ startedAt: "provider-start"
180
180
  });
181
181
  live.delete(process.pid);
182
182
  await expect(first.acquireRun(agent.id)).rejects.toMatchObject({
183
- code: 'DURABLE_AGENT_BUSY'
183
+ code: "DURABLE_AGENT_BUSY"
184
184
  });
185
185
  live.delete(4242);
186
- live.set(process.pid, 'replacement-owner-start');
186
+ live.set(process.pid, "replacement-owner-start");
187
187
  const recovered = await first.acquireRun(agent.id);
188
188
  expect(recovered.agent).toMatchObject({
189
- state: 'running',
189
+ state: "running",
190
190
  lastResult: {
191
- status: 'interrupted'
191
+ status: "interrupted"
192
192
  }
193
193
  });
194
194
  await first.completeRun(agent.id, recovered.token, {
195
- status: 'failed',
195
+ status: "failed",
196
196
  exitCode: 1,
197
- summary: 'failed',
198
- sessionHealth: 'unknown'
197
+ summary: "failed",
198
+ sessionHealth: "unknown"
199
199
  });
200
200
  });
201
- it('reconciles an interrupted run to degraded during list', async ()=>{
201
+ it("reconciles an interrupted run to degraded during list", async ()=>{
202
202
  const DurableAgentRepository = await loadStore();
203
203
  const { cwd, dbPath } = fixture();
204
204
  const live = new Map([
205
205
  [
206
206
  process.pid,
207
- 'owner-start'
207
+ "owner-start"
208
208
  ]
209
209
  ]);
210
210
  const repository = new DurableAgentRepository({
@@ -221,38 +221,38 @@ describe('DurableAgentRepository run ownership', ()=>{
221
221
  }
222
222
  });
223
223
  const agent = await repository.create({
224
- name: 'crashed',
224
+ name: "crashed",
225
225
  cwd
226
226
  });
227
227
  await repository.acquireRun(agent.id);
228
228
  live.clear();
229
229
  const listed = await repository.list();
230
230
  expect(listed[0]).toMatchObject({
231
- state: 'degraded',
232
- sessionHealth: 'unknown',
231
+ state: "degraded",
232
+ sessionHealth: "unknown",
233
233
  activeRun: null,
234
234
  lastResult: {
235
- status: 'interrupted'
235
+ status: "interrupted"
236
236
  }
237
237
  });
238
238
  });
239
- it('rejects send acquisition when the bound cwd is replaced by a symlink', async ()=>{
239
+ it("rejects send acquisition when the bound cwd is replaced by a symlink", async ()=>{
240
240
  const DurableAgentRepository = await loadStore();
241
241
  const { root, cwd, dbPath } = fixture();
242
242
  const repository = new DurableAgentRepository({
243
243
  dbPath
244
244
  });
245
245
  const agent = await repository.create({
246
- name: 'bound',
246
+ name: "bound",
247
247
  cwd
248
248
  });
249
- const moved = path.join(root, 'moved-project');
250
- const other = path.join(root, 'other-project');
249
+ const moved = path.join(root, "moved-project");
250
+ const other = path.join(root, "other-project");
251
251
  fs.renameSync(cwd, moved);
252
252
  fs.mkdirSync(other);
253
253
  fs.symlinkSync(other, cwd);
254
254
  await expect(repository.acquireRun(agent.id)).rejects.toMatchObject({
255
- code: 'DURABLE_AGENT_REPOSITORY'
255
+ code: "DURABLE_AGENT_REPOSITORY"
256
256
  });
257
257
  });
258
258
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/print/DurableAgentRepository.test.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport { afterEach, describe, expect, it } from 'vitest';\n\nconst tempDirs: string[] = [];\n\nafterEach(() => {\n for (const dir of tempDirs.splice(0)) fs.rmSync(dir, { recursive: true, force: true });\n});\n\nasync function loadStore(): Promise<any> {\n const api = await import('../../index.js') as Record<string, unknown>;\n expect(api).toHaveProperty('DurableAgentRepository');\n return api.DurableAgentRepository;\n}\n\nfunction fixture(): { root: string; cwd: string; dbPath: string } {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-store-'));\n tempDirs.push(root);\n const cwd = path.join(root, 'project');\n fs.mkdirSync(cwd);\n return { root, cwd, dbPath: path.join(root, 'state', 'agents.db') };\n}\n\ndescribe('DurableAgentRepository create/list/resolve', () => {\n it('creates distinct durable identities with a canonical cwd and lists them', async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({ dbPath, now: () => new Date('2026-08-07T09:00:00Z') });\n\n const agent = await repository.create({ name: 'reviewer', cwd });\n\n expect(agent).toMatchObject({\n name: 'reviewer',\n provider: 'claude',\n mode: 'durable',\n cwd: fs.realpathSync(cwd),\n state: 'ready',\n sessionHealth: 'uninitialized',\n activeRun: null,\n });\n expect(agent.id).toMatch(/^[0-9a-f-]{36}$/);\n expect(agent.providerSessionId).toMatch(/^[0-9a-f-]{36}$/);\n expect(agent.id).not.toBe(agent.providerSessionId);\n expect(await repository.list()).toEqual([agent]);\n expect(fs.existsSync(dbPath)).toBe(true);\n });\n\n it('resolves exact ids and names and rejects duplicate names', async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({ dbPath });\n const agent = await repository.create({ name: 'Reviewer', cwd });\n\n expect(await repository.resolve(agent.id)).toMatchObject({ id: agent.id });\n expect(await repository.resolve('reviewer')).toMatchObject({ id: agent.id });\n expect(await repository.resolve('view')).toBeNull();\n await expect(repository.create({ name: 'reviewer', cwd })).rejects.toMatchObject({\n code: 'DURABLE_AGENT_NAME_CONFLICT',\n });\n });\n\n it('rejects a missing cwd', async () => {\n const DurableAgentRepository = await loadStore();\n const { root, dbPath } = fixture();\n const repository = new DurableAgentRepository({ dbPath });\n\n await expect(repository.create({ name: 'missing', cwd: path.join(root, 'missing') }))\n .rejects.toMatchObject({ code: 'DURABLE_AGENT_REPOSITORY' });\n });\n});\n\ndescribe('DurableAgentRepository run ownership', () => {\n it('fails fast when another exact owner is live and completes only for its token', async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const live = new Map<number, string>([[process.pid, 'owner-start']]);\n const processInspector = { getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n } };\n const repository = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await repository.create({ name: 'runner', cwd });\n\n const acquired = await repository.acquireRun(agent.id);\n await expect(repository.acquireRun(agent.id)).rejects.toMatchObject({ code: 'DURABLE_AGENT_BUSY' });\n await expect(repository.completeRun(agent.id, 'wrong-token', {\n status: 'succeeded', exitCode: 0, summary: 'done', sessionHealth: 'healthy',\n })).rejects.toMatchObject({ code: 'DURABLE_AGENT_REPOSITORY' });\n\n const completed = await repository.completeRun(agent.id, acquired.token, {\n status: 'succeeded', exitCode: 0, summary: 'done', sessionHealth: 'healthy',\n });\n expect(completed).toMatchObject({ state: 'ready', sessionHealth: 'healthy', activeRun: null });\n });\n\n it('retains busy for a live provider then recovers a dead run without signaling it', async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const live = new Map<number, string>([[process.pid, 'owner-start'], [4242, 'provider-start']]);\n const processInspector = { getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n } };\n const first = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await first.create({ name: 'recoverable', cwd });\n const run = await first.acquireRun(agent.id);\n await first.recordProviderProcess(agent.id, run.token, { pid: 4242, startedAt: 'provider-start' });\n\n live.delete(process.pid);\n await expect(first.acquireRun(agent.id)).rejects.toMatchObject({ code: 'DURABLE_AGENT_BUSY' });\n\n live.delete(4242);\n live.set(process.pid, 'replacement-owner-start');\n const recovered = await first.acquireRun(agent.id);\n expect(recovered.agent).toMatchObject({\n state: 'running',\n lastResult: { status: 'interrupted' },\n });\n await first.completeRun(agent.id, recovered.token, {\n status: 'failed', exitCode: 1, summary: 'failed', sessionHealth: 'unknown',\n });\n });\n\n it('reconciles an interrupted run to degraded during list', async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const live = new Map<number, string>([[process.pid, 'owner-start']]);\n const repository = new DurableAgentRepository({ dbPath, incompleteLockGraceMs: 10, processInspector: {\n getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n },\n } });\n const agent = await repository.create({ name: 'crashed', cwd });\n await repository.acquireRun(agent.id);\n live.clear();\n\n const listed = await repository.list();\n\n expect(listed[0]).toMatchObject({\n state: 'degraded',\n sessionHealth: 'unknown',\n activeRun: null,\n lastResult: { status: 'interrupted' },\n });\n });\n\n it('rejects send acquisition when the bound cwd is replaced by a symlink', async () => {\n const DurableAgentRepository = await loadStore();\n const { root, cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({ dbPath });\n const agent = await repository.create({ name: 'bound', cwd });\n const moved = path.join(root, 'moved-project');\n const other = path.join(root, 'other-project');\n fs.renameSync(cwd, moved);\n fs.mkdirSync(other);\n fs.symlinkSync(other, cwd);\n\n await expect(repository.acquireRun(agent.id)).rejects.toMatchObject({ code: 'DURABLE_AGENT_REPOSITORY' });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","tempDirs","dir","splice","rmSync","recursive","force","loadStore","api","toHaveProperty","DurableAgentRepository","fixture","root","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","dbPath","repository","now","Date","agent","create","name","toMatchObject","provider","mode","realpathSync","state","sessionHealth","activeRun","id","toMatch","providerSessionId","not","toBe","list","toEqual","existsSync","resolve","toBeNull","rejects","code","live","Map","process","pid","processInspector","getIdentity","startedAt","get","acquired","acquireRun","completeRun","status","exitCode","summary","completed","token","first","run","recordProviderProcess","delete","set","recovered","lastResult","incompleteLockGraceMs","clear","listed","moved","other","renameSync","symlinkSync"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/__tests__/print/DurableAgentRepository.test.ts"],"sourcesContent":["import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\n\nconst tempDirs: string[] = [];\n\nafterEach(() => {\n for (const dir of tempDirs.splice(0)) fs.rmSync(dir, { recursive: true, force: true });\n});\n\nasync function loadStore(): Promise<any> {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"DurableAgentRepository\");\n return api.DurableAgentRepository;\n}\n\nfunction fixture(): { root: string; cwd: string; dbPath: string } {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"durable-agent-store-\"));\n tempDirs.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n return { root, cwd, dbPath: path.join(root, \"state\", \"agents.db\") };\n}\n\ndescribe(\"DurableAgentRepository create/list/resolve\", () => {\n it(\"creates distinct durable identities with a canonical cwd and lists them\", async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({\n dbPath,\n now: () => new Date(\"2026-08-07T09:00:00Z\"),\n });\n\n const agent = await repository.create({ name: \"reviewer\", cwd });\n\n expect(agent).toMatchObject({\n name: \"reviewer\",\n provider: \"claude\",\n mode: \"durable\",\n cwd: fs.realpathSync(cwd),\n state: \"ready\",\n sessionHealth: \"uninitialized\",\n activeRun: null,\n });\n expect(agent.id).toMatch(/^[0-9a-f-]{36}$/);\n expect(agent.providerSessionId).toMatch(/^[0-9a-f-]{36}$/);\n expect(agent.id).not.toBe(agent.providerSessionId);\n expect(await repository.list()).toEqual([agent]);\n expect(fs.existsSync(dbPath)).toBe(true);\n });\n\n it(\"resolves exact ids and names and rejects duplicate names\", async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({ dbPath });\n const agent = await repository.create({ name: \"Reviewer\", cwd });\n\n expect(await repository.resolve(agent.id)).toMatchObject({ id: agent.id });\n expect(await repository.resolve(\"reviewer\")).toMatchObject({ id: agent.id });\n expect(await repository.resolve(\"view\")).toBeNull();\n await expect(repository.create({ name: \"reviewer\", cwd })).rejects.toMatchObject({\n code: \"DURABLE_AGENT_NAME_CONFLICT\",\n });\n });\n\n it(\"rejects a missing cwd\", async () => {\n const DurableAgentRepository = await loadStore();\n const { root, dbPath } = fixture();\n const repository = new DurableAgentRepository({ dbPath });\n\n await expect(\n repository.create({ name: \"missing\", cwd: path.join(root, \"missing\") }),\n ).rejects.toMatchObject({ code: \"DURABLE_AGENT_REPOSITORY\" });\n });\n});\n\ndescribe(\"DurableAgentRepository run ownership\", () => {\n it(\"fails fast when another exact owner is live and completes only for its token\", async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const live = new Map<number, string>([[process.pid, \"owner-start\"]]);\n const processInspector = {\n getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n },\n };\n const repository = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await repository.create({ name: \"runner\", cwd });\n\n const acquired = await repository.acquireRun(agent.id);\n await expect(repository.acquireRun(agent.id)).rejects.toMatchObject({\n code: \"DURABLE_AGENT_BUSY\",\n });\n await expect(\n repository.completeRun(agent.id, \"wrong-token\", {\n status: \"succeeded\",\n exitCode: 0,\n summary: \"done\",\n sessionHealth: \"healthy\",\n }),\n ).rejects.toMatchObject({ code: \"DURABLE_AGENT_REPOSITORY\" });\n\n const completed = await repository.completeRun(agent.id, acquired.token, {\n status: \"succeeded\",\n exitCode: 0,\n summary: \"done\",\n sessionHealth: \"healthy\",\n });\n expect(completed).toMatchObject({ state: \"ready\", sessionHealth: \"healthy\", activeRun: null });\n });\n\n it(\"retains busy for a live provider then recovers a dead run without signaling it\", async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const live = new Map<number, string>([\n [process.pid, \"owner-start\"],\n [4242, \"provider-start\"],\n ]);\n const processInspector = {\n getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n },\n };\n const first = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await first.create({ name: \"recoverable\", cwd });\n const run = await first.acquireRun(agent.id);\n await first.recordProviderProcess(agent.id, run.token, {\n pid: 4242,\n startedAt: \"provider-start\",\n });\n\n live.delete(process.pid);\n await expect(first.acquireRun(agent.id)).rejects.toMatchObject({ code: \"DURABLE_AGENT_BUSY\" });\n\n live.delete(4242);\n live.set(process.pid, \"replacement-owner-start\");\n const recovered = await first.acquireRun(agent.id);\n expect(recovered.agent).toMatchObject({\n state: \"running\",\n lastResult: { status: \"interrupted\" },\n });\n await first.completeRun(agent.id, recovered.token, {\n status: \"failed\",\n exitCode: 1,\n summary: \"failed\",\n sessionHealth: \"unknown\",\n });\n });\n\n it(\"reconciles an interrupted run to degraded during list\", async () => {\n const DurableAgentRepository = await loadStore();\n const { cwd, dbPath } = fixture();\n const live = new Map<number, string>([[process.pid, \"owner-start\"]]);\n const repository = new DurableAgentRepository({\n dbPath,\n incompleteLockGraceMs: 10,\n processInspector: {\n getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n },\n },\n });\n const agent = await repository.create({ name: \"crashed\", cwd });\n await repository.acquireRun(agent.id);\n live.clear();\n\n const listed = await repository.list();\n\n expect(listed[0]).toMatchObject({\n state: \"degraded\",\n sessionHealth: \"unknown\",\n activeRun: null,\n lastResult: { status: \"interrupted\" },\n });\n });\n\n it(\"rejects send acquisition when the bound cwd is replaced by a symlink\", async () => {\n const DurableAgentRepository = await loadStore();\n const { root, cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({ dbPath });\n const agent = await repository.create({ name: \"bound\", cwd });\n const moved = path.join(root, \"moved-project\");\n const other = path.join(root, \"other-project\");\n fs.renameSync(cwd, moved);\n fs.mkdirSync(other);\n fs.symlinkSync(other, cwd);\n\n await expect(repository.acquireRun(agent.id)).rejects.toMatchObject({\n code: \"DURABLE_AGENT_REPOSITORY\",\n });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","tempDirs","dir","splice","rmSync","recursive","force","loadStore","api","toHaveProperty","DurableAgentRepository","fixture","root","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","dbPath","repository","now","Date","agent","create","name","toMatchObject","provider","mode","realpathSync","state","sessionHealth","activeRun","id","toMatch","providerSessionId","not","toBe","list","toEqual","existsSync","resolve","toBeNull","rejects","code","live","Map","process","pid","processInspector","getIdentity","startedAt","get","acquired","acquireRun","completeRun","status","exitCode","summary","completed","token","first","run","recordProviderProcess","delete","set","recovered","lastResult","incompleteLockGraceMs","clear","listed","moved","other","renameSync","symlinkSync"],"mappings":"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"}
@@ -1,76 +1,76 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { AgentStatus } from '../../../adapters/AgentAdapter.js';
3
- import { ClaudeAgentMapper } from '../../../providers/claude/ClaudeAgentMapper.js';
1
+ import { describe, expect, it } from "vitest";
2
+ import { AgentStatus } from "../../../adapters/AgentAdapter.js";
3
+ import { ClaudeAgentMapper } from "../../../providers/claude/ClaudeAgentMapper.js";
4
4
  function makeProcess(overrides = {}) {
5
5
  return {
6
6
  pid: 123,
7
- command: 'claude',
8
- cwd: '/repo/my-app',
9
- tty: 'ttys001',
7
+ command: "claude",
8
+ cwd: "/repo/my-app",
9
+ tty: "ttys001",
10
10
  ...overrides
11
11
  };
12
12
  }
13
13
  function makeSession(overrides = {}) {
14
14
  return {
15
- sessionId: 'session-1',
16
- projectPath: '/repo/my-app',
17
- sessionStart: new Date('2026-08-23T10:00:00.000Z'),
18
- lastActive: new Date('2026-08-23T10:05:00.000Z'),
19
- lastEntryType: 'assistant',
15
+ sessionId: "session-1",
16
+ projectPath: "/repo/my-app",
17
+ sessionStart: new Date("2026-08-23T10:00:00.000Z"),
18
+ lastActive: new Date("2026-08-23T10:05:00.000Z"),
19
+ lastEntryType: "assistant",
20
20
  isInterrupted: false,
21
- lastUserMessage: 'Review this change',
21
+ lastUserMessage: "Review this change",
22
22
  ...overrides
23
23
  };
24
24
  }
25
25
  function makeSessionFile(overrides = {}) {
26
26
  return {
27
- sessionId: 'session-1',
28
- filePath: '/home/.claude/projects/-repo-my-app/session-1.jsonl',
29
- projectDir: '/home/.claude/projects/-repo-my-app',
30
- birthtimeMs: new Date('2026-08-23T10:00:00.000Z').getTime(),
31
- resolvedCwd: '/repo/my-app',
27
+ sessionId: "session-1",
28
+ filePath: "/home/.claude/projects/-repo-my-app/session-1.jsonl",
29
+ projectDir: "/home/.claude/projects/-repo-my-app",
30
+ birthtimeMs: new Date("2026-08-23T10:00:00.000Z").getTime(),
31
+ resolvedCwd: "/repo/my-app",
32
32
  ...overrides
33
33
  };
34
34
  }
35
- describe('ClaudeAgentMapper', ()=>{
36
- it('prefers live PID-file status and waiting reason over JSONL-derived status', ()=>{
35
+ describe("ClaudeAgentMapper", ()=>{
36
+ it("prefers live PID-file status and waiting reason over JSONL-derived status", ()=>{
37
37
  const mapper = new ClaudeAgentMapper();
38
38
  const agent = mapper.mapSessionToAgent({
39
39
  session: makeSession({
40
- lastEntryType: 'assistant'
40
+ lastEntryType: "assistant"
41
41
  }),
42
42
  processInfo: makeProcess(),
43
43
  sessionFile: makeSessionFile(),
44
44
  liveInfo: {
45
45
  pidStatus: AgentStatus.WAITING,
46
- waitingFor: 'approve Read'
46
+ waitingFor: "approve Read"
47
47
  }
48
48
  });
49
49
  expect(agent).toMatchObject({
50
- name: 'my-app-123',
51
- type: 'claude',
50
+ name: "my-app-123",
51
+ type: "claude",
52
52
  status: AgentStatus.WAITING,
53
- summary: 'Review this change — waiting for approve Read',
53
+ summary: "Review this change — waiting for approve Read",
54
54
  pid: 123,
55
- projectPath: '/repo/my-app',
56
- sessionId: 'session-1',
57
- sessionFilePath: '/home/.claude/projects/-repo-my-app/session-1.jsonl'
55
+ projectPath: "/repo/my-app",
56
+ sessionId: "session-1",
57
+ sessionFilePath: "/home/.claude/projects/-repo-my-app/session-1.jsonl"
58
58
  });
59
59
  });
60
- it('maps unmatched processes to the existing process-only fallback shape', ()=>{
60
+ it("maps unmatched processes to the existing process-only fallback shape", ()=>{
61
61
  const mapper = new ClaudeAgentMapper();
62
62
  const agent = mapper.mapProcessOnlyAgent(makeProcess({
63
63
  pid: 456,
64
- cwd: '/repo/tooling'
64
+ cwd: "/repo/tooling"
65
65
  }));
66
66
  expect(agent).toMatchObject({
67
- name: 'tooling-456',
68
- type: 'claude',
67
+ name: "tooling-456",
68
+ type: "claude",
69
69
  status: AgentStatus.IDLE,
70
- summary: 'Unknown',
70
+ summary: "Unknown",
71
71
  pid: 456,
72
- projectPath: '/repo/tooling',
73
- sessionId: 'pid-456'
72
+ projectPath: "/repo/tooling",
73
+ sessionId: "pid-456"
74
74
  });
75
75
  expect(agent.lastActive).toBeInstanceOf(Date);
76
76
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/__tests__/providers/claude/ClaudeAgentMapper.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\n\nimport { AgentStatus, type ProcessInfo } from '../../../adapters/AgentAdapter.js';\nimport { ClaudeAgentMapper } from '../../../providers/claude/ClaudeAgentMapper.js';\nimport type { ClaudeSession } from '../../../providers/claude/ClaudeSessionParser.js';\nimport type { SessionFile } from '../../../utils/session.js';\n\nfunction makeProcess(overrides: Partial<ProcessInfo> = {}): ProcessInfo {\n return {\n pid: 123,\n command: 'claude',\n cwd: '/repo/my-app',\n tty: 'ttys001',\n ...overrides,\n };\n}\n\nfunction makeSession(overrides: Partial<ClaudeSession> = {}): ClaudeSession {\n return {\n sessionId: 'session-1',\n projectPath: '/repo/my-app',\n sessionStart: new Date('2026-08-23T10:00:00.000Z'),\n lastActive: new Date('2026-08-23T10:05:00.000Z'),\n lastEntryType: 'assistant',\n isInterrupted: false,\n lastUserMessage: 'Review this change',\n ...overrides,\n };\n}\n\nfunction makeSessionFile(overrides: Partial<SessionFile> = {}): SessionFile {\n return {\n sessionId: 'session-1',\n filePath: '/home/.claude/projects/-repo-my-app/session-1.jsonl',\n projectDir: '/home/.claude/projects/-repo-my-app',\n birthtimeMs: new Date('2026-08-23T10:00:00.000Z').getTime(),\n resolvedCwd: '/repo/my-app',\n ...overrides,\n };\n}\n\ndescribe('ClaudeAgentMapper', () => {\n it('prefers live PID-file status and waiting reason over JSONL-derived status', () => {\n const mapper = new ClaudeAgentMapper();\n\n const agent = mapper.mapSessionToAgent({\n session: makeSession({ lastEntryType: 'assistant' }),\n processInfo: makeProcess(),\n sessionFile: makeSessionFile(),\n liveInfo: {\n pidStatus: AgentStatus.WAITING,\n waitingFor: 'approve Read',\n },\n });\n\n expect(agent).toMatchObject({\n name: 'my-app-123',\n type: 'claude',\n status: AgentStatus.WAITING,\n summary: 'Review this change — waiting for approve Read',\n pid: 123,\n projectPath: '/repo/my-app',\n sessionId: 'session-1',\n sessionFilePath: '/home/.claude/projects/-repo-my-app/session-1.jsonl',\n });\n });\n\n it('maps unmatched processes to the existing process-only fallback shape', () => {\n const mapper = new ClaudeAgentMapper();\n\n const agent = mapper.mapProcessOnlyAgent(makeProcess({ pid: 456, cwd: '/repo/tooling' }));\n\n expect(agent).toMatchObject({\n name: 'tooling-456',\n type: 'claude',\n status: AgentStatus.IDLE,\n summary: 'Unknown',\n pid: 456,\n projectPath: '/repo/tooling',\n sessionId: 'pid-456',\n });\n expect(agent.lastActive).toBeInstanceOf(Date);\n });\n});\n"],"names":["describe","expect","it","AgentStatus","ClaudeAgentMapper","makeProcess","overrides","pid","command","cwd","tty","makeSession","sessionId","projectPath","sessionStart","Date","lastActive","lastEntryType","isInterrupted","lastUserMessage","makeSessionFile","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","mapper","agent","mapSessionToAgent","session","processInfo","sessionFile","liveInfo","pidStatus","WAITING","waitingFor","toMatchObject","name","type","status","summary","sessionFilePath","mapProcessOnlyAgent","IDLE","toBeInstanceOf"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AAE9C,SAASC,WAAW,QAA0B,oCAAoC;AAClF,SAASC,iBAAiB,QAAQ,iDAAiD;AAInF,SAASC,YAAYC,YAAkC,CAAC,CAAC;IACrD,OAAO;QACHC,KAAK;QACLC,SAAS;QACTC,KAAK;QACLC,KAAK;QACL,GAAGJ,SAAS;IAChB;AACJ;AAEA,SAASK,YAAYL,YAAoC,CAAC,CAAC;IACvD,OAAO;QACHM,WAAW;QACXC,aAAa;QACbC,cAAc,IAAIC,KAAK;QACvBC,YAAY,IAAID,KAAK;QACrBE,eAAe;QACfC,eAAe;QACfC,iBAAiB;QACjB,GAAGb,SAAS;IAChB;AACJ;AAEA,SAASc,gBAAgBd,YAAkC,CAAC,CAAC;IACzD,OAAO;QACHM,WAAW;QACXS,UAAU;QACVC,YAAY;QACZC,aAAa,IAAIR,KAAK,4BAA4BS,OAAO;QACzDC,aAAa;QACb,GAAGnB,SAAS;IAChB;AACJ;AAEAN,SAAS,qBAAqB;IAC1BE,GAAG,6EAA6E;QAC5E,MAAMwB,SAAS,IAAItB;QAEnB,MAAMuB,QAAQD,OAAOE,iBAAiB,CAAC;YACnCC,SAASlB,YAAY;gBAAEM,eAAe;YAAY;YAClDa,aAAazB;YACb0B,aAAaX;YACbY,UAAU;gBACNC,WAAW9B,YAAY+B,OAAO;gBAC9BC,YAAY;YAChB;QACJ;QAEAlC,OAAO0B,OAAOS,aAAa,CAAC;YACxBC,MAAM;YACNC,MAAM;YACNC,QAAQpC,YAAY+B,OAAO;YAC3BM,SAAS;YACTjC,KAAK;YACLM,aAAa;YACbD,WAAW;YACX6B,iBAAiB;QACrB;IACJ;IAEAvC,GAAG,wEAAwE;QACvE,MAAMwB,SAAS,IAAItB;QAEnB,MAAMuB,QAAQD,OAAOgB,mBAAmB,CAACrC,YAAY;YAAEE,KAAK;YAAKE,KAAK;QAAgB;QAEtFR,OAAO0B,OAAOS,aAAa,CAAC;YACxBC,MAAM;YACNC,MAAM;YACNC,QAAQpC,YAAYwC,IAAI;YACxBH,SAAS;YACTjC,KAAK;YACLM,aAAa;YACbD,WAAW;QACf;QACAX,OAAO0B,MAAMX,UAAU,EAAE4B,cAAc,CAAC7B;IAC5C;AACJ"}
1
+ {"version":3,"sources":["../../../../src/__tests__/providers/claude/ClaudeAgentMapper.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\n\nimport { AgentStatus, type ProcessInfo } from \"../../../adapters/AgentAdapter.js\";\nimport { ClaudeAgentMapper } from \"../../../providers/claude/ClaudeAgentMapper.js\";\nimport type { ClaudeSession } from \"../../../providers/claude/ClaudeSessionParser.js\";\nimport type { SessionFile } from \"../../../utils/session.js\";\n\nfunction makeProcess(overrides: Partial<ProcessInfo> = {}): ProcessInfo {\n return {\n pid: 123,\n command: \"claude\",\n cwd: \"/repo/my-app\",\n tty: \"ttys001\",\n ...overrides,\n };\n}\n\nfunction makeSession(overrides: Partial<ClaudeSession> = {}): ClaudeSession {\n return {\n sessionId: \"session-1\",\n projectPath: \"/repo/my-app\",\n sessionStart: new Date(\"2026-08-23T10:00:00.000Z\"),\n lastActive: new Date(\"2026-08-23T10:05:00.000Z\"),\n lastEntryType: \"assistant\",\n isInterrupted: false,\n lastUserMessage: \"Review this change\",\n ...overrides,\n };\n}\n\nfunction makeSessionFile(overrides: Partial<SessionFile> = {}): SessionFile {\n return {\n sessionId: \"session-1\",\n filePath: \"/home/.claude/projects/-repo-my-app/session-1.jsonl\",\n projectDir: \"/home/.claude/projects/-repo-my-app\",\n birthtimeMs: new Date(\"2026-08-23T10:00:00.000Z\").getTime(),\n resolvedCwd: \"/repo/my-app\",\n ...overrides,\n };\n}\n\ndescribe(\"ClaudeAgentMapper\", () => {\n it(\"prefers live PID-file status and waiting reason over JSONL-derived status\", () => {\n const mapper = new ClaudeAgentMapper();\n\n const agent = mapper.mapSessionToAgent({\n session: makeSession({ lastEntryType: \"assistant\" }),\n processInfo: makeProcess(),\n sessionFile: makeSessionFile(),\n liveInfo: {\n pidStatus: AgentStatus.WAITING,\n waitingFor: \"approve Read\",\n },\n });\n\n expect(agent).toMatchObject({\n name: \"my-app-123\",\n type: \"claude\",\n status: AgentStatus.WAITING,\n summary: \"Review this change — waiting for approve Read\",\n pid: 123,\n projectPath: \"/repo/my-app\",\n sessionId: \"session-1\",\n sessionFilePath: \"/home/.claude/projects/-repo-my-app/session-1.jsonl\",\n });\n });\n\n it(\"maps unmatched processes to the existing process-only fallback shape\", () => {\n const mapper = new ClaudeAgentMapper();\n\n const agent = mapper.mapProcessOnlyAgent(makeProcess({ pid: 456, cwd: \"/repo/tooling\" }));\n\n expect(agent).toMatchObject({\n name: \"tooling-456\",\n type: \"claude\",\n status: AgentStatus.IDLE,\n summary: \"Unknown\",\n pid: 456,\n projectPath: \"/repo/tooling\",\n sessionId: \"pid-456\",\n });\n expect(agent.lastActive).toBeInstanceOf(Date);\n });\n});\n"],"names":["describe","expect","it","AgentStatus","ClaudeAgentMapper","makeProcess","overrides","pid","command","cwd","tty","makeSession","sessionId","projectPath","sessionStart","Date","lastActive","lastEntryType","isInterrupted","lastUserMessage","makeSessionFile","filePath","projectDir","birthtimeMs","getTime","resolvedCwd","mapper","agent","mapSessionToAgent","session","processInfo","sessionFile","liveInfo","pidStatus","WAITING","waitingFor","toMatchObject","name","type","status","summary","sessionFilePath","mapProcessOnlyAgent","IDLE","toBeInstanceOf"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AAE9C,SAASC,WAAW,QAA0B,oCAAoC;AAClF,SAASC,iBAAiB,QAAQ,iDAAiD;AAInF,SAASC,YAAYC,YAAkC,CAAC,CAAC;IACvD,OAAO;QACLC,KAAK;QACLC,SAAS;QACTC,KAAK;QACLC,KAAK;QACL,GAAGJ,SAAS;IACd;AACF;AAEA,SAASK,YAAYL,YAAoC,CAAC,CAAC;IACzD,OAAO;QACLM,WAAW;QACXC,aAAa;QACbC,cAAc,IAAIC,KAAK;QACvBC,YAAY,IAAID,KAAK;QACrBE,eAAe;QACfC,eAAe;QACfC,iBAAiB;QACjB,GAAGb,SAAS;IACd;AACF;AAEA,SAASc,gBAAgBd,YAAkC,CAAC,CAAC;IAC3D,OAAO;QACLM,WAAW;QACXS,UAAU;QACVC,YAAY;QACZC,aAAa,IAAIR,KAAK,4BAA4BS,OAAO;QACzDC,aAAa;QACb,GAAGnB,SAAS;IACd;AACF;AAEAN,SAAS,qBAAqB;IAC5BE,GAAG,6EAA6E;QAC9E,MAAMwB,SAAS,IAAItB;QAEnB,MAAMuB,QAAQD,OAAOE,iBAAiB,CAAC;YACrCC,SAASlB,YAAY;gBAAEM,eAAe;YAAY;YAClDa,aAAazB;YACb0B,aAAaX;YACbY,UAAU;gBACRC,WAAW9B,YAAY+B,OAAO;gBAC9BC,YAAY;YACd;QACF;QAEAlC,OAAO0B,OAAOS,aAAa,CAAC;YAC1BC,MAAM;YACNC,MAAM;YACNC,QAAQpC,YAAY+B,OAAO;YAC3BM,SAAS;YACTjC,KAAK;YACLM,aAAa;YACbD,WAAW;YACX6B,iBAAiB;QACnB;IACF;IAEAvC,GAAG,wEAAwE;QACzE,MAAMwB,SAAS,IAAItB;QAEnB,MAAMuB,QAAQD,OAAOgB,mBAAmB,CAACrC,YAAY;YAAEE,KAAK;YAAKE,KAAK;QAAgB;QAEtFR,OAAO0B,OAAOS,aAAa,CAAC;YAC1BC,MAAM;YACNC,MAAM;YACNC,QAAQpC,YAAYwC,IAAI;YACxBH,SAAS;YACTjC,KAAK;YACLM,aAAa;YACbD,WAAW;QACb;QACAX,OAAO0B,MAAMX,UAAU,EAAE4B,cAAc,CAAC7B;IAC1C;AACF"}