@ai-devkit/agent-manager 0.36.0 → 0.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (618) hide show
  1. package/dist/AgentManager.d.ts +9 -4
  2. package/dist/AgentManager.d.ts.map +1 -1
  3. package/dist/AgentManager.js +21 -2
  4. package/dist/AgentManager.js.map +1 -1
  5. package/dist/__tests__/AgentManager.test.js +151 -3
  6. package/dist/__tests__/AgentManager.test.js.map +1 -1
  7. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js +486 -0
  8. package/dist/__tests__/adapters/IncrementalSessionRefresh.test.js.map +1 -0
  9. package/dist/__tests__/adapters/adapterProcessImports.test.js +52 -0
  10. package/dist/__tests__/adapters/adapterProcessImports.test.js.map +1 -0
  11. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js +247 -0
  12. package/dist/__tests__/adapters/adapterSnapshotCandidates.test.js.map +1 -0
  13. package/dist/__tests__/capacity/openai.test.js +12 -14
  14. package/dist/__tests__/capacity/openai.test.js.map +1 -1
  15. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js +568 -0
  16. package/dist/__tests__/harnesses/BoundedSummarySkip.test.js.map +1 -0
  17. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js +1089 -0
  18. package/dist/__tests__/harnesses/SessionSummaryEquivalence.test.js.map +1 -0
  19. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js +143 -0
  20. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.js.map +1 -0
  21. package/dist/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.js +103 -22
  22. package/dist/__tests__/harnesses/antigravity/AntigravityCliAdapter.test.js.map +1 -0
  23. package/dist/__tests__/harnesses/builtinAdapters.test.js +33 -0
  24. package/dist/__tests__/harnesses/builtinAdapters.test.js.map +1 -0
  25. package/dist/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.js +4 -4
  26. package/dist/__tests__/harnesses/claude/ClaudeAgentMapper.test.js.map +1 -0
  27. package/dist/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.js +47 -19
  28. package/dist/__tests__/harnesses/claude/ClaudeCodeAdapter.test.js.map +1 -0
  29. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js +1 -12
  30. package/dist/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.js.map +1 -1
  31. package/dist/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.js +2 -2
  32. package/dist/__tests__/harnesses/claude/ClaudeSessionParser.test.js.map +1 -0
  33. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.js +1 -1
  34. package/dist/__tests__/harnesses/claude/durable/ClaudeCliProbe.test.js.map +1 -0
  35. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.js +1 -1
  36. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgent.integration.test.js.map +1 -0
  37. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.js +4 -4
  38. package/dist/__tests__/harnesses/claude/durable/ClaudePrintAgentService.test.js.map +1 -0
  39. package/dist/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.js +1 -1
  40. package/dist/__tests__/harnesses/claude/durable/ClaudePrintRunner.test.js.map +1 -0
  41. package/dist/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.js +304 -10
  42. package/dist/__tests__/harnesses/codex/CodexAdapter.test.js.map +1 -0
  43. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js +463 -0
  44. package/dist/__tests__/harnesses/codex/CodexSessionLocator.test.js.map +1 -0
  45. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js +1 -1
  46. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.js.map +1 -1
  47. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js +1 -1
  48. package/dist/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.js.map +1 -1
  49. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.js +4 -4
  50. package/dist/__tests__/harnesses/codex/durable/CodexCliProbe.test.js.map +1 -0
  51. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.js +1 -1
  52. package/dist/__tests__/harnesses/codex/durable/CodexDurableAgentRepository.test.js.map +1 -0
  53. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.js +1 -1
  54. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgent.integration.test.js.map +1 -0
  55. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.js +8 -18
  56. package/dist/__tests__/harnesses/codex/durable/CodexPrintAgentService.test.js.map +1 -0
  57. package/dist/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.js +2 -7
  58. package/dist/__tests__/harnesses/codex/durable/CodexPrintRunner.test.js.map +1 -0
  59. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js +1 -1
  60. package/dist/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.js.map +1 -1
  61. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js +290 -0
  62. package/dist/__tests__/harnesses/copilot/CopilotRefreshIO.test.js.map +1 -0
  63. package/dist/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.js +34 -25
  64. package/dist/__tests__/harnesses/gemini/GeminiCliAdapter.test.js.map +1 -0
  65. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js +491 -0
  66. package/dist/__tests__/harnesses/gemini/GeminiSessionJsonl.test.js.map +1 -0
  67. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js +399 -0
  68. package/dist/__tests__/harnesses/gemini/GeminiSessionLocator.test.js.map +1 -0
  69. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js +1 -1
  70. package/dist/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.js.map +1 -1
  71. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js +1 -1
  72. package/dist/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.js.map +1 -1
  73. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js +167 -0
  74. package/dist/__tests__/harnesses/grok/GrokIncrementalRefresh.test.js.map +1 -0
  75. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js +1 -1
  76. package/dist/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.js.map +1 -1
  77. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js +301 -0
  78. package/dist/__tests__/harnesses/grok/GrokSessionParser.test.js.map +1 -0
  79. package/dist/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.js +137 -82
  80. package/dist/__tests__/harnesses/kiro/KiroAdapter.test.js.map +1 -0
  81. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js +1 -1
  82. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.js.map +1 -1
  83. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js +1 -1
  84. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.js.map +1 -1
  85. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js +2 -2
  86. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.js.map +1 -1
  87. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js +1 -1
  88. package/dist/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.js.map +1 -1
  89. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js +1 -1
  90. package/dist/__tests__/{providers → harnesses}/pi/PiAdapter.test.js.map +1 -1
  91. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js +382 -0
  92. package/dist/__tests__/harnesses/pi/PiDiscoveryIO.test.js.map +1 -0
  93. package/dist/__tests__/{providers → harnesses}/pi/PiSessionParser.test.js +171 -1
  94. package/dist/__tests__/harnesses/pi/PiSessionParser.test.js.map +1 -0
  95. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js +1 -1
  96. package/dist/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.js.map +1 -1
  97. package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js.map +1 -1
  98. package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js.map +1 -1
  99. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js.map +1 -1
  100. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js +1 -1
  101. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.js.map +1 -1
  102. package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js.map +1 -1
  103. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js +1 -1
  104. package/dist/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.js.map +1 -1
  105. package/dist/__tests__/readiness/AgentReadiness.test.js +20 -0
  106. package/dist/__tests__/readiness/AgentReadiness.test.js.map +1 -1
  107. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js +49 -0
  108. package/dist/__tests__/runtime/ManagedAgentRuntime.test.js.map +1 -1
  109. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js +650 -0
  110. package/dist/__tests__/utils/IncrementalJsonlSummary.test.js.map +1 -0
  111. package/dist/__tests__/utils/agents.test.js +66 -2
  112. package/dist/__tests__/utils/agents.test.js.map +1 -1
  113. package/dist/__tests__/utils/conversationTail.bench.test.js +258 -0
  114. package/dist/__tests__/utils/conversationTail.bench.test.js.map +1 -0
  115. package/dist/__tests__/utils/conversationTailParity.test.js +588 -0
  116. package/dist/__tests__/utils/conversationTailParity.test.js.map +1 -0
  117. package/dist/__tests__/utils/jsonlTail.test.js +360 -0
  118. package/dist/__tests__/utils/jsonlTail.test.js.map +1 -0
  119. package/dist/__tests__/utils/matchingConstants.test.js +35 -0
  120. package/dist/__tests__/utils/matchingConstants.test.js.map +1 -0
  121. package/dist/__tests__/utils/process.test.js +436 -2
  122. package/dist/__tests__/utils/process.test.js.map +1 -1
  123. package/dist/adapters/AgentAdapter.d.ts +25 -6
  124. package/dist/adapters/AgentAdapter.d.ts.map +1 -1
  125. package/dist/adapters/AgentAdapter.js +12 -3
  126. package/dist/adapters/AgentAdapter.js.map +1 -1
  127. package/dist/capacity/openai.d.ts +0 -1
  128. package/dist/capacity/openai.d.ts.map +1 -1
  129. package/dist/capacity/openai.js +0 -5
  130. package/dist/capacity/openai.js.map +1 -1
  131. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts +13 -0
  132. package/dist/harnesses/antigravity/AntigravityAgentMapper.d.ts.map +1 -0
  133. package/dist/harnesses/antigravity/AntigravityAgentMapper.js +30 -0
  134. package/dist/harnesses/antigravity/AntigravityAgentMapper.js.map +1 -0
  135. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts +32 -0
  136. package/dist/harnesses/antigravity/AntigravityCliAdapter.d.ts.map +1 -0
  137. package/dist/harnesses/antigravity/AntigravityCliAdapter.js +97 -0
  138. package/dist/harnesses/antigravity/AntigravityCliAdapter.js.map +1 -0
  139. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts +30 -0
  140. package/dist/harnesses/antigravity/AntigravitySessionLocator.d.ts.map +1 -0
  141. package/dist/harnesses/antigravity/AntigravitySessionLocator.js +56 -0
  142. package/dist/harnesses/antigravity/AntigravitySessionLocator.js.map +1 -0
  143. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts +75 -0
  144. package/dist/harnesses/antigravity/AntigravitySessionParser.d.ts.map +1 -0
  145. package/dist/harnesses/antigravity/AntigravitySessionParser.js +174 -0
  146. package/dist/harnesses/antigravity/AntigravitySessionParser.js.map +1 -0
  147. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts.map +1 -1
  148. package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.js +4 -10
  149. package/dist/harnesses/claude/ClaudeAgentMapper.js.map +1 -0
  150. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.d.ts +5 -6
  151. package/dist/harnesses/claude/ClaudeCodeAdapter.d.ts.map +1 -0
  152. package/dist/{providers → harnesses}/claude/ClaudeCodeAdapter.js +17 -15
  153. package/dist/harnesses/claude/ClaudeCodeAdapter.js.map +1 -0
  154. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts.map +1 -1
  155. package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.js +3 -3
  156. package/dist/harnesses/claude/ClaudeSessionLocator.js.map +1 -0
  157. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.d.ts +40 -6
  158. package/dist/harnesses/claude/ClaudeSessionParser.d.ts.map +1 -0
  159. package/dist/{providers → harnesses}/claude/ClaudeSessionParser.js +141 -85
  160. package/dist/harnesses/claude/ClaudeSessionParser.js.map +1 -0
  161. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts.map +1 -1
  162. package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js.map +1 -1
  163. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts.map +1 -1
  164. package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js.map +1 -1
  165. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts.map +1 -1
  166. package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js.map +1 -1
  167. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts.map +1 -1
  168. package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js.map +1 -1
  169. package/dist/{providers → harnesses}/codex/CodexAdapter.d.ts +5 -4
  170. package/dist/harnesses/codex/CodexAdapter.d.ts.map +1 -0
  171. package/dist/{providers → harnesses}/codex/CodexAdapter.js +139 -19
  172. package/dist/harnesses/codex/CodexAdapter.js.map +1 -0
  173. package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts.map +1 -1
  174. package/dist/{providers → harnesses}/codex/CodexAgentMapper.js +4 -11
  175. package/dist/harnesses/codex/CodexAgentMapper.js.map +1 -0
  176. package/dist/harnesses/codex/CodexSessionLocator.d.ts +74 -0
  177. package/dist/harnesses/codex/CodexSessionLocator.d.ts.map +1 -0
  178. package/dist/harnesses/codex/CodexSessionLocator.js +359 -0
  179. package/dist/harnesses/codex/CodexSessionLocator.js.map +1 -0
  180. package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts.map +1 -1
  181. package/dist/{providers → harnesses}/codex/CodexSessionMapping.js +3 -3
  182. package/dist/harnesses/codex/CodexSessionMapping.js.map +1 -0
  183. package/dist/harnesses/codex/CodexSessionParser.d.ts +89 -0
  184. package/dist/harnesses/codex/CodexSessionParser.d.ts.map +1 -0
  185. package/dist/{providers → harnesses}/codex/CodexSessionParser.js +124 -78
  186. package/dist/harnesses/codex/CodexSessionParser.js.map +1 -0
  187. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts.map +1 -1
  188. package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js.map +1 -1
  189. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts.map +1 -1
  190. package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js.map +1 -1
  191. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts.map +1 -1
  192. package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js.map +1 -1
  193. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts.map +1 -1
  194. package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js.map +1 -1
  195. package/dist/{providers → harnesses}/copilot/CopilotAdapter.d.ts +7 -6
  196. package/dist/harnesses/copilot/CopilotAdapter.d.ts.map +1 -0
  197. package/dist/{providers → harnesses}/copilot/CopilotAdapter.js +19 -14
  198. package/dist/harnesses/copilot/CopilotAdapter.js.map +1 -0
  199. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts.map +1 -1
  200. package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.js +4 -11
  201. package/dist/harnesses/copilot/CopilotAgentMapper.js.map +1 -0
  202. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts +42 -0
  203. package/dist/harnesses/copilot/CopilotSessionLocator.d.ts.map +1 -0
  204. package/dist/harnesses/copilot/CopilotSessionLocator.js +126 -0
  205. package/dist/harnesses/copilot/CopilotSessionLocator.js.map +1 -0
  206. package/dist/harnesses/copilot/CopilotSessionParser.d.ts +62 -0
  207. package/dist/harnesses/copilot/CopilotSessionParser.d.ts.map +1 -0
  208. package/dist/harnesses/copilot/CopilotSessionParser.js +236 -0
  209. package/dist/harnesses/copilot/CopilotSessionParser.js.map +1 -0
  210. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts.map +1 -1
  211. package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.js +4 -11
  212. package/dist/harnesses/gemini/GeminiAgentMapper.js.map +1 -0
  213. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.d.ts +4 -5
  214. package/dist/harnesses/gemini/GeminiCliAdapter.d.ts.map +1 -0
  215. package/dist/{providers → harnesses}/gemini/GeminiCliAdapter.js +6 -7
  216. package/dist/harnesses/gemini/GeminiCliAdapter.js.map +1 -0
  217. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts +72 -0
  218. package/dist/harnesses/gemini/GeminiSessionLocator.d.ts.map +1 -0
  219. package/dist/harnesses/gemini/GeminiSessionLocator.js +300 -0
  220. package/dist/harnesses/gemini/GeminiSessionLocator.js.map +1 -0
  221. package/dist/{providers → harnesses}/gemini/GeminiSessionParser.d.ts +34 -7
  222. package/dist/harnesses/gemini/GeminiSessionParser.d.ts.map +1 -0
  223. package/dist/harnesses/gemini/GeminiSessionParser.js +272 -0
  224. package/dist/harnesses/gemini/GeminiSessionParser.js.map +1 -0
  225. package/dist/harnesses/gemini/fileSignature.d.ts +8 -0
  226. package/dist/harnesses/gemini/fileSignature.d.ts.map +1 -0
  227. package/dist/harnesses/gemini/fileSignature.js +9 -0
  228. package/dist/harnesses/gemini/fileSignature.js.map +1 -0
  229. package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts.map +1 -1
  230. package/dist/{providers → harnesses}/grok/GrokAgentMapper.js +4 -10
  231. package/dist/harnesses/grok/GrokAgentMapper.js.map +1 -0
  232. package/dist/{providers → harnesses}/grok/GrokCliAdapter.d.ts +5 -5
  233. package/dist/harnesses/grok/GrokCliAdapter.d.ts.map +1 -0
  234. package/dist/{providers → harnesses}/grok/GrokCliAdapter.js +14 -10
  235. package/dist/harnesses/grok/GrokCliAdapter.js.map +1 -0
  236. package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts.map +1 -1
  237. package/dist/{providers → harnesses}/grok/GrokSessionLocator.js +2 -2
  238. package/dist/harnesses/grok/GrokSessionLocator.js.map +1 -0
  239. package/dist/harnesses/grok/GrokSessionParser.d.ts +87 -0
  240. package/dist/harnesses/grok/GrokSessionParser.d.ts.map +1 -0
  241. package/dist/harnesses/grok/GrokSessionParser.js +185 -0
  242. package/dist/harnesses/grok/GrokSessionParser.js.map +1 -0
  243. package/dist/harnesses/index.d.ts +7 -0
  244. package/dist/harnesses/index.d.ts.map +1 -0
  245. package/dist/harnesses/index.js +27 -0
  246. package/dist/harnesses/index.js.map +1 -0
  247. package/dist/harnesses/kiro/KiroAdapter.d.ts +31 -0
  248. package/dist/harnesses/kiro/KiroAdapter.d.ts.map +1 -0
  249. package/dist/harnesses/kiro/KiroAdapter.js +125 -0
  250. package/dist/harnesses/kiro/KiroAdapter.js.map +1 -0
  251. package/dist/harnesses/kiro/KiroAgentMapper.d.ts +13 -0
  252. package/dist/harnesses/kiro/KiroAgentMapper.d.ts.map +1 -0
  253. package/dist/harnesses/kiro/KiroAgentMapper.js +29 -0
  254. package/dist/harnesses/kiro/KiroAgentMapper.js.map +1 -0
  255. package/dist/harnesses/kiro/KiroSessionLocator.d.ts +38 -0
  256. package/dist/harnesses/kiro/KiroSessionLocator.d.ts.map +1 -0
  257. package/dist/harnesses/kiro/KiroSessionLocator.js +95 -0
  258. package/dist/harnesses/kiro/KiroSessionLocator.js.map +1 -0
  259. package/dist/harnesses/kiro/KiroSessionParser.d.ts +81 -0
  260. package/dist/harnesses/kiro/KiroSessionParser.d.ts.map +1 -0
  261. package/dist/harnesses/kiro/KiroSessionParser.js +251 -0
  262. package/dist/harnesses/kiro/KiroSessionParser.js.map +1 -0
  263. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.d.ts +2 -4
  264. package/dist/harnesses/opencode/OpenCodeAdapter.d.ts.map +1 -0
  265. package/dist/{providers → harnesses}/opencode/OpenCodeAdapter.js +4 -7
  266. package/dist/harnesses/opencode/OpenCodeAdapter.js.map +1 -0
  267. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts.map +1 -1
  268. package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.js +5 -13
  269. package/dist/harnesses/opencode/OpenCodeAgentMapper.js.map +1 -0
  270. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts.map +1 -1
  271. package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.js +2 -2
  272. package/dist/harnesses/opencode/OpenCodeSessionLocator.js.map +1 -0
  273. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.d.ts +2 -4
  274. package/dist/harnesses/opencode/OpenCodeSessionParser.d.ts.map +1 -0
  275. package/dist/{providers → harnesses}/opencode/OpenCodeSessionParser.js +2 -1
  276. package/dist/harnesses/opencode/OpenCodeSessionParser.js.map +1 -0
  277. package/dist/{providers → harnesses}/pi/PiAdapter.d.ts +5 -4
  278. package/dist/harnesses/pi/PiAdapter.d.ts.map +1 -0
  279. package/dist/{providers → harnesses}/pi/PiAdapter.js +16 -12
  280. package/dist/harnesses/pi/PiAdapter.js.map +1 -0
  281. package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts.map +1 -1
  282. package/dist/{providers → harnesses}/pi/PiAgentMapper.js +4 -11
  283. package/dist/harnesses/pi/PiAgentMapper.js.map +1 -0
  284. package/dist/harnesses/pi/PiSessionLocator.d.ts +61 -0
  285. package/dist/harnesses/pi/PiSessionLocator.d.ts.map +1 -0
  286. package/dist/harnesses/pi/PiSessionLocator.js +212 -0
  287. package/dist/harnesses/pi/PiSessionLocator.js.map +1 -0
  288. package/dist/harnesses/pi/PiSessionParser.d.ts +88 -0
  289. package/dist/harnesses/pi/PiSessionParser.d.ts.map +1 -0
  290. package/dist/harnesses/pi/PiSessionParser.js +318 -0
  291. package/dist/harnesses/pi/PiSessionParser.js.map +1 -0
  292. package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts.map +1 -1
  293. package/dist/{providers → harnesses}/pi/PiSessionTracker.js +2 -2
  294. package/dist/harnesses/pi/PiSessionTracker.js.map +1 -0
  295. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts.map +1 -1
  296. package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js.map +1 -1
  297. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts.map +1 -1
  298. package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js.map +1 -1
  299. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts.map +1 -1
  300. package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js.map +1 -1
  301. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts.map +1 -1
  302. package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js.map +1 -1
  303. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts.map +1 -1
  304. package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js.map +1 -1
  305. package/dist/harnesses/shared.d.ts +41 -0
  306. package/dist/harnesses/shared.d.ts.map +1 -0
  307. package/dist/harnesses/shared.js +71 -0
  308. package/dist/harnesses/shared.js.map +1 -0
  309. package/dist/index.d.ts +26 -25
  310. package/dist/index.d.ts.map +1 -1
  311. package/dist/index.js +18 -17
  312. package/dist/index.js.map +1 -1
  313. package/dist/utils/IncrementalJsonlSummary.d.ts +100 -0
  314. package/dist/utils/IncrementalJsonlSummary.d.ts.map +1 -0
  315. package/dist/utils/IncrementalJsonlSummary.js +209 -0
  316. package/dist/utils/IncrementalJsonlSummary.js.map +1 -0
  317. package/dist/utils/agents.d.ts +3 -2
  318. package/dist/utils/agents.d.ts.map +1 -1
  319. package/dist/utils/agents.js +50 -15
  320. package/dist/utils/agents.js.map +1 -1
  321. package/dist/utils/index.d.ts +2 -1
  322. package/dist/utils/index.d.ts.map +1 -1
  323. package/dist/utils/index.js +1 -1
  324. package/dist/utils/index.js.map +1 -1
  325. package/dist/utils/jsonlTail.d.ts +73 -0
  326. package/dist/utils/jsonlTail.d.ts.map +1 -0
  327. package/dist/utils/jsonlTail.js +238 -0
  328. package/dist/utils/jsonlTail.js.map +1 -0
  329. package/dist/utils/matching.d.ts +2 -0
  330. package/dist/utils/matching.d.ts.map +1 -1
  331. package/dist/utils/matching.js +3 -2
  332. package/dist/utils/matching.js.map +1 -1
  333. package/dist/utils/matchingConstants.d.ts +15 -0
  334. package/dist/utils/matchingConstants.d.ts.map +1 -0
  335. package/dist/utils/matchingConstants.js +14 -0
  336. package/dist/utils/matchingConstants.js.map +1 -0
  337. package/dist/utils/process.d.ts +38 -2
  338. package/dist/utils/process.d.ts.map +1 -1
  339. package/dist/utils/process.js +131 -43
  340. package/dist/utils/process.js.map +1 -1
  341. package/package.json +2 -1
  342. package/scripts/benchmark-cold-start.mjs +350 -0
  343. package/src/AgentManager.ts +26 -5
  344. package/src/__tests__/AgentManager.test.ts +141 -3
  345. package/src/__tests__/adapters/IncrementalSessionRefresh.test.ts +437 -0
  346. package/src/__tests__/adapters/adapterProcessImports.test.ts +58 -0
  347. package/src/__tests__/adapters/adapterSnapshotCandidates.test.ts +243 -0
  348. package/src/__tests__/capacity/openai.test.ts +5 -15
  349. package/src/__tests__/harnesses/BoundedSummarySkip.test.ts +496 -0
  350. package/src/__tests__/harnesses/SessionSummaryEquivalence.test.ts +726 -0
  351. package/src/__tests__/harnesses/antigravity/AntigravityCliAdapter.subprocess.test.ts +133 -0
  352. package/src/__tests__/{adapters → harnesses/antigravity}/AntigravityCliAdapter.test.ts +97 -25
  353. package/src/__tests__/harnesses/builtinAdapters.test.ts +33 -0
  354. package/src/__tests__/{providers → harnesses}/claude/ClaudeAgentMapper.test.ts +5 -5
  355. package/src/__tests__/{adapters → harnesses/claude}/ClaudeCodeAdapter.test.ts +54 -24
  356. package/src/__tests__/{providers → harnesses}/claude/ClaudeSessionLocator.test.ts +1 -12
  357. package/src/__tests__/{utils → harnesses/claude}/ClaudeSessionParser.test.ts +2 -2
  358. package/src/__tests__/{print → harnesses/claude/durable}/ClaudeCliProbe.test.ts +1 -1
  359. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgent.integration.test.ts +1 -1
  360. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintAgentService.test.ts +4 -4
  361. package/src/__tests__/{print → harnesses/claude/durable}/ClaudePrintRunner.test.ts +2 -2
  362. package/src/__tests__/{adapters → harnesses/codex}/CodexAdapter.test.ts +277 -12
  363. package/src/__tests__/harnesses/codex/CodexSessionLocator.test.ts +419 -0
  364. package/src/__tests__/{providers → harnesses}/codex/CodexSessionMapping.test.ts +1 -1
  365. package/src/__tests__/{providers → harnesses}/codex/CodexSessionParser.test.ts +1 -1
  366. package/src/__tests__/{durable → harnesses/codex/durable}/CodexCliProbe.test.ts +4 -4
  367. package/src/__tests__/{durable → harnesses/codex/durable}/CodexDurableAgentRepository.test.ts +1 -1
  368. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgent.integration.test.ts +1 -1
  369. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintAgentService.test.ts +8 -18
  370. package/src/__tests__/{durable → harnesses/codex/durable}/CodexPrintRunner.test.ts +3 -9
  371. package/src/__tests__/{providers → harnesses}/copilot/CopilotAdapter.test.ts +1 -1
  372. package/src/__tests__/harnesses/copilot/CopilotRefreshIO.test.ts +270 -0
  373. package/src/__tests__/{providers → harnesses}/gemini/GeminiCliAdapter.test.ts +27 -23
  374. package/src/__tests__/harnesses/gemini/GeminiSessionJsonl.test.ts +402 -0
  375. package/src/__tests__/harnesses/gemini/GeminiSessionLocator.test.ts +396 -0
  376. package/src/__tests__/{providers → harnesses}/grok/GrokAgentMapper.test.ts +2 -2
  377. package/src/__tests__/{providers → harnesses}/grok/GrokCliAdapter.test.ts +1 -1
  378. package/src/__tests__/harnesses/grok/GrokIncrementalRefresh.test.ts +170 -0
  379. package/src/__tests__/{providers → harnesses}/grok/GrokSessionLocator.test.ts +1 -1
  380. package/src/__tests__/harnesses/grok/GrokSessionParser.test.ts +230 -0
  381. package/src/__tests__/{adapters → harnesses/kiro}/KiroAdapter.test.ts +127 -109
  382. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAdapter.test.ts +1 -1
  383. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeAgentMapper.test.ts +1 -1
  384. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionLocator.test.ts +2 -2
  385. package/src/__tests__/{providers → harnesses}/opencode/OpenCodeSessionParser.test.ts +1 -1
  386. package/src/__tests__/{providers → harnesses}/pi/PiAdapter.test.ts +1 -1
  387. package/src/__tests__/harnesses/pi/PiDiscoveryIO.test.ts +337 -0
  388. package/src/__tests__/{providers → harnesses}/pi/PiSessionParser.test.ts +91 -1
  389. package/src/__tests__/{providers → harnesses}/pi/PiSessionTracker.test.ts +1 -1
  390. package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintProtocol.test.ts +1 -1
  391. package/src/__tests__/{providers → harnesses}/pi/durable/PiStreamParser.test.ts +1 -1
  392. package/src/__tests__/readiness/AgentReadiness.test.ts +16 -0
  393. package/src/__tests__/runtime/ManagedAgentRuntime.test.ts +30 -0
  394. package/src/__tests__/utils/IncrementalJsonlSummary.test.ts +414 -0
  395. package/src/__tests__/utils/agents.test.ts +76 -2
  396. package/src/__tests__/utils/conversationTail.bench.test.ts +193 -0
  397. package/src/__tests__/utils/conversationTailParity.test.ts +365 -0
  398. package/src/__tests__/utils/jsonlTail.test.ts +317 -0
  399. package/src/__tests__/utils/matchingConstants.test.ts +40 -0
  400. package/src/__tests__/utils/process.test.ts +254 -0
  401. package/src/adapters/AgentAdapter.ts +37 -14
  402. package/src/capacity/openai.ts +0 -6
  403. package/src/harnesses/antigravity/AntigravityAgentMapper.ts +34 -0
  404. package/src/harnesses/antigravity/AntigravityCliAdapter.ts +126 -0
  405. package/src/harnesses/antigravity/AntigravitySessionLocator.ts +75 -0
  406. package/src/harnesses/antigravity/AntigravitySessionParser.ts +252 -0
  407. package/src/{providers → harnesses}/claude/ClaudeAgentMapper.ts +2 -10
  408. package/src/{providers → harnesses}/claude/ClaudeCodeAdapter.ts +22 -20
  409. package/src/{providers → harnesses}/claude/ClaudeSessionLocator.ts +3 -3
  410. package/src/{providers → harnesses}/claude/ClaudeSessionParser.ts +189 -97
  411. package/src/{providers → harnesses}/codex/CodexAdapter.ts +153 -29
  412. package/src/{providers → harnesses}/codex/CodexAgentMapper.ts +2 -11
  413. package/src/harnesses/codex/CodexSessionLocator.ts +509 -0
  414. package/src/{providers → harnesses}/codex/CodexSessionMapping.ts +3 -3
  415. package/src/{providers → harnesses}/codex/CodexSessionParser.ts +169 -92
  416. package/src/{providers → harnesses}/copilot/CopilotAdapter.ts +22 -22
  417. package/src/{providers → harnesses}/copilot/CopilotAgentMapper.ts +2 -11
  418. package/src/harnesses/copilot/CopilotSessionLocator.ts +161 -0
  419. package/src/harnesses/copilot/CopilotSessionParser.ts +380 -0
  420. package/src/{providers → harnesses}/gemini/GeminiAgentMapper.ts +2 -11
  421. package/src/{providers → harnesses}/gemini/GeminiCliAdapter.ts +7 -9
  422. package/src/harnesses/gemini/GeminiSessionLocator.ts +394 -0
  423. package/src/{providers → harnesses}/gemini/GeminiSessionParser.ts +155 -31
  424. package/src/harnesses/gemini/fileSignature.ts +10 -0
  425. package/src/{providers → harnesses}/grok/GrokAgentMapper.ts +2 -11
  426. package/src/{providers → harnesses}/grok/GrokCliAdapter.ts +16 -15
  427. package/src/{providers → harnesses}/grok/GrokSessionLocator.ts +2 -2
  428. package/src/harnesses/grok/GrokSessionParser.ts +251 -0
  429. package/src/harnesses/index.ts +28 -0
  430. package/src/harnesses/kiro/KiroAdapter.ts +143 -0
  431. package/src/harnesses/kiro/KiroAgentMapper.ts +34 -0
  432. package/src/harnesses/kiro/KiroSessionLocator.ts +143 -0
  433. package/src/harnesses/kiro/KiroSessionParser.ts +376 -0
  434. package/src/{providers → harnesses}/opencode/OpenCodeAdapter.ts +5 -11
  435. package/src/{providers → harnesses}/opencode/OpenCodeAgentMapper.ts +3 -13
  436. package/src/{providers → harnesses}/opencode/OpenCodeSessionLocator.ts +2 -2
  437. package/src/{providers → harnesses}/opencode/OpenCodeSessionParser.ts +4 -3
  438. package/src/{providers → harnesses}/pi/PiAdapter.ts +20 -18
  439. package/src/{providers → harnesses}/pi/PiAgentMapper.ts +2 -11
  440. package/src/harnesses/pi/PiSessionLocator.ts +288 -0
  441. package/src/harnesses/pi/PiSessionParser.ts +488 -0
  442. package/src/{providers → harnesses}/pi/PiSessionTracker.ts +2 -2
  443. package/src/harnesses/shared.ts +119 -0
  444. package/src/index.ts +26 -24
  445. package/src/utils/IncrementalJsonlSummary.ts +306 -0
  446. package/src/utils/agents.ts +60 -28
  447. package/src/utils/index.ts +2 -0
  448. package/src/utils/jsonlTail.ts +349 -0
  449. package/src/utils/matching.ts +3 -3
  450. package/src/utils/matchingConstants.ts +15 -0
  451. package/src/utils/process.ts +189 -45
  452. package/dist/__tests__/adapters/AntigravityCliAdapter.test.js.map +0 -1
  453. package/dist/__tests__/adapters/ClaudeCodeAdapter.test.js.map +0 -1
  454. package/dist/__tests__/adapters/CodexAdapter.test.js.map +0 -1
  455. package/dist/__tests__/adapters/KiroAdapter.test.js.map +0 -1
  456. package/dist/__tests__/durable/CodexCliProbe.test.js.map +0 -1
  457. package/dist/__tests__/durable/CodexDurableAgentRepository.test.js.map +0 -1
  458. package/dist/__tests__/durable/CodexPrintAgent.integration.test.js.map +0 -1
  459. package/dist/__tests__/durable/CodexPrintAgentService.test.js.map +0 -1
  460. package/dist/__tests__/durable/CodexPrintRunner.test.js.map +0 -1
  461. package/dist/__tests__/print/ClaudeCliProbe.test.js.map +0 -1
  462. package/dist/__tests__/print/ClaudePrintAgent.integration.test.js.map +0 -1
  463. package/dist/__tests__/print/ClaudePrintAgentService.test.js.map +0 -1
  464. package/dist/__tests__/print/ClaudePrintRunner.test.js.map +0 -1
  465. package/dist/__tests__/providers/claude/ClaudeAgentMapper.test.js.map +0 -1
  466. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js +0 -194
  467. package/dist/__tests__/providers/codex/CodexSessionLocator.test.js.map +0 -1
  468. package/dist/__tests__/providers/gemini/GeminiCliAdapter.test.js.map +0 -1
  469. package/dist/__tests__/providers/pi/PiSessionParser.test.js.map +0 -1
  470. package/dist/__tests__/utils/ClaudeSessionParser.test.js.map +0 -1
  471. package/dist/adapters/AntigravityCliAdapter.d.ts +0 -57
  472. package/dist/adapters/AntigravityCliAdapter.d.ts.map +0 -1
  473. package/dist/adapters/AntigravityCliAdapter.js +0 -273
  474. package/dist/adapters/AntigravityCliAdapter.js.map +0 -1
  475. package/dist/adapters/KiroAdapter.d.ts +0 -46
  476. package/dist/adapters/KiroAdapter.d.ts.map +0 -1
  477. package/dist/adapters/KiroAdapter.js +0 -344
  478. package/dist/adapters/KiroAdapter.js.map +0 -1
  479. package/dist/adapters/index.d.ts +0 -12
  480. package/dist/adapters/index.d.ts.map +0 -1
  481. package/dist/adapters/index.js +0 -12
  482. package/dist/adapters/index.js.map +0 -1
  483. package/dist/providers/claude/ClaudeAgentMapper.js.map +0 -1
  484. package/dist/providers/claude/ClaudeCodeAdapter.d.ts.map +0 -1
  485. package/dist/providers/claude/ClaudeCodeAdapter.js.map +0 -1
  486. package/dist/providers/claude/ClaudeSessionLocator.js.map +0 -1
  487. package/dist/providers/claude/ClaudeSessionParser.d.ts.map +0 -1
  488. package/dist/providers/claude/ClaudeSessionParser.js.map +0 -1
  489. package/dist/providers/codex/CodexAdapter.d.ts.map +0 -1
  490. package/dist/providers/codex/CodexAdapter.js.map +0 -1
  491. package/dist/providers/codex/CodexAgentMapper.js.map +0 -1
  492. package/dist/providers/codex/CodexSessionLocator.d.ts +0 -44
  493. package/dist/providers/codex/CodexSessionLocator.d.ts.map +0 -1
  494. package/dist/providers/codex/CodexSessionLocator.js +0 -207
  495. package/dist/providers/codex/CodexSessionLocator.js.map +0 -1
  496. package/dist/providers/codex/CodexSessionMapping.js.map +0 -1
  497. package/dist/providers/codex/CodexSessionParser.d.ts +0 -58
  498. package/dist/providers/codex/CodexSessionParser.d.ts.map +0 -1
  499. package/dist/providers/codex/CodexSessionParser.js.map +0 -1
  500. package/dist/providers/copilot/CopilotAdapter.d.ts.map +0 -1
  501. package/dist/providers/copilot/CopilotAdapter.js.map +0 -1
  502. package/dist/providers/copilot/CopilotAgentMapper.js.map +0 -1
  503. package/dist/providers/copilot/CopilotSessionLocator.d.ts +0 -20
  504. package/dist/providers/copilot/CopilotSessionLocator.d.ts.map +0 -1
  505. package/dist/providers/copilot/CopilotSessionLocator.js +0 -49
  506. package/dist/providers/copilot/CopilotSessionLocator.js.map +0 -1
  507. package/dist/providers/copilot/CopilotSessionParser.d.ts +0 -30
  508. package/dist/providers/copilot/CopilotSessionParser.d.ts.map +0 -1
  509. package/dist/providers/copilot/CopilotSessionParser.js +0 -181
  510. package/dist/providers/copilot/CopilotSessionParser.js.map +0 -1
  511. package/dist/providers/gemini/GeminiAgentMapper.js.map +0 -1
  512. package/dist/providers/gemini/GeminiCliAdapter.d.ts.map +0 -1
  513. package/dist/providers/gemini/GeminiCliAdapter.js.map +0 -1
  514. package/dist/providers/gemini/GeminiSessionLocator.d.ts +0 -30
  515. package/dist/providers/gemini/GeminiSessionLocator.d.ts.map +0 -1
  516. package/dist/providers/gemini/GeminiSessionLocator.js +0 -142
  517. package/dist/providers/gemini/GeminiSessionLocator.js.map +0 -1
  518. package/dist/providers/gemini/GeminiSessionParser.d.ts.map +0 -1
  519. package/dist/providers/gemini/GeminiSessionParser.js +0 -166
  520. package/dist/providers/gemini/GeminiSessionParser.js.map +0 -1
  521. package/dist/providers/grok/GrokAgentMapper.js.map +0 -1
  522. package/dist/providers/grok/GrokCliAdapter.d.ts.map +0 -1
  523. package/dist/providers/grok/GrokCliAdapter.js.map +0 -1
  524. package/dist/providers/grok/GrokSessionLocator.js.map +0 -1
  525. package/dist/providers/grok/GrokSessionParser.d.ts +0 -54
  526. package/dist/providers/grok/GrokSessionParser.d.ts.map +0 -1
  527. package/dist/providers/grok/GrokSessionParser.js +0 -122
  528. package/dist/providers/grok/GrokSessionParser.js.map +0 -1
  529. package/dist/providers/opencode/OpenCodeAdapter.d.ts.map +0 -1
  530. package/dist/providers/opencode/OpenCodeAdapter.js.map +0 -1
  531. package/dist/providers/opencode/OpenCodeAgentMapper.js.map +0 -1
  532. package/dist/providers/opencode/OpenCodeSessionLocator.js.map +0 -1
  533. package/dist/providers/opencode/OpenCodeSessionParser.d.ts.map +0 -1
  534. package/dist/providers/opencode/OpenCodeSessionParser.js.map +0 -1
  535. package/dist/providers/pi/PiAdapter.d.ts.map +0 -1
  536. package/dist/providers/pi/PiAdapter.js.map +0 -1
  537. package/dist/providers/pi/PiAgentMapper.js.map +0 -1
  538. package/dist/providers/pi/PiSessionLocator.d.ts +0 -24
  539. package/dist/providers/pi/PiSessionLocator.d.ts.map +0 -1
  540. package/dist/providers/pi/PiSessionLocator.js +0 -86
  541. package/dist/providers/pi/PiSessionLocator.js.map +0 -1
  542. package/dist/providers/pi/PiSessionParser.d.ts +0 -36
  543. package/dist/providers/pi/PiSessionParser.d.ts.map +0 -1
  544. package/dist/providers/pi/PiSessionParser.js +0 -191
  545. package/dist/providers/pi/PiSessionParser.js.map +0 -1
  546. package/dist/providers/pi/PiSessionTracker.js.map +0 -1
  547. package/src/__tests__/fixtures/fake-claude.cjs +0 -31
  548. package/src/__tests__/fixtures/fake-codex.cjs +0 -56
  549. package/src/__tests__/providers/codex/CodexSessionLocator.test.ts +0 -182
  550. package/src/adapters/AntigravityCliAdapter.ts +0 -356
  551. package/src/adapters/KiroAdapter.ts +0 -456
  552. package/src/adapters/index.ts +0 -17
  553. package/src/providers/codex/CodexSessionLocator.ts +0 -279
  554. package/src/providers/copilot/CopilotSessionLocator.ts +0 -63
  555. package/src/providers/copilot/CopilotSessionParser.ts +0 -289
  556. package/src/providers/gemini/GeminiSessionLocator.ts +0 -183
  557. package/src/providers/grok/GrokSessionParser.ts +0 -166
  558. package/src/providers/pi/PiSessionLocator.ts +0 -110
  559. package/src/providers/pi/PiSessionParser.ts +0 -284
  560. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.js +0 -0
  561. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.js +0 -0
  562. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.js +0 -0
  563. /package/dist/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.js +0 -0
  564. /package/dist/{providers → harnesses}/claude/ClaudeAgentMapper.d.ts +0 -0
  565. /package/dist/{providers → harnesses}/claude/ClaudeSessionLocator.d.ts +0 -0
  566. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.d.ts +0 -0
  567. /package/dist/{providers → harnesses}/claude/durable/ClaudeCliProbe.js +0 -0
  568. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.d.ts +0 -0
  569. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintAgentService.js +0 -0
  570. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.d.ts +0 -0
  571. /package/dist/{providers → harnesses}/claude/durable/ClaudePrintRunner.js +0 -0
  572. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.d.ts +0 -0
  573. /package/dist/{providers → harnesses}/claude/durable/ClaudeStreamParser.js +0 -0
  574. /package/dist/{providers → harnesses}/codex/CodexAgentMapper.d.ts +0 -0
  575. /package/dist/{providers → harnesses}/codex/CodexSessionMapping.d.ts +0 -0
  576. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.d.ts +0 -0
  577. /package/dist/{providers → harnesses}/codex/durable/CodexCliProbe.js +0 -0
  578. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.d.ts +0 -0
  579. /package/dist/{providers → harnesses}/codex/durable/CodexPrintAgentService.js +0 -0
  580. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.d.ts +0 -0
  581. /package/dist/{providers → harnesses}/codex/durable/CodexPrintRunner.js +0 -0
  582. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.d.ts +0 -0
  583. /package/dist/{providers → harnesses}/codex/durable/CodexStreamParser.js +0 -0
  584. /package/dist/{providers → harnesses}/copilot/CopilotAgentMapper.d.ts +0 -0
  585. /package/dist/{providers → harnesses}/gemini/GeminiAgentMapper.d.ts +0 -0
  586. /package/dist/{providers → harnesses}/grok/GrokAgentMapper.d.ts +0 -0
  587. /package/dist/{providers → harnesses}/grok/GrokSessionLocator.d.ts +0 -0
  588. /package/dist/{providers → harnesses}/opencode/OpenCodeAgentMapper.d.ts +0 -0
  589. /package/dist/{providers → harnesses}/opencode/OpenCodeSessionLocator.d.ts +0 -0
  590. /package/dist/{providers → harnesses}/pi/PiAgentMapper.d.ts +0 -0
  591. /package/dist/{providers → harnesses}/pi/PiSessionTracker.d.ts +0 -0
  592. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.d.ts +0 -0
  593. /package/dist/{providers → harnesses}/pi/durable/PiCliProbe.js +0 -0
  594. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.d.ts +0 -0
  595. /package/dist/{providers → harnesses}/pi/durable/PiPrintAgentService.js +0 -0
  596. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.d.ts +0 -0
  597. /package/dist/{providers → harnesses}/pi/durable/PiPrintProtocol.js +0 -0
  598. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.d.ts +0 -0
  599. /package/dist/{providers → harnesses}/pi/durable/PiPrintRunner.js +0 -0
  600. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.d.ts +0 -0
  601. /package/dist/{providers → harnesses}/pi/durable/PiStreamParser.js +0 -0
  602. /package/src/__tests__/{providers → harnesses}/pi/durable/PiCliProbe.test.ts +0 -0
  603. /package/src/__tests__/{providers → harnesses}/pi/durable/PiDurableAgentRepository.test.ts +0 -0
  604. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintAgentService.test.ts +0 -0
  605. /package/src/__tests__/{providers → harnesses}/pi/durable/PiPrintRunner.test.ts +0 -0
  606. /package/src/{providers → harnesses}/claude/durable/ClaudeCliProbe.ts +0 -0
  607. /package/src/{providers → harnesses}/claude/durable/ClaudePrintAgentService.ts +0 -0
  608. /package/src/{providers → harnesses}/claude/durable/ClaudePrintRunner.ts +0 -0
  609. /package/src/{providers → harnesses}/claude/durable/ClaudeStreamParser.ts +0 -0
  610. /package/src/{providers → harnesses}/codex/durable/CodexCliProbe.ts +0 -0
  611. /package/src/{providers → harnesses}/codex/durable/CodexPrintAgentService.ts +0 -0
  612. /package/src/{providers → harnesses}/codex/durable/CodexPrintRunner.ts +0 -0
  613. /package/src/{providers → harnesses}/codex/durable/CodexStreamParser.ts +0 -0
  614. /package/src/{providers → harnesses}/pi/durable/PiCliProbe.ts +0 -0
  615. /package/src/{providers → harnesses}/pi/durable/PiPrintAgentService.ts +0 -0
  616. /package/src/{providers → harnesses}/pi/durable/PiPrintProtocol.ts +0 -0
  617. /package/src/{providers → harnesses}/pi/durable/PiPrintRunner.ts +0 -0
  618. /package/src/{providers → harnesses}/pi/durable/PiStreamParser.ts +0 -0
