@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,54 +1,65 @@
1
- import fs from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, describe, expect, it } from 'vitest';
5
- import { DurableAgentRepository } from '../../durable/DurableAgentRepository.js';
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it } from "vitest";
5
+ import { DurableAgentRepository } from "../../durable/DurableAgentRepository.js";
6
6
 
7
- const SESSION = '22222222-2222-4222-8222-222222222222';
8
- const OTHER_SESSION = '33333333-3333-4333-8333-333333333333';
7
+ const SESSION = "22222222-2222-4222-8222-222222222222";
8
+ const OTHER_SESSION = "33333333-3333-4333-8333-333333333333";
9
9
  const roots: string[] = [];
10
10
 
11
11
  afterEach(() => {
12
- for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });
12
+ for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });
13
13
  });
14
14
 
15
15
  function fixture() {
16
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-durable-repository-'));
17
- roots.push(root);
18
- const cwd = path.join(root, 'project');
19
- fs.mkdirSync(cwd);
20
- const processInspector = { getIdentity: (pid: number) => ({ pid, startedAt: 'owner-start' }) };
21
- return { cwd, repository: new DurableAgentRepository({ dbPath: path.join(root, 'agents.db'), processInspector }) };
16
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "codex-durable-repository-"));
17
+ roots.push(root);
18
+ const cwd = path.join(root, "project");
19
+ fs.mkdirSync(cwd);
20
+ const processInspector = { getIdentity: (pid: number) => ({ pid, startedAt: "owner-start" }) };
21
+ return {
22
+ cwd,
23
+ repository: new DurableAgentRepository({
24
+ dbPath: path.join(root, "agents.db"),
25
+ processInspector,
26
+ }),
27
+ };
22
28
  }
23
29
 
