@ai-devkit/agent-manager 0.32.0 → 0.33.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (572) hide show
  1. package/dist/AgentManager.d.ts +13 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +116 -84
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +623 -391
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
  8. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  9. package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
  10. package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
  11. package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
  12. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +170 -169
  14. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  15. package/dist/__tests__/capacity/codex.test.js +93 -93
  16. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  17. package/dist/__tests__/capacity/index.test.js +17 -17
  18. package/dist/__tests__/capacity/index.test.js.map +1 -1
  19. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  20. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  21. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  22. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  24. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  26. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  28. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  29. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  30. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  31. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  32. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  34. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  36. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  37. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  38. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  39. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  40. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  42. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  43. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  44. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  45. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  46. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  47. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  48. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  49. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  50. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  51. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  52. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
  53. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +641 -0
  54. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +1 -0
  55. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +1398 -0
  56. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +1 -0
  57. package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
  58. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
  59. package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
  60. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
  61. package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
  62. package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
  63. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
  64. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
  65. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
  66. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  67. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
  68. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
  69. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
  70. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
  71. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
  72. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
  73. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
  74. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
  75. package/dist/__tests__/readiness/AgentReadiness.test.js +134 -134
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  77. package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
  78. package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
  79. package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js +164 -0
  80. package/dist/__tests__/runtime/HerdrAgentDiscovery.test.js.map +1 -0
  81. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +488 -0
  82. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  84. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  85. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  86. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  88. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  89. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  90. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  91. package/dist/__tests__/utils/AgentRegistry.test.js +343 -218
  92. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  93. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  94. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  95. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  96. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  97. package/dist/__tests__/utils/agents.test.js +17 -17
  98. package/dist/__tests__/utils/agents.test.js.map +1 -1
  99. package/dist/__tests__/utils/matching.test.js +92 -92
  100. package/dist/__tests__/utils/matching.test.js.map +1 -1
  101. package/dist/__tests__/utils/process.test.js +108 -108
  102. package/dist/__tests__/utils/process.test.js.map +1 -1
  103. package/dist/__tests__/utils/session.test.js +53 -53
  104. package/dist/__tests__/utils/session.test.js.map +1 -1
  105. package/dist/adapters/AgentAdapter.d.ts +2 -2
  106. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  107. package/dist/adapters/AgentAdapter.js +1 -1
  108. package/dist/adapters/AgentAdapter.js.map +1 -1
  109. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  110. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  111. package/dist/adapters/GrokCliAdapter.js +80 -80
  112. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  113. package/dist/adapters/OpenCodeAdapter.d.ts +2 -1
  114. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  115. package/dist/adapters/OpenCodeAdapter.js +41 -37
  116. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  117. package/dist/adapters/index.d.ts +9 -9
  118. package/dist/adapters/index.d.ts.map +1 -1
  119. package/dist/adapters/index.js +8 -8
  120. package/dist/adapters/index.js.map +1 -1
  121. package/dist/capacity/codex.d.ts +3 -3
  122. package/dist/capacity/codex.d.ts.map +1 -1
  123. package/dist/capacity/codex.js +57 -57
  124. package/dist/capacity/codex.js.map +1 -1
  125. package/dist/capacity/index.d.ts +3 -3
  126. package/dist/capacity/index.d.ts.map +1 -1
  127. package/dist/capacity/index.js +8 -8
  128. package/dist/capacity/index.js.map +1 -1
  129. package/dist/capacity/types.d.ts +1 -1
  130. package/dist/capacity/types.js.map +1 -1
  131. package/dist/database/connection.d.ts +1 -1
  132. package/dist/database/connection.d.ts.map +1 -1
  133. package/dist/database/connection.js +15 -15
  134. package/dist/database/connection.js.map +1 -1
  135. package/dist/database/index.d.ts +3 -3
  136. package/dist/database/index.d.ts.map +1 -1
  137. package/dist/database/index.js +2 -2
  138. package/dist/database/index.js.map +1 -1
  139. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  140. package/dist/database/schema.d.ts +1 -1
  141. package/dist/database/schema.d.ts.map +1 -1
  142. package/dist/database/schema.js +7 -7
  143. package/dist/database/schema.js.map +1 -1
  144. package/dist/durable/DurableAgent.d.ts +9 -9
  145. package/dist/durable/DurableAgent.d.ts.map +1 -1
  146. package/dist/durable/DurableAgent.js +16 -16
  147. package/dist/durable/DurableAgent.js.map +1 -1
  148. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  149. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  150. package/dist/durable/DurableAgentRepository.js +49 -48
  151. package/dist/durable/DurableAgentRepository.js.map +1 -1
  152. package/dist/durable/process.d.ts +1 -1
  153. package/dist/durable/process.d.ts.map +1 -1
  154. package/dist/durable/process.js +14 -14
  155. package/dist/durable/process.js.map +1 -1
  156. package/dist/durable/run.d.ts +2 -2
  157. package/dist/durable/run.d.ts.map +1 -1
  158. package/dist/durable/run.js +6 -6
  159. package/dist/durable/run.js.map +1 -1
  160. package/dist/durable/utils.d.ts +1 -1
  161. package/dist/durable/utils.d.ts.map +1 -1
  162. package/dist/durable/utils.js +4 -4
  163. package/dist/durable/utils.js.map +1 -1
  164. package/dist/index.d.ts +48 -43
  165. package/dist/index.d.ts.map +1 -1
  166. package/dist/index.js +28 -26
  167. package/dist/index.js.map +1 -1
  168. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  169. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  170. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  171. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  172. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  173. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  174. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  175. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  176. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  177. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  178. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  179. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  180. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  181. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  183. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  184. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  185. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  186. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  187. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  188. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  189. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  190. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  191. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  192. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  194. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  195. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  196. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  197. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  198. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  199. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  200. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  201. package/dist/providers/codex/CodexAdapter.js +162 -0
  202. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  203. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  204. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  205. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  206. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  207. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  208. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  209. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  210. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  211. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  212. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  213. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  214. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  215. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  216. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  217. package/dist/providers/codex/CodexSessionParser.js +262 -0
  218. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  219. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  220. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  221. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  222. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  223. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  224. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  225. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  226. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  227. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  229. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  230. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  231. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  232. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  233. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  234. package/dist/{adapters → providers/copilot}/CopilotAdapter.d.ts +11 -25
  235. package/dist/providers/copilot/CopilotAdapter.d.ts.map +1 -0
  236. package/dist/providers/copilot/CopilotAdapter.js +108 -0
  237. package/dist/providers/copilot/CopilotAdapter.js.map +1 -0
  238. package/dist/providers/copilot/CopilotAgentMapper.d.ts +9 -0
  239. package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +1 -0
  240. package/dist/providers/copilot/CopilotAgentMapper.js +37 -0
  241. package/dist/providers/copilot/CopilotAgentMapper.js.map +1 -0
  242. package/dist/providers/copilot/CopilotSessionLocator.d.ts +19 -0
  243. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +1 -0
  244. package/dist/providers/copilot/CopilotSessionLocator.js +41 -0
  245. package/dist/providers/copilot/CopilotSessionLocator.js.map +1 -0
  246. package/dist/providers/copilot/CopilotSessionParser.d.ts +30 -0
  247. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +1 -0
  248. package/dist/providers/copilot/CopilotSessionParser.js +181 -0
  249. package/dist/providers/copilot/CopilotSessionParser.js.map +1 -0
  250. package/dist/providers/gemini/GeminiAgentMapper.d.ts +9 -0
  251. package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +1 -0
  252. package/dist/providers/gemini/GeminiAgentMapper.js +37 -0
  253. package/dist/providers/gemini/GeminiAgentMapper.js.map +1 -0
  254. package/dist/providers/gemini/GeminiCliAdapter.d.ts +52 -0
  255. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +1 -0
  256. package/dist/providers/gemini/GeminiCliAdapter.js +188 -0
  257. package/dist/providers/gemini/GeminiCliAdapter.js.map +1 -0
  258. package/dist/providers/gemini/GeminiSessionLocator.d.ts +30 -0
  259. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +1 -0
  260. package/dist/providers/gemini/GeminiSessionLocator.js +142 -0
  261. package/dist/providers/gemini/GeminiSessionLocator.js.map +1 -0
  262. package/dist/providers/gemini/GeminiSessionParser.d.ts +94 -0
  263. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +1 -0
  264. package/dist/providers/gemini/GeminiSessionParser.js +166 -0
  265. package/dist/providers/gemini/GeminiSessionParser.js.map +1 -0
  266. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  267. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  268. package/dist/providers/pi/PiAdapter.js +153 -0
  269. package/dist/providers/pi/PiAdapter.js.map +1 -0
  270. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  271. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  272. package/dist/providers/pi/PiAgentMapper.js +37 -0
  273. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  274. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  275. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  276. package/dist/providers/pi/PiSessionLocator.js +79 -0
  277. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  278. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  279. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  280. package/dist/providers/pi/PiSessionParser.js +191 -0
  281. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  282. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  283. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  284. package/dist/providers/pi/PiSessionTracker.js +69 -0
  285. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  286. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  287. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  288. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  289. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  290. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  291. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  292. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  293. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  294. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  295. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  296. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  297. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  298. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  299. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  300. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  301. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  302. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  303. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  304. package/dist/readiness/AgentReadiness.d.ts +6 -6
  305. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  306. package/dist/readiness/AgentReadiness.js +130 -130
  307. package/dist/readiness/AgentReadiness.js.map +1 -1
  308. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  309. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  310. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  311. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  312. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  313. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  314. package/dist/runtime/RuntimeFactory.js +11 -0
  315. package/dist/runtime/RuntimeFactory.js.map +1 -0
  316. package/dist/runtime/errors.d.ts +27 -0
  317. package/dist/runtime/errors.d.ts.map +1 -0
  318. package/dist/runtime/errors.js +42 -0
  319. package/dist/runtime/errors.js.map +1 -0
  320. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts +18 -0
  321. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -0
  322. package/dist/runtime/herdr/HerdrAgentDiscovery.js +183 -0
  323. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -0
  324. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +36 -0
  325. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  326. package/dist/runtime/herdr/HerdrAgentRuntime.js +202 -0
  327. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  328. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  329. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  330. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  331. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  332. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  333. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  334. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  335. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  336. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +16 -0
  337. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  338. package/dist/runtime/herdr/HerdrResponseParsers.js +107 -0
  339. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  340. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  341. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  342. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  343. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  344. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  345. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  346. package/dist/runtime/tmux/PidPolling.js +24 -0
  347. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  348. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  349. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  350. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  351. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  352. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  353. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  354. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  355. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  356. package/dist/runtime/types.d.ts +54 -0
  357. package/dist/runtime/types.d.ts.map +1 -0
  358. package/dist/runtime/types.js +3 -0
  359. package/dist/runtime/types.js.map +1 -0
  360. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  361. package/dist/terminal/TerminalFocusManager.js +50 -50
  362. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  363. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  364. package/dist/terminal/TmuxManager.js +47 -47
  365. package/dist/terminal/TmuxManager.js.map +1 -1
  366. package/dist/terminal/TtyWriter.d.ts +1 -1
  367. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  368. package/dist/terminal/TtyWriter.js +89 -89
  369. package/dist/terminal/TtyWriter.js.map +1 -1
  370. package/dist/terminal/index.d.ts +4 -4
  371. package/dist/terminal/index.js +3 -3
  372. package/dist/terminal/index.js.map +1 -1
  373. package/dist/utils/AgentRegistry.d.ts +10 -2
  374. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  375. package/dist/utils/AgentRegistry.js +59 -26
  376. package/dist/utils/AgentRegistry.js.map +1 -1
  377. package/dist/utils/agent-requests.d.ts.map +1 -1
  378. package/dist/utils/agent-requests.js +5 -5
  379. package/dist/utils/agent-requests.js.map +1 -1
  380. package/dist/utils/agents.d.ts +2 -2
  381. package/dist/utils/agents.d.ts.map +1 -1
  382. package/dist/utils/agents.js +15 -15
  383. package/dist/utils/agents.js.map +1 -1
  384. package/dist/utils/applescript.js +1 -1
  385. package/dist/utils/applescript.js.map +1 -1
  386. package/dist/utils/index.d.ts +6 -6
  387. package/dist/utils/index.d.ts.map +1 -1
  388. package/dist/utils/index.js +4 -4
  389. package/dist/utils/index.js.map +1 -1
  390. package/dist/utils/matching.d.ts +2 -2
  391. package/dist/utils/matching.d.ts.map +1 -1
  392. package/dist/utils/matching.js +4 -4
  393. package/dist/utils/matching.js.map +1 -1
  394. package/dist/utils/process.d.ts +1 -1
  395. package/dist/utils/process.d.ts.map +1 -1
  396. package/dist/utils/process.js +74 -74
  397. package/dist/utils/process.js.map +1 -1
  398. package/dist/utils/session.d.ts +1 -1
  399. package/dist/utils/session.d.ts.map +1 -1
  400. package/dist/utils/session.js +7 -7
  401. package/dist/utils/session.js.map +1 -1
  402. package/dist/utils/sortAgents.d.ts +2 -2
  403. package/dist/utils/sortAgents.d.ts.map +1 -1
  404. package/dist/utils/sortAgents.js +5 -5
  405. package/dist/utils/sortAgents.js.map +1 -1
  406. package/package.json +18 -19
  407. package/src/AgentManager.ts +338 -274
  408. package/src/__tests__/AgentManager.test.ts +1143 -907
  409. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  410. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  411. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  412. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +511 -455
  413. package/src/__tests__/capacity/codex.test.ts +178 -91
  414. package/src/__tests__/capacity/index.test.ts +27 -18
  415. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  416. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  417. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  418. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  419. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  420. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  421. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  422. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  423. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  424. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  425. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  426. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  427. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  428. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  429. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  430. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  431. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  432. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  433. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  434. package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +602 -0
  435. package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +1299 -0
  436. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  437. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  438. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  439. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  440. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  441. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  442. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  443. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  444. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  445. package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
  446. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  447. package/src/__tests__/runtime/HerdrAgentDiscovery.test.ts +131 -0
  448. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +377 -0
  449. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  450. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  451. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  452. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  453. package/src/__tests__/utils/AgentRegistry.test.ts +516 -402
  454. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  455. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  456. package/src/__tests__/utils/agents.test.ts +20 -20
  457. package/src/__tests__/utils/matching.test.ts +206 -171
  458. package/src/__tests__/utils/process.test.ts +276 -262
  459. package/src/__tests__/utils/session.test.ts +133 -139
  460. package/src/adapters/AgentAdapter.ts +134 -126
  461. package/src/adapters/GrokCliAdapter.ts +353 -342
  462. package/src/adapters/OpenCodeAdapter.ts +289 -259
  463. package/src/adapters/index.ts +15 -9
  464. package/src/capacity/codex.ts +137 -84
  465. package/src/capacity/index.ts +18 -13
  466. package/src/capacity/types.ts +1 -1
  467. package/src/database/connection.ts +73 -68
  468. package/src/database/index.ts +6 -6
  469. package/src/database/migrations/005_agent_runtime.sql +2 -0
  470. package/src/database/schema.ts +40 -38
  471. package/src/durable/DurableAgent.ts +85 -85
  472. package/src/durable/DurableAgentRepository.ts +409 -260
  473. package/src/durable/process.ts +22 -21
  474. package/src/durable/run.ts +61 -51
  475. package/src/durable/utils.ts +46 -41
  476. package/src/index.ts +151 -103
  477. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  478. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  479. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  480. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  481. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  482. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  483. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  484. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  485. package/src/providers/codex/CodexAdapter.ts +205 -0
  486. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  487. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  488. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  489. package/src/providers/codex/CodexSessionParser.ts +385 -0
  490. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  491. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  492. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  493. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  494. package/src/providers/copilot/CopilotAdapter.ts +145 -0
  495. package/src/providers/copilot/CopilotAgentMapper.ts +36 -0
  496. package/src/providers/copilot/CopilotSessionLocator.ts +57 -0
  497. package/src/providers/copilot/CopilotSessionParser.ts +289 -0
  498. package/src/providers/gemini/GeminiAgentMapper.ts +36 -0
  499. package/src/providers/gemini/GeminiCliAdapter.ts +266 -0
  500. package/src/providers/gemini/GeminiSessionLocator.ts +183 -0
  501. package/src/providers/gemini/GeminiSessionParser.ts +271 -0
  502. package/src/providers/pi/PiAdapter.ts +183 -0
  503. package/src/providers/pi/PiAgentMapper.ts +36 -0
  504. package/src/providers/pi/PiSessionLocator.ts +95 -0
  505. package/src/providers/pi/PiSessionParser.ts +284 -0
  506. package/src/providers/pi/PiSessionTracker.ts +87 -0
  507. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  508. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  509. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  510. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  511. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  512. package/src/readiness/AgentReadiness.ts +585 -513
  513. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  514. package/src/runtime/RuntimeFactory.ts +13 -0
  515. package/src/runtime/errors.ts +50 -0
  516. package/src/runtime/herdr/HerdrAgentDiscovery.ts +178 -0
  517. package/src/runtime/herdr/HerdrAgentRuntime.ts +216 -0
  518. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  519. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  520. package/src/runtime/herdr/HerdrResponseParsers.ts +86 -0
  521. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  522. package/src/runtime/tmux/PidPolling.ts +34 -0
  523. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  524. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  525. package/src/runtime/types.ts +56 -0
  526. package/src/terminal/TerminalFocusManager.ts +215 -212
  527. package/src/terminal/TmuxManager.ts +99 -92
  528. package/src/terminal/TtyWriter.ts +203 -194
  529. package/src/terminal/index.ts +4 -4
  530. package/src/utils/AgentRegistry.ts +301 -238
  531. package/src/utils/agent-requests.ts +16 -16
  532. package/src/utils/agents.ts +41 -38
  533. package/src/utils/applescript.ts +4 -4
  534. package/src/utils/index.ts +12 -6
  535. package/src/utils/matching.ts +43 -43
  536. package/src/utils/process.ts +261 -258
  537. package/src/utils/session.ts +66 -66
  538. package/src/utils/sortAgents.ts +35 -33
  539. package/tsconfig.json +2 -8
  540. package/vitest.config.ts +16 -16
  541. package/.eslintrc.json +0 -31
  542. package/dist/__tests__/adapters/CopilotAdapter.test.js +0 -630
  543. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +0 -1
  544. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +0 -1384
  545. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +0 -1
  546. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  547. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  548. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  549. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  550. package/dist/adapters/CodexAdapter.d.ts +0 -109
  551. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  552. package/dist/adapters/CodexAdapter.js +0 -710
  553. package/dist/adapters/CodexAdapter.js.map +0 -1
  554. package/dist/adapters/CopilotAdapter.d.ts.map +0 -1
  555. package/dist/adapters/CopilotAdapter.js +0 -329
  556. package/dist/adapters/CopilotAdapter.js.map +0 -1
  557. package/dist/adapters/GeminiCliAdapter.d.ts +0 -98
  558. package/dist/adapters/GeminiCliAdapter.d.ts.map +0 -1
  559. package/dist/adapters/GeminiCliAdapter.js +0 -513
  560. package/dist/adapters/GeminiCliAdapter.js.map +0 -1
  561. package/dist/adapters/PiAdapter.d.ts +0 -63
  562. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  563. package/dist/adapters/PiAdapter.js +0 -453
  564. package/dist/adapters/PiAdapter.js.map +0 -1
  565. package/src/__tests__/adapters/CopilotAdapter.test.ts +0 -510
  566. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +0 -1259
  567. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  568. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  569. package/src/adapters/CodexAdapter.ts +0 -923
  570. package/src/adapters/CopilotAdapter.ts +0 -473
  571. package/src/adapters/GeminiCliAdapter.ts +0 -701
  572. package/src/adapters/PiAdapter.ts +0 -598
