@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/claude/ClaudeSessionParser.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * 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\";\n\n/**\n * Content block within a Claude Code JSONL message entry.\n * Handles text, tool_use, and tool_result block types.\n */\nexport interface ContentBlock {\n type?: string;\n text?: string;\n content?: string;\n name?: string;\n input?: Record<string, unknown>;\n tool_use_id?: string;\n is_error?: boolean;\n}\n\n/**\n * A single line entry in a Claude Code session JSONL file.\n *\n * Each line is an independent JSON object with a type discriminator:\n * - \"user\" / \"assistant\" / \"system\" — conversation turns\n * - \"progress\" / \"thinking\" — intermediate agent state\n * - \"last-prompt\" / \"file-history-snapshot\" — metadata (not conversation state)\n */\nexport interface SessionEntry {\n type?: string;\n timestamp?: string;\n cwd?: string;\n message?: {\n content?: string | ContentBlock[];\n };\n}\n\n/**\n * Parsed session state extracted from a JSONL file.\n * Aggregates data from all entries into a single summary.\n */\nexport interface ClaudeSession {\n sessionId: string;\n projectPath: string;\n lastCwd?: string;\n sessionStart: Date;\n lastActive: Date;\n lastEntryType?: string;\n isInterrupted: boolean;\n lastUserMessage?: string;\n /** First meaningful user prompt in the session (post noise filter) */\n firstUserMessage?: string;\n}\n\n/**\n * O(1) running summary folded from session entries; `toSession` turns it into\n * a `ClaudeSession`. Timestamps are epoch ms so cached state stays immutable.\n */\ninterface ClaudeSummaryState {\n seenFirstLine: boolean;\n /** A bounded cold start skipped the middle: later lines are not the session's first. */\n pastHead?: boolean;\n sessionStartMs?: number;\n lastActiveMs?: number;\n lastCwd?: string;\n lastEntryType?: string;\n isInterrupted: boolean;\n lastUserMessage?: string;\n firstUserMessage?: string;\n}\n\n/**\n * Top-level JSONL entry types that represent conversation/agent state.\n *\n * Only these types update `lastEntryType` for status determination. All\n * other types Claude Code emits (`attachment`, `permission-mode`,\n * `ai-title`, `queued_command`, `tools_changed`, `model_changed`,\n * `hook_progress`, …) are UI-state events that must not overwrite the\n * last conversation turn — otherwise polling between writes lands on a\n * UI-state entry and `determineStatus` falls through to UNKNOWN.\n */\nconst CONVERSATION_ENTRY_TYPES = new Set([\"user\", \"assistant\", \"system\", \"progress\", \"thinking\"]);\n\nexport interface ClaudeSessionParserOptions {\n /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\n/**\n * Parses Claude Code session JSONL files into structured data.\n *\n * Session files live at ~/.claude/projects/<encoded-cwd>/<session-id>.jsonl\n * and contain one JSON object per line, each representing a conversation\n * event (user turn, assistant response, tool call, etc.).\n */\nexport class ClaudeSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly sessionCache: IncrementalJsonlSummary<ClaudeSummaryState>;\n\n constructor(options: ClaudeSessionParserOptions = {}) {\n this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n /**\n * Parse a session JSONL file into a ClaudeSession summary.\n *\n * Iterates all lines to extract: session start time (from first entry),\n * last activity timestamp, last entry type (for status), whether the\n * session was interrupted, and the last meaningful user message.\n *\n * Returns null if the file is unreadable or empty.\n */\n readSession(filePath: string, projectPath: string): ClaudeSession | null {\n let content: string;\n try {\n content = fs.readFileSync(filePath, \"utf-8\");\n } catch {\n return null;\n }\n\n return this.toSession(filePath, projectPath, reduceJsonlContent(this.summaryReducer, content));\n }\n\n /**\n * Same result as `readSession`, but backed by a per-instance incremental\n * cache so repeated refreshes only parse bytes appended since the last call.\n * Call `pruneSessionCache()` once per refresh to evict files no longer read.\n *\n * The first read of a large transcript is a bounded head + tail scan (see\n * `summaryReducer.skip`); fields whose entries lie only in the skipped\n * middle fall back to their defaults instead of forcing a full parse.\n */\n readSessionIncremental(filePath: string, projectPath: string): ClaudeSession | null {\n const result = this.sessionCache.read(filePath);\n return result ? this.toSession(filePath, projectPath, result.state) : null;\n }\n\n /** Evict cached summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.sessionCache.prune();\n }\n\n /**\n * Fold one JSONL entry into the O(1) session summary. Mirrors the fields\n * `readSession` exposes: session start comes from the first line only;\n * everything else tracks the latest matching entry.\n *\n * `skip` (bounded cold start) keeps the head's session start and first user\n * message and clears every \"latest\" field, so those come from the tail only:\n * a first user message beyond the head stays undefined, and a last user\n * message before the tail window stays undefined.\n */\n private readonly summaryReducer: JsonlSummaryReducer<ClaudeSummaryState> = {\n initial: () => ({ seenFirstLine: false, isInterrupted: false }),\n reduce: (state, value) => {\n const next: ClaudeSummaryState = { ...state, seenFirstLine: true };\n if (!state.seenFirstLine) {\n next.sessionStartMs = this.parseSessionStart(value);\n }\n if (!value || typeof value !== \"object\") {\n return next;\n }\n\n const entry = value as SessionEntry;\n if (entry.timestamp) {\n const ts = new Date(entry.timestamp).getTime();\n if (!Number.isNaN(ts)) {\n next.lastActiveMs = ts;\n }\n }\n\n if (typeof entry.cwd === \"string\" && entry.cwd.trim().length > 0) {\n next.lastCwd = entry.cwd;\n }\n\n if (entry.type && CONVERSATION_ENTRY_TYPES.has(entry.type)) {\n next.lastEntryType = entry.type;\n\n if (entry.type === \"user\") {\n const msgContent = entry.message?.content;\n next.isInterrupted =\n Array.isArray(msgContent) &&\n msgContent.some(\n (c) =>\n (c.type === \"text\" && c.text?.includes(\"[Request interrupted\")) ||\n (c.type === \"tool_result\" && c.content?.includes(\"[Request interrupted\")),\n );\n\n const text = this.extractUserMessageText(msgContent);\n if (text) {\n next.lastUserMessage = text;\n if (!next.firstUserMessage && !state.pastHead) {\n next.firstUserMessage = text;\n }\n }\n } else {\n next.isInterrupted = false;\n }\n }\n\n return next;\n },\n skip: (state) => ({\n seenFirstLine: true,\n pastHead: true,\n sessionStartMs: state.sessionStartMs,\n firstUserMessage: state.firstUserMessage,\n isInterrupted: false,\n }),\n };\n\n private toSession(\n filePath: string,\n projectPath: string,\n state: ClaudeSummaryState,\n ): ClaudeSession {\n const sessionStartMs = state.sessionStartMs ?? state.lastActiveMs;\n return {\n sessionId: path.basename(filePath, \".jsonl\"),\n projectPath: projectPath || state.lastCwd || \"\",\n lastCwd: state.lastCwd,\n sessionStart: sessionStartMs !== undefined ? new Date(sessionStartMs) : new Date(),\n lastActive: state.lastActiveMs !== undefined ? new Date(state.lastActiveMs) : new Date(),\n lastEntryType: state.lastEntryType,\n isInterrupted: state.isInterrupted,\n lastUserMessage: state.lastUserMessage,\n firstUserMessage: state.firstUserMessage,\n };\n }\n\n /**\n * Determine agent status from parsed session state.\n *\n * Status mapping:\n * - \"user\" + interrupted → WAITING (agent finished, awaiting new input)\n * - \"user\" + not interrupted → RUNNING (agent is processing)\n * - \"progress\" / \"thinking\" → RUNNING\n * - \"assistant\" → WAITING (agent responded, awaiting user)\n * - \"system\" → IDLE\n */\n determineStatus(session: ClaudeSession): AgentStatus {\n if (!session.lastEntryType) {\n return AgentStatus.UNKNOWN;\n }\n\n if (session.lastEntryType === \"user\") {\n return session.isInterrupted ? AgentStatus.WAITING : AgentStatus.RUNNING;\n }\n\n if (session.lastEntryType === \"progress\" || session.lastEntryType === \"thinking\") {\n return AgentStatus.RUNNING;\n }\n\n if (session.lastEntryType === \"assistant\") {\n return AgentStatus.WAITING;\n }\n\n if (session.lastEntryType === \"system\") {\n return AgentStatus.IDLE;\n }\n\n return AgentStatus.UNKNOWN;\n }\n\n /**\n * Read the full conversation from a session JSONL file.\n *\n * Default mode returns only text content from user/assistant/system messages.\n * Verbose mode also includes tool_use and tool_result blocks. With `tail`,\n * only the last N messages are read (from the end of the file).\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 { parseLine: (line) => this.lineToMessage(line, verbose) },\n String(verbose),\n );\n }\n\n let content: string;\n try {\n content = fs.readFileSync(sessionFilePath, \"utf-8\");\n } catch {\n return [];\n }\n\n const lines = content.trim().split(\"\\n\");\n const messages: ConversationMessage[] = [];\n\n for (const line of lines) {\n const message = this.lineToMessage(line, verbose);\n if (message) messages.push(message);\n }\n\n return messages;\n }\n\n /** Convert one JSONL line into a conversation message, or null when it is not one. */\n private lineToMessage(line: string, verbose: boolean): ConversationMessage | null {\n let entry: SessionEntry;\n try {\n entry = JSON.parse(line);\n } catch {\n return null;\n }\n\n let role: ConversationMessage[\"role\"];\n if (entry.type === \"user\") {\n role = \"user\";\n } else if (entry.type === \"assistant\") {\n role = \"assistant\";\n } else if (entry.type === \"system\") {\n role = \"system\";\n } else {\n return null;\n }\n\n const text = this.extractConversationContent(entry.message?.content, role, verbose);\n if (!text) return null;\n\n return {\n role,\n content: text,\n timestamp: entry.timestamp,\n };\n }\n\n /**\n * Parse session start time (epoch ms) from the first JSONL entry.\n *\n * Claude Code may emit a \"file-history-snapshot\" as the first entry,\n * which stores its timestamp inside \"snapshot.timestamp\" rather than\n * at the root level.\n */\n private parseSessionStart(firstEntry: unknown): number | undefined {\n if (!firstEntry || typeof firstEntry !== \"object\") {\n return undefined;\n }\n const entry = firstEntry as { timestamp?: string; snapshot?: { timestamp?: string } };\n const rawTs = entry.timestamp || entry.snapshot?.timestamp;\n if (rawTs) {\n const ts = new Date(rawTs).getTime();\n if (!Number.isNaN(ts)) {\n return ts;\n }\n }\n return undefined;\n }\n\n /**\n * Extract meaningful text from a user message content field.\n *\n * Handles multiple formats:\n * - Plain string content\n * - Array of content blocks (extracts first text block)\n * - Skill slash-commands (<command-message> tags)\n * - Expanded skill content (extracts ARGUMENTS line)\n * - Filters noise messages (interruptions, tool loaded, session continued)\n */\n private extractUserMessageText(\n content: string | Array<{ type?: string; text?: string }> | undefined,\n ): string | undefined {\n if (!content) {\n return undefined;\n }\n\n let raw: string | undefined;\n\n if (typeof content === \"string\") {\n raw = content.trim();\n } else if (Array.isArray(content)) {\n for (const block of content) {\n if (block.type === \"text\" && block.text?.trim()) {\n raw = block.text.trim();\n break;\n }\n }\n }\n\n if (!raw) {\n return undefined;\n }\n\n if (raw.startsWith(\"<command-message>\")) {\n return this.parseCommandMessage(raw);\n }\n\n if (raw.startsWith(\"Base directory for this skill:\")) {\n const argsMatch = raw.match(/\\nARGUMENTS:\\s*(.+)/);\n return argsMatch?.[1]?.trim() || undefined;\n }\n\n if (isNoiseMessage(raw)) {\n return undefined;\n }\n\n return raw;\n }\n\n /**\n * Parse a <command-message> string into \"/command args\" format.\n */\n private parseCommandMessage(raw: string): string | undefined {\n const nameMatch = raw.match(/<command-name>([^<]+)<\\/command-name>/);\n const argsMatch = raw.match(/<command-args>([^<]+)<\\/command-args>/);\n const name = nameMatch?.[1]?.trim();\n if (!name) {\n return undefined;\n }\n const args = argsMatch?.[1]?.trim();\n return args ? `${name} ${args}` : name;\n }\n\n /**\n * Extract displayable content from a message content field for conversation output.\n */\n private extractConversationContent(\n content: string | ContentBlock[] | undefined,\n role: ConversationMessage[\"role\"],\n verbose: boolean,\n ): string | undefined {\n if (!content) return undefined;\n\n if (typeof content === \"string\") {\n const cleaned = stripHarnessTags(content);\n if (role === \"user\" && isNoiseMessage(cleaned)) return undefined;\n return cleaned || undefined;\n }\n\n if (!Array.isArray(content)) return undefined;\n\n const parts: string[] = [];\n\n for (const block of content) {\n if (block.type === \"text\" && block.text?.trim()) {\n const cleaned = stripHarnessTags(block.text);\n if (!cleaned) continue;\n if (role === \"user\" && isNoiseMessage(cleaned)) continue;\n parts.push(cleaned);\n } else if (block.type === \"tool_use\" && verbose) {\n const inputSummary =\n block.input?.file_path || block.input?.pattern || block.input?.command || \"\";\n parts.push(`[Tool: ${block.name}]${inputSummary ? \" \" + inputSummary : \"\"}`);\n } else if (block.type === \"tool_result\" && verbose) {\n const truncated = truncateToolResult(block.content || \"\");\n const prefix = block.is_error ? \"[Tool Error]\" : \"[Tool Result]\";\n parts.push(`${prefix} ${truncated}`);\n }\n }\n\n return parts.length > 0 ? parts.join(\"\\n\") : undefined;\n }\n}\n\n/**\n * Tags whose entire block (including content) should be dropped — they are\n * harness-injected prompt context (system reminders, hook output, command\n * stdout), not meaningful conversation content.\n */\nconst HARNESS_DROP_TAGS = [\n \"system-reminder\",\n \"local-command-stdout\",\n \"local-command-stderr\",\n \"user-prompt-submit-hook\",\n \"command-stdout\",\n \"command-stderr\",\n \"bash-input\",\n \"bash-stdout\",\n \"bash-stderr\",\n \"command-message\",\n] as const;\n\nconst HARNESS_DROP_RE = new RegExp(`<(${HARNESS_DROP_TAGS.join(\"|\")})>[\\\\s\\\\S]*?</\\\\1>`, \"g\");\n\nconst COMMAND_INVOCATION_RE =\n /<command-name>([^<]+)<\\/command-name>(?:\\s*<command-args>([\\s\\S]*?)<\\/command-args>)?/g;\n\n/**\n * Remove harness-injected XML blocks from message text and collapse\n * <command-name>/<command-args> pairs into a \"/name args\" shorthand.\n *\n * Returns the cleaned, trimmed text. Returns an empty string if nothing\n * survives stripping.\n */\nfunction stripHarnessTags(text: string): string {\n let out = text.replace(HARNESS_DROP_RE, \"\");\n\n out = out.replace(COMMAND_INVOCATION_RE, (_match, rawName: string, rawArgs?: string) => {\n const name = rawName.trim();\n const args = rawArgs?.trim();\n return args ? `${name} ${args}` : name;\n });\n\n return out.replace(/\\n{3,}/g, \"\\n\\n\").trim();\n}\n\n/** Check if a message is noise (not a meaningful user intent). */\nfunction isNoiseMessage(text: string): boolean {\n return (\n text.startsWith(\"[Request interrupted\") ||\n text === \"Tool loaded.\" ||\n text.startsWith(\"This session is being continued\")\n );\n}\n\nfunction truncateToolResult(content: string, maxLength = 200): string {\n const firstLine = content.split(\"\\n\")[0] || \"\";\n if (firstLine.length <= maxLength) return firstLine;\n return firstLine.slice(0, maxLength - 3) + \"...\";\n}\n"],"names":["fs","path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","CONVERSATION_ENTRY_TYPES","Set","ClaudeSessionParser","tailReader","sessionCache","options","summaryReducer","bounds","summaryBounds","readSession","filePath","projectPath","content","readFileSync","toSession","readSessionIncremental","result","read","state","pruneSessionCache","prune","initial","seenFirstLine","isInterrupted","reduce","value","next","sessionStartMs","parseSessionStart","entry","timestamp","ts","Date","getTime","Number","isNaN","lastActiveMs","cwd","trim","length","lastCwd","type","has","lastEntryType","msgContent","message","Array","isArray","some","c","text","includes","extractUserMessageText","lastUserMessage","firstUserMessage","pastHead","skip","sessionId","basename","sessionStart","undefined","lastActive","determineStatus","session","UNKNOWN","WAITING","RUNNING","IDLE","getConversation","sessionFilePath","verbose","tail","parseLine","line","lineToMessage","String","lines","split","messages","push","JSON","parse","role","extractConversationContent","firstEntry","rawTs","snapshot","raw","block","startsWith","parseCommandMessage","argsMatch","match","isNoiseMessage","nameMatch","name","args","cleaned","stripHarnessTags","parts","inputSummary","input","file_path","pattern","command","truncated","truncateToolResult","prefix","is_error","join","HARNESS_DROP_TAGS","HARNESS_DROP_RE","RegExp","COMMAND_INVOCATION_RE","out","replace","_match","rawName","rawArgs","maxLength","firstLine","slice"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/providers/claude/durable/ClaudeCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAKlE,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,GAAE,qBAA0B;IAazC,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBnE"}
1
+ {"version":3,"file":"ClaudeCliProbe.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/claude/durable/ClaudeCliProbe.ts"],"names":[],"mappings":"AAKA,KAAK,UAAU,GAAG;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AACrD,KAAK,IAAI,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,UAAU,CAAC,CAAC;AAKlE,MAAM,WAAW,qBAAqB;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,IAAI,CAAC;CACb;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAO;gBAEhB,OAAO,GAAE,qBAA0B;IAazC,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAuBnE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/providers/claude/durable/ClaudeCliProbe.ts"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { sanitizeText } from \"../../../durable/utils.js\";\n\ntype ExecResult = { stdout: string; stderr: string };\ntype Exec = (file: string, args: string[]) => Promise<ExecResult>;\n\nconst execFileAsync = promisify(execFile);\nconst REQUIRED = [\"--print\", \"--session-id\", \"--resume\", \"--output-format\", \"stream-json\"];\n\nexport interface ClaudeCliProbeOptions {\n executable?: string;\n exec?: Exec;\n}\n\nexport class ClaudeCliProbe {\n private readonly executable: string;\n private readonly exec: Exec;\n\n constructor(options: ClaudeCliProbeOptions = {}) {\n this.executable = options.executable ?? \"claude\";\n this.exec =\n options.exec ??\n (async (file, args) => {\n const result = await execFileAsync(file, args, {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n });\n }\n\n async validate(): Promise<{ executable: string; version: string }> {\n try {\n const versionResult = await this.exec(this.executable, [\"--version\"]);\n const helpResult = await this.exec(this.executable, [\"--help\"]);\n const missing = REQUIRED.filter((capability) => !helpResult.stdout.includes(capability));\n if (missing.length > 0) {\n throw new ClaudePrintError(\n `Claude CLI does not support required print-mode capabilities: ${missing.join(\", \")}.`,\n \"CLAUDE_CLI_UNSUPPORTED\",\n );\n }\n return {\n executable: this.executable,\n version: sanitizeText(versionResult.stdout, 256) || \"unknown\",\n };\n } catch (error) {\n if (error instanceof ClaudePrintError) throw error;\n throw new ClaudePrintError(\n `Claude CLI validation failed: ${sanitizeText((error as Error).message, 512)}`,\n \"CLAUDE_CLI_UNAVAILABLE\",\n );\n }\n }\n}\n"],"names":["execFile","promisify","ClaudePrintError","sanitizeText","execFileAsync","REQUIRED","ClaudeCliProbe","executable","exec","options","file","args","result","encoding","maxBuffer","stdout","stderr","validate","versionResult","helpResult","missing","filter","capability","includes","length","join","version","error","message"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,YAAY,QAAQ,4BAA4B;AAKzD,MAAMC,gBAAgBH,UAAUD;AAChC,MAAMK,WAAW;IAAC;IAAW;IAAgB;IAAY;IAAmB;CAAc;AAO1F,OAAO,MAAMC;IACMC,WAAmB;IACnBC,KAAW;IAE5B,YAAYC,UAAiC,CAAC,CAAC,CAAE;QAC/C,IAAI,CAACF,UAAU,GAAGE,QAAQF,UAAU,IAAI;QACxC,IAAI,CAACC,IAAI,GACPC,QAAQD,IAAI,IACX,CAAA,OAAOE,MAAMC;YACZ,MAAMC,SAAS,MAAMR,cAAcM,MAAMC,MAAM;gBAC7CE,UAAU;gBACVC,WAAW,OAAO;YACpB;YACA,OAAO;gBAAEC,QAAQH,OAAOG,MAAM;gBAAEC,QAAQJ,OAAOI,MAAM;YAAC;QACxD,CAAA;IACJ;IAEA,MAAMC,WAA6D;QACjE,IAAI;YACF,MAAMC,gBAAgB,MAAM,IAAI,CAACV,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAY;YACpE,MAAMY,aAAa,MAAM,IAAI,CAACX,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAS;YAC9D,MAAMa,UAAUf,SAASgB,MAAM,CAAC,CAACC,aAAe,CAACH,WAAWJ,MAAM,CAACQ,QAAQ,CAACD;YAC5E,IAAIF,QAAQI,MAAM,GAAG,GAAG;gBACtB,MAAM,IAAItB,iBACR,CAAC,8DAA8D,EAAEkB,QAAQK,IAAI,CAAC,MAAM,CAAC,CAAC,EACtF;YAEJ;YACA,OAAO;gBACLlB,YAAY,IAAI,CAACA,UAAU;gBAC3BmB,SAASvB,aAAae,cAAcH,MAAM,EAAE,QAAQ;YACtD;QACF,EAAE,OAAOY,OAAO;YACd,IAAIA,iBAAiBzB,kBAAkB,MAAMyB;YAC7C,MAAM,IAAIzB,iBACR,CAAC,8BAA8B,EAAEC,aAAa,AAACwB,MAAgBC,OAAO,EAAE,MAAM,EAC9E;QAEJ;IACF;AACF"}
1
+ {"version":3,"sources":["../../../../src/harnesses/claude/durable/ClaudeCliProbe.ts"],"sourcesContent":["import { execFile } from \"child_process\";\nimport { promisify } from \"util\";\nimport { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { sanitizeText } from \"../../../durable/utils.js\";\n\ntype ExecResult = { stdout: string; stderr: string };\ntype Exec = (file: string, args: string[]) => Promise<ExecResult>;\n\nconst execFileAsync = promisify(execFile);\nconst REQUIRED = [\"--print\", \"--session-id\", \"--resume\", \"--output-format\", \"stream-json\"];\n\nexport interface ClaudeCliProbeOptions {\n executable?: string;\n exec?: Exec;\n}\n\nexport class ClaudeCliProbe {\n private readonly executable: string;\n private readonly exec: Exec;\n\n constructor(options: ClaudeCliProbeOptions = {}) {\n this.executable = options.executable ?? \"claude\";\n this.exec =\n options.exec ??\n (async (file, args) => {\n const result = await execFileAsync(file, args, {\n encoding: \"utf8\",\n maxBuffer: 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n });\n }\n\n async validate(): Promise<{ executable: string; version: string }> {\n try {\n const versionResult = await this.exec(this.executable, [\"--version\"]);\n const helpResult = await this.exec(this.executable, [\"--help\"]);\n const missing = REQUIRED.filter((capability) => !helpResult.stdout.includes(capability));\n if (missing.length > 0) {\n throw new ClaudePrintError(\n `Claude CLI does not support required print-mode capabilities: ${missing.join(\", \")}.`,\n \"CLAUDE_CLI_UNSUPPORTED\",\n );\n }\n return {\n executable: this.executable,\n version: sanitizeText(versionResult.stdout, 256) || \"unknown\",\n };\n } catch (error) {\n if (error instanceof ClaudePrintError) throw error;\n throw new ClaudePrintError(\n `Claude CLI validation failed: ${sanitizeText((error as Error).message, 512)}`,\n \"CLAUDE_CLI_UNAVAILABLE\",\n );\n }\n }\n}\n"],"names":["execFile","promisify","ClaudePrintError","sanitizeText","execFileAsync","REQUIRED","ClaudeCliProbe","executable","exec","options","file","args","result","encoding","maxBuffer","stdout","stderr","validate","versionResult","helpResult","missing","filter","capability","includes","length","join","version","error","message"],"mappings":"AAAA,SAASA,QAAQ,QAAQ,gBAAgB;AACzC,SAASC,SAAS,QAAQ,OAAO;AACjC,SAASC,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,YAAY,QAAQ,4BAA4B;AAKzD,MAAMC,gBAAgBH,UAAUD;AAChC,MAAMK,WAAW;IAAC;IAAW;IAAgB;IAAY;IAAmB;CAAc;AAO1F,OAAO,MAAMC;IACMC,WAAmB;IACnBC,KAAW;IAE5B,YAAYC,UAAiC,CAAC,CAAC,CAAE;QAC/C,IAAI,CAACF,UAAU,GAAGE,QAAQF,UAAU,IAAI;QACxC,IAAI,CAACC,IAAI,GACPC,QAAQD,IAAI,IACX,CAAA,OAAOE,MAAMC;YACZ,MAAMC,SAAS,MAAMR,cAAcM,MAAMC,MAAM;gBAC7CE,UAAU;gBACVC,WAAW,OAAO;YACpB;YACA,OAAO;gBAAEC,QAAQH,OAAOG,MAAM;gBAAEC,QAAQJ,OAAOI,MAAM;YAAC;QACxD,CAAA;IACJ;IAEA,MAAMC,WAA6D;QACjE,IAAI;YACF,MAAMC,gBAAgB,MAAM,IAAI,CAACV,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAY;YACpE,MAAMY,aAAa,MAAM,IAAI,CAACX,IAAI,CAAC,IAAI,CAACD,UAAU,EAAE;gBAAC;aAAS;YAC9D,MAAMa,UAAUf,SAASgB,MAAM,CAAC,CAACC,aAAe,CAACH,WAAWJ,MAAM,CAACQ,QAAQ,CAACD;YAC5E,IAAIF,QAAQI,MAAM,GAAG,GAAG;gBACtB,MAAM,IAAItB,iBACR,CAAC,8DAA8D,EAAEkB,QAAQK,IAAI,CAAC,MAAM,CAAC,CAAC,EACtF;YAEJ;YACA,OAAO;gBACLlB,YAAY,IAAI,CAACA,UAAU;gBAC3BmB,SAASvB,aAAae,cAAcH,MAAM,EAAE,QAAQ;YACtD;QACF,EAAE,OAAOY,OAAO;YACd,IAAIA,iBAAiBzB,kBAAkB,MAAMyB;YAC7C,MAAM,IAAIzB,iBACR,CAAC,8BAA8B,EAAEC,aAAa,AAACwB,MAAgBC,OAAO,EAAE,MAAM,EAC9E;QAEJ;IACF;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudePrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/providers/claude/durable/ClaudePrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAErF,UAAU,cAAe,SAAQ,oBAAoB;IACnD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5F;AAED,UAAU,SAAS;IACjB,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AACD,UAAU,UAAU;IAClB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,8BAA8B;IAC7C,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,8BAAmC;IAOlD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAK7D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAyB9E"}
1
+ {"version":3,"file":"ClaudePrintAgentService.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/claude/durable/ClaudePrintAgentService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAGtF,OAAO,EAAE,iBAAiB,EAAE,KAAK,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AACtF,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAmB,KAAK,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAErF,UAAU,cAAe,SAAQ,oBAAoB;IACnD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC9D,IAAI,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC,CAAC;IAChC,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5F;AAED,UAAU,SAAS;IACjB,QAAQ,IAAI,OAAO,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC9D;AACD,UAAU,UAAU;IAClB,GAAG,CAAC,OAAO,EAAE,UAAU,CAAC,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;CACtF;AAED,MAAM,WAAW,8BAA8B;IAC7C,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,qBAAsB,SAAQ,oBAAoB;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,uBAAuB;IAClC,QAAQ,CAAC,UAAU,EAAE,cAAc,CAAC;IACpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAY;IAClC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAS;gBAEzB,OAAO,GAAE,8BAAmC;IAOlD,MAAM,CAAC,KAAK,EAAE,uBAAuB,GAAG,OAAO,CAAC,YAAY,CAAC;IAK7D,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,qBAAqB,CAAC;CAyB9E"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/providers/claude/durable/ClaudePrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { ClaudeCliProbe } from \"./ClaudeCliProbe.js\";\nimport { ClaudePrintRunner, type ClaudePrintRunResult } from \"./ClaudePrintRunner.js\";\nimport {\n DurableAgentRepository,\n type CreateDurableAgentInput,\n} from \"../../../durable/DurableAgentRepository.js\";\nimport { runDurableAgent, type DurableRunRepository } from \"../../../durable/run.js\";\n\ninterface RepositoryLike extends DurableRunRepository {\n create(input: CreateDurableAgentInput): Promise<DurableAgent>;\n list(): Promise<DurableAgent[]>;\n recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;\n}\n\ninterface ProbeLike {\n validate(): Promise<{ executable: string; version: string }>;\n}\ninterface RunnerLike {\n run(request: Parameters<ClaudePrintRunner[\"run\"]>[0]): Promise<ClaudePrintRunResult>;\n}\n\nexport interface ClaudePrintAgentServiceOptions {\n repository?: RepositoryLike;\n probe?: ProbeLike;\n runner?: RunnerLike;\n executable?: string;\n}\n\nexport interface ClaudePrintSendResult extends ClaudePrintRunResult {\n agentId: string;\n agentName: string;\n}\n\nexport class ClaudePrintAgentService {\n readonly repository: RepositoryLike;\n private readonly probe: ProbeLike;\n private readonly runner: RunnerLike;\n private readonly executable?: string;\n\n constructor(options: ClaudePrintAgentServiceOptions = {}) {\n this.repository = options.repository ?? new DurableAgentRepository();\n this.probe = options.probe ?? new ClaudeCliProbe();\n this.runner = options.runner ?? new ClaudePrintRunner();\n this.executable = options.executable;\n }\n\n async create(input: CreateDurableAgentInput): Promise<DurableAgent> {\n await this.probe.validate();\n return this.repository.create(input);\n }\n\n async send(reference: string, prompt: string): Promise<ClaudePrintSendResult> {\n const completed = await runDurableAgent({\n reference,\n provider: \"claude\",\n repository: this.repository,\n ambiguousError: () =>\n new ClaudePrintError(\n `Multiple durable agents match \"${reference}\".`,\n \"DURABLE_AGENT_AMBIGUOUS\",\n ),\n providerError: () =>\n new ClaudePrintError(\"Durable agent provider is not Claude.\", \"CLAUDE_PRINT_UNSUPPORTED\"),\n execute: (agent, token) =>\n this.runner.run({\n agent,\n prompt,\n executable: this.executable,\n firstRun: agent.sessionHealth === \"uninitialized\",\n onSpawn: (identity) => this.repository.recordProviderProcess(agent.id, token, identity),\n }),\n isSessionMismatch: (error) =>\n error instanceof ClaudePrintError && error.code === \"CLAUDE_SESSION_MISMATCH\",\n });\n return { ...completed.result, agentId: completed.agent.id, agentName: completed.agent.name };\n }\n}\n"],"names":["ClaudePrintError","ClaudeCliProbe","ClaudePrintRunner","DurableAgentRepository","runDurableAgent","ClaudePrintAgentService","repository","probe","runner","executable","options","create","input","validate","send","reference","prompt","completed","provider","ambiguousError","providerError","execute","agent","token","run","firstRun","sessionHealth","onSpawn","identity","recordProviderProcess","id","isSessionMismatch","error","code","result","agentId","agentName","name"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,cAAc,QAAQ,sBAAsB;AACrD,SAASC,iBAAiB,QAAmC,yBAAyB;AACtF,SACEC,sBAAsB,QAEjB,6CAA6C;AACpD,SAASC,eAAe,QAAmC,0BAA0B;AA2BrF,OAAO,MAAMC;IACFC,WAA2B;IACnBC,MAAiB;IACjBC,OAAmB;IACnBC,WAAoB;IAErC,YAAYC,UAA0C,CAAC,CAAC,CAAE;QACxD,IAAI,CAACJ,UAAU,GAAGI,QAAQJ,UAAU,IAAI,IAAIH;QAC5C,IAAI,CAACI,KAAK,GAAGG,QAAQH,KAAK,IAAI,IAAIN;QAClC,IAAI,CAACO,MAAM,GAAGE,QAAQF,MAAM,IAAI,IAAIN;QACpC,IAAI,CAACO,UAAU,GAAGC,QAAQD,UAAU;IACtC;IAEA,MAAME,OAAOC,KAA8B,EAAyB;QAClE,MAAM,IAAI,CAACL,KAAK,CAACM,QAAQ;QACzB,OAAO,IAAI,CAACP,UAAU,CAACK,MAAM,CAACC;IAChC;IAEA,MAAME,KAAKC,SAAiB,EAAEC,MAAc,EAAkC;QAC5E,MAAMC,YAAY,MAAMb,gBAAgB;YACtCW;YACAG,UAAU;YACVZ,YAAY,IAAI,CAACA,UAAU;YAC3Ba,gBAAgB,IACd,IAAInB,iBACF,CAAC,+BAA+B,EAAEe,UAAU,EAAE,CAAC,EAC/C;YAEJK,eAAe,IACb,IAAIpB,iBAAiB,yCAAyC;YAChEqB,SAAS,CAACC,OAAOC,QACf,IAAI,CAACf,MAAM,CAACgB,GAAG,CAAC;oBACdF;oBACAN;oBACAP,YAAY,IAAI,CAACA,UAAU;oBAC3BgB,UAAUH,MAAMI,aAAa,KAAK;oBAClCC,SAAS,CAACC,WAAa,IAAI,CAACtB,UAAU,CAACuB,qBAAqB,CAACP,MAAMQ,EAAE,EAAEP,OAAOK;gBAChF;YACFG,mBAAmB,CAACC,QAClBA,iBAAiBhC,oBAAoBgC,MAAMC,IAAI,KAAK;QACxD;QACA,OAAO;YAAE,GAAGhB,UAAUiB,MAAM;YAAEC,SAASlB,UAAUK,KAAK,CAACQ,EAAE;YAAEM,WAAWnB,UAAUK,KAAK,CAACe,IAAI;QAAC;IAC7F;AACF"}
1
+ {"version":3,"sources":["../../../../src/harnesses/claude/durable/ClaudePrintAgentService.ts"],"sourcesContent":["import type { DurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { ClaudeCliProbe } from \"./ClaudeCliProbe.js\";\nimport { ClaudePrintRunner, type ClaudePrintRunResult } from \"./ClaudePrintRunner.js\";\nimport {\n DurableAgentRepository,\n type CreateDurableAgentInput,\n} from \"../../../durable/DurableAgentRepository.js\";\nimport { runDurableAgent, type DurableRunRepository } from \"../../../durable/run.js\";\n\ninterface RepositoryLike extends DurableRunRepository {\n create(input: CreateDurableAgentInput): Promise<DurableAgent>;\n list(): Promise<DurableAgent[]>;\n recordProviderProcess(id: string, token: string, identity: ProcessIdentity): Promise<void>;\n}\n\ninterface ProbeLike {\n validate(): Promise<{ executable: string; version: string }>;\n}\ninterface RunnerLike {\n run(request: Parameters<ClaudePrintRunner[\"run\"]>[0]): Promise<ClaudePrintRunResult>;\n}\n\nexport interface ClaudePrintAgentServiceOptions {\n repository?: RepositoryLike;\n probe?: ProbeLike;\n runner?: RunnerLike;\n executable?: string;\n}\n\nexport interface ClaudePrintSendResult extends ClaudePrintRunResult {\n agentId: string;\n agentName: string;\n}\n\nexport class ClaudePrintAgentService {\n readonly repository: RepositoryLike;\n private readonly probe: ProbeLike;\n private readonly runner: RunnerLike;\n private readonly executable?: string;\n\n constructor(options: ClaudePrintAgentServiceOptions = {}) {\n this.repository = options.repository ?? new DurableAgentRepository();\n this.probe = options.probe ?? new ClaudeCliProbe();\n this.runner = options.runner ?? new ClaudePrintRunner();\n this.executable = options.executable;\n }\n\n async create(input: CreateDurableAgentInput): Promise<DurableAgent> {\n await this.probe.validate();\n return this.repository.create(input);\n }\n\n async send(reference: string, prompt: string): Promise<ClaudePrintSendResult> {\n const completed = await runDurableAgent({\n reference,\n provider: \"claude\",\n repository: this.repository,\n ambiguousError: () =>\n new ClaudePrintError(\n `Multiple durable agents match \"${reference}\".`,\n \"DURABLE_AGENT_AMBIGUOUS\",\n ),\n providerError: () =>\n new ClaudePrintError(\"Durable agent provider is not Claude.\", \"CLAUDE_PRINT_UNSUPPORTED\"),\n execute: (agent, token) =>\n this.runner.run({\n agent,\n prompt,\n executable: this.executable,\n firstRun: agent.sessionHealth === \"uninitialized\",\n onSpawn: (identity) => this.repository.recordProviderProcess(agent.id, token, identity),\n }),\n isSessionMismatch: (error) =>\n error instanceof ClaudePrintError && error.code === \"CLAUDE_SESSION_MISMATCH\",\n });\n return { ...completed.result, agentId: completed.agent.id, agentName: completed.agent.name };\n }\n}\n"],"names":["ClaudePrintError","ClaudeCliProbe","ClaudePrintRunner","DurableAgentRepository","runDurableAgent","ClaudePrintAgentService","repository","probe","runner","executable","options","create","input","validate","send","reference","prompt","completed","provider","ambiguousError","providerError","execute","agent","token","run","firstRun","sessionHealth","onSpawn","identity","recordProviderProcess","id","isSessionMismatch","error","code","result","agentId","agentName","name"],"mappings":"AACA,SAASA,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,cAAc,QAAQ,sBAAsB;AACrD,SAASC,iBAAiB,QAAmC,yBAAyB;AACtF,SACEC,sBAAsB,QAEjB,6CAA6C;AACpD,SAASC,eAAe,QAAmC,0BAA0B;AA2BrF,OAAO,MAAMC;IACFC,WAA2B;IACnBC,MAAiB;IACjBC,OAAmB;IACnBC,WAAoB;IAErC,YAAYC,UAA0C,CAAC,CAAC,CAAE;QACxD,IAAI,CAACJ,UAAU,GAAGI,QAAQJ,UAAU,IAAI,IAAIH;QAC5C,IAAI,CAACI,KAAK,GAAGG,QAAQH,KAAK,IAAI,IAAIN;QAClC,IAAI,CAACO,MAAM,GAAGE,QAAQF,MAAM,IAAI,IAAIN;QACpC,IAAI,CAACO,UAAU,GAAGC,QAAQD,UAAU;IACtC;IAEA,MAAME,OAAOC,KAA8B,EAAyB;QAClE,MAAM,IAAI,CAACL,KAAK,CAACM,QAAQ;QACzB,OAAO,IAAI,CAACP,UAAU,CAACK,MAAM,CAACC;IAChC;IAEA,MAAME,KAAKC,SAAiB,EAAEC,MAAc,EAAkC;QAC5E,MAAMC,YAAY,MAAMb,gBAAgB;YACtCW;YACAG,UAAU;YACVZ,YAAY,IAAI,CAACA,UAAU;YAC3Ba,gBAAgB,IACd,IAAInB,iBACF,CAAC,+BAA+B,EAAEe,UAAU,EAAE,CAAC,EAC/C;YAEJK,eAAe,IACb,IAAIpB,iBAAiB,yCAAyC;YAChEqB,SAAS,CAACC,OAAOC,QACf,IAAI,CAACf,MAAM,CAACgB,GAAG,CAAC;oBACdF;oBACAN;oBACAP,YAAY,IAAI,CAACA,UAAU;oBAC3BgB,UAAUH,MAAMI,aAAa,KAAK;oBAClCC,SAAS,CAACC,WAAa,IAAI,CAACtB,UAAU,CAACuB,qBAAqB,CAACP,MAAMQ,EAAE,EAAEP,OAAOK;gBAChF;YACFG,mBAAmB,CAACC,QAClBA,iBAAiBhC,oBAAoBgC,MAAMC,IAAI,KAAK;QACxD;QACA,OAAO;YAAE,GAAGhB,UAAUiB,MAAM;YAAEC,SAASlB,UAAUK,KAAK,CAACQ,EAAE;YAAEM,WAAWnB,UAAUK,KAAK,CAACe,IAAI;QAAC;IAC7F;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudePrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/providers/claude/durable/ClaudePrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE5F,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAI3F,KAAK,KAAK,GAAG,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAAG;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACpE,8BAA8B,CAAC;AAEpC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,wBAA6B;IAM5C,GAAG,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAqDzE"}
1
+ {"version":3,"file":"ClaudePrintRunner.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/claude/durable/ClaudePrintRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,8BAA8B,EACnC,KAAK,wBAAwB,EAC9B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AAE5F,OAAO,EAAyB,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAI3F,KAAK,KAAK,GAAG,CACX,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE,wBAAwB,GAAG;IAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,CAAA;CAAE,KACpE,8BAA8B,CAAC;AAEpC,MAAM,WAAW,qBAAqB;IACpC,KAAK,EAAE,kBAAkB,CAAC;IAC1B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,OAAO,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,oBAAoB;IACnC,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,wBAAwB;IACvC,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,gBAAgB,CAAC,EAAE,gBAAgB,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAmB;IACpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAS;gBAE1B,OAAO,GAAE,wBAA6B;IAM5C,GAAG,CAAC,OAAO,EAAE,qBAAqB,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAqDzE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/providers/claude/durable/ClaudePrintRunner.ts"],"sourcesContent":["import {\n spawn as nodeSpawn,\n type ChildProcessWithoutNullStreams,\n type SpawnOptionsWithoutStdio,\n} from \"child_process\";\nimport type { ClaudeDurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { LocalProcessInspector, type ProcessInspector } from \"../../../durable/process.js\";\nimport { waitForChildClose } from \"../../../durable/utils.js\";\nimport { ClaudeStreamParser } from \"./ClaudeStreamParser.js\";\n\ntype Spawn = (\n command: string,\n args: readonly string[],\n options: SpawnOptionsWithoutStdio & { stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n) => ChildProcessWithoutNullStreams;\n\nexport interface ClaudePrintRunRequest {\n agent: ClaudeDurableAgent;\n prompt: string;\n executable?: string;\n firstRun: boolean;\n onSpawn(identity: ProcessIdentity): Promise<void>;\n}\n\nexport interface ClaudePrintRunResult {\n sessionId: string;\n result: string;\n exitCode: number;\n}\n\nexport interface ClaudePrintRunnerOptions {\n spawn?: Spawn;\n processInspector?: ProcessInspector;\n maxLineBytes?: number;\n}\n\nexport class ClaudePrintRunner {\n private readonly spawn: Spawn;\n private readonly processInspector: ProcessInspector;\n private readonly maxLineBytes: number;\n\n constructor(options: ClaudePrintRunnerOptions = {}) {\n this.spawn = options.spawn ?? (nodeSpawn as Spawn);\n this.processInspector = options.processInspector ?? new LocalProcessInspector();\n this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;\n }\n\n async run(request: ClaudePrintRunRequest): Promise<ClaudePrintRunResult> {\n const sessionArgs = request.firstRun\n ? [\"--session-id\", request.agent.providerSessionId]\n : [\"--resume\", request.agent.providerSessionId];\n const args = [\"-p\", ...sessionArgs, \"--output-format\", \"stream-json\", \"--verbose\"];\n const child = this.spawn(request.executable ?? \"claude\", args, {\n cwd: request.agent.cwd,\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (!child.pid) {\n child.kill();\n throw new ClaudePrintError(\n \"Claude process did not provide a PID.\",\n \"CLAUDE_PROCESS_IDENTITY\",\n );\n }\n const identity = this.processInspector.getIdentity(child.pid);\n if (!identity) {\n child.kill();\n throw new ClaudePrintError(\n \"Cannot verify Claude process identity.\",\n \"CLAUDE_PROCESS_IDENTITY\",\n );\n }\n\n const parser = new ClaudeStreamParser(request.agent.providerSessionId, this.maxLineBytes);\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n if (parser.hasFailed()) return;\n try {\n parser.accept(chunk);\n } catch (error) {\n parser.fail(error);\n }\n });\n // Drain provider diagnostics without reflecting potentially sensitive prompt/tool data.\n child.stderr.resume();\n\n const closed = waitForChildClose(child);\n\n try {\n await request.onSpawn(identity);\n } catch (error) {\n child.kill();\n throw error;\n }\n\n child.stdin.end(request.prompt);\n const { code, signal } = await closed;\n\n return parser.result({ code, signal });\n }\n}\n"],"names":["spawn","nodeSpawn","ClaudePrintError","LocalProcessInspector","waitForChildClose","ClaudeStreamParser","ClaudePrintRunner","processInspector","maxLineBytes","options","run","request","sessionArgs","firstRun","agent","providerSessionId","args","child","executable","cwd","shell","stdio","pid","kill","identity","getIdentity","parser","stdout","on","chunk","hasFailed","accept","error","fail","stderr","resume","closed","onSpawn","stdin","end","prompt","code","signal","result"],"mappings":"AAAA,SACEA,SAASC,SAAS,QAGb,gBAAgB;AAEvB,SAASC,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,qBAAqB,QAA+B,8BAA8B;AAC3F,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,kBAAkB,QAAQ,0BAA0B;AA4B7D,OAAO,MAAMC;IACMN,MAAa;IACbO,iBAAmC;IACnCC,aAAqB;IAEtC,YAAYC,UAAoC,CAAC,CAAC,CAAE;QAClD,IAAI,CAACT,KAAK,GAAGS,QAAQT,KAAK,IAAKC;QAC/B,IAAI,CAACM,gBAAgB,GAAGE,QAAQF,gBAAgB,IAAI,IAAIJ;QACxD,IAAI,CAACK,YAAY,GAAGC,QAAQD,YAAY,IAAI,OAAO;IACrD;IAEA,MAAME,IAAIC,OAA8B,EAAiC;QACvE,MAAMC,cAAcD,QAAQE,QAAQ,GAChC;YAAC;YAAgBF,QAAQG,KAAK,CAACC,iBAAiB;SAAC,GACjD;YAAC;YAAYJ,QAAQG,KAAK,CAACC,iBAAiB;SAAC;QACjD,MAAMC,OAAO;YAAC;eAASJ;YAAa;YAAmB;YAAe;SAAY;QAClF,MAAMK,QAAQ,IAAI,CAACjB,KAAK,CAACW,QAAQO,UAAU,IAAI,UAAUF,MAAM;YAC7DG,KAAKR,QAAQG,KAAK,CAACK,GAAG;YACtBC,OAAO;YACPC,OAAO;gBAAC;gBAAQ;gBAAQ;aAAO;QACjC;QACA,IAAI,CAACJ,MAAMK,GAAG,EAAE;YACdL,MAAMM,IAAI;YACV,MAAM,IAAIrB,iBACR,yCACA;QAEJ;QACA,MAAMsB,WAAW,IAAI,CAACjB,gBAAgB,CAACkB,WAAW,CAACR,MAAMK,GAAG;QAC5D,IAAI,CAACE,UAAU;YACbP,MAAMM,IAAI;YACV,MAAM,IAAIrB,iBACR,0CACA;QAEJ;QAEA,MAAMwB,SAAS,IAAIrB,mBAAmBM,QAAQG,KAAK,CAACC,iBAAiB,EAAE,IAAI,CAACP,YAAY;QAExFS,MAAMU,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;YACvB,IAAIH,OAAOI,SAAS,IAAI;YACxB,IAAI;gBACFJ,OAAOK,MAAM,CAACF;YAChB,EAAE,OAAOG,OAAO;gBACdN,OAAOO,IAAI,CAACD;YACd;QACF;QACA,wFAAwF;QACxFf,MAAMiB,MAAM,CAACC,MAAM;QAEnB,MAAMC,SAAShC,kBAAkBa;QAEjC,IAAI;YACF,MAAMN,QAAQ0B,OAAO,CAACb;QACxB,EAAE,OAAOQ,OAAO;YACdf,MAAMM,IAAI;YACV,MAAMS;QACR;QAEAf,MAAMqB,KAAK,CAACC,GAAG,CAAC5B,QAAQ6B,MAAM;QAC9B,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAG,MAAMN;QAE/B,OAAOV,OAAOiB,MAAM,CAAC;YAAEF;YAAMC;QAAO;IACtC;AACF"}
1
+ {"version":3,"sources":["../../../../src/harnesses/claude/durable/ClaudePrintRunner.ts"],"sourcesContent":["import {\n spawn as nodeSpawn,\n type ChildProcessWithoutNullStreams,\n type SpawnOptionsWithoutStdio,\n} from \"child_process\";\nimport type { ClaudeDurableAgent, ProcessIdentity } from \"../../../durable/DurableAgent.js\";\nimport { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { LocalProcessInspector, type ProcessInspector } from \"../../../durable/process.js\";\nimport { waitForChildClose } from \"../../../durable/utils.js\";\nimport { ClaudeStreamParser } from \"./ClaudeStreamParser.js\";\n\ntype Spawn = (\n command: string,\n args: readonly string[],\n options: SpawnOptionsWithoutStdio & { stdio: [\"pipe\", \"pipe\", \"pipe\"] },\n) => ChildProcessWithoutNullStreams;\n\nexport interface ClaudePrintRunRequest {\n agent: ClaudeDurableAgent;\n prompt: string;\n executable?: string;\n firstRun: boolean;\n onSpawn(identity: ProcessIdentity): Promise<void>;\n}\n\nexport interface ClaudePrintRunResult {\n sessionId: string;\n result: string;\n exitCode: number;\n}\n\nexport interface ClaudePrintRunnerOptions {\n spawn?: Spawn;\n processInspector?: ProcessInspector;\n maxLineBytes?: number;\n}\n\nexport class ClaudePrintRunner {\n private readonly spawn: Spawn;\n private readonly processInspector: ProcessInspector;\n private readonly maxLineBytes: number;\n\n constructor(options: ClaudePrintRunnerOptions = {}) {\n this.spawn = options.spawn ?? (nodeSpawn as Spawn);\n this.processInspector = options.processInspector ?? new LocalProcessInspector();\n this.maxLineBytes = options.maxLineBytes ?? 1024 * 1024;\n }\n\n async run(request: ClaudePrintRunRequest): Promise<ClaudePrintRunResult> {\n const sessionArgs = request.firstRun\n ? [\"--session-id\", request.agent.providerSessionId]\n : [\"--resume\", request.agent.providerSessionId];\n const args = [\"-p\", ...sessionArgs, \"--output-format\", \"stream-json\", \"--verbose\"];\n const child = this.spawn(request.executable ?? \"claude\", args, {\n cwd: request.agent.cwd,\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n });\n if (!child.pid) {\n child.kill();\n throw new ClaudePrintError(\n \"Claude process did not provide a PID.\",\n \"CLAUDE_PROCESS_IDENTITY\",\n );\n }\n const identity = this.processInspector.getIdentity(child.pid);\n if (!identity) {\n child.kill();\n throw new ClaudePrintError(\n \"Cannot verify Claude process identity.\",\n \"CLAUDE_PROCESS_IDENTITY\",\n );\n }\n\n const parser = new ClaudeStreamParser(request.agent.providerSessionId, this.maxLineBytes);\n\n child.stdout.on(\"data\", (chunk: Buffer | string) => {\n if (parser.hasFailed()) return;\n try {\n parser.accept(chunk);\n } catch (error) {\n parser.fail(error);\n }\n });\n // Drain provider diagnostics without reflecting potentially sensitive prompt/tool data.\n child.stderr.resume();\n\n const closed = waitForChildClose(child);\n\n try {\n await request.onSpawn(identity);\n } catch (error) {\n child.kill();\n throw error;\n }\n\n child.stdin.end(request.prompt);\n const { code, signal } = await closed;\n\n return parser.result({ code, signal });\n }\n}\n"],"names":["spawn","nodeSpawn","ClaudePrintError","LocalProcessInspector","waitForChildClose","ClaudeStreamParser","ClaudePrintRunner","processInspector","maxLineBytes","options","run","request","sessionArgs","firstRun","agent","providerSessionId","args","child","executable","cwd","shell","stdio","pid","kill","identity","getIdentity","parser","stdout","on","chunk","hasFailed","accept","error","fail","stderr","resume","closed","onSpawn","stdin","end","prompt","code","signal","result"],"mappings":"AAAA,SACEA,SAASC,SAAS,QAGb,gBAAgB;AAEvB,SAASC,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,qBAAqB,QAA+B,8BAA8B;AAC3F,SAASC,iBAAiB,QAAQ,4BAA4B;AAC9D,SAASC,kBAAkB,QAAQ,0BAA0B;AA4B7D,OAAO,MAAMC;IACMN,MAAa;IACbO,iBAAmC;IACnCC,aAAqB;IAEtC,YAAYC,UAAoC,CAAC,CAAC,CAAE;QAClD,IAAI,CAACT,KAAK,GAAGS,QAAQT,KAAK,IAAKC;QAC/B,IAAI,CAACM,gBAAgB,GAAGE,QAAQF,gBAAgB,IAAI,IAAIJ;QACxD,IAAI,CAACK,YAAY,GAAGC,QAAQD,YAAY,IAAI,OAAO;IACrD;IAEA,MAAME,IAAIC,OAA8B,EAAiC;QACvE,MAAMC,cAAcD,QAAQE,QAAQ,GAChC;YAAC;YAAgBF,QAAQG,KAAK,CAACC,iBAAiB;SAAC,GACjD;YAAC;YAAYJ,QAAQG,KAAK,CAACC,iBAAiB;SAAC;QACjD,MAAMC,OAAO;YAAC;eAASJ;YAAa;YAAmB;YAAe;SAAY;QAClF,MAAMK,QAAQ,IAAI,CAACjB,KAAK,CAACW,QAAQO,UAAU,IAAI,UAAUF,MAAM;YAC7DG,KAAKR,QAAQG,KAAK,CAACK,GAAG;YACtBC,OAAO;YACPC,OAAO;gBAAC;gBAAQ;gBAAQ;aAAO;QACjC;QACA,IAAI,CAACJ,MAAMK,GAAG,EAAE;YACdL,MAAMM,IAAI;YACV,MAAM,IAAIrB,iBACR,yCACA;QAEJ;QACA,MAAMsB,WAAW,IAAI,CAACjB,gBAAgB,CAACkB,WAAW,CAACR,MAAMK,GAAG;QAC5D,IAAI,CAACE,UAAU;YACbP,MAAMM,IAAI;YACV,MAAM,IAAIrB,iBACR,0CACA;QAEJ;QAEA,MAAMwB,SAAS,IAAIrB,mBAAmBM,QAAQG,KAAK,CAACC,iBAAiB,EAAE,IAAI,CAACP,YAAY;QAExFS,MAAMU,MAAM,CAACC,EAAE,CAAC,QAAQ,CAACC;YACvB,IAAIH,OAAOI,SAAS,IAAI;YACxB,IAAI;gBACFJ,OAAOK,MAAM,CAACF;YAChB,EAAE,OAAOG,OAAO;gBACdN,OAAOO,IAAI,CAACD;YACd;QACF;QACA,wFAAwF;QACxFf,MAAMiB,MAAM,CAACC,MAAM;QAEnB,MAAMC,SAAShC,kBAAkBa;QAEjC,IAAI;YACF,MAAMN,QAAQ0B,OAAO,CAACb;QACxB,EAAE,OAAOQ,OAAO;YACdf,MAAMM,IAAI;YACV,MAAMS;QACR;QAEAf,MAAMqB,KAAK,CAACC,GAAG,CAAC5B,QAAQ6B,MAAM;QAC9B,MAAM,EAAEC,IAAI,EAAEC,MAAM,EAAE,GAAG,MAAMN;QAE/B,OAAOV,OAAOiB,MAAM,CAAC;YAAEF;YAAMC;QAAO;IACtC;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"ClaudeStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/providers/claude/durable/ClaudeStreamParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,qBAAa,kBAAkB;IAM3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IALpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,aAAa,CAAiC;gBAGnC,iBAAiB,EAAE,MAAM,EAC1C,YAAY,EAAE,MAAM;IAYtB,SAAS,IAAI,OAAO;IAIpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAO1B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,oBAAoB;IAwBrD,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,oBAAoB;CAc7B"}
1
+ {"version":3,"file":"ClaudeStreamParser.d.ts","sourceRoot":"","sources":["../../../../src/harnesses/claude/durable/ClaudeStreamParser.ts"],"names":[],"mappings":"AACA,OAAO,EAAc,KAAK,gBAAgB,EAAE,MAAM,2BAA2B,CAAC;AAC9E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAC;AAEnE,qBAAa,kBAAkB;IAM3B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IALpC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAqC;IACrD,OAAO,CAAC,aAAa,CAAiC;gBAGnC,iBAAiB,EAAE,MAAM,EAC1C,YAAY,EAAE,MAAM;IAYtB,SAAS,IAAI,OAAO;IAIpB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAMpC,IAAI,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAO1B,MAAM,CAAC,KAAK,EAAE,gBAAgB,GAAG,oBAAoB;IAwBrD,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,UAAU;IAgBlB,OAAO,CAAC,oBAAoB;CAc7B"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/providers/claude/durable/ClaudeStreamParser.ts"],"sourcesContent":["import { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { LineBuffer, type ChildCloseResult } from \"../../../durable/utils.js\";\nimport type { ClaudePrintRunResult } from \"./ClaudePrintRunner.js\";\n\nexport class ClaudeStreamParser {\n private readonly lines: LineBuffer;\n private terminal: ClaudePrintRunResult | null = null;\n private protocolError: ClaudePrintError | null = null;\n\n constructor(\n private readonly expectedSessionId: string,\n maxLineBytes: number,\n ) {\n this.lines = new LineBuffer(\n maxLineBytes,\n () =>\n new ClaudePrintError(\n \"Claude stream line exceeded the safety limit.\",\n \"CLAUDE_STREAM_OVERSIZED\",\n ),\n );\n }\n\n hasFailed(): boolean {\n return this.protocolError !== null;\n }\n\n accept(chunk: Buffer | string): void {\n for (const line of this.lines.accept(chunk)) {\n this.processLine(line);\n }\n }\n\n fail(error: unknown): void {\n this.protocolError =\n error instanceof ClaudePrintError\n ? error\n : new ClaudePrintError(\"Claude stream processing failed.\", \"CLAUDE_STREAM_INVALID\");\n }\n\n result(close: ChildCloseResult): ClaudePrintRunResult {\n if (this.protocolError) throw this.protocolError;\n this.lines.assertComplete(\n () =>\n new ClaudePrintError(\"Claude stream ended with incomplete JSON.\", \"CLAUDE_STREAM_INVALID\"),\n );\n if (close.code !== 0) {\n throw new ClaudePrintError(\n `Claude print run failed${close.signal ? ` (${close.signal})` : \".\"}`,\n \"CLAUDE_PROCESS_FAILED\",\n );\n }\n if (!this.terminal)\n throw new ClaudePrintError(\n \"Claude stream ended without a terminal result.\",\n \"CLAUDE_RESULT_MISSING\",\n );\n return {\n sessionId: this.terminal.sessionId,\n result: this.terminal.result,\n exitCode: close.code,\n };\n }\n\n private processLine(line: Buffer): void {\n if (line.length === 0) return;\n\n const event = this.parseEvent(line);\n if (typeof event.session_id === \"string\" && event.session_id !== this.expectedSessionId) {\n throw new ClaudePrintError(\n \"Claude returned a different session identity.\",\n \"CLAUDE_SESSION_MISMATCH\",\n );\n }\n if (event.type === \"result\") this.recordTerminalResult(event);\n }\n\n private parseEvent(line: Buffer): Record<string, unknown> {\n let value: unknown;\n try {\n value = JSON.parse(line.toString(\"utf8\"));\n } catch {\n throw new ClaudePrintError(\"Claude emitted malformed stream JSON.\", \"CLAUDE_STREAM_INVALID\");\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new ClaudePrintError(\n \"Claude emitted a non-object stream message.\",\n \"CLAUDE_STREAM_INVALID\",\n );\n }\n return value as Record<string, unknown>;\n }\n\n private recordTerminalResult(event: Record<string, unknown>): void {\n if (this.terminal)\n throw new ClaudePrintError(\n \"Claude emitted more than one terminal result.\",\n \"CLAUDE_STREAM_INVALID\",\n );\n if (typeof event.session_id !== \"string\" || typeof event.result !== \"string\") {\n throw new ClaudePrintError(\n \"Claude emitted an invalid terminal result.\",\n \"CLAUDE_STREAM_INVALID\",\n );\n }\n this.terminal = { sessionId: event.session_id, result: event.result, exitCode: 0 };\n }\n}\n"],"names":["ClaudePrintError","LineBuffer","ClaudeStreamParser","lines","terminal","protocolError","expectedSessionId","maxLineBytes","hasFailed","accept","chunk","line","processLine","fail","error","result","close","assertComplete","code","signal","sessionId","exitCode","length","event","parseEvent","session_id","type","recordTerminalResult","value","JSON","parse","toString","Array","isArray"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,UAAU,QAA+B,4BAA4B;AAG9E,OAAO,MAAMC;;IACMC,MAAkB;IAC3BC,WAAwC,KAAK;IAC7CC,gBAAyC,KAAK;IAEtD,YACE,AAAiBC,iBAAyB,EAC1CC,YAAoB,CACpB;aAFiBD,oBAAAA;QAGjB,IAAI,CAACH,KAAK,GAAG,IAAIF,WACfM,cACA,IACE,IAAIP,iBACF,iDACA;IAGR;IAEAQ,YAAqB;QACnB,OAAO,IAAI,CAACH,aAAa,KAAK;IAChC;IAEAI,OAAOC,KAAsB,EAAQ;QACnC,KAAK,MAAMC,QAAQ,IAAI,CAACR,KAAK,CAACM,MAAM,CAACC,OAAQ;YAC3C,IAAI,CAACE,WAAW,CAACD;QACnB;IACF;IAEAE,KAAKC,KAAc,EAAQ;QACzB,IAAI,CAACT,aAAa,GAChBS,iBAAiBd,mBACbc,QACA,IAAId,iBAAiB,oCAAoC;IACjE;IAEAe,OAAOC,KAAuB,EAAwB;QACpD,IAAI,IAAI,CAACX,aAAa,EAAE,MAAM,IAAI,CAACA,aAAa;QAChD,IAAI,CAACF,KAAK,CAACc,cAAc,CACvB,IACE,IAAIjB,iBAAiB,6CAA6C;QAEtE,IAAIgB,MAAME,IAAI,KAAK,GAAG;YACpB,MAAM,IAAIlB,iBACR,CAAC,uBAAuB,EAAEgB,MAAMG,MAAM,GAAG,CAAC,EAAE,EAAEH,MAAMG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EACrE;QAEJ;QACA,IAAI,CAAC,IAAI,CAACf,QAAQ,EAChB,MAAM,IAAIJ,iBACR,kDACA;QAEJ,OAAO;YACLoB,WAAW,IAAI,CAAChB,QAAQ,CAACgB,SAAS;YAClCL,QAAQ,IAAI,CAACX,QAAQ,CAACW,MAAM;YAC5BM,UAAUL,MAAME,IAAI;QACtB;IACF;IAEQN,YAAYD,IAAY,EAAQ;QACtC,IAAIA,KAAKW,MAAM,KAAK,GAAG;QAEvB,MAAMC,QAAQ,IAAI,CAACC,UAAU,CAACb;QAC9B,IAAI,OAAOY,MAAME,UAAU,KAAK,YAAYF,MAAME,UAAU,KAAK,IAAI,CAACnB,iBAAiB,EAAE;YACvF,MAAM,IAAIN,iBACR,iDACA;QAEJ;QACA,IAAIuB,MAAMG,IAAI,KAAK,UAAU,IAAI,CAACC,oBAAoB,CAACJ;IACzD;IAEQC,WAAWb,IAAY,EAA2B;QACxD,IAAIiB;QACJ,IAAI;YACFA,QAAQC,KAAKC,KAAK,CAACnB,KAAKoB,QAAQ,CAAC;QACnC,EAAE,OAAM;YACN,MAAM,IAAI/B,iBAAiB,yCAAyC;QACtE;QACA,IAAI,CAAC4B,SAAS,OAAOA,UAAU,YAAYI,MAAMC,OAAO,CAACL,QAAQ;YAC/D,MAAM,IAAI5B,iBACR,+CACA;QAEJ;QACA,OAAO4B;IACT;IAEQD,qBAAqBJ,KAA8B,EAAQ;QACjE,IAAI,IAAI,CAACnB,QAAQ,EACf,MAAM,IAAIJ,iBACR,iDACA;QAEJ,IAAI,OAAOuB,MAAME,UAAU,KAAK,YAAY,OAAOF,MAAMR,MAAM,KAAK,UAAU;YAC5E,MAAM,IAAIf,iBACR,8CACA;QAEJ;QACA,IAAI,CAACI,QAAQ,GAAG;YAAEgB,WAAWG,MAAME,UAAU;YAAEV,QAAQQ,MAAMR,MAAM;YAAEM,UAAU;QAAE;IACnF;AACF"}
1
+ {"version":3,"sources":["../../../../src/harnesses/claude/durable/ClaudeStreamParser.ts"],"sourcesContent":["import { ClaudePrintError } from \"../../../durable/DurableAgent.js\";\nimport { LineBuffer, type ChildCloseResult } from \"../../../durable/utils.js\";\nimport type { ClaudePrintRunResult } from \"./ClaudePrintRunner.js\";\n\nexport class ClaudeStreamParser {\n private readonly lines: LineBuffer;\n private terminal: ClaudePrintRunResult | null = null;\n private protocolError: ClaudePrintError | null = null;\n\n constructor(\n private readonly expectedSessionId: string,\n maxLineBytes: number,\n ) {\n this.lines = new LineBuffer(\n maxLineBytes,\n () =>\n new ClaudePrintError(\n \"Claude stream line exceeded the safety limit.\",\n \"CLAUDE_STREAM_OVERSIZED\",\n ),\n );\n }\n\n hasFailed(): boolean {\n return this.protocolError !== null;\n }\n\n accept(chunk: Buffer | string): void {\n for (const line of this.lines.accept(chunk)) {\n this.processLine(line);\n }\n }\n\n fail(error: unknown): void {\n this.protocolError =\n error instanceof ClaudePrintError\n ? error\n : new ClaudePrintError(\"Claude stream processing failed.\", \"CLAUDE_STREAM_INVALID\");\n }\n\n result(close: ChildCloseResult): ClaudePrintRunResult {\n if (this.protocolError) throw this.protocolError;\n this.lines.assertComplete(\n () =>\n new ClaudePrintError(\"Claude stream ended with incomplete JSON.\", \"CLAUDE_STREAM_INVALID\"),\n );\n if (close.code !== 0) {\n throw new ClaudePrintError(\n `Claude print run failed${close.signal ? ` (${close.signal})` : \".\"}`,\n \"CLAUDE_PROCESS_FAILED\",\n );\n }\n if (!this.terminal)\n throw new ClaudePrintError(\n \"Claude stream ended without a terminal result.\",\n \"CLAUDE_RESULT_MISSING\",\n );\n return {\n sessionId: this.terminal.sessionId,\n result: this.terminal.result,\n exitCode: close.code,\n };\n }\n\n private processLine(line: Buffer): void {\n if (line.length === 0) return;\n\n const event = this.parseEvent(line);\n if (typeof event.session_id === \"string\" && event.session_id !== this.expectedSessionId) {\n throw new ClaudePrintError(\n \"Claude returned a different session identity.\",\n \"CLAUDE_SESSION_MISMATCH\",\n );\n }\n if (event.type === \"result\") this.recordTerminalResult(event);\n }\n\n private parseEvent(line: Buffer): Record<string, unknown> {\n let value: unknown;\n try {\n value = JSON.parse(line.toString(\"utf8\"));\n } catch {\n throw new ClaudePrintError(\"Claude emitted malformed stream JSON.\", \"CLAUDE_STREAM_INVALID\");\n }\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new ClaudePrintError(\n \"Claude emitted a non-object stream message.\",\n \"CLAUDE_STREAM_INVALID\",\n );\n }\n return value as Record<string, unknown>;\n }\n\n private recordTerminalResult(event: Record<string, unknown>): void {\n if (this.terminal)\n throw new ClaudePrintError(\n \"Claude emitted more than one terminal result.\",\n \"CLAUDE_STREAM_INVALID\",\n );\n if (typeof event.session_id !== \"string\" || typeof event.result !== \"string\") {\n throw new ClaudePrintError(\n \"Claude emitted an invalid terminal result.\",\n \"CLAUDE_STREAM_INVALID\",\n );\n }\n this.terminal = { sessionId: event.session_id, result: event.result, exitCode: 0 };\n }\n}\n"],"names":["ClaudePrintError","LineBuffer","ClaudeStreamParser","lines","terminal","protocolError","expectedSessionId","maxLineBytes","hasFailed","accept","chunk","line","processLine","fail","error","result","close","assertComplete","code","signal","sessionId","exitCode","length","event","parseEvent","session_id","type","recordTerminalResult","value","JSON","parse","toString","Array","isArray"],"mappings":"AAAA,SAASA,gBAAgB,QAAQ,mCAAmC;AACpE,SAASC,UAAU,QAA+B,4BAA4B;AAG9E,OAAO,MAAMC;;IACMC,MAAkB;IAC3BC,WAAwC,KAAK;IAC7CC,gBAAyC,KAAK;IAEtD,YACE,AAAiBC,iBAAyB,EAC1CC,YAAoB,CACpB;aAFiBD,oBAAAA;QAGjB,IAAI,CAACH,KAAK,GAAG,IAAIF,WACfM,cACA,IACE,IAAIP,iBACF,iDACA;IAGR;IAEAQ,YAAqB;QACnB,OAAO,IAAI,CAACH,aAAa,KAAK;IAChC;IAEAI,OAAOC,KAAsB,EAAQ;QACnC,KAAK,MAAMC,QAAQ,IAAI,CAACR,KAAK,CAACM,MAAM,CAACC,OAAQ;YAC3C,IAAI,CAACE,WAAW,CAACD;QACnB;IACF;IAEAE,KAAKC,KAAc,EAAQ;QACzB,IAAI,CAACT,aAAa,GAChBS,iBAAiBd,mBACbc,QACA,IAAId,iBAAiB,oCAAoC;IACjE;IAEAe,OAAOC,KAAuB,EAAwB;QACpD,IAAI,IAAI,CAACX,aAAa,EAAE,MAAM,IAAI,CAACA,aAAa;QAChD,IAAI,CAACF,KAAK,CAACc,cAAc,CACvB,IACE,IAAIjB,iBAAiB,6CAA6C;QAEtE,IAAIgB,MAAME,IAAI,KAAK,GAAG;YACpB,MAAM,IAAIlB,iBACR,CAAC,uBAAuB,EAAEgB,MAAMG,MAAM,GAAG,CAAC,EAAE,EAAEH,MAAMG,MAAM,CAAC,CAAC,CAAC,GAAG,KAAK,EACrE;QAEJ;QACA,IAAI,CAAC,IAAI,CAACf,QAAQ,EAChB,MAAM,IAAIJ,iBACR,kDACA;QAEJ,OAAO;YACLoB,WAAW,IAAI,CAAChB,QAAQ,CAACgB,SAAS;YAClCL,QAAQ,IAAI,CAACX,QAAQ,CAACW,MAAM;YAC5BM,UAAUL,MAAME,IAAI;QACtB;IACF;IAEQN,YAAYD,IAAY,EAAQ;QACtC,IAAIA,KAAKW,MAAM,KAAK,GAAG;QAEvB,MAAMC,QAAQ,IAAI,CAACC,UAAU,CAACb;QAC9B,IAAI,OAAOY,MAAME,UAAU,KAAK,YAAYF,MAAME,UAAU,KAAK,IAAI,CAACnB,iBAAiB,EAAE;YACvF,MAAM,IAAIN,iBACR,iDACA;QAEJ;QACA,IAAIuB,MAAMG,IAAI,KAAK,UAAU,IAAI,CAACC,oBAAoB,CAACJ;IACzD;IAEQC,WAAWb,IAAY,EAA2B;QACxD,IAAIiB;QACJ,IAAI;YACFA,QAAQC,KAAKC,KAAK,CAACnB,KAAKoB,QAAQ,CAAC;QACnC,EAAE,OAAM;YACN,MAAM,IAAI/B,iBAAiB,yCAAyC;QACtE;QACA,IAAI,CAAC4B,SAAS,OAAOA,UAAU,YAAYI,MAAMC,OAAO,CAACL,QAAQ;YAC/D,MAAM,IAAI5B,iBACR,+CACA;QAEJ;QACA,OAAO4B;IACT;IAEQD,qBAAqBJ,KAA8B,EAAQ;QACjE,IAAI,IAAI,CAACnB,QAAQ,EACf,MAAM,IAAIJ,iBACR,iDACA;QAEJ,IAAI,OAAOuB,MAAME,UAAU,KAAK,YAAY,OAAOF,MAAMR,MAAM,KAAK,UAAU;YAC5E,MAAM,IAAIf,iBACR,8CACA;QAEJ;QACA,IAAI,CAACI,QAAQ,GAAG;YAAEgB,WAAWG,MAAME,UAAU;YAAEV,QAAQQ,MAAMR,MAAM;YAAEM,UAAU;QAAE;IACnF;AACF"}
@@ -1,4 +1,4 @@
1
- import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
1
+ import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, ConversationOptions, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
2
2
  import { AgentRegistry } from "../../utils/AgentRegistry.js";
3
3
  export declare class CodexAdapter implements AgentAdapter {
4
4
  readonly type: "codex";
@@ -8,15 +8,16 @@ export declare class CodexAdapter implements AgentAdapter {
8
8
  private readonly mapper;
9
9
  private readonly codexSessionsDir;
10
10
  private readonly sessionMappingPath;
11
+ private locator?;
11
12
  constructor(registry?: AgentRegistry);
12
13
  canHandle(processInfo: ProcessInfo): boolean;
13
14
  detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
14
- getConversation(sessionFilePath: string, options?: {
15
- verbose?: boolean;
16
- }): ConversationMessage[];
15
+ private detectRunningAgents;
16
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
17
17
  listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
18
18
  findSessionsById(sessionId: string): Promise<SessionSummary[]>;
19
19
  private getCodexProcesses;
20
+ /** Reused across refreshes so the locator's session_meta and negative caches persist. */
20
21
  private createLocator;
21
22
  private createSessionMapping;
22
23
  private mapSessionMappingMatches;
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CodexAdapter.d.ts","sourceRoot":"","sources":["../../../src/harnesses/codex/CodexAdapter.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAExC,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAyI7D,qBAAa,YAAa,YAAW,YAAY;IAC/C,QAAQ,CAAC,IAAI,EAAG,OAAO,CAAU;IACjC,QAAQ,CAAC,YAAY,qBAAsB;IAE3C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgB;IACzC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqB;IAC5C,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAmB;IAC1C,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAS;IAC1C,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,OAAO,CAAC,CAAsB;gBAE1B,QAAQ,GAAE,aAAuC;IAQ7D,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAMtC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAS3D,mBAAmB;IAyBjC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAIxF,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAanE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;YAQtD,iBAAiB;IAI/B,yFAAyF;IACzF,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,oBAAoB;IAO5B,OAAO,CAAC,wBAAwB;IAgBhC,OAAO,CAAC,gBAAgB;IA6BxB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,gBAAgB;IAkBxB,OAAO,CAAC,sBAAsB;CAI/B"}
@@ -1,12 +1,127 @@
1
1
  import * as fs from "fs";
2
2
  import * as path from "path";
3
- import { captureProcessSnapshot, executableBasename, filterByProcessNames } from "../../utils/process.js";
4
- import { safeReadFile } from "../../utils/session.js";
3
+ import { executablePath } from "../../utils/process.js";
5
4
  import { AgentRegistry } from "../../utils/AgentRegistry.js";
6
5
  import { CodexAgentMapper } from "./CodexAgentMapper.js";
7
6
  import { CodexSessionLocator } from "./CodexSessionLocator.js";
8
7
  import { CodexSessionMapping } from "./CodexSessionMapping.js";
9
8
  import { CodexSessionParser } from "./CodexSessionParser.js";
9
+ import { findHarnessProcesses, homeDir, matchesExecutable } from "../shared.js";
10
+ /**
11
+ * Codex subcommands that never own a local agent session: long-running helpers
12
+ * (app-server, sandbox, MCP/exec servers) and short-lived management commands.
13
+ * Interactive `codex`, `resume`, `fork`, `exec` and `review` remain detected.
14
+ *
15
+ * Classification of `review`, `cloud` and `agents` checked against Codex CLI
16
+ * 0.157.1 (source tag rust-v0.157.1, codex-rs/cli/src/main.rs):
17
+ * - `review` is detected: it runs as `codex exec review`, starting a
18
+ * non-ephemeral thread in-process (source `exec`, originator `codex_exec`), so
19
+ * it writes a `session_meta` rollout under ~/.codex/sessions like `codex exec`.
20
+ * - `cloud` is excluded: it browses and applies Codex Cloud tasks over HTTP and
21
+ * never starts a local thread or rollout.
22
+ * - `agents` is excluded: it opens a dashboard over every session on the shared
23
+ * app-server daemon without starting a thread of its own; the daemon, not
24
+ * this process, owns and writes those sessions' rollouts.
25
+ */ const CODEX_HELPER_SUBCOMMANDS = new Set([
26
+ "agents",
27
+ "app",
28
+ "app-server",
29
+ "apply",
30
+ "a",
31
+ "archive",
32
+ "cloud",
33
+ "cloud-tasks",
34
+ "completion",
35
+ "debug",
36
+ "delete",
37
+ "doctor",
38
+ "exec-server",
39
+ "features",
40
+ "help",
41
+ "login",
42
+ "logout",
43
+ "mcp",
44
+ "mcp-server",
45
+ "migrate-rollouts",
46
+ "plugin",
47
+ "queue",
48
+ "remote-control",
49
+ "responses-api-proxy",
50
+ "sandbox",
51
+ "stdio-to-uds",
52
+ "unarchive",
53
+ "update"
54
+ ]);
55
+ /**
56
+ * Known root Codex subcommand names and aliases, including the hidden ones in
57
+ * Codex CLI 0.157.1. A variadic flag's values stop at these, as clap stops there.
58
+ */ const CODEX_SUBCOMMANDS = new Set([
59
+ ...CODEX_HELPER_SUBCOMMANDS,
60
+ "e",
61
+ "exec",
62
+ "execpolicy",
63
+ "fork",
64
+ "resume",
65
+ "review",
66
+ "tcp-tunnel"
67
+ ]);
68
+ /** Global Codex flags that consume the following argument as their value. */ const CODEX_VALUE_FLAGS = new Set([
69
+ "-c",
70
+ "--config",
71
+ "-m",
72
+ "--model",
73
+ "-p",
74
+ "--profile",
75
+ "-s",
76
+ "--sandbox",
77
+ "-a",
78
+ "--ask-for-approval",
79
+ "-C",
80
+ "--cd",
81
+ "--add-dir",
82
+ "--enable",
83
+ "--disable",
84
+ "--local-provider",
85
+ "--remote",
86
+ "--remote-auth-token-env"
87
+ ]);
88
+ /**
89
+ * Global Codex flags that take one or more values (clap `num_args = 1..`).
90
+ * `-i, --image <FILE>...` is the only one in Codex CLI 0.157.1.
91
+ */ const CODEX_VARIADIC_VALUE_FLAGS = new Set([
92
+ "-i",
93
+ "--image"
94
+ ]);
95
+ const CODEX_APP_SERVER_DAEMON_DIR = "app-server-daemon";
96
+ function isCodexHelperCommand(command) {
97
+ const trimmed = command.trim();
98
+ // Resolve argv[0] first so an install path containing spaces is not read as arguments.
99
+ const executable = executablePath(trimmed);
100
+ const args = trimmed.slice(executable.length).trim().split(/\s+/).filter(Boolean);
101
+ if (executable.replace(/\\/g, "/").split("/").includes(CODEX_APP_SERVER_DAEMON_DIR)) {
102
+ return true;
103
+ }
104
+ const subcommand = firstPositionalArgument(args);
105
+ return subcommand !== undefined && CODEX_HELPER_SUBCOMMANDS.has(subcommand);
106
+ }
107
+ function firstPositionalArgument(args) {
108
+ for(let index = 0; index < args.length; index++){
109
+ const arg = args[index];
110
+ if (arg === "--") return undefined;
111
+ if (!arg.startsWith("-")) return arg;
112
+ if (arg.includes("=")) continue;
113
+ if (CODEX_VALUE_FLAGS.has(arg)) {
114
+ index++;
115
+ } else if (CODEX_VARIADIC_VALUE_FLAGS.has(arg)) {
116
+ // Like clap, take values until the next flag or subcommand name.
117
+ while(index + 1 < args.length && isVariadicFlagValue(args[index + 1]))index++;
118
+ }
119
+ }
120
+ return undefined;
121
+ }
122
+ function isVariadicFlagValue(arg) {
123
+ return !arg.startsWith("-") && !CODEX_SUBCOMMANDS.has(arg);
124
+ }
10
125
  export class CodexAdapter {
11
126
  type = "codex";
12
127
  processNames = [
@@ -17,26 +132,33 @@ export class CodexAdapter {
17
132
  mapper;
18
133
  codexSessionsDir;
19
134
  sessionMappingPath;
135
+ locator;
20
136
  constructor(registry = AgentRegistry.default()){
21
- const homeDir = process.env.HOME || process.env.USERPROFILE || "";
22
137
  this.registry = registry;
23
138
  this.parser = new CodexSessionParser();
24
139
  this.mapper = new CodexAgentMapper(this.parser);
25
- this.codexSessionsDir = path.join(homeDir, ".codex", "sessions");
26
- this.sessionMappingPath = path.join(homeDir, ".codex", "ai-devkit", "sessions.json");
140
+ this.codexSessionsDir = path.join(homeDir(), ".codex", "sessions");
141
+ this.sessionMappingPath = path.join(homeDir(), ".codex", "ai-devkit", "sessions.json");
27
142
  }
28
143
  canHandle(processInfo) {
29
- const base = executableBasename(processInfo.command);
30
- return base === "codex" || base === "codex.exe";
144
+ return matchesExecutable(processInfo.command, "codex") && !isCodexHelperCommand(processInfo.command);
31
145
  }
32
146
  async detectAgents(context) {
147
+ try {
148
+ return await this.detectRunningAgents(context);
149
+ } finally{
150
+ // Drop cached summaries for sessions that were not part of this refresh
151
+ this.parser.pruneSessionCache();
152
+ }
153
+ }
154
+ async detectRunningAgents(context) {
33
155
  const processes = await this.getCodexProcesses(context);
34
156
  if (processes.length === 0) return [];
35
157
  const mappingResult = this.mapSessionMappingMatches(processes);
36
158
  const cacheResult = this.mapRegistryCache(mappingResult.fallback);
37
159
  const locatorResult = this.createLocator().matchRunningProcesses(cacheResult.fallback);
38
160
  const directResult = this.mapDirectMatches(locatorResult.direct);
39
- const legacyResult = this.mapLegacyMatches(locatorResult.legacyMatches, locatorResult.contentCache);
161
+ const legacyResult = this.mapLegacyMatches(locatorResult.legacyMatches);
40
162
  const unmatchedProcesses = this.findUnmatchedProcesses(locatorResult.fallback, [
41
163
  ...directResult.agents,
42
164
  ...legacyResult.agents
@@ -72,14 +194,13 @@ export class CodexAdapter {
72
194
  ] : [];
73
195
  }
74
196
  async getCodexProcesses(context) {
75
- const snapshot = context?.processes ?? await captureProcessSnapshot(this.processNames);
76
- const relevant = filterByProcessNames(snapshot, this.processNames);
77
- return relevant.filter((processInfo)=>this.canHandle(processInfo));
197
+ return (await findHarnessProcesses(this, context)).processes;
78
198
  }
79
- createLocator() {
80
- return new CodexSessionLocator({
199
+ /** Reused across refreshes so the locator's session_meta and negative caches persist. */ createLocator() {
200
+ this.locator ??= new CodexSessionLocator({
81
201
  sessionsDir: this.codexSessionsDir
82
202
  }, this.parser);
203
+ return this.locator;
83
204
  }
84
205
  createSessionMapping() {
85
206
  return new CodexSessionMapping({
@@ -91,7 +212,7 @@ export class CodexAdapter {
91
212
  const { matches, fallback } = this.createSessionMapping().match(processes);
92
213
  const agents = [];
93
214
  for (const match of matches){
94
- const session = this.parser.readSession(match.filePath);
215
+ const session = this.parser.readSessionIncremental(match.filePath);
95
216
  if (session) {
96
217
  agents.push(this.mapper.mapSessionToAgent(session, match.process, match.filePath));
97
218
  } else {
@@ -116,8 +237,7 @@ export class CodexAdapter {
116
237
  fallback.push(processInfo);
117
238
  continue;
118
239
  }
119
- const content = safeReadFile(entry.sessionFilePath);
120
- const session = this.parser.readSession(entry.sessionFilePath, content);
240
+ const session = this.parser.readSessionIncremental(entry.sessionFilePath);
121
241
  if (!session) {
122
242
  fallback.push(processInfo);
123
243
  continue;
@@ -133,7 +253,7 @@ export class CodexAdapter {
133
253
  const agents = [];
134
254
  const fallback = [];
135
255
  for (const match of matches){
136
- const session = this.parser.readSession(match.sessionFile.filePath);
256
+ const session = this.parser.readSessionIncremental(match.sessionFile.filePath);
137
257
  if (session) {
138
258
  agents.push(this.mapper.mapSessionToAgent(session, match.process, match.sessionFile.filePath));
139
259
  } else {
@@ -145,11 +265,11 @@ export class CodexAdapter {
145
265
  fallback
146
266
  };
147
267
  }
148
- mapLegacyMatches(matches, contentCache) {
268
+ mapLegacyMatches(matches) {
149
269
  const agents = [];
150
270
  const fallback = [];
151
271
  for (const match of matches){
152
- const session = this.parser.readSession(match.session.filePath, contentCache.get(match.session.filePath));
272
+ const session = this.parser.readSessionIncremental(match.session.filePath);
153
273
  if (session) {
154
274
  agents.push(this.mapper.mapSessionToAgent(session, match.process, match.session.filePath));
155
275
  } else {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/codex/CodexAdapter.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n ConversationOptions,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport { executablePath } from \"../../utils/process.js\";\nimport { AgentRegistry } from \"../../utils/AgentRegistry.js\";\nimport { CodexAgentMapper } from \"./CodexAgentMapper.js\";\nimport { CodexSessionLocator, type CodexDirectMatch } from \"./CodexSessionLocator.js\";\nimport { CodexSessionMapping } from \"./CodexSessionMapping.js\";\nimport { CodexSessionParser } from \"./CodexSessionParser.js\";\nimport { findHarnessProcesses, homeDir, matchesExecutable } from \"../shared.js\";\n\n/**\n * Codex subcommands that never own a local agent session: long-running helpers\n * (app-server, sandbox, MCP/exec servers) and short-lived management commands.\n * Interactive `codex`, `resume`, `fork`, `exec` and `review` remain detected.\n *\n * Classification of `review`, `cloud` and `agents` checked against Codex CLI\n * 0.157.1 (source tag rust-v0.157.1, codex-rs/cli/src/main.rs):\n * - `review` is detected: it runs as `codex exec review`, starting a\n * non-ephemeral thread in-process (source `exec`, originator `codex_exec`), so\n * it writes a `session_meta` rollout under ~/.codex/sessions like `codex exec`.\n * - `cloud` is excluded: it browses and applies Codex Cloud tasks over HTTP and\n * never starts a local thread or rollout.\n * - `agents` is excluded: it opens a dashboard over every session on the shared\n * app-server daemon without starting a thread of its own; the daemon, not\n * this process, owns and writes those sessions' rollouts.\n */\nconst CODEX_HELPER_SUBCOMMANDS = new Set([\n \"agents\",\n \"app\",\n \"app-server\",\n \"apply\",\n \"a\",\n \"archive\",\n \"cloud\",\n \"cloud-tasks\",\n \"completion\",\n \"debug\",\n \"delete\",\n \"doctor\",\n \"exec-server\",\n \"features\",\n \"help\",\n \"login\",\n \"logout\",\n \"mcp\",\n \"mcp-server\",\n \"migrate-rollouts\",\n \"plugin\",\n \"queue\",\n \"remote-control\",\n \"responses-api-proxy\",\n \"sandbox\",\n \"stdio-to-uds\",\n \"unarchive\",\n \"update\",\n]);\n\n/**\n * Known root Codex subcommand names and aliases, including the hidden ones in\n * Codex CLI 0.157.1. A variadic flag's values stop at these, as clap stops there.\n */\nconst CODEX_SUBCOMMANDS = new Set([\n ...CODEX_HELPER_SUBCOMMANDS,\n \"e\",\n \"exec\",\n \"execpolicy\",\n \"fork\",\n \"resume\",\n \"review\",\n \"tcp-tunnel\",\n]);\n\n/** Global Codex flags that consume the following argument as their value. */\nconst CODEX_VALUE_FLAGS = new Set([\n \"-c\",\n \"--config\",\n \"-m\",\n \"--model\",\n \"-p\",\n \"--profile\",\n \"-s\",\n \"--sandbox\",\n \"-a\",\n \"--ask-for-approval\",\n \"-C\",\n \"--cd\",\n \"--add-dir\",\n \"--enable\",\n \"--disable\",\n \"--local-provider\",\n \"--remote\",\n \"--remote-auth-token-env\",\n]);\n\n/**\n * Global Codex flags that take one or more values (clap `num_args = 1..`).\n * `-i, --image <FILE>...` is the only one in Codex CLI 0.157.1.\n */\nconst CODEX_VARIADIC_VALUE_FLAGS = new Set([\"-i\", \"--image\"]);\n\nconst CODEX_APP_SERVER_DAEMON_DIR = \"app-server-daemon\";\n\nfunction isCodexHelperCommand(command: string): boolean {\n const trimmed = command.trim();\n // Resolve argv[0] first so an install path containing spaces is not read as arguments.\n const executable = executablePath(trimmed);\n const args = trimmed.slice(executable.length).trim().split(/\\s+/).filter(Boolean);\n if (executable.replace(/\\\\/g, \"/\").split(\"/\").includes(CODEX_APP_SERVER_DAEMON_DIR)) {\n return true;\n }\n\n const subcommand = firstPositionalArgument(args);\n return subcommand !== undefined && CODEX_HELPER_SUBCOMMANDS.has(subcommand);\n}\n\nfunction firstPositionalArgument(args: string[]): string | undefined {\n for (let index = 0; index < args.length; index++) {\n const arg = args[index];\n if (arg === \"--\") return undefined;\n if (!arg.startsWith(\"-\")) return arg;\n if (arg.includes(\"=\")) continue;\n if (CODEX_VALUE_FLAGS.has(arg)) {\n index++;\n } else if (CODEX_VARIADIC_VALUE_FLAGS.has(arg)) {\n // Like clap, take values until the next flag or subcommand name.\n while (index + 1 < args.length && isVariadicFlagValue(args[index + 1])) index++;\n }\n }\n return undefined;\n}\n\nfunction isVariadicFlagValue(arg: string): boolean {\n return !arg.startsWith(\"-\") && !CODEX_SUBCOMMANDS.has(arg);\n}\n\ninterface MappedAgentResult {\n agents: AgentInfo[];\n fallback: ProcessInfo[];\n}\n\nexport class CodexAdapter implements AgentAdapter {\n readonly type = \"codex\" as const;\n readonly processNames = [\"codex\"] as const;\n\n private readonly registry: AgentRegistry;\n private readonly parser: CodexSessionParser;\n private readonly mapper: CodexAgentMapper;\n private readonly codexSessionsDir: string;\n private readonly sessionMappingPath: string;\n private locator?: CodexSessionLocator;\n\n constructor(registry: AgentRegistry = AgentRegistry.default()) {\n this.registry = registry;\n this.parser = new CodexSessionParser();\n this.mapper = new CodexAgentMapper(this.parser);\n this.codexSessionsDir = path.join(homeDir(), \".codex\", \"sessions\");\n this.sessionMappingPath = path.join(homeDir(), \".codex\", \"ai-devkit\", \"sessions.json\");\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return (\n matchesExecutable(processInfo.command, \"codex\") && !isCodexHelperCommand(processInfo.command)\n );\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n try {\n return await this.detectRunningAgents(context);\n } finally {\n // Drop cached summaries for sessions that were not part of this refresh\n this.parser.pruneSessionCache();\n }\n }\n\n private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const processes = await this.getCodexProcesses(context);\n if (processes.length === 0) return [];\n\n const mappingResult = this.mapSessionMappingMatches(processes);\n const cacheResult = this.mapRegistryCache(mappingResult.fallback);\n const locatorResult = this.createLocator().matchRunningProcesses(cacheResult.fallback);\n\n const directResult = this.mapDirectMatches(locatorResult.direct);\n const legacyResult = this.mapLegacyMatches(locatorResult.legacyMatches);\n const unmatchedProcesses = this.findUnmatchedProcesses(locatorResult.fallback, [\n ...directResult.agents,\n ...legacyResult.agents,\n ]);\n\n return [\n ...mappingResult.agents,\n ...cacheResult.agents,\n ...directResult.agents,\n ...legacyResult.agents,\n ...directResult.fallback.map((processInfo) => this.mapper.mapProcessOnlyAgent(processInfo)),\n ...unmatchedProcesses.map((processInfo) => this.mapper.mapProcessOnlyAgent(processInfo)),\n ];\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 filePath of this.createLocator().discoverHistoricalSessionFiles()) {\n const summary = this.parser.fileToSessionSummary(filePath);\n if (!summary) continue;\n if (opts?.cwd !== undefined && summary.cwd !== opts.cwd) continue;\n summaries.push(summary);\n }\n\n return summaries;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const sessionFile = this.createLocator().findSessionFileById(sessionId);\n if (!sessionFile) return [];\n\n const summary = this.parser.fileToSessionSummary(sessionFile.filePath);\n return summary?.sessionId === sessionId ? [summary] : [];\n }\n\n private async getCodexProcesses(context?: AgentDetectionContext): Promise<ProcessInfo[]> {\n return (await findHarnessProcesses(this, context)).processes;\n }\n\n /** Reused across refreshes so the locator's session_meta and negative caches persist. */\n private createLocator(): CodexSessionLocator {\n this.locator ??= new CodexSessionLocator({ sessionsDir: this.codexSessionsDir }, this.parser);\n return this.locator;\n }\n\n private createSessionMapping(): CodexSessionMapping {\n return new CodexSessionMapping({\n mappingPath: this.sessionMappingPath,\n sessionsDir: this.codexSessionsDir,\n });\n }\n\n private mapSessionMappingMatches(processes: ProcessInfo[]): MappedAgentResult {\n const { matches, fallback } = this.createSessionMapping().match(processes);\n const agents: AgentInfo[] = [];\n\n for (const match of matches) {\n const session = this.parser.readSessionIncremental(match.filePath);\n if (session) {\n agents.push(this.mapper.mapSessionToAgent(session, match.process, match.filePath));\n } else {\n fallback.push(match.process);\n }\n }\n\n return { agents, fallback };\n }\n\n private mapRegistryCache(processes: ProcessInfo[]): MappedAgentResult {\n const agents: AgentInfo[] = [];\n const fallback: ProcessInfo[] = [];\n const byPid = new Map(this.registry.list().map((entry) => [entry.pid, entry]));\n\n for (const processInfo of processes) {\n const entry = byPid.get(processInfo.pid);\n if (\n !entry ||\n entry.type !== this.type ||\n !entry.sessionFilePath ||\n !fs.existsSync(entry.sessionFilePath)\n ) {\n fallback.push(processInfo);\n continue;\n }\n\n const session = this.parser.readSessionIncremental(entry.sessionFilePath);\n if (!session) {\n fallback.push(processInfo);\n continue;\n }\n\n agents.push(this.mapper.mapSessionToAgent(session, processInfo, entry.sessionFilePath));\n }\n\n return { agents, fallback };\n }\n\n private mapDirectMatches(matches: CodexDirectMatch[]): MappedAgentResult {\n const agents: AgentInfo[] = [];\n const fallback: ProcessInfo[] = [];\n\n for (const match of matches) {\n const session = this.parser.readSessionIncremental(match.sessionFile.filePath);\n if (session) {\n agents.push(\n this.mapper.mapSessionToAgent(session, match.process, match.sessionFile.filePath),\n );\n } else {\n fallback.push(match.process);\n }\n }\n\n return { agents, fallback };\n }\n\n private mapLegacyMatches(\n matches: Array<{ process: ProcessInfo; session: { filePath: string } }>,\n ): MappedAgentResult {\n const agents: AgentInfo[] = [];\n const fallback: ProcessInfo[] = [];\n\n for (const match of matches) {\n const session = this.parser.readSessionIncremental(match.session.filePath);\n if (session) {\n agents.push(this.mapper.mapSessionToAgent(session, match.process, match.session.filePath));\n } else {\n fallback.push(match.process);\n }\n }\n\n return { agents, fallback };\n }\n\n private findUnmatchedProcesses(processes: ProcessInfo[], agents: AgentInfo[]): ProcessInfo[] {\n const matchedPids = new Set(agents.map((agent) => agent.pid));\n return processes.filter((processInfo) => !matchedPids.has(processInfo.pid));\n }\n}\n"],"names":["fs","path","executablePath","AgentRegistry","CodexAgentMapper","CodexSessionLocator","CodexSessionMapping","CodexSessionParser","findHarnessProcesses","homeDir","matchesExecutable","CODEX_HELPER_SUBCOMMANDS","Set","CODEX_SUBCOMMANDS","CODEX_VALUE_FLAGS","CODEX_VARIADIC_VALUE_FLAGS","CODEX_APP_SERVER_DAEMON_DIR","isCodexHelperCommand","command","trimmed","trim","executable","args","slice","length","split","filter","Boolean","replace","includes","subcommand","firstPositionalArgument","undefined","has","index","arg","startsWith","isVariadicFlagValue","CodexAdapter","type","processNames","registry","parser","mapper","codexSessionsDir","sessionMappingPath","locator","default","join","canHandle","processInfo","detectAgents","context","detectRunningAgents","pruneSessionCache","processes","getCodexProcesses","mappingResult","mapSessionMappingMatches","cacheResult","mapRegistryCache","fallback","locatorResult","createLocator","matchRunningProcesses","directResult","mapDirectMatches","direct","legacyResult","mapLegacyMatches","legacyMatches","unmatchedProcesses","findUnmatchedProcesses","agents","map","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","summaries","filePath","discoverHistoricalSessionFiles","summary","fileToSessionSummary","cwd","push","findSessionsById","sessionId","sessionFile","findSessionFileById","sessionsDir","createSessionMapping","mappingPath","matches","match","session","readSessionIncremental","mapSessionToAgent","process","byPid","Map","list","entry","pid","get","existsSync","matchedPids","agent"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"CodexAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/providers/codex/CodexAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEhF,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB;IAEvD,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;IAc/F,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAYzD"}
1
+ {"version":3,"file":"CodexAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/codex/CodexAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAE7E,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAGhF,qBAAa,gBAAgB;IACf,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,EAAE,kBAAkB;IAEvD,iBAAiB,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,GAAG,SAAS;IAc/F,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}
@@ -1,5 +1,5 @@
1
- import { AgentStatus } from "../../adapters/AgentAdapter.js";
2
1
  import { generateAgentName } from "../../utils/matching.js";
2
+ import { processOnlyAgent } from "../shared.js";
3
3
  export class CodexAgentMapper {
4
4
  parser;
5
5
  constructor(parser){
@@ -19,16 +19,9 @@ export class CodexAgentMapper {
19
19
  };
20
20
  }
21
21
  mapProcessOnlyAgent(processInfo) {
22
- return {
23
- name: generateAgentName(processInfo.cwd || "", processInfo.pid),
24
- type: "codex",
25
- status: AgentStatus.RUNNING,
26
- summary: "Codex process running",
27
- pid: processInfo.pid,
28
- projectPath: processInfo.cwd || "",
29
- sessionId: `pid-${processInfo.pid}`,
30
- lastActive: new Date()
31
- };
22
+ return processOnlyAgent("codex", processInfo, {
23
+ summary: "Codex process running"
24
+ });
32
25
  }
33
26
  }
34
27
 
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/codex/CodexAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport type { CodexSessionParser, CodexSession } from \"./CodexSessionParser.js\";\nimport { processOnlyAgent } from \"../shared.js\";\n\nexport class CodexAgentMapper {\n constructor(private readonly parser: CodexSessionParser) {}\n\n mapSessionToAgent(session: CodexSession, processInfo: ProcessInfo, filePath: string): AgentInfo {\n return {\n name: generateAgentName(session.projectPath || processInfo.cwd || \"\", processInfo.pid),\n type: \"codex\",\n status: this.parser.determineStatus(session),\n summary: session.summary || \"Codex session active\",\n pid: processInfo.pid,\n projectPath: session.projectPath || processInfo.cwd || \"\",\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: filePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return processOnlyAgent(\"codex\", processInfo, { summary: \"Codex process running\" });\n }\n}\n"],"names":["generateAgentName","processOnlyAgent","CodexAgentMapper","parser","mapSessionToAgent","session","processInfo","filePath","name","projectPath","cwd","pid","type","status","determineStatus","summary","sessionId","lastActive","sessionFilePath","mapProcessOnlyAgent"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,0BAA0B;AAE5D,SAASC,gBAAgB,QAAQ,eAAe;AAEhD,OAAO,MAAMC;;IACX,YAAY,AAAiBC,MAA0B,CAAE;aAA5BA,SAAAA;IAA6B;IAE1DC,kBAAkBC,OAAqB,EAAEC,WAAwB,EAAEC,QAAgB,EAAa;QAC9F,OAAO;YACLC,MAAMR,kBAAkBK,QAAQI,WAAW,IAAIH,YAAYI,GAAG,IAAI,IAAIJ,YAAYK,GAAG;YACrFC,MAAM;YACNC,QAAQ,IAAI,CAACV,MAAM,CAACW,eAAe,CAACT;YACpCU,SAASV,QAAQU,OAAO,IAAI;YAC5BJ,KAAKL,YAAYK,GAAG;YACpBF,aAAaJ,QAAQI,WAAW,IAAIH,YAAYI,GAAG,IAAI;YACvDM,WAAWX,QAAQW,SAAS;YAC5BC,YAAYZ,QAAQY,UAAU;YAC9BC,iBAAiBX;QACnB;IACF;IAEAY,oBAAoBb,WAAwB,EAAa;QACvD,OAAOL,iBAAiB,SAASK,aAAa;YAAES,SAAS;QAAwB;IACnF;AACF"}