@ai-devkit/agent-manager 0.36.0 → 0.38.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 (1046) hide show
  1. package/dist/AgentManager.d.ts +9 -8
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +23 -4
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +151 -3
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
  8. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
  9. package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
  10. package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
  11. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
  12. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
  13. package/dist/__tests__/capacity/anthropic.test.js +115 -0
  14. package/dist/__tests__/capacity/anthropic.test.js.map +1 -0
  15. package/dist/__tests__/capacity/boundaries.test.js +45 -0
  16. package/dist/__tests__/capacity/boundaries.test.js.map +1 -0
  17. package/dist/__tests__/capacity/claude.test.js +3 -3
  18. package/dist/__tests__/capacity/claude.test.js.map +1 -1
  19. package/dist/__tests__/capacity/codex.test.js +3 -1
  20. package/dist/__tests__/capacity/codex.test.js.map +1 -1
  21. package/dist/__tests__/capacity/openai.test.js +32 -25
  22. package/dist/__tests__/capacity/openai.test.js.map +1 -1
  23. package/dist/__tests__/capacity/wham.test.js +1 -1
  24. package/dist/__tests__/capacity/wham.test.js.map +1 -1
  25. package/dist/__tests__/capacity/zai.test.js +7 -8
  26. package/dist/__tests__/capacity/zai.test.js.map +1 -1
  27. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  28. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  29. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  30. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  31. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  32. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  33. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
  34. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  35. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  36. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  37. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js +79 -0
  38. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  39. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js +1881 -0
  40. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  41. package/dist/__tests__/harnesses/claude/ClaudeSessionLocator.test.js +425 -0
  42. package/dist/__tests__/harnesses/claude/ClaudeSessionLocator.test.js.map +1 -0
  43. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js +314 -0
  44. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  45. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js +49 -0
  46. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  47. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js +76 -0
  48. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  49. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js +173 -0
  50. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  51. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js +181 -0
  52. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  53. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js +685 -0
  54. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  55. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  56. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  57. package/dist/__tests__/harnesses/codex/CodexSessionMapping.test.js +86 -0
  58. package/dist/__tests__/harnesses/codex/CodexSessionMapping.test.js.map +1 -0
  59. package/dist/__tests__/harnesses/codex/CodexSessionParser.test.js +254 -0
  60. package/dist/__tests__/harnesses/codex/CodexSessionParser.test.js.map +1 -0
  61. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js +121 -0
  62. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  63. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js +84 -0
  64. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  65. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js +128 -0
  66. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  67. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js +246 -0
  68. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  69. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js +384 -0
  70. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  71. package/dist/__tests__/harnesses/copilot/CopilotAdapter.test.js +659 -0
  72. package/dist/__tests__/harnesses/copilot/CopilotAdapter.test.js.map +1 -0
  73. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  74. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  75. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js +1443 -0
  76. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  77. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  78. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  79. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  80. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  81. package/dist/__tests__/harnesses/grok/GrokAgentMapper.test.js +56 -0
  82. package/dist/__tests__/harnesses/grok/GrokAgentMapper.test.js.map +1 -0
  83. package/dist/__tests__/harnesses/grok/GrokCliAdapter.test.js +421 -0
  84. package/dist/__tests__/harnesses/grok/GrokCliAdapter.test.js.map +1 -0
  85. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  86. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  87. package/dist/__tests__/harnesses/grok/GrokSessionLocator.test.js +133 -0
  88. package/dist/__tests__/harnesses/grok/GrokSessionLocator.test.js.map +1 -0
  89. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  90. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  91. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
  92. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  93. package/dist/__tests__/harnesses/opencode/OpenCodeAdapter.test.js +213 -0
  94. package/dist/__tests__/harnesses/opencode/OpenCodeAdapter.test.js.map +1 -0
  95. package/dist/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.js +89 -0
  96. package/dist/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.js.map +1 -0
  97. package/dist/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.js +94 -0
  98. package/dist/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.js.map +1 -0
  99. package/dist/__tests__/harnesses/opencode/OpenCodeSessionParser.test.js +147 -0
  100. package/dist/__tests__/harnesses/opencode/OpenCodeSessionParser.test.js.map +1 -0
  101. package/dist/__tests__/harnesses/pi/PiAdapter.test.js +367 -0
  102. package/dist/__tests__/harnesses/pi/PiAdapter.test.js.map +1 -0
  103. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  104. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  105. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js +416 -0
  106. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  107. package/dist/__tests__/harnesses/pi/PiSessionTracker.test.js +108 -0
  108. package/dist/__tests__/harnesses/pi/PiSessionTracker.test.js.map +1 -0
  109. package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js +70 -0
  110. package/dist/__tests__/harnesses/pi/durable/PiCliProbe.test.js.map +1 -0
  111. package/dist/__tests__/harnesses/pi/durable/PiDurableAgentRepository.test.js.map +1 -0
  112. package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js +192 -0
  113. package/dist/__tests__/harnesses/pi/durable/PiPrintAgentService.test.js.map +1 -0
  114. package/dist/__tests__/harnesses/pi/durable/PiPrintProtocol.test.js +119 -0
  115. package/dist/__tests__/harnesses/pi/durable/PiPrintProtocol.test.js.map +1 -0
  116. package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js +382 -0
  117. package/dist/__tests__/harnesses/pi/durable/PiPrintRunner.test.js.map +1 -0
  118. package/dist/__tests__/harnesses/pi/durable/PiStreamParser.test.js +34 -0
  119. package/dist/__tests__/harnesses/pi/durable/PiStreamParser.test.js.map +1 -0
  120. package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js +342 -0
  121. package/dist/__tests__/harnesses/readiness/AgentReadiness.test.js.map +1 -0
  122. package/dist/__tests__/harnesses/runtimeProfiles.test.js +89 -0
  123. package/dist/__tests__/harnesses/runtimeProfiles.test.js.map +1 -0
  124. package/dist/__tests__/print/DurableAgent.test.js +4 -6
  125. package/dist/__tests__/print/DurableAgent.test.js.map +1 -1
  126. package/dist/__tests__/print/DurableAgentRepository.test.js +1 -12
  127. package/dist/__tests__/print/DurableAgentRepository.test.js.map +1 -1
  128. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  129. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  130. package/dist/__tests__/terminal/TmuxManager.test.js +1 -1
  131. package/dist/__tests__/terminal/TmuxManager.test.js.map +1 -1
  132. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  133. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  134. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  135. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  136. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  137. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  138. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  139. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  140. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  141. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  142. package/dist/__tests__/utils/process.test.js +436 -2
  143. package/dist/__tests__/utils/process.test.js.map +1 -1
  144. package/dist/adapters/AgentAdapter.d.ts +25 -6
  145. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  146. package/dist/adapters/AgentAdapter.js +12 -3
  147. package/dist/adapters/AgentAdapter.js.map +1 -1
  148. package/dist/capacity/index.d.ts +9 -19
  149. package/dist/capacity/index.d.ts.map +1 -1
  150. package/dist/capacity/index.js +11 -4
  151. package/dist/capacity/index.js.map +1 -1
  152. package/dist/capacity/providers/anthropic.d.ts +9 -0
  153. package/dist/capacity/providers/anthropic.d.ts.map +1 -0
  154. package/dist/capacity/providers/anthropic.js +153 -0
  155. package/dist/capacity/providers/anthropic.js.map +1 -0
  156. package/dist/capacity/providers/openai-platform.d.ts +14 -0
  157. package/dist/capacity/providers/openai-platform.d.ts.map +1 -0
  158. package/dist/capacity/providers/openai-platform.js +120 -0
  159. package/dist/capacity/providers/openai-platform.js.map +1 -0
  160. package/dist/capacity/providers/openai-subscription.d.ts +20 -0
  161. package/dist/capacity/providers/openai-subscription.d.ts.map +1 -0
  162. package/dist/capacity/providers/openai-subscription.js +129 -0
  163. package/dist/capacity/providers/openai-subscription.js.map +1 -0
  164. package/dist/capacity/providers/zai.d.ts +8 -0
  165. package/dist/capacity/providers/zai.d.ts.map +1 -0
  166. package/dist/capacity/providers/zai.js +158 -0
  167. package/dist/capacity/providers/zai.js.map +1 -0
  168. package/dist/capacity/sources/claude.d.ts +9 -0
  169. package/dist/capacity/sources/claude.d.ts.map +1 -0
  170. package/dist/capacity/sources/claude.js +17 -0
  171. package/dist/capacity/sources/claude.js.map +1 -0
  172. package/dist/capacity/sources/codex.d.ts +32 -0
  173. package/dist/capacity/sources/codex.d.ts.map +1 -0
  174. package/dist/capacity/sources/codex.js +227 -0
  175. package/dist/capacity/sources/codex.js.map +1 -0
  176. package/dist/capacity/sources/pi.d.ts +30 -0
  177. package/dist/capacity/sources/pi.d.ts.map +1 -0
  178. package/dist/capacity/sources/pi.js +81 -0
  179. package/dist/capacity/sources/pi.js.map +1 -0
  180. package/dist/capacity/types.d.ts +2 -0
  181. package/dist/capacity/types.d.ts.map +1 -1
  182. package/dist/capacity/types.js +1 -1
  183. package/dist/capacity/types.js.map +1 -1
  184. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  185. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  186. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  187. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  188. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  189. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  190. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  191. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  192. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  193. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  194. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  195. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  196. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  197. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  198. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  199. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  200. package/dist/harnesses/claude/ClaudeAgentMapper.d.ts.map +1 -0
  201. package/dist/harnesses/claude/ClaudeAgentMapper.js +36 -0
  202. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  203. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts +30 -0
  204. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  205. package/dist/harnesses/claude/ClaudeCodeAdapter.js +134 -0
  206. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  207. package/dist/harnesses/claude/ClaudeSessionLocator.d.ts.map +1 -0
  208. package/dist/harnesses/claude/ClaudeSessionLocator.js +260 -0
  209. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  210. package/dist/harnesses/claude/ClaudeSessionParser.d.ts +148 -0
  211. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  212. package/dist/harnesses/claude/ClaudeSessionParser.js +365 -0
  213. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  214. package/dist/harnesses/claude/credentials.d.ts +10 -0
  215. package/dist/harnesses/claude/credentials.d.ts.map +1 -0
  216. package/dist/harnesses/claude/credentials.js +112 -0
  217. package/dist/harnesses/claude/credentials.js.map +1 -0
  218. package/dist/harnesses/claude/durable/ClaudeCliProbe.d.ts.map +1 -0
  219. package/dist/harnesses/claude/durable/ClaudeCliProbe.js.map +1 -0
  220. package/dist/harnesses/claude/durable/ClaudePrintAgentService.d.ts.map +1 -0
  221. package/dist/harnesses/claude/durable/ClaudePrintAgentService.js.map +1 -0
  222. package/dist/harnesses/claude/durable/ClaudePrintRunner.d.ts.map +1 -0
  223. package/dist/harnesses/claude/durable/ClaudePrintRunner.js.map +1 -0
  224. package/dist/harnesses/claude/durable/ClaudeStreamParser.d.ts.map +1 -0
  225. package/dist/harnesses/claude/durable/ClaudeStreamParser.js.map +1 -0
  226. package/dist/harnesses/claude/readiness.d.ts +3 -0
  227. package/dist/harnesses/claude/readiness.d.ts.map +1 -0
  228. package/dist/harnesses/claude/readiness.js +63 -0
  229. package/dist/harnesses/claude/readiness.js.map +1 -0
  230. package/dist/harnesses/codex/CodexAdapter.d.ts +29 -0
  231. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  232. package/dist/harnesses/codex/CodexAdapter.js +290 -0
  233. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  234. package/dist/harnesses/codex/CodexAgentMapper.d.ts.map +1 -0
  235. package/dist/harnesses/codex/CodexAgentMapper.js +28 -0
  236. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  237. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  238. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  239. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  240. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  241. package/dist/harnesses/codex/CodexSessionMapping.d.ts.map +1 -0
  242. package/dist/harnesses/codex/CodexSessionMapping.js +68 -0
  243. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  244. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  245. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  246. package/dist/harnesses/codex/CodexSessionParser.js +308 -0
  247. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  248. package/dist/harnesses/codex/credentials.d.ts +15 -0
  249. package/dist/harnesses/codex/credentials.d.ts.map +1 -0
  250. package/dist/harnesses/codex/credentials.js +58 -0
  251. package/dist/harnesses/codex/credentials.js.map +1 -0
  252. package/dist/harnesses/codex/durable/CodexCliProbe.d.ts.map +1 -0
  253. package/dist/harnesses/codex/durable/CodexCliProbe.js.map +1 -0
  254. package/dist/harnesses/codex/durable/CodexPrintAgentService.d.ts.map +1 -0
  255. package/dist/harnesses/codex/durable/CodexPrintAgentService.js.map +1 -0
  256. package/dist/harnesses/codex/durable/CodexPrintRunner.d.ts.map +1 -0
  257. package/dist/harnesses/codex/durable/CodexPrintRunner.js.map +1 -0
  258. package/dist/harnesses/codex/durable/CodexStreamParser.d.ts.map +1 -0
  259. package/dist/harnesses/codex/durable/CodexStreamParser.js.map +1 -0
  260. package/dist/harnesses/codex/readiness.d.ts +3 -0
  261. package/dist/harnesses/codex/readiness.d.ts.map +1 -0
  262. package/dist/harnesses/codex/readiness.js +60 -0
  263. package/dist/harnesses/codex/readiness.js.map +1 -0
  264. package/dist/harnesses/copilot/CopilotAdapter.d.ts +36 -0
  265. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  266. package/dist/harnesses/copilot/CopilotAdapter.js +128 -0
  267. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  268. package/dist/harnesses/copilot/CopilotAgentMapper.d.ts.map +1 -0
  269. package/dist/harnesses/copilot/CopilotAgentMapper.js +30 -0
  270. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  271. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  272. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  273. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  274. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  275. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  276. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  277. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  278. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  279. package/dist/harnesses/copilot/readiness.d.ts +3 -0
  280. package/dist/harnesses/copilot/readiness.d.ts.map +1 -0
  281. package/dist/harnesses/copilot/readiness.js +39 -0
  282. package/dist/harnesses/copilot/readiness.js.map +1 -0
  283. package/dist/harnesses/gemini/GeminiAgentMapper.d.ts.map +1 -0
  284. package/dist/harnesses/gemini/GeminiAgentMapper.js +30 -0
  285. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  286. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts +52 -0
  287. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  288. package/dist/harnesses/gemini/GeminiCliAdapter.js +196 -0
  289. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  290. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  291. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  292. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  293. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  294. package/dist/harnesses/gemini/GeminiSessionParser.d.ts +121 -0
  295. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  296. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  297. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  298. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  299. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  300. package/dist/harnesses/gemini/fileSignature.js +9 -0
  301. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  302. package/dist/harnesses/grok/GrokAgentMapper.d.ts.map +1 -0
  303. package/dist/harnesses/grok/GrokAgentMapper.js +30 -0
  304. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  305. package/dist/harnesses/grok/GrokCliAdapter.d.ts +36 -0
  306. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  307. package/dist/harnesses/grok/GrokCliAdapter.js +102 -0
  308. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  309. package/dist/harnesses/grok/GrokSessionLocator.d.ts.map +1 -0
  310. package/dist/harnesses/grok/GrokSessionLocator.js +140 -0
  311. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  312. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  313. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  314. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  315. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  316. package/dist/harnesses/index.d.ts +7 -0
  317. package/dist/harnesses/index.d.ts.map +1 -0
  318. package/dist/harnesses/index.js +27 -0
  319. package/dist/harnesses/index.js.map +1 -0
  320. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  321. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  322. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  323. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  324. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  325. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  326. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  327. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  328. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  329. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  330. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  331. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  332. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  333. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  334. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  335. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  336. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts +29 -0
  337. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  338. package/dist/harnesses/opencode/OpenCodeAdapter.js +86 -0
  339. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  340. package/dist/harnesses/opencode/OpenCodeAgentMapper.d.ts.map +1 -0
  341. package/dist/harnesses/opencode/OpenCodeAgentMapper.js +42 -0
  342. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  343. package/dist/harnesses/opencode/OpenCodeSessionLocator.d.ts.map +1 -0
  344. package/dist/harnesses/opencode/OpenCodeSessionLocator.js +118 -0
  345. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  346. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts +16 -0
  347. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  348. package/dist/harnesses/opencode/OpenCodeSessionParser.js +105 -0
  349. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  350. package/dist/harnesses/opencode/readiness.d.ts +3 -0
  351. package/dist/harnesses/opencode/readiness.d.ts.map +1 -0
  352. package/dist/harnesses/opencode/readiness.js +50 -0
  353. package/dist/harnesses/opencode/readiness.js.map +1 -0
  354. package/dist/harnesses/pi/PiAdapter.d.ts +30 -0
  355. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  356. package/dist/harnesses/pi/PiAdapter.js +167 -0
  357. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  358. package/dist/harnesses/pi/PiAgentMapper.d.ts.map +1 -0
  359. package/dist/harnesses/pi/PiAgentMapper.js +30 -0
  360. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  361. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  362. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  363. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  364. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  365. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  366. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  367. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  368. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  369. package/dist/harnesses/pi/PiSessionTracker.d.ts.map +1 -0
  370. package/dist/harnesses/pi/PiSessionTracker.js +69 -0
  371. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  372. package/dist/harnesses/pi/credentials.d.ts +22 -0
  373. package/dist/harnesses/pi/credentials.d.ts.map +1 -0
  374. package/dist/harnesses/pi/credentials.js +98 -0
  375. package/dist/harnesses/pi/credentials.js.map +1 -0
  376. package/dist/harnesses/pi/durable/PiCliProbe.d.ts.map +1 -0
  377. package/dist/harnesses/pi/durable/PiCliProbe.js.map +1 -0
  378. package/dist/harnesses/pi/durable/PiPrintAgentService.d.ts.map +1 -0
  379. package/dist/harnesses/pi/durable/PiPrintAgentService.js.map +1 -0
  380. package/dist/harnesses/pi/durable/PiPrintProtocol.d.ts.map +1 -0
  381. package/dist/harnesses/pi/durable/PiPrintProtocol.js.map +1 -0
  382. package/dist/harnesses/pi/durable/PiPrintRunner.d.ts.map +1 -0
  383. package/dist/harnesses/pi/durable/PiPrintRunner.js.map +1 -0
  384. package/dist/harnesses/pi/durable/PiStreamParser.d.ts.map +1 -0
  385. package/dist/harnesses/pi/durable/PiStreamParser.js.map +1 -0
  386. package/dist/harnesses/pi/readiness.d.ts +3 -0
  387. package/dist/harnesses/pi/readiness.d.ts.map +1 -0
  388. package/dist/harnesses/pi/readiness.js +96 -0
  389. package/dist/harnesses/pi/readiness.js.map +1 -0
  390. package/dist/harnesses/readiness/AgentReadiness.d.ts +6 -0
  391. package/dist/harnesses/readiness/AgentReadiness.d.ts.map +1 -0
  392. package/dist/harnesses/readiness/AgentReadiness.js +68 -0
  393. package/dist/harnesses/readiness/AgentReadiness.js.map +1 -0
  394. package/dist/harnesses/readiness/checks.d.ts +31 -0
  395. package/dist/harnesses/readiness/checks.d.ts.map +1 -0
  396. package/dist/harnesses/readiness/checks.js +270 -0
  397. package/dist/harnesses/readiness/checks.js.map +1 -0
  398. package/dist/harnesses/readiness/types.d.ts +76 -0
  399. package/dist/harnesses/readiness/types.d.ts.map +1 -0
  400. package/dist/harnesses/readiness/types.js +4 -0
  401. package/dist/harnesses/readiness/types.js.map +1 -0
  402. package/dist/harnesses/runtimeProfiles.d.ts +11 -0
  403. package/dist/harnesses/runtimeProfiles.d.ts.map +1 -0
  404. package/dist/harnesses/runtimeProfiles.js +99 -0
  405. package/dist/harnesses/runtimeProfiles.js.map +1 -0
  406. package/dist/harnesses/shared.d.ts +41 -0
  407. package/dist/harnesses/shared.d.ts.map +1 -0
  408. package/dist/harnesses/shared.js +71 -0
  409. package/dist/harnesses/shared.js.map +1 -0
  410. package/dist/index.d.ts +21 -46
  411. package/dist/index.d.ts.map +1 -1
  412. package/dist/index.js +14 -27
  413. package/dist/index.js.map +1 -1
  414. package/dist/runtime/ManagedAgentRuntime.d.ts +3 -3
  415. package/dist/runtime/ManagedAgentRuntime.d.ts.map +1 -1
  416. package/dist/runtime/ManagedAgentRuntime.js +6 -20
  417. package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
  418. package/dist/runtime/herdr/HerdrAgentDiscovery.d.ts.map +1 -1
  419. package/dist/runtime/herdr/HerdrAgentDiscovery.js +2 -43
  420. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
  421. package/dist/runtime/tmux/PidPolling.d.ts +1 -1
  422. package/dist/runtime/tmux/PidPolling.d.ts.map +1 -1
  423. package/dist/runtime/tmux/PidPolling.js.map +1 -1
  424. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts +1 -1
  425. package/dist/runtime/tmux/TmuxAgentRuntime.d.ts.map +1 -1
  426. package/dist/runtime/tmux/TmuxAgentRuntime.js +1 -1
  427. package/dist/runtime/tmux/TmuxAgentRuntime.js.map +1 -1
  428. package/dist/runtime/tmux/TmuxManager.d.ts +12 -0
  429. package/dist/runtime/tmux/TmuxManager.d.ts.map +1 -0
  430. package/dist/runtime/tmux/TmuxManager.js +116 -0
  431. package/dist/runtime/tmux/TmuxManager.js.map +1 -0
  432. package/dist/runtime/types.d.ts +1 -1
  433. package/dist/runtime/types.d.ts.map +1 -1
  434. package/dist/runtime/types.js.map +1 -1
  435. package/dist/terminal/TerminalFocusManager.d.ts +4 -32
  436. package/dist/terminal/TerminalFocusManager.d.ts.map +1 -1
  437. package/dist/terminal/TerminalFocusManager.js +17 -267
  438. package/dist/terminal/TerminalFocusManager.js.map +1 -1
  439. package/dist/terminal/TtyWriter.d.ts +1 -44
  440. package/dist/terminal/TtyWriter.d.ts.map +1 -1
  441. package/dist/terminal/TtyWriter.js +11 -347
  442. package/dist/terminal/TtyWriter.js.map +1 -1
  443. package/dist/terminal/backends/index.d.ts +5 -0
  444. package/dist/terminal/backends/index.d.ts.map +1 -0
  445. package/dist/terminal/backends/index.js +19 -0
  446. package/dist/terminal/backends/index.js.map +1 -0
  447. package/dist/terminal/backends/iterm2.d.ts +3 -0
  448. package/dist/terminal/backends/iterm2.d.ts.map +1 -0
  449. package/dist/terminal/backends/iterm2.js +135 -0
  450. package/dist/terminal/backends/iterm2.js.map +1 -0
  451. package/dist/terminal/backends/shared.d.ts +7 -0
  452. package/dist/terminal/backends/shared.d.ts.map +1 -0
  453. package/dist/terminal/backends/shared.js +35 -0
  454. package/dist/terminal/backends/shared.js.map +1 -0
  455. package/dist/terminal/backends/terminal-app.d.ts +3 -0
  456. package/dist/terminal/backends/terminal-app.d.ts.map +1 -0
  457. package/dist/terminal/backends/terminal-app.js +129 -0
  458. package/dist/terminal/backends/terminal-app.js.map +1 -0
  459. package/dist/terminal/backends/tmux.d.ts +3 -0
  460. package/dist/terminal/backends/tmux.d.ts.map +1 -0
  461. package/dist/terminal/backends/tmux.js +76 -0
  462. package/dist/terminal/backends/tmux.js.map +1 -0
  463. package/dist/terminal/backends/wezterm.d.ts +3 -0
  464. package/dist/terminal/backends/wezterm.d.ts.map +1 -0
  465. package/dist/terminal/backends/wezterm.js +71 -0
  466. package/dist/terminal/backends/wezterm.js.map +1 -0
  467. package/dist/terminal/types.d.ts +21 -0
  468. package/dist/terminal/types.d.ts.map +1 -0
  469. package/dist/terminal/types.js +10 -0
  470. package/dist/terminal/types.js.map +1 -0
  471. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  472. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  473. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  474. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  475. package/dist/utils/jsonlTail.d.ts +73 -0
  476. package/dist/utils/jsonlTail.d.ts.map +1 -0
  477. package/dist/utils/jsonlTail.js +238 -0
  478. package/dist/utils/jsonlTail.js.map +1 -0
  479. package/dist/utils/matching.d.ts +2 -0
  480. package/dist/utils/matching.d.ts.map +1 -1
  481. package/dist/utils/matching.js +3 -2
  482. package/dist/utils/matching.js.map +1 -1
  483. package/dist/utils/matchingConstants.d.ts +15 -0
  484. package/dist/utils/matchingConstants.d.ts.map +1 -0
  485. package/dist/utils/matchingConstants.js +14 -0
  486. package/dist/utils/matchingConstants.js.map +1 -0
  487. package/dist/utils/process.d.ts +38 -2
  488. package/dist/utils/process.d.ts.map +1 -1
  489. package/dist/utils/process.js +131 -43
  490. package/dist/utils/process.js.map +1 -1
  491. package/package.json +2 -1
  492. package/scripts/benchmark-cold-start.mjs +350 -0
  493. package/src/AgentManager.ts +27 -6
  494. package/src/__tests__/AgentManager.test.ts +141 -3
  495. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  496. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  497. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  498. package/src/__tests__/capacity/anthropic.test.ts +105 -0
  499. package/src/__tests__/capacity/boundaries.test.ts +36 -0
  500. package/src/__tests__/capacity/claude.test.ts +3 -8
  501. package/src/__tests__/capacity/codex.test.ts +12 -35
  502. package/src/__tests__/capacity/fixtures/openai-codex-auth.json +1 -1
  503. package/src/__tests__/capacity/openai.test.ts +20 -30
  504. package/src/__tests__/capacity/wham.test.ts +1 -1
  505. package/src/__tests__/capacity/zai.test.ts +27 -62
  506. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  507. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  508. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  509. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
  510. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  511. package/src/__tests__/harnesses/claude/ClaudeAgentMapper.test.ts +84 -0
  512. package/src/__tests__/harnesses/claude/ClaudeCodeAdapter.test.ts +1793 -0
  513. package/src/__tests__/harnesses/claude/ClaudeSessionLocator.test.ts +423 -0
  514. package/src/__tests__/harnesses/claude/ClaudeSessionParser.test.ts +300 -0
  515. package/src/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.ts +34 -0
  516. package/src/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.ts +61 -0
  517. package/src/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.ts +129 -0
  518. package/src/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.ts +152 -0
  519. package/src/__tests__/harnesses/codex/CodexAdapter.test.ts +652 -0
  520. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  521. package/src/__tests__/harnesses/codex/CodexSessionMapping.test.ts +63 -0
  522. package/src/__tests__/harnesses/codex/CodexSessionParser.test.ts +192 -0
  523. package/src/__tests__/harnesses/codex/durable/CodexCliProbe.test.ts +80 -0
  524. package/src/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.ts +65 -0
  525. package/src/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.ts +104 -0
  526. package/src/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.ts +201 -0
  527. package/src/__tests__/harnesses/codex/durable/CodexPrintRunner.test.ts +299 -0
  528. package/src/__tests__/harnesses/copilot/CopilotAdapter.test.ts +614 -0
  529. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  530. package/src/__tests__/harnesses/gemini/GeminiCliAdapter.test.ts +1324 -0
  531. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  532. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  533. package/src/__tests__/harnesses/grok/GrokAgentMapper.test.ts +57 -0
  534. package/src/__tests__/harnesses/grok/GrokCliAdapter.test.ts +376 -0
  535. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  536. package/src/__tests__/harnesses/grok/GrokSessionLocator.test.ts +106 -0
  537. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  538. package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
  539. package/src/__tests__/harnesses/opencode/OpenCodeAdapter.test.ts +215 -0
  540. package/src/__tests__/harnesses/opencode/OpenCodeAgentMapper.test.ts +83 -0
  541. package/src/__tests__/harnesses/opencode/OpenCodeSessionLocator.test.ts +84 -0
  542. package/src/__tests__/harnesses/opencode/OpenCodeSessionParser.test.ts +148 -0
  543. package/src/__tests__/harnesses/pi/PiAdapter.test.ts +325 -0
  544. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  545. package/src/__tests__/harnesses/pi/PiSessionParser.test.ts +280 -0
  546. package/src/__tests__/harnesses/pi/PiSessionTracker.test.ts +79 -0
  547. package/src/__tests__/harnesses/pi/durable/PiCliProbe.test.ts +50 -0
  548. package/src/__tests__/harnesses/pi/durable/PiPrintAgentService.test.ts +138 -0
  549. package/src/__tests__/harnesses/pi/durable/PiPrintProtocol.test.ts +71 -0
  550. package/src/__tests__/harnesses/pi/durable/PiPrintRunner.test.ts +252 -0
  551. package/src/__tests__/harnesses/pi/durable/PiStreamParser.test.ts +26 -0
  552. package/src/__tests__/harnesses/readiness/AgentReadiness.test.ts +285 -0
  553. package/src/__tests__/harnesses/runtimeProfiles.test.ts +110 -0
  554. package/src/__tests__/print/DurableAgent.test.ts +4 -13
  555. package/src/__tests__/print/DurableAgentRepository.test.ts +1 -13
  556. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +31 -1
  557. package/src/__tests__/terminal/TmuxManager.test.ts +1 -1
  558. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  559. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  560. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  561. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  562. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  563. package/src/__tests__/utils/process.test.ts +254 -0
  564. package/src/adapters/AgentAdapter.ts +37 -14
  565. package/src/capacity/index.ts +29 -23
  566. package/src/capacity/providers/anthropic.ts +198 -0
  567. package/src/capacity/providers/openai-platform.ts +150 -0
  568. package/src/capacity/providers/openai-subscription.ts +162 -0
  569. package/src/capacity/providers/zai.ts +155 -0
  570. package/src/capacity/sources/claude.ts +30 -0
  571. package/src/capacity/sources/codex.ts +262 -0
  572. package/src/capacity/sources/pi.ts +131 -0
  573. package/src/capacity/types.ts +3 -0
  574. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  575. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  576. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  577. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  578. package/src/harnesses/claude/ClaudeAgentMapper.ts +55 -0
  579. package/src/harnesses/claude/ClaudeCodeAdapter.ts +175 -0
  580. package/src/harnesses/claude/ClaudeSessionLocator.ts +358 -0
  581. package/src/harnesses/claude/ClaudeSessionParser.ts +524 -0
  582. package/src/harnesses/claude/credentials.ts +122 -0
  583. package/src/harnesses/claude/readiness.ts +69 -0
  584. package/src/harnesses/codex/CodexAdapter.ts +337 -0
  585. package/src/harnesses/codex/CodexAgentMapper.ts +26 -0
  586. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  587. package/src/harnesses/codex/CodexSessionMapping.ts +89 -0
  588. package/src/harnesses/codex/CodexSessionParser.ts +462 -0
  589. package/src/harnesses/codex/credentials.ts +81 -0
  590. package/src/harnesses/codex/readiness.ts +72 -0
  591. package/src/harnesses/copilot/CopilotAdapter.ts +161 -0
  592. package/src/harnesses/copilot/CopilotAgentMapper.ts +27 -0
  593. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  594. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  595. package/src/harnesses/copilot/readiness.ts +33 -0
  596. package/src/harnesses/gemini/GeminiAgentMapper.ts +27 -0
  597. package/src/harnesses/gemini/GeminiCliAdapter.ts +272 -0
  598. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  599. package/src/harnesses/gemini/GeminiSessionParser.ts +395 -0
  600. package/src/harnesses/gemini/fileSignature.ts +10 -0
  601. package/src/harnesses/grok/GrokAgentMapper.ts +32 -0
  602. package/src/harnesses/grok/GrokCliAdapter.ts +126 -0
  603. package/src/harnesses/grok/GrokSessionLocator.ts +179 -0
  604. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  605. package/src/harnesses/index.ts +28 -0
  606. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  607. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  608. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  609. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  610. package/src/harnesses/opencode/OpenCodeAdapter.ts +110 -0
  611. package/src/harnesses/opencode/OpenCodeAgentMapper.ts +51 -0
  612. package/src/harnesses/opencode/OpenCodeSessionLocator.ts +151 -0
  613. package/src/harnesses/opencode/OpenCodeSessionParser.ts +146 -0
  614. package/src/harnesses/opencode/readiness.ts +48 -0
  615. package/src/harnesses/pi/PiAdapter.ts +197 -0
  616. package/src/harnesses/pi/PiAgentMapper.ts +27 -0
  617. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  618. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  619. package/src/harnesses/pi/PiSessionTracker.ts +87 -0
  620. package/src/harnesses/pi/credentials.ts +129 -0
  621. package/src/harnesses/pi/readiness.ts +104 -0
  622. package/src/harnesses/readiness/AgentReadiness.ts +87 -0
  623. package/src/harnesses/readiness/checks.ts +336 -0
  624. package/src/harnesses/readiness/types.ts +90 -0
  625. package/src/harnesses/runtimeProfiles.ts +103 -0
  626. package/src/harnesses/shared.ts +119 -0
  627. package/src/index.ts +20 -131
  628. package/src/runtime/ManagedAgentRuntime.ts +7 -22
  629. package/src/runtime/herdr/HerdrAgentDiscovery.ts +3 -19
  630. package/src/runtime/tmux/PidPolling.ts +1 -1
  631. package/src/runtime/tmux/TmuxAgentRuntime.ts +1 -1
  632. package/src/runtime/tmux/TmuxManager.ts +102 -0
  633. package/src/runtime/types.ts +1 -1
  634. package/src/terminal/TerminalFocusManager.ts +19 -292
  635. package/src/terminal/TtyWriter.ts +16 -336
  636. package/src/terminal/backends/index.ts +21 -0
  637. package/src/terminal/backends/iterm2.ts +126 -0
  638. package/src/terminal/backends/shared.ts +42 -0
  639. package/src/terminal/backends/terminal-app.ts +122 -0
  640. package/src/terminal/backends/tmux.ts +62 -0
  641. package/src/terminal/backends/wezterm.ts +65 -0
  642. package/src/terminal/types.ts +22 -0
  643. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  644. package/src/utils/jsonlTail.ts +349 -0
  645. package/src/utils/matching.ts +3 -3
  646. package/src/utils/matchingConstants.ts +15 -0
  647. package/src/utils/process.ts +189 -45
  648. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js +0 -381
  649. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
  650. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js +0 -1853
  651. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  652. package/dist/__tests__/adapters/CodexAdapter.test.js +0 -391
  653. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  654. package/dist/__tests__/adapters/KiroAdapter.test.js +0 -607
  655. package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
  656. package/dist/__tests__/durable/CodexCliProbe.test.js +0 -129
  657. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  658. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js +0 -84
  659. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  660. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js +0 -126
  661. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  662. package/dist/__tests__/durable/CodexPrintAgentService.test.js +0 -271
  663. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  664. package/dist/__tests__/durable/CodexPrintRunner.test.js +0 -393
  665. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  666. package/dist/__tests__/print/ClaudeCliProbe.test.js +0 -49
  667. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  668. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js +0 -75
  669. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  670. package/dist/__tests__/print/ClaudePrintAgentService.test.js +0 -173
  671. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  672. package/dist/__tests__/print/ClaudePrintRunner.test.js +0 -181
  673. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  674. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js +0 -79
  675. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  676. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js +0 -436
  677. package/dist/__tests__/providers/claude/ClaudeSessionLocator.test.js.map +0 -1
  678. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  679. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  680. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js +0 -86
  681. package/dist/__tests__/providers/codex/CodexSessionMapping.test.js.map +0 -1
  682. package/dist/__tests__/providers/codex/CodexSessionParser.test.js +0 -254
  683. package/dist/__tests__/providers/codex/CodexSessionParser.test.js.map +0 -1
  684. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js +0 -659
  685. package/dist/__tests__/providers/copilot/CopilotAdapter.test.js.map +0 -1
  686. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js +0 -1434
  687. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  688. package/dist/__tests__/providers/grok/GrokAgentMapper.test.js +0 -56
  689. package/dist/__tests__/providers/grok/GrokAgentMapper.test.js.map +0 -1
  690. package/dist/__tests__/providers/grok/GrokCliAdapter.test.js +0 -421
  691. package/dist/__tests__/providers/grok/GrokCliAdapter.test.js.map +0 -1
  692. package/dist/__tests__/providers/grok/GrokSessionLocator.test.js +0 -133
  693. package/dist/__tests__/providers/grok/GrokSessionLocator.test.js.map +0 -1
  694. package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js +0 -213
  695. package/dist/__tests__/providers/opencode/OpenCodeAdapter.test.js.map +0 -1
  696. package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js +0 -89
  697. package/dist/__tests__/providers/opencode/OpenCodeAgentMapper.test.js.map +0 -1
  698. package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js +0 -94
  699. package/dist/__tests__/providers/opencode/OpenCodeSessionLocator.test.js.map +0 -1
  700. package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js +0 -147
  701. package/dist/__tests__/providers/opencode/OpenCodeSessionParser.test.js.map +0 -1
  702. package/dist/__tests__/providers/pi/PiAdapter.test.js +0 -367
  703. package/dist/__tests__/providers/pi/PiAdapter.test.js.map +0 -1
  704. package/dist/__tests__/providers/pi/PiSessionParser.test.js +0 -246
  705. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  706. package/dist/__tests__/providers/pi/PiSessionTracker.test.js +0 -108
  707. package/dist/__tests__/providers/pi/PiSessionTracker.test.js.map +0 -1
  708. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js +0 -76
  709. package/dist/__tests__/providers/pi/durable/PiCliProbe.test.js.map +0 -1
  710. package/dist/__tests__/providers/pi/durable/PiDurableAgentRepository.test.js.map +0 -1
  711. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js +0 -202
  712. package/dist/__tests__/providers/pi/durable/PiPrintAgentService.test.js.map +0 -1
  713. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js +0 -119
  714. package/dist/__tests__/providers/pi/durable/PiPrintProtocol.test.js.map +0 -1
  715. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js +0 -386
  716. package/dist/__tests__/providers/pi/durable/PiPrintRunner.test.js.map +0 -1
  717. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js +0 -34
  718. package/dist/__tests__/providers/pi/durable/PiStreamParser.test.js.map +0 -1
  719. package/dist/__tests__/readiness/AgentReadiness.test.js +0 -301
  720. package/dist/__tests__/readiness/AgentReadiness.test.js.map +0 -1
  721. package/dist/__tests__/utils/ClaudeSessionParser.test.js +0 -314
  722. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  723. package/dist/__tests__/utils/agents.test.js +0 -29
  724. package/dist/__tests__/utils/agents.test.js.map +0 -1
  725. package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
  726. package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
  727. package/dist/adapters/AntigravityCliAdapter.js +0 -273
  728. package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
  729. package/dist/adapters/KiroAdapter.d.ts +0 -46
  730. package/dist/adapters/KiroAdapter.d.ts.map +0 -1
  731. package/dist/adapters/KiroAdapter.js +0 -344
  732. package/dist/adapters/KiroAdapter.js.map +0 -1
  733. package/dist/adapters/index.d.ts +0 -12
  734. package/dist/adapters/index.d.ts.map +0 -1
  735. package/dist/adapters/index.js +0 -12
  736. package/dist/adapters/index.js.map +0 -1
  737. package/dist/capacity/claude.d.ts +0 -17
  738. package/dist/capacity/claude.d.ts.map +0 -1
  739. package/dist/capacity/claude.js +0 -271
  740. package/dist/capacity/claude.js.map +0 -1
  741. package/dist/capacity/codex.d.ts +0 -36
  742. package/dist/capacity/codex.d.ts.map +0 -1
  743. package/dist/capacity/codex.js +0 -280
  744. package/dist/capacity/codex.js.map +0 -1
  745. package/dist/capacity/openai.d.ts +0 -48
  746. package/dist/capacity/openai.d.ts.map +0 -1
  747. package/dist/capacity/openai.js +0 -312
  748. package/dist/capacity/openai.js.map +0 -1
  749. package/dist/capacity/wham.d.ts +0 -16
  750. package/dist/capacity/wham.d.ts.map +0 -1
  751. package/dist/capacity/wham.js +0 -66
  752. package/dist/capacity/wham.js.map +0 -1
  753. package/dist/capacity/zai.d.ts +0 -14
  754. package/dist/capacity/zai.d.ts.map +0 -1
  755. package/dist/capacity/zai.js +0 -203
  756. package/dist/capacity/zai.js.map +0 -1
  757. package/dist/providers/claude/ClaudeAgentMapper.d.ts.map +0 -1
  758. package/dist/providers/claude/ClaudeAgentMapper.js +0 -42
  759. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  760. package/dist/providers/claude/ClaudeCodeAdapter.d.ts +0 -31
  761. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  762. package/dist/providers/claude/ClaudeCodeAdapter.js +0 -132
  763. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  764. package/dist/providers/claude/ClaudeSessionLocator.d.ts.map +0 -1
  765. package/dist/providers/claude/ClaudeSessionLocator.js +0 -260
  766. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  767. package/dist/providers/claude/ClaudeSessionParser.d.ts +0 -114
  768. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  769. package/dist/providers/claude/ClaudeSessionParser.js +0 -309
  770. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  771. package/dist/providers/claude/durable/ClaudeCliProbe.d.ts.map +0 -1
  772. package/dist/providers/claude/durable/ClaudeCliProbe.js.map +0 -1
  773. package/dist/providers/claude/durable/ClaudePrintAgentService.d.ts.map +0 -1
  774. package/dist/providers/claude/durable/ClaudePrintAgentService.js.map +0 -1
  775. package/dist/providers/claude/durable/ClaudePrintRunner.d.ts.map +0 -1
  776. package/dist/providers/claude/durable/ClaudePrintRunner.js.map +0 -1
  777. package/dist/providers/claude/durable/ClaudeStreamParser.d.ts.map +0 -1
  778. package/dist/providers/claude/durable/ClaudeStreamParser.js.map +0 -1
  779. package/dist/providers/codex/CodexAdapter.d.ts +0 -28
  780. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  781. package/dist/providers/codex/CodexAdapter.js +0 -170
  782. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  783. package/dist/providers/codex/CodexAgentMapper.d.ts.map +0 -1
  784. package/dist/providers/codex/CodexAgentMapper.js +0 -35
  785. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  786. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  787. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  788. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  789. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  790. package/dist/providers/codex/CodexSessionMapping.d.ts.map +0 -1
  791. package/dist/providers/codex/CodexSessionMapping.js +0 -68
  792. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  793. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  794. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  795. package/dist/providers/codex/CodexSessionParser.js +0 -262
  796. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  797. package/dist/providers/codex/durable/CodexCliProbe.d.ts.map +0 -1
  798. package/dist/providers/codex/durable/CodexCliProbe.js.map +0 -1
  799. package/dist/providers/codex/durable/CodexPrintAgentService.d.ts.map +0 -1
  800. package/dist/providers/codex/durable/CodexPrintAgentService.js.map +0 -1
  801. package/dist/providers/codex/durable/CodexPrintRunner.d.ts.map +0 -1
  802. package/dist/providers/codex/durable/CodexPrintRunner.js.map +0 -1
  803. package/dist/providers/codex/durable/CodexStreamParser.d.ts.map +0 -1
  804. package/dist/providers/codex/durable/CodexStreamParser.js.map +0 -1
  805. package/dist/providers/copilot/CopilotAdapter.d.ts +0 -35
  806. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  807. package/dist/providers/copilot/CopilotAdapter.js +0 -123
  808. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  809. package/dist/providers/copilot/CopilotAgentMapper.d.ts.map +0 -1
  810. package/dist/providers/copilot/CopilotAgentMapper.js +0 -37
  811. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  812. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  813. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  814. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  815. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  816. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  817. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  818. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  819. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  820. package/dist/providers/gemini/GeminiAgentMapper.d.ts.map +0 -1
  821. package/dist/providers/gemini/GeminiAgentMapper.js +0 -37
  822. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  823. package/dist/providers/gemini/GeminiCliAdapter.d.ts +0 -53
  824. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  825. package/dist/providers/gemini/GeminiCliAdapter.js +0 -197
  826. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  827. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  828. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  829. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  830. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  831. package/dist/providers/gemini/GeminiSessionParser.d.ts +0 -94
  832. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  833. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  834. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  835. package/dist/providers/grok/GrokAgentMapper.d.ts.map +0 -1
  836. package/dist/providers/grok/GrokAgentMapper.js +0 -36
  837. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  838. package/dist/providers/grok/GrokCliAdapter.d.ts +0 -36
  839. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  840. package/dist/providers/grok/GrokCliAdapter.js +0 -98
  841. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  842. package/dist/providers/grok/GrokSessionLocator.d.ts.map +0 -1
  843. package/dist/providers/grok/GrokSessionLocator.js +0 -140
  844. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  845. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  846. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  847. package/dist/providers/grok/GrokSessionParser.js +0 -122
  848. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  849. package/dist/providers/opencode/OpenCodeAdapter.d.ts +0 -31
  850. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  851. package/dist/providers/opencode/OpenCodeAdapter.js +0 -89
  852. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  853. package/dist/providers/opencode/OpenCodeAgentMapper.d.ts.map +0 -1
  854. package/dist/providers/opencode/OpenCodeAgentMapper.js +0 -50
  855. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  856. package/dist/providers/opencode/OpenCodeSessionLocator.d.ts.map +0 -1
  857. package/dist/providers/opencode/OpenCodeSessionLocator.js +0 -118
  858. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  859. package/dist/providers/opencode/OpenCodeSessionParser.d.ts +0 -18
  860. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  861. package/dist/providers/opencode/OpenCodeSessionParser.js +0 -104
  862. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  863. package/dist/providers/pi/PiAdapter.d.ts +0 -29
  864. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  865. package/dist/providers/pi/PiAdapter.js +0 -163
  866. package/dist/providers/pi/PiAdapter.js.map +0 -1
  867. package/dist/providers/pi/PiAgentMapper.d.ts.map +0 -1
  868. package/dist/providers/pi/PiAgentMapper.js +0 -37
  869. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  870. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  871. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  872. package/dist/providers/pi/PiSessionLocator.js +0 -86
  873. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  874. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  875. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  876. package/dist/providers/pi/PiSessionParser.js +0 -191
  877. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  878. package/dist/providers/pi/PiSessionTracker.d.ts.map +0 -1
  879. package/dist/providers/pi/PiSessionTracker.js +0 -69
  880. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  881. package/dist/providers/pi/durable/PiCliProbe.d.ts.map +0 -1
  882. package/dist/providers/pi/durable/PiCliProbe.js.map +0 -1
  883. package/dist/providers/pi/durable/PiPrintAgentService.d.ts.map +0 -1
  884. package/dist/providers/pi/durable/PiPrintAgentService.js.map +0 -1
  885. package/dist/providers/pi/durable/PiPrintProtocol.d.ts.map +0 -1
  886. package/dist/providers/pi/durable/PiPrintProtocol.js.map +0 -1
  887. package/dist/providers/pi/durable/PiPrintRunner.d.ts.map +0 -1
  888. package/dist/providers/pi/durable/PiPrintRunner.js.map +0 -1
  889. package/dist/providers/pi/durable/PiStreamParser.d.ts.map +0 -1
  890. package/dist/providers/pi/durable/PiStreamParser.js.map +0 -1
  891. package/dist/readiness/AgentReadiness.d.ts +0 -67
  892. package/dist/readiness/AgentReadiness.d.ts.map +0 -1
  893. package/dist/readiness/AgentReadiness.js +0 -614
  894. package/dist/readiness/AgentReadiness.js.map +0 -1
  895. package/dist/terminal/TmuxManager.d.ts +0 -28
  896. package/dist/terminal/TmuxManager.d.ts.map +0 -1
  897. package/dist/terminal/TmuxManager.js +0 -135
  898. package/dist/terminal/TmuxManager.js.map +0 -1
  899. package/dist/terminal/index.d.ts +0 -5
  900. package/dist/terminal/index.d.ts.map +0 -1
  901. package/dist/terminal/index.js +0 -5
  902. package/dist/terminal/index.js.map +0 -1
  903. package/dist/utils/agents.d.ts +0 -15
  904. package/dist/utils/agents.d.ts.map +0 -1
  905. package/dist/utils/agents.js +0 -82
  906. package/dist/utils/agents.js.map +0 -1
  907. package/dist/utils/index.d.ts +0 -7
  908. package/dist/utils/index.d.ts.map +0 -1
  909. package/dist/utils/index.js +0 -6
  910. package/dist/utils/index.js.map +0 -1
  911. package/src/__tests__/adapters/AntigravityCliAdapter.test.ts +0 -324
  912. package/src/__tests__/adapters/ClaudeCodeAdapter.test.ts +0 -1763
  913. package/src/__tests__/adapters/CodexAdapter.test.ts +0 -387
  914. package/src/__tests__/adapters/KiroAdapter.test.ts +0 -534
  915. package/src/__tests__/durable/CodexCliProbe.test.ts +0 -85
  916. package/src/__tests__/durable/CodexDurableAgentRepository.test.ts +0 -65
  917. package/src/__tests__/durable/CodexPrintAgent.integration.test.ts +0 -104
  918. package/src/__tests__/durable/CodexPrintAgentService.test.ts +0 -217
  919. package/src/__tests__/durable/CodexPrintRunner.test.ts +0 -309
  920. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  921. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  922. package/src/__tests__/print/ClaudeCliProbe.test.ts +0 -34
  923. package/src/__tests__/print/ClaudePrintAgent.integration.test.ts +0 -61
  924. package/src/__tests__/print/ClaudePrintAgentService.test.ts +0 -129
  925. package/src/__tests__/print/ClaudePrintRunner.test.ts +0 -152
  926. package/src/__tests__/providers/claude/ClaudeAgentMapper.test.ts +0 -84
  927. package/src/__tests__/providers/claude/ClaudeSessionLocator.test.ts +0 -434
  928. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  929. package/src/__tests__/providers/codex/CodexSessionMapping.test.ts +0 -63
  930. package/src/__tests__/providers/codex/CodexSessionParser.test.ts +0 -192
  931. package/src/__tests__/providers/copilot/CopilotAdapter.test.ts +0 -614
  932. package/src/__tests__/providers/gemini/GeminiCliAdapter.test.ts +0 -1320
  933. package/src/__tests__/providers/grok/GrokAgentMapper.test.ts +0 -57
  934. package/src/__tests__/providers/grok/GrokCliAdapter.test.ts +0 -376
  935. package/src/__tests__/providers/grok/GrokSessionLocator.test.ts +0 -106
  936. package/src/__tests__/providers/opencode/OpenCodeAdapter.test.ts +0 -215
  937. package/src/__tests__/providers/opencode/OpenCodeAgentMapper.test.ts +0 -83
  938. package/src/__tests__/providers/opencode/OpenCodeSessionLocator.test.ts +0 -84
  939. package/src/__tests__/providers/opencode/OpenCodeSessionParser.test.ts +0 -148
  940. package/src/__tests__/providers/pi/PiAdapter.test.ts +0 -325
  941. package/src/__tests__/providers/pi/PiSessionParser.test.ts +0 -190
  942. package/src/__tests__/providers/pi/PiSessionTracker.test.ts +0 -79
  943. package/src/__tests__/providers/pi/durable/PiCliProbe.test.ts +0 -54
  944. package/src/__tests__/providers/pi/durable/PiPrintAgentService.test.ts +0 -141
  945. package/src/__tests__/providers/pi/durable/PiPrintProtocol.test.ts +0 -71
  946. package/src/__tests__/providers/pi/durable/PiPrintRunner.test.ts +0 -253
  947. package/src/__tests__/providers/pi/durable/PiStreamParser.test.ts +0 -26
  948. package/src/__tests__/readiness/AgentReadiness.test.ts +0 -242
  949. package/src/__tests__/utils/ClaudeSessionParser.test.ts +0 -300
  950. package/src/__tests__/utils/agents.test.ts +0 -31
  951. package/src/adapters/AntigravityCliAdapter.ts +0 -356
  952. package/src/adapters/KiroAdapter.ts +0 -456
  953. package/src/adapters/index.ts +0 -17
  954. package/src/capacity/claude.ts +0 -313
  955. package/src/capacity/codex.ts +0 -332
  956. package/src/capacity/openai.ts +0 -361
  957. package/src/capacity/wham.ts +0 -84
  958. package/src/capacity/zai.ts +0 -237
  959. package/src/providers/claude/ClaudeAgentMapper.ts +0 -63
  960. package/src/providers/claude/ClaudeCodeAdapter.ts +0 -173
  961. package/src/providers/claude/ClaudeSessionLocator.ts +0 -358
  962. package/src/providers/claude/ClaudeSessionParser.ts +0 -432
  963. package/src/providers/codex/CodexAdapter.ts +0 -213
  964. package/src/providers/codex/CodexAgentMapper.ts +0 -35
  965. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  966. package/src/providers/codex/CodexSessionMapping.ts +0 -89
  967. package/src/providers/codex/CodexSessionParser.ts +0 -385
  968. package/src/providers/copilot/CopilotAdapter.ts +0 -161
  969. package/src/providers/copilot/CopilotAgentMapper.ts +0 -36
  970. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  971. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  972. package/src/providers/gemini/GeminiAgentMapper.ts +0 -36
  973. package/src/providers/gemini/GeminiCliAdapter.ts +0 -274
  974. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  975. package/src/providers/gemini/GeminiSessionParser.ts +0 -271
  976. package/src/providers/grok/GrokAgentMapper.ts +0 -41
  977. package/src/providers/grok/GrokCliAdapter.ts +0 -125
  978. package/src/providers/grok/GrokSessionLocator.ts +0 -179
  979. package/src/providers/grok/GrokSessionParser.ts +0 -166
  980. package/src/providers/opencode/OpenCodeAdapter.ts +0 -116
  981. package/src/providers/opencode/OpenCodeAgentMapper.ts +0 -61
  982. package/src/providers/opencode/OpenCodeSessionLocator.ts +0 -151
  983. package/src/providers/opencode/OpenCodeSessionParser.ts +0 -145
  984. package/src/providers/pi/PiAdapter.ts +0 -195
  985. package/src/providers/pi/PiAgentMapper.ts +0 -36
  986. package/src/providers/pi/PiSessionLocator.ts +0 -110
  987. package/src/providers/pi/PiSessionParser.ts +0 -284
  988. package/src/providers/pi/PiSessionTracker.ts +0 -87
  989. package/src/readiness/AgentReadiness.ts +0 -730
  990. package/src/terminal/TmuxManager.ts +0 -123
  991. package/src/terminal/index.ts +0 -4
  992. package/src/utils/agents.ts +0 -75
  993. package/src/utils/index.ts +0 -12
  994. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  995. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  996. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  997. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  998. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  999. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  1000. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  1001. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  1002. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  1003. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  1004. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  1005. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  1006. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  1007. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  1008. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  1009. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  1010. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  1011. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  1012. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  1013. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  1014. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  1015. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  1016. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  1017. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  1018. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  1019. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  1020. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  1021. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  1022. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  1023. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  1024. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  1025. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  1026. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  1027. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  1028. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  1029. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  1030. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  1031. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  1032. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  1033. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  1034. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  1035. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  1036. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  1037. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  1038. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  1039. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  1040. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  1041. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  1042. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  1043. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  1044. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  1045. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  1046. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/capacity/codex.ts"],"sourcesContent":["import { spawn } from \"node:child_process\";\nimport { readFile } from \"node:fs/promises\";\nimport { join } from \"node:path\";\nimport { parseWhamUsage, resetTime, safeIdentifier } from \"./wham.js\";\nimport type { CapacityReport, CapacityWindow } from \"./types.js\";\n\nexport { toRateWindow } from \"./wham.js\";\n\ntype CodexUsageSource = \"pat\" | \"oauth\" | \"cli\";\ntype UsageSnapshot = {\n windows: CapacityWindow[];\n creditsRemaining: number | null;\n source: CodexUsageSource;\n};\n\ntype UnknownRecord = Record<string, unknown>;\ntype RpcMessage = { id?: number; method: string; params?: UnknownRecord };\ntype CliResponses = { rateLimits: unknown; account: unknown };\ntype CodexRpc = (messages: RpcMessage[]) => Promise<CliResponses>;\n\nexport const CODEX_APP_SERVER_ARGS = [\"-s\", \"read-only\", \"-a\", \"untrusted\", \"app-server\"] as const;\n\ntype CodexProbeOptions = {\n installed: boolean;\n checkedAt: string;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n fetch?: typeof globalThis.fetch;\n rpc?: CodexRpc;\n timeoutMs?: number;\n env?: NodeJS.ProcessEnv;\n now?: () => Date;\n};\n\nfunction record(value: unknown): UnknownRecord | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : null;\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function resolveCodexAuthPath(env: NodeJS.ProcessEnv = process.env): string {\n const root = env.CODEX_HOME || join(env.HOME || \"\", \".codex\");\n return join(root, \"auth.json\");\n}\n\nexport function parseUsage(raw: unknown, source: \"pat\" | \"oauth\"): UsageSnapshot {\n const { windows, creditsRemaining } = parseWhamUsage(raw);\n return { windows, creditsRemaining, source };\n}\n\nfunction cliWindow(value: unknown, id: string, label: string): CapacityWindow | null {\n const input = record(value);\n if (!input) return null;\n return {\n id,\n label,\n durationMinutes: finiteNumber(input.windowDurationMins),\n usedPercent: finiteNumber(input.usedPercent),\n resetsAt: resetTime(input.resetsAt),\n };\n}\n\nfunction cliSnapshotWindows(value: unknown, fallbackId: string): CapacityWindow[] {\n const snapshot = record(value);\n if (!snapshot) return [];\n const scope = safeIdentifier(snapshot.limitId) ?? safeIdentifier(fallbackId) ?? \"codex\";\n return [\n cliWindow(snapshot.primary, `${scope}:primary`, `${scope} primary`),\n cliWindow(snapshot.secondary, `${scope}:secondary`, `${scope} secondary`),\n ].filter((item): item is CapacityWindow => item !== null);\n}\n\nexport function parseCliUsage(raw: unknown): UsageSnapshot {\n const response = record(raw) ?? {};\n const primary = record(response.rateLimits);\n const windows = primary ? cliSnapshotWindows(primary, \"codex\") : [];\n const buckets = record(response.rateLimitsByLimitId);\n if (buckets) {\n for (const [id, snapshot] of Object.entries(buckets))\n windows.push(...cliSnapshotWindows(snapshot, id));\n }\n const unique = [...new Map(windows.map((window) => [window.id, window])).values()];\n return { windows: unique, creditsRemaining: null, source: \"cli\" };\n}\n\nfunction capacityFromSnapshot(\n snapshot: UsageSnapshot,\n context: CodexProbeOptions,\n raw?: unknown,\n): CapacityReport {\n const hasUsage = snapshot.windows.some((window) => window.usedPercent !== null);\n const rateLimits = record(record(raw)?.rateLimits);\n const reached = nonEmptyText(rateLimits?.rateLimitReachedType);\n const resetCredits =\n record(record(raw)?.rateLimitResetCredits) ?? record(record(raw)?.usageLimitResetCredits);\n return {\n harness: \"codex\",\n provider: \"openai\",\n generatedAt: context.checkedAt,\n authenticated: true,\n available: reached ? \"no\" : hasUsage ? \"yes\" : \"unknown\",\n windows: snapshot.windows,\n creditsRemaining: snapshot.creditsRemaining ?? finiteNumber(resetCredits?.availableCount),\n };\n}\n\nfunction jwtExpiry(token: string): number | null {\n const part = token.split(\".\")[1];\n if (!part) return null;\n try {\n return finiteNumber(record(JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")))?.exp);\n } catch {\n return null;\n }\n}\n\nfunction staleOAuth(tokens: UnknownRecord, token: string, now: Date): boolean {\n const metadata = tokens.expires_at ?? tokens.expiresAt ?? tokens.expiry;\n let expiry: number | null = finiteNumber(metadata);\n if (typeof metadata === \"string\") {\n const parsed = Date.parse(metadata);\n expiry = Number.isNaN(parsed) ? null : parsed / 1000;\n }\n expiry ??= jwtExpiry(token);\n return expiry !== null && expiry <= now.getTime() / 1000;\n}\n\nasync function fetchJson(\n fetcher: typeof globalThis.fetch,\n url: string,\n init: RequestInit,\n timeoutMs: number,\n): Promise<unknown> {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), timeoutMs);\n try {\n const response = await fetcher(url, { ...init, signal: controller.signal });\n if (!response.ok) throw new Error(response.status === 401 ? \"unauthorized\" : \"request failed\");\n return await response.json();\n } finally {\n clearTimeout(timer);\n }\n}\n\nasync function apiSnapshot(\n token: string,\n accountId: string,\n source: \"pat\" | \"oauth\",\n options: CodexProbeOptions,\n): Promise<UsageSnapshot> {\n const fetcher = options.fetch ?? globalThis.fetch;\n const raw = await fetchJson(\n fetcher,\n \"https://chatgpt.com/backend-api/wham/usage\",\n {\n headers: {\n Authorization: `Bearer ${token}`,\n \"ChatGPT-Account-Id\": accountId,\n },\n },\n options.timeoutMs ?? 5000,\n );\n return parseUsage(raw, source);\n}\n\nfunction appServerRpc(messages: RpcMessage[], timeoutMs = 5000): Promise<CliResponses> {\n return new Promise((resolve, reject) => {\n const child = spawn(\"codex\", CODEX_APP_SERVER_ARGS, {\n stdio: [\"pipe\", \"pipe\", \"ignore\"],\n });\n const results: Partial<CliResponses> = {};\n let buffer = \"\";\n let settled = false;\n const finish = (error?: Error) => {\n if (settled) return;\n settled = true;\n clearTimeout(timer);\n child.kill();\n if (error) reject(error);\n else resolve(results as CliResponses);\n };\n const timer = setTimeout(() => finish(new Error(\"codex probe timed out\")), timeoutMs);\n child.once(\"error\", () => finish(new Error(\"codex app-server unavailable\")));\n child.once(\"exit\", () => {\n if (!settled) finish(new Error(\"codex app-server exited\"));\n });\n child.stdout.setEncoding(\"utf8\");\n child.stdout.on(\"data\", (chunk: string) => {\n buffer += chunk;\n for (;;) {\n const newline = buffer.indexOf(\"\\n\");\n if (newline < 0) break;\n const line = buffer.slice(0, newline).trim();\n buffer = buffer.slice(newline + 1);\n if (!line) continue;\n let message: UnknownRecord;\n try {\n message = JSON.parse(line) as UnknownRecord;\n } catch {\n continue;\n }\n if (message.id === 1) {\n for (const request of messages.slice(1))\n child.stdin.write(`${JSON.stringify(request)}\\n`);\n } else if (message.id === 2) {\n if (message.error) finish(new Error(\"codex rate-limit method failed\"));\n else results.rateLimits = message.result;\n } else if (message.id === 3) {\n if (message.error) finish(new Error(\"codex account method failed\"));\n else results.account = message.result;\n }\n if (\"rateLimits\" in results && \"account\" in results) finish();\n }\n });\n child.stdin.write(`${JSON.stringify(messages[0])}\\n`);\n });\n}\n\nexport function codexUnavailableReport(checkedAt: string): CapacityReport {\n return {\n harness: \"codex\",\n provider: \"openai\",\n generatedAt: checkedAt,\n authenticated: null,\n available: \"unknown\",\n windows: [],\n creditsRemaining: null,\n };\n}\n\nfunction unavailable(options: CodexProbeOptions): CapacityReport {\n return codexUnavailableReport(options.checkedAt);\n}\n\nasync function cliFallback(options: CodexProbeOptions): Promise<CapacityReport> {\n if (!options.installed) return unavailable(options);\n const messages: RpcMessage[] = [\n {\n id: 1,\n method: \"initialize\",\n params: {\n clientInfo: { name: \"ai-devkit\", title: null, version: \"1\" },\n capabilities: null,\n },\n },\n { method: \"initialized\" },\n { id: 2, method: \"account/rateLimits/read\" },\n { id: 3, method: \"account/read\" },\n ];\n try {\n const rpc = options.rpc ?? ((requests) => appServerRpc(requests, options.timeoutMs));\n const response = await rpc(messages);\n const result = capacityFromSnapshot(\n parseCliUsage(response.rateLimits),\n options,\n response.rateLimits,\n );\n const accountEnvelope = record(response.account);\n if (\n accountEnvelope &&\n Object.hasOwn(accountEnvelope, \"account\") &&\n !record(accountEnvelope.account)\n ) {\n result.authenticated = false;\n result.available = \"unknown\";\n }\n return result;\n } catch {\n return unavailable(options);\n }\n}\n\nexport async function probeCodexCapacity(options: CodexProbeOptions): Promise<CapacityReport> {\n let parsed: UnknownRecord | null = null;\n try {\n const contents = await (options.readFile ?? readFile)(\n resolveCodexAuthPath(options.env),\n \"utf8\",\n );\n parsed = record(JSON.parse(contents));\n } catch {\n return cliFallback(options);\n }\n\n const auth = parsed ?? {};\n const pat = nonEmptyText(auth.personal_access_token);\n if (pat) {\n try {\n const fetcher = options.fetch ?? globalThis.fetch;\n const whoami = record(\n await fetchJson(\n fetcher,\n \"https://auth.openai.com/api/accounts/v1/user-auth-credential/whoami\",\n { headers: { Authorization: `Bearer ${pat}` } },\n options.timeoutMs ?? 5000,\n ),\n );\n const accountId = nonEmptyText(whoami?.chatgpt_account_id);\n if (!accountId) throw new Error(\"account unavailable\");\n return capacityFromSnapshot(await apiSnapshot(pat, accountId, \"pat\", options), options);\n } catch {\n // Continue to a separately available OAuth credential before using the CLI.\n }\n }\n\n const tokens = record(auth.tokens);\n const accessToken = nonEmptyText(tokens?.access_token);\n const accountId = nonEmptyText(tokens?.account_id);\n if (\n tokens &&\n accessToken &&\n accountId &&\n !staleOAuth(tokens, accessToken, (options.now ?? (() => new Date()))())\n ) {\n try {\n return capacityFromSnapshot(\n await apiSnapshot(accessToken, accountId, \"oauth\", options),\n options,\n );\n } catch {\n return cliFallback(options);\n }\n }\n return cliFallback(options);\n}\n"],"names":["spawn","readFile","join","parseWhamUsage","resetTime","safeIdentifier","toRateWindow","CODEX_APP_SERVER_ARGS","record","value","Array","isArray","finiteNumber","Number","isFinite","nonEmptyText","length","resolveCodexAuthPath","env","process","root","CODEX_HOME","HOME","parseUsage","raw","source","windows","creditsRemaining","cliWindow","id","label","input","durationMinutes","windowDurationMins","usedPercent","resetsAt","cliSnapshotWindows","fallbackId","snapshot","scope","limitId","primary","secondary","filter","item","parseCliUsage","response","rateLimits","buckets","rateLimitsByLimitId","Object","entries","push","unique","Map","map","window","values","capacityFromSnapshot","context","hasUsage","some","reached","rateLimitReachedType","resetCredits","rateLimitResetCredits","usageLimitResetCredits","harness","provider","generatedAt","checkedAt","authenticated","available","availableCount","jwtExpiry","token","part","split","JSON","parse","Buffer","from","toString","exp","staleOAuth","tokens","now","metadata","expires_at","expiresAt","expiry","parsed","Date","isNaN","getTime","fetchJson","fetcher","url","init","timeoutMs","controller","AbortController","timer","setTimeout","abort","signal","ok","Error","status","json","clearTimeout","apiSnapshot","accountId","options","fetch","globalThis","headers","Authorization","appServerRpc","messages","Promise","resolve","reject","child","stdio","results","buffer","settled","finish","error","kill","once","stdout","setEncoding","on","chunk","newline","indexOf","line","slice","trim","message","request","stdin","write","stringify","result","account","codexUnavailableReport","unavailable","cliFallback","installed","method","params","clientInfo","name","title","version","capabilities","rpc","requests","accountEnvelope","hasOwn","probeCodexCapacity","contents","auth","pat","personal_access_token","whoami","chatgpt_account_id","accessToken","access_token","account_id"],"mappings":"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"}
