@ai-devkit/agent-manager 0.32.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (519) hide show
  1. package/dist/AgentManager.d.ts +3 -3
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +80 -79
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +413 -388
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +642 -642
  8. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +1 -1
  9. package/dist/__tests__/adapters/CodexAdapter.test.js +322 -2321
  10. package/dist/__tests__/adapters/CodexAdapter.test.js.map +1 -1
  11. package/dist/__tests__/adapters/CopilotAdapter.test.js +254 -248
  12. package/dist/__tests__/adapters/CopilotAdapter.test.js.map +1 -1
  13. package/dist/__tests__/adapters/GeminiCliAdapter.test.js +564 -558
  14. package/dist/__tests__/adapters/GeminiCliAdapter.test.js.map +1 -1
  15. package/dist/__tests__/adapters/GrokCliAdapter.test.js +114 -114
  16. package/dist/__tests__/adapters/GrokCliAdapter.test.js.map +1 -1
  17. package/dist/__tests__/adapters/OpenCodeAdapter.test.js +169 -169
  18. package/dist/__tests__/adapters/OpenCodeAdapter.test.js.map +1 -1
  19. package/dist/__tests__/capacity/codex.test.js +93 -93
  20. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  21. package/dist/__tests__/capacity/index.test.js +17 -17
  22. package/dist/__tests__/capacity/index.test.js.map +1 -1
  23. package/dist/__tests__/durable/CodexCliProbe.test.js +60 -60
  24. package/dist/__tests__/durable/CodexCliProbe.test.js.map +1 -1
  25. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +28 -28
  26. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +1 -1
  27. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +30 -30
  28. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +1 -1
  29. package/dist/__tests__/durable/CodexPrintAgentService.test.js +71 -71
  30. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +1 -1
  31. package/dist/__tests__/durable/CodexPrintRunner.test.js +125 -125
  32. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +1 -1
  33. package/dist/__tests__/print/ClaudeCliProbe.test.js +20 -20
  34. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +1 -1
  35. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +20 -20
  36. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +1 -1
  37. package/dist/__tests__/print/ClaudePrintAgentService.test.js +58 -58
  38. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +1 -1
  39. package/dist/__tests__/print/ClaudePrintRunner.test.js +55 -55
  40. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +1 -1
  41. package/dist/__tests__/print/DurableAgent.test.js +9 -9
  42. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  43. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js +40 -40
  44. package/dist/__tests__/print/DurableAgentRepository.sqlite.test.js.map +1 -1
  45. package/dist/__tests__/print/DurableAgentRepository.test.js +66 -66
  46. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  47. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +34 -34
  48. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +1 -1
  49. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +132 -132
  50. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +1 -1
  51. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +194 -0
  52. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +1 -0
  53. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +86 -0
  54. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +1 -0
  55. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +254 -0
  56. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +1 -0
  57. package/dist/__tests__/providers/pi/PiAdapter.test.js +337 -0
  58. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +1 -0
  59. package/dist/__tests__/providers/pi/PiSessionParser.test.js +246 -0
  60. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +1 -0
  61. package/dist/__tests__/providers/pi/PiSessionTracker.test.js +108 -0
  62. package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +1 -0
  63. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +33 -33
  64. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +1 -1
  65. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js +16 -16
  66. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  67. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +52 -52
  68. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +1 -1
  69. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +44 -44
  70. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +1 -1
  71. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +126 -126
  72. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +1 -1
  73. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +14 -14
  74. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +1 -1
  75. package/dist/__tests__/readiness/AgentReadiness.test.js +134 -134
  76. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  77. package/dist/__tests__/runtime/AgentRuntime.test.js +13 -0
  78. package/dist/__tests__/runtime/AgentRuntime.test.js.map +1 -0
  79. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js +452 -0
  80. package/dist/__tests__/runtime/HerdrAgentRuntime.test.js.map +1 -0
  81. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +588 -0
  82. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -0
  83. package/dist/__tests__/terminal/TerminalFocusManager.test.js +100 -100
  84. package/dist/__tests__/terminal/TerminalFocusManager.test.js.map +1 -1
  85. package/dist/__tests__/terminal/TmuxManager.test.js +101 -101
  86. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  87. package/dist/__tests__/terminal/TtyWriter.test.js +185 -185
  88. package/dist/__tests__/terminal/TtyWriter.test.js.map +1 -1
  89. package/dist/__tests__/utils/AgentRegistry.test.js +335 -217
  90. package/dist/__tests__/utils/AgentRegistry.test.js.map +1 -1
  91. package/dist/__tests__/utils/ClaudeSessionParser.test.js +103 -101
  92. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/utils/agent-requests.test.js +43 -43
  94. package/dist/__tests__/utils/agent-requests.test.js.map +1 -1
  95. package/dist/__tests__/utils/agents.test.js +17 -17
  96. package/dist/__tests__/utils/agents.test.js.map +1 -1
  97. package/dist/__tests__/utils/matching.test.js +92 -92
  98. package/dist/__tests__/utils/matching.test.js.map +1 -1
  99. package/dist/__tests__/utils/process.test.js +108 -108
  100. package/dist/__tests__/utils/process.test.js.map +1 -1
  101. package/dist/__tests__/utils/session.test.js +53 -53
  102. package/dist/__tests__/utils/session.test.js.map +1 -1
  103. package/dist/adapters/AgentAdapter.d.ts +2 -2
  104. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  105. package/dist/adapters/AgentAdapter.js +1 -1
  106. package/dist/adapters/AgentAdapter.js.map +1 -1
  107. package/dist/adapters/CopilotAdapter.d.ts +2 -2
  108. package/dist/adapters/CopilotAdapter.d.ts.map +1 -1
  109. package/dist/adapters/CopilotAdapter.js +51 -51
  110. package/dist/adapters/CopilotAdapter.js.map +1 -1
  111. package/dist/adapters/GeminiCliAdapter.d.ts +2 -2
  112. package/dist/adapters/GeminiCliAdapter.d.ts.map +1 -1
  113. package/dist/adapters/GeminiCliAdapter.js +86 -86
  114. package/dist/adapters/GeminiCliAdapter.js.map +1 -1
  115. package/dist/adapters/GrokCliAdapter.d.ts +1 -1
  116. package/dist/adapters/GrokCliAdapter.d.ts.map +1 -1
  117. package/dist/adapters/GrokCliAdapter.js +80 -80
  118. package/dist/adapters/GrokCliAdapter.js.map +1 -1
  119. package/dist/adapters/OpenCodeAdapter.d.ts +1 -1
  120. package/dist/adapters/OpenCodeAdapter.d.ts.map +1 -1
  121. package/dist/adapters/OpenCodeAdapter.js +37 -36
  122. package/dist/adapters/OpenCodeAdapter.js.map +1 -1
  123. package/dist/adapters/index.d.ts +9 -9
  124. package/dist/adapters/index.d.ts.map +1 -1
  125. package/dist/adapters/index.js +8 -8
  126. package/dist/adapters/index.js.map +1 -1
  127. package/dist/capacity/codex.d.ts +3 -3
  128. package/dist/capacity/codex.d.ts.map +1 -1
  129. package/dist/capacity/codex.js +57 -57
  130. package/dist/capacity/codex.js.map +1 -1
  131. package/dist/capacity/index.d.ts +3 -3
  132. package/dist/capacity/index.d.ts.map +1 -1
  133. package/dist/capacity/index.js +8 -8
  134. package/dist/capacity/index.js.map +1 -1
  135. package/dist/capacity/types.d.ts +1 -1
  136. package/dist/capacity/types.js.map +1 -1
  137. package/dist/database/connection.d.ts +1 -1
  138. package/dist/database/connection.d.ts.map +1 -1
  139. package/dist/database/connection.js +15 -15
  140. package/dist/database/connection.js.map +1 -1
  141. package/dist/database/index.d.ts +3 -3
  142. package/dist/database/index.d.ts.map +1 -1
  143. package/dist/database/index.js +2 -2
  144. package/dist/database/index.js.map +1 -1
  145. package/dist/database/migrations/005_agent_runtime.sql +2 -0
  146. package/dist/database/schema.d.ts +1 -1
  147. package/dist/database/schema.d.ts.map +1 -1
  148. package/dist/database/schema.js +7 -7
  149. package/dist/database/schema.js.map +1 -1
  150. package/dist/durable/DurableAgent.d.ts +9 -9
  151. package/dist/durable/DurableAgent.d.ts.map +1 -1
  152. package/dist/durable/DurableAgent.js +16 -16
  153. package/dist/durable/DurableAgent.js.map +1 -1
  154. package/dist/durable/DurableAgentRepository.d.ts +4 -4
  155. package/dist/durable/DurableAgentRepository.d.ts.map +1 -1
  156. package/dist/durable/DurableAgentRepository.js +49 -48
  157. package/dist/durable/DurableAgentRepository.js.map +1 -1
  158. package/dist/durable/process.d.ts +1 -1
  159. package/dist/durable/process.d.ts.map +1 -1
  160. package/dist/durable/process.js +14 -14
  161. package/dist/durable/process.js.map +1 -1
  162. package/dist/durable/run.d.ts +2 -2
  163. package/dist/durable/run.d.ts.map +1 -1
  164. package/dist/durable/run.js +6 -6
  165. package/dist/durable/run.js.map +1 -1
  166. package/dist/durable/utils.d.ts +1 -1
  167. package/dist/durable/utils.d.ts.map +1 -1
  168. package/dist/durable/utils.js +4 -4
  169. package/dist/durable/utils.js.map +1 -1
  170. package/dist/index.d.ts +46 -43
  171. package/dist/index.d.ts.map +1 -1
  172. package/dist/index.js +27 -26
  173. package/dist/index.js.map +1 -1
  174. package/dist/providers/claude/ClaudeAgentMapper.d.ts +4 -4
  175. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +1 -1
  176. package/dist/providers/claude/ClaudeAgentMapper.js +10 -10
  177. package/dist/providers/claude/ClaudeAgentMapper.js.map +1 -1
  178. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +1 -1
  179. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +1 -1
  180. package/dist/providers/claude/ClaudeCodeAdapter.js +14 -14
  181. package/dist/providers/claude/ClaudeCodeAdapter.js.map +1 -1
  182. package/dist/providers/claude/ClaudeSessionLocator.d.ts +4 -4
  183. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +1 -1
  184. package/dist/providers/claude/ClaudeSessionLocator.js +79 -79
  185. package/dist/providers/claude/ClaudeSessionLocator.js.map +1 -1
  186. package/dist/providers/claude/ClaudeSessionParser.d.ts +2 -2
  187. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +1 -1
  188. package/dist/providers/claude/ClaudeSessionParser.js +99 -99
  189. package/dist/providers/claude/ClaudeSessionParser.js.map +1 -1
  190. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  191. package/dist/providers/claude/durable/ClaudeCliProbe.js +16 -16
  192. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +1 -1
  193. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts +5 -5
  194. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  195. package/dist/providers/claude/durable/ClaudePrintAgentService.js +10 -10
  196. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +1 -1
  197. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts +4 -4
  198. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  199. package/dist/providers/claude/durable/ClaudePrintRunner.js +18 -18
  200. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +1 -1
  201. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts +2 -2
  202. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  203. package/dist/providers/claude/durable/ClaudeStreamParser.js +17 -17
  204. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +1 -1
  205. package/dist/providers/codex/CodexAdapter.d.ts +27 -0
  206. package/dist/providers/codex/CodexAdapter.d.ts.map +1 -0
  207. package/dist/providers/codex/CodexAdapter.js +162 -0
  208. package/dist/providers/codex/CodexAdapter.js.map +1 -0
  209. package/dist/providers/codex/CodexAgentMapper.d.ts +9 -0
  210. package/dist/providers/codex/CodexAgentMapper.d.ts.map +1 -0
  211. package/dist/providers/codex/CodexAgentMapper.js +35 -0
  212. package/dist/providers/codex/CodexAgentMapper.js.map +1 -0
  213. package/dist/providers/codex/CodexSessionLocator.d.ts +44 -0
  214. package/dist/providers/codex/CodexSessionLocator.d.ts.map +1 -0
  215. package/dist/providers/codex/CodexSessionLocator.js +207 -0
  216. package/dist/providers/codex/CodexSessionLocator.js.map +1 -0
  217. package/dist/providers/codex/CodexSessionMapping.d.ts +23 -0
  218. package/dist/providers/codex/CodexSessionMapping.d.ts.map +1 -0
  219. package/dist/providers/codex/CodexSessionMapping.js +68 -0
  220. package/dist/providers/codex/CodexSessionMapping.js.map +1 -0
  221. package/dist/providers/codex/CodexSessionParser.d.ts +58 -0
  222. package/dist/providers/codex/CodexSessionParser.d.ts.map +1 -0
  223. package/dist/providers/codex/CodexSessionParser.js +262 -0
  224. package/dist/providers/codex/CodexSessionParser.js.map +1 -0
  225. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +1 -1
  226. package/dist/providers/codex/durable/CodexCliProbe.js +22 -22
  227. package/dist/providers/codex/durable/CodexCliProbe.js.map +1 -1
  228. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts +6 -6
  229. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  230. package/dist/providers/codex/durable/CodexPrintAgentService.js +10 -10
  231. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +1 -1
  232. package/dist/providers/codex/durable/CodexPrintRunner.d.ts +4 -4
  233. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  234. package/dist/providers/codex/durable/CodexPrintRunner.js +20 -20
  235. package/dist/providers/codex/durable/CodexPrintRunner.js.map +1 -1
  236. package/dist/providers/codex/durable/CodexStreamParser.d.ts +2 -2
  237. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +1 -1
  238. package/dist/providers/codex/durable/CodexStreamParser.js +21 -21
  239. package/dist/providers/codex/durable/CodexStreamParser.js.map +1 -1
  240. package/dist/providers/pi/PiAdapter.d.ts +28 -0
  241. package/dist/providers/pi/PiAdapter.d.ts.map +1 -0
  242. package/dist/providers/pi/PiAdapter.js +153 -0
  243. package/dist/providers/pi/PiAdapter.js.map +1 -0
  244. package/dist/providers/pi/PiAgentMapper.d.ts +9 -0
  245. package/dist/providers/pi/PiAgentMapper.d.ts.map +1 -0
  246. package/dist/providers/pi/PiAgentMapper.js +37 -0
  247. package/dist/providers/pi/PiAgentMapper.js.map +1 -0
  248. package/dist/providers/pi/PiSessionLocator.d.ts +23 -0
  249. package/dist/providers/pi/PiSessionLocator.d.ts.map +1 -0
  250. package/dist/providers/pi/PiSessionLocator.js +79 -0
  251. package/dist/providers/pi/PiSessionLocator.js.map +1 -0
  252. package/dist/providers/pi/PiSessionParser.d.ts +36 -0
  253. package/dist/providers/pi/PiSessionParser.d.ts.map +1 -0
  254. package/dist/providers/pi/PiSessionParser.js +191 -0
  255. package/dist/providers/pi/PiSessionParser.js.map +1 -0
  256. package/dist/providers/pi/PiSessionTracker.d.ts +23 -0
  257. package/dist/providers/pi/PiSessionTracker.d.ts.map +1 -0
  258. package/dist/providers/pi/PiSessionTracker.js +69 -0
  259. package/dist/providers/pi/PiSessionTracker.js.map +1 -0
  260. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +1 -1
  261. package/dist/providers/pi/durable/PiCliProbe.js +15 -15
  262. package/dist/providers/pi/durable/PiCliProbe.js.map +1 -1
  263. package/dist/providers/pi/durable/PiPrintAgentService.d.ts +6 -6
  264. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  265. package/dist/providers/pi/durable/PiPrintAgentService.js +10 -10
  266. package/dist/providers/pi/durable/PiPrintAgentService.js.map +1 -1
  267. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  268. package/dist/providers/pi/durable/PiPrintProtocol.js +18 -18
  269. package/dist/providers/pi/durable/PiPrintProtocol.js.map +1 -1
  270. package/dist/providers/pi/durable/PiPrintRunner.d.ts +4 -4
  271. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +1 -1
  272. package/dist/providers/pi/durable/PiPrintRunner.js +15 -15
  273. package/dist/providers/pi/durable/PiPrintRunner.js.map +1 -1
  274. package/dist/providers/pi/durable/PiStreamParser.d.ts +1 -1
  275. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +1 -1
  276. package/dist/providers/pi/durable/PiStreamParser.js +16 -16
  277. package/dist/providers/pi/durable/PiStreamParser.js.map +1 -1
  278. package/dist/readiness/AgentReadiness.d.ts +6 -6
  279. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  280. package/dist/readiness/AgentReadiness.js +130 -130
  281. package/dist/readiness/AgentReadiness.js.map +1 -1
  282. package/dist/runtime/ManagedAgentRuntime.d.ts +69 -0
  283. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -0
  284. package/dist/runtime/ManagedAgentRuntime.js +156 -0
  285. package/dist/runtime/ManagedAgentRuntime.js.map +1 -0
  286. package/dist/runtime/RuntimeFactory.d.ts +4 -0
  287. package/dist/runtime/RuntimeFactory.d.ts.map +1 -0
  288. package/dist/runtime/RuntimeFactory.js +11 -0
  289. package/dist/runtime/RuntimeFactory.js.map +1 -0
  290. package/dist/runtime/errors.d.ts +27 -0
  291. package/dist/runtime/errors.d.ts.map +1 -0
  292. package/dist/runtime/errors.js +42 -0
  293. package/dist/runtime/errors.js.map +1 -0
  294. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts +31 -0
  295. package/dist/runtime/herdr/HerdrAgentRuntime.d.ts.map +1 -0
  296. package/dist/runtime/herdr/HerdrAgentRuntime.js +184 -0
  297. package/dist/runtime/herdr/HerdrAgentRuntime.js.map +1 -0
  298. package/dist/runtime/herdr/HerdrCliClient.d.ts +13 -0
  299. package/dist/runtime/herdr/HerdrCliClient.d.ts.map +1 -0
  300. package/dist/runtime/herdr/HerdrCliClient.js +60 -0
  301. package/dist/runtime/herdr/HerdrCliClient.js.map +1 -0
  302. package/dist/runtime/herdr/HerdrErrors.d.ts +7 -0
  303. package/dist/runtime/herdr/HerdrErrors.d.ts.map +1 -0
  304. package/dist/runtime/herdr/HerdrErrors.js +10 -0
  305. package/dist/runtime/herdr/HerdrErrors.js.map +1 -0
  306. package/dist/runtime/herdr/HerdrResponseParsers.d.ts +14 -0
  307. package/dist/runtime/herdr/HerdrResponseParsers.d.ts.map +1 -0
  308. package/dist/runtime/herdr/HerdrResponseParsers.js +96 -0
  309. package/dist/runtime/herdr/HerdrResponseParsers.js.map +1 -0
  310. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts +9 -0
  311. package/dist/runtime/herdr/HerdrRuntimeRef.d.ts.map +1 -0
  312. package/dist/runtime/herdr/HerdrRuntimeRef.js +33 -0
  313. package/dist/runtime/herdr/HerdrRuntimeRef.js.map +1 -0
  314. package/dist/runtime/tmux/PidPolling.d.ts +5 -0
  315. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -0
  316. package/dist/runtime/tmux/PidPolling.js +24 -0
  317. package/dist/runtime/tmux/PidPolling.js.map +1 -0
  318. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +17 -0
  319. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -0
  320. package/dist/runtime/tmux/TmuxAgentRuntime.js +80 -0
  321. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -0
  322. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts +5 -0
  323. package/dist/runtime/tmux/TmuxRuntimeRef.d.ts.map +1 -0
  324. package/dist/runtime/tmux/TmuxRuntimeRef.js +9 -0
  325. package/dist/runtime/tmux/TmuxRuntimeRef.js.map +1 -0
  326. package/dist/runtime/types.d.ts +54 -0
  327. package/dist/runtime/types.d.ts.map +1 -0
  328. package/dist/runtime/types.js +3 -0
  329. package/dist/runtime/types.js.map +1 -0
  330. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  331. package/dist/terminal/TerminalFocusManager.js +50 -50
  332. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  333. package/dist/terminal/TmuxManager.d.ts.map +1 -1
  334. package/dist/terminal/TmuxManager.js +47 -47
  335. package/dist/terminal/TmuxManager.js.map +1 -1
  336. package/dist/terminal/TtyWriter.d.ts +1 -1
  337. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  338. package/dist/terminal/TtyWriter.js +89 -89
  339. package/dist/terminal/TtyWriter.js.map +1 -1
  340. package/dist/terminal/index.d.ts +4 -4
  341. package/dist/terminal/index.js +3 -3
  342. package/dist/terminal/index.js.map +1 -1
  343. package/dist/utils/AgentRegistry.d.ts +10 -2
  344. package/dist/utils/AgentRegistry.d.ts.map +1 -1
  345. package/dist/utils/AgentRegistry.js +57 -24
  346. package/dist/utils/AgentRegistry.js.map +1 -1
  347. package/dist/utils/agent-requests.d.ts.map +1 -1
  348. package/dist/utils/agent-requests.js +5 -5
  349. package/dist/utils/agent-requests.js.map +1 -1
  350. package/dist/utils/agents.d.ts +2 -2
  351. package/dist/utils/agents.d.ts.map +1 -1
  352. package/dist/utils/agents.js +15 -15
  353. package/dist/utils/agents.js.map +1 -1
  354. package/dist/utils/applescript.js +1 -1
  355. package/dist/utils/applescript.js.map +1 -1
  356. package/dist/utils/index.d.ts +6 -6
  357. package/dist/utils/index.d.ts.map +1 -1
  358. package/dist/utils/index.js +4 -4
  359. package/dist/utils/index.js.map +1 -1
  360. package/dist/utils/matching.d.ts +2 -2
  361. package/dist/utils/matching.d.ts.map +1 -1
  362. package/dist/utils/matching.js +4 -4
  363. package/dist/utils/matching.js.map +1 -1
  364. package/dist/utils/process.d.ts +1 -1
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +74 -74
  367. package/dist/utils/process.js.map +1 -1
  368. package/dist/utils/session.d.ts +1 -1
  369. package/dist/utils/session.d.ts.map +1 -1
  370. package/dist/utils/session.js +7 -7
  371. package/dist/utils/session.js.map +1 -1
  372. package/dist/utils/sortAgents.d.ts +2 -2
  373. package/dist/utils/sortAgents.d.ts.map +1 -1
  374. package/dist/utils/sortAgents.js +5 -5
  375. package/dist/utils/sortAgents.js.map +1 -1
  376. package/package.json +18 -19
  377. package/src/AgentManager.ts +283 -281
  378. package/src/__tests__/AgentManager.test.ts +917 -907
  379. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +1657 -1368
  380. package/src/__tests__/adapters/CodexAdapter.test.ts +365 -1698
  381. package/src/__tests__/adapters/CopilotAdapter.test.ts +576 -481
  382. package/src/__tests__/adapters/GeminiCliAdapter.test.ts +1189 -1157
  383. package/src/__tests__/adapters/GrokCliAdapter.test.ts +325 -272
  384. package/src/__tests__/adapters/OpenCodeAdapter.test.ts +510 -455
  385. package/src/__tests__/capacity/codex.test.ts +178 -91
  386. package/src/__tests__/capacity/index.test.ts +27 -18
  387. package/src/__tests__/durable/CodexCliProbe.test.ts +75 -53
  388. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +51 -40
  389. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +89 -64
  390. package/src/__tests__/durable/CodexPrintAgentService.test.ts +196 -118
  391. package/src/__tests__/durable/CodexPrintRunner.test.ts +282 -162
  392. package/src/__tests__/fixtures/fake-claude.cjs +20 -13
  393. package/src/__tests__/fixtures/fake-codex.cjs +41 -30
  394. package/src/__tests__/print/ClaudeCliProbe.test.ts +27 -21
  395. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +48 -40
  396. package/src/__tests__/print/ClaudePrintAgentService.test.ts +118 -67
  397. package/src/__tests__/print/ClaudePrintRunner.test.ts +136 -83
  398. package/src/__tests__/print/DurableAgent.test.ts +19 -16
  399. package/src/__tests__/print/DurableAgentRepository.sqlite.test.ts +109 -86
  400. package/src/__tests__/print/DurableAgentRepository.test.ts +170 -137
  401. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +65 -65
  402. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +400 -377
  403. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +182 -0
  404. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +63 -0
  405. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +192 -0
  406. package/src/__tests__/providers/pi/PiAdapter.test.ts +310 -0
  407. package/src/__tests__/providers/pi/PiSessionParser.test.ts +190 -0
  408. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +79 -0
  409. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +48 -32
  410. package/src/__tests__/providers/pi/durable/PiDurableAgentRepository.test.ts +24 -23
  411. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +131 -59
  412. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +66 -28
  413. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +236 -90
  414. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +20 -18
  415. package/src/__tests__/readiness/AgentReadiness.test.ts +217 -169
  416. package/src/__tests__/runtime/AgentRuntime.test.ts +8 -0
  417. package/src/__tests__/runtime/HerdrAgentRuntime.test.ts +358 -0
  418. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +555 -0
  419. package/src/__tests__/terminal/TerminalFocusManager.test.ts +254 -253
  420. package/src/__tests__/terminal/TmuxManager.test.ts +157 -157
  421. package/src/__tests__/terminal/TtyWriter.test.ts +423 -419
  422. package/src/__tests__/utils/AgentRegistry.test.ts +506 -402
  423. package/src/__tests__/utils/ClaudeSessionParser.test.ts +276 -242
  424. package/src/__tests__/utils/agent-requests.test.ts +76 -56
  425. package/src/__tests__/utils/agents.test.ts +20 -20
  426. package/src/__tests__/utils/matching.test.ts +206 -171
  427. package/src/__tests__/utils/process.test.ts +276 -262
  428. package/src/__tests__/utils/session.test.ts +133 -139
  429. package/src/adapters/AgentAdapter.ts +134 -126
  430. package/src/adapters/CopilotAdapter.ts +405 -395
  431. package/src/adapters/GeminiCliAdapter.ts +598 -600
  432. package/src/adapters/GrokCliAdapter.ts +353 -342
  433. package/src/adapters/OpenCodeAdapter.ts +285 -259
  434. package/src/adapters/index.ts +15 -9
  435. package/src/capacity/codex.ts +137 -84
  436. package/src/capacity/index.ts +18 -13
  437. package/src/capacity/types.ts +1 -1
  438. package/src/database/connection.ts +73 -68
  439. package/src/database/index.ts +6 -6
  440. package/src/database/migrations/005_agent_runtime.sql +2 -0
  441. package/src/database/schema.ts +40 -38
  442. package/src/durable/DurableAgent.ts +85 -85
  443. package/src/durable/DurableAgentRepository.ts +409 -260
  444. package/src/durable/process.ts +22 -21
  445. package/src/durable/run.ts +61 -51
  446. package/src/durable/utils.ts +46 -41
  447. package/src/index.ts +144 -103
  448. package/src/providers/claude/ClaudeAgentMapper.ts +51 -50
  449. package/src/providers/claude/ClaudeCodeAdapter.ts +144 -136
  450. package/src/providers/claude/ClaudeSessionLocator.ts +291 -293
  451. package/src/providers/claude/ClaudeSessionParser.ts +322 -338
  452. package/src/providers/claude/durable/ClaudeCliProbe.ts +42 -37
  453. package/src/providers/claude/durable/ClaudePrintAgentService.ts +63 -50
  454. package/src/providers/claude/durable/ClaudePrintRunner.ts +79 -69
  455. package/src/providers/claude/durable/ClaudeStreamParser.ts +91 -62
  456. package/src/providers/codex/CodexAdapter.ts +205 -0
  457. package/src/providers/codex/CodexAgentMapper.ts +35 -0
  458. package/src/providers/codex/CodexSessionLocator.ts +279 -0
  459. package/src/providers/codex/CodexSessionMapping.ts +89 -0
  460. package/src/providers/codex/CodexSessionParser.ts +385 -0
  461. package/src/providers/codex/durable/CodexCliProbe.ts +50 -42
  462. package/src/providers/codex/durable/CodexPrintAgentService.ts +63 -49
  463. package/src/providers/codex/durable/CodexPrintRunner.ts +79 -69
  464. package/src/providers/codex/durable/CodexStreamParser.ts +97 -84
  465. package/src/providers/pi/PiAdapter.ts +183 -0
  466. package/src/providers/pi/PiAgentMapper.ts +36 -0
  467. package/src/providers/pi/PiSessionLocator.ts +95 -0
  468. package/src/providers/pi/PiSessionParser.ts +284 -0
  469. package/src/providers/pi/PiSessionTracker.ts +87 -0
  470. package/src/providers/pi/durable/PiCliProbe.ts +42 -34
  471. package/src/providers/pi/durable/PiPrintAgentService.ts +61 -53
  472. package/src/providers/pi/durable/PiPrintProtocol.ts +31 -29
  473. package/src/providers/pi/durable/PiPrintRunner.ts +75 -68
  474. package/src/providers/pi/durable/PiStreamParser.ts +82 -72
  475. package/src/readiness/AgentReadiness.ts +585 -513
  476. package/src/runtime/ManagedAgentRuntime.ts +266 -0
  477. package/src/runtime/RuntimeFactory.ts +13 -0
  478. package/src/runtime/errors.ts +50 -0
  479. package/src/runtime/herdr/HerdrAgentRuntime.ts +190 -0
  480. package/src/runtime/herdr/HerdrCliClient.ts +78 -0
  481. package/src/runtime/herdr/HerdrErrors.ts +9 -0
  482. package/src/runtime/herdr/HerdrResponseParsers.ts +76 -0
  483. package/src/runtime/herdr/HerdrRuntimeRef.ts +41 -0
  484. package/src/runtime/tmux/PidPolling.ts +34 -0
  485. package/src/runtime/tmux/TmuxAgentRuntime.ts +113 -0
  486. package/src/runtime/tmux/TmuxRuntimeRef.ts +9 -0
  487. package/src/runtime/types.ts +56 -0
  488. package/src/terminal/TerminalFocusManager.ts +215 -212
  489. package/src/terminal/TmuxManager.ts +99 -92
  490. package/src/terminal/TtyWriter.ts +203 -194
  491. package/src/terminal/index.ts +4 -4
  492. package/src/utils/AgentRegistry.ts +299 -238
  493. package/src/utils/agent-requests.ts +16 -16
  494. package/src/utils/agents.ts +41 -38
  495. package/src/utils/applescript.ts +4 -4
  496. package/src/utils/index.ts +12 -6
  497. package/src/utils/matching.ts +43 -43
  498. package/src/utils/process.ts +261 -258
  499. package/src/utils/session.ts +66 -66
  500. package/src/utils/sortAgents.ts +35 -33
  501. package/tsconfig.json +2 -8
  502. package/vitest.config.ts +16 -16
  503. package/.eslintrc.json +0 -31
  504. package/dist/__tests__/adapters/PiAdapter.test.js +0 -618
  505. package/dist/__tests__/adapters/PiAdapter.test.js.map +0 -1
  506. package/dist/__tests__/database/DurableAgentsDatabase.test.js +0 -128
  507. package/dist/__tests__/database/DurableAgentsDatabase.test.js.map +0 -1
  508. package/dist/adapters/CodexAdapter.d.ts +0 -109
  509. package/dist/adapters/CodexAdapter.d.ts.map +0 -1
  510. package/dist/adapters/CodexAdapter.js +0 -710
  511. package/dist/adapters/CodexAdapter.js.map +0 -1
  512. package/dist/adapters/PiAdapter.d.ts +0 -63
  513. package/dist/adapters/PiAdapter.d.ts.map +0 -1
  514. package/dist/adapters/PiAdapter.js +0 -453
  515. package/dist/adapters/PiAdapter.js.map +0 -1
  516. package/src/__tests__/adapters/PiAdapter.test.ts +0 -458
  517. package/src/__tests__/database/DurableAgentsDatabase.test.ts +0 -102
  518. package/src/adapters/CodexAdapter.ts +0 -923
  519. package/src/adapters/PiAdapter.ts +0 -598
