@ai-devkit/agent-manager 0.32.0 → 0.33.1

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 (572) hide show
  1. package/dist/AgentManager.d.ts +13 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +116 -84
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +623 -391
  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/GrokCliAdapter.test.js +114 -114
  12. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +170 -169
  14. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  15. package/dist/__tests__/capacity/codex.test.js +93 -93
  16. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  17. package/dist/__tests__/capacity/index.test.js +17 -17
  18. package/dist/__tests__/capacity/index.test.js.map +1 -1
  19. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  20. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  21. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  22. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  24. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  26. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  28. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  29. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  30. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  31. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  32. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  34. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  36. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  37. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  38. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  39. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  40. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  42. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  43. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  44. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  45. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  46. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  47. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  48. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  49. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  50. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  51. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  52. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
  53. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +641 -0
  54. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -0
  55. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +1398 -0
  56. package/dist/__tests__/providers/gemini/GeminiCliAdapter.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 +134 -134
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  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/HerdrAgentDiscovery.test.js +164 -0
  80. package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js.map +1 -0
  81. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +488 -0
  82. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  84. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  85. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  86. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  88. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  89. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  90. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  91. package/dist/__tests__/utils/AgentRegistry.test.js +343 -218
  92. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  93. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  94. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  95. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  96. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  97. package/dist/__tests__/utils/agents.test.js +17 -17
  98. package/dist/__tests__/utils/agents.test.js.map +1 -1
  99. package/dist/__tests__/utils/matching.test.js +92 -92
  100. package/dist/__tests__/utils/matching.test.js.map +1 -1
  101. package/dist/__tests__/utils/process.test.js +108 -108
  102. package/dist/__tests__/utils/process.test.js.map +1 -1
  103. package/dist/__tests__/utils/session.test.js +53 -53
  104. package/dist/__tests__/utils/session.test.js.map +1 -1
  105. package/dist/adapters/AgentAdapter.d.ts +2 -2
  106. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  107. package/dist/adapters/AgentAdapter.js +1 -1
  108. package/dist/adapters/AgentAdapter.js.map +1 -1
  109. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  110. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  111. package/dist/adapters/GrokCliAdapter.js +80 -80
  112. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  113. package/dist/adapters/OpenCodeAdapter.d.ts +2 -1
  114. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  115. package/dist/adapters/OpenCodeAdapter.js +41 -37
  116. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  117. package/dist/adapters/index.d.ts +9 -9
  118. package/dist/adapters/index.d.ts.map +1 -1
  119. package/dist/adapters/index.js +8 -8
  120. package/dist/adapters/index.js.map +1 -1
  121. package/dist/capacity/codex.d.ts +3 -3
  122. package/dist/capacity/codex.d.ts.map +1 -1
  123. package/dist/capacity/codex.js +57 -57
  124. package/dist/capacity/codex.js.map +1 -1
  125. package/dist/capacity/index.d.ts +3 -3
  126. package/dist/capacity/index.d.ts.map +1 -1
  127. package/dist/capacity/index.js +8 -8
  128. package/dist/capacity/index.js.map +1 -1
  129. package/dist/capacity/types.d.ts +1 -1
  130. package/dist/capacity/types.js.map +1 -1
  131. package/dist/database/connection.d.ts +1 -1
  132. package/dist/database/connection.d.ts.map +1 -1
  133. package/dist/database/connection.js +15 -15
  134. package/dist/database/connection.js.map +1 -1
  135. package/dist/database/index.d.ts +3 -3
  136. package/dist/database/index.d.ts.map +1 -1
  137. package/dist/database/index.js +2 -2
  138. package/dist/database/index.js.map +1 -1
  139. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  140. package/dist/database/schema.d.ts +1 -1
  141. package/dist/database/schema.d.ts.map +1 -1
  142. package/dist/database/schema.js +7 -7
  143. package/dist/database/schema.js.map +1 -1
  144. package/dist/durable/DurableAgent.d.ts +9 -9
  145. package/dist/durable/DurableAgent.d.ts.map +1 -1
  146. package/dist/durable/DurableAgent.js +16 -16
  147. package/dist/durable/DurableAgent.js.map +1 -1
  148. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  149. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  150. package/dist/durable/DurableAgentRepository.js +49 -48
  151. package/dist/durable/DurableAgentRepository.js.map +1 -1
  152. package/dist/durable/process.d.ts +1 -1
  153. package/dist/durable/process.d.ts.map +1 -1
  154. package/dist/durable/process.js +14 -14
  155. package/dist/durable/process.js.map +1 -1
  156. package/dist/durable/run.d.ts +2 -2
  157. package/dist/durable/run.d.ts.map +1 -1
  158. package/dist/durable/run.js +6 -6
  159. package/dist/durable/run.js.map +1 -1
  160. package/dist/durable/utils.d.ts +1 -1
  161. package/dist/durable/utils.d.ts.map +1 -1
  162. package/dist/durable/utils.js +4 -4
  163. package/dist/durable/utils.js.map +1 -1
  164. package/dist/index.d.ts +48 -43
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +28 -26
  167. package/dist/index.js.map +1 -1
  168. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  169. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  170. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  171. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  172. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  173. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  174. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  175. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  176. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  177. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  178. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  179. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  180. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  181. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  183. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  184. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  185. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  186. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  187. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  188. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  189. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  190. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  191. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  192. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  194. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  195. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  196. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  197. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  198. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  199. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  200. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  201. package/dist/providers/codex/CodexAdapter.js +162 -0
  202. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  203. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  204. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  205. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  206. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  207. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  208. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  209. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  210. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  211. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  212. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  213. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  214. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  215. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  216. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  217. package/dist/providers/codex/CodexSessionParser.js +262 -0
  218. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  219. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  220. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  221. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  222. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  223. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  224. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  225. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  226. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  227. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  229. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  230. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  231. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  232. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  233. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  234. package/dist/{adapters → providers/copilot}/CopilotAdapter.d.ts +11 -25
  235. package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -0
  236. package/dist/providers/copilot/CopilotAdapter.js +108 -0
  237. package/dist/providers/copilot/CopilotAdapter.js.map +1 -0
  238. package/dist/providers/copilot/CopilotAgentMapper.d.ts +9 -0
  239. package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +1 -0
  240. package/dist/providers/copilot/CopilotAgentMapper.js +37 -0
  241. package/dist/providers/copilot/CopilotAgentMapper.js.map +1 -0
  242. package/dist/providers/copilot/CopilotSessionLocator.d.ts +19 -0
  243. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -0
  244. package/dist/providers/copilot/CopilotSessionLocator.js +41 -0
  245. package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -0
  246. package/dist/providers/copilot/CopilotSessionParser.d.ts +30 -0
  247. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +1 -0
  248. package/dist/providers/copilot/CopilotSessionParser.js +181 -0
  249. package/dist/providers/copilot/CopilotSessionParser.js.map +1 -0
  250. package/dist/providers/gemini/GeminiAgentMapper.d.ts +9 -0
  251. package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +1 -0
  252. package/dist/providers/gemini/GeminiAgentMapper.js +37 -0
  253. package/dist/providers/gemini/GeminiAgentMapper.js.map +1 -0
  254. package/dist/providers/gemini/GeminiCliAdapter.d.ts +52 -0
  255. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -0
  256. package/dist/providers/gemini/GeminiCliAdapter.js +188 -0
  257. package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -0
  258. package/dist/providers/gemini/GeminiSessionLocator.d.ts +30 -0
  259. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +1 -0
  260. package/dist/providers/gemini/GeminiSessionLocator.js +142 -0
  261. package/dist/providers/gemini/GeminiSessionLocator.js.map +1 -0
  262. package/dist/providers/gemini/GeminiSessionParser.d.ts +94 -0
  263. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +1 -0
  264. package/dist/providers/gemini/GeminiSessionParser.js +166 -0
  265. package/dist/providers/gemini/GeminiSessionParser.js.map +1 -0
  266. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  267. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  268. package/dist/providers/pi/PiAdapter.js +153 -0
  269. package/dist/providers/pi/PiAdapter.js.map +1 -0
  270. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  271. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  272. package/dist/providers/pi/PiAgentMapper.js +37 -0
  273. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  274. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  275. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  276. package/dist/providers/pi/PiSessionLocator.js +79 -0
  277. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  278. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  279. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  280. package/dist/providers/pi/PiSessionParser.js +191 -0
  281. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  282. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  283. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  284. package/dist/providers/pi/PiSessionTracker.js +69 -0
  285. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  286. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  287. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  288. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  289. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  290. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  291. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  292. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  293. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  294. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  295. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  296. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  297. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  298. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  299. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  300. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  301. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  302. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  303. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  304. package/dist/readiness/AgentReadiness.d.ts +6 -6
  305. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  306. package/dist/readiness/AgentReadiness.js +130 -130
  307. package/dist/readiness/AgentReadiness.js.map +1 -1
  308. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  309. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  310. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  311. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  312. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  313. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  314. package/dist/runtime/RuntimeFactory.js +11 -0
  315. package/dist/runtime/RuntimeFactory.js.map +1 -0
  316. package/dist/runtime/errors.d.ts +27 -0
  317. package/dist/runtime/errors.d.ts.map +1 -0
  318. package/dist/runtime/errors.js +42 -0
  319. package/dist/runtime/errors.js.map +1 -0
  320. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts +18 -0
  321. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -0
  322. package/dist/runtime/herdr/HerdrAgentDiscovery.js +183 -0
  323. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -0
  324. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +36 -0
  325. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  326. package/dist/runtime/herdr/HerdrAgentRuntime.js +202 -0
  327. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  328. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  329. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  330. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  331. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  332. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  333. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  334. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  335. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  336. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +16 -0
  337. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  338. package/dist/runtime/herdr/HerdrResponseParsers.js +107 -0
  339. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  340. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  341. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  342. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  343. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  344. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  345. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  346. package/dist/runtime/tmux/PidPolling.js +24 -0
  347. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  348. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  349. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  350. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  351. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  352. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  353. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  354. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  355. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  356. package/dist/runtime/types.d.ts +54 -0
  357. package/dist/runtime/types.d.ts.map +1 -0
  358. package/dist/runtime/types.js +3 -0
  359. package/dist/runtime/types.js.map +1 -0
  360. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  361. package/dist/terminal/TerminalFocusManager.js +50 -50
  362. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  363. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  364. package/dist/terminal/TmuxManager.js +47 -47
  365. package/dist/terminal/TmuxManager.js.map +1 -1
  366. package/dist/terminal/TtyWriter.d.ts +1 -1
  367. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  368. package/dist/terminal/TtyWriter.js +89 -89
  369. package/dist/terminal/TtyWriter.js.map +1 -1
  370. package/dist/terminal/index.d.ts +4 -4
  371. package/dist/terminal/index.js +3 -3
  372. package/dist/terminal/index.js.map +1 -1
  373. package/dist/utils/AgentRegistry.d.ts +10 -2
  374. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  375. package/dist/utils/AgentRegistry.js +59 -26
  376. package/dist/utils/AgentRegistry.js.map +1 -1
  377. package/dist/utils/agent-requests.d.ts.map +1 -1
  378. package/dist/utils/agent-requests.js +5 -5
  379. package/dist/utils/agent-requests.js.map +1 -1
  380. package/dist/utils/agents.d.ts +2 -2
  381. package/dist/utils/agents.d.ts.map +1 -1
  382. package/dist/utils/agents.js +15 -15
  383. package/dist/utils/agents.js.map +1 -1
  384. package/dist/utils/applescript.js +1 -1
  385. package/dist/utils/applescript.js.map +1 -1
  386. package/dist/utils/index.d.ts +6 -6
  387. package/dist/utils/index.d.ts.map +1 -1
  388. package/dist/utils/index.js +4 -4
  389. package/dist/utils/index.js.map +1 -1
  390. package/dist/utils/matching.d.ts +2 -2
  391. package/dist/utils/matching.d.ts.map +1 -1
  392. package/dist/utils/matching.js +4 -4
  393. package/dist/utils/matching.js.map +1 -1
  394. package/dist/utils/process.d.ts +1 -1
  395. package/dist/utils/process.d.ts.map +1 -1
  396. package/dist/utils/process.js +74 -74
  397. package/dist/utils/process.js.map +1 -1
  398. package/dist/utils/session.d.ts +1 -1
  399. package/dist/utils/session.d.ts.map +1 -1
  400. package/dist/utils/session.js +7 -7
  401. package/dist/utils/session.js.map +1 -1
  402. package/dist/utils/sortAgents.d.ts +2 -2
  403. package/dist/utils/sortAgents.d.ts.map +1 -1
  404. package/dist/utils/sortAgents.js +5 -5
  405. package/dist/utils/sortAgents.js.map +1 -1
  406. package/package.json +18 -19
  407. package/src/AgentManager.ts +338 -274
  408. package/src/__tests__/AgentManager.test.ts +1143 -907
  409. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  410. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  411. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  412. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +511 -455
  413. package/src/__tests__/capacity/codex.test.ts +178 -91
  414. package/src/__tests__/capacity/index.test.ts +27 -18
  415. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  416. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  417. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  418. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  419. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  420. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  421. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  422. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  423. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  424. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  425. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  426. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  427. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  428. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  429. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  430. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  431. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  432. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  433. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  434. package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +602 -0
  435. package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +1299 -0
  436. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  437. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  438. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  439. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  440. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  441. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  442. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  443. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  444. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  445. package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
  446. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  447. package/src/__tests__/runtime/HerdrAgentDiscovery.test.ts +131 -0
  448. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +377 -0
  449. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  450. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  451. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  452. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  453. package/src/__tests__/utils/AgentRegistry.test.ts +516 -402
  454. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  455. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  456. package/src/__tests__/utils/agents.test.ts +20 -20
  457. package/src/__tests__/utils/matching.test.ts +206 -171
  458. package/src/__tests__/utils/process.test.ts +276 -262
  459. package/src/__tests__/utils/session.test.ts +133 -139
  460. package/src/adapters/AgentAdapter.ts +134 -126
  461. package/src/adapters/GrokCliAdapter.ts +353 -342
  462. package/src/adapters/OpenCodeAdapter.ts +289 -259
  463. package/src/adapters/index.ts +15 -9
  464. package/src/capacity/codex.ts +137 -84
  465. package/src/capacity/index.ts +18 -13
  466. package/src/capacity/types.ts +1 -1
  467. package/src/database/connection.ts +73 -68
  468. package/src/database/index.ts +6 -6
  469. package/src/database/migrations/005_agent_runtime.sql +2 -0
  470. package/src/database/schema.ts +40 -38
  471. package/src/durable/DurableAgent.ts +85 -85
  472. package/src/durable/DurableAgentRepository.ts +409 -260
  473. package/src/durable/process.ts +22 -21
  474. package/src/durable/run.ts +61 -51
  475. package/src/durable/utils.ts +46 -41
  476. package/src/index.ts +151 -103
  477. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  478. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  479. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  480. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  481. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  482. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  483. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  484. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  485. package/src/providers/codex/CodexAdapter.ts +205 -0
  486. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  487. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  488. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  489. package/src/providers/codex/CodexSessionParser.ts +385 -0
  490. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  491. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  492. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  493. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  494. package/src/providers/copilot/CopilotAdapter.ts +145 -0
  495. package/src/providers/copilot/CopilotAgentMapper.ts +36 -0
  496. package/src/providers/copilot/CopilotSessionLocator.ts +57 -0
  497. package/src/providers/copilot/CopilotSessionParser.ts +289 -0
  498. package/src/providers/gemini/GeminiAgentMapper.ts +36 -0
  499. package/src/providers/gemini/GeminiCliAdapter.ts +266 -0
  500. package/src/providers/gemini/GeminiSessionLocator.ts +183 -0
  501. package/src/providers/gemini/GeminiSessionParser.ts +271 -0
  502. package/src/providers/pi/PiAdapter.ts +183 -0
  503. package/src/providers/pi/PiAgentMapper.ts +36 -0
  504. package/src/providers/pi/PiSessionLocator.ts +95 -0
  505. package/src/providers/pi/PiSessionParser.ts +284 -0
  506. package/src/providers/pi/PiSessionTracker.ts +87 -0
  507. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  508. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  509. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  510. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  511. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  512. package/src/readiness/AgentReadiness.ts +585 -513
  513. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  514. package/src/runtime/RuntimeFactory.ts +13 -0
  515. package/src/runtime/errors.ts +50 -0
  516. package/src/runtime/herdr/HerdrAgentDiscovery.ts +178 -0
  517. package/src/runtime/herdr/HerdrAgentRuntime.ts +216 -0
  518. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  519. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  520. package/src/runtime/herdr/HerdrResponseParsers.ts +86 -0
  521. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  522. package/src/runtime/tmux/PidPolling.ts +34 -0
  523. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  524. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  525. package/src/runtime/types.ts +56 -0
  526. package/src/terminal/TerminalFocusManager.ts +215 -212
  527. package/src/terminal/TmuxManager.ts +99 -92
  528. package/src/terminal/TtyWriter.ts +203 -194
  529. package/src/terminal/index.ts +4 -4
  530. package/src/utils/AgentRegistry.ts +301 -238
  531. package/src/utils/agent-requests.ts +16 -16
  532. package/src/utils/agents.ts +41 -38
  533. package/src/utils/applescript.ts +4 -4
  534. package/src/utils/index.ts +12 -6
  535. package/src/utils/matching.ts +43 -43
  536. package/src/utils/process.ts +261 -258
  537. package/src/utils/session.ts +66 -66
  538. package/src/utils/sortAgents.ts +35 -33
  539. package/tsconfig.json +2 -8
  540. package/vitest.config.ts +16 -16
  541. package/.eslintrc.json +0 -31
  542. package/dist/__tests__/adapters/CopilotAdapter.test.js +0 -630
  543. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +0 -1
  544. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +0 -1384
  545. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +0 -1
  546. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  547. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  548. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  549. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  550. package/dist/adapters/CodexAdapter.d.ts +0 -109
  551. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  552. package/dist/adapters/CodexAdapter.js +0 -710
  553. package/dist/adapters/CodexAdapter.js.map +0 -1
  554. package/dist/adapters/CopilotAdapter.d.ts.map +0 -1
  555. package/dist/adapters/CopilotAdapter.js +0 -329
  556. package/dist/adapters/CopilotAdapter.js.map +0 -1
  557. package/dist/adapters/GeminiCliAdapter.d.ts +0 -98
  558. package/dist/adapters/GeminiCliAdapter.d.ts.map +0 -1
  559. package/dist/adapters/GeminiCliAdapter.js +0 -513
  560. package/dist/adapters/GeminiCliAdapter.js.map +0 -1
  561. package/dist/adapters/PiAdapter.d.ts +0 -63
  562. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  563. package/dist/adapters/PiAdapter.js +0 -453
  564. package/dist/adapters/PiAdapter.js.map +0 -1
  565. package/src/__tests__/adapters/CopilotAdapter.test.ts +0 -510
  566. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +0 -1259
  567. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  568. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  569. package/src/adapters/CodexAdapter.ts +0 -923
  570. package/src/adapters/CopilotAdapter.ts +0 -473
  571. package/src/adapters/GeminiCliAdapter.ts +0 -701
  572. 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,82 +99,83 @@ 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
  });
