@ai-devkit/agent-manager 0.32.0 → 0.33.1

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