@@ -1,17 +1,21 @@
1
- import { spawn } from 'node:child_process';
2
- import { readFile } from 'node:fs/promises';
3
- import { join } from 'node:path';
4
- import type { CapacityReport, CapacityWindow } from './types.js';
1
+ import { spawn } from "node:child_process";
2
+ import { readFile } from "node:fs/promises";
3
+ import { join } from "node:path";
4
+ import type { CapacityReport, CapacityWindow } from "./types.js";
5
5
 
6
- type CodexUsageSource = 'pat' | 'oauth' | 'cli';
7
- type UsageSnapshot = { windows: CapacityWindow[]; creditsRemaining: number | null; source: CodexUsageSource };
6
+ type CodexUsageSource = "pat" | "oauth" | "cli";
7
+ type UsageSnapshot = {
8
+ windows: CapacityWindow[];
9
+ creditsRemaining: number | null;
10
+ source: CodexUsageSource;
11
+ };
8
12
 
9
13
  type UnknownRecord = Record<string, unknown>;
10
14
  type RpcMessage = { id?: number; method: string; params?: UnknownRecord };
11
15
  type CliResponses = { rateLimits: unknown; account: unknown };
12
16
  type CodexRpc = (messages: RpcMessage[]) => Promise<CliResponses>;
13
17
 
