@ai-devkit/agent-manager 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/dist/AgentManager.d.ts +3 -3
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +80 -79
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +413 -388
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
  8. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  9. package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
  10. package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
  11. package/dist/__tests__/adapters/CopilotAdapter.test.js +254 -248
  12. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
  14. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
  15. package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
  16. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  17. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
  18. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  19. package/dist/__tests__/capacity/codex.test.js +93 -93
  20. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  21. package/dist/__tests__/capacity/index.test.js +17 -17
  22. package/dist/__tests__/capacity/index.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  24. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  26. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  28. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  29. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  30. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  31. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  32. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  34. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  36. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  37. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  38. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  39. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  40. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  42. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  43. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  44. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  45. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  46. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  47. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  48. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  49. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  50. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  51. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  52. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  53. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  54. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  55. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  56. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
  57. package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
  58. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
  59. package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
  60. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
  61. package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
  62. package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
  63. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
  64. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
  65. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
  66. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  67. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
  68. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
  69. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
  70. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
  71. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
  72. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
  73. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
  74. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
  75. package/dist/__tests__/readiness/AgentReadiness.test.js +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/HerdrAgentRuntime.test.js +452 -0
  80. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  81. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  82. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  84. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  85. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  86. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  88. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  89. package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
  90. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  91. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  92. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  94. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  95. package/dist/__tests__/utils/agents.test.js +17 -17
  96. package/dist/__tests__/utils/agents.test.js.map +1 -1
  97. package/dist/__tests__/utils/matching.test.js +92 -92
  98. package/dist/__tests__/utils/matching.test.js.map +1 -1
  99. package/dist/__tests__/utils/process.test.js +108 -108
  100. package/dist/__tests__/utils/process.test.js.map +1 -1
  101. package/dist/__tests__/utils/session.test.js +53 -53
  102. package/dist/__tests__/utils/session.test.js.map +1 -1
  103. package/dist/adapters/AgentAdapter.d.ts +2 -2
  104. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  105. package/dist/adapters/AgentAdapter.js +1 -1
  106. package/dist/adapters/AgentAdapter.js.map +1 -1
  107. package/dist/adapters/CopilotAdapter.d.ts +2 -2
  108. package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
  109. package/dist/adapters/CopilotAdapter.js +51 -51
  110. package/dist/adapters/CopilotAdapter.js.map +1 -1
  111. package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
  112. package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
  113. package/dist/adapters/GeminiCliAdapter.js +86 -86
  114. package/dist/adapters/GeminiCliAdapter.js.map +1 -1
  115. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  116. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  117. package/dist/adapters/GrokCliAdapter.js +80 -80
  118. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  119. package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
  120. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  121. package/dist/adapters/OpenCodeAdapter.js +37 -36
  122. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  123. package/dist/adapters/index.d.ts +9 -9
  124. package/dist/adapters/index.d.ts.map +1 -1
  125. package/dist/adapters/index.js +8 -8
  126. package/dist/adapters/index.js.map +1 -1
  127. package/dist/capacity/codex.d.ts +3 -3
  128. package/dist/capacity/codex.d.ts.map +1 -1
  129. package/dist/capacity/codex.js +57 -57
  130. package/dist/capacity/codex.js.map +1 -1
  131. package/dist/capacity/index.d.ts +3 -3
  132. package/dist/capacity/index.d.ts.map +1 -1
  133. package/dist/capacity/index.js +8 -8
  134. package/dist/capacity/index.js.map +1 -1
  135. package/dist/capacity/types.d.ts +1 -1
  136. package/dist/capacity/types.js.map +1 -1
  137. package/dist/database/connection.d.ts +1 -1
  138. package/dist/database/connection.d.ts.map +1 -1
  139. package/dist/database/connection.js +15 -15
  140. package/dist/database/connection.js.map +1 -1
  141. package/dist/database/index.d.ts +3 -3
  142. package/dist/database/index.d.ts.map +1 -1
  143. package/dist/database/index.js +2 -2
  144. package/dist/database/index.js.map +1 -1
  145. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  146. package/dist/database/schema.d.ts +1 -1
  147. package/dist/database/schema.d.ts.map +1 -1
  148. package/dist/database/schema.js +7 -7
  149. package/dist/database/schema.js.map +1 -1
  150. package/dist/durable/DurableAgent.d.ts +9 -9
  151. package/dist/durable/DurableAgent.d.ts.map +1 -1
  152. package/dist/durable/DurableAgent.js +16 -16
  153. package/dist/durable/DurableAgent.js.map +1 -1
  154. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  155. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  156. package/dist/durable/DurableAgentRepository.js +49 -48
  157. package/dist/durable/DurableAgentRepository.js.map +1 -1
  158. package/dist/durable/process.d.ts +1 -1
  159. package/dist/durable/process.d.ts.map +1 -1
  160. package/dist/durable/process.js +14 -14
  161. package/dist/durable/process.js.map +1 -1
  162. package/dist/durable/run.d.ts +2 -2
  163. package/dist/durable/run.d.ts.map +1 -1
  164. package/dist/durable/run.js +6 -6
  165. package/dist/durable/run.js.map +1 -1
  166. package/dist/durable/utils.d.ts +1 -1
  167. package/dist/durable/utils.d.ts.map +1 -1
  168. package/dist/durable/utils.js +4 -4
  169. package/dist/durable/utils.js.map +1 -1
  170. package/dist/index.d.ts +46 -43
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -26
  173. package/dist/index.js.map +1 -1
  174. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  175. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  176. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  177. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  178. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  179. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  180. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  181. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  183. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  184. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  185. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  186. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  187. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  188. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  189. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  190. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  191. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  192. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  194. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  195. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  196. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  197. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  198. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  199. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  200. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  201. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  202. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  203. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  204. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  205. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  206. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  207. package/dist/providers/codex/CodexAdapter.js +162 -0
  208. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  209. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  210. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  211. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  212. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  213. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  214. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  215. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  216. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  217. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  218. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  219. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  220. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  221. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  222. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  223. package/dist/providers/codex/CodexSessionParser.js +262 -0
  224. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  225. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  226. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  227. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  229. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  230. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  231. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  232. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  233. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  234. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  235. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  236. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  237. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  238. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  239. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  240. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  241. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  242. package/dist/providers/pi/PiAdapter.js +153 -0
  243. package/dist/providers/pi/PiAdapter.js.map +1 -0
  244. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  245. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  246. package/dist/providers/pi/PiAgentMapper.js +37 -0
  247. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  248. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  249. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  250. package/dist/providers/pi/PiSessionLocator.js +79 -0
  251. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  252. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  253. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  254. package/dist/providers/pi/PiSessionParser.js +191 -0
  255. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  256. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  257. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  258. package/dist/providers/pi/PiSessionTracker.js +69 -0
  259. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  260. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  261. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  262. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  263. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  264. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  265. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  266. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  267. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  268. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  269. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  270. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  271. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  272. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  273. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  274. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  275. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  276. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  277. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  278. package/dist/readiness/AgentReadiness.d.ts +6 -6
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  280. package/dist/readiness/AgentReadiness.js +130 -130
  281. package/dist/readiness/AgentReadiness.js.map +1 -1
  282. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  283. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  284. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  285. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  286. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  287. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  288. package/dist/runtime/RuntimeFactory.js +11 -0
  289. package/dist/runtime/RuntimeFactory.js.map +1 -0
  290. package/dist/runtime/errors.d.ts +27 -0
  291. package/dist/runtime/errors.d.ts.map +1 -0
  292. package/dist/runtime/errors.js +42 -0
  293. package/dist/runtime/errors.js.map +1 -0
  294. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
  295. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  296. package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
  297. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  298. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  299. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  300. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  301. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  302. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  303. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  304. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  305. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  306. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
  307. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  308. package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
  309. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  310. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  311. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  312. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  313. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  314. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  315. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  316. package/dist/runtime/tmux/PidPolling.js +24 -0
  317. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  318. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  319. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  320. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  321. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  322. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  323. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  324. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  325. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  326. package/dist/runtime/types.d.ts +54 -0
  327. package/dist/runtime/types.d.ts.map +1 -0
  328. package/dist/runtime/types.js +3 -0
  329. package/dist/runtime/types.js.map +1 -0
  330. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  331. package/dist/terminal/TerminalFocusManager.js +50 -50
  332. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  333. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  334. package/dist/terminal/TmuxManager.js +47 -47
  335. package/dist/terminal/TmuxManager.js.map +1 -1
  336. package/dist/terminal/TtyWriter.d.ts +1 -1
  337. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  338. package/dist/terminal/TtyWriter.js +89 -89
  339. package/dist/terminal/TtyWriter.js.map +1 -1
  340. package/dist/terminal/index.d.ts +4 -4
  341. package/dist/terminal/index.js +3 -3
  342. package/dist/terminal/index.js.map +1 -1
  343. package/dist/utils/AgentRegistry.d.ts +10 -2
  344. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  345. package/dist/utils/AgentRegistry.js +57 -24
  346. package/dist/utils/AgentRegistry.js.map +1 -1
  347. package/dist/utils/agent-requests.d.ts.map +1 -1
  348. package/dist/utils/agent-requests.js +5 -5
  349. package/dist/utils/agent-requests.js.map +1 -1
  350. package/dist/utils/agents.d.ts +2 -2
  351. package/dist/utils/agents.d.ts.map +1 -1
  352. package/dist/utils/agents.js +15 -15
  353. package/dist/utils/agents.js.map +1 -1
  354. package/dist/utils/applescript.js +1 -1
  355. package/dist/utils/applescript.js.map +1 -1
  356. package/dist/utils/index.d.ts +6 -6
  357. package/dist/utils/index.d.ts.map +1 -1
  358. package/dist/utils/index.js +4 -4
  359. package/dist/utils/index.js.map +1 -1
  360. package/dist/utils/matching.d.ts +2 -2
  361. package/dist/utils/matching.d.ts.map +1 -1
  362. package/dist/utils/matching.js +4 -4
  363. package/dist/utils/matching.js.map +1 -1
  364. package/dist/utils/process.d.ts +1 -1
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +74 -74
  367. package/dist/utils/process.js.map +1 -1
  368. package/dist/utils/session.d.ts +1 -1
  369. package/dist/utils/session.d.ts.map +1 -1
  370. package/dist/utils/session.js +7 -7
  371. package/dist/utils/session.js.map +1 -1
  372. package/dist/utils/sortAgents.d.ts +2 -2
  373. package/dist/utils/sortAgents.d.ts.map +1 -1
  374. package/dist/utils/sortAgents.js +5 -5
  375. package/dist/utils/sortAgents.js.map +1 -1
  376. package/package.json +18 -19
  377. package/src/AgentManager.ts +283 -281
  378. package/src/__tests__/AgentManager.test.ts +917 -907
  379. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  380. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  381. package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
  382. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
  383. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  384. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
  385. package/src/__tests__/capacity/codex.test.ts +178 -91
  386. package/src/__tests__/capacity/index.test.ts +27 -18
  387. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  388. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  389. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  390. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  391. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  392. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  393. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  394. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  395. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  396. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  397. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  398. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  399. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  400. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  401. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  402. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  403. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  404. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  405. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  406. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  407. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  408. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  409. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  410. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  411. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  412. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  413. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  414. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  415. package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
  416. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  417. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
  418. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  419. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  420. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  421. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  422. package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
  423. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  424. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  425. package/src/__tests__/utils/agents.test.ts +20 -20
  426. package/src/__tests__/utils/matching.test.ts +206 -171
  427. package/src/__tests__/utils/process.test.ts +276 -262
  428. package/src/__tests__/utils/session.test.ts +133 -139
  429. package/src/adapters/AgentAdapter.ts +134 -126
  430. package/src/adapters/CopilotAdapter.ts +405 -395
  431. package/src/adapters/GeminiCliAdapter.ts +598 -600
  432. package/src/adapters/GrokCliAdapter.ts +353 -342
  433. package/src/adapters/OpenCodeAdapter.ts +285 -259
  434. package/src/adapters/index.ts +15 -9
  435. package/src/capacity/codex.ts +137 -84
  436. package/src/capacity/index.ts +18 -13
  437. package/src/capacity/types.ts +1 -1
  438. package/src/database/connection.ts +73 -68
  439. package/src/database/index.ts +6 -6
  440. package/src/database/migrations/005_agent_runtime.sql +2 -0
  441. package/src/database/schema.ts +40 -38
  442. package/src/durable/DurableAgent.ts +85 -85
  443. package/src/durable/DurableAgentRepository.ts +409 -260
  444. package/src/durable/process.ts +22 -21
  445. package/src/durable/run.ts +61 -51
  446. package/src/durable/utils.ts +46 -41
  447. package/src/index.ts +144 -103
  448. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  449. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  450. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  451. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  452. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  453. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  454. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  455. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  456. package/src/providers/codex/CodexAdapter.ts +205 -0
  457. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  458. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  459. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  460. package/src/providers/codex/CodexSessionParser.ts +385 -0
  461. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  462. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  463. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  464. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  465. package/src/providers/pi/PiAdapter.ts +183 -0
  466. package/src/providers/pi/PiAgentMapper.ts +36 -0
  467. package/src/providers/pi/PiSessionLocator.ts +95 -0
  468. package/src/providers/pi/PiSessionParser.ts +284 -0
  469. package/src/providers/pi/PiSessionTracker.ts +87 -0
  470. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  471. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  472. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  473. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  474. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  475. package/src/readiness/AgentReadiness.ts +585 -513
  476. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  477. package/src/runtime/RuntimeFactory.ts +13 -0
  478. package/src/runtime/errors.ts +50 -0
  479. package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
  480. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  481. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  482. package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
  483. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  484. package/src/runtime/tmux/PidPolling.ts +34 -0
  485. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  486. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  487. package/src/runtime/types.ts +56 -0
  488. package/src/terminal/TerminalFocusManager.ts +215 -212
  489. package/src/terminal/TmuxManager.ts +99 -92
  490. package/src/terminal/TtyWriter.ts +203 -194
  491. package/src/terminal/index.ts +4 -4
  492. package/src/utils/AgentRegistry.ts +299 -238
  493. package/src/utils/agent-requests.ts +16 -16
  494. package/src/utils/agents.ts +41 -38
  495. package/src/utils/applescript.ts +4 -4
  496. package/src/utils/index.ts +12 -6
  497. package/src/utils/matching.ts +43 -43
  498. package/src/utils/process.ts +261 -258
  499. package/src/utils/session.ts +66 -66
  500. package/src/utils/sortAgents.ts +35 -33
  501. package/tsconfig.json +2 -8
  502. package/vitest.config.ts +16 -16
  503. package/.eslintrc.json +0 -31
  504. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  505. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  506. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  507. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  508. package/dist/adapters/CodexAdapter.d.ts +0 -109
  509. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  510. package/dist/adapters/CodexAdapter.js +0 -710
  511. package/dist/adapters/CodexAdapter.js.map +0 -1
  512. package/dist/adapters/PiAdapter.d.ts +0 -63
  513. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  514. package/dist/adapters/PiAdapter.js +0 -453
  515. package/dist/adapters/PiAdapter.js.map +0 -1
  516. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  517. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  518. package/src/adapters/CodexAdapter.ts +0 -923
  519. package/src/adapters/PiAdapter.ts +0 -598