110
110
  afterEach(()=>{
111
+ adapter.close();
111
112
  fs.rmSync(tmpDir, {
112
113
  recursive: true,
113
114
  force: true
114
115
  });
115
116
  vi.restoreAllMocks();
116
117
  });
117
- describe('type', ()=>{
118
- it('exposes opencode type', ()=>{
119
- expect(adapter.type).toBe('opencode');
118
+ describe("type", ()=>{
119
+ it("exposes opencode type", ()=>{
120
+ expect(adapter.type).toBe("opencode");
120
121
  });
121
122
  });
122
- describe('canHandle', ()=>{
123
- it('returns true for opencode command', ()=>{
123
+ describe("canHandle", ()=>{
124
+ it("returns true for opencode command", ()=>{
124
125
  expect(adapter.canHandle({
125
126
  pid: 1,
126
- command: 'opencode',
127
- cwd: '/repo',
128
- tty: 'ttys001'
127
+ command: "opencode",
128
+ cwd: "/repo",
129
+ tty: "ttys001"
129
130
  })).toBe(true);
130
131
  });
131
- it('returns true for full path opencode', ()=>{
132
+ it("returns true for full path opencode", ()=>{
132
133
  expect(adapter.canHandle({
133
134
  pid: 2,
134
- command: '/usr/local/bin/opencode serve',
135
- cwd: '/repo',
136
- tty: 'ttys002'
135
+ command: "/usr/local/bin/opencode serve",
136
+ cwd: "/repo",
137
+ tty: "ttys002"
137
138
  })).toBe(true);
138
139
  });
139
- it('returns true for opencode.exe with unix-style path', ()=>{
140
+ it("returns true for opencode.exe with unix-style path", ()=>{
140
141
  expect(adapter.canHandle({
141
142
  pid: 3,
142
- command: '/usr/bin/opencode.exe',
143
- cwd: '/repo',
144
- tty: 'ttys003'
143
+ command: "/usr/bin/opencode.exe",
144
+ cwd: "/repo",
145
+ tty: "ttys003"
145
146
  })).toBe(true);
146
147
  });
147
- it('returns false for non-opencode processes', ()=>{
148
+ it("returns false for non-opencode processes", ()=>{
148
149
  expect(adapter.canHandle({
149
150
  pid: 4,
150
- command: 'node server.js',
151
- cwd: '/repo',
152
- tty: 'ttys004'
151
+ command: "node server.js",
152
+ cwd: "/repo",
153
+ tty: "ttys004"
153
154
  })).toBe(false);
154
155
  });
155
- it('returns false when opencode appears only in path args', ()=>{
156
+ it("returns false when opencode appears only in path args", ()=>{
156
157
  expect(adapter.canHandle({
157
158
  pid: 5,
158
- command: 'node /projects/opencode-plugin/index.js',
159
- cwd: '/repo',
160
- tty: 'ttys005'
159
+ command: "node /projects/opencode-plugin/index.js",
160
+ cwd: "/repo",
161
+ tty: "ttys005"
161
162
  })).toBe(false);
162
163
  });
163
164
  });
164
- describe('detectAgents', ()=>{
165
- it('returns empty list when no opencode processes running', async ()=>{
165
+ describe("detectAgents", ()=>{
166
+ it("returns empty list when no opencode processes running", async ()=>{
166
167
  mockedListAgentProcesses.mockReturnValue([]);
167
168
  const agents = await adapter.detectAgents();
168
169
  expect(agents).toEqual([]);
169
- expect(mockedListAgentProcesses).toHaveBeenCalledWith('opencode');
170
+ expect(mockedListAgentProcesses).toHaveBeenCalledWith("opencode");
170
171
  });
171
- it('returns process-only agent when DB does not exist', async ()=>{
172
+ it("returns process-only agent when DB does not exist", async ()=>{
172
173
  const procs = [
173
174
  {
174
175
  pid: 100,
175
- command: 'opencode',
176
- cwd: '/repo',
177
- tty: 'ttys001'
176
+ command: "opencode",
177
+ cwd: "/repo",
178
+ tty: "ttys001"
178
179
  }
179
180
  ];
180
181
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -182,47 +183,47 @@ describe('OpenCodeAdapter', ()=>{
182
183
  const agents = await adapter.detectAgents();
183
184
  expect(agents).toHaveLength(1);
184
185
  expect(agents[0]).toMatchObject({
185
- type: 'opencode',
186
+ type: "opencode",
186
187
  status: AgentStatus.RUNNING,
187
188
  pid: 100,
188
- projectPath: '/repo',
189
- sessionId: 'pid-100',
190
- summary: 'OpenCode process running'
189
+ projectPath: "/repo",
190
+ sessionId: "pid-100",
191
+ summary: "OpenCode process running"
191
192
  });
192
193
  });
193
- it('returns process-only agent when no session matches CWD', async ()=>{
194
+ it("returns process-only agent when no session matches CWD", async ()=>{
194
195
  const procs = [
195
196
  {
196
197
  pid: 100,
197
- command: 'opencode',
198
- cwd: '/repo',
199
- tty: 'ttys001'
198
+ command: "opencode",
199
+ cwd: "/repo",
200
+ tty: "ttys001"
200
201
  }
201
202
  ];
202
203
  mockedListAgentProcesses.mockReturnValue(procs);
203
204
  mockedEnrichProcesses.mockReturnValue(procs);
204
- fs.writeFileSync(dbPath, ''); // file exists but empty → sqlite throws
205
+ fs.writeFileSync(dbPath, ""); // file exists but empty → sqlite throws
205
206
  const db = makeDb({
206
207
  session: []
207
208
  }); // no matching session
208
- vi.doMock('better-sqlite3', ()=>makeDbConstructor(db));
209
+ vi.doMock("better-sqlite3", ()=>makeDbConstructor(db));
209
210
  adapter.db = db;
210
211
  const agents = await adapter.detectAgents();
211
212
  expect(agents).toHaveLength(1);
212
213
  expect(agents[0]).toMatchObject({
213
- type: 'opencode',
214
+ type: "opencode",
214
215
  status: AgentStatus.RUNNING,
215
- sessionId: 'pid-100'
216
+ sessionId: "pid-100"
216
217
  });
217
218
  });
218
- it('returns waiting when assistant turn has time.completed set', async ()=>{
219
+ it("returns waiting when assistant turn has time.completed set", async ()=>{
219
220
  const now = Date.now();
220
221
  const procs = [
221
222
  {
222
223
  pid: 200,
223
- command: 'opencode',
224
- cwd: '/my-project',
225
- tty: 'ttys002'
224
+ command: "opencode",
225
+ cwd: "/my-project",
226
+ tty: "ttys002"
226
227
  }
227
228
  ];
228
229
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -230,13 +231,13 @@ describe('OpenCodeAdapter', ()=>{
230
231
  const db = makeDb({
231
232
  session: [
232
233
  {
233
- id: 'sess-001',
234
- directory: '/my-project',
234
+ id: "sess-001",
235
+ directory: "/my-project",
235
236
  time_created: now - 60000
236
237
  }
237
238
  ],
238
239
  lastMessage: {
239
- role: 'assistant',
240
+ role: "assistant",
240
241
  timeUpdated: now - 60_000
241
242
  },
242
243
  lastAssistant: {
@@ -244,27 +245,27 @@ describe('OpenCodeAdapter', ()=>{
244
245
  errored: null
245
246
  },
246
247
  firstUserText: {
247
- text: 'Refactor the auth module'
248
+ text: "Refactor the auth module"
248
249
  }
249
250
  });
250
251
  adapter.db = db;
251
252
  const agents = await adapter.detectAgents();
252
253
  expect(agents).toHaveLength(1);
253
254
  expect(agents[0]).toMatchObject({
254
- type: 'opencode',
255
+ type: "opencode",
255
256
  status: AgentStatus.WAITING,
256
- sessionId: 'sess-001',
257
- summary: 'Refactor the auth module'
257
+ sessionId: "sess-001",
258
+ summary: "Refactor the auth module"
258
259
  });
259
260
  });
260
- it('returns running when assistant turn has no time.completed (in-progress, any age)', async ()=>{
261
+ it("returns running when assistant turn has no time.completed (in-progress, any age)", async ()=>{
261
262
  const now = Date.now();
262
263
  const procs = [
263
264
  {
264
265
  pid: 250,
265
- command: 'opencode',
266
- cwd: '/proj',
267
- tty: 'ttys004'
266
+ command: "opencode",
267
+ cwd: "/proj",
268
+ tty: "ttys004"
268
269
  }
269
270
  ];
270
271
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -272,13 +273,13 @@ describe('OpenCodeAdapter', ()=>{
272
273
  const db = makeDb({
273
274
  session: [
274
275
  {
275
- id: 'sess-tool',
276
- directory: '/proj',
276
+ id: "sess-tool",
277
+ directory: "/proj",
277
278
  time_created: now - 180_000
278
279
  }
279
280
  ],
280
281
  lastMessage: {
281
- role: 'assistant',
282
+ role: "assistant",
282
283
  timeUpdated: now - 120_000
283
284
  },
284
285
  lastAssistant: {
@@ -286,24 +287,24 @@ describe('OpenCodeAdapter', ()=>{
286
287
  errored: null
287
288
  },
288
289
  firstUserText: {
289
- text: 'Run the build'
290
+ text: "Run the build"
290
291
  }
291
292
  });
292
293
  adapter.db = db;
293
294
  const agents = await adapter.detectAgents();
294
295
  expect(agents[0]).toMatchObject({
295
296
  status: AgentStatus.RUNNING,
296
- sessionId: 'sess-tool'
297
+ sessionId: "sess-tool"
297
298
  });
298
299
  });
299
- it('returns running between steps (the bug fix) — no time.completed even during quiet moment', async ()=>{
300
+ it("returns running between steps (the bug fix) — no time.completed even during quiet moment", async ()=>{
300
301
  const now = Date.now();
301
302
  const procs = [
302
303
  {
303
304
  pid: 260,
304
- command: 'opencode',
305
- cwd: '/proj-b',
306
- tty: 'ttys005'
305
+ command: "opencode",
306
+ cwd: "/proj-b",
307
+ tty: "ttys005"
307
308
  }
308
309
  ];
309
310
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -311,13 +312,13 @@ describe('OpenCodeAdapter', ()=>{
311
312
  const db = makeDb({
312
313
  session: [
313
314
  {
314
- id: 'sess-mid',
315
- directory: '/proj-b',
315
+ id: "sess-mid",
316
+ directory: "/proj-b",
316
317
  time_created: now - 60_000
317
318
  }
318
319
  ],
319
320
  lastMessage: {
320
- role: 'assistant',
321
+ role: "assistant",
321
322
  timeUpdated: now - 45_000
322
323
  },
323
324
  lastAssistant: {
@@ -330,7 +331,7 @@ describe('OpenCodeAdapter', ()=>{
330
331
  const agents = await adapter.detectAgents();
331
332
  expect(agents[0].status).toBe(AgentStatus.RUNNING);
332
333
  });
333
- it('returns waiting even when latest user message was metadata-updated after assistant completion', async ()=>{
334
+ it("returns waiting even when latest user message was metadata-updated after assistant completion", async ()=>{
334
335
  // Regression: OpenCode updates user.message.time_updated when appending
335
336
  // summary diffs after a turn finishes. Ordering by time_created (not
336
337
  // time_updated) keeps the assistant message correctly identified as latest.
@@ -338,9 +339,9 @@ describe('OpenCodeAdapter', ()=>{
338
339
  const procs = [
339
340
  {
340
341
  pid: 270,
341
- command: 'opencode',
342
- cwd: '/proj-c',
343
- tty: 'ttys006'
342
+ command: "opencode",
343
+ cwd: "/proj-c",
344
+ tty: "ttys006"
344
345
  }
345
346
  ];
346
347
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -349,13 +350,13 @@ describe('OpenCodeAdapter', ()=>{
349
350
  const db = makeDb({
350
351
  session: [
351
352
  {
352
- id: 'sess-meta',
353
- directory: '/proj-c',
353
+ id: "sess-meta",
354
+ directory: "/proj-c",
354
355
  time_created: now - 120_000
355
356
  }
356
357
  ],
357
358
  lastMessage: {
358
- role: 'assistant',
359
+ role: "assistant",
359
360
  timeUpdated: now - 30_000
360
361
  },
361
362
  lastAssistant: {
@@ -368,14 +369,14 @@ describe('OpenCodeAdapter', ()=>{
368
369
  const agents = await adapter.detectAgents();
369
370
  expect(agents[0].status).toBe(AgentStatus.WAITING);
370
371
  });
371
- it('returns running agent when last role is user (no assistant message yet)', async ()=>{
372
+ it("returns running agent when last role is user (no assistant message yet)", async ()=>{
372
373
  const now = Date.now();
373
374
  const procs = [
374
375
  {
375
376
  pid: 300,
376
- command: 'opencode',
377
- cwd: '/work',
378
- tty: 'ttys003'
377
+ command: "opencode",
378
+ cwd: "/work",
379
+ tty: "ttys003"
379
380
  }
380
381
  ];
381
382
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -383,36 +384,36 @@ describe('OpenCodeAdapter', ()=>{
383
384
  const db = makeDb({
384
385
  session: [
385
386
  {
386
- id: 'sess-002',
387
- directory: '/work',
387
+ id: "sess-002",
388
+ directory: "/work",
388
389
  time_created: now - 30000
389
390
  }
390
391
  ],
391
392
  lastMessage: {
392
- role: 'user',
393
+ role: "user",
393
394
  timeUpdated: now - 30_000
394
395
  },
395
396
  lastAssistant: null,
396
397
  firstUserText: {
397
- text: 'Add unit tests'
398
+ text: "Add unit tests"
398
399
  }
399
400
  });
400
401
  adapter.db = db;
401
402
  const agents = await adapter.detectAgents();
402
403
  expect(agents[0]).toMatchObject({
403
404
  status: AgentStatus.RUNNING,
404
- sessionId: 'sess-002'
405
+ sessionId: "sess-002"
405
406
  });
406
407
  });
407
- it('returns idle agent when last activity exceeds threshold', async ()=>{
408
+ it("returns idle agent when last activity exceeds threshold", async ()=>{
408
409
  const now = Date.now();
409
410
  const staleTime = now - 10 * 60 * 1000; // 10 minutes ago
410
411
  const procs = [
411
412
  {
412
413
  pid: 400,
413
- command: 'opencode',
414
- cwd: '/old-work',
415
- tty: 'ttys004'
414
+ command: "opencode",
415
+ cwd: "/old-work",
416
+ tty: "ttys004"
416
417
  }
417
418
  ];
418
419
  mockedListAgentProcesses.mockReturnValue(procs);
@@ -420,13 +421,13 @@ describe('OpenCodeAdapter', ()=>{
420
421
  const db = makeDb({
421
422
  session: [
422
423
  {
423
- id: 'sess-003',
424
- directory: '/old-work',
424
+ id: "sess-003",
425
+ directory: "/old-work",
425
426
  time_created: staleTime
426
427
  }
427
428
  ],
428
429
  lastMessage: {
429
- role: 'assistant',
430
+ role: "assistant",
430
431
  timeUpdated: staleTime
431
432
  },
432
433
  lastAssistant: {
@@ -439,31 +440,31 @@ describe('OpenCodeAdapter', ()=>{
439
440
  const agents = await adapter.detectAgents();
440
441
  expect(agents[0]).toMatchObject({
441
442
  status: AgentStatus.IDLE,
442
- sessionId: 'sess-003'
443
+ sessionId: "sess-003"
443
444
  });
444
445
  });
445
446
  });
446
- describe('getConversation', ()=>{
447
- it('returns empty array for invalid session ref', ()=>{
448
- const messages = adapter.getConversation('/no-separator-here');
447
+ describe("getConversation", ()=>{
448
+ it("returns empty array for invalid session ref", ()=>{
449
+ const messages = adapter.getConversation("/no-separator-here");
449
450
  expect(messages).toEqual([]);
450
451
  });
451
- it('returns text messages from session parts', ()=>{
452
+ it("returns text messages from session parts", ()=>{
452
453
  const db = makeDb({
453
454
  parts: [
454
455
  {
455
- role: 'user',
456
+ role: "user",
456
457
  partData: JSON.stringify({
457
- type: 'text',
458
- text: 'Hello agent'
458
+ type: "text",
459
+ text: "Hello agent"
459
460
  }),
460
461
  timeCreated: 1000
461
462
  },
462
463
  {
463
- role: 'assistant',
464
+ role: "assistant",
464
465
  partData: JSON.stringify({
465
- type: 'text',
466
- text: 'Hi, how can I help?'
466
+ type: "text",
467
+ text: "Hi, how can I help?"
467
468
  }),
468
469
  timeCreated: 2000
469
470
  }
@@ -474,30 +475,30 @@ describe('OpenCodeAdapter', ()=>{
474
475
  const messages = adapter.getConversation(ref);
475
476
  expect(messages).toHaveLength(2);
476
477
  expect(messages[0]).toEqual({
477
- role: 'user',
478
- content: 'Hello agent'
478
+ role: "user",
479
+ content: "Hello agent"
479
480
  });
480
481
  expect(messages[1]).toEqual({
481
- role: 'assistant',
482
- content: 'Hi, how can I help?'
482
+ role: "assistant",
483
+ content: "Hi, how can I help?"
483
484
  });
484
485
  });
485
- it('skips reasoning parts when verbose is false', ()=>{
486
+ it("skips reasoning parts when verbose is false", ()=>{
486
487
  const db = makeDb({
487
488
  parts: [
488
489
  {
489
- role: 'assistant',
490
+ role: "assistant",
490
491
  partData: JSON.stringify({
491
- type: 'reasoning',
492
- reasoning: 'internal thought'
492
+ type: "reasoning",
493
+ reasoning: "internal thought"
493
494
  }),
494
495
  timeCreated: 1000
495
496
  },
496
497
  {
497
- role: 'assistant',
498
+ role: "assistant",
498
499
  partData: JSON.stringify({
499
- type: 'text',
500
- text: 'Answer'
500
+ type: "text",
501
+ text: "Answer"
501
502
  }),
502
503
  timeCreated: 2000
503
504
  }
@@ -506,24 +507,24 @@ describe('OpenCodeAdapter', ()=>{
506
507
  adapter.db = db;
507
508
  const messages = adapter.getConversation(`${dbPath}::sess-x`);
508
509
  expect(messages).toHaveLength(1);
509
- expect(messages[0].content).toBe('Answer');
510
+ expect(messages[0].content).toBe("Answer");
510
511
  });
511
- it('includes reasoning and tool parts when verbose is true', ()=>{
512
+ it("includes reasoning and tool parts when verbose is true", ()=>{
512
513
  const db = makeDb({
513
514
  parts: [
514
515
  {
515
- role: 'assistant',
516
+ role: "assistant",
516
517
  partData: JSON.stringify({
517
- type: 'reasoning',
518
- reasoning: 'my thinking'
518
+ type: "reasoning",
519
+ reasoning: "my thinking"
519
520
  }),
520
521
  timeCreated: 1000
521
522
  },
522
523
  {
523
- role: 'assistant',
524
+ role: "assistant",
524
525
  partData: JSON.stringify({
525
- type: 'tool',
526
- tool: 'read_file'
526
+ type: "tool",
527
+ tool: "read_file"
527
528
  }),
528
529
  timeCreated: 2000
529
530
  }
@@ -534,68 +535,68 @@ describe('OpenCodeAdapter', ()=>{
534
535
  verbose: true
535
536
  });
536
537
  expect(messages).toHaveLength(2);
537
- expect(messages[0].content).toContain('my thinking');
538
- expect(messages[1].content).toContain('read_file');
538
+ expect(messages[0].content).toContain("my thinking");
539
+ expect(messages[1].content).toContain("read_file");
539
540
  });
540
- it('returns empty array when DB cannot be opened', ()=>{
541
+ it("returns empty array when DB cannot be opened", ()=>{
541
542
  adapter.db = null;
542
543
  const messages = adapter.getConversation(`${dbPath}::sess-z`);
543
544
  expect(messages).toEqual([]);
544
545
  });
545
546
  });
546
- describe('listSessions', ()=>{
547
- it('returns empty array when DB does not exist', async ()=>{
547
+ describe("listSessions", ()=>{
548
+ it("returns empty array when DB does not exist", async ()=>{
548
549
  const sessions = await adapter.listSessions();
549
550
  expect(sessions).toEqual([]);
550
551
  });
551
- it('returns all sessions from DB', async ()=>{
552
+ it("returns all sessions from DB", async ()=>{
552
553
  const now = Date.now();
553
554
  const db = makeDb({
554
555
  session: [
555
556
  {
556
- id: 'sess-a',
557
- directory: '/proj-a',
557
+ id: "sess-a",
558
+ directory: "/proj-a",
558
559
  time_created: now - 3000
559
560
  },
560
561
  {
561
- id: 'sess-b',
562
- directory: '/proj-b',
562
+ id: "sess-b",
563
+ directory: "/proj-b",
563
564
  time_created: now - 6000
564
565
  }
565
566
  ],
566
567
  lastMessage: null,
567
568
  lastAssistant: null,
568
569
  firstUserText: {
569
- text: 'Build the feature'
570
+ text: "Build the feature"
570
571
  }
571
572
  });
572
573
  adapter.db = db;
573
574
  const sessions = await adapter.listSessions();
574
575
  expect(sessions).toHaveLength(2);
575
576
  expect(sessions[0]).toMatchObject({
576
- type: 'opencode',
577
- sessionId: 'sess-a',
578
- cwd: '/proj-a'
577
+ type: "opencode",
578
+ sessionId: "sess-a",
579
+ cwd: "/proj-a"
579
580
  });
580
581
  expect(sessions[1]).toMatchObject({
581
- type: 'opencode',
582
- sessionId: 'sess-b',
583
- cwd: '/proj-b'
582
+ type: "opencode",
583
+ sessionId: "sess-b",
584
+ cwd: "/proj-b"
584
585
  });
585
- expect(sessions[0].sessionFilePath).toContain('sess-a');
586
+ expect(sessions[0].sessionFilePath).toContain("sess-a");
586
587
  });
587
- it('filters sessions by cwd when opts.cwd is set', async ()=>{
588
+ it("filters sessions by cwd when opts.cwd is set", async ()=>{
588
589
  const now = Date.now();
589
590
  const db = makeDb({
590
591
  session: [
591
592
  {
592
- id: 'sess-a',
593
- directory: '/proj-a',
593
+ id: "sess-a",
594
+ directory: "/proj-a",
594
595
  time_created: now - 3000
595
596
  },
596
597
  {
597
- id: 'sess-b',
598
- directory: '/proj-b',
598
+ id: "sess-b",
599
+ directory: "/proj-b",
599
600
  time_created: now - 6000
600
601
  }
601
602
  ],
@@ -605,18 +606,18 @@ describe('OpenCodeAdapter', ()=>{
605
606
  });
606
607
  adapter.db = db;
607
608
  const sessions = await adapter.listSessions({
608
- cwd: '/proj-a'
609
+ cwd: "/proj-a"
609
610
  });
610
611
  expect(sessions).toHaveLength(1);
611
- expect(sessions[0].sessionId).toBe('sess-a');
612
+ expect(sessions[0].sessionId).toBe("sess-a");
612
613
  });
613
- it('uses session time_created as startedAt and lastActive when no parts exist', async ()=>{
614
+ it("uses session time_created as startedAt and lastActive when no parts exist", async ()=>{
614
615
  const timeCreated = Date.now() - 120000;
615
616
  const db = makeDb({
616
617
  session: [
617
618
  {
618
- id: 'sess-c',
619
- directory: '/repo',
619
+ id: "sess-c",
620
+ directory: "/repo",
620
621
  time_created: timeCreated
621
622
  }
622
623
  ],