14
- export const CODEX_APP_SERVER_ARGS = ['-s', 'read-only', '-a', 'untrusted', 'app-server'] as const;
18
+ export const CODEX_APP_SERVER_ARGS = ["-s", "read-only", "-a", "untrusted", "app-server"] as const;
15
19
 
16
20
  type CodexProbeOptions = {
17
21
  installed: boolean;
@@ -25,23 +29,24 @@ type CodexProbeOptions = {
25
29
  };
26
30
 
27
31
  function record(value: unknown): UnknownRecord | null {
28
- return value !== null && typeof value === 'object' && !Array.isArray(value)
29
- ? value as UnknownRecord
32
+ return value !== null && typeof value === "object" && !Array.isArray(value)
33
+ ? (value as UnknownRecord)
30
34
  : null;
31
35
  }
32
36
 
33
37
  function finiteNumber(value: unknown): number | null {
34
- return typeof value === 'number' && Number.isFinite(value) ? value : null;
38
+ return typeof value === "number" && Number.isFinite(value) ? value : null;
35
39
  }
36
40
 
37
41
  function nonEmptyText(value: unknown): string | null {
38
- return typeof value === 'string' && value.length > 0 ? value : null;
42
+ return typeof value === "string" && value.length > 0 ? value : null;
39
43
  }
40
44
 
41
45
  function resetTime(value: unknown): string | null {
42
46
  const seconds = finiteNumber(value);
43
47
  if (seconds !== null) return new Date(seconds * 1000).toISOString();
44
- if (typeof value === 'string' && !Number.isNaN(Date.parse(value))) return new Date(value).toISOString();
48
+ if (typeof value === "string" && !Number.isNaN(Date.parse(value)))
49
+ return new Date(value).toISOString();
45
50
  return null;
46
51
  }
47
52
 
@@ -53,15 +58,11 @@ function safeIdentifier(value: unknown): string | null {
53
58
  }
54
59
 
55
60
  export function resolveCodexAuthPath(env: NodeJS.ProcessEnv = process.env): string {
56
- const root = env.CODEX_HOME || join(env.HOME || '', '.codex');
57
- return join(root, 'auth.json');
61
+ const root = env.CODEX_HOME || join(env.HOME || "", ".codex");
62
+ return join(root, "auth.json");
58
63
  }
59
64
 
60
- export function toRateWindow(
61
- value: unknown,
62
- id: string,
63
- label: string
64
- ): CapacityWindow | null {
65
+ export function toRateWindow(value: unknown, id: string, label: string): CapacityWindow | null {
65
66
  const input = record(value);
66
67
  if (!input) return null;
67
68
  const used = finiteNumber(input.used_percent);
@@ -71,7 +72,7 @@ export function toRateWindow(
71
72
  label,
72
73
  durationMinutes: seconds === null ? null : seconds / 60,
73
74
  usedPercent: used,
74
- resetsAt: resetTime(input.reset_at)
75
+ resetsAt: resetTime(input.reset_at),
75
76
  };
76
77
  }
77
78
 
@@ -84,23 +85,23 @@ function extraWindows(value: unknown): CapacityWindow[] {
84
85
  const windows = record(limit.rate_limit) ?? limit;
85
86
  return [
86
87
  toRateWindow(windows.primary_window, `${scope}:primary`, `${scope} primary`),
87
- toRateWindow(windows.secondary_window, `${scope}:secondary`, `${scope} secondary`)
88
+ toRateWindow(windows.secondary_window, `${scope}:secondary`, `${scope} secondary`),
88
89
  ].filter((window): window is CapacityWindow => window !== null);
89
90
  });
90
91
  }
