@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
@@ -11,124 +11,137 @@
11
11
  * DB row without extending the AgentAdapter interface.
12
12
  */
13
13
 
14
- import * as fs from 'fs';
15
- import * as path from 'path';
16
- import Database from 'better-sqlite3';
14
+ import * as fs from "fs";
15
+ import * as path from "path";
16
+ import Database from "better-sqlite3";
17
17
  import type {
18
- AgentAdapter,
19
- AgentInfo,
20
- ProcessInfo,
21
- ConversationMessage,
22
- SessionSummary,
23
- ListSessionsOptions,
24
- AgentDetectionContext,
25
- } from './AgentAdapter.js';
26
- import { AgentStatus } from './AgentAdapter.js';
27
- import { captureProcessSnapshot, executableBasename, filterByProcessNames } from '../utils/process.js';
28
- import { generateAgentName } from '../utils/matching.js';
29
-
30
- const SESSION_REF_SEP = '::';
18
+ AgentAdapter,
19
+ AgentInfo,
20
+ ProcessInfo,
21
+ ConversationMessage,
22
+ SessionSummary,
23
+ ListSessionsOptions,
24
+ AgentDetectionContext,
25
+ } from "./AgentAdapter.js";
26
+ import { AgentStatus } from "./AgentAdapter.js";
27
+ import {
28
+ captureProcessSnapshot,
29
+ executableBasename,
30
+ filterByProcessNames,
31
+ } from "../utils/process.js";
32
+ import { generateAgentName } from "../utils/matching.js";
33
+
34
+ const SESSION_REF_SEP = "::";
31
35
 
32
36
  function encodeSessionRef(dbPath: string, sessionId: string): string {
33
- return `${dbPath}${SESSION_REF_SEP}${sessionId}`;
37
+ return `${dbPath}${SESSION_REF_SEP}${sessionId}`;
34
38
  }
35
39
 
36
40
  function decodeSessionRef(ref: string): { dbPath: string; sessionId: string } | null {
37
- const idx = ref.lastIndexOf(SESSION_REF_SEP);
38
- if (idx === -1) return null;
39
- return { dbPath: ref.slice(0, idx), sessionId: ref.slice(idx + SESSION_REF_SEP.length) };
41
+ const idx = ref.lastIndexOf(SESSION_REF_SEP);
42
+ if (idx === -1) return null;
43
+ return { dbPath: ref.slice(0, idx), sessionId: ref.slice(idx + SESSION_REF_SEP.length) };
40
44
  }
41
45
 
42
46
  interface OpenCodeSession {
43
- sessionId: string;
44
- directory: string;
45
- timeCreated: number;
47
+ sessionId: string;
48
+ directory: string;
49
+ timeCreated: number;
46
50
  }
47
51
 
48
52
  interface OpenCodeSessionStats {
49
- lastRole: string | null;
50
- lastTimeUpdated: number;
51
- /** OpenCode writes `time.completed` on the assistant message only when the turn finishes. */
52
- lastAssistantCompleted: boolean;
53
- lastAssistantErrored: boolean;
54
- summary: string;
53
+ lastRole: string | null;
54
+ lastTimeUpdated: number;
55
+ /** OpenCode writes `time.completed` on the assistant message only when the turn finishes. */
56
+ lastAssistantCompleted: boolean;
57
+ lastAssistantErrored: boolean;
58
+ summary: string;
55
59
  }
56
60
 
