@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,130 +1,176 @@
1
- import fs from 'fs';
2
- import { randomUUID } from 'crypto';
3
- import { DatabaseConnection, DEFAULT_AGENT_REGISTRY_DB_PATH } from '../database/index.js';
4
- import { AGENT_MODES, CodexPrintError, type DurableActiveRun, type DurableAgent, type DurableProvider, type ProcessIdentity, type DurableRunStatus, type DurableSessionHealth } from './DurableAgent.js';
5
- import { LocalProcessInspector, type ProcessInspector } from './process.js';
6
- import { isUuid } from './utils.js';
1
+ import fs from "fs";
2
+ import { randomUUID } from "crypto";
3
+ import { DatabaseConnection, DEFAULT_AGENT_REGISTRY_DB_PATH } from "../database/index.js";
7
4
  import {
8
- DurableAgentBusyError,
9
- DurableAgentNameConflictError,
10
- DurableAgentNotFoundError,
11
- DurableAgentRepositoryError,
12
- } from './DurableAgent.js';
5
+ AGENT_MODES,
6
+ CodexPrintError,
7
+ type DurableActiveRun,
8
+ type DurableAgent,
9
+ type DurableProvider,
10
+ type ProcessIdentity,
11
+ type DurableRunStatus,
12
+ type DurableSessionHealth,
13
+ } from "./DurableAgent.js";
14
+ import { LocalProcessInspector, type ProcessInspector } from "./process.js";
15
+ import { isUuid } from "./utils.js";
16
+ import {
17
+ DurableAgentBusyError,
18
+ DurableAgentNameConflictError,
19
+ DurableAgentNotFoundError,
20
+ DurableAgentRepositoryError,
21
+ } from "./DurableAgent.js";
13
22
 
14
23
  interface DurableAgentRow {
15
- id: string; name: string; provider: DurableProvider; mode: typeof AGENT_MODES.DURABLE; cwd: string; provider_session_id: string | null;
16
- state: DurableAgent['state']; session_health: DurableSessionHealth; created_at: string; updated_at: string;
17
- last_active_at: string | null; last_result_status: DurableRunStatus | null;
18
- last_result_completed_at: string | null; last_result_exit_code: number | null; last_result_summary: string | null;
19
- active_run_token: string | null; active_owner_pid: number | null; active_owner_started_at: string | null;
20
- active_provider_pid: number | null; active_provider_started_at: string | null; active_run_started_at: string | null;
24
+ id: string;
25
+ name: string;
26
+ provider: DurableProvider;
27
+ mode: typeof AGENT_MODES.DURABLE;
28
+ cwd: string;
29
+ provider_session_id: string | null;
30
+ state: DurableAgent["state"];
31
+ session_health: DurableSessionHealth;
32
+ created_at: string;
33
+ updated_at: string;
34
+ last_active_at: string | null;
35
+ last_result_status: DurableRunStatus | null;
36
+ last_result_completed_at: string | null;
37
+ last_result_exit_code: number | null;
38
+ last_result_summary: string | null;
39
+ active_run_token: string | null;
40
+ active_owner_pid: number | null;
41
+ active_owner_started_at: string | null;
42
+ active_provider_pid: number | null;
43
+ active_provider_started_at: string | null;
44
+ active_run_started_at: string | null;
21
45
  }
22
46
 
23
- export interface CreateDurableAgentInput { name: string; cwd: string; provider?: DurableProvider }
47
+ export interface CreateDurableAgentInput {
48
+ name: string;
49
+ cwd: string;
50
+ provider?: DurableProvider;
51
+ }
24
52
 
25
53
  export interface DurableAgentRepositoryOptions {
26
- dbPath?: string;
27
- readonly?: boolean;
28
- /** @deprecated SQLite busy_timeout replaces filesystem lock polling. */
29
- lockTimeoutMs?: number;
30
- now?: () => Date;
31
- processInspector?: ProcessInspector;
32
- /** @deprecated Active ownership is committed atomically. */
33
- incompleteLockGraceMs?: number;
34
- /** @deprecated SQLite transactions replace mutation lock directories. */
35
- mutationLockStaleMs?: number;
54
+ dbPath?: string;
55
+ readonly?: boolean;
56
+ /** @deprecated SQLite busy_timeout replaces filesystem lock polling. */
57
+ lockTimeoutMs?: number;
58
+ now?: () => Date;
59
+ processInspector?: ProcessInspector;
60
+ /** @deprecated Active ownership is committed atomically. */
61
+ incompleteLockGraceMs?: number;
62
+ /** @deprecated SQLite transactions replace mutation lock directories. */
63
+ mutationLockStaleMs?: number;
36
64
  }