91
92
 
92
- export function parseUsage(raw: unknown, source: 'pat' | 'oauth'): UsageSnapshot {
93
+ export function parseUsage(raw: unknown, source: "pat" | "oauth"): UsageSnapshot {
93
94
  const response = record(raw) ?? {};
94
95
  const limits = record(response.rate_limit) ?? {};
95
96
  const credits = record(response.credits) ?? {};
96
97
  return {
97
98
  windows: [
98
- toRateWindow(limits.primary_window, 'session', 'Session'),
99
- toRateWindow(limits.secondary_window, 'weekly', 'Weekly'),
100
- ...extraWindows(response.additional_rate_limits)
99
+ toRateWindow(limits.primary_window, "session", "Session"),
100
+ toRateWindow(limits.secondary_window, "weekly", "Weekly"),
101
+ ...extraWindows(response.additional_rate_limits),
101
102
  ].filter((window): window is CapacityWindow => window !== null),
102
103
  creditsRemaining: finiteNumber(credits.balance),
103
- source
104
+ source,
104
105
  };
105
106
  }
106
107
 
@@ -112,52 +113,58 @@ function cliWindow(value: unknown, id: string, label: string): CapacityWindow |
112
113
  label,
113
114
  durationMinutes: finiteNumber(input.windowDurationMins),
114
115
  usedPercent: finiteNumber(input.usedPercent),
115
- resetsAt: resetTime(input.resetsAt)
116
+ resetsAt: resetTime(input.resetsAt),
116
117
  };
