@ai-devkit/agent-manager 0.32.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 +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/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 -43
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -26
  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 +6 -6
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  280. package/dist/readiness/AgentReadiness.js +130 -130
  281. package/dist/readiness/AgentReadiness.js.map +1 -1
  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 +217 -169
  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 +144 -103
  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 +585 -513
  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
@@ -1,14 +1,14 @@
1
1
  /**
2
2
  * Tests for CopilotAdapter
3
- */ import * as fs from 'fs';
4
- import * as os from 'os';
5
- import * as path from 'path';
6
- import { CopilotAdapter } from '../../adapters/CopilotAdapter.js';
7
- import { AgentStatus } from '../../adapters/AgentAdapter.js';
8
- import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from '../../utils/process.js';
9
- import { generateAgentName } from '../../utils/matching.js';
10
- import { AgentRegistry } from '../../utils/AgentRegistry.js';
11
- vi.mock('../../utils/process.js', async (importOriginal)=>{
3
+ */ import * as fs from "fs";
4
+ import * as os from "os";
5
+ import * as path from "path";
6
+ import { CopilotAdapter } from "../../adapters/CopilotAdapter.js";
7
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
8
+ import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from "../../utils/process.js";
9
+ import { generateAgentName } from "../../utils/matching.js";
10
+ import { AgentRegistry } from "../../utils/AgentRegistry.js";
11
+ vi.mock("../../utils/process.js", async (importOriginal)=>{
12
12
  const actual = await importOriginal();
13
13
  return {
14
14
  ...actual,
@@ -17,21 +17,21 @@ vi.mock('../../utils/process.js', async (importOriginal)=>{
17
17
  captureProcessSnapshot: vi.fn()
18
18
  };
19
19
  });
20
- vi.mock('../../utils/matching.js', ()=>({
20
+ vi.mock("../../utils/matching.js", ()=>({
21
21
  generateAgentName: vi.fn()
22
22
  }));
23
23
  const mockedListAgentProcesses = listAgentProcesses;
24
24
  const mockedEnrichProcesses = enrichProcesses;
25
25
  const mockedCaptureProcessSnapshot = captureProcessSnapshot;
26
26
  const mockedGenerateAgentName = generateAgentName;
27
- describe('CopilotAdapter', ()=>{
27
+ describe("CopilotAdapter", ()=>{
28
28
  let adapter;
29
29
  let tmpDir;
30
30
  let sessionStateDir;
31
31
  beforeEach(()=>{
32
32
  adapter = new CopilotAdapter();
33
- tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'copilot-test-'));
34
- sessionStateDir = path.join(tmpDir, 'session-state');
33
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "copilot-test-"));
34
+ sessionStateDir = path.join(tmpDir, "session-state");
35
35
  fs.mkdirSync(sessionStateDir, {
36
36
  recursive: true
37
37
  });
@@ -43,7 +43,7 @@ describe('CopilotAdapter', ()=>{
43
43
  mockedEnrichProcesses.mockImplementation((procs)=>procs);
44
44
  // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.
45
45
  mockedCaptureProcessSnapshot.mockImplementation(async (names)=>enrichProcesses(names.flatMap((name)=>listAgentProcesses(name))));
46
- mockedGenerateAgentName.mockImplementation((cwd, pid)=>`${path.basename(cwd) || 'unknown'} (${pid})`);
46
+ mockedGenerateAgentName.mockImplementation((cwd, pid)=>`${path.basename(cwd) || "unknown"} (${pid})`);
47
47
  });
48
48
  afterEach(()=>{
49
49
  fs.rmSync(tmpDir, {
@@ -57,167 +57,167 @@ describe('CopilotAdapter', ()=>{
57
57
  recursive: true
58
58
  });
59
59
  if (options.events) {
60
- const lines = options.events.map((entry)=>typeof entry === 'string' ? entry : JSON.stringify(entry));
61
- fs.writeFileSync(path.join(sessionDir, 'events.jsonl'), lines.join('\n'));
60
+ const lines = options.events.map((entry)=>typeof entry === "string" ? entry : JSON.stringify(entry));
61
+ fs.writeFileSync(path.join(sessionDir, "events.jsonl"), lines.join("\n"));
62
62
  }
63
63
  if (options.workspace) {
64
64
  const lines = Object.entries(options.workspace).map(([key, value])=>`${key}: ${value}`);
65
- fs.writeFileSync(path.join(sessionDir, 'workspace.yaml'), lines.join('\n'));
65
+ fs.writeFileSync(path.join(sessionDir, "workspace.yaml"), lines.join("\n"));
66
66
  }
67
67
  if (options.lockPid !== undefined) {
68
- fs.writeFileSync(path.join(sessionDir, `inuse.${options.lockPid}.lock`), '');
68
+ fs.writeFileSync(path.join(sessionDir, `inuse.${options.lockPid}.lock`), "");
69
69
  }
70
70
  return sessionDir;
71
71
  }
72
- function sessionStart(sessionId, cwd, startTime = '2026-06-09T09:50:00.000Z') {
72
+ function sessionStart(sessionId, cwd, startTime = "2026-06-09T09:50:00.000Z") {
73
73
  return {
74
- type: 'session.start',
74
+ type: "session.start",
75
75
  data: {
76
76
  sessionId,
77
77
  startTime,
78
78
  context: {
79
79
  cwd,
80
80
  gitRoot: cwd,
81
- branch: 'main'
81
+ branch: "main"
82
82
  }
83
83
  },
84
84
  timestamp: startTime
85
85
  };
86
86
  }
87
- describe('initialization', ()=>{
88
- it('exposes copilot type', ()=>{
89
- expect(adapter.type).toBe('copilot');
87
+ describe("initialization", ()=>{
88
+ it("exposes copilot type", ()=>{
89
+ expect(adapter.type).toBe("copilot");
90
90
  });
91
91
  });
92
- describe('canHandle', ()=>{
93
- it('returns true for copilot commands', ()=>{
92
+ describe("canHandle", ()=>{
93
+ it("returns true for copilot commands", ()=>{
94
94
  expect(adapter.canHandle({
95
95
  pid: 1,
96
- command: 'copilot',
97
- cwd: '/repo',
98
- tty: 'ttys001'
96
+ command: "copilot",
97
+ cwd: "/repo",
98
+ tty: "ttys001"
99
99
  })).toBe(true);
100
100
  });
101
- it('returns true for full-path Homebrew copilot commands', ()=>{
101
+ it("returns true for full-path Homebrew copilot commands", ()=>{
102
102
  expect(adapter.canHandle({
103
103
  pid: 2,
104
- command: '/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot',
105
- cwd: '/repo',
106
- tty: 'ttys002'
104
+ command: "/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot",
105
+ cwd: "/repo",
106
+ tty: "ttys002"
107
107
  })).toBe(true);
108
108
  });
109
- it('returns true for copilot.exe commands', ()=>{
109
+ it("returns true for copilot.exe commands", ()=>{
110
110
  expect(adapter.canHandle({
111
111
  pid: 3,
112
- command: '/usr/bin/copilot.exe',
113
- cwd: '/repo',
114
- tty: 'ttys003'
112
+ command: "/usr/bin/copilot.exe",
113
+ cwd: "/repo",
114
+ tty: "ttys003"
115
115
  })).toBe(true);
116
116
  });
117
- it('returns false when copilot appears only in an argument', ()=>{
117
+ it("returns false when copilot appears only in an argument", ()=>{
118
118
  expect(adapter.canHandle({
119
119
  pid: 4,
120
- command: 'node /repo/copilot-plugin/index.js',
121
- cwd: '/repo',
122
- tty: 'ttys004'
120
+ command: "node /repo/copilot-plugin/index.js",
121
+ cwd: "/repo",
122
+ tty: "ttys004"
123
123
  })).toBe(false);
124
124
  });
125
125
  });
126
- describe('detectAgents', ()=>{
127
- it('returns empty list when no copilot process is running', async ()=>{
126
+ describe("detectAgents", ()=>{
127
+ it("returns empty list when no copilot process is running", async ()=>{
128
128
  mockedListAgentProcesses.mockReturnValue([]);
129
129
  const agents = await adapter.detectAgents();
130
130
  expect(agents).toEqual([]);
131
- expect(mockedListAgentProcesses).toHaveBeenCalledWith('copilot');
131
+ expect(mockedListAgentProcesses).toHaveBeenCalledWith("copilot");
132
132
  });
133
- it('maps matching inuse lock and events to an active agent', async ()=>{
133
+ it("maps matching inuse lock and events to an active agent", async ()=>{
134
134
  const processes = [
135
135
  {
136
136
  pid: 14096,
137
- command: '/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot',
138
- cwd: '/repo',
139
- tty: 'ttys001'
137
+ command: "/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot",
138
+ cwd: "/repo",
139
+ tty: "ttys001"
140
140
  }
141
141
  ];
142
142
  mockedListAgentProcesses.mockReturnValue(processes);
143
143
  mockedEnrichProcesses.mockReturnValue(processes);
144
- writeSession('sess-a', {
144
+ writeSession("sess-a", {
145
145
  lockPid: 14096,
146
146
  events: [
147
- sessionStart('sess-a', '/repo', '2026-06-09T09:50:00.000Z'),
147
+ sessionStart("sess-a", "/repo", "2026-06-09T09:50:00.000Z"),
148
148
  {
149
- type: 'user.message',
149
+ type: "user.message",
150
150
  data: {
151
- content: 'Build the Copilot adapter'
151
+ content: "Build the Copilot adapter"
152
152
  },
153
153
  timestamp: new Date().toISOString()
154
154
  },
155
155
  {
156
- type: 'assistant.message',
156
+ type: "assistant.message",
157
157
  data: {
158
- content: 'I will inspect the code.'
158
+ content: "I will inspect the code."
159
159
  },
160
160
  timestamp: new Date().toISOString()
161
161
  }
162
162
  ],
163
163
  workspace: {
164
- id: 'sess-a',
165
- cwd: '/fallback',
166
- name: 'Fallback Name',
167
- created_at: '2026-06-09T09:49:00.000Z',
168
- updated_at: '2026-06-09T09:51:00.000Z'
164
+ id: "sess-a",
165
+ cwd: "/fallback",
166
+ name: "Fallback Name",
167
+ created_at: "2026-06-09T09:49:00.000Z",
168
+ updated_at: "2026-06-09T09:51:00.000Z"
169
169
  }
170
170
  });
171
171
  const agents = await adapter.detectAgents();
172
172
  expect(agents).toHaveLength(1);
173
173
  expect(agents[0]).toMatchObject({
174
- type: 'copilot',
174
+ type: "copilot",
175
175
  status: AgentStatus.WAITING,
176
176
  pid: 14096,
177
- projectPath: '/repo',
178
- sessionId: 'sess-a',
179
- summary: 'Build the Copilot adapter',
180
- sessionFilePath: path.join(sessionStateDir, 'sess-a', 'events.jsonl')
177
+ projectPath: "/repo",
178
+ sessionId: "sess-a",
179
+ summary: "Build the Copilot adapter",
180
+ sessionFilePath: path.join(sessionStateDir, "sess-a", "events.jsonl")
181
181
  });
182
182
  });
183
- it('ignores invalid and unmatched lock PIDs', async ()=>{
183
+ it("ignores invalid and unmatched lock PIDs", async ()=>{
184
184
  const processes = [
185
185
  {
186
186
  pid: 100,
187
- command: 'copilot',
188
- cwd: '/repo',
189
- tty: 'ttys001'
187
+ command: "copilot",
188
+ cwd: "/repo",
189
+ tty: "ttys001"
190
190
  }
191
191
  ];
192
192
  mockedListAgentProcesses.mockReturnValue(processes);
193
193
  mockedEnrichProcesses.mockReturnValue(processes);
194
- writeSession('invalid', {
195
- lockPid: 'not-a-pid',
194
+ writeSession("invalid", {
195
+ lockPid: "not-a-pid",
196
196
  events: [
197
- sessionStart('invalid', '/invalid')
197
+ sessionStart("invalid", "/invalid")
198
198
  ]
199
199
  });
200
- writeSession('unmatched', {
200
+ writeSession("unmatched", {
201
201
  lockPid: 999999,
202
202
  events: [
203
- sessionStart('unmatched', '/unmatched')
203
+ sessionStart("unmatched", "/unmatched")
204
204
  ]
205
205
  });
206
206
  const agents = await adapter.detectAgents();
207
207
  expect(agents).toHaveLength(1);
208
208
  expect(agents[0]).toMatchObject({
209
209
  pid: 100,
210
- sessionId: 'pid-100',
211
- summary: 'Copilot process running'
210
+ sessionId: "pid-100",
211
+ summary: "Copilot process running"
212
212
  });
213
213
  });
214
- it('falls back to process-only agent when no session lock matches', async ()=>{
214
+ it("falls back to process-only agent when no session lock matches", async ()=>{
215
215
  const processes = [
216
216
  {
217
217
  pid: 200,
218
- command: 'copilot',
219
- cwd: '/repo-b',
220
- tty: 'ttys002'
218
+ command: "copilot",
219
+ cwd: "/repo-b",
220
+ tty: "ttys002"
221
221
  }
222
222
  ];
223
223
  mockedListAgentProcesses.mockReturnValue(processes);
@@ -225,28 +225,28 @@ describe('CopilotAdapter', ()=>{
225
225
  const agents = await adapter.detectAgents();
226
226
  expect(agents).toHaveLength(1);
227
227
  expect(agents[0]).toMatchObject({
228
- type: 'copilot',
228
+ type: "copilot",
229
229
  status: AgentStatus.RUNNING,
230
230
  pid: 200,
231
- projectPath: '/repo-b',
232
- sessionId: 'pid-200',
233
- summary: 'Copilot process running'
231
+ projectPath: "/repo-b",
232
+ sessionId: "pid-200",
233
+ summary: "Copilot process running"
234
234
  });
235
235
  });
236
- it('suppresses wrapper process-only agents before the session lock exists', async ()=>{
236
+ it("suppresses wrapper process-only agents before the session lock exists", async ()=>{
237
237
  const processes = [
238
238
  {
239
239
  pid: 86800,
240
- command: 'copilot',
241
- cwd: '/repo',
242
- tty: 'ttys001',
240
+ command: "copilot",
241
+ cwd: "/repo",
242
+ tty: "ttys001",
243
243
  ppid: 84174
244
244
  },
245
245
  {
246
246
  pid: 86810,
247
- command: '/custom/install/copilot',
248
- cwd: '/repo',
249
- tty: 'ttys001',
247
+ command: "/custom/install/copilot",
248
+ cwd: "/repo",
249
+ tty: "ttys001",
250
250
  ppid: 86800
251
251
  }
252
252
  ];
@@ -256,75 +256,78 @@ describe('CopilotAdapter', ()=>{
256
256
  expect(agents).toHaveLength(1);
257
257
  expect(agents[0]).toMatchObject({
258
258
  pid: 86810,
259
- sessionId: 'pid-86810',
260
- summary: 'Copilot process running'
259
+ sessionId: "pid-86810",
260
+ summary: "Copilot process running"
261
261
  });
262
262
  });
263
- it('carries the managed wrapper name to a process-only child before the session lock exists', async ()=>{
264
- const registry = new AgentRegistry(path.join(tmpDir, 'agents.json'));
263
+ it("carries the managed wrapper name to a process-only child before the session lock exists", async ()=>{
264
+ const registry = new AgentRegistry(path.join(tmpDir, "agents.json"));
265
265
  adapter = new CopilotAdapter(registry);
266
266
  adapter.sessionStateDir = sessionStateDir;
267
267
  const processes = [
268
268
  {
269
269
  pid: 86800,
270
- command: 'copilot',
271
- cwd: '/repo',
272
- tty: 'ttys001',
270
+ command: "copilot",
271
+ cwd: "/repo",
272
+ tty: "ttys001",
273
273
  ppid: 84174
274
274
  },
275
275
  {
276
276
  pid: 86810,
277
- command: '/custom/install/copilot',
278
- cwd: '/repo',
279
- tty: 'ttys001',
277
+ command: "/custom/install/copilot",
278
+ cwd: "/repo",
279
+ tty: "ttys001",
280
280
  ppid: 86800
281
281
  }
282
282
  ];
283
283
  registry.register({
284
- name: 'copilot-started',
285
- type: 'copilot',
284
+ name: "copilot-started",
285
+ type: "copilot",
286
286
  pid: 86800,
287
- tmuxSession: 'copilot-started',
288
- cwd: '/repo',
289
- startedAt: '2026-06-13T19:15:16.211Z',
290
- sessionId: 'pid-86800',
291
- sessionFilePath: ''
287
+ runtime: "tmux",
288
+ runtimeRef: {
289
+ session: "copilot-started"
290
+ },
291
+ cwd: "/repo",
292
+ startedAt: "2026-06-13T19:15:16.211Z",
293
+ sessionId: "pid-86800",
294
+ sessionFilePath: ""
292
295
  });
293
296
  mockedListAgentProcesses.mockReturnValue(processes);
294
297
  mockedEnrichProcesses.mockReturnValue(processes);
295
298
  const agents = await adapter.detectAgents();
296
299
  expect(agents).toHaveLength(1);
297
300
  expect(agents[0]).toMatchObject({
298
- name: 'copilot-started',
301
+ name: "copilot-started",
299
302
  pid: 86810,
300
- sessionId: 'pid-86810'
303
+ sessionId: "pid-86810"
301
304
  });
302
305
  });
303
- it('does not add duplicate process-only agent for wrapper process in the same terminal', async ()=>{
306
+ it("does not add duplicate process-only agent for wrapper process in the same terminal", async ()=>{
304
307
  const processes = [
305
308
  {
306
309
  pid: 14095,
307
- command: 'copilot',
308
- cwd: '/repo',
309
- tty: 'ttys001'
310
+ command: "copilot",
311
+ cwd: "/repo",
312
+ tty: "ttys001"
310
313
  },
311
314
  {
312
315
  pid: 14096,
313
- command: '/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot',
314
- cwd: '/repo',
315
- tty: 'ttys001'
316
+ command: "/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot",
317
+ cwd: "/repo",
318
+ tty: "ttys001"
316
319
  }
317
320
  ];
318
321
  mockedListAgentProcesses.mockReturnValue(processes);
319
322
  mockedEnrichProcesses.mockReturnValue(processes);
320
- writeSession('sess-wrapper', {
323
+ writeSession("sess-wrapper", {
321
324
  lockPid: 14096,
322
325
  events: [
323
- sessionStart('sess-wrapper', '/repo', '2026-06-09T09:50:00.000Z'),
326
+ sessionStart("sess-wrapper", "/repo", "2026-06-09T09:50:00.000Z"),
324
327
  {
325
- type: 'user.message',
328
+ type: "user.message",
326
329
  data: {
327
- content: 'hello'
330
+ content: "hello"
328
331
  },
329
332
  timestamp: new Date().toISOString()
330
333
  }
@@ -334,49 +337,52 @@ describe('CopilotAdapter', ()=>{
334
337
  expect(agents).toHaveLength(1);
335
338
  expect(agents[0]).toMatchObject({
336
339
  pid: 14096,
337
- sessionId: 'sess-wrapper'
340
+ sessionId: "sess-wrapper"
338
341
  });
339
342
  });
340
- it('carries the managed wrapper name to a lock-backed child process', async ()=>{
341
- const registry = new AgentRegistry(path.join(tmpDir, 'agents.json'));
343
+ it("carries the managed wrapper name to a lock-backed child process", async ()=>{
344
+ const registry = new AgentRegistry(path.join(tmpDir, "agents.json"));
342
345
  adapter = new CopilotAdapter(registry);
343
346
  adapter.sessionStateDir = sessionStateDir;
344
347
  const processes = [
345
348
  {
346
349
  pid: 14095,
347
- command: 'copilot',
348
- cwd: '/repo',
349
- tty: 'ttys001',
350
+ command: "copilot",
351
+ cwd: "/repo",
352
+ tty: "ttys001",
350
353
  ppid: 84174
351
354
  },
352
355
  {
353
356
  pid: 14096,
354
- command: '/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot',
355
- cwd: '/repo',
356
- tty: 'ttys001',
357
+ command: "/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot",
358
+ cwd: "/repo",
359
+ tty: "ttys001",
357
360
  ppid: 14095
358
361
  }
359
362
  ];
360
363
  registry.register({
361
- name: 'copilot-started',
362
- type: 'copilot',
364
+ name: "copilot-started",
365
+ type: "copilot",
363
366
  pid: 14095,
364
- tmuxSession: 'copilot-started',
365
- cwd: '/repo',
366
- startedAt: '2026-06-13T19:15:16.211Z',
367
- sessionId: 'pid-14095',
368
- sessionFilePath: ''
367
+ runtime: "tmux",
368
+ runtimeRef: {
369
+ session: "copilot-started"
370
+ },
371
+ cwd: "/repo",
372
+ startedAt: "2026-06-13T19:15:16.211Z",
373
+ sessionId: "pid-14095",
374
+ sessionFilePath: ""
369
375
  });
370
376
  mockedListAgentProcesses.mockReturnValue(processes);
371
377
  mockedEnrichProcesses.mockReturnValue(processes);
372
- writeSession('sess-wrapper', {
378
+ writeSession("sess-wrapper", {
373
379
  lockPid: 14096,
374
380
  events: [
375
- sessionStart('sess-wrapper', '/repo', '2026-06-09T09:50:00.000Z'),
381
+ sessionStart("sess-wrapper", "/repo", "2026-06-09T09:50:00.000Z"),
376
382
  {
377
- type: 'user.message',
383
+ type: "user.message",
378
384
  data: {
379
- content: 'hello'
385
+ content: "hello"
380
386
  },
381
387
  timestamp: new Date().toISOString()
382
388
  }
@@ -385,176 +391,176 @@ describe('CopilotAdapter', ()=>{
385
391
  const agents = await adapter.detectAgents();
386
392
  expect(agents).toHaveLength(1);
387
393
  expect(agents[0]).toMatchObject({
388
- name: 'copilot-started',
394
+ name: "copilot-started",
389
395
  pid: 14096,
390
- sessionId: 'sess-wrapper'
396
+ sessionId: "sess-wrapper"
391
397
  });
392
398
  });
393
- it('uses workspace metadata when events are missing', async ()=>{
399
+ it("uses workspace metadata when events are missing", async ()=>{
394
400
  const processes = [
395
401
  {
396
402
  pid: 300,
397
- command: 'copilot',
398
- cwd: '/proc-cwd',
399
- tty: 'ttys003'
403
+ command: "copilot",
404
+ cwd: "/proc-cwd",
405
+ tty: "ttys003"
400
406
  }
401
407
  ];
402
408
  mockedListAgentProcesses.mockReturnValue(processes);
403
409
  mockedEnrichProcesses.mockReturnValue(processes);
404
- writeSession('workspace-only', {
410
+ writeSession("workspace-only", {
405
411
  lockPid: 300,
406
412
  workspace: {
407
- id: 'workspace-only',
408
- cwd: '/workspace-cwd',
409
- name: 'Workspace Session',
410
- created_at: '2026-06-09T09:00:00.000Z',
411
- updated_at: '2026-06-09T09:10:00.000Z'
413
+ id: "workspace-only",
414
+ cwd: "/workspace-cwd",
415
+ name: "Workspace Session",
416
+ created_at: "2026-06-09T09:00:00.000Z",
417
+ updated_at: "2026-06-09T09:10:00.000Z"
412
418
  }
413
419
  });
414
420
  const agents = await adapter.detectAgents();
415
421
  expect(agents).toHaveLength(1);
416
422
  expect(agents[0]).toMatchObject({
417
423
  pid: 300,
418
- projectPath: '/workspace-cwd',
419
- sessionId: 'workspace-only',
420
- summary: 'Workspace Session'
424
+ projectPath: "/workspace-cwd",
425
+ sessionId: "workspace-only",
426
+ summary: "Workspace Session"
421
427
  });
422
428
  });
423
429
  });
424
- describe('getConversation', ()=>{
425
- it('parses user and assistant message events', ()=>{
426
- const sessionDir = writeSession('conv', {
430
+ describe("getConversation", ()=>{
431
+ it("parses user and assistant message events", ()=>{
432
+ const sessionDir = writeSession("conv", {
427
433
  events: [
428
- sessionStart('conv', '/repo'),
434
+ sessionStart("conv", "/repo"),
429
435
  {
430
- type: 'user.message',
436
+ type: "user.message",
431
437
  data: {
432
- content: 'hello'
438
+ content: "hello"
433
439
  },
434
- timestamp: '2026-06-09T09:50:01.000Z'
440
+ timestamp: "2026-06-09T09:50:01.000Z"
435
441
  },
436
442
  {
437
- type: 'assistant.message',
443
+ type: "assistant.message",
438
444
  data: {
439
- content: 'Hi there'
445
+ content: "Hi there"
440
446
  },
441
- timestamp: '2026-06-09T09:50:02.000Z'
447
+ timestamp: "2026-06-09T09:50:02.000Z"
442
448
  }
443
449
  ]
444
450
  });
445
- const messages = adapter.getConversation(path.join(sessionDir, 'events.jsonl'));
451
+ const messages = adapter.getConversation(path.join(sessionDir, "events.jsonl"));
446
452
  expect(messages).toEqual([
447
453
  {
448
- role: 'user',
449
- content: 'hello',
450
- timestamp: '2026-06-09T09:50:01.000Z'
454
+ role: "user",
455
+ content: "hello",
456
+ timestamp: "2026-06-09T09:50:01.000Z"
451
457
  },
452
458
  {
453
- role: 'assistant',
454
- content: 'Hi there',
455
- timestamp: '2026-06-09T09:50:02.000Z'
459
+ role: "assistant",
460
+ content: "Hi there",
461
+ timestamp: "2026-06-09T09:50:02.000Z"
456
462
  }
457
463
  ]);
458
464
  });
459
- it('includes system/info/warning messages only in verbose mode', ()=>{
460
- const sessionDir = writeSession('verbose', {
465
+ it("includes system/info/warning messages only in verbose mode", ()=>{
466
+ const sessionDir = writeSession("verbose", {
461
467
  events: [
462
468
  {
463
- type: 'session.warning',
469
+ type: "session.warning",
464
470
  data: {
465
- message: 'MCP failed'
471
+ message: "MCP failed"
466
472
  },
467
- timestamp: '2026-06-09T09:50:01.000Z'
473
+ timestamp: "2026-06-09T09:50:01.000Z"
468
474
  },
469
475
  {
470
- type: 'tool.execution_complete',
476
+ type: "tool.execution_complete",
471
477
  data: {
472
478
  result: {
473
- content: 'Tool result'
479
+ content: "Tool result"
474
480
  }
475
481
  },
476
- timestamp: '2026-06-09T09:50:02.000Z'
482
+ timestamp: "2026-06-09T09:50:02.000Z"
477
483
  }
478
484
  ]
479
485
  });
480
- const filePath = path.join(sessionDir, 'events.jsonl');
486
+ const filePath = path.join(sessionDir, "events.jsonl");
481
487
  expect(adapter.getConversation(filePath)).toEqual([]);
482
488
  expect(adapter.getConversation(filePath, {
483
489
  verbose: true
484
490
  })).toEqual([
485
491
  {
486
- role: 'system',
487
- content: 'MCP failed',
488
- timestamp: '2026-06-09T09:50:01.000Z'
492
+ role: "system",
493
+ content: "MCP failed",
494
+ timestamp: "2026-06-09T09:50:01.000Z"
489
495
  },
490
496
  {
491
- role: 'system',
492
- content: 'Tool result',
493
- timestamp: '2026-06-09T09:50:02.000Z'
497
+ role: "system",
498
+ content: "Tool result",
499
+ timestamp: "2026-06-09T09:50:02.000Z"
494
500
  }
495
501
  ]);
496
502
  });
497
- it('skips malformed JSONL lines and missing text', ()=>{
498
- const sessionDir = writeSession('malformed', {
503
+ it("skips malformed JSONL lines and missing text", ()=>{
504
+ const sessionDir = writeSession("malformed", {
499
505
  events: [
500
- 'not json',
506
+ "not json",
501
507
  {
502
- type: 'user.message',
508
+ type: "user.message",
503
509
  data: {
504
- content: 'valid'
510
+ content: "valid"
505
511
  },
506
- timestamp: '2026-06-09T09:50:01.000Z'
512
+ timestamp: "2026-06-09T09:50:01.000Z"
507
513
  },
508
514
  {
509
- type: 'assistant.message',
515
+ type: "assistant.message",
510
516
  data: {},
511
- timestamp: '2026-06-09T09:50:02.000Z'
517
+ timestamp: "2026-06-09T09:50:02.000Z"
512
518
  }
513
519
  ]
514
520
  });
515
- const messages = adapter.getConversation(path.join(sessionDir, 'events.jsonl'));
521
+ const messages = adapter.getConversation(path.join(sessionDir, "events.jsonl"));
516
522
  expect(messages).toEqual([
517
523
  {
518
- role: 'user',
519
- content: 'valid',
520
- timestamp: '2026-06-09T09:50:01.000Z'
524
+ role: "user",
525
+ content: "valid",
526
+ timestamp: "2026-06-09T09:50:01.000Z"
521
527
  }
522
528
  ]);
523
529
  });
524
- it('returns empty array for missing file', ()=>{
525
- expect(adapter.getConversation(path.join(tmpDir, 'missing.jsonl'))).toEqual([]);
530
+ it("returns empty array for missing file", ()=>{
531
+ expect(adapter.getConversation(path.join(tmpDir, "missing.jsonl"))).toEqual([]);
526
532
  });
527
533
  });
528
- describe('listSessions', ()=>{
529
- it('returns historical sessions without active locks', async ()=>{
530
- writeSession('history-a', {
534
+ describe("listSessions", ()=>{
535
+ it("returns historical sessions without active locks", async ()=>{
536
+ writeSession("history-a", {
531
537
  events: [
532
- sessionStart('history-a', '/repo-a', '2026-06-09T09:00:00.000Z'),
538
+ sessionStart("history-a", "/repo-a", "2026-06-09T09:00:00.000Z"),
533
539
  {
534
- type: 'user.message',
540
+ type: "user.message",
535
541
  data: {
536
- content: 'first user'
542
+ content: "first user"
537
543
  },
538
- timestamp: '2026-06-09T09:00:01.000Z'
544
+ timestamp: "2026-06-09T09:00:01.000Z"
539
545
  },
540
546
  {
541
- type: 'assistant.message',
547
+ type: "assistant.message",
542
548
  data: {
543
- content: 'answer'
549
+ content: "answer"
544
550
  },
545
- timestamp: '2026-06-09T09:00:02.000Z'
551
+ timestamp: "2026-06-09T09:00:02.000Z"
546
552
  }
547
553
  ]
548
554
  });
549
- writeSession('history-b', {
555
+ writeSession("history-b", {
550
556
  events: [
551
- sessionStart('history-b', '/repo-b', '2026-06-09T10:00:00.000Z'),
557
+ sessionStart("history-b", "/repo-b", "2026-06-09T10:00:00.000Z"),
552
558
  {
553
- type: 'user.message',
559
+ type: "user.message",
554
560
  data: {
555
- content: 'other user'
561
+ content: "other user"
556
562
  },
557
- timestamp: '2026-06-09T10:00:01.000Z'
563
+ timestamp: "2026-06-09T10:00:01.000Z"
558
564
  }
559
565
  ]
560
566
  });
@@ -564,64 +570,64 @@ describe('CopilotAdapter', ()=>{
564
570
  session.sessionId,
565
571
  session
566
572
  ]));
567
- expect(byId['history-a']).toMatchObject({
568
- type: 'copilot',
569
- cwd: '/repo-a',
570
- firstUserMessage: 'first user',
571
- sessionFilePath: path.join(sessionStateDir, 'history-a', 'events.jsonl')
573
+ expect(byId["history-a"]).toMatchObject({
574
+ type: "copilot",
575
+ cwd: "/repo-a",
576
+ firstUserMessage: "first user",
577
+ sessionFilePath: path.join(sessionStateDir, "history-a", "events.jsonl")
572
578
  });
573
- expect(byId['history-b']).toMatchObject({
574
- type: 'copilot',
575
- cwd: '/repo-b',
576
- firstUserMessage: 'other user'
579
+ expect(byId["history-b"]).toMatchObject({
580
+ type: "copilot",
581
+ cwd: "/repo-b",
582
+ firstUserMessage: "other user"
577
583
  });
578
584
  });
579
- it('applies strict cwd filter', async ()=>{
580
- writeSession('keep', {
585
+ it("applies strict cwd filter", async ()=>{
586
+ writeSession("keep", {
581
587
  events: [
582
- sessionStart('keep', '/repo')
588
+ sessionStart("keep", "/repo")
583
589
  ]
584
590
  });
585
- writeSession('drop', {
591
+ writeSession("drop", {
586
592
  events: [
587
- sessionStart('drop', '/other')
593
+ sessionStart("drop", "/other")
588
594
  ]
589
595
  });
590
596
  const sessions = await adapter.listSessions({
591
- cwd: '/repo'
597
+ cwd: "/repo"
592
598
  });
593
599
  expect(sessions).toHaveLength(1);
594
- expect(sessions[0].sessionId).toBe('keep');
600
+ expect(sessions[0].sessionId).toBe("keep");
595
601
  });
596
- it('uses workspace fallback for historical sessions without events', async ()=>{
597
- writeSession('workspace-history', {
602
+ it("uses workspace fallback for historical sessions without events", async ()=>{
603
+ writeSession("workspace-history", {
598
604
  workspace: {
599
- id: 'workspace-history',
600
- cwd: '/workspace-repo',
601
- name: 'Workspace History',
602
- created_at: '2026-06-09T08:00:00.000Z',
603
- updated_at: '2026-06-09T08:10:00.000Z'
605
+ id: "workspace-history",
606
+ cwd: "/workspace-repo",
607
+ name: "Workspace History",
608
+ created_at: "2026-06-09T08:00:00.000Z",
609
+ updated_at: "2026-06-09T08:10:00.000Z"
604
610
  }
605
611
  });
606
612
  const sessions = await adapter.listSessions();
607
613
  expect(sessions).toHaveLength(1);
608
614
  expect(sessions[0]).toMatchObject({
609
- type: 'copilot',
610
- sessionId: 'workspace-history',
611
- cwd: '/workspace-repo',
612
- firstUserMessage: '',
613
- sessionFilePath: path.join(sessionStateDir, 'workspace-history', 'events.jsonl')
615
+ type: "copilot",
616
+ sessionId: "workspace-history",
617
+ cwd: "/workspace-repo",
618
+ firstUserMessage: "",
619
+ sessionFilePath: path.join(sessionStateDir, "workspace-history", "events.jsonl")
614
620
  });
615
621
  });
616
- it('skips session directories without events or workspace metadata', async ()=>{
617
- fs.mkdirSync(path.join(sessionStateDir, 'empty'), {
622
+ it("skips session directories without events or workspace metadata", async ()=>{
623
+ fs.mkdirSync(path.join(sessionStateDir, "empty"), {
618
624
  recursive: true
619
625
  });
620
626
  const sessions = await adapter.listSessions();
621
627
  expect(sessions).toEqual([]);
622
628
  });
623
- it('returns empty when session-state directory does not exist', async ()=>{
624
- adapter.sessionStateDir = path.join(tmpDir, 'missing');
629
+ it("returns empty when session-state directory does not exist", async ()=>{
630
+ adapter.sessionStateDir = path.join(tmpDir, "missing");
625
631
  await expect(adapter.listSessions()).resolves.toEqual([]);
626
632
  });
627
633
  });