24
- describe('Codex durable-agent repository binding', () => {
25
- it('creates Codex agents unbound and binds during the owned run', async () => {
26
- const { cwd, repository } = fixture();
27
- const agent = await repository.create({ name: 'reviewer', cwd, provider: 'codex' });
28
- expect(agent).toMatchObject({ provider: 'codex', mode: 'durable', providerSessionId: null });
30
+ describe("Codex durable-agent repository binding", () => {
31
+ it("creates Codex agents unbound and binds during the owned run", async () => {
32
+ const { cwd, repository } = fixture();
33
+ const agent = await repository.create({ name: "reviewer", cwd, provider: "codex" });
34
+ expect(agent).toMatchObject({ provider: "codex", mode: "durable", providerSessionId: null });
29
35
 
30
- const run = await repository.acquireRun(agent.id);
31
- const bound = await repository.bindProviderSession(agent.id, run.token, SESSION);
32
- expect(bound.providerSessionId).toBe(SESSION);
33
- await expect(repository.bindProviderSession(agent.id, run.token, SESSION))
34
- .resolves.toMatchObject({ providerSessionId: SESSION });
35
- });
36
+ const run = await repository.acquireRun(agent.id);
37
+ const bound = await repository.bindProviderSession(agent.id, run.token, SESSION);
38
+ expect(bound.providerSessionId).toBe(SESSION);
39
+ await expect(
40
+ repository.bindProviderSession(agent.id, run.token, SESSION),
41
+ ).resolves.toMatchObject({ providerSessionId: SESSION });
42
+ });
36
43
 
37
- it('rejects invalid, stale, replacement, and duplicate bindings', async () => {
38
- const { cwd, repository } = fixture();
39
- const first = await repository.create({ name: 'first', cwd, provider: 'codex' });
40
- const second = await repository.create({ name: 'second', cwd, provider: 'codex' });
41
- const firstRun = await repository.acquireRun(first.id);
42
- const secondRun = await repository.acquireRun(second.id);
44
+ it("rejects invalid, stale, replacement, and duplicate bindings", async () => {
45
+ const { cwd, repository } = fixture();
46
+ const first = await repository.create({ name: "first", cwd, provider: "codex" });
47
+ const second = await repository.create({ name: "second", cwd, provider: "codex" });
48
+ const firstRun = await repository.acquireRun(first.id);
49
+ const secondRun = await repository.acquireRun(second.id);
43
50
 
44
- await expect(repository.bindProviderSession(first.id, 'stale', SESSION))
45
- .rejects.toMatchObject({ code: 'DURABLE_AGENT_REPOSITORY' });
46
- await expect(repository.bindProviderSession(first.id, firstRun.token, 'invalid'))
47
- .rejects.toMatchObject({ code: 'DURABLE_AGENT_REPOSITORY' });
48
- await repository.bindProviderSession(first.id, firstRun.token, SESSION);
49
- await expect(repository.bindProviderSession(first.id, firstRun.token, OTHER_SESSION))
50
- .rejects.toMatchObject({ code: 'CODEX_SESSION_MISMATCH' });
51
- await expect(repository.bindProviderSession(second.id, secondRun.token, SESSION))
52
- .rejects.toMatchObject({ code: 'CODEX_SESSION_MISMATCH' });
51
+ await expect(repository.bindProviderSession(first.id, "stale", SESSION)).rejects.toMatchObject({
52
+ code: "DURABLE_AGENT_REPOSITORY",
53
53
  });
54
+ await expect(
55
+ repository.bindProviderSession(first.id, firstRun.token, "invalid"),
56
+ ).rejects.toMatchObject({ code: "DURABLE_AGENT_REPOSITORY" });
57
+ await repository.bindProviderSession(first.id, firstRun.token, SESSION);
58
+ await expect(
59
+ repository.bindProviderSession(first.id, firstRun.token, OTHER_SESSION),
60
+ ).rejects.toMatchObject({ code: "CODEX_SESSION_MISMATCH" });
61
+ await expect(
62
+ repository.bindProviderSession(second.id, secondRun.token, SESSION),
63
+ ).rejects.toMatchObject({ code: "CODEX_SESSION_MISMATCH" });
64
+ });
54
65
  });
@@ -1,79 +1,104 @@
1
- import fs from 'node:fs';
2
- import os from 'node:os';
3
- import path from 'node:path';
4
- import { afterEach, describe, expect, it, vi } from 'vitest';
1
+ import fs from "node:fs";
2
+ import os from "node:os";
3
+ import path from "node:path";
4
+ import { afterEach, describe, expect, it, vi } from "vitest";
5
5
  import {
6
- CodexPrintError,
7
- CodexPrintAgentService,
8
- DurableAgentRepository,
9
- type ProcessInspector,
10
- } from '../../index.js';
6
+ CodexPrintError,
7
+ CodexPrintAgentService,
8
+ DurableAgentRepository,
9
+ type ProcessInspector,
10
+ } from "../../index.js";
11
11
 
12
- const SESSION = '22222222-2222-4222-8222-222222222222';
12
+ const SESSION = "22222222-2222-4222-8222-222222222222";
13
13
  const roots: string[] = [];
14
14
 
15
15
  afterEach(() => {
16
- for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });
16
+ for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });
17
17
  });
18
18
 
