@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
@@ -5,310 +5,363 @@
5
5
  * and reads session details from chat_history.jsonl (not summary.json/updates.jsonl).
6
6
  */
7
7
 
8
- import type { MockedFunction } from 'vitest';
9
- import * as fs from 'fs';
10
- import * as os from 'os';
11
- import * as path from 'path';
12
-
13
- import { GrokCliAdapter } from '../../adapters/GrokCliAdapter.js';
14
- import type { ProcessInfo } from '../../adapters/AgentAdapter.js';
15
- import { AgentStatus } from '../../adapters/AgentAdapter.js';
16
- import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';
17
- import { generateAgentName } from '../../utils/matching.js';
18
-
19
- vi.mock('../../utils/process.js', async (importOriginal) => {
20
- const actual = (await importOriginal()) as typeof import('../../utils/process.js');
21
- return {
22
- ...actual,
23
- listAgentProcesses: vi.fn(),
24
- enrichProcesses: vi.fn(),
25
- captureProcessSnapshot: vi.fn(),
26
- };
8
+ import type { MockedFunction } from "vitest";
9
+ import * as fs from "fs";
10
+ import * as os from "os";
11
+ import * as path from "path";
12
+
13
+ import { GrokCliAdapter } from "../../adapters/GrokCliAdapter.js";
14
+ import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
15
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
16
+ import {
17
+ listAgentProcesses,
18
+ enrichProcesses,
19
+ captureProcessSnapshot,
20
+ } from "../../utils/process.js";
21
+ import { generateAgentName } from "../../utils/matching.js";
22
+
23
+ vi.mock("../../utils/process.js", async (importOriginal) => {
24
+ const actual = (await importOriginal()) as typeof import("../../utils/process.js");
25
+ return {
26
+ ...actual,
27
+ listAgentProcesses: vi.fn(),
28
+ enrichProcesses: vi.fn(),
29
+ captureProcessSnapshot: vi.fn(),
30
+ };
27
31
  });
28
32
 
29
- vi.mock('../../utils/matching.js', async (importOriginal) => {
30
- const actual = (await importOriginal()) as typeof import('../../utils/matching.js');
31
- return {
32
- ...actual,
33
- generateAgentName: vi.fn(),
34
- };
33
+ vi.mock("../../utils/matching.js", async (importOriginal) => {
34
+ const actual = (await importOriginal()) as typeof import("../../utils/matching.js");
35
+ return {
36
+ ...actual,
37
+ generateAgentName: vi.fn(),
38
+ };
35
39
  });
36
40
 
37
41
  const mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;
38
42
  const mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;
39
- const mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<typeof captureProcessSnapshot>;
43
+ const mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<
44
+ typeof captureProcessSnapshot
45
+ >;
40
46
  const mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;
41
47
 
42
- const SESSION_ID = '019f16c3-5d5d-7dc3-85d1-bc629416ca2d';
48
+ const SESSION_ID = "019f16c3-5d5d-7dc3-85d1-bc629416ca2d";
43
49
 
44
50
  /** A user transcript record: the real prompt wrapped in <user_query> like Grok writes it. */
45
51
  const userRecord = (text: string) => ({
46
- type: 'user',
47
- content: [{ type: 'text', text: `<user_query>\n${text}\n</user_query>` }],
52
+ type: "user",
53
+ content: [{ type: "text", text: `<user_query>\n${text}\n</user_query>` }],
48
54
  });
49
55
  /** A user context-injection record (no <user_query>) — should be ignored as a prompt. */
50
- const contextRecord = (text: string) => ({ type: 'user', content: [{ type: 'text', text }] });
51
- const assistantRecord = (text: string) => ({ type: 'assistant', content: [{ type: 'text', text }] });
52
- const systemRecord = (text: string) => ({ type: 'system', content: text });
53
-
54
- describe('GrokCliAdapter', () => {
55
- let adapter: GrokCliAdapter;
56
- let tmpHome: string;
57
- let cwd: string;
58
-
59
- beforeEach(() => {
60
- tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), 'grok-adapter-test-'));
61
- process.env.HOME = tmpHome;
62
- delete process.env.GROK_HOME;
63
- cwd = '/Users/dev/my-project';
64
-
65
- adapter = new GrokCliAdapter();
66
-
67
- mockedListAgentProcesses.mockReset();
68
- mockedEnrichProcesses.mockReset();
69
- mockedCaptureProcessSnapshot.mockReset();
70
- mockedGenerateAgentName.mockReset();
71
-
72
- mockedEnrichProcesses.mockImplementation((procs) => procs);
73
- // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.
74
- mockedCaptureProcessSnapshot.mockImplementation(async (names) => (
75
- enrichProcesses(names.flatMap((name) => listAgentProcesses(name)))
76
- ));
77
- mockedGenerateAgentName.mockImplementation((c: string, pid: number) => `${path.basename(c) || 'unknown'}-${pid}`);
56
+ const contextRecord = (text: string) => ({ type: "user", content: [{ type: "text", text }] });
57
+ const assistantRecord = (text: string) => ({
58
+ type: "assistant",
59
+ content: [{ type: "text", text }],
60
+ });
61
+ const systemRecord = (text: string) => ({ type: "system", content: text });
62
+
63
+ describe("GrokCliAdapter", () => {
64
+ let adapter: GrokCliAdapter;
65
+ let tmpHome: string;
66
+ let cwd: string;
67
+
68
+ beforeEach(() => {
69
+ tmpHome = fs.mkdtempSync(path.join(os.tmpdir(), "grok-adapter-test-"));
70
+ process.env.HOME = tmpHome;
71
+ delete process.env.GROK_HOME;
72
+ cwd = "/Users/dev/my-project";
73
+
74
+ adapter = new GrokCliAdapter();
75
+
76
+ mockedListAgentProcesses.mockReset();
77
+ mockedEnrichProcesses.mockReset();
78
+ mockedCaptureProcessSnapshot.mockReset();
79
+ mockedGenerateAgentName.mockReset();
80
+
81
+ mockedEnrichProcesses.mockImplementation((procs) => procs);
82
+ // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.
83
+ mockedCaptureProcessSnapshot.mockImplementation(async (names) =>
84
+ enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),
85
+ );
86
+ mockedGenerateAgentName.mockImplementation(
87
+ (c: string, pid: number) => `${path.basename(c) || "unknown"}-${pid}`,
88
+ );
89
+ });
90
+
91
+ afterEach(() => {
92
+ fs.rmSync(tmpHome, { recursive: true, force: true });
93
+ });
94
+
95
+ /** Write a session dir under ~/.grok/sessions/<enc(cwd)>/<id>/chat_history.jsonl. */
96
+ function writeSession(opts: {
97
+ sessionCwd?: string;
98
+ id?: string;
99
+ records?: object[];
100
+ chat?: boolean;
101
+ mtime?: Date;
102
+ }): string {
103
+ const sessionCwd = opts.sessionCwd ?? cwd;
104
+ const id = opts.id ?? SESSION_ID;
105
+ const sessionDir = path.join(tmpHome, ".grok", "sessions", encodeURIComponent(sessionCwd), id);
106
+ fs.mkdirSync(sessionDir, { recursive: true });
107
+
108
+ if (opts.chat !== false) {
109
+ const records = opts.records ?? [userRecord("fix the bug")];
110
+ const chatPath = path.join(sessionDir, "chat_history.jsonl");
111
+ fs.writeFileSync(chatPath, records.map((r) => JSON.stringify(r)).join("\n"));
112
+ if (opts.mtime) fs.utimesSync(chatPath, opts.mtime, opts.mtime);
113
+ }
114
+
115
+ return sessionDir;
116
+ }
117
+
118
+ /** Write ~/.grok/active_sessions.json (the live pid -> cwd registry). */
119
+ function writeActiveSessions(
120
+ entries: Array<{ pid: number; cwd: string; opened_at?: number }>,
121
+ ): void {
122
+ fs.mkdirSync(path.join(tmpHome, ".grok"), { recursive: true });
123
+ fs.writeFileSync(path.join(tmpHome, ".grok", "active_sessions.json"), JSON.stringify(entries));
124
+ }
125
+
126
+ function proc(overrides: Partial<ProcessInfo> = {}): ProcessInfo {
127
+ return {
128
+ pid: 4242,
129
+ ppid: 1,
130
+ command: "grok",
131
+ cwd,
132
+ tty: "ttys010",
133
+ startTime: new Date(),
134
+ ...overrides,
135
+ };
136
+ }
137
+
138
+ describe("initialization", () => {
139
+ it("exposes the grok_cli type", () => {
140
+ expect(adapter.type).toBe("grok_cli");
78
141
  });
142
+ });
79
143
 
80
- afterEach(() => {
81
- fs.rmSync(tmpHome, { recursive: true, force: true });
144
+ describe("canHandle", () => {
145
+ it("returns true for a plain grok command", () => {
146
+ expect(adapter.canHandle(proc({ command: "grok" }))).toBe(true);
82
147
  });
83
148
 
84
- /** Write a session dir under ~/.grok/sessions/<enc(cwd)>/<id>/chat_history.jsonl. */
85
- function writeSession(opts: {
86
- sessionCwd?: string;
87
- id?: string;
88
- records?: object[];
89
- chat?: boolean;
90
- mtime?: Date;
91
- }): string {
92
- const sessionCwd = opts.sessionCwd ?? cwd;
93
- const id = opts.id ?? SESSION_ID;
94
- const sessionDir = path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(sessionCwd), id);
95
- fs.mkdirSync(sessionDir, { recursive: true });
96
-
97
- if (opts.chat !== false) {
98
- const records = opts.records ?? [userRecord('fix the bug')];
99
- const chatPath = path.join(sessionDir, 'chat_history.jsonl');
100
- fs.writeFileSync(chatPath, records.map((r) => JSON.stringify(r)).join('\n'));
101
- if (opts.mtime) fs.utimesSync(chatPath, opts.mtime, opts.mtime);
102
- }
103
-
104
- return sessionDir;
105
- }
149
+ it("returns true for grok with a full path and args", () => {
150
+ expect(
151
+ adapter.canHandle(proc({ command: "/Users/dev/.grok/bin/grok --always-approve" })),
152
+ ).toBe(true);
153
+ });
106
154
 
107
- /** Write ~/.grok/active_sessions.json (the live pid -> cwd registry). */
108
- function writeActiveSessions(entries: Array<{ pid: number; cwd: string; opened_at?: number }>): void {
109
- fs.mkdirSync(path.join(tmpHome, '.grok'), { recursive: true });
110
- fs.writeFileSync(path.join(tmpHome, '.grok', 'active_sessions.json'), JSON.stringify(entries));
111
- }
155
+ it("returns false for non-grok processes", () => {
156
+ expect(adapter.canHandle(proc({ command: "node app.js" }))).toBe(false);
157
+ });
112
158
 
113
- function proc(overrides: Partial<ProcessInfo> = {}): ProcessInfo {
114
- return { pid: 4242, ppid: 1, command: 'grok', cwd, tty: 'ttys010', startTime: new Date(), ...overrides };
115
- }
159
+ it('returns false when "grok" appears only in an argument path', () => {
160
+ expect(adapter.canHandle(proc({ command: "node /path/to/grok-thing.js" }))).toBe(false);
161
+ });
162
+ });
116
163
 
117
- describe('initialization', () => {
118
- it('exposes the grok_cli type', () => {
119
- expect(adapter.type).toBe('grok_cli');
120
- });
164
+ describe("detectAgents", () => {
165
+ it("returns [] when there are no grok processes", async () => {
166
+ mockedListAgentProcesses.mockReturnValue([]);
167
+ expect(await adapter.detectAgents()).toEqual([]);
121
168
  });
122
169
 
123
- describe('canHandle', () => {
124
- it('returns true for a plain grok command', () => {
125
- expect(adapter.canHandle(proc({ command: 'grok' }))).toBe(true);
126
- });
170
+ it("resolves the cwd via active_sessions.json (authoritative over the process cwd)", async () => {
171
+ const realCwd = "/Users/dev/real-project";
172
+ writeSession({ sessionCwd: realCwd });
173
+ // The process cwd is stale/wrong; active_sessions.json has the truth.
174
+ writeActiveSessions([{ pid: 4242, cwd: realCwd, opened_at: 1 }]);
175
+ mockedListAgentProcesses.mockReturnValue([proc({ cwd: "/wrong/path" })]);
176
+
177
+ const agents = await adapter.detectAgents();
178
+
179
+ expect(agents).toHaveLength(1);
180
+ expect(agents[0]).toMatchObject({
181
+ type: "grok_cli",
182
+ pid: 4242,
183
+ projectPath: realCwd,
184
+ sessionId: SESSION_ID,
185
+ summary: "fix the bug",
186
+ });
187
+ expect(agents[0].sessionFilePath).toBe(
188
+ path.join(
189
+ tmpHome,
190
+ ".grok",
191
+ "sessions",
192
+ encodeURIComponent(realCwd),
193
+ SESSION_ID,
194
+ "chat_history.jsonl",
195
+ ),
196
+ );
197
+ });
198
+
199
+ it("falls back to the process cwd when the pid is not in active_sessions.json", async () => {
200
+ writeSession({});
201
+ writeActiveSessions([{ pid: 9999, cwd: "/somewhere/else" }]);
202
+ mockedListAgentProcesses.mockReturnValue([proc()]);
127
203
 
128
- it('returns true for grok with a full path and args', () => {
129
- expect(adapter.canHandle(proc({ command: '/Users/dev/.grok/bin/grok --always-approve' }))).toBe(true);
130
- });
204
+ const agents = await adapter.detectAgents();
131
205
 
132
- it('returns false for non-grok processes', () => {
133
- expect(adapter.canHandle(proc({ command: 'node app.js' }))).toBe(false);
134
- });
206
+ expect(agents[0]).toMatchObject({ projectPath: cwd, sessionId: SESSION_ID });
207
+ });
208
+
209
+ it("picks the most recently active session dir when a cwd has several", async () => {
210
+ const older = new Date(Date.now() - 60 * 60 * 1000);
211
+ writeSession({
212
+ id: "019f0000-0000-7000-8000-00000000000a",
213
+ records: [userRecord("old one")],
214
+ mtime: older,
215
+ });
216
+ writeSession({
217
+ id: "019f0000-0000-7000-8000-00000000000b",
218
+ records: [userRecord("newest one")],
219
+ });
220
+ mockedListAgentProcesses.mockReturnValue([proc()]);
221
+
222
+ const agents = await adapter.detectAgents();
223
+
224
+ expect(agents[0].sessionId).toBe("019f0000-0000-7000-8000-00000000000b");
225
+ expect(agents[0].summary).toBe("newest one");
226
+ });
227
+
228
+ it("falls back to a process-only RUNNING agent when no session matches", async () => {
229
+ mockedListAgentProcesses.mockReturnValue([proc()]);
230
+
231
+ const agents = await adapter.detectAgents();
232
+
233
+ expect(agents).toHaveLength(1);
234
+ expect(agents[0].status).toBe(AgentStatus.RUNNING);
235
+ expect(agents[0].sessionId).toBe("pid-4242");
236
+ expect(agents[0].sessionFilePath).toBeUndefined();
237
+ });
238
+
239
+ it("treats a session dir without chat_history.jsonl as no match (process-only)", async () => {
240
+ writeSession({ chat: false });
241
+ mockedListAgentProcesses.mockReturnValue([proc()]);
242
+
243
+ const agents = await adapter.detectAgents();
244
+
245
+ expect(agents).toHaveLength(1);
246
+ expect(agents[0].sessionId).toBe("pid-4242");
247
+ });
248
+ });
249
+
250
+ describe("getConversation", () => {
251
+ it("maps user (<user_query>) and assistant records to roles", () => {
252
+ const dir = writeSession({ records: [userRecord("hi"), assistantRecord("hello")] });
253
+ expect(adapter.getConversation(path.join(dir, "chat_history.jsonl"))).toEqual([
254
+ { role: "user", content: "hi" },
255
+ { role: "assistant", content: "hello" },
256
+ ]);
257
+ });
258
+
259
+ it("accepts a session dir path and skips context-injection user records", () => {
260
+ const dir = writeSession({
261
+ records: [contextRecord("<user_info>OS: macos</user_info>"), userRecord("do the thing")],
262
+ });
263
+ expect(adapter.getConversation(dir)).toEqual([{ role: "user", content: "do the thing" }]);
264
+ });
265
+
266
+ it("skips malformed lines", () => {
267
+ const dir = writeSession({ records: [userRecord("hi")] });
268
+ fs.appendFileSync(path.join(dir, "chat_history.jsonl"), "\n{bad json");
269
+ expect(adapter.getConversation(dir)).toEqual([{ role: "user", content: "hi" }]);
270
+ });
271
+
272
+ it("excludes system records unless verbose", () => {
273
+ const dir = writeSession({ records: [systemRecord("You are Grok"), userRecord("go")] });
274
+ expect(adapter.getConversation(dir)).toEqual([{ role: "user", content: "go" }]);
275
+ expect(adapter.getConversation(dir, { verbose: true }).map((m) => m.role)).toEqual([
276
+ "system",
277
+ "user",
278
+ ]);
279
+ });
280
+ });
281
+
282
+ describe("detectAgents status + summary mapping", () => {
283
+ const detectFirst = async () => (await adapter.detectAgents())[0];
284
+
285
+ it("marks WAITING when the last transcript turn is an assistant message", async () => {
286
+ writeSession({ records: [userRecord("go"), assistantRecord("done")] });
287
+ mockedListAgentProcesses.mockReturnValue([proc()]);
288
+ expect((await detectFirst()).status).toBe(AgentStatus.WAITING);
289
+ });
290
+
291
+ it("marks RUNNING when the last transcript turn is a user message", async () => {
292
+ writeSession({ records: [userRecord("still there?")] });
293
+ mockedListAgentProcesses.mockReturnValue([proc()]);
294
+ expect((await detectFirst()).status).toBe(AgentStatus.RUNNING);
295
+ });
296
+
297
+ it("marks IDLE when chat_history.jsonl is older than the threshold", async () => {
298
+ const old = new Date(Date.now() - 10 * 60 * 1000);
299
+ writeSession({ records: [userRecord("go")], mtime: old });
300
+ mockedListAgentProcesses.mockReturnValue([proc()]);
301
+ expect((await detectFirst()).status).toBe(AgentStatus.IDLE);
302
+ });
135
303
 
136
- it('returns false when "grok" appears only in an argument path', () => {
137
- expect(adapter.canHandle(proc({ command: 'node /path/to/grok-thing.js' }))).toBe(false);
138
- });
304
+ it("uses the last user prompt as the agent summary", async () => {
305
+ writeSession({ records: [userRecord("refactor the parser"), assistantRecord("on it")] });
306
+ mockedListAgentProcesses.mockReturnValue([proc()]);
307
+ expect((await detectFirst()).summary).toBe("refactor the parser");
139
308
  });
309
+ });
140
310
 
141
- describe('detectAgents', () => {
142
- it('returns [] when there are no grok processes', async () => {
143
- mockedListAgentProcesses.mockReturnValue([]);
144
- expect(await adapter.detectAgents()).toEqual([]);
145
- });
146
-
147
- it('resolves the cwd via active_sessions.json (authoritative over the process cwd)', async () => {
148
- const realCwd = '/Users/dev/real-project';
149
- writeSession({ sessionCwd: realCwd });
150
- // The process cwd is stale/wrong; active_sessions.json has the truth.
151
- writeActiveSessions([{ pid: 4242, cwd: realCwd, opened_at: 1 }]);
152
- mockedListAgentProcesses.mockReturnValue([proc({ cwd: '/wrong/path' })]);
153
-
154
- const agents = await adapter.detectAgents();
155
-
156
- expect(agents).toHaveLength(1);
157
- expect(agents[0]).toMatchObject({
158
- type: 'grok_cli',
159
- pid: 4242,
160
- projectPath: realCwd,
161
- sessionId: SESSION_ID,
162
- summary: 'fix the bug',
163
- });
164
- expect(agents[0].sessionFilePath).toBe(
165
- path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(realCwd), SESSION_ID, 'chat_history.jsonl'),
166
- );
167
- });
168
-
169
- it('falls back to the process cwd when the pid is not in active_sessions.json', async () => {
170
- writeSession({});
171
- writeActiveSessions([{ pid: 9999, cwd: '/somewhere/else' }]);
172
- mockedListAgentProcesses.mockReturnValue([proc()]);
173
-
174
- const agents = await adapter.detectAgents();
175
-
176
- expect(agents[0]).toMatchObject({ projectPath: cwd, sessionId: SESSION_ID });
177
- });
178
-
179
- it('picks the most recently active session dir when a cwd has several', async () => {
180
- const older = new Date(Date.now() - 60 * 60 * 1000);
181
- writeSession({ id: '019f0000-0000-7000-8000-00000000000a', records: [userRecord('old one')], mtime: older });
182
- writeSession({ id: '019f0000-0000-7000-8000-00000000000b', records: [userRecord('newest one')] });
183
- mockedListAgentProcesses.mockReturnValue([proc()]);
184
-
185
- const agents = await adapter.detectAgents();
186
-
187
- expect(agents[0].sessionId).toBe('019f0000-0000-7000-8000-00000000000b');
188
- expect(agents[0].summary).toBe('newest one');
189
- });
190
-
191
- it('falls back to a process-only RUNNING agent when no session matches', async () => {
192
- mockedListAgentProcesses.mockReturnValue([proc()]);
193
-
194
- const agents = await adapter.detectAgents();
195
-
196
- expect(agents).toHaveLength(1);
197
- expect(agents[0].status).toBe(AgentStatus.RUNNING);
198
- expect(agents[0].sessionId).toBe('pid-4242');
199
- expect(agents[0].sessionFilePath).toBeUndefined();
200
- });
201
-
202
- it('treats a session dir without chat_history.jsonl as no match (process-only)', async () => {
203
- writeSession({ chat: false });
204
- mockedListAgentProcesses.mockReturnValue([proc()]);
205
-
206
- const agents = await adapter.detectAgents();
207
-
208
- expect(agents).toHaveLength(1);
209
- expect(agents[0].sessionId).toBe('pid-4242');
210
- });
311
+ describe("listSessions", () => {
312
+ it("returns [] when the sessions dir does not exist", async () => {
313
+ expect(await adapter.listSessions()).toEqual([]);
211
314
  });
212
315
 
213
- describe('getConversation', () => {
214
- it('maps user (<user_query>) and assistant records to roles', () => {
215
- const dir = writeSession({ records: [userRecord('hi'), assistantRecord('hello')] });
216
- expect(adapter.getConversation(path.join(dir, 'chat_history.jsonl'))).toEqual([
217
- { role: 'user', content: 'hi' },
218
- { role: 'assistant', content: 'hello' },
219
- ]);
220
- });
221
-
222
- it('accepts a session dir path and skips context-injection user records', () => {
223
- const dir = writeSession({
224
- records: [contextRecord('<user_info>OS: macos</user_info>'), userRecord('do the thing')],
225
- });
226
- expect(adapter.getConversation(dir)).toEqual([{ role: 'user', content: 'do the thing' }]);
227
- });
228
-
229
- it('skips malformed lines', () => {
230
- const dir = writeSession({ records: [userRecord('hi')] });
231
- fs.appendFileSync(path.join(dir, 'chat_history.jsonl'), '\n{bad json');
232
- expect(adapter.getConversation(dir)).toEqual([{ role: 'user', content: 'hi' }]);
233
- });
234
-
235
- it('excludes system records unless verbose', () => {
236
- const dir = writeSession({ records: [systemRecord('You are Grok'), userRecord('go')] });
237
- expect(adapter.getConversation(dir)).toEqual([{ role: 'user', content: 'go' }]);
238
- expect(adapter.getConversation(dir, { verbose: true }).map((m) => m.role)).toEqual(['system', 'user']);
239
- });
316
+ it("lists historical sessions with cwd decoded from the group dir", async () => {
317
+ writeSession({});
318
+ const summaries = await adapter.listSessions();
319
+ expect(summaries).toHaveLength(1);
320
+ expect(summaries[0]).toMatchObject({
321
+ type: "grok_cli",
322
+ sessionId: SESSION_ID,
323
+ cwd,
324
+ firstUserMessage: "fix the bug",
325
+ });
326
+ expect(summaries[0].sessionFilePath).toBe(
327
+ path.join(
328
+ tmpHome,
329
+ ".grok",
330
+ "sessions",
331
+ encodeURIComponent(cwd),
332
+ SESSION_ID,
333
+ "chat_history.jsonl",
334
+ ),
335
+ );
240
336
  });
241
337
 
242
- describe('detectAgents status + summary mapping', () => {
243
- const detectFirst = async () => (await adapter.detectAgents())[0];
244
-
245
- it('marks WAITING when the last transcript turn is an assistant message', async () => {
246
- writeSession({ records: [userRecord('go'), assistantRecord('done')] });
247
- mockedListAgentProcesses.mockReturnValue([proc()]);
248
- expect((await detectFirst()).status).toBe(AgentStatus.WAITING);
249
- });
250
-
251
- it('marks RUNNING when the last transcript turn is a user message', async () => {
252
- writeSession({ records: [userRecord('still there?')] });
253
- mockedListAgentProcesses.mockReturnValue([proc()]);
254
- expect((await detectFirst()).status).toBe(AgentStatus.RUNNING);
255
- });
256
-
257
- it('marks IDLE when chat_history.jsonl is older than the threshold', async () => {
258
- const old = new Date(Date.now() - 10 * 60 * 1000);
259
- writeSession({ records: [userRecord('go')], mtime: old });
260
- mockedListAgentProcesses.mockReturnValue([proc()]);
261
- expect((await detectFirst()).status).toBe(AgentStatus.IDLE);
262
- });
263
-
264
- it('uses the last user prompt as the agent summary', async () => {
265
- writeSession({ records: [userRecord('refactor the parser'), assistantRecord('on it')] });
266
- mockedListAgentProcesses.mockReturnValue([proc()]);
267
- expect((await detectFirst()).summary).toBe('refactor the parser');
268
- });
338
+ it("applies the cwd filter against the decoded cwd", async () => {
339
+ writeSession({
340
+ sessionCwd: "/Users/dev/project-a",
341
+ id: "019f0000-0000-7000-8000-00000000000a",
342
+ });
343
+ writeSession({
344
+ sessionCwd: "/Users/dev/project-b",
345
+ id: "019f0000-0000-7000-8000-00000000000b",
346
+ });
347
+
348
+ const all = await adapter.listSessions();
349
+ expect(all).toHaveLength(2);
350
+
351
+ const filtered = await adapter.listSessions({ cwd: "/Users/dev/project-a" });
352
+ expect(filtered).toHaveLength(1);
353
+ expect(filtered[0].cwd).toBe("/Users/dev/project-a");
269
354
  });
270
355
 
271
- describe('listSessions', () => {
272
- it('returns [] when the sessions dir does not exist', async () => {
273
- expect(await adapter.listSessions()).toEqual([]);
274
- });
275
-
276
- it('lists historical sessions with cwd decoded from the group dir', async () => {
277
- writeSession({});
278
- const summaries = await adapter.listSessions();
279
- expect(summaries).toHaveLength(1);
280
- expect(summaries[0]).toMatchObject({
281
- type: 'grok_cli',
282
- sessionId: SESSION_ID,
283
- cwd,
284
- firstUserMessage: 'fix the bug',
285
- });
286
- expect(summaries[0].sessionFilePath).toBe(
287
- path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(cwd), SESSION_ID, 'chat_history.jsonl'),
288
- );
289
- });
290
-
291
- it('applies the cwd filter against the decoded cwd', async () => {
292
- writeSession({ sessionCwd: '/Users/dev/project-a', id: '019f0000-0000-7000-8000-00000000000a' });
293
- writeSession({ sessionCwd: '/Users/dev/project-b', id: '019f0000-0000-7000-8000-00000000000b' });
294
-
295
- const all = await adapter.listSessions();
296
- expect(all).toHaveLength(2);
297
-
298
- const filtered = await adapter.listSessions({ cwd: '/Users/dev/project-a' });
299
- expect(filtered).toHaveLength(1);
300
- expect(filtered[0].cwd).toBe('/Users/dev/project-a');
301
- });
302
-
303
- it('skips non-session entries (e.g. prompt_history.jsonl) in a group dir', async () => {
304
- writeSession({});
305
- // Grok writes a group-level prompt_history.jsonl alongside session dirs.
306
- fs.writeFileSync(
307
- path.join(tmpHome, '.grok', 'sessions', encodeURIComponent(cwd), 'prompt_history.jsonl'),
308
- '{"text":"noise"}',
309
- );
310
- const summaries = await adapter.listSessions();
311
- expect(summaries).toHaveLength(1);
312
- });
356
+ it("skips non-session entries (e.g. prompt_history.jsonl) in a group dir", async () => {
357
+ writeSession({});
358
+ // Grok writes a group-level prompt_history.jsonl alongside session dirs.
359
+ fs.writeFileSync(
360
+ path.join(tmpHome, ".grok", "sessions", encodeURIComponent(cwd), "prompt_history.jsonl"),
361
+ '{"text":"noise"}',
362
+ );
363
+ const summaries = await adapter.listSessions();
364
+ expect(summaries).toHaveLength(1);
313
365
  });
366
+ });
314
367
  });