57
61
  export class OpenCodeAdapter implements AgentAdapter {
58
- readonly type = 'opencode' as const;
59
- readonly processNames = ['opencode'] as const;
60
-
61
- private static readonly IDLE_THRESHOLD_MINUTES = 5;
62
-
63
- private readonly dbPath: string;
64
- private db: Database.Database | null = null;
65
-
66
- constructor() {
67
- this.dbPath = OpenCodeAdapter.resolveDbPath();
68
- const cleanup = (): void => this.close();
69
- process.once('exit', cleanup);
70
- process.once('SIGINT', cleanup);
71
- process.once('SIGTERM', cleanup);
62
+ readonly type = "opencode" as const;
63
+ readonly processNames = ["opencode"] as const;
64
+
65
+ private static readonly IDLE_THRESHOLD_MINUTES = 5;
66
+
67
+ private readonly dbPath: string;
68
+ private readonly cleanup = (): void => this.close();
69
+ private db: Database.Database | null = null;
70
+
71
+ constructor() {
72
+ this.dbPath = OpenCodeAdapter.resolveDbPath();
73
+ process.once("exit", this.cleanup);
74
+ process.once("SIGINT", this.cleanup);
75
+ process.once("SIGTERM", this.cleanup);
76
+ }
77
+
78
+ close(): void {
79
+ process.off("exit", this.cleanup);
80
+ process.off("SIGINT", this.cleanup);
81
+ process.off("SIGTERM", this.cleanup);
82
+
83
+ if (this.db) {
84
+ try {
85
+ this.db.close();
86
+ } catch {
87
+ /* ignore */
88
+ }
89
+ this.db = null;
72
90
  }
73
-
74
- close(): void {
75
- if (this.db) {
76
- try { this.db.close(); } catch { /* ignore */ }
77
- this.db = null;
78
- }
91
+ }
92
+
93
+ private static resolveDbPath(): string {
94
+ const xdg = process.env.XDG_DATA_HOME;
95
+ const home = process.env.HOME || process.env.USERPROFILE || "";
96
+ const base = xdg || path.join(home, ".local", "share");
97
+ return path.join(base, "opencode", "opencode.db");
98
+ }
99
+
100
+ canHandle(processInfo: ProcessInfo): boolean {
101
+ const base = executableBasename(processInfo.command);
102
+ return base === "opencode" || base === "opencode.exe";
103
+ }
104
+
105
+ async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
106
+ const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));
107
+ const relevant = filterByProcessNames(snapshot, this.processNames);
108
+ const processes = relevant.filter((process) => this.canHandle(process));
109
+ if (processes.length === 0) return [];
110
+
111
+ const db = this.openDb();
112
+ if (!db) return processes.map((p) => this.mapProcessOnlyAgent(p));
113
+
114
+ const agents: AgentInfo[] = [];
115
+ for (const proc of processes) {
116
+ if (!proc.cwd) {
117
+ agents.push(this.mapProcessOnlyAgent(proc));
118
+ continue;
119
+ }
120
+
121
+ const session = this.findSessionForDirectory(db, proc.cwd);
122
+ if (!session) {
123
+ agents.push(this.mapProcessOnlyAgent(proc));
124
+ continue;
125
+ }
126
+
127
+ const stats = this.getSessionStats(db, session.sessionId);
128
+ agents.push(this.mapSessionToAgent(session, stats, proc));
79
129
  }
80
130
 
81
- private static resolveDbPath(): string {
82
- const xdg = process.env.XDG_DATA_HOME;
83
- const home = process.env.HOME || process.env.USERPROFILE || '';
84
- const base = xdg || path.join(home, '.local', 'share');
85
- return path.join(base, 'opencode', 'opencode.db');
86
- }
87
-
88
- canHandle(processInfo: ProcessInfo): boolean {
89
- const base = executableBasename(processInfo.command);
90
- return base === 'opencode' || base === 'opencode.exe';
91
- }
92
-
93
- async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
94
- const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);
95
- const relevant = filterByProcessNames(snapshot, this.processNames);
96
- const processes = relevant.filter((process) => this.canHandle(process));
97
- if (processes.length === 0) return [];
98
-
99
- const db = this.openDb();
100
- if (!db) return processes.map((p) => this.mapProcessOnlyAgent(p));
101
-
102
- const agents: AgentInfo[] = [];
103
- for (const proc of processes) {
104
- if (!proc.cwd) {
105
- agents.push(this.mapProcessOnlyAgent(proc));
106
- continue;
107
- }
108
-
109
- const session = this.findSessionForDirectory(db, proc.cwd);
110
- if (!session) {
111
- agents.push(this.mapProcessOnlyAgent(proc));
112
- continue;
113
- }
114
-
115
- const stats = this.getSessionStats(db, session.sessionId);
116
- agents.push(this.mapSessionToAgent(session, stats, proc));
117
- }
118
-
119
- return agents;
120
- }
131
+ return agents;
132
+ }
121
133
 
