@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,189 +1,309 @@
1
- import { EventEmitter } from 'node:events';
2
- import { PassThrough, Writable } from 'node:stream';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import type { CodexDurableAgent } from '../../index.js';
1
+ import { EventEmitter } from "node:events";
2
+ import { PassThrough, Writable } from "node:stream";
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import type { CodexDurableAgent } from "../../index.js";
5
5
 
6
- const SESSION = '22222222-2222-4222-8222-222222222222';
6
+ const SESSION = "22222222-2222-4222-8222-222222222222";
7
7
 
8
8
  function agent(providerSessionId: string | null = null): CodexDurableAgent {
9
- return {
10
- id: '11111111-1111-4111-8111-111111111111', name: 'reviewer', provider: 'codex', mode: 'durable',
11
- cwd: '/project', providerSessionId, state: 'running', sessionHealth: 'uninitialized',
12
- createdAt: '', updatedAt: '', lastActiveAt: null, lastResult: null, activeRun: null,
13
- };
9
+ return {
10
+ id: "11111111-1111-4111-8111-111111111111",
11
+ name: "reviewer",
12
+ provider: "codex",
13
+ mode: "durable",
14
+ cwd: "/project",
15
+ providerSessionId,
16
+ state: "running",
17
+ sessionHealth: "uninitialized",
18
+ createdAt: "",
19
+ updatedAt: "",
20
+ lastActiveAt: null,
21
+ lastResult: null,
22
+ activeRun: null,
23
+ };
14
24
  }
15
25
 
16
26
  function fakeSpawn(lines: string[], exitCode = 0, chunks = false) {
17
- const promptChunks: Buffer[] = [];
18
- const child = new EventEmitter() as any;
19
- child.pid = 4242;
20
- child.stdout = new PassThrough();
21
- child.stderr = new PassThrough();
22
- child.kill = vi.fn();
23
- child.stdin = new Writable({
24
- write(chunk, _encoding, callback) { promptChunks.push(Buffer.from(chunk)); callback(); },
25
- final(callback) {
26
- const output = lines.join('\n');
27
- if (chunks) {
28
- const bytes = Buffer.from(output);
29
- child.stdout.write(bytes.subarray(0, 7));
30
- child.stdout.write(bytes.subarray(7));
31
- } else child.stdout.write(output);
32
- child.stdout.end();
33
- queueMicrotask(() => child.emit('close', exitCode, null));
34
- callback();
35
- },
36
- });
37
- const spawn = vi.fn(() => child);
38
- return { child, spawn, promptChunks };
27
+ const promptChunks: Buffer[] = [];
28
+ const child = new EventEmitter() as any;
29
+ child.pid = 4242;
30
+ child.stdout = new PassThrough();
31
+ child.stderr = new PassThrough();
32
+ child.kill = vi.fn();
33
+ child.stdin = new Writable({
34
+ write(chunk, _encoding, callback) {
35
+ promptChunks.push(Buffer.from(chunk));
36
+ callback();
37
+ },
38
+ final(callback) {
39
+ const output = lines.join("\n");
40
+ if (chunks) {
41
+ const bytes = Buffer.from(output);
42
+ child.stdout.write(bytes.subarray(0, 7));
43
+ child.stdout.write(bytes.subarray(7));
44
+ } else child.stdout.write(output);
45
+ child.stdout.end();
46
+ queueMicrotask(() => child.emit("close", exitCode, null));
47
+ callback();
48
+ },
49
+ });
50
+ const spawn = vi.fn(() => child);
51
+ return { child, spawn, promptChunks };
39
52
  }
40
53
 
41
54
  function events(session = SESSION): string[] {
42
- return [
43
- JSON.stringify({ type: 'thread.started', thread_id: session }),
44
- JSON.stringify({ type: 'turn.started' }),
45
- JSON.stringify({ type: 'future.event', anything: true }),
46
- JSON.stringify({ type: 'item.completed', item: { type: 'agent_message', text: 'first' } }),
47
- JSON.stringify({ type: 'item.completed', item: { type: 'agent_message', text: 'final' } }),
48
- JSON.stringify({ type: 'turn.completed' }),
49
- '',
50
- ];
55
+ return [
56
+ JSON.stringify({ type: "thread.started", thread_id: session }),
57
+ JSON.stringify({ type: "turn.started" }),
58
+ JSON.stringify({ type: "future.event", anything: true }),
59
+ JSON.stringify({ type: "item.completed", item: { type: "agent_message", text: "first" } }),
60
+ JSON.stringify({ type: "item.completed", item: { type: "agent_message", text: "final" } }),
61
+ JSON.stringify({ type: "turn.completed" }),
62
+ "",
63
+ ];
51
64
  }