19
- describe('Codex print-agent fake-provider journey', () => {
20
- it('creates unbound, then binds and explicitly resumes the provider-minted session', async () => {
21
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-print-integration-'));
22
- roots.push(root);
23
- const cwd = path.join(root, 'project');
24
- fs.mkdirSync(cwd);
25
- const processInspector: ProcessInspector = {
26
- getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),
27
- };
28
- const repository = new DurableAgentRepository({ dbPath: path.join(root, 'agents.db'), processInspector });
29
- const runner = {
30
- run: vi.fn().mockImplementation(async (request) => {
31
- await request.onSpawn({ pid: 42, startedAt: 'process-42' });
32
- await request.onSession(SESSION);
33
- return { sessionId: SESSION, result: `answer:${request.prompt}`, messages: [`answer:${request.prompt}`], exitCode: 0 };
34
- }),
19
+ describe("Codex print-agent fake-provider journey", () => {
20
+ it("creates unbound, then binds and explicitly resumes the provider-minted session", async () => {
21
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "codex-print-integration-"));
22
+ roots.push(root);
23
+ const cwd = path.join(root, "project");
24
+ fs.mkdirSync(cwd);
25
+ const processInspector: ProcessInspector = {
26
+ getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),
27
+ };
28
+ const repository = new DurableAgentRepository({
29
+ dbPath: path.join(root, "agents.db"),
30
+ processInspector,
31
+ });
32
+ const runner = {
33
+ run: vi.fn().mockImplementation(async (request) => {
34
+ await request.onSpawn({ pid: 42, startedAt: "process-42" });
35
+ await request.onSession(SESSION);
36
+ return {
37
+ sessionId: SESSION,
38
+ result: `answer:${request.prompt}`,
39
+ messages: [`answer:${request.prompt}`],
40
+ exitCode: 0,
35
41
  };
36
- const service = new CodexPrintAgentService({
37
- repository, probe: { validate: vi.fn() }, runner,
38
- });
39
-
40
- const created = await service.create({ name: 'reviewer', cwd });
41
- expect(created).toMatchObject({ provider: 'codex', providerSessionId: null, sessionHealth: 'uninitialized' });
42
+ }),
43
+ };
44
+ const service = new CodexPrintAgentService({
45
+ repository,
46
+ probe: { validate: vi.fn() },
47
+ runner,
48
+ });
42
49
 
43
- const first = await service.send(created.id, 'first secret');
44
- expect(first).toMatchObject({ result: 'answer:first secret' });
45
- const bound = await repository.getById(created.id);
46
- expect(bound?.providerSessionId).toBe(first.sessionId);
47
- await expect(service.send(created.id, 'follow up')).resolves.toMatchObject({ result: 'answer:follow up' });
50
+ const created = await service.create({ name: "reviewer", cwd });
51
+ expect(created).toMatchObject({
52
+ provider: "codex",
53
+ providerSessionId: null,
54
+ sessionHealth: "uninitialized",
55
+ });
48
56
 
49
- expect(runner.run.mock.calls[0][0].agent).toMatchObject({ providerSessionId: null });
50
- expect(runner.run.mock.calls[1][0].agent).toMatchObject({ providerSessionId: SESSION });
57
+ const first = await service.send(created.id, "first secret");
58
+ expect(first).toMatchObject({ result: "answer:first secret" });
59
+ const bound = await repository.getById(created.id);
60
+ expect(bound?.providerSessionId).toBe(first.sessionId);
61
+ await expect(service.send(created.id, "follow up")).resolves.toMatchObject({
62
+ result: "answer:follow up",
51
63
  });
52
64
 
53
- it('retains a first-run binding when the provider fails after thread start', async () => {
54
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'codex-print-bind-failure-'));
55
- roots.push(root);
56
- const cwd = path.join(root, 'project');
57
- fs.mkdirSync(cwd);
58
- const processInspector: ProcessInspector = {
59
- getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),
60
- };
61
- const repository = new DurableAgentRepository({ dbPath: path.join(root, 'agents.db'), processInspector });
62
- const runner = {
63
- run: vi.fn().mockImplementation(async (request) => {
64
- await request.onSpawn({ pid: 42, startedAt: 'process-42' });
65
- await request.onSession(SESSION);
66
- throw new CodexPrintError('Codex print run failed.', 'CODEX_PROCESS');
67
- }),
68
- };
69
- const service = new CodexPrintAgentService({
70
- repository, probe: { validate: vi.fn() }, runner,
71
- });
72
- const created = await service.create({ name: 'reviewer', cwd });
65
+ expect(runner.run.mock.calls[0][0].agent).toMatchObject({ providerSessionId: null });
66
+ expect(runner.run.mock.calls[1][0].agent).toMatchObject({ providerSessionId: SESSION });
67
+ });
73
68
 
74
- await expect(service.send(created.id, 'secret')).rejects.toMatchObject({ code: 'CODEX_PROCESS' });
75
- expect((await repository.getById(created.id))).toMatchObject({
76
- providerSessionId: SESSION, state: 'degraded', sessionHealth: 'unknown',
77
- });
69
+ it("retains a first-run binding when the provider fails after thread start", async () => {
70
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "codex-print-bind-failure-"));
71
+ roots.push(root);
72
+ const cwd = path.join(root, "project");
73
+ fs.mkdirSync(cwd);
74
+ const processInspector: ProcessInspector = {
75
+ getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),
76
+ };
77
+ const repository = new DurableAgentRepository({
78
+ dbPath: path.join(root, "agents.db"),
79
+ processInspector,
80
+ });
81
+ const runner = {
82
+ run: vi.fn().mockImplementation(async (request) => {
83
+ await request.onSpawn({ pid: 42, startedAt: "process-42" });
84
+ await request.onSession(SESSION);
85
+ throw new CodexPrintError("Codex print run failed.", "CODEX_PROCESS");
86
+ }),
87
+ };
88
+ const service = new CodexPrintAgentService({
89
+ repository,
90
+ probe: { validate: vi.fn() },
91
+ runner,
92
+ });
93
+ const created = await service.create({ name: "reviewer", cwd });
94
+
95
+ await expect(service.send(created.id, "secret")).rejects.toMatchObject({
96
+ code: "CODEX_PROCESS",
97
+ });
98
+ expect(await repository.getById(created.id)).toMatchObject({
99
+ providerSessionId: SESSION,
100
+ state: "degraded",
101
+ sessionHealth: "unknown",
78
102
  });
103
+ });
79
104
  });
