@ai-devkit/agent-manager 0.35.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 (651) 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/claude.test.js +485 -0
  14. package/dist/__tests__/capacity/claude.test.js.map +1 -0
  15. package/dist/__tests__/capacity/openai.test.js +670 -0
  16. package/dist/__tests__/capacity/openai.test.js.map +1 -0
  17. package/dist/__tests__/capacity/wham.test.js +144 -0
  18. package/dist/__tests__/capacity/wham.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  20. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  21. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  22. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  24. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  25. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js +462 -0
  26. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  27. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  28. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  30. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  31. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  32. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  33. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  34. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  35. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  36. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  38. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  41. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  42. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  43. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  44. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  45. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  46. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  47. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  48. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  49. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  50. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  51. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  52. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  54. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  56. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  59. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  60. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  61. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  62. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  64. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  65. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  66. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  67. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  68. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  69. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  70. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  71. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  72. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  73. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  74. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  78. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  79. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  80. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  81. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  82. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  83. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js +662 -0
  84. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  90. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  91. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  92. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  93. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  94. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  95. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  96. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  97. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  98. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  99. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  105. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  106. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  107. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  108. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  109. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  110. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  111. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  112. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  113. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  114. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  115. package/dist/__tests__/utils/agents.test.js +72 -2
  116. package/dist/__tests__/utils/agents.test.js.map +1 -1
  117. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  118. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  119. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  120. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  121. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  122. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  123. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  124. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  125. package/dist/__tests__/utils/process.test.js +436 -2
  126. package/dist/__tests__/utils/process.test.js.map +1 -1
  127. package/dist/adapters/AgentAdapter.d.ts +25 -6
  128. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  129. package/dist/adapters/AgentAdapter.js +12 -3
  130. package/dist/adapters/AgentAdapter.js.map +1 -1
  131. package/dist/capacity/claude.d.ts +17 -0
  132. package/dist/capacity/claude.d.ts.map +1 -0
  133. package/dist/capacity/claude.js +271 -0
  134. package/dist/capacity/claude.js.map +1 -0
  135. package/dist/capacity/codex.d.ts +1 -2
  136. package/dist/capacity/codex.d.ts.map +1 -1
  137. package/dist/capacity/codex.js +5 -47
  138. package/dist/capacity/codex.js.map +1 -1
  139. package/dist/capacity/index.d.ts +11 -0
  140. package/dist/capacity/index.d.ts.map +1 -1
  141. package/dist/capacity/index.js +17 -0
  142. package/dist/capacity/index.js.map +1 -1
  143. package/dist/capacity/openai.d.ts +47 -0
  144. package/dist/capacity/openai.d.ts.map +1 -0
  145. package/dist/capacity/openai.js +307 -0
  146. package/dist/capacity/openai.js.map +1 -0
  147. package/dist/capacity/wham.d.ts +16 -0
  148. package/dist/capacity/wham.d.ts.map +1 -0
  149. package/dist/capacity/wham.js +66 -0
  150. package/dist/capacity/wham.js.map +1 -0
  151. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  152. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  153. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  154. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  155. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  156. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  157. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  158. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  159. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  160. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  161. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  162. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  163. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  164. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  165. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  166. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  167. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  169. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  170. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  171. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  172. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  173. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  174. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  175. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  176. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  177. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  178. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  179. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  180. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  181. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  182. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  183. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  184. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  185. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  186. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  187. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  190. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  191. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  192. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  193. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  195. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  196. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  197. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  198. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  199. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  200. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  201. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  202. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  203. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  204. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  205. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  206. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  207. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  208. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  209. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  210. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  211. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  212. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  213. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  214. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  215. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  216. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  217. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  218. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  219. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  220. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  221. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  222. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  223. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  224. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  225. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  226. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  227. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  228. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  229. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  230. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  231. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  232. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  233. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  234. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  235. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  236. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  237. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  238. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  239. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  240. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  241. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  242. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  243. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  244. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  245. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  246. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  247. package/dist/harnesses/gemini/fileSignature.js +9 -0
  248. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  249. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  250. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  251. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  252. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  253. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  254. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  255. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  256. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  257. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  258. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  259. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  260. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  262. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  263. package/dist/harnesses/index.d.ts +7 -0
  264. package/dist/harnesses/index.d.ts.map +1 -0
  265. package/dist/harnesses/index.js +27 -0
  266. package/dist/harnesses/index.js.map +1 -0
  267. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  268. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  269. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  270. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  271. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  272. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  273. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  274. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  275. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  276. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  277. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  278. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  279. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  280. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  281. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  282. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  283. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  284. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  285. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  286. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  287. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  288. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  289. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  290. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  291. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  292. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  293. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  294. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  295. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  296. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  297. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  298. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  299. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  300. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  301. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  303. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  304. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  305. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  306. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  307. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  308. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  309. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  310. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  311. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  312. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  313. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  314. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  315. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  316. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  317. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  318. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  319. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  320. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  321. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  322. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  323. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  324. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  325. package/dist/harnesses/shared.d.ts +41 -0
  326. package/dist/harnesses/shared.d.ts.map +1 -0
  327. package/dist/harnesses/shared.js +71 -0
  328. package/dist/harnesses/shared.js.map +1 -0
  329. package/dist/index.d.ts +28 -25
  330. package/dist/index.d.ts.map +1 -1
  331. package/dist/index.js +19 -16
  332. package/dist/index.js.map +1 -1
  333. package/dist/readiness/AgentReadiness.d.ts +1 -1
  334. package/dist/readiness/AgentReadiness.d.ts.map +1 -1
  335. package/dist/readiness/AgentReadiness.js.map +1 -1
  336. package/dist/runtime/ManagedAgentRuntime.js +3 -1
  337. package/dist/runtime/ManagedAgentRuntime.js.map +1 -1
  338. package/dist/runtime/herdr/HerdrAgentDiscovery.js +10 -0
  339. package/dist/runtime/herdr/HerdrAgentDiscovery.js.map +1 -1
  340. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  341. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  342. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  343. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  344. package/dist/utils/agents.d.ts +3 -2
  345. package/dist/utils/agents.d.ts.map +1 -1
  346. package/dist/utils/agents.js +61 -15
  347. package/dist/utils/agents.js.map +1 -1
  348. package/dist/utils/index.d.ts +2 -1
  349. package/dist/utils/index.d.ts.map +1 -1
  350. package/dist/utils/index.js +1 -1
  351. package/dist/utils/index.js.map +1 -1
  352. package/dist/utils/jsonlTail.d.ts +73 -0
  353. package/dist/utils/jsonlTail.d.ts.map +1 -0
  354. package/dist/utils/jsonlTail.js +238 -0
  355. package/dist/utils/jsonlTail.js.map +1 -0
  356. package/dist/utils/matching.d.ts +2 -0
  357. package/dist/utils/matching.d.ts.map +1 -1
  358. package/dist/utils/matching.js +3 -2
  359. package/dist/utils/matching.js.map +1 -1
  360. package/dist/utils/matchingConstants.d.ts +15 -0
  361. package/dist/utils/matchingConstants.d.ts.map +1 -0
  362. package/dist/utils/matchingConstants.js +14 -0
  363. package/dist/utils/matchingConstants.js.map +1 -0
  364. package/dist/utils/process.d.ts +38 -2
  365. package/dist/utils/process.d.ts.map +1 -1
  366. package/dist/utils/process.js +131 -43
  367. package/dist/utils/process.js.map +1 -1
  368. package/package.json +2 -1
  369. package/scripts/benchmark-cold-start.mjs +350 -0
  370. package/src/AgentManager.ts +26 -5
  371. package/src/__tests__/AgentManager.test.ts +141 -3
  372. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  373. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  374. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  375. package/src/__tests__/capacity/claude.test.ts +467 -0
  376. package/src/__tests__/capacity/fixtures/claude-credentials.json +7 -0
  377. package/src/__tests__/capacity/fixtures/claude-usage-malformed.json +1 -0
  378. package/src/__tests__/capacity/fixtures/claude-usage-partial.json +15 -0
  379. package/src/__tests__/capacity/fixtures/claude-usage.json +63 -0
  380. package/src/__tests__/capacity/fixtures/openai-auth.json +6 -0
  381. package/src/__tests__/capacity/fixtures/openai-codex-auth.json +9 -0
  382. package/src/__tests__/capacity/fixtures/openai-usage-completions.json +67 -0
  383. package/src/__tests__/capacity/fixtures/openai-usage-responses.json +20 -0
  384. package/src/__tests__/capacity/fixtures/wham-usage.json +32 -0
  385. package/src/__tests__/capacity/openai.test.ts +560 -0
  386. package/src/__tests__/capacity/wham.test.ts +104 -0
  387. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  388. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  389. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  390. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.ts +396 -0
  391. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  392. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  393. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  394. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  395. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  396. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  397. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  398. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  399. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  400. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  401. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  402. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  403. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  404. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  405. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  406. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  407. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  408. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  409. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  410. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  411. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  412. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  413. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  414. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  415. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  416. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  417. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  418. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  419. package/src/__tests__/harnesses/kiro/KiroAdapter.test.ts +552 -0
  420. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  421. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  422. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  423. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  424. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  425. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  426. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  427. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  428. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  429. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  430. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  431. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  432. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  433. package/src/__tests__/utils/agents.test.ts +83 -2
  434. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  435. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  436. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  437. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  438. package/src/__tests__/utils/process.test.ts +254 -0
  439. package/src/adapters/AgentAdapter.ts +37 -12
  440. package/src/capacity/claude.ts +313 -0
  441. package/src/capacity/codex.ts +25 -134
  442. package/src/capacity/index.ts +33 -4
  443. package/src/capacity/openai.ts +355 -0
  444. package/src/capacity/wham.ts +84 -0
  445. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  446. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  447. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  448. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  449. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  450. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  451. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  452. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  453. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  454. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  455. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  456. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  457. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  458. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  459. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  460. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  461. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  462. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  463. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  464. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  465. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  466. package/src/harnesses/gemini/fileSignature.ts +10 -0
  467. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  468. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  469. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  470. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  471. package/src/harnesses/index.ts +28 -0
  472. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  473. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  474. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  475. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  476. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  477. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  478. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  479. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  480. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  481. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  482. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  483. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  484. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  485. package/src/harnesses/shared.ts +119 -0
  486. package/src/index.ts +34 -23
  487. package/src/readiness/AgentReadiness.ts +4 -1
  488. package/src/runtime/ManagedAgentRuntime.ts +2 -0
  489. package/src/runtime/herdr/HerdrAgentDiscovery.ts +5 -1
  490. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  491. package/src/utils/agents.ts +62 -20
  492. package/src/utils/index.ts +2 -0
  493. package/src/utils/jsonlTail.ts +349 -0
  494. package/src/utils/matching.ts +3 -3
  495. package/src/utils/matchingConstants.ts +15 -0
  496. package/src/utils/process.ts +189 -45
  497. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  498. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  499. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  500. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  501. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  502. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  503. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  504. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  505. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  506. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  507. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  508. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  509. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  510. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  511. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  512. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  513. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  514. package/dist/adapters/index.d.ts +0 -10
  515. package/dist/adapters/index.d.ts.map +0 -1
  516. package/dist/adapters/index.js +0 -10
  517. package/dist/adapters/index.js.map +0 -1
  518. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  519. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  520. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  521. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  522. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  523. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  524. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  525. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  526. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  527. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  528. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  529. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  530. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  531. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  532. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  533. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  534. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  535. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  536. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  537. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  538. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  539. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  541. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  542. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  543. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  544. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  545. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  546. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  547. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  548. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  549. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  550. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  551. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  552. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  553. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  554. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  555. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  556. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  557. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  558. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  559. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  560. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  561. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  562. package/dist/providers/grok/GrokSessionParser.js +0 -122
  563. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  564. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  565. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  566. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  567. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  568. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  569. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  570. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  571. package/dist/providers/pi/PiAdapter.js.map +0 -1
  572. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  573. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  574. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  575. package/dist/providers/pi/PiSessionLocator.js +0 -86
  576. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  577. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  578. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  579. package/dist/providers/pi/PiSessionParser.js +0 -191
  580. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  581. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  582. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  583. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  584. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  585. package/src/adapters/index.ts +0 -15
  586. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  587. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  588. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  589. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  590. package/src/providers/grok/GrokSessionParser.ts +0 -166
  591. package/src/providers/pi/PiSessionLocator.ts +0 -110
  592. package/src/providers/pi/PiSessionParser.ts +0 -284
  593. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  594. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  595. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  596. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  597. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  598. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  600. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  601. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  602. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  603. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  604. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  605. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  606. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  607. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  608. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  609. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  610. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  611. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  612. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  613. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  614. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  615. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  616. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  617. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  618. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  619. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  620. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  621. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  622. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  623. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  624. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  625. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  626. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  627. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  628. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  629. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  630. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  631. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  632. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  633. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  634. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  635. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  636. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  637. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  638. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  639. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  640. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  641. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  642. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  643. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  644. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  645. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  646. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  647. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  648. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  649. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  650. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  651. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/copilot/CopilotAdapter.ts"],"sourcesContent":["/**\n * Copilot Adapter\n *\n * Detects running GitHub Copilot CLI agents by:\n * 1. Filtering Copilot processes from a shared asynchronous process snapshot\n * 2. Using snapshot CWD and start-time enrichment\n * 3. Mapping active ~/.copilot/session-state/{sessionId}/inuse.{pid}.lock files to processes\n * (only directories modified since the process started are listed, and a\n * known lock is re-validated with one stat on later refreshes)\n * 4. Reading events.jsonl as the primary session/conversation source (incrementally\n * cached across refreshes, so unchanged files are not re-read)\n * 5. Reading workspace.yaml as a flat fallback metadata source\n */\n\nimport * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ConversationMessage,\n ConversationOptions,\n ListSessionsOptions,\n ProcessInfo,\n SessionSummary,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport { findWrapperProcess, findWrapperProcessPids } from \"../../utils/process.js\";\nimport { AgentRegistry, type RegistryEntry } from \"../../utils/AgentRegistry.js\";\nimport { CopilotAgentMapper } from \"./CopilotAgentMapper.js\";\nimport { CopilotSessionLocator } from \"./CopilotSessionLocator.js\";\nimport { CopilotSessionParser, type CopilotSession } from \"./CopilotSessionParser.js\";\nimport { findHarnessProcesses, homeDir, matchesExecutable } from \"../shared.js\";\n\nexport interface CopilotAdapterOptions {\n sessionStateDir?: string;\n}\n\nexport class CopilotAdapter implements AgentAdapter {\n readonly type = \"copilot\" as const;\n readonly processNames = [\"copilot\"] as const;\n\n private readonly registry: AgentRegistry;\n private readonly parser: CopilotSessionParser;\n private readonly mapper: CopilotAgentMapper;\n private readonly locator: CopilotSessionLocator;\n\n constructor(\n registry: AgentRegistry = AgentRegistry.default(),\n options: CopilotAdapterOptions = {},\n ) {\n this.registry = registry;\n this.parser = new CopilotSessionParser();\n this.mapper = new CopilotAgentMapper(this.parser);\n this.locator = new CopilotSessionLocator({\n sessionStateDir: options.sessionStateDir ?? path.join(homeDir(), \".copilot\", \"session-state\"),\n });\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return matchesExecutable(processInfo.command, \"copilot\");\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n try {\n return await this.detectRunningAgents(context);\n } finally {\n // Drop cached event 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) return [];\n\n const processByPid = new Map(processes.map((proc) => [proc.pid, proc]));\n const registryEntriesByPid = new Map(this.registry.list().map((entry) => [entry.pid, entry]));\n const matchedPids = new Set<number>();\n const matchedProcesses: ProcessInfo[] = [];\n const agents: AgentInfo[] = [];\n\n for (const lock of this.locator.discoverActiveLocks(processes)) {\n const proc = processByPid.get(lock.pid);\n if (!proc) continue;\n\n const session = this.parser.readSessionDirIncremental(lock.sessionDir, lock.sessionId);\n if (!session) continue;\n\n const agent = this.mapper.mapSessionToAgent(session, proc);\n this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);\n agents.push(agent);\n matchedPids.add(proc.pid);\n matchedProcesses.push(proc);\n }\n\n const wrapperPids = findWrapperProcessPids(processes, matchedProcesses);\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid) && !wrapperPids.has(proc.pid)) {\n const agent = this.mapper.mapProcessOnlyAgent(proc);\n this.applyWrapperRegistryName(agent, proc, processes, registryEntriesByPid);\n agents.push(agent);\n }\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 summaries: SessionSummary[] = [];\n\n for (const { sessionDir, sessionId } of this.locator.listSessionDirs()) {\n const session = this.parser.readSessionDir(sessionDir, sessionId);\n if (!session) continue;\n if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;\n\n summaries.push(this.toSessionSummary(session));\n }\n\n return summaries;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const match = this.locator.findSessionDirById(sessionId);\n if (match) {\n const session = this.parser.readSessionDir(match.sessionDir, match.sessionId);\n if (session?.sessionId === sessionId) {\n return [this.toSessionSummary(session)];\n }\n }\n\n return (await this.listSessions()).filter((session) => session.sessionId === sessionId);\n }\n\n private toSessionSummary(session: CopilotSession): 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.eventsFilePath,\n };\n }\n\n private applyWrapperRegistryName(\n agent: AgentInfo,\n processInfo: ProcessInfo,\n processes: ProcessInfo[],\n registryEntriesByPid: Map<number, RegistryEntry>,\n ): void {\n const wrapper = findWrapperProcess(processes, processInfo);\n const wrapperEntry = wrapper ? registryEntriesByPid.get(wrapper.pid) : undefined;\n if (wrapperEntry?.type === this.type) {\n agent.name = wrapperEntry.name;\n }\n }\n}\n"],"names":["path","findWrapperProcess","findWrapperProcessPids","AgentRegistry","CopilotAgentMapper","CopilotSessionLocator","CopilotSessionParser","findHarnessProcesses","homeDir","matchesExecutable","CopilotAdapter","type","processNames","registry","parser","mapper","locator","default","options","sessionStateDir","join","canHandle","processInfo","command","detectAgents","context","detectRunningAgents","pruneSessionCache","processes","length","processByPid","Map","map","proc","pid","registryEntriesByPid","list","entry","matchedPids","Set","matchedProcesses","agents","lock","discoverActiveLocks","get","session","readSessionDirIncremental","sessionDir","sessionId","agent","mapSessionToAgent","applyWrapperRegistryName","push","add","wrapperPids","has","mapProcessOnlyAgent","getConversation","sessionFilePath","listSessions","opts","summaries","listSessionDirs","readSessionDir","cwd","undefined","projectPath","toSessionSummary","findSessionsById","match","findSessionDirById","filter","firstUserMessage","lastActive","startedAt","sessionStart","eventsFilePath","wrapper","wrapperEntry","name"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CopilotAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/copilot/CopilotAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAEtF,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,oBAAiD;IAEtF,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,GAAG,SAAS;IAe/E,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAYzD"}
1
+ {"version":3,"file":"CopilotAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/CopilotAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,oBAAoB,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAGtF,qBAAa,kBAAkB;IACjB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,oBAAiD;IAEtF,iBAAiB,CAAC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,WAAW,GAAG,SAAS;IAe/E,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}
@@ -1,6 +1,6 @@
1
- import { AgentStatus } from "../../adapters/AgentAdapter.js";
2
1
  import { generateAgentName } from "../../utils/matching.js";
3
2
  import { CopilotSessionParser } from "./CopilotSessionParser.js";
3
+ import { processOnlyAgent } from "../shared.js";
4
4
  export class CopilotAgentMapper {
5
5
  parser;
6
6
  constructor(parser = new CopilotSessionParser()){
@@ -21,16 +21,9 @@ export class CopilotAgentMapper {
21
21
  };
22
22
  }
23
23
  mapProcessOnlyAgent(processInfo) {
24
- return {
25
- name: generateAgentName(processInfo.cwd || "", processInfo.pid),
26
- type: "copilot",
27
- status: AgentStatus.RUNNING,
28
- summary: "Copilot process running",
29
- pid: processInfo.pid,
30
- projectPath: processInfo.cwd || "",
31
- sessionId: `pid-${processInfo.pid}`,
32
- lastActive: new Date()
33
- };
24
+ return processOnlyAgent("copilot", processInfo, {
25
+ summary: "Copilot process running"
26
+ });
34
27
  }
35
28
  }
36
29
 
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/copilot/CopilotAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { CopilotSessionParser, type CopilotSession } from \"./CopilotSessionParser.js\";\nimport { processOnlyAgent } from \"../shared.js\";\n\nexport class CopilotAgentMapper {\n constructor(private readonly parser: CopilotSessionParser = new CopilotSessionParser()) {}\n\n mapSessionToAgent(session: CopilotSession, processInfo: ProcessInfo): AgentInfo {\n const projectPath = session.projectPath || processInfo.cwd || \"\";\n return {\n name: generateAgentName(projectPath, processInfo.pid),\n type: \"copilot\",\n status: this.parser.determineStatus(session),\n summary: session.summary || \"Copilot session active\",\n pid: processInfo.pid,\n projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: session.eventsFilePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return processOnlyAgent(\"copilot\", processInfo, { summary: \"Copilot process running\" });\n }\n}\n"],"names":["generateAgentName","CopilotSessionParser","processOnlyAgent","CopilotAgentMapper","parser","mapSessionToAgent","session","processInfo","projectPath","cwd","name","pid","type","status","determineStatus","summary","sessionId","lastActive","sessionFilePath","eventsFilePath","mapProcessOnlyAgent"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,0BAA0B;AAC5D,SAASC,oBAAoB,QAA6B,4BAA4B;AACtF,SAASC,gBAAgB,QAAQ,eAAe;AAEhD,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA+B,IAAIH,sBAAsB,CAAE;aAA3DG,SAAAA;IAA4D;IAEzFC,kBAAkBC,OAAuB,EAAEC,WAAwB,EAAa;QAC9E,MAAMC,cAAcF,QAAQE,WAAW,IAAID,YAAYE,GAAG,IAAI;QAC9D,OAAO;YACLC,MAAMV,kBAAkBQ,aAAaD,YAAYI,GAAG;YACpDC,MAAM;YACNC,QAAQ,IAAI,CAACT,MAAM,CAACU,eAAe,CAACR;YACpCS,SAAST,QAAQS,OAAO,IAAI;YAC5BJ,KAAKJ,YAAYI,GAAG;YACpBH;YACAQ,WAAWV,QAAQU,SAAS;YAC5BC,YAAYX,QAAQW,UAAU;YAC9BC,iBAAiBZ,QAAQa,cAAc;QACzC;IACF;IAEAC,oBAAoBb,WAAwB,EAAa;QACvD,OAAOL,iBAAiB,WAAWK,aAAa;YAAEQ,SAAS;QAA0B;IACvF;AACF"}
@@ -0,0 +1,42 @@
1
+ export interface CopilotLock {
2
+ sessionDir: string;
3
+ sessionId: string;
4
+ pid: number;
5
+ }
6
+ export interface CopilotSessionDir {
7
+ sessionDir: string;
8
+ sessionId: string;
9
+ }
10
+ /** A live Copilot process whose `inuse.<pid>.lock` file should be located. */
11
+ export interface CopilotLockProcess {
12
+ pid: number;
13
+ startTime?: Date;
14
+ }
15
+ export interface CopilotSessionLocatorOptions {
16
+ sessionStateDir?: string;
17
+ }
18
+ export declare class CopilotSessionLocator {
19
+ private readonly sessionStateDir;
20
+ /** Lock location per PID, trusted only while that PID's start time is unchanged. */
21
+ private readonly knownLocks;
22
+ constructor(options?: CopilotSessionLocatorOptions);
23
+ listSessionDirs(): CopilotSessionDir[];
24
+ findSessionDirById(sessionId: string): CopilotSessionDir | null;
25
+ /**
26
+ * Find `inuse.<pid>.lock` files.
27
+ *
28
+ * Without `processes`, every session directory is scanned and all locks are
29
+ * returned. With `processes`, only locks of those PIDs are returned and the
30
+ * search is bounded:
31
+ * - a lock found earlier for the same (pid, startTime) is re-validated with
32
+ * a single `stat` (a reused PID has a different start time and misses);
33
+ * - otherwise only session directories whose mtime is at or after the
34
+ * earliest unresolved process start time (minus slack) are listed, since
35
+ * creating the lock file bumps its directory's mtime;
36
+ * - if an unresolved process has no start time, every directory is listed.
37
+ */
38
+ discoverActiveLocks(processes?: readonly CopilotLockProcess[]): CopilotLock[];
39
+ /** List lock files in session directories with mtime >= `minMtimeMs` (all when undefined). */
40
+ private scanLocks;
41
+ }
42
+ //# sourceMappingURL=CopilotSessionLocator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotSessionLocator.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/CopilotSessionLocator.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,WAAW,iBAAiB;IAChC,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,8EAA8E;AAC9E,MAAM,WAAW,kBAAkB;IACjC,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,IAAI,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAeD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAS;IACzC,oFAAoF;IACpF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAgC;gBAE/C,OAAO,GAAE,4BAAiC;IAKtD,eAAe,IAAI,iBAAiB,EAAE;IActC,kBAAkB,CAAC,SAAS,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI;IAM/D;;;;;;;;;;;;OAYG;IACH,mBAAmB,CAAC,SAAS,CAAC,EAAE,SAAS,kBAAkB,EAAE,GAAG,WAAW,EAAE;IAmD7E,8FAA8F;IAC9F,OAAO,CAAC,SAAS;CAuBlB"}
@@ -0,0 +1,126 @@
1
+ import * as path from "path";
2
+ import { isDirectory, isSafePathSegment, safeReaddir, safeStat } from "../../utils/session.js";
3
+ import { homeDir } from "../shared.js";
4
+ /**
5
+ * Tolerance between a reported process start time and its lock directory's
6
+ * mtime: `ps lstart` has 1 s resolution, Linux start times derive from an
7
+ * estimated boot time, and some filesystems store coarse mtimes.
8
+ */ const START_TIME_SLACK_MS = 5 * 60 * 1000;
9
+ const LOCK_FILE_PATTERN = /^inuse\.(\d+)\.lock$/;
10
+ export class CopilotSessionLocator {
11
+ sessionStateDir;
12
+ /** Lock location per PID, trusted only while that PID's start time is unchanged. */ knownLocks = new Map();
13
+ constructor(options = {}){
14
+ this.sessionStateDir = options.sessionStateDir ?? path.join(homeDir(), ".copilot", "session-state");
15
+ }
16
+ listSessionDirs() {
17
+ if (!isDirectory(this.sessionStateDir)) return [];
18
+ const sessionDirs = [];
19
+ for (const sessionId of safeReaddir(this.sessionStateDir)){
20
+ const sessionDir = path.join(this.sessionStateDir, sessionId);
21
+ if (!isDirectory(sessionDir)) continue;
22
+ sessionDirs.push({
23
+ sessionDir,
24
+ sessionId
25
+ });
26
+ }
27
+ return sessionDirs;
28
+ }
29
+ findSessionDirById(sessionId) {
30
+ if (!isSafePathSegment(sessionId)) return null;
31
+ const sessionDir = path.join(this.sessionStateDir, sessionId);
32
+ return isDirectory(sessionDir) ? {
33
+ sessionDir,
34
+ sessionId
35
+ } : null;
36
+ }
37
+ /**
38
+ * Find `inuse.<pid>.lock` files.
39
+ *
40
+ * Without `processes`, every session directory is scanned and all locks are
41
+ * returned. With `processes`, only locks of those PIDs are returned and the
42
+ * search is bounded:
43
+ * - a lock found earlier for the same (pid, startTime) is re-validated with
44
+ * a single `stat` (a reused PID has a different start time and misses);
45
+ * - otherwise only session directories whose mtime is at or after the
46
+ * earliest unresolved process start time (minus slack) are listed, since
47
+ * creating the lock file bumps its directory's mtime;
48
+ * - if an unresolved process has no start time, every directory is listed.
49
+ */ discoverActiveLocks(processes) {
50
+ if (!processes) {
51
+ return this.scanLocks(undefined, ()=>true);
52
+ }
53
+ const startTimes = new Map(processes.map((proc)=>[
54
+ proc.pid,
55
+ proc.startTime?.getTime()
56
+ ]));
57
+ for (const [pid, known] of this.knownLocks){
58
+ if (startTimes.get(pid) !== known.startTimeMs) {
59
+ this.knownLocks.delete(pid);
60
+ }
61
+ }
62
+ const locks = [];
63
+ const unresolved = new Set();
64
+ for (const pid of startTimes.keys()){
65
+ const known = this.knownLocks.get(pid);
66
+ if (known && safeStat(path.join(known.sessionDir, lockFileName(pid)))?.isFile()) {
67
+ locks.push({
68
+ sessionDir: known.sessionDir,
69
+ sessionId: known.sessionId,
70
+ pid
71
+ });
72
+ continue;
73
+ }
74
+ this.knownLocks.delete(pid);
75
+ unresolved.add(pid);
76
+ }
77
+ if (unresolved.size === 0) return locks;
78
+ const unresolvedStarts = [
79
+ ...unresolved
80
+ ].map((pid)=>startTimes.get(pid));
81
+ const minMtimeMs = unresolvedStarts.every((start)=>start !== undefined) ? Math.min(...unresolvedStarts) - START_TIME_SLACK_MS : undefined;
82
+ const found = this.scanLocks(minMtimeMs, (pid)=>unresolved.has(pid));
83
+ const lockCounts = new Map();
84
+ for (const lock of found){
85
+ lockCounts.set(lock.pid, (lockCounts.get(lock.pid) ?? 0) + 1);
86
+ }
87
+ for (const lock of found){
88
+ const startTimeMs = startTimes.get(lock.pid);
89
+ // Only remember unambiguous locks of processes with a known start time
90
+ if (startTimeMs !== undefined && lockCounts.get(lock.pid) === 1) {
91
+ this.knownLocks.set(lock.pid, {
92
+ sessionDir: lock.sessionDir,
93
+ sessionId: lock.sessionId,
94
+ startTimeMs
95
+ });
96
+ }
97
+ }
98
+ return locks.concat(found);
99
+ }
100
+ /** List lock files in session directories with mtime >= `minMtimeMs` (all when undefined). */ scanLocks(minMtimeMs, includePid) {
101
+ const locks = [];
102
+ for (const sessionId of safeReaddir(this.sessionStateDir)){
103
+ const sessionDir = path.join(this.sessionStateDir, sessionId);
104
+ const stat = safeStat(sessionDir);
105
+ if (!stat?.isDirectory()) continue;
106
+ if (minMtimeMs !== undefined && stat.mtimeMs < minMtimeMs) continue;
107
+ for (const entry of safeReaddir(sessionDir)){
108
+ const match = entry.match(LOCK_FILE_PATTERN);
109
+ if (!match) continue;
110
+ const pid = Number.parseInt(match[1], 10);
111
+ if (!Number.isFinite(pid) || !includePid(pid)) continue;
112
+ locks.push({
113
+ sessionDir,
114
+ sessionId,
115
+ pid
116
+ });
117
+ }
118
+ }
119
+ return locks;
120
+ }
121
+ }
122
+ function lockFileName(pid) {
123
+ return `inuse.${pid}.lock`;
124
+ }
125
+
126
+ //# sourceMappingURL=CopilotSessionLocator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/copilot/CopilotSessionLocator.ts"],"sourcesContent":["import * as path from \"path\";\nimport { isDirectory, isSafePathSegment, safeReaddir, safeStat } from \"../../utils/session.js\";\nimport { homeDir } from \"../shared.js\";\n\nexport interface CopilotLock {\n sessionDir: string;\n sessionId: string;\n pid: number;\n}\n\nexport interface CopilotSessionDir {\n sessionDir: string;\n sessionId: string;\n}\n\n/** A live Copilot process whose `inuse.<pid>.lock` file should be located. */\nexport interface CopilotLockProcess {\n pid: number;\n startTime?: Date;\n}\n\nexport interface CopilotSessionLocatorOptions {\n sessionStateDir?: string;\n}\n\ninterface KnownLock extends CopilotSessionDir {\n startTimeMs: number;\n}\n\n/**\n * Tolerance between a reported process start time and its lock directory's\n * mtime: `ps lstart` has 1 s resolution, Linux start times derive from an\n * estimated boot time, and some filesystems store coarse mtimes.\n */\nconst START_TIME_SLACK_MS = 5 * 60 * 1000;\n\nconst LOCK_FILE_PATTERN = /^inuse\\.(\\d+)\\.lock$/;\n\nexport class CopilotSessionLocator {\n private readonly sessionStateDir: string;\n /** Lock location per PID, trusted only while that PID's start time is unchanged. */\n private readonly knownLocks = new Map<number, KnownLock>();\n\n constructor(options: CopilotSessionLocatorOptions = {}) {\n this.sessionStateDir =\n options.sessionStateDir ?? path.join(homeDir(), \".copilot\", \"session-state\");\n }\n\n listSessionDirs(): CopilotSessionDir[] {\n if (!isDirectory(this.sessionStateDir)) return [];\n\n const sessionDirs: CopilotSessionDir[] = [];\n for (const sessionId of safeReaddir(this.sessionStateDir)) {\n const sessionDir = path.join(this.sessionStateDir, sessionId);\n if (!isDirectory(sessionDir)) continue;\n\n sessionDirs.push({ sessionDir, sessionId });\n }\n\n return sessionDirs;\n }\n\n findSessionDirById(sessionId: string): CopilotSessionDir | null {\n if (!isSafePathSegment(sessionId)) return null;\n const sessionDir = path.join(this.sessionStateDir, sessionId);\n return isDirectory(sessionDir) ? { sessionDir, sessionId } : null;\n }\n\n /**\n * Find `inuse.<pid>.lock` files.\n *\n * Without `processes`, every session directory is scanned and all locks are\n * returned. With `processes`, only locks of those PIDs are returned and the\n * search is bounded:\n * - a lock found earlier for the same (pid, startTime) is re-validated with\n * a single `stat` (a reused PID has a different start time and misses);\n * - otherwise only session directories whose mtime is at or after the\n * earliest unresolved process start time (minus slack) are listed, since\n * creating the lock file bumps its directory's mtime;\n * - if an unresolved process has no start time, every directory is listed.\n */\n discoverActiveLocks(processes?: readonly CopilotLockProcess[]): CopilotLock[] {\n if (!processes) {\n return this.scanLocks(undefined, () => true);\n }\n\n const startTimes = new Map(processes.map((proc) => [proc.pid, proc.startTime?.getTime()]));\n for (const [pid, known] of this.knownLocks) {\n if (startTimes.get(pid) !== known.startTimeMs) {\n this.knownLocks.delete(pid);\n }\n }\n\n const locks: CopilotLock[] = [];\n const unresolved = new Set<number>();\n for (const pid of startTimes.keys()) {\n const known = this.knownLocks.get(pid);\n if (known && safeStat(path.join(known.sessionDir, lockFileName(pid)))?.isFile()) {\n locks.push({ sessionDir: known.sessionDir, sessionId: known.sessionId, pid });\n continue;\n }\n this.knownLocks.delete(pid);\n unresolved.add(pid);\n }\n if (unresolved.size === 0) return locks;\n\n const unresolvedStarts = [...unresolved].map((pid) => startTimes.get(pid));\n const minMtimeMs = unresolvedStarts.every((start): start is number => start !== undefined)\n ? Math.min(...unresolvedStarts) - START_TIME_SLACK_MS\n : undefined;\n\n const found = this.scanLocks(minMtimeMs, (pid) => unresolved.has(pid));\n\n const lockCounts = new Map<number, number>();\n for (const lock of found) {\n lockCounts.set(lock.pid, (lockCounts.get(lock.pid) ?? 0) + 1);\n }\n for (const lock of found) {\n const startTimeMs = startTimes.get(lock.pid);\n // Only remember unambiguous locks of processes with a known start time\n if (startTimeMs !== undefined && lockCounts.get(lock.pid) === 1) {\n this.knownLocks.set(lock.pid, {\n sessionDir: lock.sessionDir,\n sessionId: lock.sessionId,\n startTimeMs,\n });\n }\n }\n\n return locks.concat(found);\n }\n\n /** List lock files in session directories with mtime >= `minMtimeMs` (all when undefined). */\n private scanLocks(\n minMtimeMs: number | undefined,\n includePid: (pid: number) => boolean,\n ): CopilotLock[] {\n const locks: CopilotLock[] = [];\n for (const sessionId of safeReaddir(this.sessionStateDir)) {\n const sessionDir = path.join(this.sessionStateDir, sessionId);\n const stat = safeStat(sessionDir);\n if (!stat?.isDirectory()) continue;\n if (minMtimeMs !== undefined && stat.mtimeMs < minMtimeMs) continue;\n\n for (const entry of safeReaddir(sessionDir)) {\n const match = entry.match(LOCK_FILE_PATTERN);\n if (!match) continue;\n\n const pid = Number.parseInt(match[1], 10);\n if (!Number.isFinite(pid) || !includePid(pid)) continue;\n locks.push({ sessionDir, sessionId, pid });\n }\n }\n\n return locks;\n }\n}\n\nfunction lockFileName(pid: number): string {\n return `inuse.${pid}.lock`;\n}\n"],"names":["path","isDirectory","isSafePathSegment","safeReaddir","safeStat","homeDir","START_TIME_SLACK_MS","LOCK_FILE_PATTERN","CopilotSessionLocator","sessionStateDir","knownLocks","Map","options","join","listSessionDirs","sessionDirs","sessionId","sessionDir","push","findSessionDirById","discoverActiveLocks","processes","scanLocks","undefined","startTimes","map","proc","pid","startTime","getTime","known","get","startTimeMs","delete","locks","unresolved","Set","keys","lockFileName","isFile","add","size","unresolvedStarts","minMtimeMs","every","start","Math","min","found","has","lockCounts","lock","set","concat","includePid","stat","mtimeMs","entry","match","Number","parseInt","isFinite"],"mappings":"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"}
@@ -0,0 +1,62 @@
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
+ export interface CopilotSession {
5
+ sessionId: string;
6
+ projectPath: string;
7
+ summary: string;
8
+ sessionStart: Date;
9
+ lastActive: Date;
10
+ lastEventType?: string;
11
+ firstUserMessage: string;
12
+ eventsFilePath: string;
13
+ }
14
+ export interface CopilotSessionParserOptions {
15
+ /** Cold-start scan bounds for `readSessionDirIncremental` (see IncrementalJsonlSummary). */
16
+ summaryBounds?: JsonlSummaryBounds | false;
17
+ }
18
+ export declare class CopilotSessionParser {
19
+ /** Incremental reader backing `getConversation({ tail })`. */
20
+ private readonly tailReader;
21
+ private readonly eventCache;
22
+ constructor(options?: CopilotSessionParserOptions);
23
+ /**
24
+ * Fold one events.jsonl entry into the O(1) event summary. Mirrors the
25
+ * original whole-file pass: the latest valid timestamp and event type win,
26
+ * `session.start` overrides id/cwd/start, and user/assistant text is tracked.
27
+ *
28
+ * `skip` (bounded cold start) keeps the head's first user message and clears
29
+ * the latest timestamp, event type and text, so those come from the tail
30
+ * only. Tail entries never fill the first user message: beyond the head it
31
+ * stays "" and the summary falls back to the tail's latest text. The
32
+ * `session.start` fields (id, cwd, start) are kept from the head and, as in
33
+ * a full scan, a later `session.start` in the tail still overrides them; one
34
+ * only in the skipped middle is not seen.
35
+ */
36
+ private readonly eventReducer;
37
+ readSessionDir(sessionDir: string, fallbackSessionId: string): CopilotSession | null;
38
+ /**
39
+ * Same result as `readSessionDir`, but events.jsonl is summarized through a
40
+ * per-instance incremental cache so repeated refreshes only parse appended
41
+ * bytes. Call `pruneSessionCache()` once per refresh.
42
+ *
43
+ * The first read of a large events.jsonl is a bounded head + tail scan (see
44
+ * `eventReducer.skip`); fields whose entries lie only in the skipped middle
45
+ * fall back to their defaults instead of forcing a full parse.
46
+ */
47
+ readSessionDirIncremental(sessionDir: string, fallbackSessionId: string): CopilotSession | null;
48
+ /** Evict cached event summaries for files not read since the previous prune. */
49
+ pruneSessionCache(): void;
50
+ private toSession;
51
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
52
+ private eventToMessage;
53
+ determineStatus(session: CopilotSession): AgentStatus;
54
+ private hasWorkspaceMetadata;
55
+ private readWorkspaceMetadata;
56
+ private stripYamlScalar;
57
+ private parseEventLines;
58
+ private parseEventLine;
59
+ private roleForEvent;
60
+ private extractEventText;
61
+ }
62
+ //# sourceMappingURL=CopilotSessionParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CopilotSessionParser.d.ts","sourceRoot":"","sources":["../../../src/harnesses/copilot/CopilotSessionParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,wCAAwC,CAAC;AAoChD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,gBAAgB,EAAE,MAAM,CAAC;IACzB,cAAc,EAAE,MAAM,CAAC;CACxB;AAoCD,MAAM,WAAW,2BAA2B;IAC1C,4FAA4F;IAC5F,aAAa,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;CAC5C;AAED,qBAAa,oBAAoB;IAC/B,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAEpD,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6C;gBAE5D,OAAO,GAAE,2BAAgC;IAMrD;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,QAAQ,CAAC,YAAY,CA4C3B;IAEF,cAAc,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAUpF;;;;;;;;OAQG;IACH,yBAAyB,CAAC,UAAU,EAAE,MAAM,EAAE,iBAAiB,EAAE,MAAM,GAAG,cAAc,GAAG,IAAI;IAS/F,gFAAgF;IAChF,iBAAiB,IAAI,IAAI;IAIzB,OAAO,CAAC,SAAS;IAmCjB,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IA8B9F,OAAO,CAAC,cAAc;IActB,eAAe,CAAC,OAAO,EAAE,cAAc,GAAG,WAAW;IAYrD,OAAO,CAAC,oBAAoB;IAM5B,OAAO,CAAC,qBAAqB;IA0B7B,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,eAAe;IASvB,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,gBAAgB;CAgBzB"}
@@ -0,0 +1,236 @@
1
+ import * as path from "path";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import { IncrementalJsonlSummary, reduceJsonlContent } from "../../utils/IncrementalJsonlSummary.js";
4
+ import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
5
+ import { safeReadFile, safeStat } from "../../utils/session.js";
6
+ import { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
7
+ const VERBOSE_SYSTEM_EVENTS = new Set([
8
+ "system.message",
9
+ "session.info",
10
+ "session.warning",
11
+ "tool.execution_start",
12
+ "tool.execution_complete",
13
+ "function",
14
+ "abort"
15
+ ]);
16
+ const WAITING_EVENTS = new Set([
17
+ "assistant.message",
18
+ "assistant.turn_end",
19
+ "session.shutdown",
20
+ "abort"
21
+ ]);
22
+ export class CopilotSessionParser {
23
+ /** Incremental reader backing `getConversation({ tail })`. */ tailReader = new JsonlTailReader();
24
+ eventCache;
25
+ constructor(options = {}){
26
+ this.eventCache = new IncrementalJsonlSummary(this.eventReducer, {
27
+ bounds: options.summaryBounds
28
+ });
29
+ }
30
+ /**
31
+ * Fold one events.jsonl entry into the O(1) event summary. Mirrors the
32
+ * original whole-file pass: the latest valid timestamp and event type win,
33
+ * `session.start` overrides id/cwd/start, and user/assistant text is tracked.
34
+ *
35
+ * `skip` (bounded cold start) keeps the head's first user message and clears
36
+ * the latest timestamp, event type and text, so those come from the tail
37
+ * only. Tail entries never fill the first user message: beyond the head it
38
+ * stays "" and the summary falls back to the tail's latest text. The
39
+ * `session.start` fields (id, cwd, start) are kept from the head and, as in
40
+ * a full scan, a later `session.start` in the tail still overrides them; one
41
+ * only in the skipped middle is not seen.
42
+ */ eventReducer = {
43
+ initial: ()=>({
44
+ entryCount: 0,
45
+ firstUserMessage: "",
46
+ lastText: ""
47
+ }),
48
+ reduce: (state, value)=>{
49
+ if (value === undefined) return state;
50
+ const next = {
51
+ ...state,
52
+ entryCount: state.entryCount + 1
53
+ };
54
+ if (!value || typeof value !== "object") return next;
55
+ const entry = value;
56
+ const timestampMs = parseTimestamp(entry.timestamp)?.getTime();
57
+ if (timestampMs !== undefined) {
58
+ next.lastActiveMs = timestampMs;
59
+ }
60
+ if (entry.type) {
61
+ next.lastEventType = entry.type;
62
+ }
63
+ if (entry.type === "session.start") {
64
+ next.sessionId = entry.data?.sessionId || next.sessionId;
65
+ next.projectPath = entry.data?.context?.cwd || next.projectPath;
66
+ next.sessionStartMs = parseTimestamp(entry.data?.startTime)?.getTime() ?? timestampMs ?? next.sessionStartMs;
67
+ return next;
68
+ }
69
+ const text = this.extractEventText(entry, false);
70
+ if (!text) return next;
71
+ if (!next.firstUserMessage && !state.pastHead && entry.type === "user.message") {
72
+ next.firstUserMessage = text;
73
+ }
74
+ if (entry.type === "user.message" || entry.type === "assistant.message") {
75
+ next.lastText = text;
76
+ }
77
+ return next;
78
+ },
79
+ skip: (state)=>({
80
+ entryCount: state.entryCount,
81
+ pastHead: true,
82
+ sessionId: state.sessionId,
83
+ projectPath: state.projectPath,
84
+ sessionStartMs: state.sessionStartMs,
85
+ firstUserMessage: state.firstUserMessage,
86
+ lastText: ""
87
+ })
88
+ };
89
+ readSessionDir(sessionDir, fallbackSessionId) {
90
+ const eventsFilePath = path.join(sessionDir, "events.jsonl");
91
+ const content = safeReadFile(eventsFilePath);
92
+ const events = content === undefined ? this.eventReducer.initial() : reduceJsonlContent(this.eventReducer, content);
93
+ return this.toSession(sessionDir, fallbackSessionId, events);
94
+ }
95
+ /**
96
+ * Same result as `readSessionDir`, but events.jsonl is summarized through a
97
+ * per-instance incremental cache so repeated refreshes only parse appended
98
+ * bytes. Call `pruneSessionCache()` once per refresh.
99
+ *
100
+ * The first read of a large events.jsonl is a bounded head + tail scan (see
101
+ * `eventReducer.skip`); fields whose entries lie only in the skipped middle
102
+ * fall back to their defaults instead of forcing a full parse.
103
+ */ readSessionDirIncremental(sessionDir, fallbackSessionId) {
104
+ const result = this.eventCache.read(path.join(sessionDir, "events.jsonl"));
105
+ return this.toSession(sessionDir, fallbackSessionId, result?.state ?? this.eventReducer.initial());
106
+ }
107
+ /** Evict cached event summaries for files not read since the previous prune. */ pruneSessionCache() {
108
+ this.eventCache.prune();
109
+ }
110
+ toSession(sessionDir, fallbackSessionId, events) {
111
+ const eventsFilePath = path.join(sessionDir, "events.jsonl");
112
+ const workspace = this.readWorkspaceMetadata(path.join(sessionDir, "workspace.yaml"));
113
+ if (events.entryCount === 0 && !this.hasWorkspaceMetadata(workspace)) {
114
+ return null;
115
+ }
116
+ const fileStat = safeStat(eventsFilePath);
117
+ const defaultStart = workspace.createdAt || fileStat?.birthtime || new Date();
118
+ const sessionStart = events.sessionStartMs !== undefined ? new Date(events.sessionStartMs) : defaultStart;
119
+ const lastActive = events.lastActiveMs !== undefined ? new Date(events.lastActiveMs) : workspace.updatedAt || fileStat?.mtime || defaultStart;
120
+ const summary = events.firstUserMessage || events.lastText || workspace.name || "Copilot session active";
121
+ return {
122
+ sessionId: events.sessionId || workspace.id || fallbackSessionId,
123
+ projectPath: events.projectPath || workspace.cwd || "",
124
+ summary: truncate(summary, SUMMARY_MAX_LENGTH),
125
+ sessionStart,
126
+ lastActive,
127
+ lastEventType: events.lastEventType,
128
+ firstUserMessage: events.firstUserMessage,
129
+ eventsFilePath
130
+ };
131
+ }
132
+ getConversation(sessionFilePath, options) {
133
+ const verbose = options?.verbose ?? false;
134
+ const tail = normalizeTail(options?.tail);
135
+ if (tail !== undefined) {
136
+ return this.tailReader.read(sessionFilePath, tail, {
137
+ parseLine: (line)=>{
138
+ const entry = this.parseEventLine(line);
139
+ return entry ? this.eventToMessage(entry, verbose) : null;
140
+ }
141
+ }, String(verbose));
142
+ }
143
+ const content = safeReadFile(sessionFilePath);
144
+ if (content === undefined) return [];
145
+ const messages = [];
146
+ for (const entry of this.parseEventLines(content)){
147
+ const message = this.eventToMessage(entry, verbose);
148
+ if (message) messages.push(message);
149
+ }
150
+ return messages;
151
+ }
152
+ eventToMessage(entry, verbose) {
153
+ const role = this.roleForEvent(entry.type, verbose);
154
+ if (!role) return null;
155
+ const text = this.extractEventText(entry, verbose);
156
+ if (!text) return null;
157
+ return {
158
+ role,
159
+ content: text,
160
+ timestamp: entry.timestamp
161
+ };
162
+ }
163
+ determineStatus(session) {
164
+ if (isIdle(session.lastActive)) {
165
+ return AgentStatus.IDLE;
166
+ }
167
+ if (session.lastEventType !== undefined && WAITING_EVENTS.has(session.lastEventType)) {
168
+ return AgentStatus.WAITING;
169
+ }
170
+ return AgentStatus.RUNNING;
171
+ }
172
+ hasWorkspaceMetadata(workspace) {
173
+ return Boolean(workspace.id || workspace.cwd || workspace.name || workspace.createdAt || workspace.updatedAt);
174
+ }
175
+ readWorkspaceMetadata(filePath) {
176
+ const content = safeReadFile(filePath);
177
+ if (content === undefined) return {};
178
+ const values = new Map();
179
+ for (const rawLine of content.split("\n")){
180
+ const line = rawLine.trim();
181
+ if (!line || line.startsWith("#")) continue;
182
+ const idx = line.indexOf(":");
183
+ if (idx === -1) continue;
184
+ const key = line.slice(0, idx).trim();
185
+ const value = this.stripYamlScalar(line.slice(idx + 1).trim());
186
+ values.set(key, value);
187
+ }
188
+ return {
189
+ id: values.get("id"),
190
+ cwd: values.get("cwd"),
191
+ name: values.get("name"),
192
+ createdAt: parseTimestamp(values.get("created_at")) || undefined,
193
+ updatedAt: parseTimestamp(values.get("updated_at")) || undefined
194
+ };
195
+ }
196
+ stripYamlScalar(value) {
197
+ if (value.startsWith('"') && value.endsWith('"') || value.startsWith("'") && value.endsWith("'")) {
198
+ return value.slice(1, -1);
199
+ }
200
+ return value;
201
+ }
202
+ parseEventLines(content) {
203
+ const entries = [];
204
+ for (const line of content.trim().split("\n")){
205
+ const entry = this.parseEventLine(line);
206
+ if (entry) entries.push(entry);
207
+ }
208
+ return entries;
209
+ }
210
+ parseEventLine(line) {
211
+ const trimmed = line.trim();
212
+ if (!trimmed) return null;
213
+ try {
214
+ return JSON.parse(trimmed);
215
+ } catch {
216
+ return null;
217
+ }
218
+ }
219
+ roleForEvent(type, verbose) {
220
+ if (type === "user.message") return "user";
221
+ if (type === "assistant.message") return "assistant";
222
+ if (verbose && type !== undefined && VERBOSE_SYSTEM_EVENTS.has(type)) {
223
+ return "system";
224
+ }
225
+ return null;
226
+ }
227
+ extractEventText(entry, verbose) {
228
+ const data = entry.data;
229
+ if (!data) return "";
230
+ const raw = data.content || data.message || data.text || data.result?.content || data.result?.detailedContent || (verbose ? data.output : "") || "";
231
+ if (typeof raw !== "string") return "";
232
+ return raw.trim();
233
+ }
234
+ }
235
+
236
+ //# sourceMappingURL=CopilotSessionParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/copilot/CopilotSessionParser.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryBounds,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { JsonlTailReader, normalizeTail } from \"../../utils/jsonlTail.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\nimport { isIdle, parseTimestamp, SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\n\ninterface CopilotEventEntry {\n type?: string;\n data?: {\n sessionId?: string;\n startTime?: string;\n context?: {\n cwd?: string;\n gitRoot?: string;\n branch?: string;\n };\n content?: string;\n transformedContent?: string;\n message?: string;\n text?: string;\n result?: {\n content?: string;\n detailedContent?: string;\n };\n output?: string;\n };\n timestamp?: string;\n}\n\ninterface CopilotWorkspace {\n id?: string;\n cwd?: string;\n name?: string;\n createdAt?: Date;\n updatedAt?: Date;\n}\n\nexport interface CopilotSession {\n sessionId: string;\n projectPath: string;\n summary: string;\n sessionStart: Date;\n lastActive: Date;\n lastEventType?: string;\n firstUserMessage: string;\n eventsFilePath: string;\n}\n\n/**\n * O(1) running summary of events.jsonl. Timestamps are epoch ms so cached\n * state stays immutable; unset fields fall back to workspace.yaml metadata.\n */\ninterface CopilotEventState {\n /** Number of lines that parsed as JSON. */\n entryCount: number;\n /** A bounded cold start skipped the middle: later lines are not the session's first. */\n pastHead?: boolean;\n sessionId?: string;\n projectPath?: string;\n sessionStartMs?: number;\n lastActiveMs?: number;\n firstUserMessage: string;\n lastText: string;\n lastEventType?: string;\n}\n\nconst VERBOSE_SYSTEM_EVENTS = new Set([\n \"system.message\",\n \"session.info\",\n \"session.warning\",\n \"tool.execution_start\",\n \"tool.execution_complete\",\n \"function\",\n \"abort\",\n]);\nconst WAITING_EVENTS = new Set([\n \"assistant.message\",\n \"assistant.turn_end\",\n \"session.shutdown\",\n \"abort\",\n]);\n\nexport interface CopilotSessionParserOptions {\n /** Cold-start scan bounds for `readSessionDirIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\nexport class CopilotSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly eventCache: IncrementalJsonlSummary<CopilotEventState>;\n\n constructor(options: CopilotSessionParserOptions = {}) {\n this.eventCache = new IncrementalJsonlSummary(this.eventReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n /**\n * Fold one events.jsonl entry into the O(1) event summary. Mirrors the\n * original whole-file pass: the latest valid timestamp and event type win,\n * `session.start` overrides id/cwd/start, and user/assistant text is tracked.\n *\n * `skip` (bounded cold start) keeps the head's first user message and clears\n * the latest timestamp, event type and text, so those come from the tail\n * only. Tail entries never fill the first user message: beyond the head it\n * stays \"\" and the summary falls back to the tail's latest text. The\n * `session.start` fields (id, cwd, start) are kept from the head and, as in\n * a full scan, a later `session.start` in the tail still overrides them; one\n * only in the skipped middle is not seen.\n */\n private readonly eventReducer: JsonlSummaryReducer<CopilotEventState> = {\n initial: () => ({ entryCount: 0, firstUserMessage: \"\", lastText: \"\" }),\n reduce: (state, value) => {\n if (value === undefined) return state;\n const next: CopilotEventState = { ...state, entryCount: state.entryCount + 1 };\n if (!value || typeof value !== \"object\") return next;\n\n const entry = value as CopilotEventEntry;\n const timestampMs = parseTimestamp(entry.timestamp)?.getTime();\n if (timestampMs !== undefined) {\n next.lastActiveMs = timestampMs;\n }\n if (entry.type) {\n next.lastEventType = entry.type;\n }\n\n if (entry.type === \"session.start\") {\n next.sessionId = entry.data?.sessionId || next.sessionId;\n next.projectPath = entry.data?.context?.cwd || next.projectPath;\n next.sessionStartMs =\n parseTimestamp(entry.data?.startTime)?.getTime() ?? timestampMs ?? next.sessionStartMs;\n return next;\n }\n\n const text = this.extractEventText(entry, false);\n if (!text) return next;\n\n if (!next.firstUserMessage && !state.pastHead && entry.type === \"user.message\") {\n next.firstUserMessage = text;\n }\n if (entry.type === \"user.message\" || entry.type === \"assistant.message\") {\n next.lastText = text;\n }\n return next;\n },\n skip: (state) => ({\n entryCount: state.entryCount,\n pastHead: true,\n sessionId: state.sessionId,\n projectPath: state.projectPath,\n sessionStartMs: state.sessionStartMs,\n firstUserMessage: state.firstUserMessage,\n lastText: \"\",\n }),\n };\n\n readSessionDir(sessionDir: string, fallbackSessionId: string): CopilotSession | null {\n const eventsFilePath = path.join(sessionDir, \"events.jsonl\");\n const content = safeReadFile(eventsFilePath);\n const events =\n content === undefined\n ? this.eventReducer.initial()\n : reduceJsonlContent(this.eventReducer, content);\n return this.toSession(sessionDir, fallbackSessionId, events);\n }\n\n /**\n * Same result as `readSessionDir`, but events.jsonl is summarized through a\n * per-instance incremental cache so repeated refreshes only parse appended\n * bytes. Call `pruneSessionCache()` once per refresh.\n *\n * The first read of a large events.jsonl is a bounded head + tail scan (see\n * `eventReducer.skip`); fields whose entries lie only in the skipped middle\n * fall back to their defaults instead of forcing a full parse.\n */\n readSessionDirIncremental(sessionDir: string, fallbackSessionId: string): CopilotSession | null {\n const result = this.eventCache.read(path.join(sessionDir, \"events.jsonl\"));\n return this.toSession(\n sessionDir,\n fallbackSessionId,\n result?.state ?? this.eventReducer.initial(),\n );\n }\n\n /** Evict cached event summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.eventCache.prune();\n }\n\n private toSession(\n sessionDir: string,\n fallbackSessionId: string,\n events: CopilotEventState,\n ): CopilotSession | null {\n const eventsFilePath = path.join(sessionDir, \"events.jsonl\");\n const workspace = this.readWorkspaceMetadata(path.join(sessionDir, \"workspace.yaml\"));\n if (events.entryCount === 0 && !this.hasWorkspaceMetadata(workspace)) {\n return null;\n }\n\n const fileStat = safeStat(eventsFilePath);\n const defaultStart = workspace.createdAt || fileStat?.birthtime || new Date();\n const sessionStart =\n events.sessionStartMs !== undefined ? new Date(events.sessionStartMs) : defaultStart;\n const lastActive =\n events.lastActiveMs !== undefined\n ? new Date(events.lastActiveMs)\n : workspace.updatedAt || fileStat?.mtime || defaultStart;\n\n const summary =\n events.firstUserMessage || events.lastText || workspace.name || \"Copilot session active\";\n\n return {\n sessionId: events.sessionId || workspace.id || fallbackSessionId,\n projectPath: events.projectPath || workspace.cwd || \"\",\n summary: truncate(summary, SUMMARY_MAX_LENGTH),\n sessionStart,\n lastActive,\n lastEventType: events.lastEventType,\n firstUserMessage: events.firstUserMessage,\n eventsFilePath,\n };\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n const verbose = options?.verbose ?? false;\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n return this.tailReader.read(\n sessionFilePath,\n tail,\n {\n parseLine: (line) => {\n const entry = this.parseEventLine(line);\n return entry ? this.eventToMessage(entry, verbose) : null;\n },\n },\n String(verbose),\n );\n }\n\n const content = safeReadFile(sessionFilePath);\n if (content === undefined) return [];\n\n const messages: ConversationMessage[] = [];\n\n for (const entry of this.parseEventLines(content)) {\n const message = this.eventToMessage(entry, verbose);\n if (message) messages.push(message);\n }\n\n return messages;\n }\n\n private eventToMessage(entry: CopilotEventEntry, verbose: boolean): ConversationMessage | null {\n const role = this.roleForEvent(entry.type, verbose);\n if (!role) return null;\n\n const text = this.extractEventText(entry, verbose);\n if (!text) return null;\n\n return {\n role,\n content: text,\n timestamp: entry.timestamp,\n };\n }\n\n determineStatus(session: CopilotSession): AgentStatus {\n if (isIdle(session.lastActive)) {\n return AgentStatus.IDLE;\n }\n\n if (session.lastEventType !== undefined && WAITING_EVENTS.has(session.lastEventType)) {\n return AgentStatus.WAITING;\n }\n\n return AgentStatus.RUNNING;\n }\n\n private hasWorkspaceMetadata(workspace: CopilotWorkspace): boolean {\n return Boolean(\n workspace.id || workspace.cwd || workspace.name || workspace.createdAt || workspace.updatedAt,\n );\n }\n\n private readWorkspaceMetadata(filePath: string): CopilotWorkspace {\n const content = safeReadFile(filePath);\n if (content === undefined) return {};\n\n const values = new Map<string, string>();\n for (const rawLine of content.split(\"\\n\")) {\n const line = rawLine.trim();\n if (!line || line.startsWith(\"#\")) continue;\n\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n\n const key = line.slice(0, idx).trim();\n const value = this.stripYamlScalar(line.slice(idx + 1).trim());\n values.set(key, value);\n }\n\n return {\n id: values.get(\"id\"),\n cwd: values.get(\"cwd\"),\n name: values.get(\"name\"),\n createdAt: parseTimestamp(values.get(\"created_at\")) || undefined,\n updatedAt: parseTimestamp(values.get(\"updated_at\")) || undefined,\n };\n }\n\n private stripYamlScalar(value: string): string {\n if (\n (value.startsWith('\"') && value.endsWith('\"')) ||\n (value.startsWith(\"'\") && value.endsWith(\"'\"))\n ) {\n return value.slice(1, -1);\n }\n return value;\n }\n\n private parseEventLines(content: string): CopilotEventEntry[] {\n const entries: CopilotEventEntry[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n const entry = this.parseEventLine(line);\n if (entry) entries.push(entry);\n }\n return entries;\n }\n\n private parseEventLine(line: string): CopilotEventEntry | null {\n const trimmed = line.trim();\n if (!trimmed) return null;\n\n try {\n return JSON.parse(trimmed) as CopilotEventEntry;\n } catch {\n return null;\n }\n }\n\n private roleForEvent(\n type: string | undefined,\n verbose: boolean,\n ): ConversationMessage[\"role\"] | null {\n if (type === \"user.message\") return \"user\";\n if (type === \"assistant.message\") return \"assistant\";\n if (verbose && type !== undefined && VERBOSE_SYSTEM_EVENTS.has(type)) {\n return \"system\";\n }\n return null;\n }\n\n private extractEventText(entry: CopilotEventEntry, verbose: boolean): string {\n const data = entry.data;\n if (!data) return \"\";\n\n const raw =\n data.content ||\n data.message ||\n data.text ||\n data.result?.content ||\n data.result?.detailedContent ||\n (verbose ? data.output : \"\") ||\n \"\";\n\n if (typeof raw !== \"string\") return \"\";\n return raw.trim();\n }\n}\n"],"names":["path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","safeReadFile","safeStat","isIdle","parseTimestamp","SUMMARY_MAX_LENGTH","truncate","VERBOSE_SYSTEM_EVENTS","Set","WAITING_EVENTS","CopilotSessionParser","tailReader","eventCache","options","eventReducer","bounds","summaryBounds","initial","entryCount","firstUserMessage","lastText","reduce","state","value","undefined","next","entry","timestampMs","timestamp","getTime","lastActiveMs","type","lastEventType","sessionId","data","projectPath","context","cwd","sessionStartMs","startTime","text","extractEventText","pastHead","skip","readSessionDir","sessionDir","fallbackSessionId","eventsFilePath","join","content","events","toSession","readSessionDirIncremental","result","read","pruneSessionCache","prune","workspace","readWorkspaceMetadata","hasWorkspaceMetadata","fileStat","defaultStart","createdAt","birthtime","Date","sessionStart","lastActive","updatedAt","mtime","summary","name","id","getConversation","sessionFilePath","verbose","tail","parseLine","line","parseEventLine","eventToMessage","String","messages","parseEventLines","message","push","role","roleForEvent","determineStatus","session","IDLE","has","WAITING","RUNNING","Boolean","filePath","values","Map","rawLine","split","trim","startsWith","idx","indexOf","key","slice","stripYamlScalar","set","get","endsWith","entries","trimmed","JSON","parse","raw","detailedContent","output"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"GeminiAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/gemini/GeminiAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEnF,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,mBAA+C;IAEpF,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;IAehG,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAYzD"}
1
+ {"version":3,"file":"GeminiAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/gemini/GeminiAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,EAAE,mBAAmB,EAAE,KAAK,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAGnF,qBAAa,iBAAiB;IAChB,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,mBAA+C;IAEpF,iBAAiB,CAAC,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;IAehG,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}