117
118
  }
118
119
 
119
120
  function cliSnapshotWindows(value: unknown, fallbackId: string): CapacityWindow[] {
120
121
  const snapshot = record(value);
121
122
  if (!snapshot) return [];
122
- const scope = safeIdentifier(snapshot.limitId) ?? safeIdentifier(fallbackId) ?? 'codex';
123
+ const scope = safeIdentifier(snapshot.limitId) ?? safeIdentifier(fallbackId) ?? "codex";
123
124
  return [
124
125
  cliWindow(snapshot.primary, `${scope}:primary`, `${scope} primary`),
125
- cliWindow(snapshot.secondary, `${scope}:secondary`, `${scope} secondary`)
126
+ cliWindow(snapshot.secondary, `${scope}:secondary`, `${scope} secondary`),
126
127
  ].filter((item): item is CapacityWindow => item !== null);
127
128
  }
128
129
 
129
130
  export function parseCliUsage(raw: unknown): UsageSnapshot {
130
131
  const response = record(raw) ?? {};
131
132
  const primary = record(response.rateLimits);
132
- const windows = primary ? cliSnapshotWindows(primary, 'codex') : [];
133
+ const windows = primary ? cliSnapshotWindows(primary, "codex") : [];
133
134
  const buckets = record(response.rateLimitsByLimitId);
134
135
  if (buckets) {
135
- for (const [id, snapshot] of Object.entries(buckets)) windows.push(...cliSnapshotWindows(snapshot, id));
136
+ for (const [id, snapshot] of Object.entries(buckets))
137
+ windows.push(...cliSnapshotWindows(snapshot, id));
136
138
  }
137
- const unique = [...new Map(windows.map(window => [window.id, window])).values()];
138
- return { windows: unique, creditsRemaining: null, source: 'cli' };
139
+ const unique = [...new Map(windows.map((window) => [window.id, window])).values()];
140
+ return { windows: unique, creditsRemaining: null, source: "cli" };
139
141
  }
