@ai-devkit/agent-manager 0.31.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 +301 -0
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -0
  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 -41
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -25
  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 +67 -0
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -0
  280. package/dist/readiness/AgentReadiness.js +614 -0
  281. package/dist/readiness/AgentReadiness.js.map +1 -0
  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 +242 -0
  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 +145 -86
  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 +727 -0
  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,19 +1,19 @@
1
- import { EventEmitter } from 'node:events';
2
- import { PassThrough, Writable } from 'node:stream';
3
- import { describe, expect, it, vi } from 'vitest';
4
- import { ClaudePrintRunner } from '../../providers/claude/durable/ClaudePrintRunner.js';
1
+ import { EventEmitter } from "node:events";
2
+ import { PassThrough, Writable } from "node:stream";
3
+ import { describe, expect, it, vi } from "vitest";
4
+ import { ClaudePrintRunner } from "../../providers/claude/durable/ClaudePrintRunner.js";
5
5
  function agent() {
6
6
  return {
7
- id: '11111111-1111-4111-8111-111111111111',
8
- name: 'reviewer',
9
- provider: 'claude',
10
- mode: 'durable',
11
- cwd: '/project',
12
- providerSessionId: '22222222-2222-4222-8222-222222222222',
13
- state: 'running',
14
- sessionHealth: 'uninitialized',
15
- createdAt: '',
16
- updatedAt: '',
7
+ id: "11111111-1111-4111-8111-111111111111",
8
+ name: "reviewer",
9
+ provider: "claude",
10
+ mode: "durable",
11
+ cwd: "/project",
12
+ providerSessionId: "22222222-2222-4222-8222-222222222222",
13
+ state: "running",
14
+ sessionHealth: "uninitialized",
15
+ createdAt: "",
16
+ updatedAt: "",
17
17
  lastActiveAt: null,
18
18
  lastResult: null,
19
19
  activeRun: null
@@ -34,7 +34,7 @@ function fakeSpawn(events, exitCode = 0) {
34
34
  final (callback) {
35
35
  for (const event of events)child.stdout.write(`${JSON.stringify(event)}\n`);
36
36
  child.stdout.end();
37
- queueMicrotask(()=>child.emit('close', exitCode, null));
37
+ queueMicrotask(()=>child.emit("close", exitCode, null));
38
38
  callback();
39
39
  }
40
40
  });
@@ -48,18 +48,18 @@ function fakeSpawn(events, exitCode = 0) {
48
48
  promptChunks
49
49
  };
50
50
  }
