@ai-devkit/agent-manager 0.36.0 → 0.37.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 (618) hide show
  1. package/dist/AgentManager.d.ts +9 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +21 -2
  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/openai.test.js +12 -14
  14. package/dist/__tests__/capacity/openai.test.js.map +1 -1
  15. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  16. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  17. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  18. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  20. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  21. package/dist/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.js +103 -22
  22. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  24. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  25. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  26. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  27. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  28. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  30. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  31. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  32. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  33. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  34. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  35. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  36. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  38. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  41. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  42. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  43. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  44. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  45. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  46. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  47. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  48. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  49. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  50. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  51. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  52. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  54. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  56. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  59. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  60. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  61. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  62. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  64. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  65. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  66. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  67. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  68. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  69. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  70. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  71. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  72. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  73. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  74. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  78. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  79. package/dist/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.js +137 -82
  80. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  81. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  82. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  83. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  84. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  90. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  91. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  92. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  93. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  94. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  95. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  96. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  97. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  98. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  99. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  105. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  106. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  107. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  108. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  109. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  110. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  111. package/dist/__tests__/utils/agents.test.js +66 -2
  112. package/dist/__tests__/utils/agents.test.js.map +1 -1
  113. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  114. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  115. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  116. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  117. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  118. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  119. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  120. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  121. package/dist/__tests__/utils/process.test.js +436 -2
  122. package/dist/__tests__/utils/process.test.js.map +1 -1
  123. package/dist/adapters/AgentAdapter.d.ts +25 -6
  124. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  125. package/dist/adapters/AgentAdapter.js +12 -3
  126. package/dist/adapters/AgentAdapter.js.map +1 -1
  127. package/dist/capacity/openai.d.ts +0 -1
  128. package/dist/capacity/openai.d.ts.map +1 -1
  129. package/dist/capacity/openai.js +0 -5
  130. package/dist/capacity/openai.js.map +1 -1
  131. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  132. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  133. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  134. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  135. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  136. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  137. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  138. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  139. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  140. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  141. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  142. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  143. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  144. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  145. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  146. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  147. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  148. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  149. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  150. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  151. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  152. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  153. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  154. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  155. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  156. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  157. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  158. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  159. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  160. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  161. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  162. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  163. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  164. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  165. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  166. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  167. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  169. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  170. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  171. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  172. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  173. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  174. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  175. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  176. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  177. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  178. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  179. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  180. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  181. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  182. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  183. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  184. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  185. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  186. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  187. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  190. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  191. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  192. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  193. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  195. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  196. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  197. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  198. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  199. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  200. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  201. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  202. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  203. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  204. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  205. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  206. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  207. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  208. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  209. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  210. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  211. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  212. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  213. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  214. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  215. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  216. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  217. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  218. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  219. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  220. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  221. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  222. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  223. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  224. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  225. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  226. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  227. package/dist/harnesses/gemini/fileSignature.js +9 -0
  228. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  229. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  230. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  231. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  232. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  233. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  234. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  235. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  236. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  237. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  238. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  239. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  240. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  241. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  242. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  243. package/dist/harnesses/index.d.ts +7 -0
  244. package/dist/harnesses/index.d.ts.map +1 -0
  245. package/dist/harnesses/index.js +27 -0
  246. package/dist/harnesses/index.js.map +1 -0
  247. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  248. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  249. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  250. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  251. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  252. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  253. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  254. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  255. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  256. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  257. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  258. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  259. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  260. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  262. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  263. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  264. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  265. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  266. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  267. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  268. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  269. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  270. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  271. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  272. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  273. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  274. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  275. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  276. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  277. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  278. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  279. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  280. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  281. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  282. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  283. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  284. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  285. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  286. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  287. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  288. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  289. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  290. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  291. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  292. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  293. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  294. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  295. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  296. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  297. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  298. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  299. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  300. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  301. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  303. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  304. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  305. package/dist/harnesses/shared.d.ts +41 -0
  306. package/dist/harnesses/shared.d.ts.map +1 -0
  307. package/dist/harnesses/shared.js +71 -0
  308. package/dist/harnesses/shared.js.map +1 -0
  309. package/dist/index.d.ts +26 -25
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +18 -17
  312. package/dist/index.js.map +1 -1
  313. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  314. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  315. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  316. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  317. package/dist/utils/agents.d.ts +3 -2
  318. package/dist/utils/agents.d.ts.map +1 -1
  319. package/dist/utils/agents.js +50 -15
  320. package/dist/utils/agents.js.map +1 -1
  321. package/dist/utils/index.d.ts +2 -1
  322. package/dist/utils/index.d.ts.map +1 -1
  323. package/dist/utils/index.js +1 -1
  324. package/dist/utils/index.js.map +1 -1
  325. package/dist/utils/jsonlTail.d.ts +73 -0
  326. package/dist/utils/jsonlTail.d.ts.map +1 -0
  327. package/dist/utils/jsonlTail.js +238 -0
  328. package/dist/utils/jsonlTail.js.map +1 -0
  329. package/dist/utils/matching.d.ts +2 -0
  330. package/dist/utils/matching.d.ts.map +1 -1
  331. package/dist/utils/matching.js +3 -2
  332. package/dist/utils/matching.js.map +1 -1
  333. package/dist/utils/matchingConstants.d.ts +15 -0
  334. package/dist/utils/matchingConstants.d.ts.map +1 -0
  335. package/dist/utils/matchingConstants.js +14 -0
  336. package/dist/utils/matchingConstants.js.map +1 -0
  337. package/dist/utils/process.d.ts +38 -2
  338. package/dist/utils/process.d.ts.map +1 -1
  339. package/dist/utils/process.js +131 -43
  340. package/dist/utils/process.js.map +1 -1
  341. package/package.json +2 -1
  342. package/scripts/benchmark-cold-start.mjs +350 -0
  343. package/src/AgentManager.ts +26 -5
  344. package/src/__tests__/AgentManager.test.ts +141 -3
  345. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  346. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  347. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  348. package/src/__tests__/capacity/openai.test.ts +5 -15
  349. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  350. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  351. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  352. package/src/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.ts +97 -25
  353. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  354. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  355. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  356. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  357. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  358. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  359. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  360. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  361. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  362. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  363. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  364. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  365. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  366. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  367. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  368. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  369. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  370. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  371. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  372. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  373. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  374. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  375. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  376. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  377. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  378. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  379. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  380. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  381. package/src/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.ts +127 -109
  382. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  383. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  384. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  385. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  386. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  387. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  388. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  389. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  390. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  391. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  392. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  393. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  394. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  395. package/src/__tests__/utils/agents.test.ts +76 -2
  396. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  397. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  398. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  399. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  400. package/src/__tests__/utils/process.test.ts +254 -0
  401. package/src/adapters/AgentAdapter.ts +37 -14
  402. package/src/capacity/openai.ts +0 -6
  403. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  404. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  405. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  406. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  407. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  408. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  409. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  410. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  411. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  412. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  413. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  414. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  415. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  416. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  417. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  418. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  419. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  420. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  421. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  422. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  423. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  424. package/src/harnesses/gemini/fileSignature.ts +10 -0
  425. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  426. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  427. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  428. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  429. package/src/harnesses/index.ts +28 -0
  430. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  431. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  432. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  433. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  434. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  435. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  436. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  437. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  438. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  439. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  440. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  441. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  442. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  443. package/src/harnesses/shared.ts +119 -0
  444. package/src/index.ts +26 -24
  445. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  446. package/src/utils/agents.ts +60 -28
  447. package/src/utils/index.ts +2 -0
  448. package/src/utils/jsonlTail.ts +349 -0
  449. package/src/utils/matching.ts +3 -3
  450. package/src/utils/matchingConstants.ts +15 -0
  451. package/src/utils/process.ts +189 -45
  452. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
  453. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  454. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  455. package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
  456. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  457. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  458. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  459. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  460. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  461. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  462. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  463. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  464. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  465. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  466. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  467. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  468. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  469. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  470. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  471. package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
  472. package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
  473. package/dist/adapters/AntigravityCliAdapter.js +0 -273
  474. package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
  475. package/dist/adapters/KiroAdapter.d.ts +0 -46
  476. package/dist/adapters/KiroAdapter.d.ts.map +0 -1
  477. package/dist/adapters/KiroAdapter.js +0 -344
  478. package/dist/adapters/KiroAdapter.js.map +0 -1
  479. package/dist/adapters/index.d.ts +0 -12
  480. package/dist/adapters/index.d.ts.map +0 -1
  481. package/dist/adapters/index.js +0 -12
  482. package/dist/adapters/index.js.map +0 -1
  483. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  484. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  485. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  486. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  487. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  488. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  489. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  490. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  491. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  492. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  493. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  494. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  495. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  496. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  497. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  498. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  499. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  500. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  501. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  502. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  503. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  504. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  505. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  506. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  507. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  508. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  509. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  510. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  511. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  512. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  513. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  514. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  515. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  516. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  517. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  518. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  519. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  520. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  521. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  522. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  523. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  524. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  525. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  526. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  527. package/dist/providers/grok/GrokSessionParser.js +0 -122
  528. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  529. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  530. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  531. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  532. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  533. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  534. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  535. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  536. package/dist/providers/pi/PiAdapter.js.map +0 -1
  537. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  538. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  539. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/pi/PiSessionLocator.js +0 -86
  541. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  542. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  543. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  544. package/dist/providers/pi/PiSessionParser.js +0 -191
  545. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  546. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  547. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  548. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  549. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  550. package/src/adapters/AntigravityCliAdapter.ts +0 -356
  551. package/src/adapters/KiroAdapter.ts +0 -456
  552. package/src/adapters/index.ts +0 -17
  553. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  554. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  555. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  556. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  557. package/src/providers/grok/GrokSessionParser.ts +0 -166
  558. package/src/providers/pi/PiSessionLocator.ts +0 -110
  559. package/src/providers/pi/PiSessionParser.ts +0 -284
  560. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  561. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  562. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  563. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  564. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  565. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  566. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  567. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  568. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  569. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  570. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  571. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  572. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  573. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  574. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  575. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  576. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  577. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  578. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  579. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  580. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  581. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  582. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  583. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  584. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  585. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  586. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  587. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  588. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  589. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  590. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  591. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  592. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  593. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  594. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  595. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  596. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  597. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  598. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  600. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  601. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  602. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  603. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  604. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  605. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  606. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  607. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  608. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  609. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  610. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  611. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  612. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  613. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  614. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  615. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  616. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  617. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  618. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -1 +1 @@
