@ai-devkit/agent-manager 0.31.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/dist/AgentManager.d.ts +3 -3
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +80 -79
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +413 -388
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
  8. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  9. package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
  10. package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
  11. package/dist/__tests__/adapters/CopilotAdapter.test.js +254 -248
  12. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
  14. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
  15. package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
  16. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  17. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
  18. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  19. package/dist/__tests__/capacity/codex.test.js +93 -93
  20. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  21. package/dist/__tests__/capacity/index.test.js +17 -17
  22. package/dist/__tests__/capacity/index.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  24. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  26. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  28. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  29. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  30. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  31. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  32. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  34. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  36. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  37. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  38. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  39. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  40. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  42. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  43. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  44. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  45. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  46. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  47. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  48. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  49. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  50. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  51. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  52. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  53. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  54. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  55. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  56. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
  57. package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
  58. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
  59. package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
  60. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
  61. package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
  62. package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
  63. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
  64. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
  65. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
  66. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  67. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
  68. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
  69. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
  70. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
  71. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
  72. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
  73. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
  74. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
  75. package/dist/__tests__/readiness/AgentReadiness.test.js +301 -0
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
  77. package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
  78. package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
  79. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +452 -0
  80. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  81. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  82. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  84. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  85. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  86. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  88. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  89. package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
  90. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  91. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  92. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  94. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  95. package/dist/__tests__/utils/agents.test.js +17 -17
  96. package/dist/__tests__/utils/agents.test.js.map +1 -1
  97. package/dist/__tests__/utils/matching.test.js +92 -92
  98. package/dist/__tests__/utils/matching.test.js.map +1 -1
  99. package/dist/__tests__/utils/process.test.js +108 -108
  100. package/dist/__tests__/utils/process.test.js.map +1 -1
  101. package/dist/__tests__/utils/session.test.js +53 -53
  102. package/dist/__tests__/utils/session.test.js.map +1 -1
  103. package/dist/adapters/AgentAdapter.d.ts +2 -2
  104. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  105. package/dist/adapters/AgentAdapter.js +1 -1
  106. package/dist/adapters/AgentAdapter.js.map +1 -1
  107. package/dist/adapters/CopilotAdapter.d.ts +2 -2
  108. package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
  109. package/dist/adapters/CopilotAdapter.js +51 -51
  110. package/dist/adapters/CopilotAdapter.js.map +1 -1
  111. package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
  112. package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
  113. package/dist/adapters/GeminiCliAdapter.js +86 -86
  114. package/dist/adapters/GeminiCliAdapter.js.map +1 -1
  115. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  116. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  117. package/dist/adapters/GrokCliAdapter.js +80 -80
  118. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  119. package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
  120. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  121. package/dist/adapters/OpenCodeAdapter.js +37 -36
  122. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  123. package/dist/adapters/index.d.ts +9 -9
  124. package/dist/adapters/index.d.ts.map +1 -1
  125. package/dist/adapters/index.js +8 -8
  126. package/dist/adapters/index.js.map +1 -1
  127. package/dist/capacity/codex.d.ts +3 -3
  128. package/dist/capacity/codex.d.ts.map +1 -1
  129. package/dist/capacity/codex.js +57 -57
  130. package/dist/capacity/codex.js.map +1 -1
  131. package/dist/capacity/index.d.ts +3 -3
  132. package/dist/capacity/index.d.ts.map +1 -1
  133. package/dist/capacity/index.js +8 -8
  134. package/dist/capacity/index.js.map +1 -1
  135. package/dist/capacity/types.d.ts +1 -1
  136. package/dist/capacity/types.js.map +1 -1
  137. package/dist/database/connection.d.ts +1 -1
  138. package/dist/database/connection.d.ts.map +1 -1
  139. package/dist/database/connection.js +15 -15
  140. package/dist/database/connection.js.map +1 -1
  141. package/dist/database/index.d.ts +3 -3
  142. package/dist/database/index.d.ts.map +1 -1
  143. package/dist/database/index.js +2 -2
  144. package/dist/database/index.js.map +1 -1
  145. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  146. package/dist/database/schema.d.ts +1 -1
  147. package/dist/database/schema.d.ts.map +1 -1
  148. package/dist/database/schema.js +7 -7
  149. package/dist/database/schema.js.map +1 -1
  150. package/dist/durable/DurableAgent.d.ts +9 -9
  151. package/dist/durable/DurableAgent.d.ts.map +1 -1
  152. package/dist/durable/DurableAgent.js +16 -16
  153. package/dist/durable/DurableAgent.js.map +1 -1
  154. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  155. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  156. package/dist/durable/DurableAgentRepository.js +49 -48
  157. package/dist/durable/DurableAgentRepository.js.map +1 -1
  158. package/dist/durable/process.d.ts +1 -1
  159. package/dist/durable/process.d.ts.map +1 -1
  160. package/dist/durable/process.js +14 -14
  161. package/dist/durable/process.js.map +1 -1
  162. package/dist/durable/run.d.ts +2 -2
  163. package/dist/durable/run.d.ts.map +1 -1
  164. package/dist/durable/run.js +6 -6
  165. package/dist/durable/run.js.map +1 -1
  166. package/dist/durable/utils.d.ts +1 -1
  167. package/dist/durable/utils.d.ts.map +1 -1
  168. package/dist/durable/utils.js +4 -4
  169. package/dist/durable/utils.js.map +1 -1
  170. package/dist/index.d.ts +46 -41
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -25
  173. package/dist/index.js.map +1 -1
  174. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  175. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  176. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  177. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  178. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  179. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  180. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  181. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  183. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  184. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  185. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  186. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  187. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  188. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  189. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  190. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  191. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  192. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  194. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  195. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  196. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  197. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  198. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  199. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  200. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  201. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  202. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  203. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  204. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  205. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  206. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  207. package/dist/providers/codex/CodexAdapter.js +162 -0
  208. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  209. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  210. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  211. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  212. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  213. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  214. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  215. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  216. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  217. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  218. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  219. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  220. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  221. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  222. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  223. package/dist/providers/codex/CodexSessionParser.js +262 -0
  224. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  225. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  226. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  227. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  229. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  230. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  231. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  232. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  233. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  234. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  235. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  236. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  237. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  238. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  239. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  240. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  241. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  242. package/dist/providers/pi/PiAdapter.js +153 -0
  243. package/dist/providers/pi/PiAdapter.js.map +1 -0
  244. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  245. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  246. package/dist/providers/pi/PiAgentMapper.js +37 -0
  247. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  248. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  249. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  250. package/dist/providers/pi/PiSessionLocator.js +79 -0
  251. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  252. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  253. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  254. package/dist/providers/pi/PiSessionParser.js +191 -0
  255. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  256. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  257. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  258. package/dist/providers/pi/PiSessionTracker.js +69 -0
  259. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  260. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  261. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  262. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  263. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  264. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  265. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  266. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  267. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  268. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  269. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  270. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  271. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  272. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  273. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  274. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  275. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  276. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  277. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  278. package/dist/readiness/AgentReadiness.d.ts +67 -0
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -0
  280. package/dist/readiness/AgentReadiness.js +614 -0
  281. package/dist/readiness/AgentReadiness.js.map +1 -0
  282. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  283. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  284. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  285. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  286. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  287. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  288. package/dist/runtime/RuntimeFactory.js +11 -0
  289. package/dist/runtime/RuntimeFactory.js.map +1 -0
  290. package/dist/runtime/errors.d.ts +27 -0
  291. package/dist/runtime/errors.d.ts.map +1 -0
  292. package/dist/runtime/errors.js +42 -0
  293. package/dist/runtime/errors.js.map +1 -0
  294. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
  295. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  296. package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
  297. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  298. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  299. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  300. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  301. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  302. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  303. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  304. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  305. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  306. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
  307. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  308. package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
  309. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  310. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  311. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  312. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  313. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  314. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  315. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  316. package/dist/runtime/tmux/PidPolling.js +24 -0
  317. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  318. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  319. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  320. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  321. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  322. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  323. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  324. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  325. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  326. package/dist/runtime/types.d.ts +54 -0
  327. package/dist/runtime/types.d.ts.map +1 -0
  328. package/dist/runtime/types.js +3 -0
  329. package/dist/runtime/types.js.map +1 -0
  330. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  331. package/dist/terminal/TerminalFocusManager.js +50 -50
  332. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  333. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  334. package/dist/terminal/TmuxManager.js +47 -47
  335. package/dist/terminal/TmuxManager.js.map +1 -1
  336. package/dist/terminal/TtyWriter.d.ts +1 -1
  337. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  338. package/dist/terminal/TtyWriter.js +89 -89
  339. package/dist/terminal/TtyWriter.js.map +1 -1
  340. package/dist/terminal/index.d.ts +4 -4
  341. package/dist/terminal/index.js +3 -3
  342. package/dist/terminal/index.js.map +1 -1
  343. package/dist/utils/AgentRegistry.d.ts +10 -2
  344. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  345. package/dist/utils/AgentRegistry.js +57 -24
  346. package/dist/utils/AgentRegistry.js.map +1 -1
  347. package/dist/utils/agent-requests.d.ts.map +1 -1
  348. package/dist/utils/agent-requests.js +5 -5
  349. package/dist/utils/agent-requests.js.map +1 -1
  350. package/dist/utils/agents.d.ts +2 -2
  351. package/dist/utils/agents.d.ts.map +1 -1
  352. package/dist/utils/agents.js +15 -15
  353. package/dist/utils/agents.js.map +1 -1
  354. package/dist/utils/applescript.js +1 -1
  355. package/dist/utils/applescript.js.map +1 -1
  356. package/dist/utils/index.d.ts +6 -6
  357. package/dist/utils/index.d.ts.map +1 -1
  358. package/dist/utils/index.js +4 -4
  359. package/dist/utils/index.js.map +1 -1
  360. package/dist/utils/matching.d.ts +2 -2
  361. package/dist/utils/matching.d.ts.map +1 -1
  362. package/dist/utils/matching.js +4 -4
  363. package/dist/utils/matching.js.map +1 -1
  364. package/dist/utils/process.d.ts +1 -1
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +74 -74
  367. package/dist/utils/process.js.map +1 -1
  368. package/dist/utils/session.d.ts +1 -1
  369. package/dist/utils/session.d.ts.map +1 -1
  370. package/dist/utils/session.js +7 -7
  371. package/dist/utils/session.js.map +1 -1
  372. package/dist/utils/sortAgents.d.ts +2 -2
  373. package/dist/utils/sortAgents.d.ts.map +1 -1
  374. package/dist/utils/sortAgents.js +5 -5
  375. package/dist/utils/sortAgents.js.map +1 -1
  376. package/package.json +18 -19
  377. package/src/AgentManager.ts +283 -281
  378. package/src/__tests__/AgentManager.test.ts +917 -907
  379. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  380. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  381. package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
  382. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
  383. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  384. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
  385. package/src/__tests__/capacity/codex.test.ts +178 -91
  386. package/src/__tests__/capacity/index.test.ts +27 -18
  387. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  388. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  389. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  390. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  391. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  392. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  393. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  394. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  395. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  396. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  397. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  398. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  399. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  400. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  401. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  402. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  403. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  404. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  405. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  406. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  407. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  408. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  409. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  410. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  411. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  412. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  413. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  414. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  415. package/src/__tests__/readiness/AgentReadiness.test.ts +242 -0
  416. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  417. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
  418. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  419. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  420. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  421. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  422. package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
  423. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  424. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  425. package/src/__tests__/utils/agents.test.ts +20 -20
  426. package/src/__tests__/utils/matching.test.ts +206 -171
  427. package/src/__tests__/utils/process.test.ts +276 -262
  428. package/src/__tests__/utils/session.test.ts +133 -139
  429. package/src/adapters/AgentAdapter.ts +134 -126
  430. package/src/adapters/CopilotAdapter.ts +405 -395
  431. package/src/adapters/GeminiCliAdapter.ts +598 -600
  432. package/src/adapters/GrokCliAdapter.ts +353 -342
  433. package/src/adapters/OpenCodeAdapter.ts +285 -259
  434. package/src/adapters/index.ts +15 -9
  435. package/src/capacity/codex.ts +137 -84
  436. package/src/capacity/index.ts +18 -13
  437. package/src/capacity/types.ts +1 -1
  438. package/src/database/connection.ts +73 -68
  439. package/src/database/index.ts +6 -6
  440. package/src/database/migrations/005_agent_runtime.sql +2 -0
  441. package/src/database/schema.ts +40 -38
  442. package/src/durable/DurableAgent.ts +85 -85
  443. package/src/durable/DurableAgentRepository.ts +409 -260
  444. package/src/durable/process.ts +22 -21
  445. package/src/durable/run.ts +61 -51
  446. package/src/durable/utils.ts +46 -41
  447. package/src/index.ts +145 -86
  448. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  449. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  450. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  451. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  452. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  453. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  454. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  455. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  456. package/src/providers/codex/CodexAdapter.ts +205 -0
  457. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  458. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  459. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  460. package/src/providers/codex/CodexSessionParser.ts +385 -0
  461. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  462. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  463. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  464. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  465. package/src/providers/pi/PiAdapter.ts +183 -0
  466. package/src/providers/pi/PiAgentMapper.ts +36 -0
  467. package/src/providers/pi/PiSessionLocator.ts +95 -0
  468. package/src/providers/pi/PiSessionParser.ts +284 -0
  469. package/src/providers/pi/PiSessionTracker.ts +87 -0
  470. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  471. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  472. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  473. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  474. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  475. package/src/readiness/AgentReadiness.ts +727 -0
  476. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  477. package/src/runtime/RuntimeFactory.ts +13 -0
  478. package/src/runtime/errors.ts +50 -0
  479. package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
  480. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  481. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  482. package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
  483. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  484. package/src/runtime/tmux/PidPolling.ts +34 -0
  485. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  486. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  487. package/src/runtime/types.ts +56 -0
  488. package/src/terminal/TerminalFocusManager.ts +215 -212
  489. package/src/terminal/TmuxManager.ts +99 -92
  490. package/src/terminal/TtyWriter.ts +203 -194
  491. package/src/terminal/index.ts +4 -4
  492. package/src/utils/AgentRegistry.ts +299 -238
  493. package/src/utils/agent-requests.ts +16 -16
  494. package/src/utils/agents.ts +41 -38
  495. package/src/utils/applescript.ts +4 -4
  496. package/src/utils/index.ts +12 -6
  497. package/src/utils/matching.ts +43 -43
  498. package/src/utils/process.ts +261 -258
  499. package/src/utils/session.ts +66 -66
  500. package/src/utils/sortAgents.ts +35 -33
  501. package/tsconfig.json +2 -8
  502. package/vitest.config.ts +16 -16
  503. package/.eslintrc.json +0 -31
  504. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  505. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  506. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  507. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  508. package/dist/adapters/CodexAdapter.d.ts +0 -109
  509. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  510. package/dist/adapters/CodexAdapter.js +0 -710
  511. package/dist/adapters/CodexAdapter.js.map +0 -1
  512. package/dist/adapters/PiAdapter.d.ts +0 -63
  513. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  514. package/dist/adapters/PiAdapter.js +0 -453
  515. package/dist/adapters/PiAdapter.js.map +0 -1
  516. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  517. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  518. package/src/adapters/CodexAdapter.ts +0 -923
  519. package/src/adapters/PiAdapter.ts +0 -598
@@ -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";