@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
@@ -1,7 +1,7 @@
1
1
  import { describe, expect, it, vi } from "vitest";
2
2
  describe("CodexCliProbe", ()=>{
3
3
  it("validates version, exec JSON/stdin, and resume capabilities without a model call", async ()=>{
4
- const api = await import("../../index.js");
4
+ const api = await import("../../../../index.js");
5
5
  expect(api).toHaveProperty("CodexCliProbe");
6
6
  const exec = vi.fn().mockResolvedValueOnce({
7
7
  stdout: "codex-cli 0.147.0",
@@ -46,7 +46,7 @@ describe("CodexCliProbe", ()=>{
46
46
  ]);
47
47
  });
48
48
  it("rejects unsupported and unavailable CLIs with bounded sanitized errors", async ()=>{
49
- const api = await import("../../index.js");
49
+ const api = await import("../../../../index.js");
50
50
  const Probe = api.CodexCliProbe;
51
51
  const unsupported = new Probe({
52
52
  exec: vi.fn().mockResolvedValueOnce({
@@ -87,7 +87,7 @@ describe("CodexCliProbe", ()=>{
87
87
  expect(error.message.length).toBeLessThan(600);
88
88
  });
89
89
  it("reports an empty version response as unknown", async ()=>{
90
- const api = await import("../../index.js");
90
+ const api = await import("../../../../index.js");
91
91
  const Probe = api.CodexCliProbe;
92
92
  const exec = vi.fn().mockResolvedValueOnce({
93
93
  stdout: " \n",
@@ -106,7 +106,7 @@ describe("CodexCliProbe", ()=>{
106
106
  });
107
107
  });
108
108
  it("requires a standalone stdin dash rather than accepting flag hyphens", async ()=>{
109
- const api = await import("../../index.js");
109
+ const api = await import("../../../../index.js");
110
110
  const Probe = api.CodexCliProbe;
111
111
  const exec = vi.fn().mockResolvedValueOnce({
112
112
  stdout: "version",
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexCliProbe.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\n\ndescribe(\"CodexCliProbe\", () => {\n it(\"validates version, exec JSON/stdin, and resume capabilities without a model call\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexCliProbe\");\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"codex-cli 0.147.0\", stderr: \"\" })\n .mockResolvedValueOnce({\n stdout: \"Usage: codex exec [PROMPT]\\n--json\\n- read from stdin\\nresume\",\n stderr: \"\",\n })\n .mockResolvedValueOnce({\n stdout: \"Usage: codex exec resume [SESSION_ID] [PROMPT]\\n--json\\n- stdin\",\n stderr: \"\",\n });\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n\n await expect(new Probe({ executable: \"fake-codex\", exec }).validate()).resolves.toEqual({\n executable: \"fake-codex\",\n version: \"codex-cli 0.147.0\",\n });\n expect(exec.mock.calls).toEqual([\n [\"fake-codex\", [\"--version\"]],\n [\"fake-codex\", [\"exec\", \"--help\"]],\n [\"fake-codex\", [\"exec\", \"resume\", \"--help\"]],\n ]);\n });\n\n it(\"rejects unsupported and unavailable CLIs with bounded sanitized errors\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const unsupported = new Probe({\n exec: vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume\", stderr: \"\" }),\n });\n await expect(unsupported.validate()).rejects.toMatchObject({ code: \"CODEX_CLI_UNSUPPORTED\" });\n const missingCommands = new Probe({\n exec: vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"\", stderr: \"\" }),\n });\n await expect(missingCommands.validate()).rejects.toMatchObject({\n code: \"CODEX_CLI_UNSUPPORTED\",\n });\n\n const unavailable = new Probe({\n exec: vi.fn().mockRejectedValue(new Error(`bad\\0${\"x\".repeat(1000)}`)),\n });\n const error = await unavailable.validate().catch((value: Error & { code: string }) => value);\n expect(error.code).toBe(\"CODEX_CLI_UNAVAILABLE\");\n expect(error.message).not.toContain(\"\\0\");\n expect(error.message.length).toBeLessThan(600);\n });\n\n it(\"reports an empty version response as unknown\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \" \\n\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec --json -\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume --json -\", stderr: \"\" });\n await expect(new Probe({ exec }).validate()).resolves.toMatchObject({ version: \"unknown\" });\n });\n\n it(\"requires a standalone stdin dash rather than accepting flag hyphens\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Probe = api.CodexCliProbe as new (options: unknown) => any;\n const exec = vi\n .fn()\n .mockResolvedValueOnce({ stdout: \"version\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"exec --json\", stderr: \"\" })\n .mockResolvedValueOnce({ stdout: \"resume --json\", stderr: \"\" });\n await expect(new Probe({ exec }).validate()).rejects.toMatchObject({\n code: \"CODEX_CLI_UNSUPPORTED\",\n });\n });\n});\n"],"names":["describe","expect","it","vi","api","toHaveProperty","exec","fn","mockResolvedValueOnce","stdout","stderr","Probe","CodexCliProbe","executable","validate","resolves","toEqual","version","mock","calls","unsupported","rejects","toMatchObject","code","missingCommands","unavailable","mockRejectedValue","Error","repeat","error","catch","value","toBe","message","not","toContain","length","toBeLessThan"],"mappings":"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"}
@@ -2,7 +2,7 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { afterEach, describe, expect, it } from "vitest";
5
- import { DurableAgentRepository } from "../../durable/DurableAgentRepository.js";
5
+ import { DurableAgentRepository } from "../../../../durable/DurableAgentRepository.js";
6
6
  const SESSION = "22222222-2222-4222-8222-222222222222";
7
7
  const OTHER_SESSION = "33333333-3333-4333-8333-333333333333";
8
8
  const roots = [];
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, describe, expect, it } from \"vitest\";\nimport { DurableAgentRepository } from \"../../../../durable/DurableAgentRepository.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst OTHER_SESSION = \"33333333-3333-4333-8333-333333333333\";\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\nfunction fixture() {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-durable-repository-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector = { getIdentity: (pid: number) => ({ pid, startedAt: \"owner-start\" }) };\n return {\n cwd,\n repository: new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n }),\n };\n}\n\ndescribe(\"Codex durable-agent repository binding\", () => {\n it(\"creates Codex agents unbound and binds during the owned run\", async () => {\n const { cwd, repository } = fixture();\n const agent = await repository.create({ name: \"reviewer\", cwd, provider: \"codex\" });\n expect(agent).toMatchObject({ provider: \"codex\", mode: \"durable\", providerSessionId: null });\n\n const run = await repository.acquireRun(agent.id);\n const bound = await repository.bindProviderSession(agent.id, run.token, SESSION);\n expect(bound.providerSessionId).toBe(SESSION);\n await expect(\n repository.bindProviderSession(agent.id, run.token, SESSION),\n ).resolves.toMatchObject({ providerSessionId: SESSION });\n });\n\n it(\"rejects invalid, stale, replacement, and duplicate bindings\", async () => {\n const { cwd, repository } = fixture();\n const first = await repository.create({ name: \"first\", cwd, provider: \"codex\" });\n const second = await repository.create({ name: \"second\", cwd, provider: \"codex\" });\n const firstRun = await repository.acquireRun(first.id);\n const secondRun = await repository.acquireRun(second.id);\n\n await expect(repository.bindProviderSession(first.id, \"stale\", SESSION)).rejects.toMatchObject({\n code: \"DURABLE_AGENT_REPOSITORY\",\n });\n await expect(\n repository.bindProviderSession(first.id, firstRun.token, \"invalid\"),\n ).rejects.toMatchObject({ code: \"DURABLE_AGENT_REPOSITORY\" });\n await repository.bindProviderSession(first.id, firstRun.token, SESSION);\n await expect(\n repository.bindProviderSession(first.id, firstRun.token, OTHER_SESSION),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n await expect(\n repository.bindProviderSession(second.id, secondRun.token, SESSION),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","DurableAgentRepository","SESSION","OTHER_SESSION","roots","root","splice","rmSync","recursive","force","fixture","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","processInspector","getIdentity","pid","startedAt","repository","dbPath","agent","create","name","provider","toMatchObject","mode","providerSessionId","run","acquireRun","id","bound","bindProviderSession","token","toBe","resolves","first","second","firstRun","secondRun","rejects","code"],"mappings":"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"}
@@ -2,7 +2,7 @@ import fs from "node:fs";
2
2
  import os from "node:os";
3
3
  import path from "node:path";
4
4
  import { afterEach, describe, expect, it, vi } from "vitest";
5
- import { CodexPrintError, CodexPrintAgentService, DurableAgentRepository } from "../../index.js";
5
+ import { CodexPrintError, CodexPrintAgentService, DurableAgentRepository } from "../../../../index.js";
6
6
  const SESSION = "22222222-2222-4222-8222-222222222222";
7
7
  const roots = [];
8
8
  afterEach(()=>{
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.ts"],"sourcesContent":["import fs from \"node:fs\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { afterEach, describe, expect, it, vi } from \"vitest\";\nimport {\n CodexPrintError,\n CodexPrintAgentService,\n DurableAgentRepository,\n type ProcessInspector,\n} from \"../../../../index.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst roots: string[] = [];\n\nafterEach(() => {\n for (const root of roots.splice(0)) fs.rmSync(root, { recursive: true, force: true });\n});\n\ndescribe(\"Codex print-agent fake-provider journey\", () => {\n it(\"creates unbound, then binds and explicitly resumes the provider-minted session\", async () => {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-print-integration-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector: ProcessInspector = {\n getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),\n };\n const repository = new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n });\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"process-42\" });\n await request.onSession(SESSION);\n return {\n sessionId: SESSION,\n result: `answer:${request.prompt}`,\n messages: [`answer:${request.prompt}`],\n exitCode: 0,\n };\n }),\n };\n const service = new CodexPrintAgentService({\n repository,\n probe: { validate: vi.fn() },\n runner,\n });\n\n const created = await service.create({ name: \"reviewer\", cwd });\n expect(created).toMatchObject({\n provider: \"codex\",\n providerSessionId: null,\n sessionHealth: \"uninitialized\",\n });\n\n const first = await service.send(created.id, \"first secret\");\n expect(first).toMatchObject({ result: \"answer:first secret\" });\n const bound = await repository.getById(created.id);\n expect(bound?.providerSessionId).toBe(first.sessionId);\n await expect(service.send(created.id, \"follow up\")).resolves.toMatchObject({\n result: \"answer:follow up\",\n });\n\n expect(runner.run.mock.calls[0][0].agent).toMatchObject({ providerSessionId: null });\n expect(runner.run.mock.calls[1][0].agent).toMatchObject({ providerSessionId: SESSION });\n });\n\n it(\"retains a first-run binding when the provider fails after thread start\", async () => {\n const root = fs.mkdtempSync(path.join(os.tmpdir(), \"codex-print-bind-failure-\"));\n roots.push(root);\n const cwd = path.join(root, \"project\");\n fs.mkdirSync(cwd);\n const processInspector: ProcessInspector = {\n getIdentity: (pid) => ({ pid, startedAt: `process-${pid}` }),\n };\n const repository = new DurableAgentRepository({\n dbPath: path.join(root, \"agents.db\"),\n processInspector,\n });\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"process-42\" });\n await request.onSession(SESSION);\n throw new CodexPrintError(\"Codex print run failed.\", \"CODEX_PROCESS\");\n }),\n };\n const service = new CodexPrintAgentService({\n repository,\n probe: { validate: vi.fn() },\n runner,\n });\n const created = await service.create({ name: \"reviewer\", cwd });\n\n await expect(service.send(created.id, \"secret\")).rejects.toMatchObject({\n code: \"CODEX_PROCESS\",\n });\n expect(await repository.getById(created.id)).toMatchObject({\n providerSessionId: SESSION,\n state: \"degraded\",\n sessionHealth: \"unknown\",\n });\n });\n});\n"],"names":["fs","os","path","afterEach","describe","expect","it","vi","CodexPrintError","CodexPrintAgentService","DurableAgentRepository","SESSION","roots","root","splice","rmSync","recursive","force","mkdtempSync","join","tmpdir","push","cwd","mkdirSync","processInspector","getIdentity","pid","startedAt","repository","dbPath","runner","run","fn","mockImplementation","request","onSpawn","onSession","sessionId","result","prompt","messages","exitCode","service","probe","validate","created","create","name","toMatchObject","provider","providerSessionId","sessionHealth","first","send","id","bound","getById","toBe","resolves","mock","calls","agent","rejects","code","state"],"mappings":"AAAA,OAAOA,QAAQ,UAAU;AACzB,OAAOC,QAAQ,UAAU;AACzB,OAAOC,UAAU,YAAY;AAC7B,SAASC,SAAS,EAAEC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAS;AAC7D,SACEC,eAAe,EACfC,sBAAsB,EACtBC,sBAAsB,QAEjB,uBAAuB;AAE9B,MAAMC,UAAU;AAChB,MAAMC,QAAkB,EAAE;AAE1BT,UAAU;IACR,KAAK,MAAMU,QAAQD,MAAME,MAAM,CAAC,GAAId,GAAGe,MAAM,CAACF,MAAM;QAAEG,WAAW;QAAMC,OAAO;IAAK;AACrF;AAEAb,SAAS,2CAA2C;IAClDE,GAAG,kFAAkF;QACnF,MAAMO,OAAOb,GAAGkB,WAAW,CAAChB,KAAKiB,IAAI,CAAClB,GAAGmB,MAAM,IAAI;QACnDR,MAAMS,IAAI,CAACR;QACX,MAAMS,MAAMpB,KAAKiB,IAAI,CAACN,MAAM;QAC5Bb,GAAGuB,SAAS,CAACD;QACb,MAAME,mBAAqC;YACzCC,aAAa,CAACC,MAAS,CAAA;oBAAEA;oBAAKC,WAAW,CAAC,QAAQ,EAAED,KAAK;gBAAC,CAAA;QAC5D;QACA,MAAME,aAAa,IAAIlB,uBAAuB;YAC5CmB,QAAQ3B,KAAKiB,IAAI,CAACN,MAAM;YACxBW;QACF;QACA,MAAMM,SAAS;YACbC,KAAKxB,GAAGyB,EAAE,GAAGC,kBAAkB,CAAC,OAAOC;gBACrC,MAAMA,QAAQC,OAAO,CAAC;oBAAET,KAAK;oBAAIC,WAAW;gBAAa;gBACzD,MAAMO,QAAQE,SAAS,CAACzB;gBACxB,OAAO;oBACL0B,WAAW1B;oBACX2B,QAAQ,CAAC,OAAO,EAAEJ,QAAQK,MAAM,EAAE;oBAClCC,UAAU;wBAAC,CAAC,OAAO,EAAEN,QAAQK,MAAM,EAAE;qBAAC;oBACtCE,UAAU;gBACZ;YACF;QACF;QACA,MAAMC,UAAU,IAAIjC,uBAAuB;YACzCmB;YACAe,OAAO;gBAAEC,UAAUrC,GAAGyB,EAAE;YAAG;YAC3BF;QACF;QAEA,MAAMe,UAAU,MAAMH,QAAQI,MAAM,CAAC;YAAEC,MAAM;YAAYzB;QAAI;QAC7DjB,OAAOwC,SAASG,aAAa,CAAC;YAC5BC,UAAU;YACVC,mBAAmB;YACnBC,eAAe;QACjB;QAEA,MAAMC,QAAQ,MAAMV,QAAQW,IAAI,CAACR,QAAQS,EAAE,EAAE;QAC7CjD,OAAO+C,OAAOJ,aAAa,CAAC;YAAEV,QAAQ;QAAsB;QAC5D,MAAMiB,QAAQ,MAAM3B,WAAW4B,OAAO,CAACX,QAAQS,EAAE;QACjDjD,OAAOkD,OAAOL,mBAAmBO,IAAI,CAACL,MAAMf,SAAS;QACrD,MAAMhC,OAAOqC,QAAQW,IAAI,CAACR,QAAQS,EAAE,EAAE,cAAcI,QAAQ,CAACV,aAAa,CAAC;YACzEV,QAAQ;QACV;QAEAjC,OAAOyB,OAAOC,GAAG,CAAC4B,IAAI,CAACC,KAAK,CAAC,EAAE,CAAC,EAAE,CAACC,KAAK,EAAEb,aAAa,CAAC;YAAEE,mBAAmB;QAAK;QAClF7C,OAAOyB,OAAOC,GAAG,CAAC4B,IAAI,CAACC,KAAK,CAAC,EAAE,CAAC,EAAE,CAACC,KAAK,EAAEb,aAAa,CAAC;YAAEE,mBAAmBvC;QAAQ;IACvF;IAEAL,GAAG,0EAA0E;QAC3E,MAAMO,OAAOb,GAAGkB,WAAW,CAAChB,KAAKiB,IAAI,CAAClB,GAAGmB,MAAM,IAAI;QACnDR,MAAMS,IAAI,CAACR;QACX,MAAMS,MAAMpB,KAAKiB,IAAI,CAACN,MAAM;QAC5Bb,GAAGuB,SAAS,CAACD;QACb,MAAME,mBAAqC;YACzCC,aAAa,CAACC,MAAS,CAAA;oBAAEA;oBAAKC,WAAW,CAAC,QAAQ,EAAED,KAAK;gBAAC,CAAA;QAC5D;QACA,MAAME,aAAa,IAAIlB,uBAAuB;YAC5CmB,QAAQ3B,KAAKiB,IAAI,CAACN,MAAM;YACxBW;QACF;QACA,MAAMM,SAAS;YACbC,KAAKxB,GAAGyB,EAAE,GAAGC,kBAAkB,CAAC,OAAOC;gBACrC,MAAMA,QAAQC,OAAO,CAAC;oBAAET,KAAK;oBAAIC,WAAW;gBAAa;gBACzD,MAAMO,QAAQE,SAAS,CAACzB;gBACxB,MAAM,IAAIH,gBAAgB,2BAA2B;YACvD;QACF;QACA,MAAMkC,UAAU,IAAIjC,uBAAuB;YACzCmB;YACAe,OAAO;gBAAEC,UAAUrC,GAAGyB,EAAE;YAAG;YAC3BF;QACF;QACA,MAAMe,UAAU,MAAMH,QAAQI,MAAM,CAAC;YAAEC,MAAM;YAAYzB;QAAI;QAE7D,MAAMjB,OAAOqC,QAAQW,IAAI,CAACR,QAAQS,EAAE,EAAE,WAAWQ,OAAO,CAACd,aAAa,CAAC;YACrEe,MAAM;QACR;QACA1D,OAAO,MAAMuB,WAAW4B,OAAO,CAACX,QAAQS,EAAE,GAAGN,aAAa,CAAC;YACzDE,mBAAmBvC;YACnBqD,OAAO;YACPb,eAAe;QACjB;IACF;AACF"}
@@ -8,13 +8,8 @@ const base = {
8
8
  sessionHealth: "uninitialized"
9
9
  };
10
10
  describe("CodexPrintAgentService", ()=>{
11
- it("constructs default non-billable dependencies without invoking them", async ()=>{
12
- const api = await import("../../index.js");
13
- const Service = api.CodexPrintAgentService;
14
- expect(new Service().repository).toBeDefined();
15
- });
16
11
  it("validates before provider-aware create and never runs Codex", async ()=>{
17
- const api = await import("../../index.js");
12
+ const api = await import("../../../../index.js");
18
13
  expect(api).toHaveProperty("CodexPrintAgentService");
19
14
  const probe = {
20
15
  validate: vi.fn().mockResolvedValue({
@@ -23,8 +18,7 @@ describe("CodexPrintAgentService", ()=>{
23
18
  })
24
19
  };
25
20
  const repository = {
26
- create: vi.fn().mockResolvedValue(base),
27
- list: vi.fn()
21
+ create: vi.fn().mockResolvedValue(base)
28
22
  };
29
23
  const runner = {
30
24
  run: vi.fn()
@@ -46,9 +40,8 @@ describe("CodexPrintAgentService", ()=>{
46
40
  expect(runner.run).not.toHaveBeenCalled();
47
41
  });
48
42
  it("binds during first send and explicitly resumes later sends", async ()=>{
49
- const api = await import("../../index.js");
43
+ const api = await import("../../../../index.js");
50
44
  const repository = {
51
- list: vi.fn(),
52
45
  resolve: vi.fn().mockResolvedValue(base),
53
46
  acquireRun: vi.fn().mockResolvedValueOnce({
54
47
  agent: base,
@@ -101,11 +94,10 @@ describe("CodexPrintAgentService", ()=>{
101
94
  }));
102
95
  });
103
96
  it("records mismatch separately from unknown failures", async ()=>{
104
- const api = await import("../../index.js");
97
+ const api = await import("../../../../index.js");
105
98
  const ErrorType = api.CodexPrintError;
106
99
  const completeRun = vi.fn();
107
100
  const repository = {
108
- list: vi.fn(),
109
101
  resolve: vi.fn().mockResolvedValue(base),
110
102
  acquireRun: vi.fn().mockResolvedValue({
111
103
  agent: base,
@@ -133,7 +125,7 @@ describe("CodexPrintAgentService", ()=>{
133
125
  }));
134
126
  });
135
127
  it("rejects a non-Codex target without acquiring or mutating it", async ()=>{
136
- const api = await import("../../index.js");
128
+ const api = await import("../../../../index.js");
137
129
  const Service = api.CodexPrintAgentService;
138
130
  const repository = {
139
131
  resolve: vi.fn().mockResolvedValue({
@@ -160,7 +152,7 @@ describe("CodexPrintAgentService", ()=>{
160
152
  expect(repository.completeRun).not.toHaveBeenCalled();
161
153
  });
162
154
  it("does not turn a successful completion write failure into a second completion", async ()=>{
163
- const api = await import("../../index.js");
155
+ const api = await import("../../../../index.js");
164
156
  const Service = api.CodexPrintAgentService;
165
157
  const completionFailure = new Error("completion failed");
166
158
  const repository = {
@@ -193,11 +185,10 @@ describe("CodexPrintAgentService", ()=>{
193
185
  expect(repository.completeRun).toHaveBeenCalledOnce();
194
186
  });
195
187
  it("records a repository binding conflict as a session mismatch", async ()=>{
196
- const api = await import("../../index.js");
188
+ const api = await import("../../../../index.js");
197
189
  const BindingError = api.CodexPrintError;
198
190
  const completeRun = vi.fn();
199
191
  const repository = {
200
- list: vi.fn(),
201
192
  resolve: vi.fn().mockResolvedValue(base),
202
193
  acquireRun: vi.fn().mockResolvedValue({
203
194
  agent: base,
@@ -235,10 +226,9 @@ describe("CodexPrintAgentService", ()=>{
235
226
  }));
236
227
  });
237
228
  it("rejects missing and ambiguous records before acquiring a run", async ()=>{
238
- const api = await import("../../index.js");
229
+ const api = await import("../../../../index.js");
239
230
  const Service = api.CodexPrintAgentService;
240
231
  const repository = {
241
- list: vi.fn(),
242
232
  create: vi.fn(),
243
233
  resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([
244
234
  base,
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.ts"],"sourcesContent":["import { describe, expect, it, vi } from \"vitest\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\nconst base = {\n id: \"id\",\n name: \"reviewer\",\n provider: \"codex\",\n providerSessionId: null,\n sessionHealth: \"uninitialized\",\n};\n\ndescribe(\"CodexPrintAgentService\", () => {\n it(\"validates before provider-aware create and never runs Codex\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexPrintAgentService\");\n const probe = {\n validate: vi.fn().mockResolvedValue({ executable: \"codex\", version: \"0.147.0\" }),\n };\n const repository = { create: vi.fn().mockResolvedValue(base) };\n const runner = { run: vi.fn() };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n await new Service({ repository, probe, runner }).create({ name: \"reviewer\", cwd: \"/project\" });\n expect(repository.create).toHaveBeenCalledWith({\n name: \"reviewer\",\n cwd: \"/project\",\n provider: \"codex\",\n });\n expect(runner.run).not.toHaveBeenCalled();\n });\n\n it(\"binds during first send and explicitly resumes later sends\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi\n .fn()\n .mockResolvedValueOnce({ agent: base, token: \"one\" })\n .mockResolvedValueOnce({\n agent: { ...base, providerSessionId: SESSION, sessionHealth: \"healthy\" },\n token: \"two\",\n }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSpawn({ pid: 42, startedAt: \"start\" });\n await request.onSession(SESSION);\n return { sessionId: SESSION, result: \"answer\", messages: [\"answer\"], exitCode: 0 };\n }),\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner,\n executable: \"fake-codex\",\n });\n\n await service.send(\"reviewer\", \"first\");\n await service.send(\"reviewer\", \"later\");\n\n expect(repository.bindProviderSession).toHaveBeenNthCalledWith(1, \"id\", \"one\", SESSION);\n expect(repository.bindProviderSession).toHaveBeenNthCalledWith(2, \"id\", \"two\", SESSION);\n expect(repository.completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({\n status: \"succeeded\",\n sessionHealth: \"healthy\",\n }),\n );\n });\n\n it(\"records mismatch separately from unknown failures\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const ErrorType = api.CodexPrintError as new (message: string, code: string) => Error;\n const completeRun = vi.fn();\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun,\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner: {\n run: vi.fn().mockRejectedValue(new ErrorType(\"mismatch\", \"CODEX_SESSION_MISMATCH\")),\n },\n });\n await expect(service.send(\"reviewer\", \"x\")).rejects.toMatchObject({\n code: \"CODEX_SESSION_MISMATCH\",\n });\n expect(completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({ sessionHealth: \"mismatch\" }),\n );\n });\n\n it(\"rejects a non-Codex target without acquiring or mutating it\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const repository = {\n resolve: vi.fn().mockResolvedValue({ ...base, provider: \"claude\" }),\n acquireRun: vi.fn(),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner: { run: vi.fn() } }).send(\n \"reviewer\",\n \"x\",\n ),\n ).rejects.toMatchObject({ code: \"CODEX_UNSUPPORTED\" });\n expect(repository.acquireRun).not.toHaveBeenCalled();\n expect(repository.completeRun).not.toHaveBeenCalled();\n });\n\n it(\"does not turn a successful completion write failure into a second completion\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const completionFailure = new Error(\"completion failed\");\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn().mockRejectedValue(completionFailure),\n };\n const runner = {\n run: vi.fn().mockResolvedValue({\n sessionId: SESSION,\n result: \"answer\",\n messages: [\"answer\"],\n exitCode: 0,\n }),\n };\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner }).send(\"reviewer\", \"x\"),\n ).rejects.toBe(completionFailure);\n expect(repository.completeRun).toHaveBeenCalledOnce();\n });\n\n it(\"records a repository binding conflict as a session mismatch\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const BindingError = api.CodexPrintError as new (message: string, code: string) => Error;\n const completeRun = vi.fn();\n const repository = {\n resolve: vi.fn().mockResolvedValue(base),\n acquireRun: vi.fn().mockResolvedValue({ agent: base, token: \"one\" }),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi\n .fn()\n .mockRejectedValue(new BindingError(\"binding mismatch\", \"CODEX_SESSION_MISMATCH\")),\n completeRun,\n };\n const runner = {\n run: vi.fn().mockImplementation(async (request) => {\n await request.onSession(SESSION);\n return { sessionId: SESSION, result: \"x\", messages: [\"x\"], exitCode: 0 };\n }),\n };\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n\n await expect(\n new Service({ repository, probe: { validate: vi.fn() }, runner }).send(\"reviewer\", \"x\"),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n expect(completeRun).toHaveBeenCalledWith(\n \"id\",\n \"one\",\n expect.objectContaining({ sessionHealth: \"mismatch\" }),\n );\n });\n\n it(\"rejects missing and ambiguous records before acquiring a run\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const Service = api.CodexPrintAgentService as new (options: unknown) => any;\n const repository = {\n create: vi.fn(),\n resolve: vi.fn().mockResolvedValueOnce(null).mockResolvedValueOnce([base, base]),\n acquireRun: vi.fn(),\n recordProviderProcess: vi.fn(),\n bindProviderSession: vi.fn(),\n completeRun: vi.fn(),\n };\n const service = new Service({\n repository,\n probe: { validate: vi.fn() },\n runner: { run: vi.fn() },\n });\n await expect(service.send(\"missing\", \"x\")).rejects.toMatchObject({\n code: \"DURABLE_AGENT_NOT_FOUND\",\n });\n await expect(service.send(\"ambiguous\", \"x\")).rejects.toMatchObject({\n code: \"CODEX_UNSUPPORTED\",\n });\n expect(repository.acquireRun).not.toHaveBeenCalled();\n });\n});\n"],"names":["describe","expect","it","vi","SESSION","base","id","name","provider","providerSessionId","sessionHealth","api","toHaveProperty","probe","validate","fn","mockResolvedValue","executable","version","repository","create","runner","run","Service","CodexPrintAgentService","cwd","toHaveBeenCalledWith","not","toHaveBeenCalled","resolve","acquireRun","mockResolvedValueOnce","agent","token","recordProviderProcess","bindProviderSession","completeRun","mockImplementation","request","onSpawn","pid","startedAt","onSession","sessionId","result","messages","exitCode","service","send","toHaveBeenNthCalledWith","objectContaining","status","ErrorType","CodexPrintError","mockRejectedValue","rejects","toMatchObject","code","completionFailure","Error","toBe","toHaveBeenCalledOnce","BindingError"],"mappings":"AAAA,SAASA,QAAQ,EAAEC,MAAM,EAAEC,EAAE,EAAEC,EAAE,QAAQ,SAAS;AAElD,MAAMC,UAAU;AAChB,MAAMC,OAAO;IACXC,IAAI;IACJC,MAAM;IACNC,UAAU;IACVC,mBAAmB;IACnBC,eAAe;AACjB;AAEAV,SAAS,0BAA0B;IACjCE,GAAG,+DAA+D;QAChE,MAAMS,MAAO,MAAM,MAAM,CAAC;QAC1BV,OAAOU,KAAKC,cAAc,CAAC;QAC3B,MAAMC,QAAQ;YACZC,UAAUX,GAAGY,EAAE,GAAGC,iBAAiB,CAAC;gBAAEC,YAAY;gBAASC,SAAS;YAAU;QAChF;QACA,MAAMC,aAAa;YAAEC,QAAQjB,GAAGY,EAAE,GAAGC,iBAAiB,CAACX;QAAM;QAC7D,MAAMgB,SAAS;YAAEC,KAAKnB,GAAGY,EAAE;QAAG;QAC9B,MAAMQ,UAAUZ,IAAIa,sBAAsB;QAC1C,MAAM,IAAID,QAAQ;YAAEJ;YAAYN;YAAOQ;QAAO,GAAGD,MAAM,CAAC;YAAEb,MAAM;YAAYkB,KAAK;QAAW;QAC5FxB,OAAOkB,WAAWC,MAAM,EAAEM,oBAAoB,CAAC;YAC7CnB,MAAM;YACNkB,KAAK;YACLjB,UAAU;QACZ;QACAP,OAAOoB,OAAOC,GAAG,EAAEK,GAAG,CAACC,gBAAgB;IACzC;IAEA1B,GAAG,8DAA8D;QAC/D,MAAMS,MAAO,MAAM,MAAM,CAAC;QAC1B,MAAMQ,aAAa;YACjBU,SAAS1B,GAAGY,EAAE,GAAGC,iBAAiB,CAACX;YACnCyB,YAAY3B,GACTY,EAAE,GACFgB,qBAAqB,CAAC;gBAAEC,OAAO3B;gBAAM4B,OAAO;YAAM,GAClDF,qBAAqB,CAAC;gBACrBC,OAAO;oBAAE,GAAG3B,IAAI;oBAAEI,mBAAmBL;oBAASM,eAAe;gBAAU;gBACvEuB,OAAO;YACT;YACFC,uBAAuB/B,GAAGY,EAAE;YAC5BoB,qBAAqBhC,GAAGY,EAAE;YAC1BqB,aAAajC,GAAGY,EAAE;QACpB;QACA,MAAMM,SAAS;YACbC,KAAKnB,GAAGY,EAAE,GAAGsB,kBAAkB,CAAC,OAAOC;gBACrC,MAAMA,QAAQC,OAAO,CAAC;oBAAEC,KAAK;oBAAIC,WAAW;gBAAQ;gBACpD,MAAMH,QAAQI,SAAS,CAACtC;gBACxB,OAAO;oBAAEuC,WAAWvC;oBAASwC,QAAQ;oBAAUC,UAAU;wBAAC;qBAAS;oBAAEC,UAAU;gBAAE;YACnF;QACF;QACA,MAAMvB,UAAUZ,IAAIa,sBAAsB;QAC1C,MAAMuB,UAAU,IAAIxB,QAAQ;YAC1BJ;YACAN,OAAO;gBAAEC,UAAUX,GAAGY,EAAE;YAAG;YAC3BM;YACAJ,YAAY;QACd;QAEA,MAAM8B,QAAQC,IAAI,CAAC,YAAY;QAC/B,MAAMD,QAAQC,IAAI,CAAC,YAAY;QAE/B/C,OAAOkB,WAAWgB,mBAAmB,EAAEc,uBAAuB,CAAC,GAAG,MAAM,OAAO7C;QAC/EH,OAAOkB,WAAWgB,mBAAmB,EAAEc,uBAAuB,CAAC,GAAG,MAAM,OAAO7C;QAC/EH,OAAOkB,WAAWiB,WAAW,EAAEV,oBAAoB,CACjD,MACA,OACAzB,OAAOiD,gBAAgB,CAAC;YACtBC,QAAQ;YACRzC,eAAe;QACjB;IAEJ;IAEAR,GAAG,qDAAqD;QACtD,MAAMS,MAAO,MAAM,MAAM,CAAC;QAC1B,MAAMyC,YAAYzC,IAAI0C,eAAe;QACrC,MAAMjB,cAAcjC,GAAGY,EAAE;QACzB,MAAMI,aAAa;YACjBU,SAAS1B,GAAGY,EAAE,GAAGC,iBAAiB,CAACX;YACnCyB,YAAY3B,GAAGY,EAAE,GAAGC,iBAAiB,CAAC;gBAAEgB,OAAO3B;gBAAM4B,OAAO;YAAM;YAClEC,uBAAuB/B,GAAGY,EAAE;YAC5BoB,qBAAqBhC,GAAGY,EAAE;YAC1BqB;QACF;QACA,MAAMb,UAAUZ,IAAIa,sBAAsB;QAC1C,MAAMuB,UAAU,IAAIxB,QAAQ;YAC1BJ;YACAN,OAAO;gBAAEC,UAAUX,GAAGY,EAAE;YAAG;YAC3BM,QAAQ;gBACNC,KAAKnB,GAAGY,EAAE,GAAGuC,iBAAiB,CAAC,IAAIF,UAAU,YAAY;YAC3D;QACF;QACA,MAAMnD,OAAO8C,QAAQC,IAAI,CAAC,YAAY,MAAMO,OAAO,CAACC,aAAa,CAAC;YAChEC,MAAM;QACR;QACAxD,OAAOmC,aAAaV,oBAAoB,CACtC,MACA,OACAzB,OAAOiD,gBAAgB,CAAC;YAAExC,eAAe;QAAW;IAExD;IAEAR,GAAG,+DAA+D;QAChE,MAAMS,MAAO,MAAM,MAAM,CAAC;QAC1B,MAAMY,UAAUZ,IAAIa,sBAAsB;QAC1C,MAAML,aAAa;YACjBU,SAAS1B,GAAGY,EAAE,GAAGC,iBAAiB,CAAC;gBAAE,GAAGX,IAAI;gBAAEG,UAAU;YAAS;YACjEsB,YAAY3B,GAAGY,EAAE;YACjBmB,uBAAuB/B,GAAGY,EAAE;YAC5BoB,qBAAqBhC,GAAGY,EAAE;YAC1BqB,aAAajC,GAAGY,EAAE;QACpB;QAEA,MAAMd,OACJ,IAAIsB,QAAQ;YAAEJ;YAAYN,OAAO;gBAAEC,UAAUX,GAAGY,EAAE;YAAG;YAAGM,QAAQ;gBAAEC,KAAKnB,GAAGY,EAAE;YAAG;QAAE,GAAGiC,IAAI,CACtF,YACA,MAEFO,OAAO,CAACC,aAAa,CAAC;YAAEC,MAAM;QAAoB;QACpDxD,OAAOkB,WAAWW,UAAU,EAAEH,GAAG,CAACC,gBAAgB;QAClD3B,OAAOkB,WAAWiB,WAAW,EAAET,GAAG,CAACC,gBAAgB;IACrD;IAEA1B,GAAG,gFAAgF;QACjF,MAAMS,MAAO,MAAM,MAAM,CAAC;QAC1B,MAAMY,UAAUZ,IAAIa,sBAAsB;QAC1C,MAAMkC,oBAAoB,IAAIC,MAAM;QACpC,MAAMxC,aAAa;YACjBU,SAAS1B,GAAGY,EAAE,GAAGC,iBAAiB,CAACX;YACnCyB,YAAY3B,GAAGY,EAAE,GAAGC,iBAAiB,CAAC;gBAAEgB,OAAO3B;gBAAM4B,OAAO;YAAM;YAClEC,uBAAuB/B,GAAGY,EAAE;YAC5BoB,qBAAqBhC,GAAGY,EAAE;YAC1BqB,aAAajC,GAAGY,EAAE,GAAGuC,iBAAiB,CAACI;QACzC;QACA,MAAMrC,SAAS;YACbC,KAAKnB,GAAGY,EAAE,GAAGC,iBAAiB,CAAC;gBAC7B2B,WAAWvC;gBACXwC,QAAQ;gBACRC,UAAU;oBAAC;iBAAS;gBACpBC,UAAU;YACZ;QACF;QAEA,MAAM7C,OACJ,IAAIsB,QAAQ;YAAEJ;YAAYN,OAAO;gBAAEC,UAAUX,GAAGY,EAAE;YAAG;YAAGM;QAAO,GAAG2B,IAAI,CAAC,YAAY,MACnFO,OAAO,CAACK,IAAI,CAACF;QACfzD,OAAOkB,WAAWiB,WAAW,EAAEyB,oBAAoB;IACrD;IAEA3D,GAAG,+DAA+D;QAChE,MAAMS,MAAO,MAAM,MAAM,CAAC;QAC1B,MAAMmD,eAAenD,IAAI0C,eAAe;QACxC,MAAMjB,cAAcjC,GAAGY,EAAE;QACzB,MAAMI,aAAa;YACjBU,SAAS1B,GAAGY,EAAE,GAAGC,iBAAiB,CAACX;YACnCyB,YAAY3B,GAAGY,EAAE,GAAGC,iBAAiB,CAAC;gBAAEgB,OAAO3B;gBAAM4B,OAAO;YAAM;YAClEC,uBAAuB/B,GAAGY,EAAE;YAC5BoB,qBAAqBhC,GAClBY,EAAE,GACFuC,iBAAiB,CAAC,IAAIQ,aAAa,oBAAoB;YAC1D1B;QACF;QACA,MAAMf,SAAS;YACbC,KAAKnB,GAAGY,EAAE,GAAGsB,kBAAkB,CAAC,OAAOC;gBACrC,MAAMA,QAAQI,SAAS,CAACtC;gBACxB,OAAO;oBAAEuC,WAAWvC;oBAASwC,QAAQ;oBAAKC,UAAU;wBAAC;qBAAI;oBAAEC,UAAU;gBAAE;YACzE;QACF;QACA,MAAMvB,UAAUZ,IAAIa,sBAAsB;QAE1C,MAAMvB,OACJ,IAAIsB,QAAQ;YAAEJ;YAAYN,OAAO;gBAAEC,UAAUX,GAAGY,EAAE;YAAG;YAAGM;QAAO,GAAG2B,IAAI,CAAC,YAAY,MACnFO,OAAO,CAACC,aAAa,CAAC;YAAEC,MAAM;QAAyB;QACzDxD,OAAOmC,aAAaV,oBAAoB,CACtC,MACA,OACAzB,OAAOiD,gBAAgB,CAAC;YAAExC,eAAe;QAAW;IAExD;IAEAR,GAAG,gEAAgE;QACjE,MAAMS,MAAO,MAAM,MAAM,CAAC;QAC1B,MAAMY,UAAUZ,IAAIa,sBAAsB;QAC1C,MAAML,aAAa;YACjBC,QAAQjB,GAAGY,EAAE;YACbc,SAAS1B,GAAGY,EAAE,GAAGgB,qBAAqB,CAAC,MAAMA,qBAAqB,CAAC;gBAAC1B;gBAAMA;aAAK;YAC/EyB,YAAY3B,GAAGY,EAAE;YACjBmB,uBAAuB/B,GAAGY,EAAE;YAC5BoB,qBAAqBhC,GAAGY,EAAE;YAC1BqB,aAAajC,GAAGY,EAAE;QACpB;QACA,MAAMgC,UAAU,IAAIxB,QAAQ;YAC1BJ;YACAN,OAAO;gBAAEC,UAAUX,GAAGY,EAAE;YAAG;YAC3BM,QAAQ;gBAAEC,KAAKnB,GAAGY,EAAE;YAAG;QACzB;QACA,MAAMd,OAAO8C,QAAQC,IAAI,CAAC,WAAW,MAAMO,OAAO,CAACC,aAAa,CAAC;YAC/DC,MAAM;QACR;QACA,MAAMxD,OAAO8C,QAAQC,IAAI,CAAC,aAAa,MAAMO,OAAO,CAACC,aAAa,CAAC;YACjEC,MAAM;QACR;QACAxD,OAAOkB,WAAWW,UAAU,EAAEH,GAAG,CAACC,gBAAgB;IACpD;AACF"}
@@ -84,7 +84,7 @@ function events(session = SESSION) {
84
84
  ];
85
85
  }
86
86
  async function runner(fixture, maxLineBytes) {
87
- const api = await import("../../index.js");
87
+ const api = await import("../../../../index.js");
88
88
  expect(api).toHaveProperty("CodexPrintRunner");
89
89
  const Runner = api.CodexPrintRunner;
90
90
  return new Runner({
@@ -99,11 +99,6 @@ async function runner(fixture, maxLineBytes) {
99
99
  });
100
100
  }
101
101
  describe("CodexPrintRunner", ()=>{
102
- it("constructs default process dependencies without spawning", async ()=>{
103
- const api = await import("../../index.js");
104
- const Runner = api.CodexPrintRunner;
105
- expect(new Runner()).toBeDefined();
106
- });
107
102
  it("binds an initial thread before returning ordered assistant output", async ()=>{
108
103
  const fixture = fakeSpawn(events(), 0, true);
109
104
  const instance = await runner(fixture);
@@ -349,7 +344,7 @@ describe("CodexPrintRunner", ()=>{
349
344
  expect(spawnFailure.child.kill).toHaveBeenCalledOnce();
350
345
  });
351
346
  it("rejects an unverifiable positive PID", async ()=>{
352
- const api = await import("../../index.js");
347
+ const api = await import("../../../../index.js");
353
348
  const fixture = fakeSpawn([]);
354
349
  const Runner = api.CodexPrintRunner;
355
350
  const instance = new Runner({
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../src/__tests__/harnesses/codex/durable/CodexPrintRunner.test.ts"],"sourcesContent":["import { EventEmitter } from \"node:events\";\nimport { PassThrough, Writable } from \"node:stream\";\nimport { describe, expect, it, vi } from \"vitest\";\nimport type { CodexDurableAgent } from \"../../../../index.js\";\n\nconst SESSION = \"22222222-2222-4222-8222-222222222222\";\n\nfunction agent(providerSessionId: string | null = null): CodexDurableAgent {\n return {\n id: \"11111111-1111-4111-8111-111111111111\",\n name: \"reviewer\",\n provider: \"codex\",\n mode: \"durable\",\n cwd: \"/project\",\n providerSessionId,\n state: \"running\",\n sessionHealth: \"uninitialized\",\n createdAt: \"\",\n updatedAt: \"\",\n lastActiveAt: null,\n lastResult: null,\n activeRun: null,\n };\n}\n\nfunction fakeSpawn(lines: string[], exitCode = 0, chunks = false) {\n const promptChunks: Buffer[] = [];\n const child = new EventEmitter() as any;\n child.pid = 4242;\n child.stdout = new PassThrough();\n child.stderr = new PassThrough();\n child.kill = vi.fn();\n child.stdin = new Writable({\n write(chunk, _encoding, callback) {\n promptChunks.push(Buffer.from(chunk));\n callback();\n },\n final(callback) {\n const output = lines.join(\"\\n\");\n if (chunks) {\n const bytes = Buffer.from(output);\n child.stdout.write(bytes.subarray(0, 7));\n child.stdout.write(bytes.subarray(7));\n } else child.stdout.write(output);\n child.stdout.end();\n queueMicrotask(() => child.emit(\"close\", exitCode, null));\n callback();\n },\n });\n const spawn = vi.fn(() => child);\n return { child, spawn, promptChunks };\n}\n\nfunction events(session = SESSION): string[] {\n return [\n JSON.stringify({ type: \"thread.started\", thread_id: session }),\n JSON.stringify({ type: \"turn.started\" }),\n JSON.stringify({ type: \"future.event\", anything: true }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"first\" } }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"final\" } }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ];\n}\n\nasync function runner(fixture: ReturnType<typeof fakeSpawn>, maxLineBytes?: number) {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n expect(api).toHaveProperty(\"CodexPrintRunner\");\n const Runner = api.CodexPrintRunner as new (options: unknown) => any;\n return new Runner({\n spawn: fixture.spawn,\n maxLineBytes,\n processInspector: {\n getIdentity: () => ({ pid: 4242, startedAt: \"provider-start\" }),\n },\n });\n}\n\ndescribe(\"CodexPrintRunner\", () => {\n it(\"binds an initial thread before returning ordered assistant output\", async () => {\n const fixture = fakeSpawn(events(), 0, true);\n const instance = await runner(fixture);\n const order: string[] = [];\n const result = await instance.run({\n agent: agent(),\n prompt: \"secret prompt\",\n executable: \"fake-codex\",\n onSpawn: async () => {\n expect(fixture.promptChunks).toHaveLength(0);\n order.push(\"spawn\");\n },\n onSession: async (id: string) => {\n expect(id).toBe(SESSION);\n order.push(\"session\");\n },\n });\n\n expect(order).toEqual([\"spawn\", \"session\"]);\n expect(fixture.spawn).toHaveBeenCalledWith(\n \"fake-codex\",\n [\"exec\", \"--json\", \"-\"],\n expect.objectContaining({\n cwd: \"/project\",\n shell: false,\n stdio: [\"pipe\", \"pipe\", \"pipe\"],\n }),\n );\n expect(JSON.stringify(fixture.spawn.mock.calls)).not.toContain(\"secret prompt\");\n expect(Buffer.concat(fixture.promptChunks).toString()).toBe(\"secret prompt\");\n expect(result).toEqual({\n sessionId: SESSION,\n result: \"final\",\n messages: [\"first\", \"final\"],\n exitCode: 0,\n });\n });\n\n it(\"resumes the exact stored UUID and rejects a mismatch\", async () => {\n const mismatch = \"33333333-3333-4333-8333-333333333333\";\n const fixture = fakeSpawn(events(mismatch));\n const instance = await runner(fixture);\n await expect(\n instance.run({\n agent: agent(SESSION),\n prompt: \"later\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_SESSION_MISMATCH\" });\n expect(fixture.spawn.mock.calls[0]![1]).toEqual([\"exec\", \"resume\", \"--json\", SESSION, \"-\"]);\n });\n\n it.each([\n [\"malformed JSON\", [\"{bad\\n\"], \"CODEX_PROTOCOL\"],\n [\"non-object JSON\", [\"[]\\n\"], \"CODEX_PROTOCOL\"],\n [\"truncated JSON\", [\"{}\"], \"CODEX_PROTOCOL\"],\n [\n \"missing thread\",\n [\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"x\" } }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ],\n \"CODEX_PROTOCOL\",\n ],\n [\n \"missing assistant\",\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"turn.completed\" }),\n \"\",\n ],\n \"CODEX_RESULT_MISSING\",\n ],\n [\n \"missing completion\",\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"item.completed\", item: { type: \"agent_message\", text: \"x\" } }),\n \"\",\n ],\n \"CODEX_PROTOCOL\",\n ],\n ])(\"rejects %s\", async (_name, lines, code) => {\n const fixture = fakeSpawn(lines as string[]);\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code });\n });\n\n it(\"rejects oversized output, non-zero exit, and missing process identity without leaking stderr\", async () => {\n const oversized = fakeSpawn([`${\"x\".repeat(20)}\\n`]);\n await expect(\n (await runner(oversized, 10)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n const oversizedWithoutNewline = fakeSpawn([\"x\".repeat(20)]);\n await expect(\n (await runner(oversizedWithoutNewline, 10)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n\n const failed = fakeSpawn(events(), 1);\n failed.child.stderr.end(\"secret-looking provider diagnostic\");\n await expect(\n (await runner(failed)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n\n const missing = fakeSpawn([]);\n missing.child.pid = undefined;\n await expect(\n (await runner(missing)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n });\n\n it(\"rejects invalid or duplicate thread identities\", async () => {\n for (const lines of [\n [JSON.stringify({ type: \"thread.started\", thread_id: \"bad\" }), \"\"],\n [\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n JSON.stringify({ type: \"thread.started\", thread_id: SESSION }),\n \"\",\n ],\n ]) {\n const fixture = fakeSpawn(lines);\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n }\n });\n\n it(\"classifies callback processing failure and kills when spawn persistence fails\", async () => {\n const callbackFailure = fakeSpawn(events());\n await expect(\n (await runner(callbackFailure)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn().mockRejectedValue(new Error(\"storage unavailable\")),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROTOCOL\" });\n\n const spawnFailure = fakeSpawn([]);\n const failure = new Error(\"cannot persist process\");\n await expect(\n (await runner(spawnFailure)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn().mockRejectedValue(failure),\n onSession: vi.fn(),\n }),\n ).rejects.toBe(failure);\n expect(spawnFailure.child.kill).toHaveBeenCalledOnce();\n });\n\n it(\"rejects an unverifiable positive PID\", async () => {\n const api = (await import(\"../../../../index.js\")) as Record<string, unknown>;\n const fixture = fakeSpawn([]);\n const Runner = api.CodexPrintRunner as new (options: unknown) => any;\n const instance = new Runner({\n spawn: fixture.spawn,\n processInspector: { getIdentity: () => null },\n });\n await expect(\n instance.run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n expect(fixture.child.kill).toHaveBeenCalledOnce();\n });\n\n it(\"classifies a child spawn error as a process failure\", async () => {\n const fixture = fakeSpawn([]);\n fixture.child.stdin = new Writable({\n write(_chunk, _encoding, callback) {\n callback();\n },\n final(callback) {\n queueMicrotask(() => fixture.child.emit(\"error\", new Error(\"spawn failed\")));\n callback();\n },\n });\n await expect(\n (await runner(fixture)).run({\n agent: agent(),\n prompt: \"x\",\n onSpawn: vi.fn(),\n onSession: vi.fn(),\n }),\n ).rejects.toMatchObject({ code: \"CODEX_PROCESS\" });\n });\n});\n"],"names":["EventEmitter","PassThrough","Writable","describe","expect","it","vi","SESSION","agent","providerSessionId","id","name","provider","mode","cwd","state","sessionHealth","createdAt","updatedAt","lastActiveAt","lastResult","activeRun","fakeSpawn","lines","exitCode","chunks","promptChunks","child","pid","stdout","stderr","kill","fn","stdin","write","chunk","_encoding","callback","push","Buffer","from","final","output","join","bytes","subarray","end","queueMicrotask","emit","spawn","events","session","JSON","stringify","type","thread_id","anything","item","text","runner","fixture","maxLineBytes","api","toHaveProperty","Runner","CodexPrintRunner","processInspector","getIdentity","startedAt","instance","order","result","run","prompt","executable","onSpawn","toHaveLength","onSession","toBe","toEqual","toHaveBeenCalledWith","objectContaining","shell","stdio","mock","calls","not","toContain","concat","toString","sessionId","messages","mismatch","rejects","toMatchObject","code","each","_name","oversized","repeat","oversizedWithoutNewline","failed","missing","undefined","callbackFailure","mockRejectedValue","Error","spawnFailure","failure","toHaveBeenCalledOnce","_chunk"],"mappings":"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"}
@@ -3,7 +3,7 @@
3
3
  */ import * as fs from "fs";
4
4
  import * as os from "os";
5
5
  import * as path from "path";
6
- import { CopilotAdapter } from "../../../providers/copilot/CopilotAdapter.js";
6
+ import { CopilotAdapter } from "../../../harnesses/copilot/CopilotAdapter.js";
7
7
  import { AgentStatus } from "../../../adapters/AgentAdapter.js";
8
8
  import { listAgentProcesses, enrichProcesses, captureProcessSnapshot } from "../../../utils/process.js";
9
9
  import { generateAgentName } from "../../../utils/matching.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/__tests__/providers/copilot/CopilotAdapter.test.ts"],"sourcesContent":["/**\n * Tests for CopilotAdapter\n */\n\nimport type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { CopilotAdapter } from \"../../../providers/copilot/CopilotAdapter.js\";\nimport type { ProcessInfo } from \"../../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../../adapters/AgentAdapter.js\";\nimport {\n listAgentProcesses,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"../../../utils/process.js\";\nimport { generateAgentName } from \"../../../utils/matching.js\";\nimport { AgentRegistry } from \"../../../utils/AgentRegistry.js\";\n\nvi.mock(\"../../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../../utils/matching.js\", () => ({\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"CopilotAdapter\", () => {\n let adapter: CopilotAdapter;\n let tmpDir: string;\n let sessionStateDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"copilot-test-\"));\n sessionStateDir = path.join(tmpDir, \"session-state\");\n fs.mkdirSync(sessionStateDir, { recursive: true });\n adapter = new CopilotAdapter(undefined, { sessionStateDir });\n\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedGenerateAgentName.mockReset();\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (cwd, pid) => `${path.basename(cwd) || \"unknown\"} (${pid})`,\n );\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeSession(\n sessionId: string,\n options: {\n events?: Array<object | string>;\n workspace?: Record<string, string>;\n lockPid?: number | string;\n },\n ): string {\n const sessionDir = path.join(sessionStateDir, sessionId);\n fs.mkdirSync(sessionDir, { recursive: true });\n\n if (options.events) {\n const lines = options.events.map((entry) =>\n typeof entry === \"string\" ? entry : JSON.stringify(entry),\n );\n fs.writeFileSync(path.join(sessionDir, \"events.jsonl\"), lines.join(\"\\n\"));\n }\n\n if (options.workspace) {\n const lines = Object.entries(options.workspace).map(([key, value]) => `${key}: ${value}`);\n fs.writeFileSync(path.join(sessionDir, \"workspace.yaml\"), lines.join(\"\\n\"));\n }\n\n if (options.lockPid !== undefined) {\n fs.writeFileSync(path.join(sessionDir, `inuse.${options.lockPid}.lock`), \"\");\n }\n\n return sessionDir;\n }\n\n function sessionStart(\n sessionId: string,\n cwd: string,\n startTime = \"2026-06-09T09:50:00.000Z\",\n ): object {\n return {\n type: \"session.start\",\n data: {\n sessionId,\n startTime,\n context: {\n cwd,\n gitRoot: cwd,\n branch: \"main\",\n },\n },\n timestamp: startTime,\n };\n }\n\n describe(\"initialization\", () => {\n it(\"exposes copilot type\", () => {\n expect(adapter.type).toBe(\"copilot\");\n });\n });\n\n describe(\"canHandle\", () => {\n it(\"returns true for copilot commands\", () => {\n expect(adapter.canHandle({ pid: 1, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n });\n\n it(\"returns true for full-path Homebrew copilot commands\", () => {\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n });\n\n it(\"returns true for copilot.exe commands\", () => {\n expect(\n adapter.canHandle({\n pid: 3,\n command: \"/usr/bin/copilot.exe\",\n cwd: \"/repo\",\n tty: \"ttys003\",\n }),\n ).toBe(true);\n });\n\n it(\"returns false when copilot appears only in an argument\", () => {\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /repo/copilot-plugin/index.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n });\n });\n\n describe(\"detectAgents\", () => {\n it(\"returns empty list when no copilot process is running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"copilot\");\n });\n\n it(\"maps matching inuse lock and events to an active agent\", async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-a\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-a\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"Build the Copilot adapter\" },\n timestamp: new Date().toISOString(),\n },\n {\n type: \"assistant.message\",\n data: { content: \"I will inspect the code.\" },\n timestamp: new Date().toISOString(),\n },\n ],\n workspace: {\n id: \"sess-a\",\n cwd: \"/fallback\",\n name: \"Fallback Name\",\n created_at: \"2026-06-09T09:49:00.000Z\",\n updated_at: \"2026-06-09T09:51:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.WAITING,\n pid: 14096,\n projectPath: \"/repo\",\n sessionId: \"sess-a\",\n summary: \"Build the Copilot adapter\",\n sessionFilePath: path.join(sessionStateDir, \"sess-a\", \"events.jsonl\"),\n });\n });\n\n it(\"ignores invalid and unmatched lock PIDs\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"invalid\", {\n lockPid: \"not-a-pid\",\n events: [sessionStart(\"invalid\", \"/invalid\")],\n });\n writeSession(\"unmatched\", {\n lockPid: 999999,\n events: [sessionStart(\"unmatched\", \"/unmatched\")],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 100,\n sessionId: \"pid-100\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"falls back to process-only agent when no session lock matches\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 200, command: \"copilot\", cwd: \"/repo-b\", tty: \"ttys002\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.RUNNING,\n pid: 200,\n projectPath: \"/repo-b\",\n sessionId: \"pid-200\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"suppresses wrapper process-only agents before the session lock exists\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 86810,\n sessionId: \"pid-86810\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"carries the managed wrapper name to a process-only child before the session lock exists\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 86800,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-86800\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 86810,\n sessionId: \"pid-86810\",\n });\n });\n\n it(\"does not add duplicate process-only agent for wrapper process in the same terminal\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"carries the managed wrapper name to a lock-backed child process\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 14095,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 14095,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-14095\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"uses workspace metadata when events are missing\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 300, command: \"copilot\", cwd: \"/proc-cwd\", tty: \"ttys003\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"workspace-only\", {\n lockPid: 300,\n workspace: {\n id: \"workspace-only\",\n cwd: \"/workspace-cwd\",\n name: \"Workspace Session\",\n created_at: \"2026-06-09T09:00:00.000Z\",\n updated_at: \"2026-06-09T09:10:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 300,\n projectPath: \"/workspace-cwd\",\n sessionId: \"workspace-only\",\n summary: \"Workspace Session\",\n });\n });\n });\n\n describe(\"getConversation\", () => {\n it(\"parses user and assistant message events\", () => {\n const sessionDir = writeSession(\"conv\", {\n events: [\n sessionStart(\"conv\", \"/repo\"),\n {\n type: \"user.message\",\n data: { content: \"hello\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"Hi there\" },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"hello\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"assistant\", content: \"Hi there\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"includes system/info/warning messages only in verbose mode\", () => {\n const sessionDir = writeSession(\"verbose\", {\n events: [\n {\n type: \"session.warning\",\n data: { message: \"MCP failed\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"tool.execution_complete\",\n data: { result: { content: \"Tool result\" } },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n const filePath = path.join(sessionDir, \"events.jsonl\");\n\n expect(adapter.getConversation(filePath)).toEqual([]);\n expect(adapter.getConversation(filePath, { verbose: true })).toEqual([\n { role: \"system\", content: \"MCP failed\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"system\", content: \"Tool result\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"skips malformed JSONL lines and missing text\", () => {\n const sessionDir = writeSession(\"malformed\", {\n events: [\n \"not json\",\n {\n type: \"user.message\",\n data: { content: \"valid\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n { type: \"assistant.message\", data: {}, timestamp: \"2026-06-09T09:50:02.000Z\" },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"valid\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n ]);\n });\n\n it(\"returns empty array for missing file\", () => {\n expect(adapter.getConversation(path.join(tmpDir, \"missing.jsonl\"))).toEqual([]);\n });\n });\n\n describe(\"listSessions\", () => {\n it(\"returns historical sessions without active locks\", async () => {\n writeSession(\"history-a\", {\n events: [\n sessionStart(\"history-a\", \"/repo-a\", \"2026-06-09T09:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"first user\" },\n timestamp: \"2026-06-09T09:00:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"answer\" },\n timestamp: \"2026-06-09T09:00:02.000Z\",\n },\n ],\n });\n writeSession(\"history-b\", {\n events: [\n sessionStart(\"history-b\", \"/repo-b\", \"2026-06-09T10:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"other user\" },\n timestamp: \"2026-06-09T10:00:01.000Z\",\n },\n ],\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(2);\n const byId = Object.fromEntries(sessions.map((session) => [session.sessionId, session]));\n expect(byId[\"history-a\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-a\",\n firstUserMessage: \"first user\",\n sessionFilePath: path.join(sessionStateDir, \"history-a\", \"events.jsonl\"),\n });\n expect(byId[\"history-b\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-b\",\n firstUserMessage: \"other user\",\n });\n });\n\n it(\"finds an exact session ID from its session directory\", async () => {\n writeSession(\"wanted\", { events: [sessionStart(\"wanted\", \"/repo\")] });\n writeSession(\"other\", { events: [sessionStart(\"other\", \"/other\")] });\n\n await expect(adapter.findSessionsById(\"wanted\")).resolves.toEqual([\n expect.objectContaining({\n sessionId: \"wanted\",\n sessionFilePath: path.join(sessionStateDir, \"wanted\", \"events.jsonl\"),\n }),\n ]);\n });\n\n it(\"applies strict cwd filter\", async () => {\n writeSession(\"keep\", { events: [sessionStart(\"keep\", \"/repo\")] });\n writeSession(\"drop\", { events: [sessionStart(\"drop\", \"/other\")] });\n\n const sessions = await adapter.listSessions({ cwd: \"/repo\" });\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0].sessionId).toBe(\"keep\");\n });\n\n it(\"uses workspace fallback for historical sessions without events\", async () => {\n writeSession(\"workspace-history\", {\n workspace: {\n id: \"workspace-history\",\n cwd: \"/workspace-repo\",\n name: \"Workspace History\",\n created_at: \"2026-06-09T08:00:00.000Z\",\n updated_at: \"2026-06-09T08:10:00.000Z\",\n },\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0]).toMatchObject({\n type: \"copilot\",\n sessionId: \"workspace-history\",\n cwd: \"/workspace-repo\",\n firstUserMessage: \"\",\n sessionFilePath: path.join(sessionStateDir, \"workspace-history\", \"events.jsonl\"),\n });\n });\n\n it(\"skips session directories without events or workspace metadata\", async () => {\n fs.mkdirSync(path.join(sessionStateDir, \"empty\"), { recursive: true });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toEqual([]);\n });\n\n it(\"returns empty when session-state directory does not exist\", async () => {\n adapter = new CopilotAdapter(undefined, { sessionStateDir: path.join(tmpDir, \"missing\") });\n\n await expect(adapter.listSessions()).resolves.toEqual([]);\n });\n });\n});\n"],"names":["fs","os","path","CopilotAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","generateAgentName","AgentRegistry","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedGenerateAgentName","describe","adapter","tmpDir","sessionStateDir","beforeEach","mkdtempSync","join","tmpdir","mkdirSync","recursive","undefined","mockReset","mockImplementation","procs","names","flatMap","name","cwd","pid","basename","afterEach","rmSync","force","writeSession","sessionId","options","sessionDir","events","lines","map","entry","JSON","stringify","writeFileSync","workspace","Object","entries","key","value","lockPid","sessionStart","startTime","type","data","context","gitRoot","branch","timestamp","it","expect","toBe","canHandle","command","tty","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","content","Date","toISOString","id","created_at","updated_at","toHaveLength","toMatchObject","status","WAITING","projectPath","summary","sessionFilePath","RUNNING","ppid","registry","register","runtime","runtimeRef","session","startedAt","messages","getConversation","role","message","result","filePath","verbose","sessions","listSessions","byId","fromEntries","firstUserMessage","findSessionsById","resolves","objectContaining"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/__tests__/harnesses/copilot/CopilotAdapter.test.ts"],"sourcesContent":["/**\n * Tests for CopilotAdapter\n */\n\nimport type { MockedFunction } from \"vitest\";\nimport * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\n\nimport { CopilotAdapter } from \"../../../harnesses/copilot/CopilotAdapter.js\";\nimport type { ProcessInfo } from \"../../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../../adapters/AgentAdapter.js\";\nimport {\n listAgentProcesses,\n enrichProcesses,\n captureProcessSnapshot,\n} from \"../../../utils/process.js\";\nimport { generateAgentName } from \"../../../utils/matching.js\";\nimport { AgentRegistry } from \"../../../utils/AgentRegistry.js\";\n\nvi.mock(\"../../../utils/process.js\", async (importOriginal) => {\n const actual = (await importOriginal()) as typeof import(\"../../../utils/process.js\");\n return {\n ...actual,\n listAgentProcesses: vi.fn(),\n enrichProcesses: vi.fn(),\n captureProcessSnapshot: vi.fn(),\n };\n});\n\nvi.mock(\"../../../utils/matching.js\", () => ({\n generateAgentName: vi.fn(),\n}));\n\nconst mockedListAgentProcesses = listAgentProcesses as MockedFunction<typeof listAgentProcesses>;\nconst mockedEnrichProcesses = enrichProcesses as MockedFunction<typeof enrichProcesses>;\nconst mockedCaptureProcessSnapshot = captureProcessSnapshot as MockedFunction<\n typeof captureProcessSnapshot\n>;\nconst mockedGenerateAgentName = generateAgentName as MockedFunction<typeof generateAgentName>;\n\ndescribe(\"CopilotAdapter\", () => {\n let adapter: CopilotAdapter;\n let tmpDir: string;\n let sessionStateDir: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"copilot-test-\"));\n sessionStateDir = path.join(tmpDir, \"session-state\");\n fs.mkdirSync(sessionStateDir, { recursive: true });\n adapter = new CopilotAdapter(undefined, { sessionStateDir });\n\n mockedListAgentProcesses.mockReset();\n mockedEnrichProcesses.mockReset();\n mockedCaptureProcessSnapshot.mockReset();\n mockedGenerateAgentName.mockReset();\n mockedEnrichProcesses.mockImplementation((procs) => procs);\n // Compatibility shim for standalone adapter discovery; the manager captures once and slices by name.\n mockedCaptureProcessSnapshot.mockImplementation(async (names) =>\n enrichProcesses(names.flatMap((name) => listAgentProcesses(name))),\n );\n mockedGenerateAgentName.mockImplementation(\n (cwd, pid) => `${path.basename(cwd) || \"unknown\"} (${pid})`,\n );\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function writeSession(\n sessionId: string,\n options: {\n events?: Array<object | string>;\n workspace?: Record<string, string>;\n lockPid?: number | string;\n },\n ): string {\n const sessionDir = path.join(sessionStateDir, sessionId);\n fs.mkdirSync(sessionDir, { recursive: true });\n\n if (options.events) {\n const lines = options.events.map((entry) =>\n typeof entry === \"string\" ? entry : JSON.stringify(entry),\n );\n fs.writeFileSync(path.join(sessionDir, \"events.jsonl\"), lines.join(\"\\n\"));\n }\n\n if (options.workspace) {\n const lines = Object.entries(options.workspace).map(([key, value]) => `${key}: ${value}`);\n fs.writeFileSync(path.join(sessionDir, \"workspace.yaml\"), lines.join(\"\\n\"));\n }\n\n if (options.lockPid !== undefined) {\n fs.writeFileSync(path.join(sessionDir, `inuse.${options.lockPid}.lock`), \"\");\n }\n\n return sessionDir;\n }\n\n function sessionStart(\n sessionId: string,\n cwd: string,\n startTime = \"2026-06-09T09:50:00.000Z\",\n ): object {\n return {\n type: \"session.start\",\n data: {\n sessionId,\n startTime,\n context: {\n cwd,\n gitRoot: cwd,\n branch: \"main\",\n },\n },\n timestamp: startTime,\n };\n }\n\n describe(\"initialization\", () => {\n it(\"exposes copilot type\", () => {\n expect(adapter.type).toBe(\"copilot\");\n });\n });\n\n describe(\"canHandle\", () => {\n it(\"returns true for copilot commands\", () => {\n expect(adapter.canHandle({ pid: 1, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" })).toBe(\n true,\n );\n });\n\n it(\"returns true for full-path Homebrew copilot commands\", () => {\n expect(\n adapter.canHandle({\n pid: 2,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys002\",\n }),\n ).toBe(true);\n });\n\n it(\"returns true for copilot.exe commands\", () => {\n expect(\n adapter.canHandle({\n pid: 3,\n command: \"/usr/bin/copilot.exe\",\n cwd: \"/repo\",\n tty: \"ttys003\",\n }),\n ).toBe(true);\n });\n\n it(\"returns false when copilot appears only in an argument\", () => {\n expect(\n adapter.canHandle({\n pid: 4,\n command: \"node /repo/copilot-plugin/index.js\",\n cwd: \"/repo\",\n tty: \"ttys004\",\n }),\n ).toBe(false);\n });\n });\n\n describe(\"detectAgents\", () => {\n it(\"returns empty list when no copilot process is running\", async () => {\n mockedListAgentProcesses.mockReturnValue([]);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toEqual([]);\n expect(mockedListAgentProcesses).toHaveBeenCalledWith(\"copilot\");\n });\n\n it(\"maps matching inuse lock and events to an active agent\", async () => {\n const processes: ProcessInfo[] = [\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-a\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-a\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"Build the Copilot adapter\" },\n timestamp: new Date().toISOString(),\n },\n {\n type: \"assistant.message\",\n data: { content: \"I will inspect the code.\" },\n timestamp: new Date().toISOString(),\n },\n ],\n workspace: {\n id: \"sess-a\",\n cwd: \"/fallback\",\n name: \"Fallback Name\",\n created_at: \"2026-06-09T09:49:00.000Z\",\n updated_at: \"2026-06-09T09:51:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.WAITING,\n pid: 14096,\n projectPath: \"/repo\",\n sessionId: \"sess-a\",\n summary: \"Build the Copilot adapter\",\n sessionFilePath: path.join(sessionStateDir, \"sess-a\", \"events.jsonl\"),\n });\n });\n\n it(\"ignores invalid and unmatched lock PIDs\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 100, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"invalid\", {\n lockPid: \"not-a-pid\",\n events: [sessionStart(\"invalid\", \"/invalid\")],\n });\n writeSession(\"unmatched\", {\n lockPid: 999999,\n events: [sessionStart(\"unmatched\", \"/unmatched\")],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 100,\n sessionId: \"pid-100\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"falls back to process-only agent when no session lock matches\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 200, command: \"copilot\", cwd: \"/repo-b\", tty: \"ttys002\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n type: \"copilot\",\n status: AgentStatus.RUNNING,\n pid: 200,\n projectPath: \"/repo-b\",\n sessionId: \"pid-200\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"suppresses wrapper process-only agents before the session lock exists\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 86810,\n sessionId: \"pid-86810\",\n summary: \"Copilot process running\",\n });\n });\n\n it(\"carries the managed wrapper name to a process-only child before the session lock exists\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 86800, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 86810,\n command: \"/custom/install/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 86800,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 86800,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-86800\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 86810,\n sessionId: \"pid-86810\",\n });\n });\n\n it(\"does not add duplicate process-only agent for wrapper process in the same terminal\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\" },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"carries the managed wrapper name to a lock-backed child process\", async () => {\n const registry = new AgentRegistry(path.join(tmpDir, \"agents.json\"));\n adapter = new CopilotAdapter(registry, { sessionStateDir });\n const processes: ProcessInfo[] = [\n { pid: 14095, command: \"copilot\", cwd: \"/repo\", tty: \"ttys001\", ppid: 84174 },\n {\n pid: 14096,\n command: \"/opt/homebrew/Caskroom/copilot-cli/1.0.60/copilot\",\n cwd: \"/repo\",\n tty: \"ttys001\",\n ppid: 14095,\n },\n ];\n registry.register({\n name: \"copilot-started\",\n type: \"copilot\",\n pid: 14095,\n runtime: \"tmux\",\n runtimeRef: { session: \"copilot-started\" },\n cwd: \"/repo\",\n startedAt: \"2026-06-13T19:15:16.211Z\",\n sessionId: \"pid-14095\",\n sessionFilePath: \"\",\n });\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"sess-wrapper\", {\n lockPid: 14096,\n events: [\n sessionStart(\"sess-wrapper\", \"/repo\", \"2026-06-09T09:50:00.000Z\"),\n { type: \"user.message\", data: { content: \"hello\" }, timestamp: new Date().toISOString() },\n ],\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n name: \"copilot-started\",\n pid: 14096,\n sessionId: \"sess-wrapper\",\n });\n });\n\n it(\"uses workspace metadata when events are missing\", async () => {\n const processes: ProcessInfo[] = [\n { pid: 300, command: \"copilot\", cwd: \"/proc-cwd\", tty: \"ttys003\" },\n ];\n mockedListAgentProcesses.mockReturnValue(processes);\n mockedEnrichProcesses.mockReturnValue(processes);\n writeSession(\"workspace-only\", {\n lockPid: 300,\n workspace: {\n id: \"workspace-only\",\n cwd: \"/workspace-cwd\",\n name: \"Workspace Session\",\n created_at: \"2026-06-09T09:00:00.000Z\",\n updated_at: \"2026-06-09T09:10:00.000Z\",\n },\n });\n\n const agents = await adapter.detectAgents();\n\n expect(agents).toHaveLength(1);\n expect(agents[0]).toMatchObject({\n pid: 300,\n projectPath: \"/workspace-cwd\",\n sessionId: \"workspace-only\",\n summary: \"Workspace Session\",\n });\n });\n });\n\n describe(\"getConversation\", () => {\n it(\"parses user and assistant message events\", () => {\n const sessionDir = writeSession(\"conv\", {\n events: [\n sessionStart(\"conv\", \"/repo\"),\n {\n type: \"user.message\",\n data: { content: \"hello\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"Hi there\" },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"hello\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"assistant\", content: \"Hi there\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"includes system/info/warning messages only in verbose mode\", () => {\n const sessionDir = writeSession(\"verbose\", {\n events: [\n {\n type: \"session.warning\",\n data: { message: \"MCP failed\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n {\n type: \"tool.execution_complete\",\n data: { result: { content: \"Tool result\" } },\n timestamp: \"2026-06-09T09:50:02.000Z\",\n },\n ],\n });\n const filePath = path.join(sessionDir, \"events.jsonl\");\n\n expect(adapter.getConversation(filePath)).toEqual([]);\n expect(adapter.getConversation(filePath, { verbose: true })).toEqual([\n { role: \"system\", content: \"MCP failed\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n { role: \"system\", content: \"Tool result\", timestamp: \"2026-06-09T09:50:02.000Z\" },\n ]);\n });\n\n it(\"skips malformed JSONL lines and missing text\", () => {\n const sessionDir = writeSession(\"malformed\", {\n events: [\n \"not json\",\n {\n type: \"user.message\",\n data: { content: \"valid\" },\n timestamp: \"2026-06-09T09:50:01.000Z\",\n },\n { type: \"assistant.message\", data: {}, timestamp: \"2026-06-09T09:50:02.000Z\" },\n ],\n });\n\n const messages = adapter.getConversation(path.join(sessionDir, \"events.jsonl\"));\n\n expect(messages).toEqual([\n { role: \"user\", content: \"valid\", timestamp: \"2026-06-09T09:50:01.000Z\" },\n ]);\n });\n\n it(\"returns empty array for missing file\", () => {\n expect(adapter.getConversation(path.join(tmpDir, \"missing.jsonl\"))).toEqual([]);\n });\n });\n\n describe(\"listSessions\", () => {\n it(\"returns historical sessions without active locks\", async () => {\n writeSession(\"history-a\", {\n events: [\n sessionStart(\"history-a\", \"/repo-a\", \"2026-06-09T09:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"first user\" },\n timestamp: \"2026-06-09T09:00:01.000Z\",\n },\n {\n type: \"assistant.message\",\n data: { content: \"answer\" },\n timestamp: \"2026-06-09T09:00:02.000Z\",\n },\n ],\n });\n writeSession(\"history-b\", {\n events: [\n sessionStart(\"history-b\", \"/repo-b\", \"2026-06-09T10:00:00.000Z\"),\n {\n type: \"user.message\",\n data: { content: \"other user\" },\n timestamp: \"2026-06-09T10:00:01.000Z\",\n },\n ],\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(2);\n const byId = Object.fromEntries(sessions.map((session) => [session.sessionId, session]));\n expect(byId[\"history-a\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-a\",\n firstUserMessage: \"first user\",\n sessionFilePath: path.join(sessionStateDir, \"history-a\", \"events.jsonl\"),\n });\n expect(byId[\"history-b\"]).toMatchObject({\n type: \"copilot\",\n cwd: \"/repo-b\",\n firstUserMessage: \"other user\",\n });\n });\n\n it(\"finds an exact session ID from its session directory\", async () => {\n writeSession(\"wanted\", { events: [sessionStart(\"wanted\", \"/repo\")] });\n writeSession(\"other\", { events: [sessionStart(\"other\", \"/other\")] });\n\n await expect(adapter.findSessionsById(\"wanted\")).resolves.toEqual([\n expect.objectContaining({\n sessionId: \"wanted\",\n sessionFilePath: path.join(sessionStateDir, \"wanted\", \"events.jsonl\"),\n }),\n ]);\n });\n\n it(\"applies strict cwd filter\", async () => {\n writeSession(\"keep\", { events: [sessionStart(\"keep\", \"/repo\")] });\n writeSession(\"drop\", { events: [sessionStart(\"drop\", \"/other\")] });\n\n const sessions = await adapter.listSessions({ cwd: \"/repo\" });\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0].sessionId).toBe(\"keep\");\n });\n\n it(\"uses workspace fallback for historical sessions without events\", async () => {\n writeSession(\"workspace-history\", {\n workspace: {\n id: \"workspace-history\",\n cwd: \"/workspace-repo\",\n name: \"Workspace History\",\n created_at: \"2026-06-09T08:00:00.000Z\",\n updated_at: \"2026-06-09T08:10:00.000Z\",\n },\n });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toHaveLength(1);\n expect(sessions[0]).toMatchObject({\n type: \"copilot\",\n sessionId: \"workspace-history\",\n cwd: \"/workspace-repo\",\n firstUserMessage: \"\",\n sessionFilePath: path.join(sessionStateDir, \"workspace-history\", \"events.jsonl\"),\n });\n });\n\n it(\"skips session directories without events or workspace metadata\", async () => {\n fs.mkdirSync(path.join(sessionStateDir, \"empty\"), { recursive: true });\n\n const sessions = await adapter.listSessions();\n\n expect(sessions).toEqual([]);\n });\n\n it(\"returns empty when session-state directory does not exist\", async () => {\n adapter = new CopilotAdapter(undefined, { sessionStateDir: path.join(tmpDir, \"missing\") });\n\n await expect(adapter.listSessions()).resolves.toEqual([]);\n });\n });\n});\n"],"names":["fs","os","path","CopilotAdapter","AgentStatus","listAgentProcesses","enrichProcesses","captureProcessSnapshot","generateAgentName","AgentRegistry","vi","mock","importOriginal","actual","fn","mockedListAgentProcesses","mockedEnrichProcesses","mockedCaptureProcessSnapshot","mockedGenerateAgentName","describe","adapter","tmpDir","sessionStateDir","beforeEach","mkdtempSync","join","tmpdir","mkdirSync","recursive","undefined","mockReset","mockImplementation","procs","names","flatMap","name","cwd","pid","basename","afterEach","rmSync","force","writeSession","sessionId","options","sessionDir","events","lines","map","entry","JSON","stringify","writeFileSync","workspace","Object","entries","key","value","lockPid","sessionStart","startTime","type","data","context","gitRoot","branch","timestamp","it","expect","toBe","canHandle","command","tty","mockReturnValue","agents","detectAgents","toEqual","toHaveBeenCalledWith","processes","content","Date","toISOString","id","created_at","updated_at","toHaveLength","toMatchObject","status","WAITING","projectPath","summary","sessionFilePath","RUNNING","ppid","registry","register","runtime","runtimeRef","session","startedAt","messages","getConversation","role","message","result","filePath","verbose","sessions","listSessions","byId","fromEntries","firstUserMessage","findSessionsById","resolves","objectContaining"],"mappings":"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"}