@@ -11,124 +11,133 @@
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 db: Database.Database | null = null;
69
+
70
+ constructor() {
71
+ this.dbPath = OpenCodeAdapter.resolveDbPath();
72
+ const cleanup = (): void => this.close();
73
+ process.once("exit", cleanup);
74
+ process.once("SIGINT", cleanup);
75
+ process.once("SIGTERM", cleanup);
76
+ }
77
+
78
+ close(): void {
79
+ if (this.db) {
80
+ try {
81
+ this.db.close();
82
+ } catch {
83
+ /* ignore */
84
+ }
85
+ this.db = null;
72
86
  }
73
-
74
- close(): void {
75
- if (this.db) {
76
- try { this.db.close(); } catch { /* ignore */ }
77
- this.db = null;
78
- }
87
+ }
88
+
89
+ private static resolveDbPath(): string {
90
+ const xdg = process.env.XDG_DATA_HOME;
91
+ const home = process.env.HOME || process.env.USERPROFILE || "";
92
+ const base = xdg || path.join(home, ".local", "share");
93
+ return path.join(base, "opencode", "opencode.db");
94
+ }
95
+
96
+ canHandle(processInfo: ProcessInfo): boolean {
97
+ const base = executableBasename(processInfo.command);
98
+ return base === "opencode" || base === "opencode.exe";
99
+ }
100
+
101
+ async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
102
+ const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));
103
+ const relevant = filterByProcessNames(snapshot, this.processNames);
104
+ const processes = relevant.filter((process) => this.canHandle(process));
105
+ if (processes.length === 0) return [];
106
+
107
+ const db = this.openDb();
108
+ if (!db) return processes.map((p) => this.mapProcessOnlyAgent(p));
109
+
110
+ const agents: AgentInfo[] = [];
111
+ for (const proc of processes) {
112
+ if (!proc.cwd) {
113
+ agents.push(this.mapProcessOnlyAgent(proc));
114
+ continue;
115
+ }
116
+
117
+ const session = this.findSessionForDirectory(db, proc.cwd);
118
+ if (!session) {
119
+ agents.push(this.mapProcessOnlyAgent(proc));
120
+ continue;
121
+ }
122
+
123
+ const stats = this.getSessionStats(db, session.sessionId);
124
+ agents.push(this.mapSessionToAgent(session, stats, proc));
79
125
  }