52
65
 
53
66
  async function runner(fixture: ReturnType<typeof fakeSpawn>, maxLineBytes?: number) {
54
- const api = await import('../../index.js') as Record<string, unknown>;
55
- expect(api).toHaveProperty('CodexPrintRunner');
56
- const Runner = api.CodexPrintRunner as new (options: unknown) => any;
57
- return new Runner({ spawn: fixture.spawn, maxLineBytes, processInspector: {
58
- getIdentity: () => ({ pid: 4242, startedAt: 'provider-start' }),
59
- } });
67
+ const api = (await import("../../index.js")) as Record<string, unknown>;
68
+ expect(api).toHaveProperty("CodexPrintRunner");
69
+ const Runner = api.CodexPrintRunner as new (options: unknown) => any;
70
+ return new Runner({
71
+ spawn: fixture.spawn,
72
+ maxLineBytes,
73
+ processInspector: {
74
+ getIdentity: () => ({ pid: 4242, startedAt: "provider-start" }),
75
+ },
76
+ });
60
77
  }
61
78
 
62
- describe('CodexPrintRunner', () => {
63
- it('constructs default process dependencies without spawning', async () => {
64
- const api = await import('../../index.js') as Record<string, unknown>;
65
- const Runner = api.CodexPrintRunner as new () => any;
66
- expect(new Runner()).toBeDefined();
67
- });
79
+ describe("CodexPrintRunner", () => {
80
+ it("constructs default process dependencies without spawning", async () => {
81
+ const api = (await import("../../index.js")) as Record<string, unknown>;
82
+ const Runner = api.CodexPrintRunner as new () => any;
83
+ expect(new Runner()).toBeDefined();
84
+ });
68
85
 
69
- it('binds an initial thread before returning ordered assistant output', async () => {
70
- const fixture = fakeSpawn(events(), 0, true);
71
- const instance = await runner(fixture);
72
- const order: string[] = [];
73
- const result = await instance.run({
74
- agent: agent(), prompt: 'secret prompt', executable: 'fake-codex',
75
- onSpawn: async () => { expect(fixture.promptChunks).toHaveLength(0); order.push('spawn'); },
76
- onSession: async (id: string) => { expect(id).toBe(SESSION); order.push('session'); },
77
- });
78
-
79
- expect(order).toEqual(['spawn', 'session']);
80
- expect(fixture.spawn).toHaveBeenCalledWith('fake-codex', ['exec', '--json', '-'], expect.objectContaining({
81
- cwd: '/project', shell: false, stdio: ['pipe', 'pipe', 'pipe'],
82
- }));
83
- expect(JSON.stringify(fixture.spawn.mock.calls)).not.toContain('secret prompt');
84
- expect(Buffer.concat(fixture.promptChunks).toString()).toBe('secret prompt');
85
- expect(result).toEqual({ sessionId: SESSION, result: 'final', messages: ['first', 'final'], exitCode: 0 });
86
+ it("binds an initial thread before returning ordered assistant output", async () => {
87
+ const fixture = fakeSpawn(events(), 0, true);
88
+ const instance = await runner(fixture);
89
+ const order: string[] = [];
90
+ const result = await instance.run({
91
+ agent: agent(),
92
+ prompt: "secret prompt",
93
+ executable: "fake-codex",
94
+ onSpawn: async () => {
95
+ expect(fixture.promptChunks).toHaveLength(0);
96
+ order.push("spawn");
97
+ },
98
+ onSession: async (id: string) => {
99
+ expect(id).toBe(SESSION);
100
+ order.push("session");
101
+ },
86
102
  });
87
103
 
88
- it('resumes the exact stored UUID and rejects a mismatch', async () => {
89
- const mismatch = '33333333-3333-4333-8333-333333333333';
90
- const fixture = fakeSpawn(events(mismatch));
91
- const instance = await runner(fixture);
92
- await expect(instance.run({ agent: agent(SESSION), prompt: 'later', onSpawn: vi.fn(), onSession: vi.fn() }))
93
- .rejects.toMatchObject({ code: 'CODEX_SESSION_MISMATCH' });
94
- expect(fixture.spawn.mock.calls[0]![1]).toEqual(['exec', 'resume', '--json', SESSION, '-']);
104
+ expect(order).toEqual(["spawn", "session"]);
105
+ expect(fixture.spawn).toHaveBeenCalledWith(
106
+ "fake-codex",
107
+ ["exec", "--json", "-"],
108
+ expect.objectContaining({
109
+ cwd: "/project",
110
+ shell: false,
111
+ stdio: ["pipe", "pipe", "pipe"],
112
+ }),
113
+ );
114
+ expect(JSON.stringify(fixture.spawn.mock.calls)).not.toContain("secret prompt");
115
+ expect(Buffer.concat(fixture.promptChunks).toString()).toBe("secret prompt");
116
+ expect(result).toEqual({
117
+ sessionId: SESSION,
118
+ result: "final",
119
+ messages: ["first", "final"],
120
+ exitCode: 0,
95
121
  });
122
+ });
96
123
 
97
- it.each([
98
- ['malformed JSON', ['{bad\n'], 'CODEX_PROTOCOL'],
99
- ['non-object JSON', ['[]\n'], 'CODEX_PROTOCOL'],
100
- ['truncated JSON', ['{}'], 'CODEX_PROTOCOL'],
101
- ['missing thread', [JSON.stringify({ type: 'item.completed', item: { type: 'agent_message', text: 'x' } }), JSON.stringify({ type: 'turn.completed' }), ''], 'CODEX_PROTOCOL'],
102
- ['missing assistant', [JSON.stringify({ type: 'thread.started', thread_id: SESSION }), JSON.stringify({ type: 'turn.completed' }), ''], 'CODEX_RESULT_MISSING'],
103
- ['missing completion', [JSON.stringify({ type: 'thread.started', thread_id: SESSION }), JSON.stringify({ type: 'item.completed', item: { type: 'agent_message', text: 'x' } }), ''], 'CODEX_PROTOCOL'],
104
- ])('rejects %s', async (_name, lines, code) => {
105
- const fixture = fakeSpawn(lines as string[]);
106
- await expect((await runner(fixture)).run({
107
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
108
- })).rejects.toMatchObject({ code });
109
- });
124
+ it("resumes the exact stored UUID and rejects a mismatch", async () => {
125
+ const mismatch = "33333333-3333-4333-8333-333333333333";
126
+ const fixture = fakeSpawn(events(mismatch));
127
+ const instance = await runner(fixture);
128
+ await expect(
129
+ instance.run({
130
+ agent: agent(SESSION),
131
+ prompt: "later",
132
+ onSpawn: vi.fn(),
133
+ onSession: vi.fn(),
134
+ }),
135
+ ).rejects.toMatchObject({ code: "CODEX_SESSION_MISMATCH" });
136
+ expect(fixture.spawn.mock.calls[0]![1]).toEqual(["exec", "resume", "--json", SESSION, "-"]);
137
+ });
110
138
 
111
- it('rejects oversized output, non-zero exit, and missing process identity without leaking stderr', async () => {
112
- const oversized = fakeSpawn([`${'x'.repeat(20)}\n`]);
113
- await expect((await runner(oversized, 10)).run({
114
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
115
- })).rejects.toMatchObject({ code: 'CODEX_PROTOCOL' });
116
- const oversizedWithoutNewline = fakeSpawn(['x'.repeat(20)]);
117
- await expect((await runner(oversizedWithoutNewline, 10)).run({
118
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
119
- })).rejects.toMatchObject({ code: 'CODEX_PROTOCOL' });
120
-
121
- const failed = fakeSpawn(events(), 1);
122
- failed.child.stderr.end('secret-looking provider diagnostic');
123
- await expect((await runner(failed)).run({
124
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
125
- })).rejects.toMatchObject({ code: 'CODEX_PROCESS' });
126
-
127
- const missing = fakeSpawn([]);
128
- missing.child.pid = undefined;
129
- await expect((await runner(missing)).run({
130
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
131
- })).rejects.toMatchObject({ code: 'CODEX_PROCESS' });
132
- });
139
+ it.each([
140
+ ["malformed JSON", ["{bad\n"], "CODEX_PROTOCOL"],
141
+ ["non-object JSON", ["[]\n"], "CODEX_PROTOCOL"],
142
+ ["truncated JSON", ["{}"], "CODEX_PROTOCOL"],
143
+ [
144
+ "missing thread",
145
+ [
146
+ JSON.stringify({ type: "item.completed", item: { type: "agent_message", text: "x" } }),
147
+ JSON.stringify({ type: "turn.completed" }),
148
+ "",
149
+ ],
150
+ "CODEX_PROTOCOL",
151
+ ],
152
+ [
153
+ "missing assistant",
154
+ [
155
+ JSON.stringify({ type: "thread.started", thread_id: SESSION }),
156
+ JSON.stringify({ type: "turn.completed" }),
157
+ "",
158
+ ],
159
+ "CODEX_RESULT_MISSING",
160
+ ],
161
+ [
162
+ "missing completion",
163
+ [
164
+ JSON.stringify({ type: "thread.started", thread_id: SESSION }),
165
+ JSON.stringify({ type: "item.completed", item: { type: "agent_message", text: "x" } }),
166
+ "",
167
+ ],
168
+ "CODEX_PROTOCOL",
169
+ ],
170
+ ])("rejects %s", async (_name, lines, code) => {
171
+ const fixture = fakeSpawn(lines as string[]);
172
+ await expect(
173
+ (await runner(fixture)).run({
174
+ agent: agent(),
175
+ prompt: "x",
176
+ onSpawn: vi.fn(),
177
+ onSession: vi.fn(),
178
+ }),
179
+ ).rejects.toMatchObject({ code });
180
+ });
133
181
 
134
- it('rejects invalid or duplicate thread identities', async () => {
135
- for (const lines of [
136
- [JSON.stringify({ type: 'thread.started', thread_id: 'bad' }), ''],
137
- [
138
- JSON.stringify({ type: 'thread.started', thread_id: SESSION }),
139
- JSON.stringify({ type: 'thread.started', thread_id: SESSION }),
140
- '',
141
- ],
142
- ]) {
143
- const fixture = fakeSpawn(lines);
144
- await expect((await runner(fixture)).run({
145
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
146
- })).rejects.toMatchObject({ code: 'CODEX_PROTOCOL' });
147
- }
148
- });
182
+ it("rejects oversized output, non-zero exit, and missing process identity without leaking stderr", async () => {
183
+ const oversized = fakeSpawn([`${"x".repeat(20)}\n`]);
184
+ await expect(
185
+ (await runner(oversized, 10)).run({
186
+ agent: agent(),
187
+ prompt: "x",
188
+ onSpawn: vi.fn(),
189
+ onSession: vi.fn(),
190
+ }),
191
+ ).rejects.toMatchObject({ code: "CODEX_PROTOCOL" });
192
+ const oversizedWithoutNewline = fakeSpawn(["x".repeat(20)]);
193
+ await expect(
194
+ (await runner(oversizedWithoutNewline, 10)).run({
195
+ agent: agent(),
196
+ prompt: "x",
197
+ onSpawn: vi.fn(),
198
+ onSession: vi.fn(),
199
+ }),
200
+ ).rejects.toMatchObject({ code: "CODEX_PROTOCOL" });
149
201
 
150
- it('classifies callback processing failure and kills when spawn persistence fails', async () => {
151
- const callbackFailure = fakeSpawn(events());
152
- await expect((await runner(callbackFailure)).run({
153
- agent: agent(), prompt: 'x', onSpawn: vi.fn(),
154
- onSession: vi.fn().mockRejectedValue(new Error('storage unavailable')),
155
- })).rejects.toMatchObject({ code: 'CODEX_PROTOCOL' });
156
-
157
- const spawnFailure = fakeSpawn([]);
158
- const failure = new Error('cannot persist process');
159
- await expect((await runner(spawnFailure)).run({
160
- agent: agent(), prompt: 'x', onSpawn: vi.fn().mockRejectedValue(failure), onSession: vi.fn(),
161
- })).rejects.toBe(failure);
162
- expect(spawnFailure.child.kill).toHaveBeenCalledOnce();
163
- });
202
+ const failed = fakeSpawn(events(), 1);
203
+ failed.child.stderr.end("secret-looking provider diagnostic");
204
+ await expect(
205
+ (await runner(failed)).run({
206
+ agent: agent(),
207
+ prompt: "x",
208
+ onSpawn: vi.fn(),
209
+ onSession: vi.fn(),
210
+ }),
211
+ ).rejects.toMatchObject({ code: "CODEX_PROCESS" });
212
+
213
+ const missing = fakeSpawn([]);
214
+ missing.child.pid = undefined;
215
+ await expect(
216
+ (await runner(missing)).run({
217
+ agent: agent(),
218
+ prompt: "x",
219
+ onSpawn: vi.fn(),
220
+ onSession: vi.fn(),
221
+ }),
222
+ ).rejects.toMatchObject({ code: "CODEX_PROCESS" });
223
+ });
224
+
225
+ it("rejects invalid or duplicate thread identities", async () => {
226
+ for (const lines of [
227
+ [JSON.stringify({ type: "thread.started", thread_id: "bad" }), ""],
228
+ [
229
+ JSON.stringify({ type: "thread.started", thread_id: SESSION }),
230
+ JSON.stringify({ type: "thread.started", thread_id: SESSION }),
231
+ "",
232
+ ],
233
+ ]) {
234
+ const fixture = fakeSpawn(lines);
235
+ await expect(
236
+ (await runner(fixture)).run({
237
+ agent: agent(),
238
+ prompt: "x",
239
+ onSpawn: vi.fn(),
240
+ onSession: vi.fn(),
241
+ }),
242
+ ).rejects.toMatchObject({ code: "CODEX_PROTOCOL" });
243
+ }
244
+ });
164
245
 
165
- it('rejects an unverifiable positive PID', async () => {
166
- const api = await import('../../index.js') as Record<string, unknown>;
167
- const fixture = fakeSpawn([]);
168
- const Runner = api.CodexPrintRunner as new (options: unknown) => any;
169
- const instance = new Runner({ spawn: fixture.spawn, processInspector: { getIdentity: () => null } });
170
- await expect(instance.run({
171
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
172
- })).rejects.toMatchObject({ code: 'CODEX_PROCESS' });
173
- expect(fixture.child.kill).toHaveBeenCalledOnce();
246
+ it("classifies callback processing failure and kills when spawn persistence fails", async () => {
247
+ const callbackFailure = fakeSpawn(events());
248
+ await expect(
249
+ (await runner(callbackFailure)).run({
250
+ agent: agent(),
251
+ prompt: "x",
252
+ onSpawn: vi.fn(),
253
+ onSession: vi.fn().mockRejectedValue(new Error("storage unavailable")),
254
+ }),
255
+ ).rejects.toMatchObject({ code: "CODEX_PROTOCOL" });
256
+
257
+ const spawnFailure = fakeSpawn([]);
258
+ const failure = new Error("cannot persist process");
259
+ await expect(
260
+ (await runner(spawnFailure)).run({
261
+ agent: agent(),
262
+ prompt: "x",
263
+ onSpawn: vi.fn().mockRejectedValue(failure),
264
+ onSession: vi.fn(),
265
+ }),
266
+ ).rejects.toBe(failure);
267
+ expect(spawnFailure.child.kill).toHaveBeenCalledOnce();
268
+ });
269
+
270
+ it("rejects an unverifiable positive PID", async () => {
271
+ const api = (await import("../../index.js")) as Record<string, unknown>;
272
+ const fixture = fakeSpawn([]);
273
+ const Runner = api.CodexPrintRunner as new (options: unknown) => any;
274
+ const instance = new Runner({
275
+ spawn: fixture.spawn,
276
+ processInspector: { getIdentity: () => null },
174
277
  });
278
+ await expect(
279
+ instance.run({
280
+ agent: agent(),
281
+ prompt: "x",
282
+ onSpawn: vi.fn(),
283
+ onSession: vi.fn(),
284
+ }),
285
+ ).rejects.toMatchObject({ code: "CODEX_PROCESS" });
286
+ expect(fixture.child.kill).toHaveBeenCalledOnce();
287
+ });
175
288
 
176
- it('classifies a child spawn error as a process failure', async () => {
177
- const fixture = fakeSpawn([]);
178
- fixture.child.stdin = new Writable({
179
- write(_chunk, _encoding, callback) { callback(); },
180
- final(callback) {
181
- queueMicrotask(() => fixture.child.emit('error', new Error('spawn failed')));
182
- callback();
183
- },
184
- });
185
- await expect((await runner(fixture)).run({
186
- agent: agent(), prompt: 'x', onSpawn: vi.fn(), onSession: vi.fn(),
187
- })).rejects.toMatchObject({ code: 'CODEX_PROCESS' });
289
+ it("classifies a child spawn error as a process failure", async () => {
290
+ const fixture = fakeSpawn([]);
291
+ fixture.child.stdin = new Writable({
292
+ write(_chunk, _encoding, callback) {
293
+ callback();
294
+ },
295
+ final(callback) {
296
+ queueMicrotask(() => fixture.child.emit("error", new Error("spawn failed")));
297
+ callback();
298
+ },
188
299
  });
300
+ await expect(
301
+ (await runner(fixture)).run({
302
+ agent: agent(),
303
+ prompt: "x",
304
+ onSpawn: vi.fn(),
305
+ onSession: vi.fn(),
306
+ }),
307
+ ).rejects.toMatchObject({ code: "CODEX_PROCESS" });
308
+ });
189
309
  });
@@ -1,24 +1,31 @@
1
1
  #!/usr/bin/env node
2
- const fs = require('node:fs');
2
+ const fs = require("node:fs");
3
3
 
4
4
  const args = process.argv.slice(2);
5
- if (args[0] === '--version') {
6
- process.stdout.write('fake-claude 2.1.220\n');
5
+ if (args[0] === "--version") {
6
+ process.stdout.write("fake-claude 2.1.220\n");
7
7
  process.exit(0);
8
8
  }
9
- if (args[0] === '--help') {
10
- process.stdout.write('--print -p --session-id --resume --output-format stream-json --verbose\n');
9
+ if (args[0] === "--help") {
10
+ process.stdout.write("--print -p --session-id --resume --output-format stream-json --verbose\n");
11
11
  process.exit(0);
12
12
  }
13
13
 
14
- let prompt = '';
15
- process.stdin.setEncoding('utf8');
16
- process.stdin.on('data', (chunk) => { prompt += chunk; });
17
- process.stdin.on('end', () => {
18
- const flag = args.includes('--session-id') ? '--session-id' : '--resume';
14
+ let prompt = "";
15
+ process.stdin.setEncoding("utf8");
16
+ process.stdin.on("data", (chunk) => {
17
+ prompt += chunk;
18
+ });
19
+ process.stdin.on("end", () => {
20
+ const flag = args.includes("--session-id") ? "--session-id" : "--resume";
19
21
  const sessionId = args[args.indexOf(flag) + 1];
20
22
  const capture = process.env.AI_DEVKIT_FAKE_CLAUDE_CAPTURE;
21
- if (capture) fs.appendFileSync(capture, `${JSON.stringify({ args, prompt, cwd: process.cwd() })}\n`);
22
- process.stdout.write(`${JSON.stringify({ type: 'system', subtype: 'init', session_id: sessionId })}\n`);
23
- process.stdout.write(`${JSON.stringify({ type: 'result', session_id: sessionId, result: `answer:${prompt}` })}\n`);
23
+ if (capture)
24
+ fs.appendFileSync(capture, `${JSON.stringify({ args, prompt, cwd: process.cwd() })}\n`);
25
+ process.stdout.write(
26
+ `${JSON.stringify({ type: "system", subtype: "init", session_id: sessionId })}\n`,
27
+ );
28
+ process.stdout.write(
29
+ `${JSON.stringify({ type: "result", session_id: sessionId, result: `answer:${prompt}` })}\n`,
30
+ );
24
31
  });
@@ -1,45 +1,56 @@
1
1
  #!/usr/bin/env node
2
- const fs = require('node:fs');
2
+ const fs = require("node:fs");
3
3
 
4
- const SESSION = '22222222-2222-4222-8222-222222222222';
5
- const MISMATCH = '33333333-3333-4333-8333-333333333333';
4
+ const SESSION = "22222222-2222-4222-8222-222222222222";
5
+ const MISMATCH = "33333333-3333-4333-8333-333333333333";
6
6
  const args = process.argv.slice(2);
7
7
 
8
- if (args[0] === '--version') {
9
- process.stdout.write('codex-cli 0.147.0\n');
8
+ if (args[0] === "--version") {
9
+ process.stdout.write("codex-cli 0.147.0\n");
10
10
  process.exit(0);
11
11
  }
12
- if (args[0] === 'exec' && args.at(-1) === '--help') {
13
- process.stdout.write(args[1] === 'resume'
14
- ? 'Usage: codex exec resume [SESSION_ID] [PROMPT]\n--json\n- stdin\n'
15
- : 'Usage: codex exec [PROMPT]\nresume\n--json\n- stdin\n');
12
+ if (args[0] === "exec" && args.at(-1) === "--help") {
13
+ process.stdout.write(
14
+ args[1] === "resume"
15
+ ? "Usage: codex exec resume [SESSION_ID] [PROMPT]\n--json\n- stdin\n"
16
+ : "Usage: codex exec [PROMPT]\nresume\n--json\n- stdin\n",
17
+ );
16
18
  process.exit(0);
17
19
  }
18
20
 
19
- let prompt = '';
20
- process.stdin.setEncoding('utf8');
21
- process.stdin.on('data', (chunk) => { prompt += chunk; });
22
- process.stdin.on('end', () => {
23
- const mode = process.env.AI_DEVKIT_FAKE_CODEX_MODE || 'success';
24
- const isResume = args[1] === 'resume';
21
+ let prompt = "";
22
+ process.stdin.setEncoding("utf8");
23
+ process.stdin.on("data", (chunk) => {
24
+ prompt += chunk;
25
+ });
26
+ process.stdin.on("end", () => {
27
+ const mode = process.env.AI_DEVKIT_FAKE_CODEX_MODE || "success";
28
+ const isResume = args[1] === "resume";
25
29
  const requested = isResume ? args[3] : null;
26
- const sessionId = mode === 'mismatch' ? MISMATCH : (requested || SESSION);
30
+ const sessionId = mode === "mismatch" ? MISMATCH : requested || SESSION;
27
31
  const capture = process.env.AI_DEVKIT_FAKE_CODEX_CAPTURE;
28
- if (capture) fs.appendFileSync(capture, `${JSON.stringify({ args, prompt, cwd: process.cwd() })}\n`);
29
- if (mode === 'fail-before-bind') process.exit(1);
30
- if (mode !== 'missing-thread') process.stdout.write(`${JSON.stringify({ type: 'thread.started', thread_id: sessionId })}\n`);
31
- if (mode === 'fail-after-bind') process.exit(1);
32
- if (mode === 'malformed') return process.stdout.write('{bad\n');
33
- if (mode === 'oversized') return process.stdout.write(`${'x'.repeat(1024 * 1024 + 1)}\n`);
34
- if (mode === 'truncated') return process.stdout.write('{');
35
- process.stdout.write(`${JSON.stringify({ type: 'turn.started' })}\n`);
36
- if (mode !== 'missing-result') {
37
- process.stdout.write(`${JSON.stringify({ type: 'item.completed', item: { id: 'item_0', type: 'agent_message', text: 'first' } })}\n`);
38
- process.stdout.write(`${JSON.stringify({ type: 'item.completed', item: { id: 'item_1', type: 'agent_message', text: `answer:${prompt}` } })}\n`);
32
+ if (capture)
33
+ fs.appendFileSync(capture, `${JSON.stringify({ args, prompt, cwd: process.cwd() })}\n`);
34
+ if (mode === "fail-before-bind") process.exit(1);
35
+ if (mode !== "missing-thread")
36
+ process.stdout.write(`${JSON.stringify({ type: "thread.started", thread_id: sessionId })}\n`);
37
+ if (mode === "fail-after-bind") process.exit(1);
38
+ if (mode === "malformed") return process.stdout.write("{bad\n");
39
+ if (mode === "oversized") return process.stdout.write(`${"x".repeat(1024 * 1024 + 1)}\n`);
40
+ if (mode === "truncated") return process.stdout.write("{");
41
+ process.stdout.write(`${JSON.stringify({ type: "turn.started" })}\n`);
42
+ if (mode !== "missing-result") {
43
+ process.stdout.write(
44
+ `${JSON.stringify({ type: "item.completed", item: { id: "item_0", type: "agent_message", text: "first" } })}\n`,
45
+ );
46
+ process.stdout.write(
47
+ `${JSON.stringify({ type: "item.completed", item: { id: "item_1", type: "agent_message", text: `answer:${prompt}` } })}\n`,
48
+ );
39
49
  }
40
- if (mode !== 'missing-completion') process.stdout.write(`${JSON.stringify({ type: 'turn.completed', usage: {} })}\n`);
41
- if (mode === 'stderr-failure') {
42
- process.stderr.write('secret-looking diagnostic');
50
+ if (mode !== "missing-completion")
51
+ process.stdout.write(`${JSON.stringify({ type: "turn.completed", usage: {} })}\n`);
52
+ if (mode === "stderr-failure") {
53
+ process.stderr.write("secret-looking diagnostic");
43
54
  process.exitCode = 1;
44
55
  }
45
56
  });