37
65
 
38
- export { LocalProcessInspector } from './process.js';
39
- export type { ProcessInspector } from './process.js';
66
+ export { LocalProcessInspector } from "./process.js";
67
+ export type { ProcessInspector } from "./process.js";
40
68
  export interface DurableRunCompletion {
41
- status: DurableRunStatus; exitCode: number | null; summary: string; sessionHealth: DurableSessionHealth;
69
+ status: DurableRunStatus;
70
+ exitCode: number | null;
71
+ summary: string;
72
+ sessionHealth: DurableSessionHealth;
42
73
  }
43
74
 
44
75
  export class DurableAgentRepository {
45
- readonly dbPath: string;
46
- private readonly now: () => Date;
47
- private readonly processInspector: ProcessInspector;
48
- private readonly readonly: boolean;
49
- private readonly db: DatabaseConnection;
76
+ readonly dbPath: string;
77
+ private readonly now: () => Date;
78
+ private readonly processInspector: ProcessInspector;
79
+ private readonly readonly: boolean;
80
+ private readonly db: DatabaseConnection;
50
81
 
51
- constructor(options: DurableAgentRepositoryOptions = {}) {
52
- this.dbPath = options.dbPath ?? DEFAULT_AGENT_REGISTRY_DB_PATH;
53
- this.now = options.now ?? (() => new Date());
54
- this.processInspector = options.processInspector ?? new LocalProcessInspector();
55
- this.readonly = options.readonly ?? false;
56
- try {
57
- this.db = new DatabaseConnection({ dbPath: this.dbPath, readonly: this.readonly });
58
- } catch (error) {
59
- if (error instanceof DurableAgentRepositoryError) throw error;
60
- throw new DurableAgentRepositoryError(`Cannot open durable-agent database: ${(error as Error).message}`);
61
- }
82
+ constructor(options: DurableAgentRepositoryOptions = {}) {
83
+ this.dbPath = options.dbPath ?? DEFAULT_AGENT_REGISTRY_DB_PATH;
84
+ this.now = options.now ?? (() => new Date());
85
+ this.processInspector = options.processInspector ?? new LocalProcessInspector();
86
+ this.readonly = options.readonly ?? false;
87
+ try {
88
+ this.db = new DatabaseConnection({ dbPath: this.dbPath, readonly: this.readonly });
89
+ } catch (error) {
90
+ if (error instanceof DurableAgentRepositoryError) throw error;
91
+ throw new DurableAgentRepositoryError(
92
+ `Cannot open durable-agent database: ${(error as Error).message}`,
93
+ );
62
94
  }
95
+ }
63
96
 
64
- async create(input: CreateDurableAgentInput): Promise<DurableAgent> {
65
- this.assertWritable();
66
- const cwd = this.canonicalDirectory(input.cwd);
67
- const timestamp = this.now().toISOString();
68
- const id = randomUUID();
69
- const provider = input.provider ?? 'claude';
70
- let providerSessionId = provider === 'codex' ? null : randomUUID();
71
- while (providerSessionId === id) providerSessionId = randomUUID();
72
- try {
73
- this.db.execute(`INSERT INTO durable_agents (
97
+ async create(input: CreateDurableAgentInput): Promise<DurableAgent> {
98
+ this.assertWritable();
99
+ const cwd = this.canonicalDirectory(input.cwd);
100
+ const timestamp = this.now().toISOString();
101
+ const id = randomUUID();
102
+ const provider = input.provider ?? "claude";
103
+ let providerSessionId = provider === "codex" ? null : randomUUID();
104
+ while (providerSessionId === id) providerSessionId = randomUUID();
105
+ try {
106
+ this.db.execute(
107
+ `INSERT INTO durable_agents (
74
108
  id, name, provider, mode, cwd, provider_session_id, state, session_health, created_at, updated_at
75
109
  ) VALUES (?, ?, ?, ?, ?, ?, 'ready', 'uninitialized', ?, ?)`,
76
- [id, input.name, provider, AGENT_MODES.DURABLE, cwd, providerSessionId, timestamp, timestamp]);
77
- } catch (error) {
78
- if (/UNIQUE constraint failed: durable_agents\.name/i.test((error as Error).message)) {
79
- throw new DurableAgentNameConflictError(input.name);
80
- }
81
- throw this.storageError('Failed to create durable agent', error);
82
- }
83
- return this.requireById(id);
110
+ [
111
+ id,
112
+ input.name,
113
+ provider,
114
+ AGENT_MODES.DURABLE,
115
+ cwd,
116
+ providerSessionId,
117
+ timestamp,
118
+ timestamp,
119
+ ],
120
+ );
121
+ } catch (error) {
122
+ if (/UNIQUE constraint failed: durable_agents\.name/i.test((error as Error).message)) {
123
+ throw new DurableAgentNameConflictError(input.name);
124
+ }
125
+ throw this.storageError("Failed to create durable agent", error);
84
126
  }
127
+ return this.requireById(id);
128
+ }
85
129
 
86
- async list(): Promise<DurableAgent[]> {
87
- if (!this.readonly) await this.reconcile();
88
- return this.listRaw();
89
- }
130
+ async list(): Promise<DurableAgent[]> {
131
+ if (!this.readonly) await this.reconcile();
132
+ return this.listRaw();
133
+ }
90
134
 
91
- async getById(id: string): Promise<DurableAgent | null> {
92
- if (!this.readonly) await this.reconcile();
93
- return this.findById(id);
94
- }
135
+ async getById(id: string): Promise<DurableAgent | null> {
136
+ if (!this.readonly) await this.reconcile();
137
+ return this.findById(id);
138
+ }
95
139
 
96
- async resolve(reference: string): Promise<DurableAgent | DurableAgent[] | null> {
97
- const agents = await this.list();
98
- const byId = agents.find((agent) => agent.id === reference);
99
- if (byId) return byId;
100
- const matches = agents.filter((agent) => agent.name.toLowerCase() === reference.toLowerCase());
101
- return matches.length === 0 ? null : matches.length === 1 ? matches[0]! : matches;
102
- }
140
+ async resolve(reference: string): Promise<DurableAgent | DurableAgent[] | null> {
141
+ const agents = await this.list();
142
+ const byId = agents.find((agent) => agent.id === reference);
143
+ if (byId) return byId;
144
+ const matches = agents.filter((agent) => agent.name.toLowerCase() === reference.toLowerCase());
145
+ return matches.length === 0 ? null : matches.length === 1 ? matches[0]! : matches;
146
+ }
103
147
 
104
- async acquireRun(id: string): Promise<{ agent: DurableAgent; token: string }> {
105
- this.assertWritable();
106
- const snapshot = this.findById(id);
107
- if (!snapshot) throw new DurableAgentNotFoundError(id);
108
- this.validateBoundCwd(snapshot.cwd);
109
- const observed = snapshot.activeRun;
110
- const observedLive = observed ? this.isActive(observed) : false;
111
- if (observedLive) throw new DurableAgentBusyError(id, snapshot.name);
112
- const owner = this.processInspector.getIdentity(process.pid);
113
- if (!owner) throw new DurableAgentRepositoryError('Cannot determine the current process identity.');
114
- const token = randomUUID();
115
- const startedAt = this.now().toISOString();
116
- let recovered = false;
117
- try {
118
- this.immediate(() => {
119
- const current = this.findById(id);
120
- if (!current) throw new DurableAgentNotFoundError(id);
121
- if (current.state === 'running') {
122
- if (!observed || current.activeRun?.token !== observed.token || observedLive) {
123
- throw new DurableAgentBusyError(id, current.name);
124
- }
125
- recovered = true;
126
- }
127
- const changed = this.db.execute(`UPDATE durable_agents SET
148
+ async acquireRun(id: string): Promise<{ agent: DurableAgent; token: string }> {
149
+ this.assertWritable();
150
+ const snapshot = this.findById(id);
151
+ if (!snapshot) throw new DurableAgentNotFoundError(id);
152
+ this.validateBoundCwd(snapshot.cwd);
153
+ const observed = snapshot.activeRun;
154
+ const observedLive = observed ? this.isActive(observed) : false;
155
+ if (observedLive) throw new DurableAgentBusyError(id, snapshot.name);
156
+ const owner = this.processInspector.getIdentity(process.pid);
157
+ if (!owner)
158
+ throw new DurableAgentRepositoryError("Cannot determine the current process identity.");
159
+ const token = randomUUID();
160
+ const startedAt = this.now().toISOString();
161
+ let recovered = false;
162
+ try {
163
+ this.immediate(() => {
164
+ const current = this.findById(id);
165
+ if (!current) throw new DurableAgentNotFoundError(id);
166
+ if (current.state === "running") {
167
+ if (!observed || current.activeRun?.token !== observed.token || observedLive) {
168
+ throw new DurableAgentBusyError(id, current.name);
169
+ }
170
+ recovered = true;
171
+ }
172
+ const changed = this.db.execute(
173
+ `UPDATE durable_agents SET
128
174
  state = 'running', active_run_token = ?, active_owner_pid = ?, active_owner_started_at = ?,
129
175
  active_provider_pid = NULL, active_provider_started_at = NULL, active_run_started_at = ?, updated_at = ?,
130
176
  session_health = CASE WHEN state = 'running' THEN 'unknown' ELSE session_health END,
@@ -135,202 +181,305 @@ export class DurableAgentRepository {
135
181
  WHERE id = ? AND (state <> 'running' OR (
136
182
  active_run_token = ? AND active_owner_started_at = ? AND active_run_started_at = ?
137
183
  ))
138
- `, [token, owner.pid, owner.startedAt, startedAt, startedAt, startedAt, id,
139
- observed?.token ?? null, observed?.owner.startedAt ?? null, observed?.startedAt ?? null]);
140
- if (changed.changes !== 1) throw new DurableAgentBusyError(id, current.name);
141
- });
142
- } catch (error) {
143
- if (error instanceof DurableAgentBusyError || error instanceof DurableAgentNotFoundError) throw error;
144
- if (/busy|locked/i.test((error as Error).message)) throw new DurableAgentBusyError(id, snapshot.name);
145
- throw this.storageError('Failed to acquire durable-agent run', error);
146
- }
147
- const agent = this.requireById(id);
148
- if (recovered && agent.lastResult?.status !== 'interrupted') {
149
- throw new DurableAgentRepositoryError('Failed to record interrupted print run.');
150
- }
151
- return { agent, token };
184
+ `,
185
+ [
186
+ token,
187
+ owner.pid,
188
+ owner.startedAt,
189
+ startedAt,
190
+ startedAt,
191
+ startedAt,
192
+ id,
193
+ observed?.token ?? null,
194
+ observed?.owner.startedAt ?? null,
195
+ observed?.startedAt ?? null,
196
+ ],
197
+ );
198
+ if (changed.changes !== 1) throw new DurableAgentBusyError(id, current.name);
199
+ });
200
+ } catch (error) {
201
+ if (error instanceof DurableAgentBusyError || error instanceof DurableAgentNotFoundError)
202
+ throw error;
203
+ if (/busy|locked/i.test((error as Error).message))
204
+ throw new DurableAgentBusyError(id, snapshot.name);
205
+ throw this.storageError("Failed to acquire durable-agent run", error);
152
206
  }
207
+ const agent = this.requireById(id);
208
+ if (recovered && agent.lastResult?.status !== "interrupted") {
209
+ throw new DurableAgentRepositoryError("Failed to record interrupted print run.");
210
+ }
211
+ return { agent, token };
212
+ }
153
213
 
154
- async recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void> {
155
- this.assertWritable();
156
- const changed = this.db.execute(`UPDATE durable_agents SET
214
+ async recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void> {
215
+ this.assertWritable();
216
+ const changed = this.db.execute(
217
+ `UPDATE durable_agents SET
157
218
  active_provider_pid = ?, active_provider_started_at = ?, updated_at = ?
158
219
  WHERE id = ? AND state = 'running' AND active_run_token = ?`,
159
- [identity.pid, identity.startedAt, this.now().toISOString(), id, token]);
160
- if (changed.changes !== 1) throw new DurableAgentRepositoryError('Print run ownership changed.');
161
- }
220
+ [identity.pid, identity.startedAt, this.now().toISOString(), id, token],
221
+ );
222
+ if (changed.changes !== 1)
223
+ throw new DurableAgentRepositoryError("Print run ownership changed.");
224
+ }
162
225
 
163
- async bindProviderSession(id: string, token: string, providerSessionId: string): Promise<DurableAgent> {
164
- this.assertWritable();
165
- if (!isUuid(providerSessionId)) {
166
- throw new DurableAgentRepositoryError('Invalid provider session id.');
226
+ async bindProviderSession(
227
+ id: string,
228
+ token: string,
229
+ providerSessionId: string,
230
+ ): Promise<DurableAgent> {
231
+ this.assertWritable();
232
+ if (!isUuid(providerSessionId)) {
233
+ throw new DurableAgentRepositoryError("Invalid provider session id.");
234
+ }
235
+ try {
236
+ this.immediate(() => {
237
+ const agent = this.findById(id);
238
+ if (!agent) throw new DurableAgentNotFoundError(id);
239
+ if (agent.provider !== "codex") {
240
+ throw new DurableAgentRepositoryError(
241
+ "Only Codex durable sessions can be bound after creation.",
242
+ );
167
243
  }
168
- try {
169
- this.immediate(() => {
170
- const agent = this.findById(id);
171
- if (!agent) throw new DurableAgentNotFoundError(id);
172
- if (agent.provider !== 'codex') {
173
- throw new DurableAgentRepositoryError('Only Codex durable sessions can be bound after creation.');
174
- }
175
- if (agent.activeRun?.token !== token) {
176
- throw new DurableAgentRepositoryError('Print run ownership changed.');
177
- }
178
- if (agent.providerSessionId !== null && agent.providerSessionId !== providerSessionId) {
179
- throw new CodexPrintError('Durable agent provider session identity does not match.', 'CODEX_SESSION_MISMATCH');
180
- }
181
- if (agent.providerSessionId === providerSessionId) return;
182
- const changed = this.db.execute(`UPDATE durable_agents SET provider_session_id = ?, updated_at = ?
244
+ if (agent.activeRun?.token !== token) {
245
+ throw new DurableAgentRepositoryError("Print run ownership changed.");
246
+ }
247
+ if (agent.providerSessionId !== null && agent.providerSessionId !== providerSessionId) {
248
+ throw new CodexPrintError(
249
+ "Durable agent provider session identity does not match.",
250
+ "CODEX_SESSION_MISMATCH",
251
+ );
252
+ }
253
+ if (agent.providerSessionId === providerSessionId) return;
254
+ const changed = this.db.execute(
255
+ `UPDATE durable_agents SET provider_session_id = ?, updated_at = ?
183
256
  WHERE id = ? AND provider = 'codex' AND state = 'running' AND active_run_token = ?
184
257
  AND provider_session_id IS NULL`,
185
- [providerSessionId, this.now().toISOString(), id, token]);
186
- if (changed.changes !== 1) throw new DurableAgentRepositoryError('Print run ownership changed.');
187
- });
188
- } catch (error) {
189
- if (error instanceof DurableAgentRepositoryError || error instanceof DurableAgentNotFoundError
190
- || error instanceof CodexPrintError) throw error;
191
- if (/UNIQUE constraint failed: durable_agents\.provider_session_id/i.test((error as Error).message)) {
192
- throw new CodexPrintError('Provider session is already bound to another durable agent.', 'CODEX_SESSION_MISMATCH');
193
- }
194
- throw this.storageError('Failed to bind durable-agent provider session', error);
195
- }
196
- return this.requireById(id);
258
+ [providerSessionId, this.now().toISOString(), id, token],
259
+ );
260
+ if (changed.changes !== 1)
261
+ throw new DurableAgentRepositoryError("Print run ownership changed.");
262
+ });
263
+ } catch (error) {
264
+ if (
265
+ error instanceof DurableAgentRepositoryError ||
266
+ error instanceof DurableAgentNotFoundError ||
267
+ error instanceof CodexPrintError
268
+ )
269
+ throw error;
270
+ if (
271
+ /UNIQUE constraint failed: durable_agents\.provider_session_id/i.test(
272
+ (error as Error).message,
273
+ )
274
+ ) {
275
+ throw new CodexPrintError(
276
+ "Provider session is already bound to another durable agent.",
277
+ "CODEX_SESSION_MISMATCH",
278
+ );
279
+ }
280
+ throw this.storageError("Failed to bind durable-agent provider session", error);
197
281
  }
282
+ return this.requireById(id);
283
+ }
198
284
 
199
- async completeRun(id: string, token: string, result: DurableRunCompletion): Promise<DurableAgent> {
200
- this.assertWritable();
201
- const completedAt = this.now().toISOString();
202
- const changed = this.db.execute(`UPDATE durable_agents SET
285
+ async completeRun(
286
+ id: string,
287
+ token: string,
288
+ result: DurableRunCompletion,
289
+ ): Promise<DurableAgent> {
290
+ this.assertWritable();
291
+ const completedAt = this.now().toISOString();
292
+ const changed = this.db.execute(
293
+ `UPDATE durable_agents SET
203
294
  state = ?, session_health = ?, active_run_token = NULL, active_owner_pid = NULL,
204
295
  active_owner_started_at = NULL, active_provider_pid = NULL, active_provider_started_at = NULL,
205
296
  active_run_started_at = NULL, last_active_at = ?, updated_at = ?, last_result_status = ?,
206
297
  last_result_completed_at = ?, last_result_exit_code = ?, last_result_summary = ?
207
- WHERE id = ? AND state = 'running' AND active_run_token = ?`, [
208
- result.status === 'succeeded' ? 'ready' : 'degraded', result.sessionHealth, completedAt, completedAt,
209
- result.status, completedAt, result.exitCode, result.summary.slice(0, 4096), id, token,
210
- ]);
211
- if (changed.changes !== 1) throw new DurableAgentRepositoryError('Print run ownership changed.');
212
- return this.requireById(id);
213
- }
298
+ WHERE id = ? AND state = 'running' AND active_run_token = ?`,
299
+ [
300
+ result.status === "succeeded" ? "ready" : "degraded",
301
+ result.sessionHealth,
302
+ completedAt,
303
+ completedAt,
304
+ result.status,
305
+ completedAt,
306
+ result.exitCode,
307
+ result.summary.slice(0, 4096),
308
+ id,
309
+ token,
310
+ ],
311
+ );
312
+ if (changed.changes !== 1)
313
+ throw new DurableAgentRepositoryError("Print run ownership changed.");
314
+ return this.requireById(id);
315
+ }
214
316
 
215
- async reconcile(): Promise<void> {
216
- this.assertWritable();
217
- const running = this.listRaw().filter((agent) => agent.state === 'running' && agent.activeRun);
218
- for (const snapshot of running) {
219
- if (this.isActive(snapshot.activeRun!)) continue;
220
- const completedAt = this.now().toISOString();
221
- this.db.execute(`UPDATE durable_agents SET
317
+ async reconcile(): Promise<void> {
318
+ this.assertWritable();
319
+ const running = this.listRaw().filter((agent) => agent.state === "running" && agent.activeRun);
320
+ for (const snapshot of running) {
321
+ if (this.isActive(snapshot.activeRun!)) continue;
322
+ const completedAt = this.now().toISOString();
323
+ this.db.execute(
324
+ `UPDATE durable_agents SET
222
325
  state = 'degraded', session_health = 'unknown', active_run_token = NULL,
223
326
  active_owner_pid = NULL, active_owner_started_at = NULL, active_provider_pid = NULL,
224
327
  active_provider_started_at = NULL, active_run_started_at = NULL, updated_at = ?, last_active_at = ?,
225
328
  last_result_status = 'interrupted', last_result_completed_at = ?, last_result_exit_code = NULL,
226
329
  last_result_summary = 'Previous print run was interrupted.'
227
330
  WHERE id = ? AND state = 'running' AND active_run_token = ?
228
- AND active_owner_started_at = ? AND active_run_started_at = ?`, [
229
- completedAt, completedAt, completedAt, snapshot.id, snapshot.activeRun!.token,
230
- snapshot.activeRun!.owner.startedAt, snapshot.activeRun!.startedAt,
231
- ]);
232
- }
331
+ AND active_owner_started_at = ? AND active_run_started_at = ?`,
332
+ [
333
+ completedAt,
334
+ completedAt,
335
+ completedAt,
336
+ snapshot.id,
337
+ snapshot.activeRun!.token,
338
+ snapshot.activeRun!.owner.startedAt,
339
+ snapshot.activeRun!.startedAt,
340
+ ],
341
+ );
233
342
  }
343
+ }
234
344
 
235
- private immediate<T>(operation: () => T): T {
236
- this.db.instance.exec('BEGIN IMMEDIATE');
237
- try {
238
- const result = operation();
239
- this.db.instance.exec('COMMIT');
240
- return result;
241
- } catch (error) {
242
- try { this.db.instance.exec('ROLLBACK'); } catch { /* retain original failure */ }
243
- throw error;
244
- }
345
+ private immediate<T>(operation: () => T): T {
346
+ this.db.instance.exec("BEGIN IMMEDIATE");
347
+ try {
348
+ const result = operation();
349
+ this.db.instance.exec("COMMIT");
350
+ return result;
351
+ } catch (error) {
352
+ try {
353
+ this.db.instance.exec("ROLLBACK");
354
+ } catch {
355
+ /* retain original failure */
356
+ }
357
+ throw error;
245
358
  }
359
+ }
246
360
 
247
- private listRaw(): DurableAgent[] {
248
- try {
249
- return this.db.query<DurableAgentRow>(
250
- 'SELECT * FROM durable_agents ORDER BY updated_at DESC, name COLLATE NOCASE',
251
- ).map((row) => this.fromRow(row));
252
- } catch (error) {
253
- throw this.storageError('Failed to read durable-agent database', error);
254
- }
361
+ private listRaw(): DurableAgent[] {
362
+ try {
363
+ return this.db
364
+ .query<DurableAgentRow>(
365
+ "SELECT * FROM durable_agents ORDER BY updated_at DESC, name COLLATE NOCASE",
366
+ )
367
+ .map((row) => this.fromRow(row));
368
+ } catch (error) {
369
+ throw this.storageError("Failed to read durable-agent database", error);
255
370
  }
371
+ }
256
372
 
257
- private findById(id: string): DurableAgent | null {
258
- const row = this.db.queryOne<DurableAgentRow>('SELECT * FROM durable_agents WHERE id = ?', [id]);
259
- return row ? this.fromRow(row) : null;
260
- }
373
+ private findById(id: string): DurableAgent | null {
374
+ const row = this.db.queryOne<DurableAgentRow>("SELECT * FROM durable_agents WHERE id = ?", [
375
+ id,
376
+ ]);
377
+ return row ? this.fromRow(row) : null;
378
+ }
261
379
 
262
- private requireById(id: string): DurableAgent {
263
- const agent = this.findById(id);
264
- if (!agent) throw new DurableAgentNotFoundError(id);
265
- return agent;
266
- }
380
+ private requireById(id: string): DurableAgent {
381
+ const agent = this.findById(id);
382
+ if (!agent) throw new DurableAgentNotFoundError(id);
383
+ return agent;
384
+ }
267
385
 
268
- private fromRow(row: DurableAgentRow): DurableAgent {
269
- if (!['claude', 'codex', 'pi'].includes(row.provider)
270
- || (row.provider !== 'codex' && row.provider_session_id === null)) {
271
- throw new DurableAgentRepositoryError(`Invalid durable-agent provider record: ${row.id}`);
272
- }
273
- const activeRun: DurableActiveRun | null = row.active_run_token === null ? null : {
386
+ private fromRow(row: DurableAgentRow): DurableAgent {
387
+ if (
388
+ !["claude", "codex", "pi"].includes(row.provider) ||
389
+ (row.provider !== "codex" && row.provider_session_id === null)
390
+ ) {
391
+ throw new DurableAgentRepositoryError(`Invalid durable-agent provider record: ${row.id}`);
392
+ }
393
+ const activeRun: DurableActiveRun | null =
394
+ row.active_run_token === null
395
+ ? null
396
+ : {
274
397
  token: row.active_run_token,
275
398
  owner: { pid: row.active_owner_pid!, startedAt: row.active_owner_started_at! },
276
- provider: row.active_provider_pid === null ? null : {
277
- pid: row.active_provider_pid, startedAt: row.active_provider_started_at!,
278
- },
399
+ provider:
400
+ row.active_provider_pid === null
401
+ ? null
402
+ : {
403
+ pid: row.active_provider_pid,
404
+ startedAt: row.active_provider_started_at!,
405
+ },
279
406
  startedAt: row.active_run_started_at!,
280
- };
281
- const base = {
282
- id: row.id, name: row.name, provider: row.provider, mode: row.mode, cwd: row.cwd,
283
- state: row.state, sessionHealth: row.session_health,
284
- createdAt: row.created_at, updatedAt: row.updated_at, lastActiveAt: row.last_active_at,
285
- lastResult: row.last_result_status === null ? null : {
286
- status: row.last_result_status, completedAt: row.last_result_completed_at!,
287
- exitCode: row.last_result_exit_code, summary: row.last_result_summary ?? '',
407
+ };
408
+ const base = {
409
+ id: row.id,
410
+ name: row.name,
411
+ provider: row.provider,
412
+ mode: row.mode,
413
+ cwd: row.cwd,
414
+ state: row.state,
415
+ sessionHealth: row.session_health,
416
+ createdAt: row.created_at,
417
+ updatedAt: row.updated_at,
418
+ lastActiveAt: row.last_active_at,
419
+ lastResult:
420
+ row.last_result_status === null
421
+ ? null
422
+ : {
423
+ status: row.last_result_status,
424
+ completedAt: row.last_result_completed_at!,
425
+ exitCode: row.last_result_exit_code,
426
+ summary: row.last_result_summary ?? "",
288
427
  },
289
- activeRun,
290
- };
291
- if (row.provider === 'claude') {
292
- return { ...base, provider: 'claude', providerSessionId: row.provider_session_id! };
293
- }
294
- if (row.provider === 'pi') {
295
- return { ...base, provider: 'pi', providerSessionId: row.provider_session_id! };
296
- }
297
- return { ...base, provider: 'codex', providerSessionId: row.provider_session_id };
428
+ activeRun,
429
+ };
430
+ if (row.provider === "claude") {
431
+ return { ...base, provider: "claude", providerSessionId: row.provider_session_id! };
298
432
  }
299
-
300
- private canonicalDirectory(input: string): string {
301
- try {
302
- const resolved = fs.realpathSync(input);
303
- if (!fs.statSync(resolved).isDirectory()) throw new Error('not a directory');
304
- return resolved;
305
- } catch {
306
- throw new DurableAgentRepositoryError(`Durable agent cwd is not an existing directory: ${input}`);
307
- }
433
+ if (row.provider === "pi") {
434
+ return { ...base, provider: "pi", providerSessionId: row.provider_session_id! };
308
435
  }
436
+ return { ...base, provider: "codex", providerSessionId: row.provider_session_id };
437
+ }
309
438
 
310
- private validateBoundCwd(bound: string): void {
311
- try {
312
- const stat = fs.lstatSync(bound);
313
- if (!stat.isDirectory() || stat.isSymbolicLink() || fs.realpathSync(bound) !== bound) throw new Error('binding changed');
314
- } catch {
315
- throw new DurableAgentRepositoryError(`Durable agent cwd binding is no longer safe: ${bound}`);
316
- }
439
+ private canonicalDirectory(input: string): string {
440
+ try {
441
+ const resolved = fs.realpathSync(input);
442
+ if (!fs.statSync(resolved).isDirectory()) throw new Error("not a directory");
443
+ return resolved;
444
+ } catch {
445
+ throw new DurableAgentRepositoryError(
446
+ `Durable agent cwd is not an existing directory: ${input}`,
447
+ );
317
448
  }
449
+ }
318
450
 
319
- private isActive(metadata: DurableActiveRun): boolean {
320
- return this.sameProcess(metadata.owner) || (metadata.provider !== null && this.sameProcess(metadata.provider));
451
+ private validateBoundCwd(bound: string): void {
452
+ try {
453
+ const stat = fs.lstatSync(bound);
454
+ if (!stat.isDirectory() || stat.isSymbolicLink() || fs.realpathSync(bound) !== bound)
455
+ throw new Error("binding changed");
456
+ } catch {
457
+ throw new DurableAgentRepositoryError(
458
+ `Durable agent cwd binding is no longer safe: ${bound}`,
459
+ );
321
460
  }
461
+ }
322
462
 
323
- private sameProcess(expected: ProcessIdentity): boolean {
324
- const actual = this.processInspector.getIdentity(expected.pid);
325
- return actual !== null && actual.startedAt === expected.startedAt;
326
- }
463
+ private isActive(metadata: DurableActiveRun): boolean {
464
+ return (
465
+ this.sameProcess(metadata.owner) ||
466
+ (metadata.provider !== null && this.sameProcess(metadata.provider))
467
+ );
468
+ }
327
469
 
328
- private assertWritable(): void {
329
- if (this.readonly) throw new DurableAgentRepositoryError('Durable-agent repository is readonly.');
330
- }
470
+ private sameProcess(expected: ProcessIdentity): boolean {
471
+ const actual = this.processInspector.getIdentity(expected.pid);
472
+ return actual !== null && actual.startedAt === expected.startedAt;
473
+ }
331
474
 
332
- private storageError(prefix: string, error: unknown): DurableAgentRepositoryError {
333
- return error instanceof DurableAgentRepositoryError ? error
334
- : new DurableAgentRepositoryError(`${prefix}: ${(error as Error).message}`);
335
- }
475
+ private assertWritable(): void {
476
+ if (this.readonly)
477
+ throw new DurableAgentRepositoryError("Durable-agent repository is readonly.");
478
+ }
479
+
480
+ private storageError(prefix: string, error: unknown): DurableAgentRepositoryError {
481
+ return error instanceof DurableAgentRepositoryError
482
+ ? error
483
+ : new DurableAgentRepositoryError(`${prefix}: ${(error as Error).message}`);
484
+ }
336
485
  }