140
142
 
141
- function capacityFromSnapshot(snapshot: UsageSnapshot, context: CodexProbeOptions, raw?: unknown): CapacityReport {
142
- const hasUsage = snapshot.windows.some(window => window.usedPercent !== null);
143
+ function capacityFromSnapshot(
144
+ snapshot: UsageSnapshot,
145
+ context: CodexProbeOptions,
146
+ raw?: unknown,
147
+ ): CapacityReport {
148
+ const hasUsage = snapshot.windows.some((window) => window.usedPercent !== null);
143
149
  const rateLimits = record(record(raw)?.rateLimits);
144
150
  const reached = nonEmptyText(rateLimits?.rateLimitReachedType);
145
- const resetCredits = record(record(raw)?.rateLimitResetCredits) ?? record(record(raw)?.usageLimitResetCredits);
151
+ const resetCredits =
152
+ record(record(raw)?.rateLimitResetCredits) ?? record(record(raw)?.usageLimitResetCredits);
146
153
  return {
147
- provider: 'codex',
154
+ provider: "codex",
148
155
  generatedAt: context.checkedAt,
149
156
  authenticated: true,
150
- available: reached ? 'no' : hasUsage ? 'yes' : 'unknown',
157
+ available: reached ? "no" : hasUsage ? "yes" : "unknown",
151
158
  windows: snapshot.windows,
152
- creditsRemaining: snapshot.creditsRemaining ?? finiteNumber(resetCredits?.availableCount)
159
+ creditsRemaining: snapshot.creditsRemaining ?? finiteNumber(resetCredits?.availableCount),
153
160
  };
154
161
  }
155
162
 
156
163
  function jwtExpiry(token: string): number | null {
157
- const part = token.split('.')[1];
164
+ const part = token.split(".")[1];
158
165
  if (!part) return null;
159
166
  try {
160
- return finiteNumber(record(JSON.parse(Buffer.from(part, 'base64url').toString('utf8')))?.exp);
167
+ return finiteNumber(record(JSON.parse(Buffer.from(part, "base64url").toString("utf8")))?.exp);
161
168
  } catch {
162
169
  return null;
163
170
  }
@@ -166,7 +173,7 @@ function jwtExpiry(token: string): number | null {
166
173
  function staleOAuth(tokens: UnknownRecord, token: string, now: Date): boolean {
167
174
  const metadata = tokens.expires_at ?? tokens.expiresAt ?? tokens.expiry;
168
175
  let expiry: number | null = finiteNumber(metadata);
169
- if (typeof metadata === 'string') {
176
+ if (typeof metadata === "string") {
170
177
  const parsed = Date.parse(metadata);
171
178
  expiry = Number.isNaN(parsed) ? null : parsed / 1000;
172
179
  }
@@ -174,12 +181,17 @@ function staleOAuth(tokens: UnknownRecord, token: string, now: Date): boolean {
174
181
  return expiry !== null && expiry <= now.getTime() / 1000;
175
182
  }
176
183
 
177
- async function fetchJson(fetcher: typeof globalThis.fetch, url: string, init: RequestInit, timeoutMs: number): Promise<unknown> {
184
+ async function fetchJson(
185
+ fetcher: typeof globalThis.fetch,
186
+ url: string,
187
+ init: RequestInit,
188
+ timeoutMs: number,
189
+ ): Promise<unknown> {
178
190
  const controller = new AbortController();
179
191
  const timer = setTimeout(() => controller.abort(), timeoutMs);
180
192
  try {
181
193
  const response = await fetcher(url, { ...init, signal: controller.signal });
182
- if (!response.ok) throw new Error(response.status === 401 ? 'unauthorized' : 'request failed');
194
+ if (!response.ok) throw new Error(response.status === 401 ? "unauthorized" : "request failed");
183
195
  return await response.json();
184
196
  } finally {
185
197
  clearTimeout(timer);
@@ -189,23 +201,28 @@ async function fetchJson(fetcher: typeof globalThis.fetch, url: string, init: Re
189
201
  async function apiSnapshot(
190
202
  token: string,
191
203
  accountId: string,
192
- source: 'pat' | 'oauth',
193
- options: CodexProbeOptions
204
+ source: "pat" | "oauth",
205
+ options: CodexProbeOptions,
194
206
  ): Promise<UsageSnapshot> {
195
207
  const fetcher = options.fetch ?? globalThis.fetch;
196
- const raw = await fetchJson(fetcher, 'https://chatgpt.com/backend-api/wham/usage', {
197
- headers: { Authorization: `Bearer ${token}`, 'ChatGPT-Account-Id': accountId }
198
- }, options.timeoutMs ?? 5000);
208
+ const raw = await fetchJson(
209
+ fetcher,
210
+ "https://chatgpt.com/backend-api/wham/usage",
211
+ {
212
+ headers: { Authorization: `Bearer ${token}`, "ChatGPT-Account-Id": accountId },
213
+ },
214
+ options.timeoutMs ?? 5000,
215
+ );
199
216
  return parseUsage(raw, source);
200
217
  }
201
218
 
202
219
  function appServerRpc(messages: RpcMessage[], timeoutMs = 5000): Promise<CliResponses> {
203
220
  return new Promise((resolve, reject) => {
204
- const child = spawn('codex', CODEX_APP_SERVER_ARGS, {
205
- stdio: ['pipe', 'pipe', 'ignore']
221
+ const child = spawn("codex", CODEX_APP_SERVER_ARGS, {
222
+ stdio: ["pipe", "pipe", "ignore"],
206
223
  });
207
224
  const results: Partial<CliResponses> = {};
208
- let buffer = '';
225
+ let buffer = "";
209
226
  let settled = false;
210
227
  const finish = (error?: Error) => {
211
228
  if (settled) return;
@@ -215,30 +232,37 @@ function appServerRpc(messages: RpcMessage[], timeoutMs = 5000): Promise<CliResp
215
232
  if (error) reject(error);
216
233
  else resolve(results as CliResponses);
217
234
  };
218
- const timer = setTimeout(() => finish(new Error('codex probe timed out')), timeoutMs);
219
- child.once('error', () => finish(new Error('codex app-server unavailable')));
220
- child.once('exit', () => { if (!settled) finish(new Error('codex app-server exited')); });
221
- child.stdout.setEncoding('utf8');
222
- child.stdout.on('data', (chunk: string) => {
235
+ const timer = setTimeout(() => finish(new Error("codex probe timed out")), timeoutMs);
236
+ child.once("error", () => finish(new Error("codex app-server unavailable")));
237
+ child.once("exit", () => {
238
+ if (!settled) finish(new Error("codex app-server exited"));
239
+ });
240
+ child.stdout.setEncoding("utf8");
241
+ child.stdout.on("data", (chunk: string) => {
223
242
  buffer += chunk;
224
243
  for (;;) {
225
- const newline = buffer.indexOf('\n');
244
+ const newline = buffer.indexOf("\n");
226
245
  if (newline < 0) break;
227
246
  const line = buffer.slice(0, newline).trim();
228
247
  buffer = buffer.slice(newline + 1);
229
248
  if (!line) continue;
230
249
  let message: UnknownRecord;
231
- try { message = JSON.parse(line) as UnknownRecord; } catch { continue; }
250
+ try {
251
+ message = JSON.parse(line) as UnknownRecord;
252
+ } catch {
253
+ continue;
254
+ }
232
255
  if (message.id === 1) {
233
- for (const request of messages.slice(1)) child.stdin.write(`${JSON.stringify(request)}\n`);
256
+ for (const request of messages.slice(1))
257
+ child.stdin.write(`${JSON.stringify(request)}\n`);
234
258
  } else if (message.id === 2) {
235
- if (message.error) finish(new Error('codex rate-limit method failed'));
259
+ if (message.error) finish(new Error("codex rate-limit method failed"));
236
260
  else results.rateLimits = message.result;
237
261
  } else if (message.id === 3) {
238
- if (message.error) finish(new Error('codex account method failed'));
262
+ if (message.error) finish(new Error("codex account method failed"));
239
263
  else results.account = message.result;
240
264
  }
241
- if ('rateLimits' in results && 'account' in results) finish();
265
+ if ("rateLimits" in results && "account" in results) finish();
242
266
  }
243
267
  });
244
268
  child.stdin.write(`${JSON.stringify(messages[0])}\n`);
@@ -247,33 +271,46 @@ function appServerRpc(messages: RpcMessage[], timeoutMs = 5000): Promise<CliResp
247
271
 
248
272
  function unavailable(options: CodexProbeOptions): CapacityReport {
249
273
  return {
250
- provider: 'codex',
274
+ provider: "codex",
251
275
  generatedAt: options.checkedAt,
252
276
  authenticated: null,
253
- available: 'unknown',
277
+ available: "unknown",
254
278
  windows: [],
255
- creditsRemaining: null
279
+ creditsRemaining: null,
256
280
  };
257
281
  }
258
282
 
259
283
  async function cliFallback(options: CodexProbeOptions): Promise<CapacityReport> {
260
284
  if (!options.installed) return unavailable(options);
261
285
  const messages: RpcMessage[] = [
262
- { id: 1, method: 'initialize', params: {
263
- clientInfo: { name: 'ai-devkit', title: null, version: '1' }, capabilities: null
264
- } },
265
- { method: 'initialized' },
266
- { id: 2, method: 'account/rateLimits/read' },
267
- { id: 3, method: 'account/read' }
286
+ {
287
+ id: 1,
288
+ method: "initialize",
289
+ params: {
290
+ clientInfo: { name: "ai-devkit", title: null, version: "1" },
291
+ capabilities: null,
292
+ },
293
+ },
294
+ { method: "initialized" },
295
+ { id: 2, method: "account/rateLimits/read" },
296
+ { id: 3, method: "account/read" },
268
297
  ];
269
298
  try {
270
- const rpc = options.rpc ?? (requests => appServerRpc(requests, options.timeoutMs));
299
+ const rpc = options.rpc ?? ((requests) => appServerRpc(requests, options.timeoutMs));
271
300
  const response = await rpc(messages);
272
- const result = capacityFromSnapshot(parseCliUsage(response.rateLimits), options, response.rateLimits);
301
+ const result = capacityFromSnapshot(
302
+ parseCliUsage(response.rateLimits),
303
+ options,
304
+ response.rateLimits,
305
+ );
273
306
  const accountEnvelope = record(response.account);
274
- if (accountEnvelope && Object.hasOwn(accountEnvelope, 'account') && !record(accountEnvelope.account)) {
307
+ if (
308
+ accountEnvelope &&
309
+ Object.hasOwn(accountEnvelope, "account") &&
310
+ !record(accountEnvelope.account)
311
+ ) {
275
312
  result.authenticated = false;
276
- result.available = 'unknown';
313
+ result.available = "unknown";
277
314
  }
278
315
  return result;
279
316
  } catch {
@@ -284,7 +321,10 @@ async function cliFallback(options: CodexProbeOptions): Promise<CapacityReport>
284
321
  export async function probeCodexCapacity(options: CodexProbeOptions): Promise<CapacityReport> {
285
322
  let parsed: UnknownRecord | null = null;
286
323
  try {
287
- const contents = await (options.readFile ?? readFile)(resolveCodexAuthPath(options.env), 'utf8');
324
+ const contents = await (options.readFile ?? readFile)(
325
+ resolveCodexAuthPath(options.env),
326
+ "utf8",
327
+ );
288
328
  parsed = record(JSON.parse(contents));
289
329
  } catch {
290
330
  return cliFallback(options);
@@ -295,12 +335,17 @@ export async function probeCodexCapacity(options: CodexProbeOptions): Promise<Ca
295
335
  if (pat) {
296
336
  try {
297
337
  const fetcher = options.fetch ?? globalThis.fetch;
298
- const whoami = record(await fetchJson(fetcher,
299
- 'https://auth.openai.com/api/accounts/v1/user-auth-credential/whoami',
300
- { headers: { Authorization: `Bearer ${pat}` } }, options.timeoutMs ?? 5000));
338
+ const whoami = record(
339
+ await fetchJson(
340
+ fetcher,
341
+ "https://auth.openai.com/api/accounts/v1/user-auth-credential/whoami",
342
+ { headers: { Authorization: `Bearer ${pat}` } },
343
+ options.timeoutMs ?? 5000,
344
+ ),
345
+ );
301
346
  const accountId = nonEmptyText(whoami?.chatgpt_account_id);
302
- if (!accountId) throw new Error('account unavailable');
303
- return capacityFromSnapshot(await apiSnapshot(pat, accountId, 'pat', options), options);
347
+ if (!accountId) throw new Error("account unavailable");
348
+ return capacityFromSnapshot(await apiSnapshot(pat, accountId, "pat", options), options);
304
349
  } catch {
305
350
  // Continue to a separately available OAuth credential before using the CLI.
306
351
  }
@@ -309,9 +354,17 @@ export async function probeCodexCapacity(options: CodexProbeOptions): Promise<Ca
309
354
  const tokens = record(auth.tokens);
310
355
  const accessToken = nonEmptyText(tokens?.access_token);
311
356
  const accountId = nonEmptyText(tokens?.account_id);
312
- if (tokens && accessToken && accountId && !staleOAuth(tokens, accessToken, (options.now ?? (() => new Date()))())) {
357
+ if (
358
+ tokens &&
359
+ accessToken &&
360
+ accountId &&
361
+ !staleOAuth(tokens, accessToken, (options.now ?? (() => new Date()))())
362
+ ) {
313
363
  try {
314
- return capacityFromSnapshot(await apiSnapshot(accessToken, accountId, 'oauth', options), options);
364
+ return capacityFromSnapshot(
365
+ await apiSnapshot(accessToken, accountId, "oauth", options),
366
+ options,
367
+ );
315
368
  } catch {
316
369
  return cliFallback(options);
317
370
  }
@@ -1,10 +1,10 @@
1
- import { constants } from 'node:fs';
2
- import { access as fsAccess } from 'node:fs/promises';
3
- import path from 'node:path';
4
- import { probeCodexCapacity } from './codex.js';
5
- import type { CapacityReport } from './types.js';
1
+ import { constants } from "node:fs";
2
+ import { access as fsAccess } from "node:fs/promises";
3
+ import path from "node:path";
4
+ import { probeCodexCapacity } from "./codex.js";
5
+ import type { CapacityReport } from "./types.js";
6
6
 
7
- export type { CapacityReport, CapacityWindow } from './types.js';
7
+ export type { CapacityReport, CapacityWindow } from "./types.js";
8
8
 
9
9
  export type CapacityProbeOptions = {
10
10
  now?: () => Date;
@@ -22,10 +22,13 @@ async function canAccess(target: string, mode: number): Promise<boolean> {
22
22
  }
23
23
  }
24
24
 
25
- async function isCodexInstalled(pathValue: string, checkAccess?: (target: string) => Promise<void>): Promise<boolean> {
25
+ async function isCodexInstalled(
26
+ pathValue: string,
27
+ checkAccess?: (target: string) => Promise<void>,
28
+ ): Promise<boolean> {
26
29
  const directories = pathValue.split(path.delimiter).filter(Boolean);
27
30
  for (const directory of directories) {
28
- const executable = path.join(directory, 'codex');
31
+ const executable = path.join(directory, "codex");
29
32
  if (checkAccess) {
30
33
  try {
31
34
  await checkAccess(executable);
@@ -39,19 +42,21 @@ async function isCodexInstalled(pathValue: string, checkAccess?: (target: string
39
42
  return false;
40
43
  }
41
44
 
42
- export async function getCodexCapacityReport(options: CapacityProbeOptions = {}): Promise<CapacityReport> {
45
+ export async function getCodexCapacityReport(
46
+ options: CapacityProbeOptions = {},
47
+ ): Promise<CapacityReport> {
43
48
  const generatedAt = (options.now?.() ?? new Date()).toISOString();
44
- const installed = await isCodexInstalled(options.path ?? process.env.PATH ?? '', options.access);
49
+ const installed = await isCodexInstalled(options.path ?? process.env.PATH ?? "", options.access);
45
50
  try {
46
51
  return await (options.probe ?? probeCodexCapacity)({ installed, checkedAt: generatedAt });
47
52
  } catch {
48
53
  return {
49
- provider: 'codex',
54
+ provider: "codex",
50
55
  generatedAt,
51
56
  authenticated: null,
52
- available: 'unknown',
57
+ available: "unknown",
53
58
  windows: [],
54
- creditsRemaining: null
59
+ creditsRemaining: null,
55
60
  };
56
61
  }
57
62
  }
@@ -1,4 +1,4 @@
1
- export type Availability = 'yes' | 'no' | 'unknown';
1
+ export type Availability = "yes" | "no" | "unknown";
2
2
 
3
3
  export interface CapacityWindow {
4
4
  id: string;
@@ -1,91 +1,96 @@
1
- import Database from 'better-sqlite3';
2
- import { existsSync, mkdirSync } from 'fs';
3
- import { dirname, join } from 'path';
4
- import { homedir } from 'os';
5
- import { initializeSchema } from './schema.js';
1
+ import Database from "better-sqlite3";
2
+ import { existsSync, mkdirSync } from "fs";
3
+ import { dirname, join } from "path";
4
+ import { homedir } from "os";
5
+ import { initializeSchema } from "./schema.js";
6
6
 
7
- export const DEFAULT_AGENT_REGISTRY_DB_PATH = join(homedir(), '.ai-devkit', 'agents.db');
7
+ export const DEFAULT_AGENT_REGISTRY_DB_PATH = join(homedir(), ".ai-devkit", "agents.db");
8
8
 
9
9
  export interface DatabaseOptions {
10
- dbPath?: string;
11
- verbose?: boolean | ((message: string) => void);
12
- readonly?: boolean;
10
+ dbPath?: string;
11
+ verbose?: boolean | ((message: string) => void);
12
+ readonly?: boolean;
13
13
  }
14
14
 
15
15
  export function resolveAgentRegistryDbPath(filePath?: string): string {
16
- if (!filePath) return DEFAULT_AGENT_REGISTRY_DB_PATH;
17
- return filePath.endsWith('.json') ? filePath.replace(/\.json$/, '.db') : filePath;
16
+ if (!filePath) return DEFAULT_AGENT_REGISTRY_DB_PATH;
17
+ return filePath.endsWith(".json") ? filePath.replace(/\.json$/, ".db") : filePath;
18
18
  }
19
19
 
20
20
  export class DatabaseConnection {
21
- private db: Database.Database;
22
- private readonly dbPath: string;
23
- private readonly readonly: boolean;
21
+ private db: Database.Database;
22
+ private readonly dbPath: string;
23
+ private readonly readonly: boolean;
24
24
 
25
- constructor(options: DatabaseOptions = {}) {
26
- this.dbPath = options.dbPath ?? DEFAULT_AGENT_REGISTRY_DB_PATH;
27
- this.readonly = options.readonly ?? false;
28
- if (this.readonly && !existsSync(this.dbPath)) {
29
- throw new Error(`Cannot open readonly agent database because it does not exist: ${this.dbPath}`);
30
- }
31
- if (!this.readonly) mkdirSync(dirname(this.dbPath), { recursive: true });
25
+ constructor(options: DatabaseOptions = {}) {
26
+ this.dbPath = options.dbPath ?? DEFAULT_AGENT_REGISTRY_DB_PATH;
27
+ this.readonly = options.readonly ?? false;
28
+ if (this.readonly && !existsSync(this.dbPath)) {
29
+ throw new Error(
30
+ `Cannot open readonly agent database because it does not exist: ${this.dbPath}`,
31
+ );
32
+ }
33
+ if (!this.readonly) mkdirSync(dirname(this.dbPath), { recursive: true });
32
34
 
33
- this.db = new Database(this.dbPath, {
34
- readonly: this.readonly,
35
- timeout: 5000,
36
- verbose: typeof options.verbose === 'function'
37
- ? options.verbose
38
- : options.verbose ? console.log : undefined,
39
- });
35
+ this.db = new Database(this.dbPath, {
36
+ readonly: this.readonly,
37
+ timeout: 5000,
38
+ verbose:
39
+ typeof options.verbose === "function"
40
+ ? options.verbose
41
+ : options.verbose
42
+ ? console.log
43
+ : undefined,
44
+ });
40
45
 
41
- if (this.readonly) {
42
- const version = this.db.pragma('user_version', { simple: true }) as number;
43
- if (version < 3) {
44
- this.db.close();
45
- throw new Error(`Readonly agent database requires schema version 3 (found ${version}).`);
46
- }
47
- } else {
48
- this.configure();
49
- initializeSchema(this);
50
- }
46
+ if (this.readonly) {
47
+ const version = this.db.pragma("user_version", { simple: true }) as number;
48
+ if (version < 3) {
49
+ this.db.close();
50
+ throw new Error(`Readonly agent database requires schema version 3 (found ${version}).`);
51
+ }
52
+ } else {
53
+ this.configure();
54
+ initializeSchema(this);
51
55
  }
56
+ }
52
57
 
53
- private configure(): void {
54
- const journalMode = this.db.pragma('journal_mode', { simple: true }) as string;
55
- if (journalMode.toLowerCase() !== 'wal') this.db.pragma('journal_mode = WAL');
56
- this.db.pragma('foreign_keys = ON');
57
- this.db.pragma('synchronous = NORMAL');
58
- this.db.pragma('busy_timeout = 5000');
59
- this.db.pragma('mmap_size = 268435456');
60
- }
58
+ private configure(): void {
59
+ const journalMode = this.db.pragma("journal_mode", { simple: true }) as string;
60
+ if (journalMode.toLowerCase() !== "wal") this.db.pragma("journal_mode = WAL");
61
+ this.db.pragma("foreign_keys = ON");
62
+ this.db.pragma("synchronous = NORMAL");
63
+ this.db.pragma("busy_timeout = 5000");
64
+ this.db.pragma("mmap_size = 268435456");
65
+ }
61
66
 
62
- get instance(): Database.Database {
63
- return this.db;
64
- }
67
+ get instance(): Database.Database {
68
+ return this.db;
69
+ }
65
70
 
66
- get path(): string {
67
- return this.dbPath;
68
- }
71
+ get path(): string {
72
+ return this.dbPath;
73
+ }
69
74
 
70
- query<T>(sql: string, params: unknown[] = []): T[] {
71
- return this.db.prepare(sql).all(...params) as T[];
72
- }
75
+ query<T>(sql: string, params: unknown[] = []): T[] {
76
+ return this.db.prepare(sql).all(...params) as T[];
77
+ }
73
78
 
74
- queryOne<T>(sql: string, params: unknown[] = []): T | undefined {
75
- return this.db.prepare(sql).get(...params) as T | undefined;
76
- }
79
+ queryOne<T>(sql: string, params: unknown[] = []): T | undefined {
80
+ return this.db.prepare(sql).get(...params) as T | undefined;
81
+ }
77
82
 
78
- execute(sql: string, params: unknown[] = []): Database.RunResult {
79
- return this.db.prepare(sql).run(...params);
80
- }
83
+ execute(sql: string, params: unknown[] = []): Database.RunResult {
84
+ return this.db.prepare(sql).run(...params);
85
+ }
81
86
 
82
- transaction<T>(fn: () => T): T {
83
- return this.db.transaction(fn)();
84
- }
87
+ transaction<T>(fn: () => T): T {
88
+ return this.db.transaction(fn)();
89
+ }
85
90
 
86
- close(): void {
87
- if (this.db.open) {
88
- this.db.close();
89
- }
91
+ close(): void {
92
+ if (this.db.open) {
93
+ this.db.close();
90
94
  }
95
+ }
91
96
  }