@@ -0,0 +1,289 @@
1
+ import * as path from "path";
2
+ import type { ConversationMessage } from "../../adapters/AgentAdapter.js";
3
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
4
+ import { safeReadFile, safeStat } from "../../utils/session.js";
5
+
6
+ interface CopilotEventEntry {
7
+ type?: string;
8
+ data?: {
9
+ sessionId?: string;
10
+ startTime?: string;
11
+ context?: {
12
+ cwd?: string;
13
+ gitRoot?: string;
14
+ branch?: string;
15
+ };
16
+ content?: string;
17
+ transformedContent?: string;
18
+ message?: string;
19
+ text?: string;
20
+ result?: {
21
+ content?: string;
22
+ detailedContent?: string;
23
+ };
24
+ output?: string;
25
+ };
26
+ timestamp?: string;
27
+ }
28
+
29
+ interface CopilotWorkspace {
30
+ id?: string;
31
+ cwd?: string;
32
+ name?: string;
33
+ createdAt?: Date;
34
+ updatedAt?: Date;
35
+ }
36
+
37
+ export interface CopilotSession {
38
+ sessionId: string;
39
+ projectPath: string;
40
+ summary: string;
41
+ sessionStart: Date;
42
+ lastActive: Date;
43
+ lastEventType?: string;
44
+ firstUserMessage: string;
45
+ eventsFilePath: string;
46
+ }
47
+
48
+ interface CopilotEventSummary {
49
+ sessionId: string;
50
+ projectPath: string;
51
+ sessionStart: Date;
52
+ lastActive: Date;
53
+ firstUserMessage: string;
54
+ lastText: string;
55
+ lastEventType?: string;
56
+ }
57
+
58
+ const IDLE_THRESHOLD_MINUTES = 5;
59
+ const VERBOSE_SYSTEM_EVENTS = new Set([
60
+ "system.message",
61
+ "session.info",
62
+ "session.warning",
63
+ "tool.execution_start",
64
+ "tool.execution_complete",
65
+ "function",
66
+ "abort",
67
+ ]);
68
+ const WAITING_EVENTS = new Set([
69
+ "assistant.message",
70
+ "assistant.turn_end",
71
+ "session.shutdown",
72
+ "abort",
73
+ ]);
74
+
75
+ export class CopilotSessionParser {
76
+ readSessionDir(sessionDir: string, fallbackSessionId: string): CopilotSession | null {
77
+ const eventsFilePath = path.join(sessionDir, "events.jsonl");
78
+ const workspace = this.readWorkspaceMetadata(path.join(sessionDir, "workspace.yaml"));
79
+ const entries = this.readEventEntries(eventsFilePath);
80
+ if (entries.length === 0 && !this.hasWorkspaceMetadata(workspace)) {
81
+ return null;
82
+ }
83
+
84
+ const fileStat = safeStat(eventsFilePath);
85
+ const sessionStart = workspace.createdAt || fileStat?.birthtime || new Date();
86
+ const eventSummary = this.buildSessionFromEntries(entries, {
87
+ sessionId: workspace.id || fallbackSessionId,
88
+ projectPath: workspace.cwd || "",
89
+ sessionStart,
90
+ lastActive: workspace.updatedAt || fileStat?.mtime || sessionStart,
91
+ firstUserMessage: "",
92
+ lastText: "",
93
+ });
94
+
95
+ const summary =
96
+ eventSummary.firstUserMessage ||
97
+ eventSummary.lastText ||
98
+ workspace.name ||
99
+ "Copilot session active";
100
+
101
+ return {
102
+ sessionId: eventSummary.sessionId,
103
+ projectPath: eventSummary.projectPath,
104
+ summary: this.truncate(summary, 120),
105
+ sessionStart: eventSummary.sessionStart,
106
+ lastActive: eventSummary.lastActive,
107
+ lastEventType: eventSummary.lastEventType,
108
+ firstUserMessage: eventSummary.firstUserMessage,
109
+ eventsFilePath,
110
+ };
111
+ }
112
+
113
+ getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
114
+ const verbose = options?.verbose ?? false;
115
+ const content = safeReadFile(sessionFilePath);
116
+ if (content === undefined) return [];
117
+
118
+ const messages: ConversationMessage[] = [];
119
+
120
+ for (const entry of this.parseEventLines(content)) {
121
+ const role = this.roleForEvent(entry.type, verbose);
122
+ if (!role) continue;
123
+
124
+ const text = this.extractEventText(entry, verbose);
125
+ if (!text) continue;
126
+
127
+ messages.push({
128
+ role,
129
+ content: text,
130
+ timestamp: entry.timestamp,
131
+ });
132
+ }
133
+
134
+ return messages;
135
+ }
136
+
137
+ determineStatus(session: CopilotSession): AgentStatus {
138
+ const diffMs = Date.now() - session.lastActive.getTime();
139
+ const diffMinutes = diffMs / 60000;
140
+ if (diffMinutes > IDLE_THRESHOLD_MINUTES) {
141
+ return AgentStatus.IDLE;
142
+ }
143
+
144
+ if (session.lastEventType !== undefined && WAITING_EVENTS.has(session.lastEventType)) {
145
+ return AgentStatus.WAITING;
146
+ }
147
+
148
+ return AgentStatus.RUNNING;
149
+ }
150
+
151
+ private readEventEntries(eventsFilePath: string): CopilotEventEntry[] {
152
+ const content = safeReadFile(eventsFilePath);
153
+ return content === undefined ? [] : this.parseEventLines(content);
154
+ }
155
+
156
+ private buildSessionFromEntries(
157
+ entries: CopilotEventEntry[],
158
+ initial: CopilotEventSummary,
159
+ ): CopilotEventSummary {
160
+ const summary = { ...initial };
161
+ for (const entry of entries) {
162
+ const timestamp = this.parseTimestamp(entry.timestamp);
163
+ if (timestamp) {
164
+ summary.lastActive = timestamp;
165
+ }
166
+ if (entry.type) {
167
+ summary.lastEventType = entry.type;
168
+ }
169
+
170
+ if (entry.type === "session.start") {
171
+ summary.sessionId = entry.data?.sessionId || summary.sessionId;
172
+ summary.projectPath = entry.data?.context?.cwd || summary.projectPath;
173
+ summary.sessionStart =
174
+ this.parseTimestamp(entry.data?.startTime) || timestamp || summary.sessionStart;
175
+ continue;
176
+ }
177
+
178
+ const text = this.extractEventText(entry, false);
179
+ if (!text) continue;
180
+
181
+ if (!summary.firstUserMessage && entry.type === "user.message") {
182
+ summary.firstUserMessage = text;
183
+ }
184
+
185
+ if (entry.type === "user.message" || entry.type === "assistant.message") {
186
+ summary.lastText = text;
187
+ }
188
+ }
189
+
190
+ return summary;
191
+ }
192
+
193
+ private hasWorkspaceMetadata(workspace: CopilotWorkspace): boolean {
194
+ return Boolean(
195
+ workspace.id || workspace.cwd || workspace.name || workspace.createdAt || workspace.updatedAt,
196
+ );
197
+ }
198
+
199
+ private readWorkspaceMetadata(filePath: string): CopilotWorkspace {
200
+ const content = safeReadFile(filePath);
201
+ if (content === undefined) return {};
202
+
203
+ const values = new Map<string, string>();
204
+ for (const rawLine of content.split("\n")) {
205
+ const line = rawLine.trim();
206
+ if (!line || line.startsWith("#")) continue;
207
+
208
+ const idx = line.indexOf(":");
209
+ if (idx === -1) continue;
210
+
211
+ const key = line.slice(0, idx).trim();
212
+ const value = this.stripYamlScalar(line.slice(idx + 1).trim());
213
+ values.set(key, value);
214
+ }
215
+
216
+ return {
217
+ id: values.get("id"),
218
+ cwd: values.get("cwd"),
219
+ name: values.get("name"),
220
+ createdAt: this.parseTimestamp(values.get("created_at")) || undefined,
221
+ updatedAt: this.parseTimestamp(values.get("updated_at")) || undefined,
222
+ };
223
+ }
224
+
225
+ private stripYamlScalar(value: string): string {
226
+ if (
227
+ (value.startsWith('"') && value.endsWith('"')) ||
228
+ (value.startsWith("'") && value.endsWith("'"))
229
+ ) {
230
+ return value.slice(1, -1);
231
+ }
232
+ return value;
233
+ }
234
+
235
+ private parseEventLines(content: string): CopilotEventEntry[] {
236
+ const entries: CopilotEventEntry[] = [];
237
+ for (const line of content.trim().split("\n")) {
238
+ const trimmed = line.trim();
239
+ if (!trimmed) continue;
240
+
241
+ try {
242
+ entries.push(JSON.parse(trimmed) as CopilotEventEntry);
243
+ } catch {
244
+ continue;
245
+ }
246
+ }
247
+ return entries;
248
+ }
249
+
250
+ private roleForEvent(
251
+ type: string | undefined,
252
+ verbose: boolean,
253
+ ): ConversationMessage["role"] | null {
254
+ if (type === "user.message") return "user";
255
+ if (type === "assistant.message") return "assistant";
256
+ if (verbose && type !== undefined && VERBOSE_SYSTEM_EVENTS.has(type)) {
257
+ return "system";
258
+ }
259
+ return null;
260
+ }
261
+
262
+ private extractEventText(entry: CopilotEventEntry, verbose: boolean): string {
263
+ const data = entry.data;
264
+ if (!data) return "";
265
+
266
+ const raw =
267
+ data.content ||
268
+ data.message ||
269
+ data.text ||
270
+ data.result?.content ||
271
+ data.result?.detailedContent ||
272
+ (verbose ? data.output : "") ||
273
+ "";
274
+
275
+ if (typeof raw !== "string") return "";
276
+ return raw.trim();
277
+ }
278
+
279
+ private parseTimestamp(value?: string): Date | null {
280
+ if (!value) return null;
281
+ const timestamp = new Date(value);
282
+ return Number.isNaN(timestamp.getTime()) ? null : timestamp;
283
+ }
284
+
285
+ private truncate(value: string, maxLength: number): string {
286
+ if (value.length <= maxLength) return value;
287
+ return `${value.slice(0, maxLength - 3)}...`;
288
+ }
289
+ }
@@ -0,0 +1,36 @@
1
+ import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import { generateAgentName } from "../../utils/matching.js";
4
+ import { GeminiSessionParser, type GeminiSession } from "./GeminiSessionParser.js";
5
+
6
+ export class GeminiAgentMapper {
7
+ constructor(private readonly parser: GeminiSessionParser = new GeminiSessionParser()) {}
8
+
9
+ mapSessionToAgent(session: GeminiSession, processInfo: ProcessInfo, filePath: string): AgentInfo {
10
+ const projectPath = session.projectPath || processInfo.cwd || "";
11
+ return {
12
+ name: generateAgentName(projectPath, processInfo.pid),
13
+ type: "gemini_cli",
14
+ status: this.parser.determineStatus(session),
15
+ summary: session.summary || "Gemini CLI session active",
16
+ pid: processInfo.pid,
17
+ projectPath,
18
+ sessionId: session.sessionId,
19
+ lastActive: session.lastActive,
20
+ sessionFilePath: filePath,
21
+ };
22
+ }
23
+
24
+ mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {
25
+ return {
26
+ name: generateAgentName(processInfo.cwd || "", processInfo.pid),
27
+ type: "gemini_cli",
28
+ status: AgentStatus.RUNNING,
29
+ summary: "Gemini CLI process running",
30
+ pid: processInfo.pid,
31
+ projectPath: processInfo.cwd || "",
32
+ sessionId: `pid-${processInfo.pid}`,
33
+ lastActive: new Date(),
34
+ };
35
+ }
36
+ }
@@ -0,0 +1,266 @@
1
+ /**
2
+ * Gemini CLI Adapter
3
+ *
4
+ * Detects running Gemini CLI agents by:
5
+ * 1. Filtering Gemini Node processes from a shared asynchronous process snapshot
6
+ * 2. Using snapshot CWD and start-time enrichment
7
+ * 3. Discovering session files from ~/.gemini/tmp/<shortId>/chats/session-*.json
8
+ * 4. Matching sessions to processes via shared matchProcessesToSessions()
9
+ * using sha256(cwd) === session.projectHash as the resolvedCwd source
10
+ * 5. Extracting summary from the most recent user message in the session JSON
11
+ */
12
+
13
+ import type {
14
+ AgentAdapter,
15
+ AgentInfo,
16
+ ProcessInfo,
17
+ ConversationMessage,
18
+ SessionSummary,
19
+ ListSessionsOptions,
20
+ AgentDetectionContext,
21
+ } from "../../adapters/AgentAdapter.js";
22
+ import {
23
+ captureProcessSnapshot,
24
+ executableBasename,
25
+ filterByProcessNames,
26
+ findWrapperProcess,
27
+ findWrapperProcessPids,
28
+ } from "../../utils/process.js";
29
+ import { matchProcessesToSessions } from "../../utils/matching.js";
30
+ import { AgentRegistry, type RegistryEntry } from "../../utils/AgentRegistry.js";
31
+ import { GeminiAgentMapper } from "./GeminiAgentMapper.js";
32
+ import { GeminiSessionLocator, type GeminiSessionDiscovery } from "./GeminiSessionLocator.js";
33
+ import { GeminiSessionParser } from "./GeminiSessionParser.js";
34
+
35
+ export interface GeminiCliAdapterOptions {
36
+ geminiTmpDir?: string;
37
+ }
38
+
39
+ export class GeminiCliAdapter implements AgentAdapter {
40
+ readonly type = "gemini_cli" as const;
41
+ readonly processNames = ["node"] as const;
42
+
43
+ private readonly registry: AgentRegistry;
44
+ private readonly parser: GeminiSessionParser;
45
+ private readonly mapper: GeminiAgentMapper;
46
+ private readonly locator: GeminiSessionLocator;
47
+
48
+ constructor(
49
+ registry: AgentRegistry = AgentRegistry.default(),
50
+ options: GeminiCliAdapterOptions = {},
51
+ ) {
52
+ this.registry = registry;
53
+ this.parser = new GeminiSessionParser();
54
+ this.mapper = new GeminiAgentMapper(this.parser);
55
+ this.locator = new GeminiSessionLocator(options);
56
+ }
57
+
58
+ canHandle(processInfo: ProcessInfo): boolean {
59
+ return this.isGeminiExecutable(processInfo.command);
60
+ }
61
+
62
+ /**
63
+ * Detect running Gemini CLI agents.
64
+ *
65
+ * Gemini CLI ships as a Node script (`bundle/gemini.js` with shebang
66
+ * `#!/usr/bin/env node`) — unlike Claude Code (native binary per
67
+ * platform) or Codex CLI (Node wrapper that execs a native Rust
68
+ * binary). The primary running process is therefore the Node runtime
69
+ * itself, and `ps aux` lists it as `node /path/to/gemini ...` with
70
+ * argv[0] = `node`. We scan the Node process pool via the shared
71
+ * snapshot and keep only those whose command line references the gemini
72
+ * executable or script via isGeminiExecutable().
73
+ */
74
+ async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {
75
+ const processes = await this.getGeminiProcesses(context);
76
+ if (processes.length === 0) return [];
77
+
78
+ const wrapperPids = findWrapperProcessPids(processes);
79
+ const { cachedAgents, remaining } = this.tryRegistryCache(processes, wrapperPids);
80
+ if (remaining.length === 0) return this.deduplicateSessionAgents(cachedAgents);
81
+
82
+ const candidateProcesses = remaining.filter((proc) => !wrapperPids.has(proc.pid));
83
+ const registryEntriesByPid = new Map(this.registry.list().map((entry) => [entry.pid, entry]));
84
+ const discovery = this.locator.discoverSessions(candidateProcesses);
85
+
86
+ const agents =
87
+ discovery.sessions.length === 0
88
+ ? this.mapProcessOnlyAgents(candidateProcesses, processes, registryEntriesByPid)
89
+ : this.mapSessionDiscovery(discovery, candidateProcesses, processes, registryEntriesByPid);
90
+
91
+ return this.deduplicateSessionAgents([...cachedAgents, ...agents]);
92
+ }
93
+
94
+ getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[] {
95
+ return this.parser.getConversation(sessionFilePath, options);
96
+ }
97
+
98
+ async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {
99
+ const summaries: SessionSummary[] = [];
100
+
101
+ for (const filePath of this.locator.discoverHistoricalSessionFiles()) {
102
+ const summary = this.parser.fileToSessionSummary(filePath);
103
+ if (!summary) continue;
104
+ if (opts?.cwd !== undefined && summary.cwd !== opts.cwd) continue;
105
+ summaries.push(summary);
106
+ }
107
+
108
+ return summaries;
109
+ }
110
+
111
+ private async getGeminiProcesses(context?: AgentDetectionContext): Promise<ProcessInfo[]> {
112
+ const snapshot = context?.processes ?? (await captureProcessSnapshot(this.processNames));
113
+ const relevant = filterByProcessNames(snapshot, this.processNames);
114
+ return relevant.filter((process) => this.canHandle(process));
115
+ }
116
+
117
+ private mapSessionDiscovery(
118
+ discovery: GeminiSessionDiscovery,
119
+ candidateProcesses: ProcessInfo[],
120
+ allProcesses: ProcessInfo[],
121
+ registryEntriesByPid: Map<number, RegistryEntry>,
122
+ ): AgentInfo[] {
123
+ const matches = matchProcessesToSessions(candidateProcesses, discovery.sessions);
124
+ const matchedPids = new Set(matches.map((m) => m.process.pid));
125
+ const matchedProcesses: ProcessInfo[] = [];
126
+ const agents: AgentInfo[] = [];
127
+
128
+ for (const match of matches) {
129
+ const cachedContent = discovery.contentCache.get(match.session.filePath);
130
+ const sessionData = this.parser.parseSession(cachedContent, match.session.filePath);
131
+ if (!sessionData) {
132
+ matchedPids.delete(match.process.pid);
133
+ continue;
134
+ }
135
+
136
+ const agent = this.mapper.mapSessionToAgent(
137
+ sessionData,
138
+ match.process,
139
+ match.session.filePath,
140
+ );
141
+ this.applyWrapperRegistryName(agent, match.process, allProcesses, registryEntriesByPid);
142
+ agents.push(agent);
143
+ matchedProcesses.push(match.process);
144
+ }
145
+
146
+ const matchedWrapperPids = findWrapperProcessPids(candidateProcesses, matchedProcesses);
147
+ const unmatchedProcesses = candidateProcesses.filter(
148
+ (process) => !matchedPids.has(process.pid) && !matchedWrapperPids.has(process.pid),
149
+ );
150
+
151
+ agents.push(
152
+ ...this.mapProcessOnlyAgents(unmatchedProcesses, allProcesses, registryEntriesByPid),
153
+ );
154
+ return agents;
155
+ }
156
+
157
+ private mapProcessOnlyAgents(
158
+ processes: ProcessInfo[],
159
+ allProcesses: ProcessInfo[],
160
+ registryEntriesByPid: Map<number, RegistryEntry>,
161
+ ): AgentInfo[] {
162
+ return processes.map((processInfo) => {
163
+ const agent = this.mapper.mapProcessOnlyAgent(processInfo);
164
+ this.applyWrapperRegistryName(agent, processInfo, allProcesses, registryEntriesByPid);
165
+ return agent;
166
+ });
167
+ }
168
+
169
+ private applyWrapperRegistryName(
170
+ agent: AgentInfo,
171
+ processInfo: ProcessInfo,
172
+ processes: ProcessInfo[],
173
+ registryEntriesByPid: Map<number, RegistryEntry>,
174
+ ): void {
175
+ const wrapper = findWrapperProcess(processes, processInfo);
176
+ const wrapperEntry = wrapper ? registryEntriesByPid.get(wrapper.pid) : undefined;
177
+ if (wrapperEntry?.type === this.type) {
178
+ agent.name = wrapperEntry.name;
179
+ }
180
+ }
181
+
182
+ private deduplicateSessionAgents(agents: AgentInfo[]): AgentInfo[] {
183
+ const bySession = new Map<string, AgentInfo>();
184
+ const result: AgentInfo[] = [];
185
+
186
+ for (const agent of agents) {
187
+ const sessionKey = this.sessionDeduplicationKey(agent);
188
+ if (!sessionKey) {
189
+ result.push(agent);
190
+ continue;
191
+ }
192
+
193
+ const existing = bySession.get(sessionKey);
194
+ if (!existing) {
195
+ bySession.set(sessionKey, agent);
196
+ result.push(agent);
197
+ continue;
198
+ }
199
+
200
+ if (agent.pid > existing.pid) {
201
+ bySession.set(sessionKey, agent);
202
+ const index = result.indexOf(existing);
203
+ if (index >= 0) result[index] = agent;
204
+ }
205
+ }
206
+
207
+ return result;
208
+ }
209
+
210
+ private sessionDeduplicationKey(agent: AgentInfo): string | null {
211
+ if (agent.sessionFilePath) return `file:${agent.sessionFilePath}`;
212
+ if (agent.sessionId && !agent.sessionId.startsWith("pid-")) {
213
+ return `session:${agent.sessionId}`;
214
+ }
215
+ return null;
216
+ }
217
+
218
+ private tryRegistryCache(
219
+ processes: ProcessInfo[],
220
+ wrapperPids: Set<number>,
221
+ ): {
222
+ cachedAgents: AgentInfo[];
223
+ remaining: ProcessInfo[];
224
+ } {
225
+ const cachedAgents: AgentInfo[] = [];
226
+ const remaining: ProcessInfo[] = [];
227
+ const byPid = new Map(this.registry.list().map((e) => [e.pid, e]));
228
+
229
+ for (const proc of processes) {
230
+ const entry = byPid.get(proc.pid);
231
+ if (
232
+ wrapperPids.has(proc.pid) ||
233
+ !entry ||
234
+ entry.type !== this.type ||
235
+ !entry.sessionFilePath
236
+ ) {
237
+ remaining.push(proc);
238
+ continue;
239
+ }
240
+
241
+ const sessionData = this.parser.parseSession(undefined, entry.sessionFilePath);
242
+ if (!sessionData) {
243
+ remaining.push(proc);
244
+ continue;
245
+ }
246
+
247
+ cachedAgents.push(this.mapper.mapSessionToAgent(sessionData, proc, entry.sessionFilePath));
248
+ }
249
+
250
+ return { cachedAgents, remaining };
251
+ }
252
+
253
+ private isGeminiExecutable(command: string): boolean {
254
+ // Accept any token in the command line whose basename matches a
255
+ // known gemini entrypoint. This is intentionally broader than the
256
+ // other adapters' argv[0]-only check because the Node-script
257
+ // distribution puts the real gemini path in argv[1..], not argv[0].
258
+ for (const token of command.trim().split(/\s+/)) {
259
+ const base = executableBasename(token);
260
+ if (base === "gemini" || base === "gemini.exe" || base === "gemini.js") {
261
+ return true;
262
+ }
263
+ }
264
+ return false;
265
+ }
266
+ }