@ai-devkit/agent-manager 0.32.0 → 0.33.1

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