122
- getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
123
- const verbose = options?.verbose ?? false;
124
- const ref = decodeSessionRef(sessionFilePath);
125
- if (!ref) return [];
134
+ getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
135
+ const verbose = options?.verbose ?? false;
136
+ const ref = decodeSessionRef(sessionFilePath);
137
+ if (!ref) return [];
126
138
 
127
- const db = this.openDb();
128
- if (!db) return [];
139
+ const db = this.openDb();
140
+ if (!db) return [];
129
141
 
130
- try {
131
- const rows = db.prepare<[string], { role: string; partData: string; timeCreated: number }>(`
142
+ try {
143
+ const rows = db
144
+ .prepare<[string], { role: string; partData: string; timeCreated: number }>(`
132
145
  SELECT json_extract(m.data, '$.role') AS role,
133
146
  p.data AS partData,
134
147
  p.time_created AS timeCreated
@@ -136,133 +149,150 @@ export class OpenCodeAdapter implements AgentAdapter {
136
149
  JOIN message m ON p.message_id = m.id
137
150
  WHERE p.session_id = ?
138
151
  ORDER BY p.time_created ASC
139
- `).all(ref.sessionId);
140
-
141
- const messages: ConversationMessage[] = [];
142
-
143
- for (const row of rows) {
144
- let partData: { type?: string; text?: string; reasoning?: string; tool?: string } = {};
145
- try {
146
- partData = JSON.parse(row.partData);
147
- } catch {
148
- continue;
149
- }
150
-
151
- const role = row.role === 'user' ? 'user' : 'assistant';
152
-
153
- if (partData.type === 'text' && partData.text) {
154
- messages.push({ role, content: partData.text });
155
- } else if (partData.type === 'reasoning' && verbose) {
156
- const text = partData.reasoning || partData.text || '';
157
- if (text) messages.push({ role: 'assistant', content: `[thinking] ${text}` });
158
- } else if (partData.type === 'tool' && verbose) {
159
- const toolName = partData.tool || 'tool';
160
- messages.push({ role: 'assistant', content: `[tool: ${toolName}]` });
161
- }
162
- }
163
-
164
- return messages;
152
+ `)
153
+ .all(ref.sessionId);
154
+
155
+ const messages: ConversationMessage[] = [];
156
+
157
+ for (const row of rows) {
158
+ let partData: { type?: string; text?: string; reasoning?: string; tool?: string } = {};
159
+ try {
160
+ partData = JSON.parse(row.partData);
165
161
  } catch {
166
- this.close();
167
- return [];
162
+ continue;
168
163
  }
164
+
165
+ const role = row.role === "user" ? "user" : "assistant";
166
+
167
+ if (partData.type === "text" && partData.text) {
168
+ messages.push({ role, content: partData.text });
169
+ } else if (partData.type === "reasoning" && verbose) {
170
+ const text = partData.reasoning || partData.text || "";
171
+ if (text) messages.push({ role: "assistant", content: `[thinking] ${text}` });
172
+ } else if (partData.type === "tool" && verbose) {
173
+ const toolName = partData.tool || "tool";
174
+ messages.push({ role: "assistant", content: `[tool: ${toolName}]` });
175
+ }
176
+ }
177
+
178
+ return messages;
179
+ } catch {
180
+ this.close();
181
+ return [];
169
182
  }
183
+ }
170
184
 