@@ -1,139 +1,217 @@
1
- import { describe, expect, it, vi } from 'vitest';
1
+ import { describe, expect, it, vi } from "vitest";
2
2
 
3
- const SESSION = '22222222-2222-4222-8222-222222222222';
3
+ const SESSION = "22222222-2222-4222-8222-222222222222";
4
4
  const base = {
5
- id: 'id', name: 'reviewer', provider: 'codex', providerSessionId: null, sessionHealth: 'uninitialized',
5
+ id: "id",
6
+ name: "reviewer",
7
+ provider: "codex",
8
+ providerSessionId: null,
9
+ sessionHealth: "uninitialized",
6
10
  };
7
11
 
8
- describe('CodexPrintAgentService', () => {
9
- it('constructs default non-billable dependencies without invoking them', async () => {
10
- const api = await import('../../index.js') as Record<string, unknown>;
11
- const Service = api.CodexPrintAgentService as new () => any;
12
- expect(new Service().repository).toBeDefined();
12
+ describe("CodexPrintAgentService", () => {
13
+ it("constructs default non-billable dependencies without invoking them", async () => {
14
+ const api = (await import("../../index.js")) as Record<string, unknown>;
15
+ const Service = api.CodexPrintAgentService as new () => any;
16
+ expect(new Service().repository).toBeDefined();
17
+ });
18
+
19
+ it("validates before provider-aware create and never runs Codex", async () => {
20
+ const api = (await import("../../index.js")) as Record<string, unknown>;
21
+ expect(api).toHaveProperty("CodexPrintAgentService");
22
+ const probe = {
23
+ validate: vi.fn().mockResolvedValue({ executable: "codex", version: "0.147.0" }),
24
+ };
25
+ const repository = { create: vi.fn().mockResolvedValue(base), list: vi.fn() };
26
+ const runner = { run: vi.fn() };
27
+ const Service = api.CodexPrintAgentService as new (options: unknown) => any;
28
+ await new Service({ repository, probe, runner }).create({ name: "reviewer", cwd: "/project" });
29
+ expect(repository.create).toHaveBeenCalledWith({
30
+ name: "reviewer",
31
+ cwd: "/project",
32
+ provider: "codex",
13
33
  });
34
+ expect(runner.run).not.toHaveBeenCalled();
35
+ });
14
36
 
15
- it('validates before provider-aware create and never runs Codex', async () => {
16
- const api = await import('../../index.js') as Record<string, unknown>;
17
- expect(api).toHaveProperty('CodexPrintAgentService');
18
- const probe = { validate: vi.fn().mockResolvedValue({ executable: 'codex', version: '0.147.0' }) };
19
- const repository = { create: vi.fn().mockResolvedValue(base), list: vi.fn() };
20
- const runner = { run: vi.fn() };
21
- const Service = api.CodexPrintAgentService as new (options: unknown) => any;
22
- await new Service({ repository, probe, runner }).create({ name: 'reviewer', cwd: '/project' });
23
- expect(repository.create).toHaveBeenCalledWith({ name: 'reviewer', cwd: '/project', provider: 'codex' });
24
- expect(runner.run).not.toHaveBeenCalled();
37
+ it("binds during first send and explicitly resumes later sends", async () => {
38
+ const api = (await import("../../index.js")) as Record<string, unknown>;
39
+ const repository = {
40
+ list: vi.fn(),
41
+ resolve: vi.fn().mockResolvedValue(base),
42
+ acquireRun: vi
43
+ .fn()
44
+ .mockResolvedValueOnce({ agent: base, token: "one" })
45
+ .mockResolvedValueOnce({
46
+ agent: { ...base, providerSessionId: SESSION, sessionHealth: "healthy" },
47
+ token: "two",
48
+ }),
49
+ recordProviderProcess: vi.fn(),
50
+ bindProviderSession: vi.fn(),
51
+ completeRun: vi.fn(),
52
+ };
53
+ const runner = {
54
+ run: vi.fn().mockImplementation(async (request) => {
55
+ await request.onSpawn({ pid: 42, startedAt: "start" });
56
+ await request.onSession(SESSION);
57
+ return { sessionId: SESSION, result: "answer", messages: ["answer"], exitCode: 0 };
58
+ }),
59
+ };
60
+ const Service = api.CodexPrintAgentService as new (options: unknown) => any;
61
+ const service = new Service({
62
+ repository,
63
+ probe: { validate: vi.fn() },
64
+ runner,
65
+ executable: "fake-codex",
25
66
  });
26
67
 
27
- it('binds during first send and explicitly resumes later sends', async () => {
28
- const api = await import('../../index.js') as Record<string, unknown>;
29
- const repository = {
30
- list: vi.fn(),
31
- resolve: vi.fn().mockResolvedValue(base),
32
- acquireRun: vi.fn()
33
- .mockResolvedValueOnce({ agent: base, token: 'one' })
34
- .mockResolvedValueOnce({ agent: { ...base, providerSessionId: SESSION, sessionHealth: 'healthy' }, token: 'two' }),
35
- recordProviderProcess: vi.fn(), bindProviderSession: vi.fn(), completeRun: vi.fn(),
36
- };
37
- const runner = { run: vi.fn().mockImplementation(async (request) => {
38
- await request.onSpawn({ pid: 42, startedAt: 'start' });
39
- await request.onSession(SESSION);
40
- return { sessionId: SESSION, result: 'answer', messages: ['answer'], exitCode: 0 };
41
- }) };
42
- const Service = api.CodexPrintAgentService as new (options: unknown) => any;
43
- const service = new Service({ repository, probe: { validate: vi.fn() }, runner, executable: 'fake-codex' });
68
+ await service.send("reviewer", "first");
69
+ await service.send("reviewer", "later");
44
70
 
45
- await service.send('reviewer', 'first');
46
- await service.send('reviewer', 'later');
71
+ expect(repository.bindProviderSession).toHaveBeenNthCalledWith(1, "id", "one", SESSION);
72
+ expect(repository.bindProviderSession).toHaveBeenNthCalledWith(2, "id", "two", SESSION);
73
+ expect(repository.completeRun).toHaveBeenCalledWith(
74
+ "id",
75
+ "one",
76
+ expect.objectContaining({
77
+ status: "succeeded",
78
+ sessionHealth: "healthy",
79
+ }),
80
+ );
81
+ });
47
82
 
48
- expect(repository.bindProviderSession).toHaveBeenNthCalledWith(1, 'id', 'one', SESSION);
49
- expect(repository.bindProviderSession).toHaveBeenNthCalledWith(2, 'id', 'two', SESSION);
50
- expect(repository.completeRun).toHaveBeenCalledWith('id', 'one', expect.objectContaining({
51
- status: 'succeeded', sessionHealth: 'healthy',
52
- }));
83
+ it("records mismatch separately from unknown failures", async () => {
84
+ const api = (await import("../../index.js")) as Record<string, unknown>;
85
+ const ErrorType = api.CodexPrintError as new (message: string, code: string) => Error;
86
+ const completeRun = vi.fn();
87
+ const repository = {
88
+ list: vi.fn(),
89
+ resolve: vi.fn().mockResolvedValue(base),
90
+ acquireRun: vi.fn().mockResolvedValue({ agent: base, token: "one" }),
91
+ recordProviderProcess: vi.fn(),
92
+ bindProviderSession: vi.fn(),
93
+ completeRun,
94
+ };
95
+ const Service = api.CodexPrintAgentService as new (options: unknown) => any;
96
+ const service = new Service({
97
+ repository,
98
+ probe: { validate: vi.fn() },
99
+ runner: {
100
+ run: vi.fn().mockRejectedValue(new ErrorType("mismatch", "CODEX_SESSION_MISMATCH")),
101
+ },
53
102
  });
54
-
55
- it('records mismatch separately from unknown failures', async () => {
56
- const api = await import('../../index.js') as Record<string, unknown>;
57
- const ErrorType = api.CodexPrintError as new (message: string, code: string) => Error;
58
- const completeRun = vi.fn();
59
- const repository = {
60
- list: vi.fn(),
61
- resolve: vi.fn().mockResolvedValue(base), acquireRun: vi.fn().mockResolvedValue({ agent: base, token: 'one' }),
62
- recordProviderProcess: vi.fn(), bindProviderSession: vi.fn(), completeRun,
63
- };
64
- const Service = api.CodexPrintAgentService as new (options: unknown) => any;
65
- const service = new Service({ repository, probe: { validate: vi.fn() }, runner: {
66
- run: vi.fn().mockRejectedValue(new ErrorType('mismatch', 'CODEX_SESSION_MISMATCH')),
67
- } });
68
- await expect(service.send('reviewer', 'x')).rejects.toMatchObject({ code: 'CODEX_SESSION_MISMATCH' });
69
- expect(completeRun).toHaveBeenCalledWith('id', 'one', expect.objectContaining({ sessionHealth: 'mismatch' }));
103
+ await expect(service.send("reviewer", "x")).rejects.toMatchObject({
104
+ code: "CODEX_SESSION_MISMATCH",
70
105
  });
106
+ expect(completeRun).toHaveBeenCalledWith(
107
+ "id",
108
+ "one",
109
+ expect.objectContaining({ sessionHealth: "mismatch" }),
110
+ );
111
+ });
71
112
 
72
- it('rejects a non-Codex target without acquiring or mutating it', async () => {
73
- const api = await import('../../index.js') as Record<string, unknown>;
74
- const Service = api.CodexPrintAgentService as new (options: unknown) => any;
75
- const repository = {
76
- resolve: vi.fn().mockResolvedValue({ ...base, provider: 'claude' }),
77
- acquireRun: vi.fn(), recordProviderProcess: vi.fn(), bindProviderSession: vi.fn(), completeRun: vi.fn(),
78
- };
113
+ it("rejects a non-Codex target without acquiring or mutating it", async () => {
114
+ const api = (await import("../../index.js")) as Record<string, unknown>;
115
+ const Service = api.CodexPrintAgentService as new (options: unknown) => any;
116
+ const repository = {
117
+ resolve: vi.fn().mockResolvedValue({ ...base, provider: "claude" }),
118
+ acquireRun: vi.fn(),
119
+ recordProviderProcess: vi.fn(),
120
+ bindProviderSession: vi.fn(),
121
+ completeRun: vi.fn(),
122
+ };
79
123
 
80
- await expect(new Service({ repository, probe: { validate: vi.fn() }, runner: { run: vi.fn() } })
81
- .send('reviewer', 'x')).rejects.toMatchObject({ code: 'CODEX_UNSUPPORTED' });
82
- expect(repository.acquireRun).not.toHaveBeenCalled();
83
- expect(repository.completeRun).not.toHaveBeenCalled();
84
- });
124
+ await expect(
125
+ new Service({ repository, probe: { validate: vi.fn() }, runner: { run: vi.fn() } }).send(
126
+ "reviewer",
127
+ "x",
128
+ ),
129
+ ).rejects.toMatchObject({ code: "CODEX_UNSUPPORTED" });
130
+ expect(repository.acquireRun).not.toHaveBeenCalled();
131
+ expect(repository.completeRun).not.toHaveBeenCalled();
132
+ });
85
133
 
86
- it('does not turn a successful completion write failure into a second completion', async () => {
87
- const api = await import('../../index.js') as Record<string, unknown>;
88
- const Service = api.CodexPrintAgentService as new (options: unknown) => any;
89
- const completionFailure = new Error('completion failed');
90
- const repository = {
91
- resolve: vi.fn().mockResolvedValue(base),
92
- acquireRun: vi.fn().mockResolvedValue({ agent: base, token: 'one' }),
93
- recordProviderProcess: vi.fn(), bindProviderSession: vi.fn(),
94
- completeRun: vi.fn().mockRejectedValue(completionFailure),
95
- };
96
- const runner = { run: vi.fn().mockResolvedValue({
97
- sessionId: SESSION, result: 'answer', messages: ['answer'], exitCode: 0,
98
- }) };
134
+ it("does not turn a successful completion write failure into a second completion", async () => {
135
+ const api = (await import("../../index.js")) as Record<string, unknown>;
136
+ const Service = api.CodexPrintAgentService as new (options: unknown) => any;
137
+ const completionFailure = new Error("completion failed");
138
+ const repository = {
139
+ resolve: vi.fn().mockResolvedValue(base),
140
+ acquireRun: vi.fn().mockResolvedValue({ agent: base, token: "one" }),
141
+ recordProviderProcess: vi.fn(),
142
+ bindProviderSession: vi.fn(),
143
+ completeRun: vi.fn().mockRejectedValue(completionFailure),
144
+ };
145
+ const runner = {
146
+ run: vi.fn().mockResolvedValue({
147
+ sessionId: SESSION,
148
+ result: "answer",
149
+ messages: ["answer"],
150
+ exitCode: 0,
151
+ }),
152
+ };
99
153
 
100
- await expect(new Service({ repository, probe: { validate: vi.fn() }, runner })
101
- .send('reviewer', 'x')).rejects.toBe(completionFailure);
102
- expect(repository.completeRun).toHaveBeenCalledOnce();
103
- });
154
+ await expect(
155
+ new Service({ repository, probe: { validate: vi.fn() }, runner }).send("reviewer", "x"),
156
+ ).rejects.toBe(completionFailure);
157
+ expect(repository.completeRun).toHaveBeenCalledOnce();
158
+ });
104
159
 
105
- it('records a repository binding conflict as a session mismatch', async () => {
106
- const api = await import('../../index.js') as Record<string, unknown>;
107
- const BindingError = api.CodexPrintError as new (message: string, code: string) => Error;
108
- const completeRun = vi.fn();
109
- const repository = {
110
- list: vi.fn(), resolve: vi.fn().mockResolvedValue(base),
111
- acquireRun: vi.fn().mockResolvedValue({ agent: base, token: 'one' }),
112
- recordProviderProcess: vi.fn(),
113
- bindProviderSession: vi.fn().mockRejectedValue(new BindingError('binding mismatch', 'CODEX_SESSION_MISMATCH')),
114
- completeRun,
115
- };
116
- const runner = { run: vi.fn().mockImplementation(async (request) => {
117
- await request.onSession(SESSION);
118
- return { sessionId: SESSION, result: 'x', messages: ['x'], exitCode: 0 };
119
- }) };
120
- const Service = api.CodexPrintAgentService as new (options: unknown) => any;
160
+ it("records a repository binding conflict as a session mismatch", async () => {
161
+ const api = (await import("../../index.js")) as Record<string, unknown>;
162
+ const BindingError = api.CodexPrintError as new (message: string, code: string) => Error;
163
+ const completeRun = vi.fn();
164
+ const repository = {
165
+ list: vi.fn(),
166
+ resolve: vi.fn().mockResolvedValue(base),
167
+ acquireRun: vi.fn().mockResolvedValue({ agent: base, token: "one" }),
168
+ recordProviderProcess: vi.fn(),
169
+ bindProviderSession: vi
170
+ .fn()
171
+ .mockRejectedValue(new BindingError("binding mismatch", "CODEX_SESSION_MISMATCH")),
172
+ completeRun,
173
+ };
174
+ const runner = {
175
+ run: vi.fn().mockImplementation(async (request) => {
176
+ await request.onSession(SESSION);
177
+ return { sessionId: SESSION, result: "x", messages: ["x"], exitCode: 0 };
178
+ }),
179
+ };
180
+ const Service = api.CodexPrintAgentService as new (options: unknown) => any;
121
181
 
122
- await expect(new Service({ repository, probe: { validate: vi.fn() }, runner }).send('reviewer', 'x'))
123
- .rejects.toMatchObject({ code: 'CODEX_SESSION_MISMATCH' });
124
- expect(completeRun).toHaveBeenCalledWith('id', 'one', expect.objectContaining({ sessionHealth: 'mismatch' }));
125
- });
182
+ await expect(
183
+ new Service({ repository, probe: { validate: vi.fn() }, runner }).send("reviewer", "x"),
184
+ ).rejects.toMatchObject({ code: "CODEX_SESSION_MISMATCH" });
185
+ expect(completeRun).toHaveBeenCalledWith(
186
+ "id",
187
+ "one",
188
+ expect.objectContaining({ sessionHealth: "mismatch" }),
189
+ );
190
+ });
126
191
 
127
- it('rejects missing and ambiguous records before acquiring a run', async () => {
128
- const api = await import('../../index.js') as Record<string, unknown>;
129
- const Service = api.CodexPrintAgentService as new (options: unknown) => any;
130
- const repository = {
131
- list: vi.fn(), create: vi.fn(), resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([base, base]),
132
- acquireRun: vi.fn(), recordProviderProcess: vi.fn(), bindProviderSession: vi.fn(), completeRun: vi.fn(),
133
- };
134
- const service = new Service({ repository, probe: { validate: vi.fn() }, runner: { run: vi.fn() } });
135
- await expect(service.send('missing', 'x')).rejects.toMatchObject({ code: 'DURABLE_AGENT_NOT_FOUND' });
136
- await expect(service.send('ambiguous', 'x')).rejects.toMatchObject({ code: 'CODEX_UNSUPPORTED' });
137
- expect(repository.acquireRun).not.toHaveBeenCalled();
192
+ it("rejects missing and ambiguous records before acquiring a run", async () => {
193
+ const api = (await import("../../index.js")) as Record<string, unknown>;
194
+ const Service = api.CodexPrintAgentService as new (options: unknown) => any;
195
+ const repository = {
196
+ list: vi.fn(),
197
+ create: vi.fn(),
198
+ resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([base, base]),
199
+ acquireRun: vi.fn(),
200
+ recordProviderProcess: vi.fn(),
201
+ bindProviderSession: vi.fn(),
202
+ completeRun: vi.fn(),
203
+ };
204
+ const service = new Service({
205
+ repository,
206
+ probe: { validate: vi.fn() },
207
+ runner: { run: vi.fn() },
208
+ });
209
+ await expect(service.send("missing", "x")).rejects.toMatchObject({
210
+ code: "DURABLE_AGENT_NOT_FOUND",
211
+ });
212
+ await expect(service.send("ambiguous", "x")).rejects.toMatchObject({
213
+ code: "CODEX_UNSUPPORTED",
138
214
  });
215
+ expect(repository.acquireRun).not.toHaveBeenCalled();
216
+ });
139
217
  });