@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,74 +1,94 @@
1
- import { mkdtempSync, rmSync, writeFileSync } from 'fs';
2
- import { tmpdir } from 'os';
3
- import { join } from 'path';
4
- import { getAgentRequestPath, readLatestAgentRequest, writeAgentRequest, type AgentRequest } from '../../utils/agent-requests.js';
1
+ import { mkdtempSync, rmSync, writeFileSync } from "fs";
2
+ import { tmpdir } from "os";
3
+ import { join } from "path";
4
+ import {
5
+ getAgentRequestPath,
6
+ readLatestAgentRequest,
7
+ writeAgentRequest,
8
+ type AgentRequest,
9
+ } from "../../utils/agent-requests.js";
5
10
 
6
- describe('agent-requests', () => {
7
- let homeDir: string;
11
+ describe("agent-requests", () => {
12
+ let homeDir: string;
8
13
 
9
- beforeEach(() => {
10
- homeDir = mkdtempSync(join(tmpdir(), 'agent-requests-test-'));
11
- });
14
+ beforeEach(() => {
15
+ homeDir = mkdtempSync(join(tmpdir(), "agent-requests-test-"));
16
+ });
12
17
 
13
- afterEach(() => {
14
- rmSync(homeDir, { recursive: true, force: true });
15
- });
18
+ afterEach(() => {
19
+ rmSync(homeDir, { recursive: true, force: true });
20
+ });
16
21
 
17
- describe('getAgentRequestPath', () => {
18
- it('returns ~/.ai-devkit/agent-requests/<sessionId>.json', () => {
19
- expect(getAgentRequestPath(homeDir, 'abc-123')).toBe(
20
- join(homeDir, '.ai-devkit', 'agent-requests', 'abc-123.json'),
21
- );
22
- });
22
+ describe("getAgentRequestPath", () => {
23
+ it("returns ~/.ai-devkit/agent-requests/<sessionId>.json", () => {
24
+ expect(getAgentRequestPath(homeDir, "abc-123")).toBe(
25
+ join(homeDir, ".ai-devkit", "agent-requests", "abc-123.json"),
26
+ );
23
27
  });
28
+ });
24
29
 
25
- describe('writeAgentRequest', () => {
26
- it('creates the directory and file on first write', () => {
27
- const entry: AgentRequest = {
28
- sessionId: 'sess-1',
29
- toolName: 'Bash',
30
- toolInput: { command: 'ls /tmp' },
31
- timestamp: '2026-06-29T00:00:00.000Z',
32
- };
33
- writeAgentRequest(homeDir, entry);
30
+ describe("writeAgentRequest", () => {
31
+ it("creates the directory and file on first write", () => {
32
+ const entry: AgentRequest = {
33
+ sessionId: "sess-1",
34
+ toolName: "Bash",
35
+ toolInput: { command: "ls /tmp" },
36
+ timestamp: "2026-06-29T00:00:00.000Z",
37
+ };
38
+ writeAgentRequest(homeDir, entry);
34
39
 
35
- expect(readLatestAgentRequest(homeDir, 'sess-1')).toEqual(entry);
36
- });
40
+ expect(readLatestAgentRequest(homeDir, "sess-1")).toEqual(entry);
41
+ });
37
42
 
38
- it('overwrites an existing entry on subsequent writes', () => {
39
- const first: AgentRequest = { sessionId: 'sess-2', toolName: 'Bash', toolInput: { command: 'echo first' }, timestamp: '2026-06-29T00:00:01.000Z' };
40
- const second: AgentRequest = { sessionId: 'sess-2', toolName: 'Bash', toolInput: { command: 'echo second' }, timestamp: '2026-06-29T00:00:02.000Z' };
43
+ it("overwrites an existing entry on subsequent writes", () => {
44
+ const first: AgentRequest = {
45
+ sessionId: "sess-2",
46
+ toolName: "Bash",
47
+ toolInput: { command: "echo first" },
48
+ timestamp: "2026-06-29T00:00:01.000Z",
49
+ };
50
+ const second: AgentRequest = {
51
+ sessionId: "sess-2",
52
+ toolName: "Bash",
53
+ toolInput: { command: "echo second" },
54
+ timestamp: "2026-06-29T00:00:02.000Z",
55
+ };
41
56
 
42
- writeAgentRequest(homeDir, first);
43
- writeAgentRequest(homeDir, second);
57
+ writeAgentRequest(homeDir, first);
58
+ writeAgentRequest(homeDir, second);
44
59
 
45
- expect(readLatestAgentRequest(homeDir, 'sess-2')).toEqual(second);
46
- });
60
+ expect(readLatestAgentRequest(homeDir, "sess-2")).toEqual(second);
47
61
  });
62
+ });
48
63
 
49
- describe('readLatestAgentRequest', () => {
50
- it('returns null when no file exists for the session', () => {
51
- expect(readLatestAgentRequest(homeDir, 'no-such-session')).toBeNull();
52
- });
64
+ describe("readLatestAgentRequest", () => {
65
+ it("returns null when no file exists for the session", () => {
66
+ expect(readLatestAgentRequest(homeDir, "no-such-session")).toBeNull();
67
+ });
53
68
 
54
- it('returns null when the file contains malformed JSON', () => {
55
- const entry: AgentRequest = { sessionId: 'bad', toolName: 'Bash', toolInput: {}, timestamp: '2026-06-29T00:00:00.000Z' };
56
- writeAgentRequest(homeDir, entry);
57
- writeFileSync(getAgentRequestPath(homeDir, 'bad'), 'NOT JSON{{{', 'utf-8');
69
+ it("returns null when the file contains malformed JSON", () => {
70
+ const entry: AgentRequest = {
71
+ sessionId: "bad",
72
+ toolName: "Bash",
73
+ toolInput: {},
74
+ timestamp: "2026-06-29T00:00:00.000Z",
75
+ };
76
+ writeAgentRequest(homeDir, entry);
77
+ writeFileSync(getAgentRequestPath(homeDir, "bad"), "NOT JSON{{{", "utf-8");
58
78
 
59
- expect(readLatestAgentRequest(homeDir, 'bad')).toBeNull();
60
- });
79
+ expect(readLatestAgentRequest(homeDir, "bad")).toBeNull();
80
+ });
61
81
 
62
- it('returns the stored entry when the file is valid', () => {
63
- const entry: AgentRequest = {
64
- sessionId: 'good',
65
- toolName: 'AskUserQuestion',
66
- toolInput: { question: 'Which option?', options: ['A', 'B'] },
67
- timestamp: '2026-06-29T12:00:00.000Z',
68
- };
69
- writeAgentRequest(homeDir, entry);
82
+ it("returns the stored entry when the file is valid", () => {
83
+ const entry: AgentRequest = {
84
+ sessionId: "good",
85
+ toolName: "AskUserQuestion",
86
+ toolInput: { question: "Which option?", options: ["A", "B"] },
87
+ timestamp: "2026-06-29T12:00:00.000Z",
88
+ };
89
+ writeAgentRequest(homeDir, entry);
70
90
 
71
- expect(readLatestAgentRequest(homeDir, 'good')).toEqual(entry);
72
- });
91
+ expect(readLatestAgentRequest(homeDir, "good")).toEqual(entry);
73
92
  });
93
+ });
74
94
  });
@@ -1,24 +1,24 @@
1
- import { describe, expect, it } from 'vitest';
2
- import { AGENTS } from '../../../src/utils/agents.js';
1
+ import { describe, expect, it } from "vitest";
2
+ import { AGENTS } from "../../../src/utils/agents.js";
3
3
 
4
- describe('AGENTS', () => {
5
- it('includes Copilot as a startable agent', () => {
6
- expect(AGENTS.copilot.command).toBe('copilot');
7
- expect(AGENTS.copilot.matches('/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot')).toBe(true);
8
- expect(AGENTS.copilot.matches('node /repo/feature-cli-copilot-cli/script.js')).toBe(false);
9
- });
4
+ describe("AGENTS", () => {
5
+ it("includes Copilot as a startable agent", () => {
6
+ expect(AGENTS.copilot.command).toBe("copilot");
7
+ expect(AGENTS.copilot.matches("/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot")).toBe(true);
8
+ expect(AGENTS.copilot.matches("node /repo/feature-cli-copilot-cli/script.js")).toBe(false);
9
+ });
10
10
 
11
- it('includes Pi as a startable agent', () => {
12
- expect(AGENTS.pi.command).toBe('pi');
13
- expect(AGENTS.pi.matches('pi')).toBe(true);
14
- expect(AGENTS.pi.matches('/usr/local/bin/pi --model x')).toBe(true);
15
- expect(AGENTS.pi.matches('node /repo/feature-pi-adapter/script.js')).toBe(false);
16
- });
11
+ it("includes Pi as a startable agent", () => {
12
+ expect(AGENTS.pi.command).toBe("pi");
13
+ expect(AGENTS.pi.matches("pi")).toBe(true);
14
+ expect(AGENTS.pi.matches("/usr/local/bin/pi --model x")).toBe(true);
15
+ expect(AGENTS.pi.matches("node /repo/feature-pi-adapter/script.js")).toBe(false);
16
+ });
17
17
 
18
- it('includes Grok as a startable agent', () => {
19
- expect(AGENTS.grok_cli.command).toBe('grok');
20
- expect(AGENTS.grok_cli.matches('grok')).toBe(true);
21
- expect(AGENTS.grok_cli.matches('/Users/dev/.grok/bin/grok --always-approve')).toBe(true);
22
- expect(AGENTS.grok_cli.matches('node /repo/feature-grok-cli/script.js')).toBe(false);
23
- });
18
+ it("includes Grok as a startable agent", () => {
19
+ expect(AGENTS.grok_cli.command).toBe("grok");
20
+ expect(AGENTS.grok_cli.matches("grok")).toBe(true);
21
+ expect(AGENTS.grok_cli.matches("/Users/dev/.grok/bin/grok --always-approve")).toBe(true);
22
+ expect(AGENTS.grok_cli.matches("node /repo/feature-grok-cli/script.js")).toBe(false);
23
+ });
24
24
  });
@@ -2,198 +2,233 @@
2
2
  * Tests for utils/matching.ts
3
3
  */
4
4
 
5
-
6
- import { matchProcessesToSessions, generateAgentName } from '../../utils/matching.js';
7
- import type { ProcessInfo } from '../../adapters/AgentAdapter.js';
8
- import type { SessionFile } from '../../utils/session.js';
5
+ import { matchProcessesToSessions, generateAgentName } from "../../utils/matching.js";
6
+ import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
7
+ import type { SessionFile } from "../../utils/session.js";
9
8
 
10
9
  function makeProcess(overrides: Partial<ProcessInfo> & { pid: number }): ProcessInfo {
11
- return {
12
- command: 'claude',
13
- cwd: '/projects/my-app',
14
- tty: 'ttys001',
15
- startTime: new Date('2026-03-18T23:18:01.000Z'),
16
- ...overrides,
17
- };
10
+ return {
11
+ command: "claude",
12
+ cwd: "/projects/my-app",
13
+ tty: "ttys001",
14
+ startTime: new Date("2026-03-18T23:18:01.000Z"),
15
+ ...overrides,
16
+ };
18
17
  }
19
18
 
20
19
  function makeSession(overrides: Partial<SessionFile> & { sessionId: string }): SessionFile {
21
- return {
22
- filePath: `/home/.claude/projects/my-app/${overrides.sessionId}.jsonl`,
23
- projectDir: '/home/.claude/projects/my-app',
24
- birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime(),
25
- resolvedCwd: '/projects/my-app',
26
- ...overrides,
27
- };
20
+ return {
21
+ filePath: `/home/.claude/projects/my-app/${overrides.sessionId}.jsonl`,
22
+ projectDir: "/home/.claude/projects/my-app",
23
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime(),
24
+ resolvedCwd: "/projects/my-app",
25
+ ...overrides,
26
+ };
28
27
  }
29
28
 
30
- describe('matchProcessesToSessions', () => {
31
- it('should return empty array when no processes', () => {
32
- const sessions = [makeSession({ sessionId: 's1' })];
33
- expect(matchProcessesToSessions([], sessions)).toEqual([]);
34
- });
35
-
36
- it('should return empty array when no sessions', () => {
37
- const processes = [makeProcess({ pid: 100 })];
38
- expect(matchProcessesToSessions(processes, [])).toEqual([]);
39
- });
40
-
41
- it('should match a single process to closest session', () => {
42
- const proc = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });
43
- const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });
44
- const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:20:00.000Z').getTime() });
45
-
46
- const results = matchProcessesToSessions([proc], [s1, s2]);
47
- expect(results).toHaveLength(1);
48
- expect(results[0].session.sessionId).toBe('s1');
49
- expect(results[0].deltaMs).toBe(43000);
50
- });
51
-
52
- it('should enforce 1:1 constraint — each process matches only one session', () => {
53
- const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });
54
- const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-18T23:18:30.000Z') });
55
- const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:10.000Z').getTime() });
56
- const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:18:35.000Z').getTime() });
57
-
58
- const results = matchProcessesToSessions([p1, p2], [s1, s2]);
59
- expect(results).toHaveLength(2);
60
-
61
- const pids = results.map(r => r.process.pid).sort();
62
- const sids = results.map(r => r.session.sessionId).sort();
63
- expect(pids).toEqual([100, 200]);
64
- expect(sids).toEqual(['s1', 's2']);
65
- });
66
-
67
- it('should disambiguate multiple processes with same CWD by birthtime', () => {
68
- const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });
69
- const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-19T08:53:11.000Z') });
70
- const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });
71
- const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-19T08:55:35.000Z').getTime() });
72
-
73
- const results = matchProcessesToSessions([p1, p2], [s1, s2]);
74
- expect(results).toHaveLength(2);
75
-
76
- const match1 = results.find(r => r.process.pid === 100);
77
- const match2 = results.find(r => r.process.pid === 200);
78
- expect(match1?.session.sessionId).toBe('s1');
79
- expect(match2?.session.sessionId).toBe('s2');
80
- });
81
-
82
- it('should exclude processes without startTime', () => {
83
- const proc = makeProcess({ pid: 100, startTime: undefined });
84
- const session = makeSession({ sessionId: 's1' });
85
-
86
- const results = matchProcessesToSessions([proc], [session]);
87
- expect(results).toEqual([]);
88
- });
89
-
90
- it('should exclude processes without cwd', () => {
91
- const proc = makeProcess({ pid: 100, cwd: '' });
92
- const session = makeSession({ sessionId: 's1' });
93
-
94
- const results = matchProcessesToSessions([proc], [session]);
95
- expect(results).toEqual([]);
96
- });
97
-
98
- it('should not match when CWD does not match resolvedCwd', () => {
99
- const proc = makeProcess({ pid: 100, cwd: '/projects/app-a' });
100
- const session = makeSession({ sessionId: 's1', resolvedCwd: '/projects/app-b' });
101
-
102
- const results = matchProcessesToSessions([proc], [session]);
103
- expect(results).toEqual([]);
104
- });
105
-
106
- it('should not match when delta exceeds 3-minute tolerance', () => {
107
- const proc = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });
108
- const session = makeSession({
109
- sessionId: 's1',
110
- birthtimeMs: new Date('2026-03-18T23:22:00.000Z').getTime(), // ~4 min later
111
- });
29
+ describe("matchProcessesToSessions", () => {
30
+ it("should return empty array when no processes", () => {
31
+ const sessions = [makeSession({ sessionId: "s1" })];
32
+ expect(matchProcessesToSessions([], sessions)).toEqual([]);
33
+ });
112
34
 
113
- const results = matchProcessesToSessions([proc], [session]);
114
- expect(results).toEqual([]);
35
+ it("should return empty array when no sessions", () => {
36
+ const processes = [makeProcess({ pid: 100 })];
37
+ expect(matchProcessesToSessions(processes, [])).toEqual([]);
38
+ });
39
+
40
+ it("should match a single process to closest session", () => {
41
+ const proc = makeProcess({ pid: 100, startTime: new Date("2026-03-18T23:18:01.000Z") });
42
+ const s1 = makeSession({
43
+ sessionId: "s1",
44
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime(),
115
45
  });
46
+ const s2 = makeSession({
47
+ sessionId: "s2",
48
+ birthtimeMs: new Date("2026-03-18T23:20:00.000Z").getTime(),
49
+ });
50
+
51
+ const results = matchProcessesToSessions([proc], [s1, s2]);
52
+ expect(results).toHaveLength(1);
53
+ expect(results[0].session.sessionId).toBe("s1");
54
+ expect(results[0].deltaMs).toBe(43000);
55
+ });
56
+
57
+ it("should enforce 1:1 constraint — each process matches only one session", () => {
58
+ const p1 = makeProcess({ pid: 100, startTime: new Date("2026-03-18T23:18:01.000Z") });
59
+ const p2 = makeProcess({ pid: 200, startTime: new Date("2026-03-18T23:18:30.000Z") });
60
+ const s1 = makeSession({
61
+ sessionId: "s1",
62
+ birthtimeMs: new Date("2026-03-18T23:18:10.000Z").getTime(),
63
+ });
64
+ const s2 = makeSession({
65
+ sessionId: "s2",
66
+ birthtimeMs: new Date("2026-03-18T23:18:35.000Z").getTime(),
67
+ });
68
+
69
+ const results = matchProcessesToSessions([p1, p2], [s1, s2]);
70
+ expect(results).toHaveLength(2);
71
+
72
+ const pids = results.map((r) => r.process.pid).sort();
73
+ const sids = results.map((r) => r.session.sessionId).sort();
74
+ expect(pids).toEqual([100, 200]);
75
+ expect(sids).toEqual(["s1", "s2"]);
76
+ });
77
+
78
+ it("should disambiguate multiple processes with same CWD by birthtime", () => {
79
+ const p1 = makeProcess({ pid: 100, startTime: new Date("2026-03-18T23:18:01.000Z") });
80
+ const p2 = makeProcess({ pid: 200, startTime: new Date("2026-03-19T08:53:11.000Z") });
81
+ const s1 = makeSession({
82
+ sessionId: "s1",
83
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime(),
84
+ });
85
+ const s2 = makeSession({
86
+ sessionId: "s2",
87
+ birthtimeMs: new Date("2026-03-19T08:55:35.000Z").getTime(),
88
+ });
89
+
90
+ const results = matchProcessesToSessions([p1, p2], [s1, s2]);
91
+ expect(results).toHaveLength(2);
92
+
93
+ const match1 = results.find((r) => r.process.pid === 100);
94
+ const match2 = results.find((r) => r.process.pid === 200);
95
+ expect(match1?.session.sessionId).toBe("s1");
96
+ expect(match2?.session.sessionId).toBe("s2");
97
+ });
98
+
99
+ it("should exclude processes without startTime", () => {
100
+ const proc = makeProcess({ pid: 100, startTime: undefined });
101
+ const session = makeSession({ sessionId: "s1" });
116
102
 
117
- it('should match at exactly 3-minute boundary', () => {
118
- const startTime = new Date('2026-03-18T23:18:00.000Z');
119
- const proc = makeProcess({ pid: 100, startTime });
120
- const session = makeSession({
121
- sessionId: 's1',
122
- birthtimeMs: startTime.getTime() + 180_000, // exactly 3 min
123
- });
124
-
125
- const results = matchProcessesToSessions([proc], [session]);
126
- expect(results).toHaveLength(1);
127
- });
128
-
129
- it('should handle more sessions than processes', () => {
130
- const proc = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });
131
- const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });
132
- const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:19:00.000Z').getTime() });
133
- const s3 = makeSession({ sessionId: 's3', birthtimeMs: new Date('2026-03-18T23:19:30.000Z').getTime() });
134
-
135
- const results = matchProcessesToSessions([proc], [s1, s2, s3]);
136
- expect(results).toHaveLength(1);
137
- expect(results[0].session.sessionId).toBe('s1'); // closest
138
- });
103
+ const results = matchProcessesToSessions([proc], [session]);
104
+ expect(results).toEqual([]);
105
+ });
106
+
107
+ it("should exclude processes without cwd", () => {
108
+ const proc = makeProcess({ pid: 100, cwd: "" });
109
+ const session = makeSession({ sessionId: "s1" });
110
+
111
+ const results = matchProcessesToSessions([proc], [session]);
112
+ expect(results).toEqual([]);
113
+ });
114
+
115
+ it("should not match when CWD does not match resolvedCwd", () => {
116
+ const proc = makeProcess({ pid: 100, cwd: "/projects/app-a" });
117
+ const session = makeSession({ sessionId: "s1", resolvedCwd: "/projects/app-b" });
118
+
119
+ const results = matchProcessesToSessions([proc], [session]);
120
+ expect(results).toEqual([]);
121
+ });
122
+
123
+ it("should not match when delta exceeds 3-minute tolerance", () => {
124
+ const proc = makeProcess({ pid: 100, startTime: new Date("2026-03-18T23:18:01.000Z") });
125
+ const session = makeSession({
126
+ sessionId: "s1",
127
+ birthtimeMs: new Date("2026-03-18T23:22:00.000Z").getTime(), // ~4 min later
128
+ });
129
+
130
+ const results = matchProcessesToSessions([proc], [session]);
131
+ expect(results).toEqual([]);
132
+ });
133
+
134
+ it("should match at exactly 3-minute boundary", () => {
135
+ const startTime = new Date("2026-03-18T23:18:00.000Z");
136
+ const proc = makeProcess({ pid: 100, startTime });
137
+ const session = makeSession({
138
+ sessionId: "s1",
139
+ birthtimeMs: startTime.getTime() + 180_000, // exactly 3 min
140
+ });
141
+
142
+ const results = matchProcessesToSessions([proc], [session]);
143
+ expect(results).toHaveLength(1);
144
+ });
139
145
 