171
- async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {
172
- const db = this.openDb();
173
- if (!db) return [];
185
+ async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {
186
+ const db = this.openDb();
187
+ if (!db) return [];
174
188
 
175
- try {
176
- const rows = db.prepare<[], { id: string; directory: string; timeCreated: number }>(`
189
+ try {
190
+ const rows = db
191
+ .prepare<[], { id: string; directory: string; timeCreated: number }>(`
177
192
  SELECT id, directory, time_created AS timeCreated
178
193
  FROM session
179
194
  ORDER BY time_created DESC
180
- `).all();
181
-
182
- const summaries: SessionSummary[] = [];
183
-
184
- for (const row of rows) {
185
- if (opts?.cwd !== undefined && row.directory !== opts.cwd) continue;
186
-
187
- const stats = this.getSessionStats(db, row.id);
188
- const lastActive = stats.lastTimeUpdated > 0
189
- ? new Date(stats.lastTimeUpdated)
190
- : new Date(row.timeCreated);
191
- const startedAt = new Date(row.timeCreated);
192
-
193
- summaries.push({
194
- type: 'opencode',
195
- sessionId: row.id,
196
- cwd: row.directory,
197
- firstUserMessage: stats.summary,
198
- lastActive,
199
- startedAt,
200
- sessionFilePath: encodeSessionRef(this.dbPath, row.id),
201
- });
202
- }
203
-
204
- return summaries;
205
- } catch {
206
- this.close();
207
- return [];
208
- }
195
+ `)
196
+ .all();
197
+
198
+ const summaries: SessionSummary[] = [];
199
+
200
+ for (const row of rows) {
201
+ if (opts?.cwd !== undefined && row.directory !== opts.cwd) continue;
202
+
203
+ const stats = this.getSessionStats(db, row.id);
204
+ const lastActive =
205
+ stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(row.timeCreated);
206
+ const startedAt = new Date(row.timeCreated);
207
+
208
+ summaries.push({
209
+ type: "opencode",
210
+ sessionId: row.id,
211
+ cwd: row.directory,
212
+ firstUserMessage: stats.summary,
213
+ lastActive,
214
+ startedAt,
215
+ sessionFilePath: encodeSessionRef(this.dbPath, row.id),
216
+ });
217
+ }
218
+
219
+ return summaries;
220
+ } catch {
221
+ this.close();
222
+ return [];
209
223
  }
210
-
211
- private findSessionForDirectory(db: Database.Database, directory: string): OpenCodeSession | null {
212
- try {
213
- const row = db.prepare<[string], { id: string; directory: string; time_created: number }>(`
224
+ }
225
+
226
+ private findSessionForDirectory(
227
+ db: Database.Database,
228
+ directory: string,
229
+ ): OpenCodeSession | null {
230
+ try {
231
+ const row = db
232
+ .prepare<[string], { id: string; directory: string; time_created: number }>(`
214
233
  SELECT id, directory, time_created
215
234
  FROM session
216
235
  WHERE directory = ?
217
236
  ORDER BY time_created DESC
218
237
  LIMIT 1
219
- `).get(directory);
238
+ `)
239
+ .get(directory);
220
240
 
221
- if (!row) return null;
222
- return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };
223
- } catch {
224
- return null;
225
- }
241
+ if (!row) return null;
242
+ return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };
243
+ } catch {
244
+ return null;
226
245
  }