@@ -1,48 +0,0 @@
1
- import type { CapacityReport } from "./types.js";
2
- export type OpenAiUsageBucket = {
3
- startMs: number;
4
- tokens: number;
5
- };
6
- /**
7
- * Resolved OpenAI credential: a platform API key (env or Pi `openai` entry)
8
- * or the OAuth login Pi stores as `openai-codex` for ChatGPT-backed access.
9
- */
10
- export type OpenAiCredential = {
11
- kind: "platform";
12
- key: string;
13
- } | {
14
- kind: "oauth";
15
- access: string;
16
- accountId: string;
17
- expiresMs: number | null;
18
- };
19
- export type OpenAiCredentialOptions = {
20
- env?: NodeJS.ProcessEnv;
21
- readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
22
- };
23
- export type OpenAiProbeOptions = OpenAiCredentialOptions & {
24
- checkedAt: string;
25
- fetch?: typeof globalThis.fetch;
26
- timeoutMs?: number;
27
- };
28
- /**
29
- * Resolves the OpenAI credential in priority order: `OPENAI_API_KEY` env,
30
- * then the Pi `openai` platform-key entry, then the Pi `openai-codex` OAuth
31
- * login written by `pi login` (no manual setup required).
32
- */
33
- export declare function resolveOpenAiCredential(options?: OpenAiCredentialOptions): Promise<OpenAiCredential>;
34
- export declare function resolveOpenAiApiKey(options?: OpenAiCredentialOptions): Promise<string>;
35
- /**
36
- * Maps one OpenAI Usage API payload (day buckets of per-model token counts)
37
- * into summed UTC-day buckets. Entries without a numeric
38
- * aggregation_timestamp are skipped because they cannot be placed in time.
39
- */
40
- export declare function parseOpenAiUsage(raw: unknown): OpenAiUsageBucket[];
41
- /**
42
- * Builds the capacity report from merged day buckets: trailing-7-day and
43
- * current-UTC-day token usage. The platform is pay-as-you-go and exposes no
44
- * queryable limit, so windows report consumption only — no faked percentages.
45
- */
46
- export declare function buildOpenAiReport(buckets: OpenAiUsageBucket[], checkedAt: string): CapacityReport;
47
- export declare function probeOpenAiCapacity(options: OpenAiProbeOptions): Promise<CapacityReport>;
48
- //# sourceMappingURL=openai.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"openai.d.ts","sourceRoot":"","sources":["../../src/capacity/openai.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAkB,MAAM,YAAY,CAAC;AAYjE,MAAM,MAAM,iBAAiB,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAGpE;;;GAGG;AACH,MAAM,MAAM,gBAAgB,GACxB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,CAAC;AAEnF,MAAM,MAAM,uBAAuB,GAAG;IACpC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,kBAAkB,GAAG,uBAAuB,GAAG;IACzD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AA2CF;;;;GAIG;AACH,wBAAsB,uBAAuB,CAC3C,OAAO,GAAE,uBAA4B,GACpC,OAAO,CAAC,gBAAgB,CAAC,CAuB3B;AAED,wBAAsB,mBAAmB,CAAC,OAAO,GAAE,uBAA4B,GAAG,OAAO,CAAC,MAAM,CAAC,CAIhG;AAaD;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,EAAE,CAUlE;AAkBD;;;;GAIG;AACH,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAmCjG;AAyDD,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,cAAc,CAAC,CAgB9F"}
@@ -1,312 +0,0 @@
1
- import { readFile } from "node:fs/promises";
2
- import { homedir } from "node:os";
3
- import { join } from "node:path";
4
- import { parseWhamUsage } from "./wham.js";
5
- const OPENAI_USAGE_BASE_URL = "https://api.openai.com/v1/organization/usage";
6
- const OPENAI_MODELS_URL = "https://api.openai.com/v1/models";
7
- const WHAM_USAGE_URL = "https://chatgpt.com/backend-api/wham/usage";
8
- const OPENAI_USAGE_ENDPOINTS = [
9
- "completions",
10
- "responses"
11
- ];
12
- const USAGE_WINDOW_DAYS = 7;
13
- const DAY_MS = 24 * 60 * 60 * 1000;
14
- const MISSING_API_KEY_MESSAGE = "OpenAI credentials not found; set OPENAI_API_KEY, configure the Pi openai provider, or log in to OpenAI via Pi";
15
- const EPOCH_MS_FLOOR = 1e12;
16
- function record(value) {
17
- return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
18
- }
19
- function nonEmptyText(value) {
20
- return typeof value === "string" && value.trim() ? value.trim() : null;
21
- }
22
- function finiteNumber(value) {
23
- return typeof value === "number" && Number.isFinite(value) ? value : null;
24
- }
25
- /** Pi stores `expires` in epoch milliseconds, codex-style tokens use seconds. */ function toEpochMs(value) {
26
- const raw = finiteNumber(value);
27
- if (raw === null || raw <= 0) return null;
28
- return raw > EPOCH_MS_FLOOR ? raw : raw * 1000;
29
- }
30
- async function readPiAuthRoot(options) {
31
- const env = options.env ?? process.env;
32
- const authPath = join(env.HOME || homedir(), ".pi", "agent", "auth.json");
33
- let parsed;
34
- try {
35
- const contents = await (options.readFile ?? readFile)(authPath, "utf8");
36
- const root = record(JSON.parse(contents));
37
- if (!root) throw new Error("invalid");
38
- parsed = root;
39
- } catch (error) {
40
- if (record(error)?.code === "ENOENT") {
41
- throw new Error(MISSING_API_KEY_MESSAGE);
42
- }
43
- throw new Error("OpenAI Pi auth file is malformed");
44
- }
45
- return parsed;
46
- }
47
- /**
48
- * Resolves the OpenAI credential in priority order: `OPENAI_API_KEY` env,
49
- * then the Pi `openai` platform-key entry, then the Pi `openai-codex` OAuth
50
- * login written by `pi login` (no manual setup required).
51
- */ export async function resolveOpenAiCredential(options = {}) {
52
- const env = options.env ?? process.env;
53
- const environmentKey = nonEmptyText(env.OPENAI_API_KEY);
54
- if (environmentKey) return {
55
- kind: "platform",
56
- key: environmentKey
57
- };
58
- const parsed = await readPiAuthRoot(options);
59
- const platform = record(parsed.openai);
60
- if (platform) {
61
- const key = platform.type === "api_key" ? nonEmptyText(platform.key) : null;
62
- if (!key) {
63
- throw new Error("OpenAI Pi auth file has a malformed openai credential");
64
- }
65
- return {
66
- kind: "platform",
67
- key
68
- };
69
- }
70
- const oauth = record(parsed["openai-codex"]);
71
- const access = oauth?.type === "oauth" ? nonEmptyText(oauth.access) : null;
72
- const accountId = nonEmptyText(oauth?.accountId);
73
- if (oauth && access && accountId) {
74
- return {
75
- kind: "oauth",
76
- access,
77
- accountId,
78
- expiresMs: toEpochMs(oauth.expires)
79
- };
80
- }
81
- throw new Error(MISSING_API_KEY_MESSAGE);
82
- }
83
- export async function resolveOpenAiApiKey(options = {}) {
84
- const credential = await resolveOpenAiCredential(options);
85
- if (credential.kind === "platform") return credential.key;
86
- throw new Error(MISSING_API_KEY_MESSAGE);
87
- }
88
- function bucketTokens(value) {
89
- const results = Array.isArray(value) ? value : [];
90
- return results.reduce((total, entry)=>total + (finiteNumber(record(entry)?.input_tokens) ?? 0) + (finiteNumber(record(entry)?.output_tokens) ?? 0), 0);
91
- }
92
- /**
93
- * Maps one OpenAI Usage API payload (day buckets of per-model token counts)
94
- * into summed UTC-day buckets. Entries without a numeric
95
- * aggregation_timestamp are skipped because they cannot be placed in time.
96
- */ export function parseOpenAiUsage(raw) {
97
- const data = record(raw)?.data;
98
- if (!Array.isArray(data)) throw new Error("Invalid OpenAI usage response");
99
- const buckets = [];
100
- for (const entry of data){
101
- const seconds = finiteNumber(record(entry)?.aggregation_timestamp);
102
- if (seconds === null) continue;
103
- buckets.push({
104
- startMs: seconds * 1000,
105
- tokens: bucketTokens(record(entry)?.results)
106
- });
107
- }
108
- return buckets;
109
- }
110
- function openAiCapacityReport(windows, checkedAt, authenticated) {
111
- return {
112
- harness: "pi",
113
- provider: "openai",
114
- generatedAt: checkedAt,
115
- authenticated,
116
- available: windows.length > 0 ? "yes" : "unknown",
117
- windows,
118
- creditsRemaining: null
119
- };
120
- }
121
- /**
122
- * Builds the capacity report from merged day buckets: trailing-7-day and
123
- * current-UTC-day token usage. The platform is pay-as-you-go and exposes no
124
- * queryable limit, so windows report consumption only — no faked percentages.
125
- */ export function buildOpenAiReport(buckets, checkedAt) {
126
- const nowMs = Date.parse(checkedAt);
127
- const todayStartMs = Math.floor(nowMs / DAY_MS) * DAY_MS;
128
- const weekStartMs = todayStartMs - (USAGE_WINDOW_DAYS - 1) * DAY_MS;
129
- let todayTokens = 0;
130
- let weekTokens = 0;
131
- for (const bucket of buckets){
132
- if (bucket.startMs === todayStartMs) todayTokens += bucket.tokens;
133
- if (bucket.startMs >= weekStartMs) weekTokens += bucket.tokens;
134
- }
135
- const windows = [
136
- {
137
- id: "openai:tokens:today",
138
- label: "Tokens · today (UTC)",
139
- limitType: "TOKENS_LIMIT",
140
- durationMinutes: 24 * 60,
141
- usedPercent: null,
142
- resetsAt: new Date(todayStartMs + DAY_MS).toISOString(),
143
- total: null,
144
- current: todayTokens,
145
- remaining: null
146
- },
147
- {
148
- id: "openai:tokens:week",
149
- label: "Tokens · 7 days",
150
- limitType: "TOKENS_LIMIT",
151
- durationMinutes: USAGE_WINDOW_DAYS * 24 * 60,
152
- usedPercent: null,
153
- resetsAt: null,
154
- total: null,
155
- current: weekTokens,
156
- remaining: null
157
- }
158
- ];
159
- return openAiCapacityReport(windows, checkedAt, true);
160
- }
161
- async function fetchUsage(context) {
162
- const fetcher = context.fetch ?? globalThis.fetch;
163
- const endSeconds = Math.floor(Date.parse(context.checkedAt) / 1000);
164
- const startSeconds = endSeconds - USAGE_WINDOW_DAYS * 24 * 60 * 60;
165
- const query = `start_time=${startSeconds}&end_time=${endSeconds}`;
166
- const payloads = [];
167
- for (const endpoint of OPENAI_USAGE_ENDPOINTS){
168
- const controller = new AbortController();
169
- const timer = setTimeout(()=>controller.abort(), context.timeoutMs ?? 5000);
170
- let response;
171
- try {
172
- response = await fetcher(`${OPENAI_USAGE_BASE_URL}/${endpoint}?${query}`, {
173
- method: "GET",
174
- headers: {
175
- Authorization: `Bearer ${context.key}`
176
- },
177
- signal: controller.signal
178
- });
179
- } catch {
180
- throw new Error("OpenAI usage request failed");
181
- } finally{
182
- clearTimeout(timer);
183
- }
184
- if (response.status === 401) return null;
185
- if (response.status === 403) return response.status;
186
- if (response.status !== 200) {
187
- throw new Error(`OpenAI usage request failed: HTTP ${response.status}`);
188
- }
189
- try {
190
- payloads.push(await response.json());
191
- } catch {
192
- throw new Error("OpenAI usage response is not valid JSON");
193
- }
194
- }
195
- return payloads;
196
- }
197
- async function verifyKey(context) {
198
- const fetcher = context.fetch ?? globalThis.fetch;
199
- const controller = new AbortController();
200
- const timer = setTimeout(()=>controller.abort(), context.timeoutMs ?? 5000);
201
- try {
202
- const response = await fetcher(OPENAI_MODELS_URL, {
203
- method: "GET",
204
- headers: {
205
- Authorization: `Bearer ${context.key}`
206
- },
207
- signal: controller.signal
208
- });
209
- return response.status !== 401;
210
- } catch {
211
- throw new Error("OpenAI usage request failed");
212
- } finally{
213
- clearTimeout(timer);
214
- }
215
- }
216
- export async function probeOpenAiCapacity(options) {
217
- const credential = await resolveOpenAiCredential(options);
218
- if (credential.kind === "oauth") {
219
- return probeOpenAiOauthCapacity(credential, options);
220
- }
221
- const probe = {
222
- ...options,
223
- key: credential.key
224
- };
225
- const result = await fetchUsage(probe);
226
- if (result === null) {
227
- return openAiCapacityReport([], options.checkedAt, false);
228
- }
229
- if (typeof result === "number") {
230
- const authenticated = await verifyKey(probe);
231
- return openAiCapacityReport([], options.checkedAt, authenticated);
232
- }
233
- const buckets = result.flatMap(parseOpenAiUsage);
234
- return buildOpenAiReport(buckets, options.checkedAt);
235
- }
236
- /** Mirrors codex.ts: JWT `exp` (epoch seconds) as expiry fallback. */ function jwtExpiryMs(token) {
237
- const part = token.split(".")[1];
238
- if (!part) return null;
239
- try {
240
- const exp = finiteNumber(record(JSON.parse(Buffer.from(part, "base64url").toString("utf8")))?.exp);
241
- return exp === null ? null : exp * 1000;
242
- } catch {
243
- return null;
244
- }
245
- }
246
- function oauthExpired(credential, nowMs) {
247
- const expiryMs = credential.expiresMs ?? jwtExpiryMs(credential.access);
248
- return expiryMs !== null && expiryMs <= nowMs;
249
- }
250
- async function fetchWhamUsage(credential, options) {
251
- const fetcher = options.fetch ?? globalThis.fetch;
252
- const controller = new AbortController();
253
- const timer = setTimeout(()=>controller.abort(), options.timeoutMs ?? 5000);
254
- let response;
255
- try {
256
- response = await fetcher(WHAM_USAGE_URL, {
257
- method: "GET",
258
- headers: {
259
- Authorization: `Bearer ${credential.access}`,
260
- "ChatGPT-Account-Id": credential.accountId
261
- },
262
- signal: controller.signal
263
- });
264
- } catch {
265
- throw new Error("OpenAI usage request failed");
266
- } finally{
267
- clearTimeout(timer);
268
- }
269
- if (response.status === 401 || response.status === 403) return null;
270
- if (response.status !== 200) {
271
- throw new Error(`OpenAI usage request failed: HTTP ${response.status}`);
272
- }
273
- try {
274
- return await response.json();
275
- } catch {
276
- throw new Error("OpenAI usage response is not valid JSON");
277
- }
278
- }
279
- /**
280
- * OAuth path for Pi's OpenAI login: consumes the same wham/usage endpoint as
281
- * the codex harness. Stale logins are never fetched (no refresh, matching
282
- * codex.ts); they render as authenticated-but-stale instead.
283
- */ async function probeOpenAiOauthCapacity(credential, options) {
284
- const staleReport = {
285
- harness: "pi",
286
- provider: "openai",
287
- generatedAt: options.checkedAt,
288
- authenticated: true,
289
- available: "unknown",
290
- windows: [],
291
- creditsRemaining: null
292
- };
293
- const nowMs = Date.parse(options.checkedAt);
294
- if (Number.isNaN(nowMs) || oauthExpired(credential, nowMs)) return staleReport;
295
- const raw = await fetchWhamUsage(credential, options);
296
- if (raw === null) {
297
- return {
298
- ...staleReport,
299
- authenticated: false
300
- };
301
- }
302
- const snapshot = parseWhamUsage(raw);
303
- const hasUsage = snapshot.windows.some((window)=>window.usedPercent !== null);
304
- return {
305
- ...staleReport,
306
- available: hasUsage ? "yes" : "unknown",
307
- windows: snapshot.windows,
308
- creditsRemaining: snapshot.creditsRemaining
309
- };
310
- }
311
-
312
- //# sourceMappingURL=openai.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/capacity/openai.ts"],"sourcesContent":["import { readFile } from \"node:fs/promises\";\nimport { homedir } from \"node:os\";\nimport { join } from \"node:path\";\nimport { parseWhamUsage } from \"./wham.js\";\nimport type { CapacityReport, CapacityWindow } from \"./types.js\";\n\nconst OPENAI_USAGE_BASE_URL = \"https://api.openai.com/v1/organization/usage\";\nconst OPENAI_MODELS_URL = \"https://api.openai.com/v1/models\";\nconst WHAM_USAGE_URL = \"https://chatgpt.com/backend-api/wham/usage\";\nconst OPENAI_USAGE_ENDPOINTS = [\"completions\", \"responses\"] as const;\nconst USAGE_WINDOW_DAYS = 7;\nconst DAY_MS = 24 * 60 * 60 * 1000;\nconst MISSING_API_KEY_MESSAGE =\n \"OpenAI credentials not found; set OPENAI_API_KEY, configure the Pi openai provider, or log in to OpenAI via Pi\";\nconst EPOCH_MS_FLOOR = 1e12;\n\nexport type OpenAiUsageBucket = { startMs: number; tokens: number };\ntype UnknownRecord = Record<string, unknown>;\n\n/**\n * Resolved OpenAI credential: a platform API key (env or Pi `openai` entry)\n * or the OAuth login Pi stores as `openai-codex` for ChatGPT-backed access.\n */\nexport type OpenAiCredential =\n | { kind: \"platform\"; key: string }\n | { kind: \"oauth\"; access: string; accountId: string; expiresMs: number | null };\n\nexport type OpenAiCredentialOptions = {\n env?: NodeJS.ProcessEnv;\n readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;\n};\n\nexport type OpenAiProbeOptions = OpenAiCredentialOptions & {\n checkedAt: string;\n fetch?: typeof globalThis.fetch;\n timeoutMs?: number;\n};\ntype OpenAiRequestContext = OpenAiProbeOptions & { key: string };\ntype OAuthCredential = Extract<OpenAiCredential, { kind: \"oauth\" }>;\n\nfunction record(value: unknown): UnknownRecord | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.trim() ? value.trim() : null;\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\n/** Pi stores `expires` in epoch milliseconds, codex-style tokens use seconds. */\nfunction toEpochMs(value: unknown): number | null {\n const raw = finiteNumber(value);\n if (raw === null || raw <= 0) return null;\n return raw > EPOCH_MS_FLOOR ? raw : raw * 1000;\n}\n\nasync function readPiAuthRoot(options: OpenAiCredentialOptions): Promise<UnknownRecord> {\n const env = options.env ?? process.env;\n const authPath = join(env.HOME || homedir(), \".pi\", \"agent\", \"auth.json\");\n let parsed: UnknownRecord;\n try {\n const contents = await (options.readFile ?? readFile)(authPath, \"utf8\");\n const root = record(JSON.parse(contents));\n if (!root) throw new Error(\"invalid\");\n parsed = root;\n } catch (error) {\n if (record(error)?.code === \"ENOENT\") {\n throw new Error(MISSING_API_KEY_MESSAGE);\n }\n throw new Error(\"OpenAI Pi auth file is malformed\");\n }\n return parsed;\n}\n\n/**\n * Resolves the OpenAI credential in priority order: `OPENAI_API_KEY` env,\n * then the Pi `openai` platform-key entry, then the Pi `openai-codex` OAuth\n * login written by `pi login` (no manual setup required).\n */\nexport async function resolveOpenAiCredential(\n options: OpenAiCredentialOptions = {},\n): Promise<OpenAiCredential> {\n const env = options.env ?? process.env;\n const environmentKey = nonEmptyText(env.OPENAI_API_KEY);\n if (environmentKey) return { kind: \"platform\", key: environmentKey };\n\n const parsed = await readPiAuthRoot(options);\n\n const platform = record(parsed.openai);\n if (platform) {\n const key = platform.type === \"api_key\" ? nonEmptyText(platform.key) : null;\n if (!key) {\n throw new Error(\"OpenAI Pi auth file has a malformed openai credential\");\n }\n return { kind: \"platform\", key };\n }\n\n const oauth = record(parsed[\"openai-codex\"]);\n const access = oauth?.type === \"oauth\" ? nonEmptyText(oauth.access) : null;\n const accountId = nonEmptyText(oauth?.accountId);\n if (oauth && access && accountId) {\n return { kind: \"oauth\", access, accountId, expiresMs: toEpochMs(oauth.expires) };\n }\n throw new Error(MISSING_API_KEY_MESSAGE);\n}\n\nexport async function resolveOpenAiApiKey(options: OpenAiCredentialOptions = {}): Promise<string> {\n const credential = await resolveOpenAiCredential(options);\n if (credential.kind === \"platform\") return credential.key;\n throw new Error(MISSING_API_KEY_MESSAGE);\n}\n\nfunction bucketTokens(value: unknown): number {\n const results = Array.isArray(value) ? value : [];\n return results.reduce(\n (total, entry) =>\n total +\n (finiteNumber(record(entry)?.input_tokens) ?? 0) +\n (finiteNumber(record(entry)?.output_tokens) ?? 0),\n 0,\n );\n}\n\n/**\n * Maps one OpenAI Usage API payload (day buckets of per-model token counts)\n * into summed UTC-day buckets. Entries without a numeric\n * aggregation_timestamp are skipped because they cannot be placed in time.\n */\nexport function parseOpenAiUsage(raw: unknown): OpenAiUsageBucket[] {\n const data = record(raw)?.data;\n if (!Array.isArray(data)) throw new Error(\"Invalid OpenAI usage response\");\n const buckets: OpenAiUsageBucket[] = [];\n for (const entry of data) {\n const seconds = finiteNumber(record(entry)?.aggregation_timestamp);\n if (seconds === null) continue;\n buckets.push({ startMs: seconds * 1000, tokens: bucketTokens(record(entry)?.results) });\n }\n return buckets;\n}\n\nfunction openAiCapacityReport(\n windows: CapacityWindow[],\n checkedAt: string,\n authenticated: boolean,\n): CapacityReport {\n return {\n harness: \"pi\",\n provider: \"openai\",\n generatedAt: checkedAt,\n authenticated,\n available: windows.length > 0 ? \"yes\" : \"unknown\",\n windows,\n creditsRemaining: null,\n };\n}\n\n/**\n * Builds the capacity report from merged day buckets: trailing-7-day and\n * current-UTC-day token usage. The platform is pay-as-you-go and exposes no\n * queryable limit, so windows report consumption only — no faked percentages.\n */\nexport function buildOpenAiReport(buckets: OpenAiUsageBucket[], checkedAt: string): CapacityReport {\n const nowMs = Date.parse(checkedAt);\n const todayStartMs = Math.floor(nowMs / DAY_MS) * DAY_MS;\n const weekStartMs = todayStartMs - (USAGE_WINDOW_DAYS - 1) * DAY_MS;\n let todayTokens = 0;\n let weekTokens = 0;\n for (const bucket of buckets) {\n if (bucket.startMs === todayStartMs) todayTokens += bucket.tokens;\n if (bucket.startMs >= weekStartMs) weekTokens += bucket.tokens;\n }\n const windows: CapacityWindow[] = [\n {\n id: \"openai:tokens:today\",\n label: \"Tokens · today (UTC)\",\n limitType: \"TOKENS_LIMIT\",\n durationMinutes: 24 * 60,\n usedPercent: null,\n resetsAt: new Date(todayStartMs + DAY_MS).toISOString(),\n total: null,\n current: todayTokens,\n remaining: null,\n },\n {\n id: \"openai:tokens:week\",\n label: \"Tokens · 7 days\",\n limitType: \"TOKENS_LIMIT\",\n durationMinutes: USAGE_WINDOW_DAYS * 24 * 60,\n usedPercent: null,\n resetsAt: null,\n total: null,\n current: weekTokens,\n remaining: null,\n },\n ];\n return openAiCapacityReport(windows, checkedAt, true);\n}\n\nasync function fetchUsage(context: OpenAiRequestContext): Promise<unknown[] | number | null> {\n const fetcher = context.fetch ?? globalThis.fetch;\n const endSeconds = Math.floor(Date.parse(context.checkedAt) / 1000);\n const startSeconds = endSeconds - USAGE_WINDOW_DAYS * 24 * 60 * 60;\n const query = `start_time=${startSeconds}&end_time=${endSeconds}`;\n const payloads: unknown[] = [];\n for (const endpoint of OPENAI_USAGE_ENDPOINTS) {\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), context.timeoutMs ?? 5000);\n let response: Response;\n try {\n response = await fetcher(`${OPENAI_USAGE_BASE_URL}/${endpoint}?${query}`, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${context.key}`,\n },\n signal: controller.signal,\n });\n } catch {\n throw new Error(\"OpenAI usage request failed\");\n } finally {\n clearTimeout(timer);\n }\n if (response.status === 401) return null;\n if (response.status === 403) return response.status;\n if (response.status !== 200) {\n throw new Error(`OpenAI usage request failed: HTTP ${response.status}`);\n }\n try {\n payloads.push(await response.json());\n } catch {\n throw new Error(\"OpenAI usage response is not valid JSON\");\n }\n }\n return payloads;\n}\n\nasync function verifyKey(context: OpenAiRequestContext): Promise<boolean> {\n const fetcher = context.fetch ?? globalThis.fetch;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), context.timeoutMs ?? 5000);\n try {\n const response = await fetcher(OPENAI_MODELS_URL, {\n method: \"GET\",\n headers: { Authorization: `Bearer ${context.key}` },\n signal: controller.signal,\n });\n return response.status !== 401;\n } catch {\n throw new Error(\"OpenAI usage request failed\");\n } finally {\n clearTimeout(timer);\n }\n}\n\nexport async function probeOpenAiCapacity(options: OpenAiProbeOptions): Promise<CapacityReport> {\n const credential = await resolveOpenAiCredential(options);\n if (credential.kind === \"oauth\") {\n return probeOpenAiOauthCapacity(credential, options);\n }\n const probe: OpenAiProbeOptions & { key: string } = { ...options, key: credential.key };\n const result = await fetchUsage(probe);\n if (result === null) {\n return openAiCapacityReport([], options.checkedAt, false);\n }\n if (typeof result === \"number\") {\n const authenticated = await verifyKey(probe);\n return openAiCapacityReport([], options.checkedAt, authenticated);\n }\n const buckets = result.flatMap(parseOpenAiUsage);\n return buildOpenAiReport(buckets, options.checkedAt);\n}\n\n/** Mirrors codex.ts: JWT `exp` (epoch seconds) as expiry fallback. */\nfunction jwtExpiryMs(token: string): number | null {\n const part = token.split(\".\")[1];\n if (!part) return null;\n try {\n const exp = finiteNumber(\n record(JSON.parse(Buffer.from(part, \"base64url\").toString(\"utf8\")))?.exp,\n );\n return exp === null ? null : exp * 1000;\n } catch {\n return null;\n }\n}\n\nfunction oauthExpired(credential: OAuthCredential, nowMs: number): boolean {\n const expiryMs = credential.expiresMs ?? jwtExpiryMs(credential.access);\n return expiryMs !== null && expiryMs <= nowMs;\n}\n\nasync function fetchWhamUsage(\n credential: OAuthCredential,\n options: OpenAiProbeOptions,\n): Promise<unknown | null> {\n const fetcher = options.fetch ?? globalThis.fetch;\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), options.timeoutMs ?? 5000);\n let response: Response;\n try {\n response = await fetcher(WHAM_USAGE_URL, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${credential.access}`,\n \"ChatGPT-Account-Id\": credential.accountId,\n },\n signal: controller.signal,\n });\n } catch {\n throw new Error(\"OpenAI usage request failed\");\n } finally {\n clearTimeout(timer);\n }\n if (response.status === 401 || response.status === 403) return null;\n if (response.status !== 200) {\n throw new Error(`OpenAI usage request failed: HTTP ${response.status}`);\n }\n try {\n return await response.json();\n } catch {\n throw new Error(\"OpenAI usage response is not valid JSON\");\n }\n}\n\n/**\n * OAuth path for Pi's OpenAI login: consumes the same wham/usage endpoint as\n * the codex harness. Stale logins are never fetched (no refresh, matching\n * codex.ts); they render as authenticated-but-stale instead.\n */\nasync function probeOpenAiOauthCapacity(\n credential: OAuthCredential,\n options: OpenAiProbeOptions,\n): Promise<CapacityReport> {\n const staleReport: CapacityReport = {\n harness: \"pi\",\n provider: \"openai\",\n generatedAt: options.checkedAt,\n authenticated: true,\n available: \"unknown\",\n windows: [],\n creditsRemaining: null,\n };\n const nowMs = Date.parse(options.checkedAt);\n if (Number.isNaN(nowMs) || oauthExpired(credential, nowMs)) return staleReport;\n const raw = await fetchWhamUsage(credential, options);\n if (raw === null) {\n return { ...staleReport, authenticated: false };\n }\n const snapshot = parseWhamUsage(raw);\n const hasUsage = snapshot.windows.some((window) => window.usedPercent !== null);\n return {\n ...staleReport,\n available: hasUsage ? \"yes\" : \"unknown\",\n windows: snapshot.windows,\n creditsRemaining: snapshot.creditsRemaining,\n };\n}\n"],"names":["readFile","homedir","join","parseWhamUsage","OPENAI_USAGE_BASE_URL","OPENAI_MODELS_URL","WHAM_USAGE_URL","OPENAI_USAGE_ENDPOINTS","USAGE_WINDOW_DAYS","DAY_MS","MISSING_API_KEY_MESSAGE","EPOCH_MS_FLOOR","record","value","Array","isArray","nonEmptyText","trim","finiteNumber","Number","isFinite","toEpochMs","raw","readPiAuthRoot","options","env","process","authPath","HOME","parsed","contents","root","JSON","parse","Error","error","code","resolveOpenAiCredential","environmentKey","OPENAI_API_KEY","kind","key","platform","openai","type","oauth","access","accountId","expiresMs","expires","resolveOpenAiApiKey","credential","bucketTokens","results","reduce","total","entry","input_tokens","output_tokens","parseOpenAiUsage","data","buckets","seconds","aggregation_timestamp","push","startMs","tokens","openAiCapacityReport","windows","checkedAt","authenticated","harness","provider","generatedAt","available","length","creditsRemaining","buildOpenAiReport","nowMs","Date","todayStartMs","Math","floor","weekStartMs","todayTokens","weekTokens","bucket","id","label","limitType","durationMinutes","usedPercent","resetsAt","toISOString","current","remaining","fetchUsage","context","fetcher","fetch","globalThis","endSeconds","startSeconds","query","payloads","endpoint","controller","AbortController","timer","setTimeout","abort","timeoutMs","response","method","headers","Authorization","signal","clearTimeout","status","json","verifyKey","probeOpenAiCapacity","probeOpenAiOauthCapacity","probe","result","flatMap","jwtExpiryMs","token","part","split","exp","Buffer","from","toString","oauthExpired","expiryMs","fetchWhamUsage","staleReport","isNaN","snapshot","hasUsage","some","window"],"mappings":"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"}
@@ -1,16 +0,0 @@
1
- import type { CapacityWindow } from "./types.js";
2
- type WhamUsageSnapshot = {
3
- windows: CapacityWindow[];
4
- creditsRemaining: number | null;
5
- };
6
- export declare function resetTime(value: unknown): string | null;
7
- export declare function safeIdentifier(value: unknown): string | null;
8
- export declare function toRateWindow(value: unknown, id: string, label: string): CapacityWindow | null;
9
- /**
10
- * Parses the chatgpt.com backend wham/usage payload shared by every
11
- * OAuth-backed OpenAI consumer (codex harness and pi login) into generic
12
- * capacity windows plus the credit balance.
13
- */
14
- export declare function parseWhamUsage(raw: unknown): WhamUsageSnapshot;
15
- export {};
16
- //# sourceMappingURL=wham.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"wham.d.ts","sourceRoot":"","sources":["../../src/capacity/wham.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEjD,KAAK,iBAAiB,GAAG;IACvB,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC,CAAC;AAkBF,wBAAgB,SAAS,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAMvD;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,IAAI,CAK5D;AAED,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI,CAY7F;AAgBD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG,iBAAiB,CAY9D"}
@@ -1,66 +0,0 @@
1
- function record(value) {
2
- return value !== null && typeof value === "object" && !Array.isArray(value) ? value : null;
3
- }
4
- function finiteNumber(value) {
5
- return typeof value === "number" && Number.isFinite(value) ? value : null;
6
- }
7
- function nonEmptyText(value) {
8
- return typeof value === "string" && value.length > 0 ? value : null;
9
- }
10
- export function resetTime(value) {
11
- const seconds = finiteNumber(value);
12
- if (seconds !== null) return new Date(seconds * 1000).toISOString();
13
- if (typeof value === "string" && !Number.isNaN(Date.parse(value))) return new Date(value).toISOString();
14
- return null;
15
- }
16
- export function safeIdentifier(value) {
17
- const candidate = nonEmptyText(value);
18
- if (!candidate || !/^[a-z][a-z0-9_-]{0,63}$/i.test(candidate)) return null;
19
- if (/(?:account|token|secret|key)[_-]?\d{6,}/i.test(candidate)) return null;
20
- return candidate;
21
- }
22
- export function toRateWindow(value, id, label) {
23
- const input = record(value);
24
- if (!input) return null;
25
- const used = finiteNumber(input.used_percent);
26
- const seconds = finiteNumber(input.limit_window_seconds);
27
- return {
28
- id,
29
- label,
30
- durationMinutes: seconds === null ? null : seconds / 60,
31
- usedPercent: used,
32
- resetsAt: resetTime(input.reset_at)
33
- };
34
- }
35
- function extraWindows(value) {
36
- if (!Array.isArray(value)) return [];
37
- return value.flatMap((entry, index)=>{
38
- const limit = record(entry);
39
- if (!limit) return [];
40
- const scope = safeIdentifier(limit.limit_name) ?? `extra-${index + 1}`;
41
- const windows = record(limit.rate_limit) ?? limit;
42
- return [
43
- toRateWindow(windows.primary_window, `${scope}:primary`, `${scope} primary`),
44
- toRateWindow(windows.secondary_window, `${scope}:secondary`, `${scope} secondary`)
45
- ].filter((window)=>window !== null);
46
- });
47
- }
48
- /**
49
- * Parses the chatgpt.com backend wham/usage payload shared by every
50
- * OAuth-backed OpenAI consumer (codex harness and pi login) into generic
51
- * capacity windows plus the credit balance.
52
- */ export function parseWhamUsage(raw) {
53
- const response = record(raw) ?? {};
54
- const limits = record(response.rate_limit) ?? {};
55
- const credits = record(response.credits) ?? {};
56
- return {
57
- windows: [
58
- toRateWindow(limits.primary_window, "session", "Session"),
59
- toRateWindow(limits.secondary_window, "weekly", "Weekly"),
60
- ...extraWindows(response.additional_rate_limits)
61
- ].filter((window)=>window !== null),
62
- creditsRemaining: finiteNumber(credits.balance)
63
- };
64
- }
65
-
66
- //# sourceMappingURL=wham.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/capacity/wham.ts"],"sourcesContent":["import type { CapacityWindow } from \"./types.js\";\n\ntype WhamUsageSnapshot = {\n windows: CapacityWindow[];\n creditsRemaining: number | null;\n};\n\ntype UnknownRecord = Record<string, unknown>;\n\nfunction record(value: unknown): UnknownRecord | null {\n return value !== null && typeof value === \"object\" && !Array.isArray(value)\n ? (value as UnknownRecord)\n : null;\n}\n\nfunction finiteNumber(value: unknown): number | null {\n return typeof value === \"number\" && Number.isFinite(value) ? value : null;\n}\n\nfunction nonEmptyText(value: unknown): string | null {\n return typeof value === \"string\" && value.length > 0 ? value : null;\n}\n\nexport function resetTime(value: unknown): string | null {\n const seconds = finiteNumber(value);\n if (seconds !== null) return new Date(seconds * 1000).toISOString();\n if (typeof value === \"string\" && !Number.isNaN(Date.parse(value)))\n return new Date(value).toISOString();\n return null;\n}\n\nexport function safeIdentifier(value: unknown): string | null {\n const candidate = nonEmptyText(value);\n if (!candidate || !/^[a-z][a-z0-9_-]{0,63}$/i.test(candidate)) return null;\n if (/(?:account|token|secret|key)[_-]?\\d{6,}/i.test(candidate)) return null;\n return candidate;\n}\n\nexport function toRateWindow(value: unknown, id: string, label: string): CapacityWindow | null {\n const input = record(value);\n if (!input) return null;\n const used = finiteNumber(input.used_percent);\n const seconds = finiteNumber(input.limit_window_seconds);\n return {\n id,\n label,\n durationMinutes: seconds === null ? null : seconds / 60,\n usedPercent: used,\n resetsAt: resetTime(input.reset_at),\n };\n}\n\nfunction extraWindows(value: unknown): CapacityWindow[] {\n if (!Array.isArray(value)) return [];\n return value.flatMap((entry, index) => {\n const limit = record(entry);\n if (!limit) return [];\n const scope = safeIdentifier(limit.limit_name) ?? `extra-${index + 1}`;\n const windows = record(limit.rate_limit) ?? limit;\n return [\n toRateWindow(windows.primary_window, `${scope}:primary`, `${scope} primary`),\n toRateWindow(windows.secondary_window, `${scope}:secondary`, `${scope} secondary`),\n ].filter((window): window is CapacityWindow => window !== null);\n });\n}\n\n/**\n * Parses the chatgpt.com backend wham/usage payload shared by every\n * OAuth-backed OpenAI consumer (codex harness and pi login) into generic\n * capacity windows plus the credit balance.\n */\nexport function parseWhamUsage(raw: unknown): WhamUsageSnapshot {\n const response = record(raw) ?? {};\n const limits = record(response.rate_limit) ?? {};\n const credits = record(response.credits) ?? {};\n return {\n windows: [\n toRateWindow(limits.primary_window, \"session\", \"Session\"),\n toRateWindow(limits.secondary_window, \"weekly\", \"Weekly\"),\n ...extraWindows(response.additional_rate_limits),\n ].filter((window): window is CapacityWindow => window !== null),\n creditsRemaining: finiteNumber(credits.balance),\n };\n}\n"],"names":["record","value","Array","isArray","finiteNumber","Number","isFinite","nonEmptyText","length","resetTime","seconds","Date","toISOString","isNaN","parse","safeIdentifier","candidate","test","toRateWindow","id","label","input","used","used_percent","limit_window_seconds","durationMinutes","usedPercent","resetsAt","reset_at","extraWindows","flatMap","entry","index","limit","scope","limit_name","windows","rate_limit","primary_window","secondary_window","filter","window","parseWhamUsage","raw","response","limits","credits","additional_rate_limits","creditsRemaining","balance"],"mappings":"AASA,SAASA,OAAOC,KAAc;IAC5B,OAAOA,UAAU,QAAQ,OAAOA,UAAU,YAAY,CAACC,MAAMC,OAAO,CAACF,SAChEA,QACD;AACN;AAEA,SAASG,aAAaH,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYI,OAAOC,QAAQ,CAACL,SAASA,QAAQ;AACvE;AAEA,SAASM,aAAaN,KAAc;IAClC,OAAO,OAAOA,UAAU,YAAYA,MAAMO,MAAM,GAAG,IAAIP,QAAQ;AACjE;AAEA,OAAO,SAASQ,UAAUR,KAAc;IACtC,MAAMS,UAAUN,aAAaH;IAC7B,IAAIS,YAAY,MAAM,OAAO,IAAIC,KAAKD,UAAU,MAAME,WAAW;IACjE,IAAI,OAAOX,UAAU,YAAY,CAACI,OAAOQ,KAAK,CAACF,KAAKG,KAAK,CAACb,SACxD,OAAO,IAAIU,KAAKV,OAAOW,WAAW;IACpC,OAAO;AACT;AAEA,OAAO,SAASG,eAAed,KAAc;IAC3C,MAAMe,YAAYT,aAAaN;IAC/B,IAAI,CAACe,aAAa,CAAC,2BAA2BC,IAAI,CAACD,YAAY,OAAO;IACtE,IAAI,2CAA2CC,IAAI,CAACD,YAAY,OAAO;IACvE,OAAOA;AACT;AAEA,OAAO,SAASE,aAAajB,KAAc,EAAEkB,EAAU,EAAEC,KAAa;IACpE,MAAMC,QAAQrB,OAAOC;IACrB,IAAI,CAACoB,OAAO,OAAO;IACnB,MAAMC,OAAOlB,aAAaiB,MAAME,YAAY;IAC5C,MAAMb,UAAUN,aAAaiB,MAAMG,oBAAoB;IACvD,OAAO;QACLL;QACAC;QACAK,iBAAiBf,YAAY,OAAO,OAAOA,UAAU;QACrDgB,aAAaJ;QACbK,UAAUlB,UAAUY,MAAMO,QAAQ;IACpC;AACF;AAEA,SAASC,aAAa5B,KAAc;IAClC,IAAI,CAACC,MAAMC,OAAO,CAACF,QAAQ,OAAO,EAAE;IACpC,OAAOA,MAAM6B,OAAO,CAAC,CAACC,OAAOC;QAC3B,MAAMC,QAAQjC,OAAO+B;QACrB,IAAI,CAACE,OAAO,OAAO,EAAE;QACrB,MAAMC,QAAQnB,eAAekB,MAAME,UAAU,KAAK,CAAC,MAAM,EAAEH,QAAQ,GAAG;QACtE,MAAMI,UAAUpC,OAAOiC,MAAMI,UAAU,KAAKJ;QAC5C,OAAO;YACLf,aAAakB,QAAQE,cAAc,EAAE,GAAGJ,MAAM,QAAQ,CAAC,EAAE,GAAGA,MAAM,QAAQ,CAAC;YAC3EhB,aAAakB,QAAQG,gBAAgB,EAAE,GAAGL,MAAM,UAAU,CAAC,EAAE,GAAGA,MAAM,UAAU,CAAC;SAClF,CAACM,MAAM,CAAC,CAACC,SAAqCA,WAAW;IAC5D;AACF;AAEA;;;;CAIC,GACD,OAAO,SAASC,eAAeC,GAAY;IACzC,MAAMC,WAAW5C,OAAO2C,QAAQ,CAAC;IACjC,MAAME,SAAS7C,OAAO4C,SAASP,UAAU,KAAK,CAAC;IAC/C,MAAMS,UAAU9C,OAAO4C,SAASE,OAAO,KAAK,CAAC;IAC7C,OAAO;QACLV,SAAS;YACPlB,aAAa2B,OAAOP,cAAc,EAAE,WAAW;YAC/CpB,aAAa2B,OAAON,gBAAgB,EAAE,UAAU;eAC7CV,aAAae,SAASG,sBAAsB;SAChD,CAACP,MAAM,CAAC,CAACC,SAAqCA,WAAW;QAC1DO,kBAAkB5C,aAAa0C,QAAQG,OAAO;IAChD;AACF"}
@@ -1,14 +0,0 @@
1
- import type { CapacityReport } from "./types.js";
2
- export type ZaiCredentialOptions = {
3
- env?: NodeJS.ProcessEnv;
4
- readFile?: (path: string, encoding: BufferEncoding) => Promise<string>;
5
- };
6
- export type ZaiProbeOptions = ZaiCredentialOptions & {
7
- checkedAt: string;
8
- fetch?: typeof globalThis.fetch;
9
- timeoutMs?: number;
10
- };
11
- export declare function resolveZaiApiKey(options?: ZaiCredentialOptions): Promise<string>;
12
- export declare function parseZaiQuota(raw: unknown, checkedAt: string): CapacityReport;
13
- export declare function probeZaiCapacity(options: ZaiProbeOptions): Promise<CapacityReport>;
14
- //# sourceMappingURL=zai.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"zai.d.ts","sourceRoot":"","sources":["../../src/capacity/zai.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAGV,cAAc,EAEf,MAAM,YAAY,CAAC;AAkBpB,MAAM,MAAM,oBAAoB,GAAG;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;CACxE,CAAC;AAEF,MAAM,MAAM,eAAe,GAAG,oBAAoB,GAAG;IACnD,SAAS,EAAE,MAAM,CAAC;IAClB,KAAK,CAAC,EAAE,OAAO,UAAU,CAAC,KAAK,CAAC;IAChC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB,CAAC;AAqHF,wBAAsB,gBAAgB,CACpC,OAAO,GAAE,oBAAyB,GACjC,OAAO,CAAC,MAAM,CAAC,CA2BjB;AAED,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,GAAG,cAAc,CAuB7E;AAED,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,cAAc,CAAC,CA0BzB"}