1
- {"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/AgentAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"AgentAdapter.d.ts","sourceRoot":"","sources":["../../src/adapters/AgentAdapter.ts"],"names":[],"mappings":"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"}
@@ -3,9 +3,18 @@
3
3
  *
4
4
  * Defines the contract for detecting and managing different types of AI agents.
5
5
  * Each adapter is responsible for detecting agents of a specific type (e.g., claude).
6
- */ /**
7
- * Type of AI agent
8
- */ /**
6
+ */ /** Every built-in harness type, in the order the CLI lists them. */ export const AGENT_TYPES = [
7
+ "claude",
8
+ "codex",
9
+ "gemini_cli",
10
+ "grok_cli",
11
+ "kiro",
12
+ "antigravity_cli",
13
+ "opencode",
14
+ "copilot",
15
+ "pi"
16
+ ];
17
+ /**
9
18
  * Current status of an agent
10
19
  */ export var AgentStatus = /*#__PURE__*/ function(AgentStatus) {
11
20
  AgentStatus["RUNNING"] = "running";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/adapters/AgentAdapter.ts"],"sourcesContent":["/**\n * Agent Adapter Interface\n *\n * Defines the contract for detecting and managing different types of AI agents.\n * Each adapter is responsible for detecting agents of a specific type (e.g., claude).\n */\n\n/**\n * Type of AI agent\n */\nexport type AgentType =\n | \"claude\"\n | \"gemini_cli\"\n | \"grok_cli\"\n | \"kiro\"\n | \"antigravity_cli\"\n | \"codex\"\n | \"opencode\"\n | \"copilot\"\n | \"pi\"\n | \"other\";\n\n/**\n * Current status of an agent\n */\nexport enum AgentStatus {\n RUNNING = \"running\",\n WAITING = \"waiting\",\n IDLE = \"idle\",\n UNKNOWN = \"unknown\",\n}\n\n/**\n * Information about a detected agent\n */\nexport interface AgentInfo {\n /** Project-based name (e.g., \"ai-devkit\" or \"ai-devkit (merry)\") */\n name: string;\n\n /** Type of agent */\n type: AgentType;\n\n /** Current status */\n status: AgentStatus;\n\n /** Last user prompt from history */\n summary: string;\n\n /** Process ID */\n pid: number;\n\n /** Working directory/project path */\n projectPath: string;\n\n /** Session UUID */\n sessionId: string;\n\n /** Timestamp of last activity */\n lastActive: Date;\n\n /** Whether the live process is pinned in the agent console */\n pinned?: boolean;\n\n /** Path to the session JSONL file on disk */\n sessionFilePath?: string;\n}\n\n/**\n * Information about a running process\n */\nexport interface ProcessInfo {\n /** Process ID */\n pid: number;\n\n /** Parent process ID, populated by process discovery when available */\n ppid?: number;\n\n /** Process command */\n command: string;\n\n /** Working directory */\n cwd: string;\n\n /** Terminal TTY (e.g., \"ttys030\") */\n tty: string;\n\n /** Process start time, populated by process enrichment */\n startTime?: Date;\n}\n\n/**\n * A single message in a conversation\n */\nexport interface ConversationMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n}\n\n/**\n * A historical session discovered on disk (running or not).\n *\n * Used by `listSessions` to surface enough context for a user to identify\n * a session and resume it via the originating tool's resume command.\n */\nexport interface SessionSummary {\n /** Tool that produced this session */\n type: AgentType;\n\n /**\n * ID accepted by the tool's resume command. Adapters MUST pass this\n * through verbatim — no normalization, no encoding/decoding — so it\n * round-trips into `claude --resume <id>` (and equivalents).\n */\n sessionId: string;\n\n /** Working directory the session was started in (best-known value) */\n cwd: string;\n\n /**\n * Trimmed first user message; empty string if none. Adapters apply\n * the same noise-filter their existing parsers use (skip tool_result\n * blocks, request-interruption notices, system-injected skill\n * content). The CLI table renderer substitutes a placeholder for\n * empty values; JSON output keeps the empty string raw.\n */\n firstUserMessage: string;\n\n /** Last activity timestamp (from session content; falls back to file mtime) */\n lastActive: Date;\n\n /** Session start time (from session content; falls back to file birthtime/mtime) */\n startedAt: Date;\n\n /** Absolute path to the session file on disk (debug/diagnostics) */\n sessionFilePath: string;\n}\n\n/**\n * Filters passed by the CLI to {@link AgentAdapter.listSessions}.\n *\n * The CLI is the source of truth for filter defaults and semantics\n * (e.g. cwd defaults to process.cwd(); --all clears it). Adapters apply\n * the values they receive — they don't invent defaults.\n */\nexport interface ListSessionsOptions {\n /**\n * Filter to sessions whose recorded cwd matches this path using strict\n * equality (no prefix/ancestor matching in v1). Undefined = no cwd\n * filter.\n */\n cwd?: string;\n\n /**\n * Filter to a single tool. Enforced by `AgentManager.listSessions`,\n * which skips adapters whose `type` doesn't match. Adapters MAY\n * ignore this field — by the time their `listSessions` runs, the\n * type filter is already satisfied. Undefined = include every\n * registered adapter.\n */\n type?: AgentType;\n}\n\nexport interface AgentDetectionContext {\n /** One enriched process snapshot shared across this manager refresh. */\n readonly processes: readonly ProcessInfo[];\n}\n\n/**\n * Agent Adapter Interface\n *\n * Implementations must provide detection logic for a specific agent type.\n */\nexport interface AgentAdapter {\n /** Type of agent this adapter handles */\n readonly type: AgentType;\n\n /** Executable basenames required for shared process discovery. */\n readonly processNames?: readonly string[];\n\n /**\n * Detect running agents of this type\n * @returns List of detected agents\n */\n detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;\n\n /**\n * Check if this adapter can handle the given process\n * @param processInfo Process information\n * @returns True if this adapter can handle the process\n */\n canHandle(processInfo: ProcessInfo): boolean;\n\n /**\n * Read the full conversation from a session file\n * @param sessionFilePath Path to the session JSONL file\n * @param options.verbose Include tool call/result details\n * @returns Array of conversation messages\n */\n getConversation(sessionFilePath: string, options?: { verbose?: boolean }): ConversationMessage[];\n\n /**\n * Enumerate historical sessions for this tool from disk.\n *\n * Applies `opts.cwd` as a strict-equality filter when set. Returns\n * {@link SessionSummary} entries unsorted; sorting and global filters\n * are handled by `AgentManager` and the CLI.\n *\n * @param opts Filter options computed by the CLI\n * @returns Array of sessions discovered on disk\n */\n listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;\n\n /**\n * Resolve exact historical session matches without enumerating every summary.\n *\n * Built-in adapters implement this using their provider-native storage shape.\n * The method remains optional so external adapters can fall back to\n * {@link listSessions} until they adopt direct lookup.\n */\n findSessionsById?(sessionId: string): Promise<SessionSummary[]>;\n}\n"],"names":["AgentStatus"],"mappings":"AAAA;;;;;CAKC,GAED;;CAEC,GAaD;;CAEC,GACD,OAAO,IAAA,AAAKA,qCAAAA;;;;;WAAAA;MAKX"}