@@ -0,0 +1,360 @@
1
+ import * as fs from "fs";
2
+ import * as os from "os";
3
+ import * as path from "path";
4
+ import { afterEach, beforeEach, describe, expect, it, vi } from "vitest";
5
+ import { JsonlTailReader } from "../../utils/jsonlTail.js";
6
+ const readBytes = vi.hoisted(()=>({
7
+ total: 0
8
+ }));
9
+ vi.mock("fs", async (importOriginal)=>{
10
+ const actual = await importOriginal();
11
+ const readSync = (...args)=>{
12
+ const n = actual.readSync(...args);
13
+ readBytes.total += n;
14
+ return n;
15
+ };
16
+ const readFileSync = (...args)=>{
17
+ const out = actual.readFileSync(...args);
18
+ readBytes.total += Buffer.byteLength(out);
19
+ return out;
20
+ };
21
+ return {
22
+ ...actual,
23
+ readSync,
24
+ readFileSync,
25
+ default: {
26
+ ...actual,
27
+ readSync,
28
+ readFileSync
29
+ }
30
+ };
31
+ });
32
+ /** Line-independent source: every line with role+text is one message. */ const simpleSource = {
33
+ parseLine (line) {
34
+ let entry;
35
+ try {
36
+ entry = JSON.parse(line);
37
+ } catch {
38
+ return null;
39
+ }
40
+ if (!entry.role || !entry.text) return null;
41
+ return {
42
+ role: entry.role,
43
+ content: entry.text
44
+ };
45
+ }
46
+ };
47
+ function fullParse(content) {
48
+ const out = [];
49
+ for (const line of content.trim().split("\n")){
50
+ const message = simpleSource.parseLine(line);
51
+ if (message) out.push(message);
52
+ }
53
+ return out;
54
+ }
55
+ const dedupSource = {
56
+ parseLine (line) {
57
+ let entry;
58
+ try {
59
+ entry = JSON.parse(line);
60
+ } catch {
61
+ return null;
62
+ }
63
+ if (!entry.role || !entry.text) return null;
64
+ return {
65
+ key: entry.key,
66
+ mirror: entry.mirror === true,
67
+ message: {
68
+ role: entry.role,
69
+ content: entry.text
70
+ }
71
+ };
72
+ },
73
+ finalize (items) {
74
+ const primary = new Set(items.filter((i)=>!i.mirror && i.key).map((i)=>i.key));
75
+ return items.filter((i)=>!(i.mirror && i.key && primary.has(i.key))).map((i)=>i.message);
76
+ }
77
+ };
78
+ function dedupFullParse(content) {
79
+ const items = [];
80
+ for (const line of content.trim().split("\n")){
81
+ const item = dedupSource.parseLine(line);
82
+ if (item) items.push(item);
83
+ }
84
+ return dedupSource.finalize(items);
85
+ }
86
+ const last = (arr, n)=>arr.length > n ? arr.slice(-n) : arr;
87
+ describe("JsonlTailReader", ()=>{
88
+ let tmpDir;
89
+ let file;
90
+ beforeEach(()=>{
91
+ tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "jsonl-tail-"));
92
+ file = path.join(tmpDir, "session.jsonl");
93
+ readBytes.total = 0;
94
+ });
95
+ afterEach(()=>{
96
+ fs.rmSync(tmpDir, {
97
+ recursive: true,
98
+ force: true
99
+ });
100
+ });
101
+ function mixedContent(count) {
102
+ const lines = [];
103
+ for(let i = 0; i < count; i++){
104
+ if (i % 7 === 3) lines.push("not json {");
105
+ if (i % 11 === 5) lines.push("");
106
+ if (i % 5 === 0) lines.push(JSON.stringify({
107
+ type: "noise",
108
+ i
109
+ }));
110
+ const text = i % 13 === 0 ? `big ${i} ${"x".repeat(300)}` : `msg ${i} ünïcødé ✓ 🚀`;
111
+ lines.push(JSON.stringify({
112
+ role: i % 2 ? "assistant" : "user",
113
+ text
114
+ }));
115
+ }
116
+ return lines.join("\n") + "\n";
117
+ }
118
+ it("matches the last N of a full parse for every tail and chunk size", ()=>{
119
+ const content = mixedContent(60);
120
+ fs.writeFileSync(file, content);
121
+ const full = fullParse(content);
122
+ for (const chunkSize of [
123
+ 7,
124
+ 64,
125
+ 333,
126
+ 65536
127
+ ]){
128
+ for(let tail = 1; tail <= full.length + 2; tail++){
129
+ const reader = new JsonlTailReader({
130
+ chunkSize
131
+ });
132
+ expect(reader.read(file, tail, simpleSource)).toEqual(last(full, tail));
133
+ }
134
+ }
135
+ });
136
+ it("handles lines longer than the chunk size and multi-byte characters across chunks", ()=>{
137
+ const lines = [
138
+ JSON.stringify({
139
+ role: "user",
140
+ text: "é".repeat(5000)
141
+ }),
142
+ JSON.stringify({
143
+ role: "assistant",
144
+ text: "🚀".repeat(3000)
145
+ }),
146
+ JSON.stringify({
147
+ role: "user",
148
+ text: "short"
149
+ })
150
+ ];
151
+ const content = lines.join("\n");
152
+ fs.writeFileSync(file, content);
153
+ const reader = new JsonlTailReader({
154
+ chunkSize: 100
155
+ });
156
+ expect(reader.read(file, 3, simpleSource)).toEqual(fullParse(content));
157
+ });
158
+ it("returns an empty list for missing and empty files", ()=>{
159
+ const reader = new JsonlTailReader();
160
+ expect(reader.read(path.join(tmpDir, "missing.jsonl"), 5, simpleSource)).toEqual([]);
161
+ fs.writeFileSync(file, "");
162
+ expect(reader.read(file, 5, simpleSource)).toEqual([]);
163
+ });
164
+ it("reads only a bounded window from the end on the first call", ()=>{
165
+ const content = mixedContent(20000);
166
+ fs.writeFileSync(file, content);
167
+ const reader = new JsonlTailReader({
168
+ chunkSize: 4096
169
+ });
170
+ readBytes.total = 0;
171
+ const result = reader.read(file, 20, simpleSource);
172
+ expect(result).toEqual(last(fullParse(content), 20));
173
+ expect(readBytes.total).toBeLessThanOrEqual(4 * 4096);
174
+ expect(content.length).toBeGreaterThan(100 * 4096);
175
+ });
176
+ it("does not read the file again when it is unchanged", ()=>{
177
+ fs.writeFileSync(file, mixedContent(50));
178
+ const reader = new JsonlTailReader();
179
+ const first = reader.read(file, 10, simpleSource);
180
+ readBytes.total = 0;
181
+ expect(reader.read(file, 10, simpleSource)).toEqual(first);
182
+ expect(readBytes.total).toBe(0);
183
+ });
184
+ it("parses only appended bytes on later polls", ()=>{
185
+ const chunkSize = 4096;
186
+ let content = mixedContent(5000);
187
+ fs.writeFileSync(file, content);
188
+ const reader = new JsonlTailReader({
189
+ chunkSize
190
+ });
191
+ reader.read(file, 20, simpleSource);
192
+ for(let round = 0; round < 3; round++){
193
+ const appended = mixedContent(3 + round).replace(/msg /g, `r${round} `);
194
+ fs.appendFileSync(file, appended);
195
+ content += appended;
196
+ readBytes.total = 0;
197
+ const result = reader.read(file, 20, simpleSource);
198
+ expect(result).toEqual(last(fullParse(content), 20));
199
+ expect(readBytes.total).toBeLessThanOrEqual(Buffer.byteLength(appended) + chunkSize);
200
+ }
201
+ });
202
+ it("includes an unterminated final line and re-reads it once completed", ()=>{
203
+ const head = [
204
+ JSON.stringify({
205
+ role: "user",
206
+ text: "one"
207
+ }),
208
+ JSON.stringify({
209
+ role: "assistant",
210
+ text: "two"
211
+ })
212
+ ].join("\n");
213
+ fs.writeFileSync(file, head + "\n" + '{"role":"user","te');
214
+ const reader = new JsonlTailReader({
215
+ chunkSize: 16
216
+ });
217
+ expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(head));
218
+ fs.appendFileSync(file, 'xt":"three"}');
219
+ const complete = fs.readFileSync(file, "utf-8");
220
+ expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(complete));
221
+ expect(reader.read(file, 5, simpleSource).at(-1)).toEqual({
222
+ role: "user",
223
+ content: "three"
224
+ });
225
+ fs.appendFileSync(file, "\n" + JSON.stringify({
226
+ role: "assistant",
227
+ text: "four"
228
+ }) + "\n");
229
+ expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(fs.readFileSync(file, "utf-8")));
230
+ });
231
+ it("resets when the file shrinks (truncation)", ()=>{
232
+ fs.writeFileSync(file, mixedContent(40));
233
+ const reader = new JsonlTailReader({
234
+ chunkSize: 64
235
+ });
236
+ reader.read(file, 5, simpleSource);
237
+ const replacement = [
238
+ JSON.stringify({
239
+ role: "user",
240
+ text: "fresh start"
241
+ }),
242
+ JSON.stringify({
243
+ role: "assistant",
244
+ text: "ok"
245
+ })
246
+ ].join("\n");
247
+ fs.writeFileSync(file, replacement + "\n");
248
+ expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(replacement));
249
+ });
250
+ it("resets when the file is replaced by a new inode (rotation)", ()=>{
251
+ const original = mixedContent(10);
252
+ fs.writeFileSync(file, original);
253
+ const reader = new JsonlTailReader({
254
+ chunkSize: 64
255
+ });
256
+ reader.read(file, 5, simpleSource);
257
+ // A larger replacement at a new inode must not be treated as an append.
258
+ const rotated = mixedContent(30).replace(/msg /g, "rotated ");
259
+ const staging = path.join(tmpDir, "staging.jsonl");
260
+ fs.writeFileSync(staging, rotated);
261
+ fs.renameSync(staging, file);
262
+ expect(reader.read(file, 5, simpleSource)).toEqual(last(fullParse(rotated), 5));
263
+ });
264
+ it("keeps cache entries separate per variant and per tail", ()=>{
265
+ const content = mixedContent(30);
266
+ fs.writeFileSync(file, content);
267
+ const reader = new JsonlTailReader();
268
+ const full = fullParse(content);
269
+ const onlyUsers = {
270
+ parseLine: (line)=>{
271
+ const m = simpleSource.parseLine(line);
272
+ return m && m.role === "user" ? m : null;
273
+ }
274
+ };
275
+ expect(reader.read(file, 3, simpleSource, "all")).toEqual(last(full, 3));
276
+ expect(reader.read(file, 3, onlyUsers, "users")).toEqual(last(full.filter((m)=>m.role === "user"), 3));
277
+ expect(reader.read(file, 6, simpleSource, "all")).toEqual(last(full, 6));
278
+ });
279
+ it("applies finalize over the window, including lines appended later", ()=>{
280
+ const lines = [
281
+ {
282
+ role: "user",
283
+ text: "hello",
284
+ key: "k1"
285
+ },
286
+ {
287
+ role: "user",
288
+ text: "hello",
289
+ key: "k1",
290
+ mirror: true
291
+ },
292
+ {
293
+ role: "assistant",
294
+ text: "reply",
295
+ key: "k2",
296
+ mirror: true
297
+ }
298
+ ].map((l)=>JSON.stringify(l));
299
+ let content = lines.join("\n") + "\n";
300
+ fs.writeFileSync(file, content);
301
+ const reader = new JsonlTailReader({
302
+ chunkSize: 16
303
+ });
304
+ expect(reader.read(file, 10, dedupSource, "", 4)).toEqual(dedupFullParse(content));
305
+ // The primary for k2 arrives after its mirror; the mirror must disappear.
306
+ const primary = JSON.stringify({
307
+ role: "assistant",
308
+ text: "reply",
309
+ key: "k2"
310
+ }) + "\n";
311
+ fs.appendFileSync(file, primary);
312
+ content += primary;
313
+ expect(reader.read(file, 10, dedupSource, "", 4)).toEqual(dedupFullParse(content));
314
+ expect(dedupFullParse(content)).toHaveLength(2);
315
+ });
316
+ it("stays correct for long append sequences while bounding the retained window", ()=>{
317
+ fs.writeFileSync(file, "");
318
+ const reader = new JsonlTailReader({
319
+ chunkSize: 64
320
+ });
321
+ let content = "";
322
+ for(let i = 0; i < 200; i++){
323
+ const chunk = JSON.stringify({
324
+ role: "user",
325
+ text: `q${i}`,
326
+ key: `u${i}`
327
+ }) + "\n" + JSON.stringify({
328
+ role: "user",
329
+ text: `q${i}`,
330
+ key: `u${i}`,
331
+ mirror: true
332
+ }) + "\n";
333
+ fs.appendFileSync(file, chunk);
334
+ content += chunk;
335
+ expect(reader.read(file, 5, dedupSource, "", 4)).toEqual(last(dedupFullParse(content), 5));
336
+ }
337
+ });
338
+ it("evicts least-recently-used files beyond maxFiles", ()=>{
339
+ const reader = new JsonlTailReader({
340
+ maxFiles: 2
341
+ });
342
+ const files = [
343
+ "a",
344
+ "b",
345
+ "c"
346
+ ].map((name)=>{
347
+ const p = path.join(tmpDir, `${name}.jsonl`);
348
+ fs.writeFileSync(p, mixedContent(5));
349
+ return p;
350
+ });
351
+ for (const p of files)reader.read(p, 3, simpleSource);
352
+ readBytes.total = 0;
353
+ reader.read(files[2], 3, simpleSource);
354
+ expect(readBytes.total).toBe(0);
355
+ reader.read(files[0], 3, simpleSource);
356
+ expect(readBytes.total).toBeGreaterThan(0);
357
+ });
358
+ });
359
+
360
+ //# sourceMappingURL=jsonlTail.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/__tests__/utils/jsonlTail.test.ts"],"sourcesContent":["import * as fs from \"fs\";\nimport * as os from \"os\";\nimport * as path from \"path\";\nimport { afterEach, beforeEach, describe, expect, it, vi } from \"vitest\";\nimport type { ConversationMessage } from \"../../adapters/AgentAdapter.js\";\nimport { JsonlTailReader, type JsonlTailSource } from \"../../utils/jsonlTail.js\";\n\nconst readBytes = vi.hoisted(() => ({ total: 0 }));\n\nvi.mock(\"fs\", async (importOriginal) => {\n const actual = await importOriginal<typeof import(\"fs\")>();\n const readSync = ((...args: Parameters<typeof actual.readSync>) => {\n const n = (actual.readSync as (...a: unknown[]) => number)(...args);\n readBytes.total += n;\n return n;\n }) as typeof actual.readSync;\n const readFileSync = ((...args: Parameters<typeof actual.readFileSync>) => {\n const out = (actual.readFileSync as (...a: unknown[]) => string | Buffer)(...args);\n readBytes.total += Buffer.byteLength(out as string);\n return out;\n }) as typeof actual.readFileSync;\n return { ...actual, readSync, readFileSync, default: { ...actual, readSync, readFileSync } };\n});\n\ninterface Line {\n role?: ConversationMessage[\"role\"];\n text?: string;\n key?: string;\n mirror?: boolean;\n}\n\n/** Line-independent source: every line with role+text is one message. */\nconst simpleSource: JsonlTailSource<ConversationMessage> = {\n parseLine(line) {\n let entry: Line;\n try {\n entry = JSON.parse(line);\n } catch {\n return null;\n }\n if (!entry.role || !entry.text) return null;\n return { role: entry.role, content: entry.text };\n },\n};\n\nfunction fullParse(content: string): ConversationMessage[] {\n const out: ConversationMessage[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n const message = simpleSource.parseLine(line);\n if (message) out.push(message as ConversationMessage);\n }\n return out;\n}\n\n/**\n * Source whose output depends on other lines: a \"mirror\" line is dropped\n * when a non-mirror line with the same key exists anywhere in the window\n * (modeled on Codex's event_msg/response_item de-duplication).\n */\ninterface KeyedItem {\n key?: string;\n mirror: boolean;\n message: ConversationMessage;\n}\nconst dedupSource: JsonlTailSource<KeyedItem> = {\n parseLine(line) {\n let entry: Line;\n try {\n entry = JSON.parse(line);\n } catch {\n return null;\n }\n if (!entry.role || !entry.text) return null;\n return {\n key: entry.key,\n mirror: entry.mirror === true,\n message: { role: entry.role, content: entry.text },\n };\n },\n finalize(items) {\n const primary = new Set(items.filter((i) => !i.mirror && i.key).map((i) => i.key));\n return items.filter((i) => !(i.mirror && i.key && primary.has(i.key))).map((i) => i.message);\n },\n};\n\nfunction dedupFullParse(content: string): ConversationMessage[] {\n const items: KeyedItem[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n const item = dedupSource.parseLine(line);\n if (item) items.push(item);\n }\n return dedupSource.finalize!(items);\n}\n\nconst last = <T>(arr: T[], n: number): T[] => (arr.length > n ? arr.slice(-n) : arr);\n\ndescribe(\"JsonlTailReader\", () => {\n let tmpDir: string;\n let file: string;\n\n beforeEach(() => {\n tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), \"jsonl-tail-\"));\n file = path.join(tmpDir, \"session.jsonl\");\n readBytes.total = 0;\n });\n\n afterEach(() => {\n fs.rmSync(tmpDir, { recursive: true, force: true });\n });\n\n function mixedContent(count: number): string {\n const lines: string[] = [];\n for (let i = 0; i < count; i++) {\n if (i % 7 === 3) lines.push(\"not json {\");\n if (i % 11 === 5) lines.push(\"\");\n if (i % 5 === 0) lines.push(JSON.stringify({ type: \"noise\", i }));\n const text = i % 13 === 0 ? `big ${i} ${\"x\".repeat(300)}` : `msg ${i} ünïcødé ✓ 🚀`;\n lines.push(JSON.stringify({ role: i % 2 ? \"assistant\" : \"user\", text }));\n }\n return lines.join(\"\\n\") + \"\\n\";\n }\n\n it(\"matches the last N of a full parse for every tail and chunk size\", () => {\n const content = mixedContent(60);\n fs.writeFileSync(file, content);\n const full = fullParse(content);\n\n for (const chunkSize of [7, 64, 333, 65536]) {\n for (let tail = 1; tail <= full.length + 2; tail++) {\n const reader = new JsonlTailReader({ chunkSize });\n expect(reader.read(file, tail, simpleSource)).toEqual(last(full, tail));\n }\n }\n });\n\n it(\"handles lines longer than the chunk size and multi-byte characters across chunks\", () => {\n const lines = [\n JSON.stringify({ role: \"user\", text: \"é\".repeat(5000) }),\n JSON.stringify({ role: \"assistant\", text: \"🚀\".repeat(3000) }),\n JSON.stringify({ role: \"user\", text: \"short\" }),\n ];\n const content = lines.join(\"\\n\");\n fs.writeFileSync(file, content);\n\n const reader = new JsonlTailReader({ chunkSize: 100 });\n expect(reader.read(file, 3, simpleSource)).toEqual(fullParse(content));\n });\n\n it(\"returns an empty list for missing and empty files\", () => {\n const reader = new JsonlTailReader();\n expect(reader.read(path.join(tmpDir, \"missing.jsonl\"), 5, simpleSource)).toEqual([]);\n fs.writeFileSync(file, \"\");\n expect(reader.read(file, 5, simpleSource)).toEqual([]);\n });\n\n it(\"reads only a bounded window from the end on the first call\", () => {\n const content = mixedContent(20000);\n fs.writeFileSync(file, content);\n const reader = new JsonlTailReader({ chunkSize: 4096 });\n\n readBytes.total = 0;\n const result = reader.read(file, 20, simpleSource);\n\n expect(result).toEqual(last(fullParse(content), 20));\n expect(readBytes.total).toBeLessThanOrEqual(4 * 4096);\n expect(content.length).toBeGreaterThan(100 * 4096);\n });\n\n it(\"does not read the file again when it is unchanged\", () => {\n fs.writeFileSync(file, mixedContent(50));\n const reader = new JsonlTailReader();\n const first = reader.read(file, 10, simpleSource);\n\n readBytes.total = 0;\n expect(reader.read(file, 10, simpleSource)).toEqual(first);\n expect(readBytes.total).toBe(0);\n });\n\n it(\"parses only appended bytes on later polls\", () => {\n const chunkSize = 4096;\n let content = mixedContent(5000);\n fs.writeFileSync(file, content);\n const reader = new JsonlTailReader({ chunkSize });\n reader.read(file, 20, simpleSource);\n\n for (let round = 0; round < 3; round++) {\n const appended = mixedContent(3 + round).replace(/msg /g, `r${round} `);\n fs.appendFileSync(file, appended);\n content += appended;\n\n readBytes.total = 0;\n const result = reader.read(file, 20, simpleSource);\n expect(result).toEqual(last(fullParse(content), 20));\n expect(readBytes.total).toBeLessThanOrEqual(Buffer.byteLength(appended) + chunkSize);\n }\n });\n\n it(\"includes an unterminated final line and re-reads it once completed\", () => {\n const head = [\n JSON.stringify({ role: \"user\", text: \"one\" }),\n JSON.stringify({ role: \"assistant\", text: \"two\" }),\n ].join(\"\\n\");\n fs.writeFileSync(file, head + \"\\n\" + '{\"role\":\"user\",\"te');\n const reader = new JsonlTailReader({ chunkSize: 16 });\n expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(head));\n\n fs.appendFileSync(file, 'xt\":\"three\"}');\n const complete = fs.readFileSync(file, \"utf-8\");\n expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(complete));\n expect(reader.read(file, 5, simpleSource).at(-1)).toEqual({ role: \"user\", content: \"three\" });\n\n fs.appendFileSync(file, \"\\n\" + JSON.stringify({ role: \"assistant\", text: \"four\" }) + \"\\n\");\n expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(fs.readFileSync(file, \"utf-8\")));\n });\n\n it(\"resets when the file shrinks (truncation)\", () => {\n fs.writeFileSync(file, mixedContent(40));\n const reader = new JsonlTailReader({ chunkSize: 64 });\n reader.read(file, 5, simpleSource);\n\n const replacement = [\n JSON.stringify({ role: \"user\", text: \"fresh start\" }),\n JSON.stringify({ role: \"assistant\", text: \"ok\" }),\n ].join(\"\\n\");\n fs.writeFileSync(file, replacement + \"\\n\");\n expect(reader.read(file, 5, simpleSource)).toEqual(fullParse(replacement));\n });\n\n it(\"resets when the file is replaced by a new inode (rotation)\", () => {\n const original = mixedContent(10);\n fs.writeFileSync(file, original);\n const reader = new JsonlTailReader({ chunkSize: 64 });\n reader.read(file, 5, simpleSource);\n\n // A larger replacement at a new inode must not be treated as an append.\n const rotated = mixedContent(30).replace(/msg /g, \"rotated \");\n const staging = path.join(tmpDir, \"staging.jsonl\");\n fs.writeFileSync(staging, rotated);\n fs.renameSync(staging, file);\n\n expect(reader.read(file, 5, simpleSource)).toEqual(last(fullParse(rotated), 5));\n });\n\n it(\"keeps cache entries separate per variant and per tail\", () => {\n const content = mixedContent(30);\n fs.writeFileSync(file, content);\n const reader = new JsonlTailReader();\n const full = fullParse(content);\n const onlyUsers: JsonlTailSource<ConversationMessage> = {\n parseLine: (line) => {\n const m = simpleSource.parseLine(line);\n return m && (m as ConversationMessage).role === \"user\" ? m : null;\n },\n };\n\n expect(reader.read(file, 3, simpleSource, \"all\")).toEqual(last(full, 3));\n expect(reader.read(file, 3, onlyUsers, \"users\")).toEqual(\n last(\n full.filter((m) => m.role === \"user\"),\n 3,\n ),\n );\n expect(reader.read(file, 6, simpleSource, \"all\")).toEqual(last(full, 6));\n });\n\n it(\"applies finalize over the window, including lines appended later\", () => {\n const lines = [\n { role: \"user\", text: \"hello\", key: \"k1\" },\n { role: \"user\", text: \"hello\", key: \"k1\", mirror: true },\n { role: \"assistant\", text: \"reply\", key: \"k2\", mirror: true },\n ].map((l) => JSON.stringify(l));\n let content = lines.join(\"\\n\") + \"\\n\";\n fs.writeFileSync(file, content);\n const reader = new JsonlTailReader({ chunkSize: 16 });\n\n expect(reader.read(file, 10, dedupSource, \"\", 4)).toEqual(dedupFullParse(content));\n\n // The primary for k2 arrives after its mirror; the mirror must disappear.\n const primary = JSON.stringify({ role: \"assistant\", text: \"reply\", key: \"k2\" }) + \"\\n\";\n fs.appendFileSync(file, primary);\n content += primary;\n expect(reader.read(file, 10, dedupSource, \"\", 4)).toEqual(dedupFullParse(content));\n expect(dedupFullParse(content)).toHaveLength(2);\n });\n\n it(\"stays correct for long append sequences while bounding the retained window\", () => {\n fs.writeFileSync(file, \"\");\n const reader = new JsonlTailReader({ chunkSize: 64 });\n let content = \"\";\n for (let i = 0; i < 200; i++) {\n const chunk =\n JSON.stringify({ role: \"user\", text: `q${i}`, key: `u${i}` }) +\n \"\\n\" +\n JSON.stringify({ role: \"user\", text: `q${i}`, key: `u${i}`, mirror: true }) +\n \"\\n\";\n fs.appendFileSync(file, chunk);\n content += chunk;\n expect(reader.read(file, 5, dedupSource, \"\", 4)).toEqual(last(dedupFullParse(content), 5));\n }\n });\n\n it(\"evicts least-recently-used files beyond maxFiles\", () => {\n const reader = new JsonlTailReader({ maxFiles: 2 });\n const files = [\"a\", \"b\", \"c\"].map((name) => {\n const p = path.join(tmpDir, `${name}.jsonl`);\n fs.writeFileSync(p, mixedContent(5));\n return p;\n });\n for (const p of files) reader.read(p, 3, simpleSource);\n\n readBytes.total = 0;\n reader.read(files[2], 3, simpleSource);\n expect(readBytes.total).toBe(0);\n reader.read(files[0], 3, simpleSource);\n expect(readBytes.total).toBeGreaterThan(0);\n });\n});\n"],"names":["fs","os","path","afterEach","beforeEach","describe","expect","it","vi","JsonlTailReader","readBytes","hoisted","total","mock","importOriginal","actual","readSync","args","n","readFileSync","out","Buffer","byteLength","default","simpleSource","parseLine","line","entry","JSON","parse","role","text","content","fullParse","trim","split","message","push","dedupSource","key","mirror","finalize","items","primary","Set","filter","i","map","has","dedupFullParse","item","last","arr","length","slice","tmpDir","file","mkdtempSync","join","tmpdir","rmSync","recursive","force","mixedContent","count","lines","stringify","type","repeat","writeFileSync","full","chunkSize","tail","reader","read","toEqual","result","toBeLessThanOrEqual","toBeGreaterThan","first","toBe","round","appended","replace","appendFileSync","head","complete","at","replacement","original","rotated","staging","renameSync","onlyUsers","m","l","toHaveLength","chunk","maxFiles","files","name","p"],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import * as fs from "node:fs";
2
+ import * as path from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { describe, expect, it } from "vitest";
5
+ import { MATCH_TOLERANCE_MS as reExported } from "../../utils/matching.js";
6
+ import { MATCH_TOLERANCE_MS } from "../../utils/matchingConstants.js";
7
+ const SRC_DIR = fileURLToPath(new URL("../../", import.meta.url));
8
+ const CONSTANTS_FILE = path.join(SRC_DIR, "utils", "matchingConstants.ts");
9
+ /** `3 * 60 * 1000`, `180000`, `180_000`, or `3 * 60_000` written in source. */ const TOLERANCE_LITERAL = /\b3\s*\*\s*60\s*\*\s*1_?000\b|\b180_?000\b|\b3\s*\*\s*60_?000\b/;
10
+ function listSourceFiles(dir) {
11
+ const files = [];
12
+ for (const entry of fs.readdirSync(dir, {
13
+ withFileTypes: true
14
+ })){
15
+ const full = path.join(dir, entry.name);
16
+ if (entry.isDirectory()) {
17
+ if (entry.name !== "__tests__") files.push(...listSourceFiles(full));
18
+ } else if (entry.name.endsWith(".ts")) {
19
+ files.push(full);
20
+ }
21
+ }
22
+ return files;
23
+ }
24
+ describe("MATCH_TOLERANCE_MS", ()=>{
25
+ it("is 3 minutes and re-exported unchanged from utils/matching", ()=>{
26
+ expect(MATCH_TOLERANCE_MS).toBe(3 * 60 * 1000);
27
+ expect(reExported).toBe(MATCH_TOLERANCE_MS);
28
+ });
29
+ it("is not duplicated as a literal elsewhere in agent-manager source", ()=>{
30
+ const offenders = listSourceFiles(SRC_DIR).filter((file)=>file !== CONSTANTS_FILE).filter((file)=>TOLERANCE_LITERAL.test(fs.readFileSync(file, "utf8"))).map((file)=>path.relative(SRC_DIR, file));
31
+ expect(offenders).toEqual([]);
32
+ });
33
+ });
34
+
35
+ //# sourceMappingURL=matchingConstants.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/__tests__/utils/matchingConstants.test.ts"],"sourcesContent":["import * as fs from \"node:fs\";\nimport * as path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\nimport { describe, expect, it } from \"vitest\";\nimport { MATCH_TOLERANCE_MS as reExported } from \"../../utils/matching.js\";\nimport { MATCH_TOLERANCE_MS } from \"../../utils/matchingConstants.js\";\n\nconst SRC_DIR = fileURLToPath(new URL(\"../../\", import.meta.url));\nconst CONSTANTS_FILE = path.join(SRC_DIR, \"utils\", \"matchingConstants.ts\");\n/** `3 * 60 * 1000`, `180000`, `180_000`, or `3 * 60_000` written in source. */\nconst TOLERANCE_LITERAL = /\\b3\\s*\\*\\s*60\\s*\\*\\s*1_?000\\b|\\b180_?000\\b|\\b3\\s*\\*\\s*60_?000\\b/;\n\nfunction listSourceFiles(dir: string): string[] {\n const files: string[] = [];\n for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n if (entry.name !== \"__tests__\") files.push(...listSourceFiles(full));\n } else if (entry.name.endsWith(\".ts\")) {\n files.push(full);\n }\n }\n return files;\n}\n\ndescribe(\"MATCH_TOLERANCE_MS\", () => {\n it(\"is 3 minutes and re-exported unchanged from utils/matching\", () => {\n expect(MATCH_TOLERANCE_MS).toBe(3 * 60 * 1000);\n expect(reExported).toBe(MATCH_TOLERANCE_MS);\n });\n\n it(\"is not duplicated as a literal elsewhere in agent-manager source\", () => {\n const offenders = listSourceFiles(SRC_DIR)\n .filter((file) => file !== CONSTANTS_FILE)\n .filter((file) => TOLERANCE_LITERAL.test(fs.readFileSync(file, \"utf8\")))\n .map((file) => path.relative(SRC_DIR, file));\n\n expect(offenders).toEqual([]);\n });\n});\n"],"names":["fs","path","fileURLToPath","describe","expect","it","MATCH_TOLERANCE_MS","reExported","SRC_DIR","URL","url","CONSTANTS_FILE","join","TOLERANCE_LITERAL","listSourceFiles","dir","files","entry","readdirSync","withFileTypes","full","name","isDirectory","push","endsWith","toBe","offenders","filter","file","test","readFileSync","map","relative","toEqual"],"mappings":"AAAA,YAAYA,QAAQ,UAAU;AAC9B,YAAYC,UAAU,YAAY;AAClC,SAASC,aAAa,QAAQ,WAAW;AACzC,SAASC,QAAQ,EAAEC,MAAM,EAAEC,EAAE,QAAQ,SAAS;AAC9C,SAASC,sBAAsBC,UAAU,QAAQ,0BAA0B;AAC3E,SAASD,kBAAkB,QAAQ,mCAAmC;AAEtE,MAAME,UAAUN,cAAc,IAAIO,IAAI,UAAU,YAAYC,GAAG;AAC/D,MAAMC,iBAAiBV,KAAKW,IAAI,CAACJ,SAAS,SAAS;AACnD,6EAA6E,GAC7E,MAAMK,oBAAoB;AAE1B,SAASC,gBAAgBC,GAAW;IAClC,MAAMC,QAAkB,EAAE;IAC1B,KAAK,MAAMC,SAASjB,GAAGkB,WAAW,CAACH,KAAK;QAAEI,eAAe;IAAK,GAAI;QAChE,MAAMC,OAAOnB,KAAKW,IAAI,CAACG,KAAKE,MAAMI,IAAI;QACtC,IAAIJ,MAAMK,WAAW,IAAI;YACvB,IAAIL,MAAMI,IAAI,KAAK,aAAaL,MAAMO,IAAI,IAAIT,gBAAgBM;QAChE,OAAO,IAAIH,MAAMI,IAAI,CAACG,QAAQ,CAAC,QAAQ;YACrCR,MAAMO,IAAI,CAACH;QACb;IACF;IACA,OAAOJ;AACT;AAEAb,SAAS,sBAAsB;IAC7BE,GAAG,8DAA8D;QAC/DD,OAAOE,oBAAoBmB,IAAI,CAAC,IAAI,KAAK;QACzCrB,OAAOG,YAAYkB,IAAI,CAACnB;IAC1B;IAEAD,GAAG,oEAAoE;QACrE,MAAMqB,YAAYZ,gBAAgBN,SAC/BmB,MAAM,CAAC,CAACC,OAASA,SAASjB,gBAC1BgB,MAAM,CAAC,CAACC,OAASf,kBAAkBgB,IAAI,CAAC7B,GAAG8B,YAAY,CAACF,MAAM,UAC9DG,GAAG,CAAC,CAACH,OAAS3B,KAAK+B,QAAQ,CAACxB,SAASoB;QAExCxB,OAAOsB,WAAWO,OAAO,CAAC,EAAE;IAC9B;AACF"}