227
-
228
- private getSessionStats(db: Database.Database, sessionId: string): OpenCodeSessionStats {
229
- const empty: OpenCodeSessionStats = {
230
- lastRole: null,
231
- lastTimeUpdated: 0,
232
- lastAssistantCompleted: false,
233
- lastAssistantErrored: false,
234
- summary: '',
235
- };
236
-
237
- try {
238
- // Order by time_created — time_updated can lag when OpenCode appends
239
- // metadata (e.g. summary diffs) to user messages after a turn finishes.
240
- const last = db.prepare<[string], { role: string; timeUpdated: number }>(`
246
+ }
247
+
248
+ private getSessionStats(db: Database.Database, sessionId: string): OpenCodeSessionStats {
249
+ const empty: OpenCodeSessionStats = {
250
+ lastRole: null,
251
+ lastTimeUpdated: 0,
252
+ lastAssistantCompleted: false,
253
+ lastAssistantErrored: false,
254
+ summary: "",
255
+ };
256
+
257
+ try {
258
+ // Order by time_created — time_updated can lag when OpenCode appends
259
+ // metadata (e.g. summary diffs) to user messages after a turn finishes.
260
+ const last = db
261
+ .prepare<[string], { role: string; timeUpdated: number }>(`
241
262
  SELECT json_extract(data, '$.role') AS role,
242
263
  time_updated AS timeUpdated
243
264
  FROM message
244
265
  WHERE session_id = ?
245
266
  ORDER BY time_created DESC
246
267
  LIMIT 1
247
- `).get(sessionId);
268
+ `)
269
+ .get(sessionId);
248
270
 
249
- const heartbeat = db.prepare<[string], { maxUpdated: number }>(`
271
+ const heartbeat = db
272
+ .prepare<[string], { maxUpdated: number }>(`
250
273
  SELECT MAX(time_updated) AS maxUpdated FROM message WHERE session_id = ?
251
- `).get(sessionId);
252
-
253
- const lastAssistant = db.prepare<[string], {
254
- completed: number | null;
255
- errored: number | null;
256
- }>(`
274
+ `)
275
+ .get(sessionId);
276
+
277
+ const lastAssistant = db
278
+ .prepare<
279
+ [string],
280
+ {
281
+ completed: number | null;
282
+ errored: number | null;
283
+ }
284
+ >(`
257
285
  SELECT json_extract(data, '$.time.completed') AS completed,
258
286
  json_extract(data, '$.time.error') AS errored
259
287
  FROM message
260
288
  WHERE session_id = ? AND json_extract(data, '$.role') = 'assistant'
261
289
  ORDER BY time_created DESC
262
290
  LIMIT 1
263
- `).get(sessionId);
291
+ `)
292
+ .get(sessionId);
264
293
 
265
- const first = db.prepare<[string], { text: string }>(`
294
+ const first = db
295
+ .prepare<[string], { text: string }>(`
266
296
  SELECT json_extract(p.data, '$.text') AS text
267
297
  FROM part p
268
298
  JOIN message m ON p.message_id = m.id
@@ -272,72 +302,72 @@ export class OpenCodeAdapter implements AgentAdapter {
272
302
  AND json_extract(p.data, '$.text') IS NOT NULL
273
303
  ORDER BY p.time_created ASC
274
304
  LIMIT 1
275
- `).get(sessionId);
276
-
277
- return {
278
- lastRole: last?.role ?? null,
279
- lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,
280
- lastAssistantCompleted: lastAssistant?.completed != null,
281
- lastAssistantErrored: lastAssistant?.errored != null,
282
- summary: first?.text?.trim() ?? '',
283
- };
284
- } catch {
285
- return empty;
286
- }
305
+ `)
306
+ .get(sessionId);
307
+
308
+ return {
309
+ lastRole: last?.role ?? null,
310
+ lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,
311
+ lastAssistantCompleted: lastAssistant?.completed != null,
312
+ lastAssistantErrored: lastAssistant?.errored != null,
313
+ summary: first?.text?.trim() ?? "",
314
+ };
315
+ } catch {
316
+ return empty;
287
317
  }
288
-
289
- private mapSessionToAgent(
290
- session: OpenCodeSession,
291
- stats: OpenCodeSessionStats,
292
- proc: ProcessInfo,
293
- ): AgentInfo {
294
- const lastActive = stats.lastTimeUpdated > 0
295
- ? new Date(stats.lastTimeUpdated)
296
- : new Date(session.timeCreated);
297
-
298
- return {
299
- name: generateAgentName(session.directory || proc.cwd || '', proc.pid),
300
- type: this.type,
301
- status: this.determineStatus(stats, lastActive),
302
- summary: stats.summary || 'OpenCode session active',
303
- pid: proc.pid,
304
- projectPath: session.directory || proc.cwd || '',
305
- sessionId: session.sessionId,
306
- lastActive,
307
- sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId),
308
- };
309
- }
310
-
311
- private mapProcessOnlyAgent(proc: ProcessInfo): AgentInfo {
312
- return {
313
- name: generateAgentName(proc.cwd || '', proc.pid),
314
- type: this.type,
315
- status: AgentStatus.RUNNING,
316
- summary: 'OpenCode process running',
317
- pid: proc.pid,
318
- projectPath: proc.cwd || '',
319
- sessionId: `pid-${proc.pid}`,
320
- lastActive: new Date(),
321
- };
322
- }
323
-
324
- private determineStatus(stats: OpenCodeSessionStats, lastActive: Date): AgentStatus {
325
- const ageMin = (Date.now() - lastActive.getTime()) / 60000;
326
- if (ageMin > OpenCodeAdapter.IDLE_THRESHOLD_MINUTES) return AgentStatus.IDLE;
327
-
328
- if (stats.lastRole === 'assistant' && !stats.lastAssistantCompleted) return AgentStatus.RUNNING;
329
- if (stats.lastRole === 'assistant') return AgentStatus.WAITING;
330
- return AgentStatus.RUNNING;
331
- }
332
-
333
- private openDb(): Database.Database | null {
334
- if (this.db) return this.db;
335
- if (!fs.existsSync(this.dbPath)) return null;
336
- try {
337
- this.db = new Database(this.dbPath, { readonly: true });
338
- return this.db;
339
- } catch {
340
- return null;
341
- }
318
+ }
319
+
320
+ private mapSessionToAgent(
321
+ session: OpenCodeSession,
322
+ stats: OpenCodeSessionStats,
323
+ proc: ProcessInfo,
324
+ ): AgentInfo {
325
+ const lastActive =
326
+ stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(session.timeCreated);
327
+
328
+ return {
329
+ name: generateAgentName(session.directory || proc.cwd || "", proc.pid),
330
+ type: this.type,
331
+ status: this.determineStatus(stats, lastActive),
332
+ summary: stats.summary || "OpenCode session active",
333
+ pid: proc.pid,
334
+ projectPath: session.directory || proc.cwd || "",
335
+ sessionId: session.sessionId,
336
+ lastActive,
337
+ sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId),
338
+ };
339
+ }
340
+
341
+ private mapProcessOnlyAgent(proc: ProcessInfo): AgentInfo {
342
+ return {
343
+ name: generateAgentName(proc.cwd || "", proc.pid),
344
+ type: this.type,
345
+ status: AgentStatus.RUNNING,
346
+ summary: "OpenCode process running",
347
+ pid: proc.pid,
348
+ projectPath: proc.cwd || "",
349
+ sessionId: `pid-${proc.pid}`,
350
+ lastActive: new Date(),
351
+ };
352
+ }
353
+
354
+ private determineStatus(stats: OpenCodeSessionStats, lastActive: Date): AgentStatus {
355
+ const ageMin = (Date.now() - lastActive.getTime()) / 60000;
356
+ if (ageMin > OpenCodeAdapter.IDLE_THRESHOLD_MINUTES) return AgentStatus.IDLE;
357
+
358
+ if (stats.lastRole === "assistant" && !stats.lastAssistantCompleted) return AgentStatus.RUNNING;
359
+ if (stats.lastRole === "assistant") return AgentStatus.WAITING;
360
+ return AgentStatus.RUNNING;
361
+ }
362
+
363
+ private openDb(): Database.Database | null {
364
+ if (this.db) return this.db;
365
+ if (!fs.existsSync(this.dbPath)) return null;
366
+ try {
367
+ this.db = new Database(this.dbPath, { readonly: true });
368
+ return this.db;
369
+ } catch {
370
+ return null;
342
371
  }
372
+ }
343
373
  }