140
- it('should handle more processes than sessions', () => {
141
- const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:01.000Z') });
142
- const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-18T23:20:01.000Z') });
143
- const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:44.000Z').getTime() });
146
+ it("should handle more sessions than processes", () => {
147
+ const proc = makeProcess({ pid: 100, startTime: new Date("2026-03-18T23:18:01.000Z") });
148
+ const s1 = makeSession({
149
+ sessionId: "s1",
150
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime(),
151
+ });
152
+ const s2 = makeSession({
153
+ sessionId: "s2",
154
+ birthtimeMs: new Date("2026-03-18T23:19:00.000Z").getTime(),
155
+ });
156
+ const s3 = makeSession({
157
+ sessionId: "s3",
158
+ birthtimeMs: new Date("2026-03-18T23:19:30.000Z").getTime(),
159
+ });
160
+
161
+ const results = matchProcessesToSessions([proc], [s1, s2, s3]);
162
+ expect(results).toHaveLength(1);
163
+ expect(results[0].session.sessionId).toBe("s1"); // closest
164
+ });
144
165
 
145
- const results = matchProcessesToSessions([p1, p2], [s1]);
146
- expect(results).toHaveLength(1);
147
- expect(results[0].process.pid).toBe(100); // closest
148
- });
166
+ it("should handle more processes than sessions", () => {
167
+ const p1 = makeProcess({ pid: 100, startTime: new Date("2026-03-18T23:18:01.000Z") });
168
+ const p2 = makeProcess({ pid: 200, startTime: new Date("2026-03-18T23:20:01.000Z") });
169
+ const s1 = makeSession({
170
+ sessionId: "s1",
171
+ birthtimeMs: new Date("2026-03-18T23:18:44.000Z").getTime(),
172
+ });
173
+
174
+ const results = matchProcessesToSessions([p1, p2], [s1]);
175
+ expect(results).toHaveLength(1);
176
+ expect(results[0].process.pid).toBe(100); // closest
177
+ });
178
+
179
+ it("should skip sessions with empty resolvedCwd", () => {
180
+ const proc = makeProcess({ pid: 100 });
181
+ const session = makeSession({ sessionId: "s1", resolvedCwd: "" });
149
182
 
150
- it('should skip sessions with empty resolvedCwd', () => {
151
- const proc = makeProcess({ pid: 100 });
152
- const session = makeSession({ sessionId: 's1', resolvedCwd: '' });
183
+ const results = matchProcessesToSessions([proc], [session]);
184
+ expect(results).toEqual([]);
185
+ });
153
186
 
154
- const results = matchProcessesToSessions([proc], [session]);
155
- expect(results).toEqual([]);
187
+ it("should prefer best match when greedy ordering matters", () => {
188
+ // p1 is 10s from s2, p2 is 5s from s2 — p2 should win s2, p1 gets s1
189
+ const p1 = makeProcess({ pid: 100, startTime: new Date("2026-03-18T23:18:00.000Z") });
190
+ const p2 = makeProcess({ pid: 200, startTime: new Date("2026-03-18T23:18:25.000Z") });
191
+ const s1 = makeSession({
192
+ sessionId: "s1",
193
+ birthtimeMs: new Date("2026-03-18T23:18:08.000Z").getTime(),
194
+ });
195
+ const s2 = makeSession({
196
+ sessionId: "s2",
197
+ birthtimeMs: new Date("2026-03-18T23:18:30.000Z").getTime(),
156
198
  });
157
199
 
158
- it('should prefer best match when greedy ordering matters', () => {
159
- // p1 is 10s from s2, p2 is 5s from s2 — p2 should win s2, p1 gets s1
160
- const p1 = makeProcess({ pid: 100, startTime: new Date('2026-03-18T23:18:00.000Z') });
161
- const p2 = makeProcess({ pid: 200, startTime: new Date('2026-03-18T23:18:25.000Z') });
162
- const s1 = makeSession({ sessionId: 's1', birthtimeMs: new Date('2026-03-18T23:18:08.000Z').getTime() });
163
- const s2 = makeSession({ sessionId: 's2', birthtimeMs: new Date('2026-03-18T23:18:30.000Z').getTime() });
164
-
165
- const results = matchProcessesToSessions([p1, p2], [s1, s2]);
166
- expect(results).toHaveLength(2);
167
-
168
- const match1 = results.find(r => r.process.pid === 200);
169
- const match2 = results.find(r => r.process.pid === 100);
170
- expect(match1?.session.sessionId).toBe('s2'); // 5s delta
171
- expect(match2?.session.sessionId).toBe('s1'); // 8s delta
172
- });
200
+ const results = matchProcessesToSessions([p1, p2], [s1, s2]);
201
+ expect(results).toHaveLength(2);
202
+
203
+ const match1 = results.find((r) => r.process.pid === 200);
204
+ const match2 = results.find((r) => r.process.pid === 100);
205
+ expect(match1?.session.sessionId).toBe("s2"); // 5s delta
206
+ expect(match2?.session.sessionId).toBe("s1"); // 8s delta
207
+ });
173
208
  });