51
- describe('ClaudePrintRunner', ()=>{
52
- it('starts a caller-assigned session and persists provider identity before stdin', async ()=>{
51
+ describe("ClaudePrintRunner", ()=>{
52
+ it("starts a caller-assigned session and persists provider identity before stdin", async ()=>{
53
53
  const fixture = fakeSpawn([
54
54
  {
55
- type: 'system',
56
- subtype: 'init',
55
+ type: "system",
56
+ subtype: "init",
57
57
  session_id: agent().providerSessionId
58
58
  },
59
59
  {
60
- type: 'result',
60
+ type: "result",
61
61
  session_id: agent().providerSessionId,
62
- result: 'done'
62
+ result: "done"
63
63
  }
64
64
  ]);
65
65
  let persisted = false;
@@ -68,14 +68,14 @@ describe('ClaudePrintRunner', ()=>{
68
68
  processInspector: {
69
69
  getIdentity: ()=>({
70
70
  pid: 4242,
71
- startedAt: 'provider-start'
71
+ startedAt: "provider-start"
72
72
  })
73
73
  }
74
74
  });
75
75
  const result = await runner.run({
76
76
  agent: agent(),
77
- prompt: 'secret prompt',
78
- executable: 'claude-test',
77
+ prompt: "secret prompt",
78
+ executable: "claude-test",
79
79
  firstRun: true,
80
80
  onSpawn: async ()=>{
81
81
  expect(fixture.promptChunks).toHaveLength(0);
@@ -84,39 +84,39 @@ describe('ClaudePrintRunner', ()=>{
84
84
  });
85
85
  expect(persisted).toBe(true);
86
86
  expect(fixture.calls[0]).toEqual([
87
- 'claude-test',
87
+ "claude-test",
88
88
  [
89
- '-p',
90
- '--session-id',
89
+ "-p",
90
+ "--session-id",
91
91
  agent().providerSessionId,
92
- '--output-format',
93
- 'stream-json',
94
- '--verbose'
92
+ "--output-format",
93
+ "stream-json",
94
+ "--verbose"
95
95
  ],
96
96
  expect.objectContaining({
97
- cwd: '/project',
97
+ cwd: "/project",
98
98
  shell: false,
99
99
  stdio: [
100
- 'pipe',
101
- 'pipe',
102
- 'pipe'
100
+ "pipe",
101
+ "pipe",
102
+ "pipe"
103
103
  ]
104
104
  })
105
105
  ]);
106
- expect(JSON.stringify(fixture.calls)).not.toContain('secret prompt');
107
- expect(Buffer.concat(fixture.promptChunks).toString()).toBe('secret prompt');
106
+ expect(JSON.stringify(fixture.calls)).not.toContain("secret prompt");
107
+ expect(Buffer.concat(fixture.promptChunks).toString()).toBe("secret prompt");
108
108
  expect(result).toEqual({
109
109
  sessionId: agent().providerSessionId,
110
- result: 'done',
110
+ result: "done",
111
111
  exitCode: 0
112
112
  });
113
113
  });
114
- it('uses exact resume and rejects a mismatched result session', async ()=>{
114
+ it("uses exact resume and rejects a mismatched result session", async ()=>{
115
115
  const fixture = fakeSpawn([
116
116
  {
117
- type: 'result',
118
- session_id: 'wrong',
119
- result: 'nope'
117
+ type: "result",
118
+ session_id: "wrong",
119
+ result: "nope"
120
120
  }
121
121
  ]);
122
122
  const runner = new ClaudePrintRunner({
@@ -124,36 +124,36 @@ describe('ClaudePrintRunner', ()=>{
124
124
  processInspector: {
125
125
  getIdentity: ()=>({
126
126
  pid: 4242,
127
- startedAt: 'provider-start'
127
+ startedAt: "provider-start"
128
128
  })
129
129
  }
130
130
  });
131
131
  await expect(runner.run({
132
132
  agent: agent(),
133
- prompt: 'followup',
134
- executable: 'claude',
133
+ prompt: "followup",
134
+ executable: "claude",
135
135
  firstRun: false,
136
136
  onSpawn: vi.fn()
137
137
  })).rejects.toMatchObject({
138
- code: 'CLAUDE_SESSION_MISMATCH'
138
+ code: "CLAUDE_SESSION_MISMATCH"
139
139
  });
140
140
  expect(fixture.calls[0][1]).toEqual([
141
- '-p',
142
- '--resume',
141
+ "-p",
142
+ "--resume",
143
143
  agent().providerSessionId,
144
- '--output-format',
145
- 'stream-json',
146
- '--verbose'
144
+ "--output-format",
145
+ "stream-json",
146
+ "--verbose"
147
147
  ]);
148
148
  });
149
- it('does not disclose provider stderr in a failed-run error', async ()=>{
149
+ it("does not disclose provider stderr in a failed-run error", async ()=>{
150
150
  const fixture = fakeSpawn([], 1);
151
151
  const runner = new ClaudePrintRunner({
152
152
  spawn: fixture.spawn,
153
153
  processInspector: {
154
154
  getIdentity: ()=>({
155
155
  pid: 4242,
156
- startedAt: 'provider-start'
156
+ startedAt: "provider-start"
157
157
  })
158
158
  }
159
159
  });
@@ -161,9 +161,9 @@ describe('ClaudePrintRunner', ()=>{
161
161
  const child = fakeSpawn([], 1).spawn(...args);
162
162
  child.stdin = new Writable({
163
163
  final (callback) {
164
- child.stderr.write('secret prompt echoed by provider');
164
+ child.stderr.write("secret prompt echoed by provider");
165
165
  child.stderr.end();
166
- queueMicrotask(()=>child.emit('close', 1, null));
166
+ queueMicrotask(()=>child.emit("close", 1, null));
167
167
  callback();
168
168
  }
169
169
  });
@@ -171,7 +171,7 @@ describe('ClaudePrintRunner', ()=>{
171
171
  });
172
172
  await expect(runner.run({
173
173
  agent: agent(),
174
- prompt: 'secret prompt',
174
+ prompt: "secret prompt",
175
175
  firstRun: true,
176
176
  onSpawn: vi.fn()
177
177
  })).rejects.not.toThrow(/secret prompt/);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/print/ClaudePrintRunner.test.ts"],"sourcesContent":["import { EventEmitter } from 'node:events';\nimport { PassThrough, Writable } from 'node:stream';\nimport { describe, expect, it, vi } from 'vitest';\nimport type { DurableAgent } from '../../index.js';\nimport { ClaudePrintRunner } from '../../providers/claude/durable/ClaudePrintRunner.js';\n\nfunction agent(): DurableAgent {\n return {\n id: '11111111-1111-4111-8111-111111111111', name: 'reviewer', provider: 'claude', mode: 'durable',\n cwd: '/project', providerSessionId: '22222222-2222-4222-8222-222222222222', state: 'running',\n sessionHealth: 'uninitialized', createdAt: '', updatedAt: '', lastActiveAt: null, lastResult: null,\n activeRun: null,\n };\n}\n\nfunction fakeSpawn(events: object[], exitCode = 0) {\n const calls: unknown[][] = [];\n const promptChunks: Buffer[] = [];\n const child = new EventEmitter() as any;\n child.pid = 4242;\n child.stdout = new PassThrough();\n child.stderr = new PassThrough();\n child.stdin = new Writable({\n write(chunk, _encoding, callback) { promptChunks.push(Buffer.from(chunk)); callback(); },\n final(callback) {\n for (const event of events) child.stdout.write(`${JSON.stringify(event)}\\n`);\n child.stdout.end();\n queueMicrotask(() => child.emit('close', exitCode, null));\n callback();\n },\n });\n const spawn = vi.fn((...args: unknown[]) => { calls.push(args); return child; });\n return { spawn, calls, promptChunks };\n}\n\ndescribe('ClaudePrintRunner', () => {\n it('starts a caller-assigned session and persists provider identity before stdin', async () => {\n const fixture = fakeSpawn([\n { type: 'system', subtype: 'init', session_id: agent().providerSessionId },\n { type: 'result', session_id: agent().providerSessionId, result: 'done' },\n ]);\n let persisted = false;\n const runner = new ClaudePrintRunner({ spawn: fixture.spawn, processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: 'provider-start' }),\n } });\n\n const result = await runner.run({\n agent: agent(), prompt: 'secret prompt', executable: 'claude-test', firstRun: true,\n onSpawn: async () => { expect(fixture.promptChunks).toHaveLength(0); persisted = true; },\n });\n\n expect(persisted).toBe(true);\n expect(fixture.calls[0]).toEqual([\n 'claude-test',\n ['-p', '--session-id', agent().providerSessionId, '--output-format', 'stream-json', '--verbose'],\n expect.objectContaining({ cwd: '/project', shell: false, stdio: ['pipe', 'pipe', 'pipe'] }),\n ]);\n expect(JSON.stringify(fixture.calls)).not.toContain('secret prompt');\n expect(Buffer.concat(fixture.promptChunks).toString()).toBe('secret prompt');\n expect(result).toEqual({ sessionId: agent().providerSessionId, result: 'done', exitCode: 0 });\n });\n\n it('uses exact resume and rejects a mismatched result session', async () => {\n const fixture = fakeSpawn([{ type: 'result', session_id: 'wrong', result: 'nope' }]);\n const runner = new ClaudePrintRunner({ spawn: fixture.spawn, processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: 'provider-start' }),\n } });\n\n await expect(runner.run({\n agent: agent(), prompt: 'followup', executable: 'claude', firstRun: false, onSpawn: vi.fn(),\n })).rejects.toMatchObject({ code: 'CLAUDE_SESSION_MISMATCH' });\n expect(fixture.calls[0]![1]).toEqual([\n '-p', '--resume', agent().providerSessionId, '--output-format', 'stream-json', '--verbose',\n ]);\n });\n\n it('does not disclose provider stderr in a failed-run error', async () => {\n const fixture = fakeSpawn([], 1);\n const runner = new ClaudePrintRunner({ spawn: fixture.spawn, processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: 'provider-start' }),\n } });\n fixture.spawn.mockImplementationOnce((...args: unknown[]) => {\n const child = (fakeSpawn([], 1).spawn as any)(...args);\n child.stdin = new Writable({\n final(callback) {\n child.stderr.write('secret prompt echoed by provider');\n child.stderr.end();\n queueMicrotask(() => child.emit('close', 1, null));\n callback();\n },\n });\n return child;\n });\n\n await expect(runner.run({\n agent: agent(), prompt: 'secret prompt', firstRun: true, onSpawn: vi.fn(),\n })).rejects.not.toThrow(/secret prompt/);\n });\n});\n"],"names":["EventEmitter","PassThrough","Writable","describe","expect","it","vi","ClaudePrintRunner","agent","id","name","provider","mode","cwd","providerSessionId","state","sessionHealth","createdAt","updatedAt","lastActiveAt","lastResult","activeRun","fakeSpawn","events","exitCode","calls","promptChunks","child","pid","stdout","stderr","stdin","write","chunk","_encoding","callback","push","Buffer","from","final","event","JSON","stringify","end","queueMicrotask","emit","spawn","fn","args","fixture","type","subtype","session_id","result","persisted","runner","processInspector","getIdentity","startedAt","run","prompt","executable","firstRun","onSpawn","toHaveLength","toBe","toEqual","objectContaining","shell","stdio","not","toContain","concat","toString","sessionId","rejects","toMatchObject","code","mockImplementationOnce","toThrow"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/__tests__/print/ClaudePrintRunner.test.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { PassThrough, Writable } from \"node:stream\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport type { DurableAgent } from \"../../index.js\";\nimport { ClaudePrintRunner } from \"../../providers/claude/durable/ClaudePrintRunner.js\";\n\nfunction agent(): DurableAgent {\n return {\n id: \"11111111-1111-4111-8111-111111111111\",\n name: \"reviewer\",\n provider: \"claude\",\n mode: \"durable\",\n cwd: \"/project\",\n providerSessionId: \"22222222-2222-4222-8222-222222222222\",\n state: \"running\",\n sessionHealth: \"uninitialized\",\n createdAt: \"\",\n updatedAt: \"\",\n lastActiveAt: null,\n lastResult: null,\n activeRun: null,\n };\n}\n\nfunction fakeSpawn(events: object[], exitCode = 0) {\n const calls: unknown[][] = [];\n const promptChunks: Buffer[] = [];\n const child = new EventEmitter() as any;\n child.pid = 4242;\n child.stdout = new PassThrough();\n child.stderr = new PassThrough();\n child.stdin = new Writable({\n write(chunk, _encoding, callback) {\n promptChunks.push(Buffer.from(chunk));\n callback();\n },\n final(callback) {\n for (const event of events) child.stdout.write(`${JSON.stringify(event)}\\n`);\n child.stdout.end();\n queueMicrotask(() => child.emit(\"close\", exitCode, null));\n callback();\n },\n });\n const spawn = vi.fn((...args: unknown[]) => {\n calls.push(args);\n return child;\n });\n return { spawn, calls, promptChunks };\n}\n\ndescribe(\"ClaudePrintRunner\", () => {\n it(\"starts a caller-assigned session and persists provider identity before stdin\", async () => {\n const fixture = fakeSpawn([\n { type: \"system\", subtype: \"init\", session_id: agent().providerSessionId },\n { type: \"result\", session_id: agent().providerSessionId, result: \"done\" },\n ]);\n let persisted = false;\n const runner = new ClaudePrintRunner({\n spawn: fixture.spawn,\n processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: \"provider-start\" }),\n },\n });\n\n const result = await runner.run({\n agent: agent(),\n prompt: \"secret prompt\",\n executable: \"claude-test\",\n firstRun: true,\n onSpawn: async () => {\n expect(fixture.promptChunks).toHaveLength(0);\n persisted = true;\n },\n });\n\n expect(persisted).toBe(true);\n expect(fixture.calls[0]).toEqual([\n \"claude-test\",\n [\n \"-p\",\n \"--session-id\",\n agent().providerSessionId,\n \"--output-format\",\n \"stream-json\",\n \"--verbose\",\n ],\n expect.objectContaining({ cwd: \"/project\", shell: false, stdio: [\"pipe\", \"pipe\", \"pipe\"] }),\n ]);\n expect(JSON.stringify(fixture.calls)).not.toContain(\"secret prompt\");\n expect(Buffer.concat(fixture.promptChunks).toString()).toBe(\"secret prompt\");\n expect(result).toEqual({ sessionId: agent().providerSessionId, result: \"done\", exitCode: 0 });\n });\n\n it(\"uses exact resume and rejects a mismatched result session\", async () => {\n const fixture = fakeSpawn([{ type: \"result\", session_id: \"wrong\", result: \"nope\" }]);\n const runner = new ClaudePrintRunner({\n spawn: fixture.spawn,\n processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: \"provider-start\" }),\n },\n });\n\n await expect(\n runner.run({\n agent: agent(),\n prompt: \"followup\",\n executable: \"claude\",\n firstRun: false,\n onSpawn: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CLAUDE_SESSION_MISMATCH\" });\n expect(fixture.calls[0]![1]).toEqual([\n \"-p\",\n \"--resume\",\n agent().providerSessionId,\n \"--output-format\",\n \"stream-json\",\n \"--verbose\",\n ]);\n });\n\n it(\"does not disclose provider stderr in a failed-run error\", async () => {\n const fixture = fakeSpawn([], 1);\n const runner = new ClaudePrintRunner({\n spawn: fixture.spawn,\n processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: \"provider-start\" }),\n },\n });\n fixture.spawn.mockImplementationOnce((...args: unknown[]) => {\n const child = (fakeSpawn([], 1).spawn as any)(...args);\n child.stdin = new Writable({\n final(callback) {\n child.stderr.write(\"secret prompt echoed by provider\");\n child.stderr.end();\n queueMicrotask(() => child.emit(\"close\", 1, null));\n callback();\n },\n });\n return child;\n });\n\n await expect(\n runner.run({\n agent: agent(),\n prompt: \"secret prompt\",\n firstRun: true,\n onSpawn: vi.fn(),\n }),\n ).rejects.not.toThrow(/secret prompt/);\n });\n});\n"],"names":["EventEmitter","PassThrough","Writable","describe","expect","it","vi","ClaudePrintRunner","agent","id","name","provider","mode","cwd","providerSessionId","state","sessionHealth","createdAt","updatedAt","lastActiveAt","lastResult","activeRun","fakeSpawn","events","exitCode","calls","promptChunks","child","pid","stdout","stderr","stdin","write","chunk","_encoding","callback","push","Buffer","from","final","event","JSON","stringify","end","queueMicrotask","emit","spawn","fn","args","fixture","type","subtype","session_id","result","persisted","runner","processInspector","getIdentity","startedAt","run","prompt","executable","firstRun","onSpawn","toHaveLength","toBe","toEqual","objectContaining","shell","stdio","not","toContain","concat","toString","sessionId","rejects","toMatchObject","code","mockImplementationOnce","toThrow"],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import { describe, expect, it } from 'vitest';
2
- describe('durable-agent public domain', ()=>{
3
- it('exports a classified busy error without exposing prompt data', async ()=>{
4
- const api = await import('../../index.js');
5
- expect(api).toHaveProperty('DurableAgentBusyError');
1
+ import { describe, expect, it } from "vitest";
2
+ describe("durable-agent public domain", ()=>{
3
+ it("exports a classified busy error without exposing prompt data", async ()=>{
4
+ const api = await import("../../index.js");
5
+ expect(api).toHaveProperty("DurableAgentBusyError");
6
6
  const ErrorType = api.DurableAgentBusyError;
7
- const error = new ErrorType('agent-id', 'reviewer');
7
+ const error = new ErrorType("agent-id", "reviewer");
8
8
  expect(error).toMatchObject({
9
- name: 'DurableAgentBusyError',
10
- code: 'DURABLE_AGENT_BUSY',
11
- agentId: 'agent-id',
9
+ name: "DurableAgentBusyError",
10
+ code: "DURABLE_AGENT_BUSY",
11
+ agentId: "agent-id",
12
12
  message: 'Durable agent "reviewer" is busy.'
13
13
  });
14
14
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/print/DurableAgent.test.ts"],"sourcesContent":["import { describe, expect, it } from 'vitest';\n\ndescribe('durable-agent public domain', () => {\n it('exports a classified busy error without exposing prompt data', async () => {\n const api = await import('../../index.js') as Record<string, unknown>;\n\n expect(api).toHaveProperty('DurableAgentBusyError');\n const ErrorType = api.DurableAgentBusyError as new (agentId: string, name: string) => Error & {\n code: string;\n agentId: string;\n };\n const error = new ErrorType('agent-id', 'reviewer');\n\n expect(error).toMatchObject({\n name: 'DurableAgentBusyError',\n code: 'DURABLE_AGENT_BUSY',\n agentId: 'agent-id',\n message: 'Durable agent \"reviewer\" is busy.',\n });\n });\n});\n"],"names":["describe","expect","it","api","toHaveProperty","ErrorType","DurableAgentBusyError","error","toMatchObject","name","code","agentId","message"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AAE9CF,SAAS,+BAA+B;IACpCE,GAAG,gEAAgE;QAC/D,MAAMC,MAAM,MAAM,MAAM,CAAC;QAEzBF,OAAOE,KAAKC,cAAc,CAAC;QAC3B,MAAMC,YAAYF,IAAIG,qBAAqB;QAI3C,MAAMC,QAAQ,IAAIF,UAAU,YAAY;QAExCJ,OAAOM,OAAOC,aAAa,CAAC;YACxBC,MAAM;YACNC,MAAM;YACNC,SAAS;YACTC,SAAS;QACb;IACJ;AACJ"}
1
+ {"version":3,"sources":["../../../src/__tests__/print/DurableAgent.test.ts"],"sourcesContent":["import { describe, expect, it } from \"vitest\";\n\ndescribe(\"durable-agent public domain\", () => {\n it(\"exports a classified busy error without exposing prompt data\", async () => {\n const api = (await import(\"../../index.js\")) as Record<string, unknown>;\n\n expect(api).toHaveProperty(\"DurableAgentBusyError\");\n const ErrorType = api.DurableAgentBusyError as new (\n agentId: string,\n name: string,\n ) => Error & {\n code: string;\n agentId: string;\n };\n const error = new ErrorType(\"agent-id\", \"reviewer\");\n\n expect(error).toMatchObject({\n name: \"DurableAgentBusyError\",\n code: \"DURABLE_AGENT_BUSY\",\n agentId: \"agent-id\",\n message: 'Durable agent \"reviewer\" is busy.',\n });\n });\n});\n"],"names":["describe","expect","it","api","toHaveProperty","ErrorType","DurableAgentBusyError","error","toMatchObject","name","code","agentId","message"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AAE9CF,SAAS,+BAA+B;IACtCE,GAAG,gEAAgE;QACjE,MAAMC,MAAO,MAAM,MAAM,CAAC;QAE1BF,OAAOE,KAAKC,cAAc,CAAC;QAC3B,MAAMC,YAAYF,IAAIG,qBAAqB;QAO3C,MAAMC,QAAQ,IAAIF,UAAU,YAAY;QAExCJ,OAAOM,OAAOC,aAAa,CAAC;YAC1BC,MAAM;YACNC,MAAM;YACNC,SAAS;YACTC,SAAS;QACX;IACF;AACF"}
@@ -1,9 +1,9 @@
1
- import fs from 'fs';
2
- import os from 'os';
3
- import path from 'path';
4
- import Database from 'better-sqlite3';
5
- import { afterEach, describe, expect, it } from 'vitest';
6
- import { DurableAgentRepository } from '../../durable/DurableAgentRepository.js';
1
+ import fs from "fs";
2
+ import os from "os";
3
+ import path from "path";
4
+ import Database from "better-sqlite3";
5
+ import { afterEach, describe, expect, it } from "vitest";
6
+ import { DurableAgentRepository } from "../../durable/DurableAgentRepository.js";
7
7
  const roots = [];
8
8
  afterEach(()=>{
9
9
  for (const root of roots.splice(0))fs.rmSync(root, {
@@ -12,22 +12,22 @@ afterEach(()=>{
12
12
  });
13
13
  });
14
14
  function fixture() {
15
- const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-sqlite-'));
15
+ const root = fs.mkdtempSync(path.join(os.tmpdir(), "durable-agent-sqlite-"));
16
16
  roots.push(root);
17
- const cwd = path.join(root, 'project');
17
+ const cwd = path.join(root, "project");
18
18
  fs.mkdirSync(cwd);
19
19
  return {
20
20
  root,
21
21
  cwd,
22
- dbPath: path.join(root, 'state', 'agents.db')
22
+ dbPath: path.join(root, "state", "agents.db")
23
23
  };
24
24
  }
25
- describe('DurableAgentRepository SQLite concurrency', ()=>{
26
- it('allows exactly one acquisition across two connections', async ()=>{
25
+ describe("DurableAgentRepository SQLite concurrency", ()=>{
26
+ it("allows exactly one acquisition across two connections", async ()=>{
27
27
  const { cwd, dbPath } = fixture();
28
28
  const identity = {
29
29
  pid: process.pid,
30
- startedAt: 'owner-start'
30
+ startedAt: "owner-start"
31
31
  };
32
32
  const processInspector = {
33
33
  getIdentity: (pid)=>pid === process.pid ? identity : null
@@ -41,22 +41,22 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
41
41
  processInspector
42
42
  });
43
43
  const agent = await first.create({
44
- name: 'race',
44
+ name: "race",
45
45
  cwd
46
46
  });
47
47
  const results = await Promise.allSettled([
48
48
  first.acquireRun(agent.id),
49
49
  second.acquireRun(agent.id)
50
50
  ]);
51
- expect(results.filter(({ status })=>status === 'fulfilled')).toHaveLength(1);
52
- const rejected = results.find(({ status })=>status === 'rejected');
51
+ expect(results.filter(({ status })=>status === "fulfilled")).toHaveLength(1);
52
+ const rejected = results.find(({ status })=>status === "rejected");
53
53
  expect(rejected).toMatchObject({
54
54
  reason: {
55
- code: 'DURABLE_AGENT_BUSY'
55
+ code: "DURABLE_AGENT_BUSY"
56
56
  }
57
57
  });
58
58
  });
59
- it('accepts deprecated lock options without creating lock artifacts', async ()=>{
59
+ it("accepts deprecated lock options without creating lock artifacts", async ()=>{
60
60
  const { root, cwd, dbPath } = fixture();
61
61
  const repository = new DurableAgentRepository({
62
62
  dbPath,
@@ -65,18 +65,18 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
65
65
  mutationLockStaleMs: 1
66
66
  });
67
67
  await repository.create({
68
- name: 'lockless',
68
+ name: "lockless",
69
69
  cwd
70
70
  });
71
71
  expect(fs.existsSync(`${dbPath}.lock`)).toBe(false);
72
- expect(fs.existsSync(path.join(root, 'state', 'durable-agent-locks'))).toBe(false);
72
+ expect(fs.existsSync(path.join(root, "state", "durable-agent-locks"))).toBe(false);
73
73
  });
74
- it('keeps readonly listing pure', async ()=>{
74
+ it("keeps readonly listing pure", async ()=>{
75
75
  const { cwd, dbPath } = fixture();
76
76
  const live = new Map([
77
77
  [
78
78
  process.pid,
79
- 'owner-start'
79
+ "owner-start"
80
80
  ]
81
81
  ]);
82
82
  const processInspector = {
@@ -93,7 +93,7 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
93
93
  processInspector
94
94
  });
95
95
  const agent = await writable.create({
96
- name: 'readonly',
96
+ name: "readonly",
97
97
  cwd
98
98
  });
99
99
  await writable.acquireRun(agent.id);
@@ -103,14 +103,14 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
103
103
  readonly: true,
104
104
  processInspector
105
105
  });
106
- expect((await readonly.list())[0]?.state).toBe('running');
106
+ expect((await readonly.list())[0]?.state).toBe("running");
107
107
  });
108
- it('rejects stale tokens and caps the persisted completion summary', async ()=>{
108
+ it("rejects stale tokens and caps the persisted completion summary", async ()=>{
109
109
  const { cwd, dbPath } = fixture();
110
110
  const processInspector = {
111
111
  getIdentity: (pid)=>({
112
112
  pid,
113
- startedAt: 'owner-start'
113
+ startedAt: "owner-start"
114
114
  })
115
115
  };
116
116
  const repository = new DurableAgentRepository({
@@ -118,25 +118,25 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
118
118
  processInspector
119
119
  });
120
120
  const agent = await repository.create({
121
- name: 'token',
121
+ name: "token",
122
122
  cwd
123
123
  });
124
124
  const run = await repository.acquireRun(agent.id);
125
- await expect(repository.recordProviderProcess(agent.id, 'stale', {
125
+ await expect(repository.recordProviderProcess(agent.id, "stale", {
126
126
  pid: 42,
127
- startedAt: 'provider'
127
+ startedAt: "provider"
128
128
  })).rejects.toMatchObject({
129
- code: 'DURABLE_AGENT_REPOSITORY'
129
+ code: "DURABLE_AGENT_REPOSITORY"
130
130
  });
131
131
  const completed = await repository.completeRun(agent.id, run.token, {
132
- status: 'succeeded',
132
+ status: "succeeded",
133
133
  exitCode: 0,
134
- summary: 'x'.repeat(5000),
135
- sessionHealth: 'healthy'
134
+ summary: "x".repeat(5000),
135
+ sessionHealth: "healthy"
136
136
  });
137
137
  expect(completed.lastResult?.summary).toHaveLength(4096);
138
138
  });
139
- it('does not reconcile over ownership changed after process inspection', async ()=>{
139
+ it("does not reconcile over ownership changed after process inspection", async ()=>{
140
140
  const { cwd, dbPath } = fixture();
141
141
  let inspect;
142
142
  const processInspector = {
@@ -144,7 +144,7 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
144
144
  if (inspect) inspect();
145
145
  return inspect ? null : {
146
146
  pid,
147
- startedAt: 'owner-start'
147
+ startedAt: "owner-start"
148
148
  };
149
149
  }
150
150
  };
@@ -153,7 +153,7 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
153
153
  processInspector
154
154
  });
155
155
  const agent = await repository.create({
156
- name: 'cas',
156
+ name: "cas",
157
157
  cwd
158
158
  });
159
159
  await repository.acquireRun(agent.id);
@@ -165,18 +165,18 @@ describe('DurableAgentRepository SQLite concurrency', ()=>{
165
165
  WHERE id = ?`).run(agent.id);
166
166
  };
167
167
  await repository.reconcile();
168
- expect(other.prepare('SELECT state, active_run_token FROM durable_agents WHERE id = ?').get(agent.id)).toEqual({
169
- state: 'running',
170
- active_run_token: 'replacement-token'
168
+ expect(other.prepare("SELECT state, active_run_token FROM durable_agents WHERE id = ?").get(agent.id)).toEqual({
169
+ state: "running",
170
+ active_run_token: "replacement-token"
171
171
  });
172
172
  other.close();
173
173
  });
174
- it('maps a corrupt database to a store error', ()=>{
174
+ it("maps a corrupt database to a store error", ()=>{
175
175
  const { dbPath } = fixture();
176
176
  fs.mkdirSync(path.dirname(dbPath), {
177
177
  recursive: true
178
178
  });
179
- fs.writeFileSync(dbPath, 'not sqlite');
179
+ fs.writeFileSync(dbPath, "not sqlite");
180
180
  expect(()=>new DurableAgentRepository({
181
181
  dbPath
182
182
  })).toThrow(/Cannot open durable-agent database/);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/__tests__/print/DurableAgentRepository.sqlite.test.ts"],"sourcesContent":["import fs from 'fs';\nimport os from 'os';\nimport path from 'path';\nimport Database from 'better-sqlite3';\nimport { afterEach, describe, expect, it } from 'vitest';\nimport { DurableAgentRepository } from '../../durable/DurableAgentRepository.js';\n\nconst roots: string[] = [];\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction fixture() {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), 'durable-agent-sqlite-'));\n roots.push(root);\n const cwd = path.join(root, 'project');\n fs.mkdirSync(cwd);\n return { root, cwd, dbPath: path.join(root, 'state', 'agents.db') };\n}\n\ndescribe('DurableAgentRepository SQLite concurrency', () => {\n it('allows exactly one acquisition across two connections', async () => {\n const { cwd, dbPath } = fixture();\n const identity = { pid: process.pid, startedAt: 'owner-start' };\n const processInspector = { getIdentity: (pid: number) => pid === process.pid ? identity : null };\n const first = new DurableAgentRepository({ dbPath, processInspector });\n const second = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await first.create({ name: 'race', cwd });\n const results = await Promise.allSettled([first.acquireRun(agent.id), second.acquireRun(agent.id)]);\n expect(results.filter(({ status }) => status === 'fulfilled')).toHaveLength(1);\n const rejected = results.find(({ status }) => status === 'rejected');\n expect(rejected).toMatchObject({ reason: { code: 'DURABLE_AGENT_BUSY' } });\n });\n\n it('accepts deprecated lock options without creating lock artifacts', async () => {\n const { root, cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({\n dbPath, lockTimeoutMs: 1, incompleteLockGraceMs: 1, mutationLockStaleMs: 1,\n });\n await repository.create({ name: 'lockless', cwd });\n expect(fs.existsSync(`${dbPath}.lock`)).toBe(false);\n expect(fs.existsSync(path.join(root, 'state', 'durable-agent-locks'))).toBe(false);\n });\n\n it('keeps readonly listing pure', async () => {\n const { cwd, dbPath } = fixture();\n const live = new Map([[process.pid, 'owner-start']]);\n const processInspector = { getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n } };\n const writable = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await writable.create({ name: 'readonly', cwd });\n await writable.acquireRun(agent.id);\n live.clear();\n const readonly = new DurableAgentRepository({ dbPath, readonly: true, processInspector });\n expect((await readonly.list())[0]?.state).toBe('running');\n });\n\n it('rejects stale tokens and caps the persisted completion summary', async () => {\n const { cwd, dbPath } = fixture();\n const processInspector = { getIdentity: (pid: number) => ({ pid, startedAt: 'owner-start' }) };\n const repository = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await repository.create({ name: 'token', cwd });\n const run = await repository.acquireRun(agent.id);\n await expect(repository.recordProviderProcess(agent.id, 'stale', { pid: 42, startedAt: 'provider' }))\n .rejects.toMatchObject({ code: 'DURABLE_AGENT_REPOSITORY' });\n const completed = await repository.completeRun(agent.id, run.token, {\n status: 'succeeded', exitCode: 0, summary: 'x'.repeat(5000), sessionHealth: 'healthy',\n });\n expect(completed.lastResult?.summary).toHaveLength(4096);\n });\n\n it('does not reconcile over ownership changed after process inspection', async () => {\n const { cwd, dbPath } = fixture();\n let inspect: (() => void) | undefined;\n const processInspector = { getIdentity: (pid: number) => {\n if (inspect) inspect();\n return inspect ? null : { pid, startedAt: 'owner-start' };\n } };\n const repository = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await repository.create({ name: 'cas', cwd });\n await repository.acquireRun(agent.id);\n const other = new Database(dbPath);\n inspect = () => {\n inspect = undefined;\n other.prepare(`UPDATE durable_agents SET\n active_run_token = 'replacement-token', active_owner_started_at = 'replacement-owner'\n WHERE id = ?`).run(agent.id);\n };\n\n await repository.reconcile();\n\n expect(other.prepare('SELECT state, active_run_token FROM durable_agents WHERE id = ?').get(agent.id))\n .toEqual({ state: 'running', active_run_token: 'replacement-token' });\n other.close();\n });\n\n it('maps a corrupt database to a store error', () => {\n const { dbPath } = fixture();\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n fs.writeFileSync(dbPath, 'not sqlite');\n expect(() => new DurableAgentRepository({ dbPath })).toThrow(/Cannot open durable-agent database/);\n });\n});\n"],"names":["fs","os","path","Database","afterEach","describe","expect","it","DurableAgentRepository","roots","root","splice","rmSync","recursive","force","fixture","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","dbPath","identity","pid","process","startedAt","processInspector","getIdentity","first","second","agent","create","name","results","Promise","allSettled","acquireRun","id","filter","status","toHaveLength","rejected","find","toMatchObject","reason","code","repository","lockTimeoutMs","incompleteLockGraceMs","mutationLockStaleMs","existsSync","toBe","live","Map","get","writable","clear","readonly","list","state","run","recordProviderProcess","rejects","completed","completeRun","token","exitCode","summary","repeat","sessionHealth","lastResult","inspect","other","undefined","prepare","reconcile","toEqual","active_run_token","close","dirname","writeFileSync","toThrow"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/__tests__/print/DurableAgentRepository.sqlite.test.ts"],"sourcesContent":["import fs from \"fs\";\nimport os from \"os\";\nimport path from \"path\";\nimport Database from \"better-sqlite3\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { DurableAgentRepository } from \"../../durable/DurableAgentRepository.js\";\n\nconst roots: string[] = [];\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction fixture() {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"durable-agent-sqlite-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n return { root, cwd, dbPath: path.join(root, \"state\", \"agents.db\") };\n}\n\ndescribe(\"DurableAgentRepository SQLite concurrency\", () => {\n it(\"allows exactly one acquisition across two connections\", async () => {\n const { cwd, dbPath } = fixture();\n const identity = { pid: process.pid, startedAt: \"owner-start\" };\n const processInspector = {\n getIdentity: (pid: number) => (pid === process.pid ? identity : null),\n };\n const first = new DurableAgentRepository({ dbPath, processInspector });\n const second = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await first.create({ name: \"race\", cwd });\n const results = await Promise.allSettled([\n first.acquireRun(agent.id),\n second.acquireRun(agent.id),\n ]);\n expect(results.filter(({ status }) => status === \"fulfilled\")).toHaveLength(1);\n const rejected = results.find(({ status }) => status === \"rejected\");\n expect(rejected).toMatchObject({ reason: { code: \"DURABLE_AGENT_BUSY\" } });\n });\n\n it(\"accepts deprecated lock options without creating lock artifacts\", async () => {\n const { root, cwd, dbPath } = fixture();\n const repository = new DurableAgentRepository({\n dbPath,\n lockTimeoutMs: 1,\n incompleteLockGraceMs: 1,\n mutationLockStaleMs: 1,\n });\n await repository.create({ name: \"lockless\", cwd });\n expect(fs.existsSync(`${dbPath}.lock`)).toBe(false);\n expect(fs.existsSync(path.join(root, \"state\", \"durable-agent-locks\"))).toBe(false);\n });\n\n it(\"keeps readonly listing pure\", async () => {\n const { cwd, dbPath } = fixture();\n const live = new Map([[process.pid, \"owner-start\"]]);\n const processInspector = {\n getIdentity: (pid: number) => {\n const startedAt = live.get(pid);\n return startedAt ? { pid, startedAt } : null;\n },\n };\n const writable = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await writable.create({ name: \"readonly\", cwd });\n await writable.acquireRun(agent.id);\n live.clear();\n const readonly = new DurableAgentRepository({ dbPath, readonly: true, processInspector });\n expect((await readonly.list())[0]?.state).toBe(\"running\");\n });\n\n it(\"rejects stale tokens and caps the persisted completion summary\", async () => {\n const { cwd, dbPath } = fixture();\n const processInspector = { getIdentity: (pid: number) => ({ pid, startedAt: \"owner-start\" }) };\n const repository = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await repository.create({ name: \"token\", cwd });\n const run = await repository.acquireRun(agent.id);\n await expect(\n repository.recordProviderProcess(agent.id, \"stale\", { pid: 42, startedAt: \"provider\" }),\n ).rejects.toMatchObject({ code: \"DURABLE_AGENT_REPOSITORY\" });\n const completed = await repository.completeRun(agent.id, run.token, {\n status: \"succeeded\",\n exitCode: 0,\n summary: \"x\".repeat(5000),\n sessionHealth: \"healthy\",\n });\n expect(completed.lastResult?.summary).toHaveLength(4096);\n });\n\n it(\"does not reconcile over ownership changed after process inspection\", async () => {\n const { cwd, dbPath } = fixture();\n let inspect: (() => void) | undefined;\n const processInspector = {\n getIdentity: (pid: number) => {\n if (inspect) inspect();\n return inspect ? null : { pid, startedAt: \"owner-start\" };\n },\n };\n const repository = new DurableAgentRepository({ dbPath, processInspector });\n const agent = await repository.create({ name: \"cas\", cwd });\n await repository.acquireRun(agent.id);\n const other = new Database(dbPath);\n inspect = () => {\n inspect = undefined;\n other\n .prepare(`UPDATE durable_agents SET\n active_run_token = 'replacement-token', active_owner_started_at = 'replacement-owner'\n WHERE id = ?`)\n .run(agent.id);\n };\n\n await repository.reconcile();\n\n expect(\n other\n .prepare(\"SELECT state, active_run_token FROM durable_agents WHERE id = ?\")\n .get(agent.id),\n ).toEqual({ state: \"running\", active_run_token: \"replacement-token\" });\n other.close();\n });\n\n it(\"maps a corrupt database to a store error\", () => {\n const { dbPath } = fixture();\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n fs.writeFileSync(dbPath, \"not sqlite\");\n expect(() => new DurableAgentRepository({ dbPath })).toThrow(\n /Cannot open durable-agent database/,\n );\n });\n});\n"],"names":["fs","os","path","Database","afterEach","describe","expect","it","DurableAgentRepository","roots","root","splice","rmSync","recursive","force","fixture","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","dbPath","identity","pid","process","startedAt","processInspector","getIdentity","first","second","agent","create","name","results","Promise","allSettled","acquireRun","id","filter","status","toHaveLength","rejected","find","toMatchObject","reason","code","repository","lockTimeoutMs","incompleteLockGraceMs","mutationLockStaleMs","existsSync","toBe","live","Map","get","writable","clear","readonly","list","state","run","recordProviderProcess","rejects","completed","completeRun","token","exitCode","summary","repeat","sessionHealth","lastResult","inspect","other","undefined","prepare","reconcile","toEqual","active_run_token","close","dirname","writeFileSync","toThrow"],"mappings":"AAAA,OAAOA,QAAQ,KAAK;AACpB,OAAOC,QAAQ,KAAK;AACpB,OAAOC,UAAU,OAAO;AACxB,OAAOC,cAAc,iBAAiB;AACtC,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AACzD,SAASC,sBAAsB,QAAQ,0CAA0C;AAEjF,MAAMC,QAAkB,EAAE;AAC1BL,UAAU;IACR,KAAK,MAAMM,QAAQD,MAAME,MAAM,CAAC,GAAIX,GAAGY,MAAM,CAACF,MAAM;QAAEG,WAAW;QAAMC,OAAO;IAAK;AACrF;AAEA,SAASC;IACP,MAAML,OAAOV,GAAGgB,WAAW,CAACd,KAAKe,IAAI,CAAChB,GAAGiB,MAAM,IAAI;IACnDT,MAAMU,IAAI,CAACT;IACX,MAAMU,MAAMlB,KAAKe,IAAI,CAACP,MAAM;IAC5BV,GAAGqB,SAAS,CAACD;IACb,OAAO;QAAEV;QAAMU;QAAKE,QAAQpB,KAAKe,IAAI,CAACP,MAAM,SAAS;IAAa;AACpE;AAEAL,SAAS,6CAA6C;IACpDE,GAAG,yDAAyD;QAC1D,MAAM,EAAEa,GAAG,EAAEE,MAAM,EAAE,GAAGP;QACxB,MAAMQ,WAAW;YAAEC,KAAKC,QAAQD,GAAG;YAAEE,WAAW;QAAc;QAC9D,MAAMC,mBAAmB;YACvBC,aAAa,CAACJ,MAAiBA,QAAQC,QAAQD,GAAG,GAAGD,WAAW;QAClE;QACA,MAAMM,QAAQ,IAAIrB,uBAAuB;YAAEc;YAAQK;QAAiB;QACpE,MAAMG,SAAS,IAAItB,uBAAuB;YAAEc;YAAQK;QAAiB;QACrE,MAAMI,QAAQ,MAAMF,MAAMG,MAAM,CAAC;YAAEC,MAAM;YAAQb;QAAI;QACrD,MAAMc,UAAU,MAAMC,QAAQC,UAAU,CAAC;YACvCP,MAAMQ,UAAU,CAACN,MAAMO,EAAE;YACzBR,OAAOO,UAAU,CAACN,MAAMO,EAAE;SAC3B;QACDhC,OAAO4B,QAAQK,MAAM,CAAC,CAAC,EAAEC,MAAM,EAAE,GAAKA,WAAW,cAAcC,YAAY,CAAC;QAC5E,MAAMC,WAAWR,QAAQS,IAAI,CAAC,CAAC,EAAEH,MAAM,EAAE,GAAKA,WAAW;QACzDlC,OAAOoC,UAAUE,aAAa,CAAC;YAAEC,QAAQ;gBAAEC,MAAM;YAAqB;QAAE;IAC1E;IAEAvC,GAAG,mEAAmE;QACpE,MAAM,EAAEG,IAAI,EAAEU,GAAG,EAAEE,MAAM,EAAE,GAAGP;QAC9B,MAAMgC,aAAa,IAAIvC,uBAAuB;YAC5Cc;YACA0B,eAAe;YACfC,uBAAuB;YACvBC,qBAAqB;QACvB;QACA,MAAMH,WAAWf,MAAM,CAAC;YAAEC,MAAM;YAAYb;QAAI;QAChDd,OAAON,GAAGmD,UAAU,CAAC,GAAG7B,OAAO,KAAK,CAAC,GAAG8B,IAAI,CAAC;QAC7C9C,OAAON,GAAGmD,UAAU,CAACjD,KAAKe,IAAI,CAACP,MAAM,SAAS,yBAAyB0C,IAAI,CAAC;IAC9E;IAEA7C,GAAG,+BAA+B;QAChC,MAAM,EAAEa,GAAG,EAAEE,MAAM,EAAE,GAAGP;QACxB,MAAMsC,OAAO,IAAIC,IAAI;YAAC;gBAAC7B,QAAQD,GAAG;gBAAE;aAAc;SAAC;QACnD,MAAMG,mBAAmB;YACvBC,aAAa,CAACJ;gBACZ,MAAME,YAAY2B,KAAKE,GAAG,CAAC/B;gBAC3B,OAAOE,YAAY;oBAAEF;oBAAKE;gBAAU,IAAI;YAC1C;QACF;QACA,MAAM8B,WAAW,IAAIhD,uBAAuB;YAAEc;YAAQK;QAAiB;QACvE,MAAMI,QAAQ,MAAMyB,SAASxB,MAAM,CAAC;YAAEC,MAAM;YAAYb;QAAI;QAC5D,MAAMoC,SAASnB,UAAU,CAACN,MAAMO,EAAE;QAClCe,KAAKI,KAAK;QACV,MAAMC,WAAW,IAAIlD,uBAAuB;YAAEc;YAAQoC,UAAU;YAAM/B;QAAiB;QACvFrB,OAAO,AAAC,CAAA,MAAMoD,SAASC,IAAI,EAAC,CAAE,CAAC,EAAE,EAAEC,OAAOR,IAAI,CAAC;IACjD;IAEA7C,GAAG,kEAAkE;QACnE,MAAM,EAAEa,GAAG,EAAEE,MAAM,EAAE,GAAGP;QACxB,MAAMY,mBAAmB;YAAEC,aAAa,CAACJ,MAAiB,CAAA;oBAAEA;oBAAKE,WAAW;gBAAc,CAAA;QAAG;QAC7F,MAAMqB,aAAa,IAAIvC,uBAAuB;YAAEc;YAAQK;QAAiB;QACzE,MAAMI,QAAQ,MAAMgB,WAAWf,MAAM,CAAC;YAAEC,MAAM;YAASb;QAAI;QAC3D,MAAMyC,MAAM,MAAMd,WAAWV,UAAU,CAACN,MAAMO,EAAE;QAChD,MAAMhC,OACJyC,WAAWe,qBAAqB,CAAC/B,MAAMO,EAAE,EAAE,SAAS;YAAEd,KAAK;YAAIE,WAAW;QAAW,IACrFqC,OAAO,CAACnB,aAAa,CAAC;YAAEE,MAAM;QAA2B;QAC3D,MAAMkB,YAAY,MAAMjB,WAAWkB,WAAW,CAAClC,MAAMO,EAAE,EAAEuB,IAAIK,KAAK,EAAE;YAClE1B,QAAQ;YACR2B,UAAU;YACVC,SAAS,IAAIC,MAAM,CAAC;YACpBC,eAAe;QACjB;QACAhE,OAAO0D,UAAUO,UAAU,EAAEH,SAAS3B,YAAY,CAAC;IACrD;IAEAlC,GAAG,sEAAsE;QACvE,MAAM,EAAEa,GAAG,EAAEE,MAAM,EAAE,GAAGP;QACxB,IAAIyD;QACJ,MAAM7C,mBAAmB;YACvBC,aAAa,CAACJ;gBACZ,IAAIgD,SAASA;gBACb,OAAOA,UAAU,OAAO;oBAAEhD;oBAAKE,WAAW;gBAAc;YAC1D;QACF;QACA,MAAMqB,aAAa,IAAIvC,uBAAuB;YAAEc;YAAQK;QAAiB;QACzE,MAAMI,QAAQ,MAAMgB,WAAWf,MAAM,CAAC;YAAEC,MAAM;YAAOb;QAAI;QACzD,MAAM2B,WAAWV,UAAU,CAACN,MAAMO,EAAE;QACpC,MAAMmC,QAAQ,IAAItE,SAASmB;QAC3BkD,UAAU;YACRA,UAAUE;YACVD,MACGE,OAAO,CAAC,CAAC;;4BAEU,CAAC,EACpBd,GAAG,CAAC9B,MAAMO,EAAE;QACjB;QAEA,MAAMS,WAAW6B,SAAS;QAE1BtE,OACEmE,MACGE,OAAO,CAAC,mEACRpB,GAAG,CAACxB,MAAMO,EAAE,GACfuC,OAAO,CAAC;YAAEjB,OAAO;YAAWkB,kBAAkB;QAAoB;QACpEL,MAAMM,KAAK;IACb;IAEAxE,GAAG,4CAA4C;QAC7C,MAAM,EAAEe,MAAM,EAAE,GAAGP;QACnBf,GAAGqB,SAAS,CAACnB,KAAK8E,OAAO,CAAC1D,SAAS;YAAET,WAAW;QAAK;QACrDb,GAAGiF,aAAa,CAAC3D,QAAQ;QACzBhB,OAAO,IAAM,IAAIE,uBAAuB;gBAAEc;YAAO,IAAI4D,OAAO,CAC1D;IAEJ;AACF"}