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