174
209
 
175
- describe('generateAgentName', () => {
176
- it('should return lowercase kebab-case name with pid', () => {
177
- expect(generateAgentName('/projects/my-app', 12345)).toBe('my-app-12345');
178
- });
210
+ describe("generateAgentName", () => {
211
+ it("should return lowercase kebab-case name with pid", () => {
212
+ expect(generateAgentName("/projects/my-app", 12345)).toBe("my-app-12345");
213
+ });
179
214
 
180
- it('should handle root path', () => {
181
- expect(generateAgentName('/', 100)).toBe('unknown-100');
182
- });
215
+ it("should handle root path", () => {
216
+ expect(generateAgentName("/", 100)).toBe("unknown-100");
217
+ });
183
218
 
184
- it('should handle empty cwd', () => {
185
- expect(generateAgentName('', 100)).toBe('unknown-100');
186
- });
219
+ it("should handle empty cwd", () => {
220
+ expect(generateAgentName("", 100)).toBe("unknown-100");
221
+ });
187
222
 
188
- it('should handle nested paths', () => {
189
- expect(generateAgentName('/home/user/projects/ai-devkit', 78070)).toBe('ai-devkit-78070');
190
- });
223
+ it("should handle nested paths", () => {
224
+ expect(generateAgentName("/home/user/projects/ai-devkit", 78070)).toBe("ai-devkit-78070");
225
+ });
191
226
 
192
- it('should convert spaces and special chars to kebab-case', () => {
193
- expect(generateAgentName('/projects/AI DevKit', 123)).toBe('ai-devkit-123');
194
- });
227
+ it("should convert spaces and special chars to kebab-case", () => {
228
+ expect(generateAgentName("/projects/AI DevKit", 123)).toBe("ai-devkit-123");
229
+ });
195
230
 
196
- it('should convert uppercase to lowercase', () => {
197
- expect(generateAgentName('/projects/MyProject', 456)).toBe('myproject-456');
198
- });
231
+ it("should convert uppercase to lowercase", () => {
232
+ expect(generateAgentName("/projects/MyProject", 456)).toBe("myproject-456");
233
+ });
199
234
  });