1
+ {"version":3,"sources":["../../src/adapters/AgentAdapter.ts"],"sourcesContent":["/**\n * Agent Adapter Interface\n *\n * Defines the contract for detecting and managing different types of AI agents.\n * Each adapter is responsible for detecting agents of a specific type (e.g., claude).\n */\n\n/** Every built-in harness type, in the order the CLI lists them. */\nexport const AGENT_TYPES = [\n \"claude\",\n \"codex\",\n \"gemini_cli\",\n \"grok_cli\",\n \"kiro\",\n \"antigravity_cli\",\n \"opencode\",\n \"copilot\",\n \"pi\",\n] as const;\n\n/**\n * Type of AI agent\n */\nexport type AgentType = (typeof AGENT_TYPES)[number] | \"other\";\n\n/**\n * Current status of an agent\n */\nexport enum AgentStatus {\n RUNNING = \"running\",\n WAITING = \"waiting\",\n IDLE = \"idle\",\n UNKNOWN = \"unknown\",\n}\n\n/**\n * Information about a detected agent\n */\nexport interface AgentInfo {\n /** Project-based name (e.g., \"ai-devkit\" or \"ai-devkit (merry)\") */\n name: string;\n\n /** Type of agent */\n type: AgentType;\n\n /** Current status */\n status: AgentStatus;\n\n /** Last user prompt from history */\n summary: string;\n\n /** Process ID */\n pid: number;\n\n /** Working directory/project path */\n projectPath: string;\n\n /** Session UUID */\n sessionId: string;\n\n /** Timestamp of last activity */\n lastActive: Date;\n\n /** Whether the live process is pinned in the agent console */\n pinned?: boolean;\n\n /** Path to the session JSONL file on disk */\n sessionFilePath?: string;\n}\n\n/**\n * Information about a running process\n */\nexport interface ProcessInfo {\n /** Process ID */\n pid: number;\n\n /** Parent process ID, populated by process discovery when available */\n ppid?: number;\n\n /** Process command */\n command: string;\n\n /** Working directory */\n cwd: string;\n\n /** Terminal TTY (e.g., \"ttys030\") */\n tty: string;\n\n /** Process start time, populated by process enrichment */\n startTime?: Date;\n}\n\n/**\n * A single message in a conversation\n */\nexport interface ConversationMessage {\n role: \"user\" | \"assistant\" | \"system\";\n content: string;\n timestamp?: string;\n}\n\n/**\n * Options for {@link AgentAdapter.getConversation}.\n */\nexport interface ConversationOptions {\n /** Include tool call/result details */\n verbose?: boolean;\n /**\n * Return only the last `tail` messages (after verbose filtering). When\n * omitted or not a positive integer, the full conversation is returned.\n *\n * JSONL-backed adapters read backward from the end of the file and, on\n * later calls, parse only appended bytes, so cost is proportional to the\n * tail rather than the transcript size. Adapters backed by a single JSON\n * document (Gemini) or a database (OpenCode) still read the whole source\n * and slice; callers should keep an mtime cache for those.\n */\n tail?: number;\n}\n\n/**\n * A historical session discovered on disk (running or not).\n *\n * Used by `listSessions` to surface enough context for a user to identify\n * a session and resume it via the originating tool's resume command.\n */\nexport interface SessionSummary {\n /** Tool that produced this session */\n type: AgentType;\n\n /**\n * ID accepted by the tool's resume command. Adapters MUST pass this\n * through verbatim — no normalization, no encoding/decoding — so it\n * round-trips into `claude --resume <id>` (and equivalents).\n */\n sessionId: string;\n\n /** Working directory the session was started in (best-known value) */\n cwd: string;\n\n /**\n * Trimmed first user message; empty string if none. Adapters apply\n * the same noise-filter their existing parsers use (skip tool_result\n * blocks, request-interruption notices, system-injected skill\n * content). The CLI table renderer substitutes a placeholder for\n * empty values; JSON output keeps the empty string raw.\n */\n firstUserMessage: string;\n\n /** Last activity timestamp (from session content; falls back to file mtime) */\n lastActive: Date;\n\n /** Session start time (from session content; falls back to file birthtime/mtime) */\n startedAt: Date;\n\n /** Absolute path to the session file on disk (debug/diagnostics) */\n sessionFilePath: string;\n}\n\n/**\n * Filters passed by the CLI to {@link AgentAdapter.listSessions}.\n *\n * The CLI is the source of truth for filter defaults and semantics\n * (e.g. cwd defaults to process.cwd(); --all clears it). Adapters apply\n * the values they receive — they don't invent defaults.\n */\nexport interface ListSessionsOptions {\n /**\n * Filter to sessions whose recorded cwd matches this path using strict\n * equality (no prefix/ancestor matching in v1). Undefined = no cwd\n * filter.\n */\n cwd?: string;\n\n /**\n * Filter to a single tool. Enforced by `AgentManager.listSessions`,\n * which skips adapters whose `type` doesn't match. Adapters MAY\n * ignore this field — by the time their `listSessions` runs, the\n * type filter is already satisfied. Undefined = include every\n * registered adapter.\n */\n type?: AgentType;\n}\n\nexport interface AgentDetectionContext {\n /** One enriched process snapshot shared across this manager refresh. */\n readonly processes: readonly ProcessInfo[];\n}\n\n/**\n * Agent Adapter Interface\n *\n * Implementations must provide detection logic for a specific agent type.\n */\nexport interface AgentAdapter {\n /** Type of agent this adapter handles */\n readonly type: AgentType;\n\n /** Executable basenames required for shared process discovery. */\n readonly processNames?: readonly string[];\n\n /**\n * Detect running agents of this type\n * @returns List of detected agents\n */\n detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;\n\n /**\n * Check if this adapter can handle the given process\n * @param processInfo Process information\n * @returns True if this adapter can handle the process\n */\n canHandle(processInfo: ProcessInfo): boolean;\n\n /**\n * Read the conversation from a session file\n * @param sessionFilePath Path to the session JSONL file\n * @param options.verbose Include tool call/result details\n * @param options.tail Return only the last N messages (see {@link ConversationOptions.tail})\n * @returns Array of conversation messages\n */\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];\n\n /**\n * Enumerate historical sessions for this tool from disk.\n *\n * Applies `opts.cwd` as a strict-equality filter when set. Returns\n * {@link SessionSummary} entries unsorted; sorting and global filters\n * are handled by `AgentManager` and the CLI.\n *\n * @param opts Filter options computed by the CLI\n * @returns Array of sessions discovered on disk\n */\n listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;\n\n /**\n * Resolve exact historical session matches without enumerating every summary.\n *\n * Built-in adapters implement this using their harness-native storage shape.\n * The method remains optional so external adapters can fall back to\n * {@link listSessions} until they adopt direct lookup.\n */\n findSessionsById?(sessionId: string): Promise<SessionSummary[]>;\n}\n"],"names":["AGENT_TYPES","AgentStatus"],"mappings":"AAAA;;;;;CAKC,GAED,kEAAkE,GAClE,OAAO,MAAMA,cAAc;IACzB;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACD,CAAU;AAOX;;CAEC,GACD,OAAO,IAAA,AAAKC,qCAAAA;;;;;WAAAA;MAKX"}
@@ -31,7 +31,6 @@ export type OpenAiProbeOptions = OpenAiCredentialOptions & {
31
31
  * login written by `pi login` (no manual setup required).
32
32
  */
33
33
  export declare function resolveOpenAiCredential(options?: OpenAiCredentialOptions): Promise<OpenAiCredential>;
34
- export declare function resolveOpenAiApiKey(options?: OpenAiCredentialOptions): Promise<string>;
35
34
  /**
36
35
  * Maps one OpenAI Usage API payload (day buckets of per-model token counts)
37
36
  * into summed UTC-day buckets. Entries without a numeric
@@ -1 +1 @@
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
+ {"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;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"}
@@ -80,11 +80,6 @@ async function readPiAuthRoot(options) {
80
80
  }
81
81
  throw new Error(MISSING_API_KEY_MESSAGE);
82
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
83
  function bucketTokens(value) {
89
84
  const results = Array.isArray(value) ? value : [];
90
85
  return results.reduce((total, entry)=>total + (finiteNumber(record(entry)?.input_tokens) ?? 0) + (finiteNumber(record(entry)?.output_tokens) ?? 0), 0);
@@ -1 +1 @@
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
+ {"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\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","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","credential","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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"}
@@ -0,0 +1,13 @@
1
+ import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { AntigravitySessionParser, type AntigravitySession } from "./AntigravitySessionParser.js";
3
+ export interface AntigravitySessionAgentInput {
4
+ session: AntigravitySession;
5
+ processInfo: ProcessInfo;
6
+ }
7
+ export declare class AntigravityAgentMapper {
8
+ private readonly parser;
9
+ constructor(parser?: AntigravitySessionParser);
10
+ mapSessionToAgent({ session, processInfo }: AntigravitySessionAgentInput): AgentInfo;
11
+ mapProcessOnlyAgent(processInfo: ProcessInfo, cwd: string): AgentInfo;
12
+ }
13
+ //# sourceMappingURL=AntigravityAgentMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AntigravityAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/antigravity/AntigravityAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,wBAAwB,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AAElG,MAAM,WAAW,4BAA4B;IAC3C,OAAO,EAAE,kBAAkB,CAAC;IAC5B,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,qBAAa,sBAAsB;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,wBAAyD;IAE9F,iBAAiB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,4BAA4B,GAAG,SAAS;IAcpF,mBAAmB,CAAC,WAAW,EAAE,WAAW,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS;CAMtE"}
@@ -0,0 +1,30 @@
1
+ import { generateAgentName } from "../../utils/matching.js";
2
+ import { processOnlyAgent } from "../shared.js";
3
+ import { AntigravitySessionParser } from "./AntigravitySessionParser.js";
4
+ export class AntigravityAgentMapper {
5
+ parser;
6
+ constructor(parser = new AntigravitySessionParser()){
7
+ this.parser = parser;
8
+ }
9
+ mapSessionToAgent({ session, processInfo }) {
10
+ return {
11
+ name: generateAgentName(session.projectPath, processInfo.pid),
12
+ type: "antigravity_cli",
13
+ status: this.parser.determineStatus(session),
14
+ summary: session.lastUserMessage || "Antigravity CLI session active",
15
+ pid: processInfo.pid,
16
+ projectPath: session.projectPath,
17
+ sessionId: session.sessionId,
18
+ lastActive: session.lastActive,
19
+ sessionFilePath: session.sessionFilePath
20
+ };
21
+ }
22
+ mapProcessOnlyAgent(processInfo, cwd) {
23
+ return processOnlyAgent("antigravity_cli", processInfo, {
24
+ summary: "Antigravity CLI process running",
25
+ cwd
26
+ });
27
+ }
28
+ }
29
+
30
+ //# sourceMappingURL=AntigravityAgentMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/antigravity/AntigravityAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { processOnlyAgent } from \"../shared.js\";\nimport { AntigravitySessionParser, type AntigravitySession } from \"./AntigravitySessionParser.js\";\n\nexport interface AntigravitySessionAgentInput {\n session: AntigravitySession;\n processInfo: ProcessInfo;\n}\n\nexport class AntigravityAgentMapper {\n constructor(private readonly parser: AntigravitySessionParser = new AntigravitySessionParser()) {}\n\n mapSessionToAgent({ session, processInfo }: AntigravitySessionAgentInput): AgentInfo {\n return {\n name: generateAgentName(session.projectPath, processInfo.pid),\n type: \"antigravity_cli\",\n status: this.parser.determineStatus(session),\n summary: session.lastUserMessage || \"Antigravity CLI session active\",\n pid: processInfo.pid,\n projectPath: session.projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: session.sessionFilePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo, cwd: string): AgentInfo {\n return processOnlyAgent(\"antigravity_cli\", processInfo, {\n summary: \"Antigravity CLI process running\",\n cwd,\n });\n }\n}\n"],"names":["generateAgentName","processOnlyAgent","AntigravitySessionParser","AntigravityAgentMapper","parser","mapSessionToAgent","session","processInfo","name","projectPath","pid","type","status","determineStatus","summary","lastUserMessage","sessionId","lastActive","sessionFilePath","mapProcessOnlyAgent","cwd"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,0BAA0B;AAC5D,SAASC,gBAAgB,QAAQ,eAAe;AAChD,SAASC,wBAAwB,QAAiC,gCAAgC;AAOlG,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAAmC,IAAIF,0BAA0B,CAAE;aAAnEE,SAAAA;IAAoE;IAEjGC,kBAAkB,EAAEC,OAAO,EAAEC,WAAW,EAAgC,EAAa;QACnF,OAAO;YACLC,MAAMR,kBAAkBM,QAAQG,WAAW,EAAEF,YAAYG,GAAG;YAC5DC,MAAM;YACNC,QAAQ,IAAI,CAACR,MAAM,CAACS,eAAe,CAACP;YACpCQ,SAASR,QAAQS,eAAe,IAAI;YACpCL,KAAKH,YAAYG,GAAG;YACpBD,aAAaH,QAAQG,WAAW;YAChCO,WAAWV,QAAQU,SAAS;YAC5BC,YAAYX,QAAQW,UAAU;YAC9BC,iBAAiBZ,QAAQY,eAAe;QAC1C;IACF;IAEAC,oBAAoBZ,WAAwB,EAAEa,GAAW,EAAa;QACpE,OAAOnB,iBAAiB,mBAAmBM,aAAa;YACtDO,SAAS;YACTM;QACF;IACF;AACF"}
@@ -0,0 +1,32 @@
1
+ import type { AgentAdapter, AgentDetectionContext, AgentInfo, ProcessInfo, ConversationMessage, ConversationOptions, SessionSummary, ListSessionsOptions } from "../../adapters/AgentAdapter.js";
2
+ /**
3
+ * Antigravity CLI Adapter
4
+ *
5
+ * Detects running Antigravity CLI agents (Google's `agy` native binary) by:
6
+ * 1. Filtering `agy` processes from the shared process snapshot.
7
+ * 2. Resolving each process to its conversation via
8
+ * ~/.gemini/antigravity-cli/cache/last_conversations.json, a
9
+ * `{ <cwd>: <conversationId> }` map keyed by the process cwd.
10
+ * 3. Reading brain/<conversationId>/.system_generated/logs/transcript.jsonl;
11
+ * the last user request is the summary.
12
+ *
13
+ * This is the runtime side of Antigravity, independent of the `antigravity`
14
+ * environment that configures the Antigravity IDE.
15
+ */
16
+ export declare class AntigravityCliAdapter implements AgentAdapter {
17
+ readonly type: "antigravity_cli";
18
+ readonly processNames: readonly ["agy"];
19
+ private parser;
20
+ private mapper;
21
+ private locator;
22
+ constructor();
23
+ canHandle(processInfo: ProcessInfo): boolean;
24
+ detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
25
+ private detectRunningAgents;
26
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
27
+ listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
28
+ /** Only registered conversations are listed, so look the id up in the registry. */
29
+ findSessionsById(sessionId: string): Promise<SessionSummary[]>;
30
+ private toSessionSummary;
31
+ }
32
+ //# sourceMappingURL=AntigravityCliAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AntigravityCliAdapter.d.ts","sourceRoot":"","sources":["../../../src/harnesses/antigravity/AntigravityCliAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,YAAY,EACZ,qBAAqB,EACrB,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACpB,MAAM,gCAAgC,CAAC;AAMxC;;;;;;;;;;;;;GAaG;AACH,qBAAa,qBAAsB,YAAW,YAAY;IACxD,QAAQ,CAAC,IAAI,EAAG,iBAAiB,CAAU;IAC3C,QAAQ,CAAC,YAAY,mBAAoB;IAEzC,OAAO,CAAC,MAAM,CAA2B;IACzC,OAAO,CAAC,MAAM,CAAyB;IACvC,OAAO,CAAC,OAAO,CAA4B;;IAQ3C,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAS3D,mBAAmB;IA0BjC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAIxF,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAgBzE,mFAAmF;IAC7E,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAWpE,OAAO,CAAC,gBAAgB;CAWzB"}
@@ -0,0 +1,97 @@
1
+ import { findHarnessProcesses, matchesExecutable } from "../shared.js";
2
+ import { AntigravityAgentMapper } from "./AntigravityAgentMapper.js";
3
+ import { AntigravitySessionLocator } from "./AntigravitySessionLocator.js";
4
+ import { AntigravitySessionParser } from "./AntigravitySessionParser.js";
5
+ /**
6
+ * Antigravity CLI Adapter
7
+ *
8
+ * Detects running Antigravity CLI agents (Google's `agy` native binary) by:
9
+ * 1. Filtering `agy` processes from the shared process snapshot.
10
+ * 2. Resolving each process to its conversation via
11
+ * ~/.gemini/antigravity-cli/cache/last_conversations.json, a
12
+ * `{ <cwd>: <conversationId> }` map keyed by the process cwd.
13
+ * 3. Reading brain/<conversationId>/.system_generated/logs/transcript.jsonl;
14
+ * the last user request is the summary.
15
+ *
16
+ * This is the runtime side of Antigravity, independent of the `antigravity`
17
+ * environment that configures the Antigravity IDE.
18
+ */ export class AntigravityCliAdapter {
19
+ type = "antigravity_cli";
20
+ processNames = [
21
+ "agy"
22
+ ];
23
+ parser;
24
+ mapper;
25
+ locator;
26
+ constructor(){
27
+ this.parser = new AntigravitySessionParser();
28
+ this.mapper = new AntigravityAgentMapper(this.parser);
29
+ this.locator = new AntigravitySessionLocator();
30
+ }
31
+ canHandle(processInfo) {
32
+ return matchesExecutable(processInfo.command, "agy");
33
+ }
34
+ async detectAgents(context) {
35
+ try {
36
+ return await this.detectRunningAgents(context);
37
+ } finally{
38
+ // Drop cached summaries for sessions that were not part of this refresh
39
+ this.parser.pruneSessionCache();
40
+ }
41
+ }
42
+ async detectRunningAgents(context) {
43
+ const { processes } = await findHarnessProcesses(this, context);
44
+ if (processes.length === 0) {
45
+ return [];
46
+ }
47
+ const agents = [];
48
+ for (const { process: proc, cwd, conversation } of this.locator.matchRunningProcesses(processes)){
49
+ const session = conversation ? this.parser.readSessionIncremental(conversation.conversationId, conversation.transcriptPath, cwd) : null;
50
+ if (session) {
51
+ agents.push(this.mapper.mapSessionToAgent({
52
+ session,
53
+ processInfo: proc
54
+ }));
55
+ } else {
56
+ agents.push(this.mapper.mapProcessOnlyAgent(proc, cwd));
57
+ }
58
+ }
59
+ return agents;
60
+ }
61
+ getConversation(sessionFilePath, options) {
62
+ return this.parser.getConversation(sessionFilePath, options);
63
+ }
64
+ async listSessions(opts) {
65
+ const filterCwd = opts?.cwd;
66
+ const summaries = [];
67
+ for (const { cwd, conversationId, transcriptPath } of this.locator.listConversations()){
68
+ if (filterCwd !== undefined && cwd !== filterCwd) continue;
69
+ const session = this.parser.readSession(conversationId, transcriptPath, cwd);
70
+ if (!session) continue;
71
+ summaries.push(this.toSessionSummary(session));
72
+ }
73
+ return summaries;
74
+ }
75
+ /** Only registered conversations are listed, so look the id up in the registry. */ async findSessionsById(sessionId) {
76
+ const summaries = [];
77
+ for (const { cwd, conversationId, transcriptPath } of this.locator.listConversations()){
78
+ if (conversationId !== sessionId) continue;
79
+ const session = this.parser.readSession(conversationId, transcriptPath, cwd);
80
+ if (session) summaries.push(this.toSessionSummary(session));
81
+ }
82
+ return summaries;
83
+ }
84
+ toSessionSummary(session) {
85
+ return {
86
+ type: this.type,
87
+ sessionId: session.sessionId,
88
+ cwd: session.projectPath,
89
+ firstUserMessage: session.firstUserMessage || "",
90
+ lastActive: session.lastActive,
91
+ startedAt: session.sessionStart,
92
+ sessionFilePath: session.sessionFilePath
93
+ };
94
+ }
95
+ }
96
+
97
+ //# sourceMappingURL=AntigravityCliAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/antigravity/AntigravityCliAdapter.ts"],"sourcesContent":["import type {\n AgentAdapter,\n AgentDetectionContext,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n ConversationOptions,\n SessionSummary,\n ListSessionsOptions,\n} from \"../../adapters/AgentAdapter.js\";\nimport { findHarnessProcesses, matchesExecutable } from \"../shared.js\";\nimport { AntigravityAgentMapper } from \"./AntigravityAgentMapper.js\";\nimport { AntigravitySessionLocator } from \"./AntigravitySessionLocator.js\";\nimport { AntigravitySessionParser, type AntigravitySession } from \"./AntigravitySessionParser.js\";\n\n/**\n * Antigravity CLI Adapter\n *\n * Detects running Antigravity CLI agents (Google's `agy` native binary) by:\n * 1. Filtering `agy` processes from the shared process snapshot.\n * 2. Resolving each process to its conversation via\n * ~/.gemini/antigravity-cli/cache/last_conversations.json, a\n * `{ <cwd>: <conversationId> }` map keyed by the process cwd.\n * 3. Reading brain/<conversationId>/.system_generated/logs/transcript.jsonl;\n * the last user request is the summary.\n *\n * This is the runtime side of Antigravity, independent of the `antigravity`\n * environment that configures the Antigravity IDE.\n */\nexport class AntigravityCliAdapter implements AgentAdapter {\n readonly type = \"antigravity_cli\" as const;\n readonly processNames = [\"agy\"] as const;\n\n private parser: AntigravitySessionParser;\n private mapper: AntigravityAgentMapper;\n private locator: AntigravitySessionLocator;\n\n constructor() {\n this.parser = new AntigravitySessionParser();\n this.mapper = new AntigravityAgentMapper(this.parser);\n this.locator = new AntigravitySessionLocator();\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return matchesExecutable(processInfo.command, \"agy\");\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n try {\n return await this.detectRunningAgents(context);\n } finally {\n // Drop cached summaries for sessions that were not part of this refresh\n this.parser.pruneSessionCache();\n }\n }\n\n private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const { processes } = await findHarnessProcesses(this, context);\n if (processes.length === 0) {\n return [];\n }\n\n const agents: AgentInfo[] = [];\n for (const { process: proc, cwd, conversation } of this.locator.matchRunningProcesses(\n processes,\n )) {\n const session = conversation\n ? this.parser.readSessionIncremental(\n conversation.conversationId,\n conversation.transcriptPath,\n cwd,\n )\n : null;\n if (session) {\n agents.push(this.mapper.mapSessionToAgent({ session, processInfo: proc }));\n } else {\n agents.push(this.mapper.mapProcessOnlyAgent(proc, cwd));\n }\n }\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const filterCwd = opts?.cwd;\n const summaries: SessionSummary[] = [];\n\n for (const { cwd, conversationId, transcriptPath } of this.locator.listConversations()) {\n if (filterCwd !== undefined && cwd !== filterCwd) continue;\n\n const session = this.parser.readSession(conversationId, transcriptPath, cwd);\n if (!session) continue;\n\n summaries.push(this.toSessionSummary(session));\n }\n\n return summaries;\n }\n\n /** Only registered conversations are listed, so look the id up in the registry. */\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n for (const { cwd, conversationId, transcriptPath } of this.locator.listConversations()) {\n if (conversationId !== sessionId) continue;\n\n const session = this.parser.readSession(conversationId, transcriptPath, cwd);\n if (session) summaries.push(this.toSessionSummary(session));\n }\n return summaries;\n }\n\n private toSessionSummary(session: AntigravitySession): SessionSummary {\n return {\n type: this.type,\n sessionId: session.sessionId,\n cwd: session.projectPath,\n firstUserMessage: session.firstUserMessage || \"\",\n lastActive: session.lastActive,\n startedAt: session.sessionStart,\n sessionFilePath: session.sessionFilePath,\n };\n }\n}\n"],"names":["findHarnessProcesses","matchesExecutable","AntigravityAgentMapper","AntigravitySessionLocator","AntigravitySessionParser","AntigravityCliAdapter","type","processNames","parser","mapper","locator","canHandle","processInfo","command","detectAgents","context","detectRunningAgents","pruneSessionCache","processes","length","agents","process","proc","cwd","conversation","matchRunningProcesses","session","readSessionIncremental","conversationId","transcriptPath","push","mapSessionToAgent","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","filterCwd","summaries","listConversations","undefined","readSession","toSessionSummary","findSessionsById","sessionId","projectPath","firstUserMessage","lastActive","startedAt","sessionStart"],"mappings":"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"}
@@ -0,0 +1,30 @@
1
+ import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ /** A workspace cwd and the conversation the CLI last used there. */
3
+ export interface AntigravityConversationRef {
4
+ cwd: string;
5
+ conversationId: string;
6
+ transcriptPath: string;
7
+ }
8
+ /** A live `agy` process paired with its cwd and (if registered) conversation. */
9
+ export interface AntigravityProcessMatch {
10
+ process: ProcessInfo;
11
+ cwd: string;
12
+ conversation: AntigravityConversationRef | null;
13
+ }
14
+ export interface AntigravitySessionLocatorOptions {
15
+ /** Overrides the base dir (defaults to ANTIGRAVITY_CLI_HOME or ~/.gemini/antigravity-cli). */
16
+ baseDir?: string;
17
+ }
18
+ export declare class AntigravitySessionLocator {
19
+ private readonly baseDir;
20
+ constructor(options?: AntigravitySessionLocatorOptions);
21
+ /** Pair live processes with their conversation, joined on the process cwd. */
22
+ matchRunningProcesses(processes: ProcessInfo[]): AntigravityProcessMatch[];
23
+ /**
24
+ * Read cache/last_conversations.json, a `{ <cwd>: <conversationId> }` map the
25
+ * CLI rewrites as the current conversation per workspace changes.
26
+ */
27
+ listConversations(): AntigravityConversationRef[];
28
+ private transcriptPath;
29
+ }
30
+ //# sourceMappingURL=AntigravitySessionLocator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AntigravitySessionLocator.d.ts","sourceRoot":"","sources":["../../../src/harnesses/antigravity/AntigravitySessionLocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAQlE,oEAAoE;AACpE,MAAM,WAAW,0BAA0B;IACzC,GAAG,EAAE,MAAM,CAAC;IACZ,cAAc,EAAE,MAAM,CAAC;IACvB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,iFAAiF;AACjF,MAAM,WAAW,uBAAuB;IACtC,OAAO,EAAE,WAAW,CAAC;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,EAAE,0BAA0B,GAAG,IAAI,CAAC;CACjD;AAED,MAAM,WAAW,gCAAgC;IAC/C,8FAA8F;IAC9F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,yBAAyB;IACpC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,gCAAqC;IAM1D,8EAA8E;IAC9E,qBAAqB,CAAC,SAAS,EAAE,WAAW,EAAE,GAAG,uBAAuB,EAAE;IAQ1E;;;OAGG;IACH,iBAAiB,IAAI,0BAA0B,EAAE;IAqBjD,OAAO,CAAC,cAAc;CAGvB"}
@@ -0,0 +1,56 @@
1
+ import * as path from "path";
2
+ import { safeReadFile } from "../../utils/session.js";
3
+ import { homeDir } from "../shared.js";
4
+ const REGISTRY_FILE = path.join("cache", "last_conversations.json");
5
+ const BRAIN_DIR = "brain";
6
+ const TRANSCRIPT_REL = path.join(".system_generated", "logs", "transcript.jsonl");
7
+ export class AntigravitySessionLocator {
8
+ baseDir;
9
+ constructor(options = {}){
10
+ this.baseDir = options.baseDir ?? (process.env.ANTIGRAVITY_CLI_HOME || path.join(homeDir(), ".gemini", "antigravity-cli"));
11
+ }
12
+ /** Pair live processes with their conversation, joined on the process cwd. */ matchRunningProcesses(processes) {
13
+ const byCwd = new Map(this.listConversations().map((ref)=>[
14
+ ref.cwd,
15
+ ref
16
+ ]));
17
+ return processes.map((proc)=>{
18
+ const cwd = proc.cwd || "";
19
+ return {
20
+ process: proc,
21
+ cwd,
22
+ conversation: byCwd.get(cwd) ?? null
23
+ };
24
+ });
25
+ }
26
+ /**
27
+ * Read cache/last_conversations.json, a `{ <cwd>: <conversationId> }` map the
28
+ * CLI rewrites as the current conversation per workspace changes.
29
+ */ listConversations() {
30
+ const content = safeReadFile(path.join(this.baseDir, REGISTRY_FILE));
31
+ if (content === undefined) return [];
32
+ let parsed;
33
+ try {
34
+ parsed = JSON.parse(content);
35
+ } catch {
36
+ return [];
37
+ }
38
+ if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) return [];
39
+ const refs = [];
40
+ for (const [cwd, conversationId] of Object.entries(parsed)){
41
+ if (cwd && typeof conversationId === "string" && conversationId) {
42
+ refs.push({
43
+ cwd,
44
+ conversationId,
45
+ transcriptPath: this.transcriptPath(conversationId)
46
+ });
47
+ }
48
+ }
49
+ return refs;
50
+ }
51
+ transcriptPath(conversationId) {
52
+ return path.join(this.baseDir, BRAIN_DIR, conversationId, TRANSCRIPT_REL);
53
+ }
54
+ }
55
+
56
+ //# sourceMappingURL=AntigravitySessionLocator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/antigravity/AntigravitySessionLocator.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { safeReadFile } from \"../../utils/session.js\";\nimport { homeDir } from \"../shared.js\";\n\nconst REGISTRY_FILE = path.join(\"cache\", \"last_conversations.json\");\nconst BRAIN_DIR = \"brain\";\nconst TRANSCRIPT_REL = path.join(\".system_generated\", \"logs\", \"transcript.jsonl\");\n\n/** A workspace cwd and the conversation the CLI last used there. */\nexport interface AntigravityConversationRef {\n cwd: string;\n conversationId: string;\n transcriptPath: string;\n}\n\n/** A live `agy` process paired with its cwd and (if registered) conversation. */\nexport interface AntigravityProcessMatch {\n process: ProcessInfo;\n cwd: string;\n conversation: AntigravityConversationRef | null;\n}\n\nexport interface AntigravitySessionLocatorOptions {\n /** Overrides the base dir (defaults to ANTIGRAVITY_CLI_HOME or ~/.gemini/antigravity-cli). */\n baseDir?: string;\n}\n\nexport class AntigravitySessionLocator {\n private readonly baseDir: string;\n\n constructor(options: AntigravitySessionLocatorOptions = {}) {\n this.baseDir =\n options.baseDir ??\n (process.env.ANTIGRAVITY_CLI_HOME || path.join(homeDir(), \".gemini\", \"antigravity-cli\"));\n }\n\n /** Pair live processes with their conversation, joined on the process cwd. */\n matchRunningProcesses(processes: ProcessInfo[]): AntigravityProcessMatch[] {\n const byCwd = new Map(this.listConversations().map((ref) => [ref.cwd, ref]));\n return processes.map((proc) => {\n const cwd = proc.cwd || \"\";\n return { process: proc, cwd, conversation: byCwd.get(cwd) ?? null };\n });\n }\n\n /**\n * Read cache/last_conversations.json, a `{ <cwd>: <conversationId> }` map the\n * CLI rewrites as the current conversation per workspace changes.\n */\n listConversations(): AntigravityConversationRef[] {\n const content = safeReadFile(path.join(this.baseDir, REGISTRY_FILE));\n if (content === undefined) return [];\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(content);\n } catch {\n return [];\n }\n if (!parsed || typeof parsed !== \"object\" || Array.isArray(parsed)) return [];\n\n const refs: AntigravityConversationRef[] = [];\n for (const [cwd, conversationId] of Object.entries(parsed as Record<string, unknown>)) {\n if (cwd && typeof conversationId === \"string\" && conversationId) {\n refs.push({ cwd, conversationId, transcriptPath: this.transcriptPath(conversationId) });\n }\n }\n return refs;\n }\n\n private transcriptPath(conversationId: string): string {\n return path.join(this.baseDir, BRAIN_DIR, conversationId, TRANSCRIPT_REL);\n }\n}\n"],"names":["path","safeReadFile","homeDir","REGISTRY_FILE","join","BRAIN_DIR","TRANSCRIPT_REL","AntigravitySessionLocator","baseDir","options","process","env","ANTIGRAVITY_CLI_HOME","matchRunningProcesses","processes","byCwd","Map","listConversations","map","ref","cwd","proc","conversation","get","content","undefined","parsed","JSON","parse","Array","isArray","refs","conversationId","Object","entries","push","transcriptPath"],"mappings":"AAAA,YAAYA,UAAU,OAAO;AAE7B,SAASC,YAAY,QAAQ,yBAAyB;AACtD,SAASC,OAAO,QAAQ,eAAe;AAEvC,MAAMC,gBAAgBH,KAAKI,IAAI,CAAC,SAAS;AACzC,MAAMC,YAAY;AAClB,MAAMC,iBAAiBN,KAAKI,IAAI,CAAC,qBAAqB,QAAQ;AAqB9D,OAAO,MAAMG;IACMC,QAAgB;IAEjC,YAAYC,UAA4C,CAAC,CAAC,CAAE;QAC1D,IAAI,CAACD,OAAO,GACVC,QAAQD,OAAO,IACdE,CAAAA,QAAQC,GAAG,CAACC,oBAAoB,IAAIZ,KAAKI,IAAI,CAACF,WAAW,WAAW,kBAAiB;IAC1F;IAEA,4EAA4E,GAC5EW,sBAAsBC,SAAwB,EAA6B;QACzE,MAAMC,QAAQ,IAAIC,IAAI,IAAI,CAACC,iBAAiB,GAAGC,GAAG,CAAC,CAACC,MAAQ;gBAACA,IAAIC,GAAG;gBAAED;aAAI;QAC1E,OAAOL,UAAUI,GAAG,CAAC,CAACG;YACpB,MAAMD,MAAMC,KAAKD,GAAG,IAAI;YACxB,OAAO;gBAAEV,SAASW;gBAAMD;gBAAKE,cAAcP,MAAMQ,GAAG,CAACH,QAAQ;YAAK;QACpE;IACF;IAEA;;;GAGC,GACDH,oBAAkD;QAChD,MAAMO,UAAUvB,aAAaD,KAAKI,IAAI,CAAC,IAAI,CAACI,OAAO,EAAEL;QACrD,IAAIqB,YAAYC,WAAW,OAAO,EAAE;QAEpC,IAAIC;QACJ,IAAI;YACFA,SAASC,KAAKC,KAAK,CAACJ;QACtB,EAAE,OAAM;YACN,OAAO,EAAE;QACX;QACA,IAAI,CAACE,UAAU,OAAOA,WAAW,YAAYG,MAAMC,OAAO,CAACJ,SAAS,OAAO,EAAE;QAE7E,MAAMK,OAAqC,EAAE;QAC7C,KAAK,MAAM,CAACX,KAAKY,eAAe,IAAIC,OAAOC,OAAO,CAACR,QAAoC;YACrF,IAAIN,OAAO,OAAOY,mBAAmB,YAAYA,gBAAgB;gBAC/DD,KAAKI,IAAI,CAAC;oBAAEf;oBAAKY;oBAAgBI,gBAAgB,IAAI,CAACA,cAAc,CAACJ;gBAAgB;YACvF;QACF;QACA,OAAOD;IACT;IAEQK,eAAeJ,cAAsB,EAAU;QACrD,OAAOhC,KAAKI,IAAI,CAAC,IAAI,CAACI,OAAO,EAAEH,WAAW2B,gBAAgB1B;IAC5D;AACF"}
@@ -0,0 +1,75 @@
1
+ import type { ConversationMessage, ConversationOptions } from "../../adapters/AgentAdapter.js";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import { type JsonlSummaryBounds } from "../../utils/IncrementalJsonlSummary.js";
4
+ /** Parsed state for a single conversation. */
5
+ export interface AntigravitySession {
6
+ sessionId: string;
7
+ projectPath: string;
8
+ sessionFilePath: string;
9
+ sessionStart: Date;
10
+ lastActive: Date;
11
+ firstUserMessage?: string;
12
+ lastUserMessage?: string;
13
+ lastRole?: ConversationMessage["role"];
14
+ }
15
+ export interface AntigravitySessionParserOptions {
16
+ /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */
17
+ summaryBounds?: JsonlSummaryBounds | false;
18
+ }
19
+ export declare class AntigravitySessionParser {
20
+ /** Incremental reader backing `getConversation({ tail })`. */
21
+ private readonly tailReader;
22
+ private readonly sessionCache;
23
+ constructor(options?: AntigravitySessionParserOptions);
24
+ /**
25
+ * Parse a conversation's transcript.jsonl into an {@link AntigravitySession}.
26
+ * Returns null when the transcript is missing — there is no real session to
27
+ * surface.
28
+ */
29
+ readSession(conversationId: string, transcriptPath: string, projectPath: string): AntigravitySession | null;
30
+ /**
31
+ * Same result as `readSession`, but backed by a per-instance incremental
32
+ * cache so repeated refreshes only parse bytes appended since the last call.
33
+ * Call `pruneSessionCache()` once per refresh to evict files no longer read.
34
+ *
35
+ * The first read of a large transcript is a bounded head + tail scan (see
36
+ * `summaryReducer.skip`).
37
+ */
38
+ readSessionIncremental(conversationId: string, transcriptPath: string, projectPath: string): AntigravitySession | null;
39
+ /** Evict cached summaries for files not read since the previous prune. */
40
+ pruneSessionCache(): void;
41
+ getConversation(transcriptPath: string, options?: ConversationOptions): ConversationMessage[];
42
+ /**
43
+ * - past the idle threshold → IDLE
44
+ * - last turn is an assistant reply → WAITING (awaiting user)
45
+ * - otherwise (last turn was a user message, or unknown) → RUNNING
46
+ */
47
+ determineStatus(session: AntigravitySession): AgentStatus;
48
+ /**
49
+ * Fold one transcript record into the O(1) summary: first/last user request,
50
+ * the role of the last user/assistant turn, and the latest `created_at`.
51
+ * Uses the same record rules as `getConversation` (see `recordToMessage`).
52
+ *
53
+ * `skip` (bounded cold start) keeps the head's first user request and resets
54
+ * the latest fields, so those come from the tail only; without a timestamp in
55
+ * the tail, `lastActive` falls back to the file mtime.
56
+ */
57
+ private readonly summaryReducer;
58
+ private toSession;
59
+ /** Full pass over transcript.jsonl building every conversation turn. */
60
+ private parseTranscript;
61
+ private parseRecord;
62
+ /**
63
+ * USER_INPUT records are user turns and PLANNER_RESPONSE records are the
64
+ * model's reply. Everything else — MODEL tool calls (RUN_COMMAND, ...) and
65
+ * SYSTEM records (history, checkpoints) — is execution detail, shown as a
66
+ * system message only in verbose mode.
67
+ */
68
+ private recordToMessage;
69
+ /**
70
+ * The prompt inside <USER_REQUEST>...</USER_REQUEST>, or the whole trimmed
71
+ * text when the record has no wrapper. Null for an unwrapped blank record.
72
+ */
73
+ private extractUserRequest;
74
+ }
75
+ //# sourceMappingURL=AntigravitySessionParser.d.ts.map