@ai-devkit/agent-manager 0.32.0 → 0.33.1

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