@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,13 +1,13 @@
1
1
  /**
2
2
  * Tests for OpenCodeAdapter
3
- */ import * as fs from 'fs';
4
- import * as path from 'path';
5
- import { OpenCodeAdapter } from '../../adapters/OpenCodeAdapter.js';
6
- import { AgentStatus } from '../../adapters/AgentAdapter.js';
7
- import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';
8
- import { generateAgentName } from '../../utils/matching.js';
9
- import * as os from 'os';
10
- vi.mock('../../utils/process.js', async (importOriginal)=>{
3
+ */ import * as fs from "fs";
4
+ import * as path from "path";
5
+ import { OpenCodeAdapter } from "../../adapters/OpenCodeAdapter.js";
6
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
7
+ import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from "../../utils/process.js";
8
+ import { generateAgentName } from "../../utils/matching.js";
9
+ import * as os from "os";
10
+ vi.mock("../../utils/process.js", async (importOriginal)=>{
11
11
  const actual = await importOriginal();
12
12
  return {
13
13
  ...actual,
@@ -16,7 +16,7 @@ vi.mock('../../utils/process.js', async (importOriginal)=>{
16
16
  captureProcessSnapshot: vi.fn()
17
17
  };
18
18
  });
19
- vi.mock('../../utils/matching.js', ()=>({
19
+ vi.mock("../../utils/matching.js", ()=>({
20
20
  generateAgentName: vi.fn(),
21
21
  matchProcessesToSessions: vi.fn()
22
22
  }));
@@ -26,8 +26,8 @@ const mockedCaptureProcessSnapshot = captureProcessSnapshot;
26
26
  const mockedGenerateAgentName = generateAgentName;
27
27
  function makeDb(queries) {
28
28
  const prepareImpl = (sql)=>{
29
- const normalized = sql.replace(/\s+/g, ' ').trim().toLowerCase();
30
- if (normalized.includes('from session')) {
29
+ const normalized = sql.replace(/\s+/g, " ").trim().toLowerCase();
30
+ if (normalized.includes("from session")) {
31
31
  return {
32
32
  all: ()=>(queries.session ?? []).map((r)=>({
33
33
  id: r.id,
@@ -45,14 +45,14 @@ function makeDb(queries) {
45
45
  }
46
46
  };
47
47
  }
48
- if (normalized.includes('max(time_updated)')) {
48
+ if (normalized.includes("max(time_updated)")) {
49
49
  return {
50
50
  get: ()=>({
51
51
  maxUpdated: queries.lastMessage?.timeUpdated ?? 0
52
52
  })
53
53
  };
54
54
  }
55
- if (normalized.includes('from message') && !normalized.includes("'$.time.completed'") && !normalized.includes('order by p.time_created')) {
55
+ if (normalized.includes("from message") && !normalized.includes("'$.time.completed'") && !normalized.includes("order by p.time_created")) {
56
56
  return {
57
57
  get: ()=>queries.lastMessage ?? undefined
58
58
  };
@@ -67,7 +67,7 @@ function makeDb(queries) {
67
67
  get: ()=>queries.firstUserText === undefined ? undefined : queries.firstUserText ?? undefined
68
68
  };
69
69
  }
70
- if (normalized.includes('order by p.time_created asc')) {
70
+ if (normalized.includes("order by p.time_created asc")) {
71
71
  return {
72
72
  all: ()=>queries.parts ?? []
73
73
  };
@@ -85,7 +85,7 @@ function makeDb(queries) {
85
85
  function makeDbConstructor(db) {
86
86
  return vi.fn().mockReturnValue(db);
87
87
  }
88
- describe('OpenCodeAdapter', ()=>{
88
+ describe("OpenCodeAdapter", ()=>{
89
89
  let adapter;
90
90
  let tmpDir;
91
91
  let dbPath;
@@ -99,11 +99,11 @@ describe('OpenCodeAdapter', ()=>{
99
99
  // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.
100
100
  mockedCaptureProcessSnapshot.mockImplementation(async (names)=>enrichProcesses(names.flatMap((name)=>listAgentProcesses(name))));
101
101
  mockedGenerateAgentName.mockImplementation((cwd, pid)=>{
102
- const folder = path.basename(cwd) || 'unknown';
102
+ const folder = path.basename(cwd) || "unknown";
103
103
  return `${folder}-${pid}`;
104
104
  });
105
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'opencode-test-'));
106
- dbPath = path.join(tmpDir, 'opencode.db');
105
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "opencode-test-"));
106
+ dbPath = path.join(tmpDir, "opencode.db");
107
107
  adapter.dbPath = dbPath;
108
108
  adapter.db = null;
109
109
  });
@@ -114,67 +114,67 @@ describe('OpenCodeAdapter', ()=>{
114
114
  });
115
115
  vi.restoreAllMocks();
116
116
  });
117
- describe('type', ()=>{
118
- it('exposes opencode type', ()=>{
119
- expect(adapter.type).toBe('opencode');
117
+ describe("type", ()=>{
118
+ it("exposes opencode type", ()=>{
119
+ expect(adapter.type).toBe("opencode");
120
120
  });
121
121
  });
122
- describe('canHandle', ()=>{
123
- it('returns true for opencode command', ()=>{
122
+ describe("canHandle", ()=>{
123
+ it("returns true for opencode command", ()=>{
124
124
  expect(adapter.canHandle({
125
125
  pid: 1,
126
- command: 'opencode',
127
- cwd: '/repo',
128
- tty: 'ttys001'
126
+ command: "opencode",
127
+ cwd: "/repo",
128
+ tty: "ttys001"
129
129
  })).toBe(true);
130
130
  });
131
- it('returns true for full path opencode', ()=>{
131
+ it("returns true for full path opencode", ()=>{
132
132
  expect(adapter.canHandle({
133
133
  pid: 2,
134
- command: '/usr/local/bin/opencode serve',
135
- cwd: '/repo',
136
- tty: 'ttys002'
134
+ command: "/usr/local/bin/opencode serve",
135
+ cwd: "/repo",
136
+ tty: "ttys002"
137
137
  })).toBe(true);
138
138
  });
139
- it('returns true for opencode.exe with unix-style path', ()=>{
139
+ it("returns true for opencode.exe with unix-style path", ()=>{
140
140
  expect(adapter.canHandle({
141
141
  pid: 3,
142
- command: '/usr/bin/opencode.exe',
143
- cwd: '/repo',
144
- tty: 'ttys003'
142
+ command: "/usr/bin/opencode.exe",
143
+ cwd: "/repo",
144
+ tty: "ttys003"
145
145
  })).toBe(true);
146
146
  });
147
- it('returns false for non-opencode processes', ()=>{
147
+ it("returns false for non-opencode processes", ()=>{
148
148
  expect(adapter.canHandle({
149
149
  pid: 4,
150
- command: 'node server.js',
151
- cwd: '/repo',
152
- tty: 'ttys004'
150
+ command: "node server.js",
151
+ cwd: "/repo",
152
+ tty: "ttys004"
153
153
  })).toBe(false);
154
154
  });
155
- it('returns false when opencode appears only in path args', ()=>{
155
+ it("returns false when opencode appears only in path args", ()=>{
156
156
  expect(adapter.canHandle({
157
157
  pid: 5,
158
- command: 'node /projects/opencode-plugin/index.js',
159
- cwd: '/repo',
160
- tty: 'ttys005'
158
+ command: "node /projects/opencode-plugin/index.js",
159
+ cwd: "/repo",
160
+ tty: "ttys005"
161
161
  })).toBe(false);
162
162
  });
163
163
  });
164
- describe('detectAgents', ()=>{
165
- it('returns empty list when no opencode processes running', async ()=>{
164
+ describe("detectAgents", ()=>{
165
+ it("returns empty list when no opencode processes running", async ()=>{
166
166
  mockedListAgentProcesses.mockReturnValue([]);
167
167
  const agents = await adapter.detectAgents();
168
168
  expect(agents).toEqual([]);
169
- expect(mockedListAgentProcesses).toHaveBeenCalledWith('opencode');
169
+ expect(mockedListAgentProcesses).toHaveBeenCalledWith("opencode");
170
170
  });
171
- it('returns process-only agent when DB does not exist', async ()=>{
171
+ it("returns process-only agent when DB does not exist", async ()=>{
172
172
  const procs = [
173
173
  {
174
174
  pid: 100,
175
- command: 'opencode',
176
- cwd: '/repo',
177
- tty: 'ttys001'
175
+ command: "opencode",
176
+ cwd: "/repo",
177
+ tty: "ttys001"
178
178
  }
179
179
  ];
180
180
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -182,47 +182,47 @@ describe('OpenCodeAdapter', ()=>{
182
182
  const agents = await adapter.detectAgents();
183
183
  expect(agents).toHaveLength(1);
184
184
  expect(agents[0]).toMatchObject({
185
- type: 'opencode',
185
+ type: "opencode",
186
186
  status: AgentStatus.RUNNING,
187
187
  pid: 100,
188
- projectPath: '/repo',
189
- sessionId: 'pid-100',
190
- summary: 'OpenCode process running'
188
+ projectPath: "/repo",
189
+ sessionId: "pid-100",
190
+ summary: "OpenCode process running"
191
191
  });
192
192
  });
193
- it('returns process-only agent when no session matches CWD', async ()=>{
193
+ it("returns process-only agent when no session matches CWD", async ()=>{
194
194
  const procs = [
195
195
  {
196
196
  pid: 100,
197
- command: 'opencode',
198
- cwd: '/repo',
199
- tty: 'ttys001'
197
+ command: "opencode",
198
+ cwd: "/repo",
199
+ tty: "ttys001"
200
200
  }
201
201
  ];
202
202
  mockedListAgentProcesses.mockReturnValue(procs);
203
203
  mockedEnrichProcesses.mockReturnValue(procs);
204
- fs.writeFileSync(dbPath, ''); // file exists but empty → sqlite throws
204
+ fs.writeFileSync(dbPath, ""); // file exists but empty → sqlite throws
205
205
  const db = makeDb({
206
206
  session: []
207
207
  }); // no matching session
208
- vi.doMock('better-sqlite3', ()=>makeDbConstructor(db));
208
+ vi.doMock("better-sqlite3", ()=>makeDbConstructor(db));
209
209
  adapter.db = db;
210
210
  const agents = await adapter.detectAgents();
211
211
  expect(agents).toHaveLength(1);
212
212
  expect(agents[0]).toMatchObject({
213
- type: 'opencode',
213
+ type: "opencode",
214
214
  status: AgentStatus.RUNNING,
215
- sessionId: 'pid-100'
215
+ sessionId: "pid-100"
216
216
  });
217
217
  });
218
- it('returns waiting when assistant turn has time.completed set', async ()=>{
218
+ it("returns waiting when assistant turn has time.completed set", async ()=>{
219
219
  const now = Date.now();
220
220
  const procs = [
221
221
  {
222
222
  pid: 200,
223
- command: 'opencode',
224
- cwd: '/my-project',
225
- tty: 'ttys002'
223
+ command: "opencode",
224
+ cwd: "/my-project",
225
+ tty: "ttys002"
226
226
  }
227
227
  ];
228
228
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -230,13 +230,13 @@ describe('OpenCodeAdapter', ()=>{
230
230
  const db = makeDb({
231
231
  session: [
232
232
  {
233
- id: 'sess-001',
234
- directory: '/my-project',
233
+ id: "sess-001",
234
+ directory: "/my-project",
235
235
  time_created: now - 60000
236
236
  }
237
237
  ],
238
238
  lastMessage: {
239
- role: 'assistant',
239
+ role: "assistant",
240
240
  timeUpdated: now - 60_000
241
241
  },
242
242
  lastAssistant: {
@@ -244,27 +244,27 @@ describe('OpenCodeAdapter', ()=>{
244
244
  errored: null
245
245
  },
246
246
  firstUserText: {
247
- text: 'Refactor the auth module'
247
+ text: "Refactor the auth module"
248
248
  }
249
249
  });
250
250
  adapter.db = db;
251
251
  const agents = await adapter.detectAgents();
252
252
  expect(agents).toHaveLength(1);
253
253
  expect(agents[0]).toMatchObject({
254
- type: 'opencode',
254
+ type: "opencode",
255
255
  status: AgentStatus.WAITING,
256
- sessionId: 'sess-001',
257
- summary: 'Refactor the auth module'
256
+ sessionId: "sess-001",
257
+ summary: "Refactor the auth module"
258
258
  });
259
259
  });
260
- it('returns running when assistant turn has no time.completed (in-progress, any age)', async ()=>{
260
+ it("returns running when assistant turn has no time.completed (in-progress, any age)", async ()=>{
261
261
  const now = Date.now();
262
262
  const procs = [
263
263
  {
264
264
  pid: 250,
265
- command: 'opencode',
266
- cwd: '/proj',
267
- tty: 'ttys004'
265
+ command: "opencode",
266
+ cwd: "/proj",
267
+ tty: "ttys004"
268
268
  }
269
269
  ];
270
270
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -272,13 +272,13 @@ describe('OpenCodeAdapter', ()=>{
272
272
  const db = makeDb({
273
273
  session: [
274
274
  {
275
- id: 'sess-tool',
276
- directory: '/proj',
275
+ id: "sess-tool",
276
+ directory: "/proj",
277
277
  time_created: now - 180_000
278
278
  }
279
279
  ],
280
280
  lastMessage: {
281
- role: 'assistant',
281
+ role: "assistant",
282
282
  timeUpdated: now - 120_000
283
283
  },
284
284
  lastAssistant: {
@@ -286,24 +286,24 @@ describe('OpenCodeAdapter', ()=>{
286
286
  errored: null
287
287
  },
288
288
  firstUserText: {
289
- text: 'Run the build'
289
+ text: "Run the build"
290
290
  }
291
291
  });
292
292
  adapter.db = db;
293
293
  const agents = await adapter.detectAgents();
294
294
  expect(agents[0]).toMatchObject({
295
295
  status: AgentStatus.RUNNING,
296
- sessionId: 'sess-tool'
296
+ sessionId: "sess-tool"
297
297
  });
298
298
  });
299
- it('returns running between steps (the bug fix) — no time.completed even during quiet moment', async ()=>{
299
+ it("returns running between steps (the bug fix) — no time.completed even during quiet moment", async ()=>{
300
300
  const now = Date.now();
301
301
  const procs = [
302
302
  {
303
303
  pid: 260,
304
- command: 'opencode',
305
- cwd: '/proj-b',
306
- tty: 'ttys005'
304
+ command: "opencode",
305
+ cwd: "/proj-b",
306
+ tty: "ttys005"
307
307
  }
308
308
  ];
309
309
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -311,13 +311,13 @@ describe('OpenCodeAdapter', ()=>{
311
311
  const db = makeDb({
312
312
  session: [
313
313
  {
314
- id: 'sess-mid',
315
- directory: '/proj-b',
314
+ id: "sess-mid",
315
+ directory: "/proj-b",
316
316
  time_created: now - 60_000
317
317
  }
318
318
  ],
319
319
  lastMessage: {
320
- role: 'assistant',
320
+ role: "assistant",
321
321
  timeUpdated: now - 45_000
322
322
  },
323
323
  lastAssistant: {
@@ -330,7 +330,7 @@ describe('OpenCodeAdapter', ()=>{
330
330
  const agents = await adapter.detectAgents();
331
331
  expect(agents[0].status).toBe(AgentStatus.RUNNING);
332
332
  });
333
- it('returns waiting even when latest user message was metadata-updated after assistant completion', async ()=>{
333
+ it("returns waiting even when latest user message was metadata-updated after assistant completion", async ()=>{
334
334
  // Regression: OpenCode updates user.message.time_updated when appending
335
335
  // summary diffs after a turn finishes. Ordering by time_created (not
336
336
  // time_updated) keeps the assistant message correctly identified as latest.
@@ -338,9 +338,9 @@ describe('OpenCodeAdapter', ()=>{
338
338
  const procs = [
339
339
  {
340
340
  pid: 270,
341
- command: 'opencode',
342
- cwd: '/proj-c',
343
- tty: 'ttys006'
341
+ command: "opencode",
342
+ cwd: "/proj-c",
343
+ tty: "ttys006"
344
344
  }
345
345
  ];
346
346
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -349,13 +349,13 @@ describe('OpenCodeAdapter', ()=>{
349
349
  const db = makeDb({
350
350
  session: [
351
351
  {
352
- id: 'sess-meta',
353
- directory: '/proj-c',
352
+ id: "sess-meta",
353
+ directory: "/proj-c",
354
354
  time_created: now - 120_000
355
355
  }
356
356
  ],
357
357
  lastMessage: {
358
- role: 'assistant',
358
+ role: "assistant",
359
359
  timeUpdated: now - 30_000
360
360
  },
361
361
  lastAssistant: {
@@ -368,14 +368,14 @@ describe('OpenCodeAdapter', ()=>{
368
368
  const agents = await adapter.detectAgents();
369
369
  expect(agents[0].status).toBe(AgentStatus.WAITING);
370
370
  });
371
- it('returns running agent when last role is user (no assistant message yet)', async ()=>{
371
+ it("returns running agent when last role is user (no assistant message yet)", async ()=>{
372
372
  const now = Date.now();
373
373
  const procs = [
374
374
  {
375
375
  pid: 300,
376
- command: 'opencode',
377
- cwd: '/work',
378
- tty: 'ttys003'
376
+ command: "opencode",
377
+ cwd: "/work",
378
+ tty: "ttys003"
379
379
  }
380
380
  ];
381
381
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -383,36 +383,36 @@ describe('OpenCodeAdapter', ()=>{
383
383
  const db = makeDb({
384
384
  session: [
385
385
  {
386
- id: 'sess-002',
387
- directory: '/work',
386
+ id: "sess-002",
387
+ directory: "/work",
388
388
  time_created: now - 30000
389
389
  }
390
390
  ],
391
391
  lastMessage: {
392
- role: 'user',
392
+ role: "user",
393
393
  timeUpdated: now - 30_000
394
394
  },
395
395
  lastAssistant: null,
396
396
  firstUserText: {
397
- text: 'Add unit tests'
397
+ text: "Add unit tests"
398
398
  }
399
399
  });
400
400
  adapter.db = db;
401
401
  const agents = await adapter.detectAgents();
402
402
  expect(agents[0]).toMatchObject({
403
403
  status: AgentStatus.RUNNING,
404
- sessionId: 'sess-002'
404
+ sessionId: "sess-002"
405
405
  });
406
406
  });
407
- it('returns idle agent when last activity exceeds threshold', async ()=>{
407
+ it("returns idle agent when last activity exceeds threshold", async ()=>{
408
408
  const now = Date.now();
409
409
  const staleTime = now - 10 * 60 * 1000; // 10 minutes ago
410
410
  const procs = [
411
411
  {
412
412
  pid: 400,
413
- command: 'opencode',
414
- cwd: '/old-work',
415
- tty: 'ttys004'
413
+ command: "opencode",
414
+ cwd: "/old-work",
415
+ tty: "ttys004"
416
416
  }
417
417
  ];
418
418
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -420,13 +420,13 @@ describe('OpenCodeAdapter', ()=>{
420
420
  const db = makeDb({
421
421
  session: [
422
422
  {
423
- id: 'sess-003',
424
- directory: '/old-work',
423
+ id: "sess-003",
424
+ directory: "/old-work",
425
425
  time_created: staleTime
426
426
  }
427
427
  ],
428
428
  lastMessage: {
429
- role: 'assistant',
429
+ role: "assistant",
430
430
  timeUpdated: staleTime
431
431
  },
432
432
  lastAssistant: {
@@ -439,31 +439,31 @@ describe('OpenCodeAdapter', ()=>{
439
439
  const agents = await adapter.detectAgents();
440
440
  expect(agents[0]).toMatchObject({
441
441
  status: AgentStatus.IDLE,
442
- sessionId: 'sess-003'
442
+ sessionId: "sess-003"
443
443
  });
444
444
  });
445
445
  });
446
- describe('getConversation', ()=>{
447
- it('returns empty array for invalid session ref', ()=>{
448
- const messages = adapter.getConversation('/no-separator-here');
446
+ describe("getConversation", ()=>{
447
+ it("returns empty array for invalid session ref", ()=>{
448
+ const messages = adapter.getConversation("/no-separator-here");
449
449
  expect(messages).toEqual([]);
450
450
  });
451
- it('returns text messages from session parts', ()=>{
451
+ it("returns text messages from session parts", ()=>{
452
452
  const db = makeDb({
453
453
  parts: [
454
454
  {
455
- role: 'user',
455
+ role: "user",
456
456
  partData: JSON.stringify({
457
- type: 'text',
458
- text: 'Hello agent'
457
+ type: "text",
458
+ text: "Hello agent"
459
459
  }),
460
460
  timeCreated: 1000
461
461
  },
462
462
  {
463
- role: 'assistant',
463
+ role: "assistant",
464
464
  partData: JSON.stringify({
465
- type: 'text',
466
- text: 'Hi, how can I help?'
465
+ type: "text",
466
+ text: "Hi, how can I help?"
467
467
  }),
468
468
  timeCreated: 2000
469
469
  }
@@ -474,30 +474,30 @@ describe('OpenCodeAdapter', ()=>{
474
474
  const messages = adapter.getConversation(ref);
475
475
  expect(messages).toHaveLength(2);
476
476
  expect(messages[0]).toEqual({
477
- role: 'user',
478
- content: 'Hello agent'
477
+ role: "user",
478
+ content: "Hello agent"
479
479
  });
480
480
  expect(messages[1]).toEqual({
481
- role: 'assistant',
482
- content: 'Hi, how can I help?'
481
+ role: "assistant",
482
+ content: "Hi, how can I help?"
483
483
  });
484
484
  });
485
- it('skips reasoning parts when verbose is false', ()=>{
485
+ it("skips reasoning parts when verbose is false", ()=>{
486
486
  const db = makeDb({
487
487
  parts: [
488
488
  {
489
- role: 'assistant',
489
+ role: "assistant",
490
490
  partData: JSON.stringify({
491
- type: 'reasoning',
492
- reasoning: 'internal thought'
491
+ type: "reasoning",
492
+ reasoning: "internal thought"
493
493
  }),
494
494
  timeCreated: 1000
495
495
  },
496
496
  {
497
- role: 'assistant',
497
+ role: "assistant",
498
498
  partData: JSON.stringify({
499
- type: 'text',
500
- text: 'Answer'
499
+ type: "text",
500
+ text: "Answer"
501
501
  }),
502
502
  timeCreated: 2000
503
503
  }
@@ -506,24 +506,24 @@ describe('OpenCodeAdapter', ()=>{
506
506
  adapter.db = db;
507
507
  const messages = adapter.getConversation(`${dbPath}::sess-x`);
508
508
  expect(messages).toHaveLength(1);
509
- expect(messages[0].content).toBe('Answer');
509
+ expect(messages[0].content).toBe("Answer");
510
510
  });
511
- it('includes reasoning and tool parts when verbose is true', ()=>{
511
+ it("includes reasoning and tool parts when verbose is true", ()=>{
512
512
  const db = makeDb({
513
513
  parts: [
514
514
  {
515
- role: 'assistant',
515
+ role: "assistant",
516
516
  partData: JSON.stringify({
517
- type: 'reasoning',
518
- reasoning: 'my thinking'
517
+ type: "reasoning",
518
+ reasoning: "my thinking"
519
519
  }),
520
520
  timeCreated: 1000
521
521
  },
522
522
  {
523
- role: 'assistant',
523
+ role: "assistant",
524
524
  partData: JSON.stringify({
525
- type: 'tool',
526
- tool: 'read_file'
525
+ type: "tool",
526
+ tool: "read_file"
527
527
  }),
528
528
  timeCreated: 2000
529
529
  }
@@ -534,68 +534,68 @@ describe('OpenCodeAdapter', ()=>{
534
534
  verbose: true
535
535
  });
536
536
  expect(messages).toHaveLength(2);
537
- expect(messages[0].content).toContain('my thinking');
538
- expect(messages[1].content).toContain('read_file');
537
+ expect(messages[0].content).toContain("my thinking");
538
+ expect(messages[1].content).toContain("read_file");
539
539
  });
540
- it('returns empty array when DB cannot be opened', ()=>{
540
+ it("returns empty array when DB cannot be opened", ()=>{
541
541
  adapter.db = null;
542
542
  const messages = adapter.getConversation(`${dbPath}::sess-z`);
543
543
  expect(messages).toEqual([]);
544
544
  });
545
545
  });
546
- describe('listSessions', ()=>{
547
- it('returns empty array when DB does not exist', async ()=>{
546
+ describe("listSessions", ()=>{
547
+ it("returns empty array when DB does not exist", async ()=>{
548
548
  const sessions = await adapter.listSessions();
549
549
  expect(sessions).toEqual([]);
550
550
  });
551
- it('returns all sessions from DB', async ()=>{
551
+ it("returns all sessions from DB", async ()=>{
552
552
  const now = Date.now();
553
553
  const db = makeDb({
554
554
  session: [
555
555
  {
556
- id: 'sess-a',
557
- directory: '/proj-a',
556
+ id: "sess-a",
557
+ directory: "/proj-a",
558
558
  time_created: now - 3000
559
559
  },
560
560
  {
561
- id: 'sess-b',
562
- directory: '/proj-b',
561
+ id: "sess-b",
562
+ directory: "/proj-b",
563
563
  time_created: now - 6000
564
564
  }
565
565
  ],
566
566
  lastMessage: null,
567
567
  lastAssistant: null,
568
568
  firstUserText: {
569
- text: 'Build the feature'
569
+ text: "Build the feature"
570
570
  }
571
571
  });
572
572
  adapter.db = db;
573
573
  const sessions = await adapter.listSessions();
574
574
  expect(sessions).toHaveLength(2);
575
575
  expect(sessions[0]).toMatchObject({
576
- type: 'opencode',
577
- sessionId: 'sess-a',
578
- cwd: '/proj-a'
576
+ type: "opencode",
577
+ sessionId: "sess-a",
578
+ cwd: "/proj-a"
579
579
  });
580
580
  expect(sessions[1]).toMatchObject({
581
- type: 'opencode',
582
- sessionId: 'sess-b',
583
- cwd: '/proj-b'
581
+ type: "opencode",
582
+ sessionId: "sess-b",
583
+ cwd: "/proj-b"
584
584
  });
585
- expect(sessions[0].sessionFilePath).toContain('sess-a');
585
+ expect(sessions[0].sessionFilePath).toContain("sess-a");
586
586
  });
587
- it('filters sessions by cwd when opts.cwd is set', async ()=>{
587
+ it("filters sessions by cwd when opts.cwd is set", async ()=>{
588
588
  const now = Date.now();
589
589
  const db = makeDb({
590
590
  session: [
591
591
  {
592
- id: 'sess-a',
593
- directory: '/proj-a',
592
+ id: "sess-a",
593
+ directory: "/proj-a",
594
594
  time_created: now - 3000
595
595
  },
596
596
  {
597
- id: 'sess-b',
598
- directory: '/proj-b',
597
+ id: "sess-b",
598
+ directory: "/proj-b",
599
599
  time_created: now - 6000
600
600
  }
601
601
  ],
@@ -605,18 +605,18 @@ describe('OpenCodeAdapter', ()=>{
605
605
  });
606
606
  adapter.db = db;
607
607
  const sessions = await adapter.listSessions({
608
- cwd: '/proj-a'
608
+ cwd: "/proj-a"
609
609
  });
610
610
  expect(sessions).toHaveLength(1);
611
- expect(sessions[0].sessionId).toBe('sess-a');
611
+ expect(sessions[0].sessionId).toBe("sess-a");
612
612
  });
613
- it('uses session time_created as startedAt and lastActive when no parts exist', async ()=>{
613
+ it("uses session time_created as startedAt and lastActive when no parts exist", async ()=>{
614
614
  const timeCreated = Date.now() - 120000;
615
615
  const db = makeDb({
616
616
  session: [
617
617
  {
618
- id: 'sess-c',
619
- directory: '/repo',
618
+ id: "sess-c",
619
+ directory: "/repo",
620
620
  time_created: timeCreated
621
621
  }
622
622
  ],