@@ -1,9 +1,15 @@
1
- export { ClaudeCodeAdapter } from '../providers/claude/ClaudeCodeAdapter.js';
2
- export { CodexAdapter } from './CodexAdapter.js';
3
- export { CopilotAdapter } from './CopilotAdapter.js';
4
- export { GeminiCliAdapter } from './GeminiCliAdapter.js';
5
- export { GrokCliAdapter } from './GrokCliAdapter.js';
6
- export { OpenCodeAdapter } from './OpenCodeAdapter.js';
7
- export { PiAdapter } from './PiAdapter.js';
8
- export { AgentStatus } from './AgentAdapter.js';
9
- export type { AgentAdapter, AgentType, AgentInfo, ProcessInfo, AgentDetectionContext } from './AgentAdapter.js';
1
+ export { ClaudeCodeAdapter } from "../providers/claude/ClaudeCodeAdapter.js";
2
+ export { CodexAdapter } from "../providers/codex/CodexAdapter.js";
3
+ export { CopilotAdapter } from "../providers/copilot/CopilotAdapter.js";
4
+ export { GeminiCliAdapter } from "../providers/gemini/GeminiCliAdapter.js";
5
+ export { GrokCliAdapter } from "./GrokCliAdapter.js";
6
+ export { OpenCodeAdapter } from "./OpenCodeAdapter.js";
7
+ export { PiAdapter } from "../providers/pi/PiAdapter.js";
8
+ export { AgentStatus } from "./AgentAdapter.js";
9
+ export type {
10
+ AgentAdapter,
11
+ AgentType,
12
+ AgentInfo,
13
+ ProcessInfo,
14
+ AgentDetectionContext,
15
+ } from "./AgentAdapter.js";