80
126
 
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
- }
127
+ return agents;
128
+ }
121
129
 
122
- getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
123
- const verbose = options?.verbose ?? false;
124
- const ref = decodeSessionRef(sessionFilePath);
125
- if (!ref) return [];
130
+ getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
131
+ const verbose = options?.verbose ?? false;
132
+ const ref = decodeSessionRef(sessionFilePath);
133
+ if (!ref) return [];
126
134
 
127
- const db = this.openDb();
128
- if (!db) return [];
135
+ const db = this.openDb();
136
+ if (!db) return [];
129
137
 
130
- try {
131
- const rows = db.prepare<[string], { role: string; partData: string; timeCreated: number }>(`
138
+ try {
139
+ const rows = db
140
+ .prepare<[string], { role: string; partData: string; timeCreated: number }>(`
132
141
  SELECT json_extract(m.data, '$.role') AS role,
133
142
  p.data AS partData,
134
143
  p.time_created AS timeCreated
@@ -136,133 +145,150 @@ export class OpenCodeAdapter implements AgentAdapter {
136
145
  JOIN message m ON p.message_id = m.id
137
146
  WHERE p.session_id = ?
138
147
  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;
148
+ `)
149
+ .all(ref.sessionId);
150
+
151
+ const messages: ConversationMessage[] = [];
152
+
153
+ for (const row of rows) {
154
+ let partData: { type?: string; text?: string; reasoning?: string; tool?: string } = {};
155
+ try {
156
+ partData = JSON.parse(row.partData);
165
157
  } catch {
166
- this.close();
167
- return [];
158
+ continue;
168
159
  }
160
+
161
+ const role = row.role === "user" ? "user" : "assistant";
162
+
163
+ if (partData.type === "text" && partData.text) {
164
+ messages.push({ role, content: partData.text });
165
+ } else if (partData.type === "reasoning" && verbose) {
166
+ const text = partData.reasoning || partData.text || "";
167
+ if (text) messages.push({ role: "assistant", content: `[thinking] ${text}` });
168
+ } else if (partData.type === "tool" && verbose) {
169
+ const toolName = partData.tool || "tool";
170
+ messages.push({ role: "assistant", content: `[tool: ${toolName}]` });
171
+ }
172
+ }
173
+
174
+ return messages;
175
+ } catch {
176
+ this.close();
177
+ return [];
169
178
  }
179
+ }
170
180
 
171
- async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {
172
- const db = this.openDb();
173
- if (!db) return [];
181
+ async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {
182
+ const db = this.openDb();
183
+ if (!db) return [];
174
184
 
175
- try {
176
- const rows = db.prepare<[], { id: string; directory: string; timeCreated: number }>(`
185
+ try {
186
+ const rows = db
187
+ .prepare<[], { id: string; directory: string; timeCreated: number }>(`
177
188
  SELECT id, directory, time_created AS timeCreated
178
189
  FROM session
179
190
  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
- }
191
+ `)
192
+ .all();
193
+
194
+ const summaries: SessionSummary[] = [];
195
+
196
+ for (const row of rows) {
197
+ if (opts?.cwd !== undefined && row.directory !== opts.cwd) continue;
198
+
199
+ const stats = this.getSessionStats(db, row.id);
200
+ const lastActive =
201
+ stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(row.timeCreated);
202
+ const startedAt = new Date(row.timeCreated);
203
+
204
+ summaries.push({
205
+ type: "opencode",
206
+ sessionId: row.id,
207
+ cwd: row.directory,
208
+ firstUserMessage: stats.summary,
209
+ lastActive,
210
+ startedAt,
211
+ sessionFilePath: encodeSessionRef(this.dbPath, row.id),
212
+ });
213
+ }
214
+
215
+ return summaries;
216
+ } catch {
217
+ this.close();
218
+ return [];
209
219
  }
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 }>(`
220
+ }
221
+
222
+ private findSessionForDirectory(
223
+ db: Database.Database,
224
+ directory: string,
225
+ ): OpenCodeSession | null {
226
+ try {
227
+ const row = db
228
+ .prepare<[string], { id: string; directory: string; time_created: number }>(`
214
229
  SELECT id, directory, time_created
215
230
  FROM session
216
231
  WHERE directory = ?
217
232
  ORDER BY time_created DESC
218
233
  LIMIT 1
219
- `).get(directory);
234
+ `)
235
+ .get(directory);
220
236
 
221
- if (!row) return null;
222
- return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };
223
- } catch {
224
- return null;
225
- }
237
+ if (!row) return null;
238
+ return { sessionId: row.id, directory: row.directory, timeCreated: row.time_created };
239
+ } catch {
240
+ return null;
226
241
  }
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 }>(`
242
+ }
243
+
244
+ private getSessionStats(db: Database.Database, sessionId: string): OpenCodeSessionStats {
245
+ const empty: OpenCodeSessionStats = {
246
+ lastRole: null,
247
+ lastTimeUpdated: 0,
248
+ lastAssistantCompleted: false,
249
+ lastAssistantErrored: false,
250
+ summary: "",
251
+ };
252
+
253
+ try {
254
+ // Order by time_created time_updated can lag when OpenCode appends
255
+ // metadata (e.g. summary diffs) to user messages after a turn finishes.
256
+ const last = db
257
+ .prepare<[string], { role: string; timeUpdated: number }>(`
241
258
  SELECT json_extract(data, '$.role') AS role,
242
259
  time_updated AS timeUpdated
243
260
  FROM message
244
261
  WHERE session_id = ?
245
262
  ORDER BY time_created DESC
246
263
  LIMIT 1
247
- `).get(sessionId);
264
+ `)
265
+ .get(sessionId);
248
266
 
249
- const heartbeat = db.prepare<[string], { maxUpdated: number }>(`
267
+ const heartbeat = db
268
+ .prepare<[string], { maxUpdated: number }>(`
250
269
  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
- }>(`
270
+ `)
271
+ .get(sessionId);
272
+
273
+ const lastAssistant = db
274
+ .prepare<
275
+ [string],
276
+ {
277
+ completed: number | null;
278
+ errored: number | null;
279
+ }
280
+ >(`
257
281
  SELECT json_extract(data, '$.time.completed') AS completed,
258
282
  json_extract(data, '$.time.error') AS errored
259
283
  FROM message
260
284
  WHERE session_id = ? AND json_extract(data, '$.role') = 'assistant'
261
285
  ORDER BY time_created DESC
262
286
  LIMIT 1
263
- `).get(sessionId);
287
+ `)
288
+ .get(sessionId);
264
289
 
265
- const first = db.prepare<[string], { text: string }>(`
290
+ const first = db
291
+ .prepare<[string], { text: string }>(`
266
292
  SELECT json_extract(p.data, '$.text') AS text
267
293
  FROM part p
268
294
  JOIN message m ON p.message_id = m.id
@@ -272,72 +298,72 @@ export class OpenCodeAdapter implements AgentAdapter {
272
298
  AND json_extract(p.data, '$.text') IS NOT NULL
273
299
  ORDER BY p.time_created ASC
274
300
  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
- }
301
+ `)
302
+ .get(sessionId);
303
+
304
+ return {
305
+ lastRole: last?.role ?? null,
306
+ lastTimeUpdated: heartbeat?.maxUpdated ?? last?.timeUpdated ?? 0,
307
+ lastAssistantCompleted: lastAssistant?.completed != null,
308
+ lastAssistantErrored: lastAssistant?.errored != null,
309
+ summary: first?.text?.trim() ?? "",
310
+ };
311
+ } catch {
312
+ return empty;
287
313
  }
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
- }
314
+ }
315
+
316
+ private mapSessionToAgent(
317
+ session: OpenCodeSession,
318
+ stats: OpenCodeSessionStats,
319
+ proc: ProcessInfo,
320
+ ): AgentInfo {
321
+ const lastActive =
322
+ stats.lastTimeUpdated > 0 ? new Date(stats.lastTimeUpdated) : new Date(session.timeCreated);
323
+
324
+ return {
325
+ name: generateAgentName(session.directory || proc.cwd || "", proc.pid),
326
+ type: this.type,
327
+ status: this.determineStatus(stats, lastActive),
328
+ summary: stats.summary || "OpenCode session active",
329
+ pid: proc.pid,
330
+ projectPath: session.directory || proc.cwd || "",
331
+ sessionId: session.sessionId,
332
+ lastActive,
333
+ sessionFilePath: encodeSessionRef(this.dbPath, session.sessionId),
334
+ };
335
+ }
336
+
337
+ private mapProcessOnlyAgent(proc: ProcessInfo): AgentInfo {
338
+ return {
339
+ name: generateAgentName(proc.cwd || "", proc.pid),
340
+ type: this.type,
341
+ status: AgentStatus.RUNNING,
342
+ summary: "OpenCode process running",
343
+ pid: proc.pid,
344
+ projectPath: proc.cwd || "",
345
+ sessionId: `pid-${proc.pid}`,
346
+ lastActive: new Date(),
347
+ };
348
+ }
349
+
350
+ private determineStatus(stats: OpenCodeSessionStats, lastActive: Date): AgentStatus {
351
+ const ageMin = (Date.now() - lastActive.getTime()) / 60000;
352
+ if (ageMin > OpenCodeAdapter.IDLE_THRESHOLD_MINUTES) return AgentStatus.IDLE;
353
+
354
+ if (stats.lastRole === "assistant" && !stats.lastAssistantCompleted) return AgentStatus.RUNNING;
355
+ if (stats.lastRole === "assistant") return AgentStatus.WAITING;
356
+ return AgentStatus.RUNNING;
357
+ }
358
+
359
+ private openDb(): Database.Database | null {
360
+ if (this.db) return this.db;
361
+ if (!fs.existsSync(this.dbPath)) return null;
362
+ try {
363
+ this.db = new Database(this.dbPath, { readonly: true });
364
+ return this.db;
365
+ } catch {
366
+ return null;
342
367
  }
368
+ }
343
369
  }
@@ -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 "./CopilotAdapter.js";
4
+ export { GeminiCliAdapter } from "./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";