@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,87 @@
1
+ import type { ConversationMessage, ConversationOptions } from "../../adapters/AgentAdapter.js";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import { type JsonlSummaryBounds } from "../../utils/IncrementalJsonlSummary.js";
4
+ export declare const CHAT_HISTORY_FILE = "chat_history.jsonl";
5
+ /** Parsed state for a single ~/.grok/sessions/<cwd>/<id>/ directory. */
6
+ export interface GrokSession {
7
+ sessionId: string;
8
+ projectPath: string;
9
+ sessionFilePath: string;
10
+ sessionStart: Date;
11
+ lastActive: Date;
12
+ firstUserMessage?: string;
13
+ lastUserMessage?: string;
14
+ lastRole?: ConversationMessage["role"];
15
+ }
16
+ export interface GrokSessionParserOptions {
17
+ /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */
18
+ summaryBounds?: JsonlSummaryBounds | false;
19
+ }
20
+ export declare class GrokSessionParser {
21
+ /** Incremental reader backing `getConversation({ tail })`. */
22
+ private readonly tailReader;
23
+ private readonly sessionCache;
24
+ constructor(options?: GrokSessionParserOptions);
25
+ /**
26
+ * Parse a session directory into a {@link GrokSession} from its
27
+ * chat_history.jsonl transcript. Returns null when the transcript is
28
+ * missing — i.e. there is no real session to surface.
29
+ */
30
+ readSession(sessionDir: string, defaultCwd: string): GrokSession | null;
31
+ /**
32
+ * Same result as `readSession`, but backed by a per-instance incremental
33
+ * cache so repeated refreshes only parse bytes appended since the last call.
34
+ * Call `pruneSessionCache()` once per refresh to evict files no longer read.
35
+ *
36
+ * The first read of a large transcript is a bounded head + tail scan (see
37
+ * `summaryReducer.skip`); fields whose entries lie only in the skipped
38
+ * middle fall back to their defaults instead of forcing a full parse.
39
+ */
40
+ readSessionIncremental(sessionDir: string, defaultCwd: string): GrokSession | null;
41
+ /** Evict cached summaries for files not read since the previous prune. */
42
+ pruneSessionCache(): void;
43
+ /** Accepts a session dir or an explicit chat_history.jsonl path. */
44
+ getConversation(sessionPath: string, options?: ConversationOptions): ConversationMessage[];
45
+ /**
46
+ * Determine agent status from parsed session state.
47
+ *
48
+ * - past the idle threshold → IDLE
49
+ * - last transcript turn is an assistant message → WAITING (awaiting user)
50
+ * - otherwise (last turn was a user message, or unknown) → RUNNING
51
+ */
52
+ determineStatus(session: GrokSession): AgentStatus;
53
+ /**
54
+ * Fold one chat_history.jsonl entry into the O(1) summary. Uses the same
55
+ * record rules as `getConversation` (see `toMessage`), minus system records.
56
+ *
57
+ * `skip` (bounded cold start) keeps the head's first user message and
58
+ * clears the last user message and last role, so those come from the tail
59
+ * only. A first user message beyond the head stays undefined rather than
60
+ * being filled from the tail; latest fields before the tail window stay
61
+ * undefined.
62
+ */
63
+ private readonly summaryReducer;
64
+ private toSession;
65
+ /** Full pass over chat_history.jsonl building every conversation turn. */
66
+ private parseChatHistory;
67
+ /**
68
+ * Map one parsed chat record to a conversation turn, or null to skip it.
69
+ * Each record is a { type: 'system' | 'user' | 'assistant', content } object
70
+ * where content is either a string or an array of { type: 'text', text } blocks.
71
+ *
72
+ * Grok wraps the real user prompt in <user_query>...</user_query>; the other
73
+ * user records are context injections (<user_info>, <system-reminder>, ...)
74
+ * and are skipped so the summary is the actual prompt, not boilerplate.
75
+ */
76
+ private toMessage;
77
+ /** Convert one chat_history.jsonl line into a message, or null when it is not one. */
78
+ private lineToMessage;
79
+ /**
80
+ * Extract the prompt inside <user_query>...</user_query>. Returns null when
81
+ * the record has no such tag (a context injection rather than a prompt).
82
+ */
83
+ private extractUserQuery;
84
+ /** Resolve a session dir or an explicit chat_history.jsonl path to the file. */
85
+ private resolveChatPath;
86
+ }
87
+ //# sourceMappingURL=GrokSessionParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"GrokSessionParser.d.ts","sourceRoot":"","sources":["../../../src/harnesses/grok/GrokSessionParser.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,mBAAmB,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAC7D,OAAO,EAGL,KAAK,kBAAkB,EAExB,MAAM,wCAAwC,CAAC;AAKhD,eAAO,MAAM,iBAAiB,uBAAuB,CAAC;AAoBtD,wEAAwE;AACxE,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,CAAC;IACxB,YAAY,EAAE,IAAI,CAAC;IACnB,UAAU,EAAE,IAAI,CAAC;IACjB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,EAAE,mBAAmB,CAAC,MAAM,CAAC,CAAC;CACxC;AAED,MAAM,WAAW,wBAAwB;IACvC,yFAAyF;IACzF,aAAa,CAAC,EAAE,kBAAkB,GAAG,KAAK,CAAC;CAC5C;AAED,qBAAa,iBAAiB;IAC5B,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAyB;IAEpD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAA4C;gBAE7D,OAAO,GAAE,wBAA6B;IAMlD;;;;OAIG;IACH,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAUvE;;;;;;;;OAQG;IACH,sBAAsB,CAAC,UAAU,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,WAAW,GAAG,IAAI;IAWlF,0EAA0E;IAC1E,iBAAiB,IAAI,IAAI;IAIzB,oEAAoE;IACpE,eAAe,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAe1F;;;;;;OAMG;IACH,eAAe,CAAC,OAAO,EAAE,WAAW,GAAG,WAAW;IAUlD;;;;;;;;;OASG;IACH,OAAO,CAAC,QAAQ,CAAC,cAAc,CAiB7B;IAEF,OAAO,CAAC,SAAS;IAoBjB,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB;IAYxB;;;;;;;;OAQG;IACH,OAAO,CAAC,SAAS;IAkBjB,sFAAsF;IACtF,OAAO,CAAC,aAAa;IAYrB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IAKxB,gFAAgF;IAChF,OAAO,CAAC,eAAe;CAGxB"}
@@ -0,0 +1,185 @@
1
+ import * as path from "path";
2
+ import { AgentStatus } from "../../adapters/AgentAdapter.js";
3
+ import { IncrementalJsonlSummary, reduceJsonlContent } from "../../utils/IncrementalJsonlSummary.js";
4
+ import { JsonlTailReader, normalizeTail } from "../../utils/jsonlTail.js";
5
+ import { safeReadFile, safeStat } from "../../utils/session.js";
6
+ import { flattenTextBlocks, isIdle } from "../shared.js";
7
+ export const CHAT_HISTORY_FILE = "chat_history.jsonl";
8
+ export class GrokSessionParser {
9
+ /** Incremental reader backing `getConversation({ tail })`. */ tailReader = new JsonlTailReader();
10
+ sessionCache;
11
+ constructor(options = {}){
12
+ this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {
13
+ bounds: options.summaryBounds
14
+ });
15
+ }
16
+ /**
17
+ * Parse a session directory into a {@link GrokSession} from its
18
+ * chat_history.jsonl transcript. Returns null when the transcript is
19
+ * missing — i.e. there is no real session to surface.
20
+ */ readSession(sessionDir, defaultCwd) {
21
+ const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);
22
+ const chatStat = safeStat(chatPath);
23
+ if (!chatStat) return null;
24
+ const content = safeReadFile(chatPath);
25
+ const state = content === undefined ? {} : reduceJsonlContent(this.summaryReducer, content);
26
+ return this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, state);
27
+ }
28
+ /**
29
+ * Same result as `readSession`, but backed by a per-instance incremental
30
+ * cache so repeated refreshes only parse bytes appended since the last call.
31
+ * Call `pruneSessionCache()` once per refresh to evict files no longer read.
32
+ *
33
+ * The first read of a large transcript is a bounded head + tail scan (see
34
+ * `summaryReducer.skip`); fields whose entries lie only in the skipped
35
+ * middle fall back to their defaults instead of forcing a full parse.
36
+ */ readSessionIncremental(sessionDir, defaultCwd) {
37
+ const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);
38
+ const result = this.sessionCache.read(chatPath);
39
+ if (result) {
40
+ return this.toSession(sessionDir, defaultCwd, chatPath, result.mtime, result.state);
41
+ }
42
+ // Present but unreadable: surface the session without a summary, like readSession.
43
+ const chatStat = safeStat(chatPath);
44
+ return chatStat ? this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, {}) : null;
45
+ }
46
+ /** Evict cached summaries for files not read since the previous prune. */ pruneSessionCache() {
47
+ this.sessionCache.prune();
48
+ }
49
+ /** Accepts a session dir or an explicit chat_history.jsonl path. */ getConversation(sessionPath, options) {
50
+ const chatPath = this.resolveChatPath(sessionPath);
51
+ const verbose = options?.verbose ?? false;
52
+ const tail = normalizeTail(options?.tail);
53
+ if (tail !== undefined) {
54
+ return this.tailReader.read(chatPath, tail, {
55
+ parseLine: (line)=>this.lineToMessage(line, verbose)
56
+ }, String(verbose));
57
+ }
58
+ return this.parseChatHistory(chatPath, verbose);
59
+ }
60
+ /**
61
+ * Determine agent status from parsed session state.
62
+ *
63
+ * - past the idle threshold → IDLE
64
+ * - last transcript turn is an assistant message → WAITING (awaiting user)
65
+ * - otherwise (last turn was a user message, or unknown) → RUNNING
66
+ */ determineStatus(session) {
67
+ if (isIdle(session.lastActive)) {
68
+ return AgentStatus.IDLE;
69
+ }
70
+ if (session.lastRole === "assistant") {
71
+ return AgentStatus.WAITING;
72
+ }
73
+ return AgentStatus.RUNNING;
74
+ }
75
+ /**
76
+ * Fold one chat_history.jsonl entry into the O(1) summary. Uses the same
77
+ * record rules as `getConversation` (see `toMessage`), minus system records.
78
+ *
79
+ * `skip` (bounded cold start) keeps the head's first user message and
80
+ * clears the last user message and last role, so those come from the tail
81
+ * only. A first user message beyond the head stays undefined rather than
82
+ * being filled from the tail; latest fields before the tail window stay
83
+ * undefined.
84
+ */ summaryReducer = {
85
+ initial: ()=>({}),
86
+ reduce: (state, value)=>{
87
+ const message = this.toMessage(value, false);
88
+ if (!message) return state;
89
+ if (message.role === "user") {
90
+ return {
91
+ ...state,
92
+ firstUserMessage: state.firstUserMessage ?? (state.pastHead ? undefined : message.content),
93
+ lastUserMessage: message.content,
94
+ lastRole: "user"
95
+ };
96
+ }
97
+ return {
98
+ ...state,
99
+ lastRole: message.role
100
+ };
101
+ },
102
+ skip: (state)=>({
103
+ pastHead: true,
104
+ firstUserMessage: state.firstUserMessage
105
+ })
106
+ };
107
+ toSession(sessionDir, defaultCwd, chatPath, lastActive, state) {
108
+ const dirStat = safeStat(sessionDir);
109
+ return {
110
+ sessionId: path.basename(sessionDir),
111
+ projectPath: defaultCwd,
112
+ sessionFilePath: chatPath,
113
+ sessionStart: dirStat?.birthtime || lastActive,
114
+ lastActive,
115
+ firstUserMessage: state.firstUserMessage,
116
+ lastUserMessage: state.lastUserMessage,
117
+ lastRole: state.lastRole
118
+ };
119
+ }
120
+ /** Full pass over chat_history.jsonl building every conversation turn. */ parseChatHistory(chatPath, verbose) {
121
+ const content = safeReadFile(chatPath);
122
+ if (content === undefined) return [];
123
+ const messages = [];
124
+ for (const line of content.trim().split("\n")){
125
+ const message = this.lineToMessage(line, verbose);
126
+ if (message) messages.push(message);
127
+ }
128
+ return messages;
129
+ }
130
+ /**
131
+ * Map one parsed chat record to a conversation turn, or null to skip it.
132
+ * Each record is a { type: 'system' | 'user' | 'assistant', content } object
133
+ * where content is either a string or an array of { type: 'text', text } blocks.
134
+ *
135
+ * Grok wraps the real user prompt in <user_query>...</user_query>; the other
136
+ * user records are context injections (<user_info>, <system-reminder>, ...)
137
+ * and are skipped so the summary is the actual prompt, not boilerplate.
138
+ */ toMessage(value, verbose) {
139
+ if (!value || typeof value !== "object") return null;
140
+ const record = value;
141
+ const text = flattenTextBlocks(record.content);
142
+ if (record.type === "user") {
143
+ const query = this.extractUserQuery(text);
144
+ return query === null ? null : {
145
+ role: "user",
146
+ content: query
147
+ };
148
+ }
149
+ if (record.type === "assistant") {
150
+ return text ? {
151
+ role: "assistant",
152
+ content: text
153
+ } : null;
154
+ }
155
+ if (verbose && record.type === "system") {
156
+ return text ? {
157
+ role: "system",
158
+ content: text
159
+ } : null;
160
+ }
161
+ return null;
162
+ }
163
+ /** Convert one chat_history.jsonl line into a message, or null when it is not one. */ lineToMessage(line, verbose) {
164
+ if (!line.trim()) return null;
165
+ let record;
166
+ try {
167
+ record = JSON.parse(line);
168
+ } catch {
169
+ return null;
170
+ }
171
+ return this.toMessage(record, verbose);
172
+ }
173
+ /**
174
+ * Extract the prompt inside <user_query>...</user_query>. Returns null when
175
+ * the record has no such tag (a context injection rather than a prompt).
176
+ */ extractUserQuery(text) {
177
+ const match = text.match(/<user_query>\s*([\s\S]*?)\s*<\/user_query>/);
178
+ return match ? match[1].trim() : null;
179
+ }
180
+ /** Resolve a session dir or an explicit chat_history.jsonl path to the file. */ resolveChatPath(sessionPath) {
181
+ return sessionPath.endsWith(".jsonl") ? sessionPath : path.join(sessionPath, CHAT_HISTORY_FILE);
182
+ }
183
+ }
184
+
185
+ //# sourceMappingURL=GrokSessionParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/grok/GrokSessionParser.ts"],"sourcesContent":["import * as path from \"path\";\nimport type { ConversationMessage, ConversationOptions } from \"../../adapters/AgentAdapter.js\";\nimport { AgentStatus } from \"../../adapters/AgentAdapter.js\";\nimport {\n IncrementalJsonlSummary,\n reduceJsonlContent,\n type JsonlSummaryBounds,\n type JsonlSummaryReducer,\n} from \"../../utils/IncrementalJsonlSummary.js\";\nimport { JsonlTailReader, normalizeTail } from \"../../utils/jsonlTail.js\";\nimport { safeReadFile, safeStat } from \"../../utils/session.js\";\nimport { flattenTextBlocks, isIdle } from \"../shared.js\";\n\nexport const CHAT_HISTORY_FILE = \"chat_history.jsonl\";\n\n/** One line of chat_history.jsonl. */\ninterface ChatRecord {\n type?: string;\n content?: unknown;\n}\n\n/**\n * O(1) running summary folded from chat records: only the first/last real\n * prompt and the role of the last user/assistant turn, never the turns.\n */\ninterface GrokSummaryState {\n /** A bounded cold start skipped the middle: later lines are not the session's first. */\n pastHead?: boolean;\n firstUserMessage?: string;\n lastUserMessage?: string;\n lastRole?: ConversationMessage[\"role\"];\n}\n\n/** Parsed state for a single ~/.grok/sessions/<cwd>/<id>/ directory. */\nexport interface GrokSession {\n sessionId: string;\n projectPath: string;\n sessionFilePath: string;\n sessionStart: Date;\n lastActive: Date;\n firstUserMessage?: string;\n lastUserMessage?: string;\n lastRole?: ConversationMessage[\"role\"];\n}\n\nexport interface GrokSessionParserOptions {\n /** Cold-start scan bounds for `readSessionIncremental` (see IncrementalJsonlSummary). */\n summaryBounds?: JsonlSummaryBounds | false;\n}\n\nexport class GrokSessionParser {\n /** Incremental reader backing `getConversation({ tail })`. */\n private readonly tailReader = new JsonlTailReader();\n\n private readonly sessionCache: IncrementalJsonlSummary<GrokSummaryState>;\n\n constructor(options: GrokSessionParserOptions = {}) {\n this.sessionCache = new IncrementalJsonlSummary(this.summaryReducer, {\n bounds: options.summaryBounds,\n });\n }\n\n /**\n * Parse a session directory into a {@link GrokSession} from its\n * chat_history.jsonl transcript. Returns null when the transcript is\n * missing — i.e. there is no real session to surface.\n */\n readSession(sessionDir: string, defaultCwd: string): GrokSession | null {\n const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);\n const chatStat = safeStat(chatPath);\n if (!chatStat) return null;\n\n const content = safeReadFile(chatPath);\n const state = content === undefined ? {} : reduceJsonlContent(this.summaryReducer, content);\n return this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, state);\n }\n\n /**\n * Same result as `readSession`, but backed by a per-instance incremental\n * cache so repeated refreshes only parse bytes appended since the last call.\n * Call `pruneSessionCache()` once per refresh to evict files no longer read.\n *\n * The first read of a large transcript is a bounded head + tail scan (see\n * `summaryReducer.skip`); fields whose entries lie only in the skipped\n * middle fall back to their defaults instead of forcing a full parse.\n */\n readSessionIncremental(sessionDir: string, defaultCwd: string): GrokSession | null {\n const chatPath = path.join(sessionDir, CHAT_HISTORY_FILE);\n const result = this.sessionCache.read(chatPath);\n if (result) {\n return this.toSession(sessionDir, defaultCwd, chatPath, result.mtime, result.state);\n }\n // Present but unreadable: surface the session without a summary, like readSession.\n const chatStat = safeStat(chatPath);\n return chatStat ? this.toSession(sessionDir, defaultCwd, chatPath, chatStat.mtime, {}) : null;\n }\n\n /** Evict cached summaries for files not read since the previous prune. */\n pruneSessionCache(): void {\n this.sessionCache.prune();\n }\n\n /** Accepts a session dir or an explicit chat_history.jsonl path. */\n getConversation(sessionPath: string, options?: ConversationOptions): ConversationMessage[] {\n const chatPath = this.resolveChatPath(sessionPath);\n const verbose = options?.verbose ?? false;\n const tail = normalizeTail(options?.tail);\n if (tail !== undefined) {\n return this.tailReader.read(\n chatPath,\n tail,\n { parseLine: (line) => this.lineToMessage(line, verbose) },\n String(verbose),\n );\n }\n return this.parseChatHistory(chatPath, verbose);\n }\n\n /**\n * Determine agent status from parsed session state.\n *\n * - past the idle threshold → IDLE\n * - last transcript turn is an assistant message → WAITING (awaiting user)\n * - otherwise (last turn was a user message, or unknown) → RUNNING\n */\n determineStatus(session: GrokSession): AgentStatus {\n if (isIdle(session.lastActive)) {\n return AgentStatus.IDLE;\n }\n if (session.lastRole === \"assistant\") {\n return AgentStatus.WAITING;\n }\n return AgentStatus.RUNNING;\n }\n\n /**\n * Fold one chat_history.jsonl entry into the O(1) summary. Uses the same\n * record rules as `getConversation` (see `toMessage`), minus system records.\n *\n * `skip` (bounded cold start) keeps the head's first user message and\n * clears the last user message and last role, so those come from the tail\n * only. A first user message beyond the head stays undefined rather than\n * being filled from the tail; latest fields before the tail window stay\n * undefined.\n */\n private readonly summaryReducer: JsonlSummaryReducer<GrokSummaryState> = {\n initial: () => ({}),\n reduce: (state, value) => {\n const message = this.toMessage(value, false);\n if (!message) return state;\n if (message.role === \"user\") {\n return {\n ...state,\n firstUserMessage:\n state.firstUserMessage ?? (state.pastHead ? undefined : message.content),\n lastUserMessage: message.content,\n lastRole: \"user\",\n };\n }\n return { ...state, lastRole: message.role };\n },\n skip: (state) => ({ pastHead: true, firstUserMessage: state.firstUserMessage }),\n };\n\n private toSession(\n sessionDir: string,\n defaultCwd: string,\n chatPath: string,\n lastActive: Date,\n state: GrokSummaryState,\n ): GrokSession {\n const dirStat = safeStat(sessionDir);\n return {\n sessionId: path.basename(sessionDir),\n projectPath: defaultCwd,\n sessionFilePath: chatPath,\n sessionStart: dirStat?.birthtime || lastActive,\n lastActive,\n firstUserMessage: state.firstUserMessage,\n lastUserMessage: state.lastUserMessage,\n lastRole: state.lastRole,\n };\n }\n\n /** Full pass over chat_history.jsonl building every conversation turn. */\n private parseChatHistory(chatPath: string, verbose: boolean): ConversationMessage[] {\n const content = safeReadFile(chatPath);\n if (content === undefined) return [];\n\n const messages: ConversationMessage[] = [];\n for (const line of content.trim().split(\"\\n\")) {\n const message = this.lineToMessage(line, verbose);\n if (message) messages.push(message);\n }\n return messages;\n }\n\n /**\n * Map one parsed chat record to a conversation turn, or null to skip it.\n * Each record is a { type: 'system' | 'user' | 'assistant', content } object\n * where content is either a string or an array of { type: 'text', text } blocks.\n *\n * Grok wraps the real user prompt in <user_query>...</user_query>; the other\n * user records are context injections (<user_info>, <system-reminder>, ...)\n * and are skipped so the summary is the actual prompt, not boilerplate.\n */\n private toMessage(value: unknown, verbose: boolean): ConversationMessage | null {\n if (!value || typeof value !== \"object\") return null;\n const record = value as ChatRecord;\n\n const text = flattenTextBlocks(record.content);\n if (record.type === \"user\") {\n const query = this.extractUserQuery(text);\n return query === null ? null : { role: \"user\", content: query };\n }\n if (record.type === \"assistant\") {\n return text ? { role: \"assistant\", content: text } : null;\n }\n if (verbose && record.type === \"system\") {\n return text ? { role: \"system\", content: text } : null;\n }\n return null;\n }\n\n /** Convert one chat_history.jsonl line into a message, or null when it is not one. */\n private lineToMessage(line: string, verbose: boolean): ConversationMessage | null {\n if (!line.trim()) return null;\n\n let record: unknown;\n try {\n record = JSON.parse(line);\n } catch {\n return null;\n }\n return this.toMessage(record, verbose);\n }\n\n /**\n * Extract the prompt inside <user_query>...</user_query>. Returns null when\n * the record has no such tag (a context injection rather than a prompt).\n */\n private extractUserQuery(text: string): string | null {\n const match = text.match(/<user_query>\\s*([\\s\\S]*?)\\s*<\\/user_query>/);\n return match ? match[1].trim() : null;\n }\n\n /** Resolve a session dir or an explicit chat_history.jsonl path to the file. */\n private resolveChatPath(sessionPath: string): string {\n return sessionPath.endsWith(\".jsonl\") ? sessionPath : path.join(sessionPath, CHAT_HISTORY_FILE);\n }\n}\n"],"names":["path","AgentStatus","IncrementalJsonlSummary","reduceJsonlContent","JsonlTailReader","normalizeTail","safeReadFile","safeStat","flattenTextBlocks","isIdle","CHAT_HISTORY_FILE","GrokSessionParser","tailReader","sessionCache","options","summaryReducer","bounds","summaryBounds","readSession","sessionDir","defaultCwd","chatPath","join","chatStat","content","state","undefined","toSession","mtime","readSessionIncremental","result","read","pruneSessionCache","prune","getConversation","sessionPath","resolveChatPath","verbose","tail","parseLine","line","lineToMessage","String","parseChatHistory","determineStatus","session","lastActive","IDLE","lastRole","WAITING","RUNNING","initial","reduce","value","message","toMessage","role","firstUserMessage","pastHead","lastUserMessage","skip","dirStat","sessionId","basename","projectPath","sessionFilePath","sessionStart","birthtime","messages","trim","split","push","record","text","type","query","extractUserQuery","JSON","parse","match","endsWith"],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { AgentAdapter } from "../adapters/AgentAdapter.js";
2
+ /**
3
+ * One instance of every built-in harness adapter, in registration order
4
+ * (which is also the order agents are listed in). Register a new harness here.
5
+ */
6
+ export declare function createBuiltinAdapters(): AgentAdapter[];
7
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/harnesses/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAWhE;;;GAGG;AACH,wBAAgB,qBAAqB,IAAI,YAAY,EAAE,CAYtD"}
@@ -0,0 +1,27 @@
1
+ import { AntigravityCliAdapter } from "./antigravity/AntigravityCliAdapter.js";
2
+ import { ClaudeCodeAdapter } from "./claude/ClaudeCodeAdapter.js";
3
+ import { CodexAdapter } from "./codex/CodexAdapter.js";
4
+ import { CopilotAdapter } from "./copilot/CopilotAdapter.js";
5
+ import { GeminiCliAdapter } from "./gemini/GeminiCliAdapter.js";
6
+ import { GrokCliAdapter } from "./grok/GrokCliAdapter.js";
7
+ import { KiroAdapter } from "./kiro/KiroAdapter.js";
8
+ import { OpenCodeAdapter } from "./opencode/OpenCodeAdapter.js";
9
+ import { PiAdapter } from "./pi/PiAdapter.js";
10
+ /**
11
+ * One instance of every built-in harness adapter, in registration order
12
+ * (which is also the order agents are listed in). Register a new harness here.
13
+ */ export function createBuiltinAdapters() {
14
+ return [
15
+ new ClaudeCodeAdapter(),
16
+ new CodexAdapter(),
17
+ new CopilotAdapter(),
18
+ new GeminiCliAdapter(),
19
+ new GrokCliAdapter(),
20
+ new KiroAdapter(),
21
+ new AntigravityCliAdapter(),
22
+ new OpenCodeAdapter(),
23
+ new PiAdapter()
24
+ ];
25
+ }
26
+
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/harnesses/index.ts"],"sourcesContent":["import type { AgentAdapter } from \"../adapters/AgentAdapter.js\";\nimport { AntigravityCliAdapter } from \"./antigravity/AntigravityCliAdapter.js\";\nimport { ClaudeCodeAdapter } from \"./claude/ClaudeCodeAdapter.js\";\nimport { CodexAdapter } from \"./codex/CodexAdapter.js\";\nimport { CopilotAdapter } from \"./copilot/CopilotAdapter.js\";\nimport { GeminiCliAdapter } from \"./gemini/GeminiCliAdapter.js\";\nimport { GrokCliAdapter } from \"./grok/GrokCliAdapter.js\";\nimport { KiroAdapter } from \"./kiro/KiroAdapter.js\";\nimport { OpenCodeAdapter } from \"./opencode/OpenCodeAdapter.js\";\nimport { PiAdapter } from \"./pi/PiAdapter.js\";\n\n/**\n * One instance of every built-in harness adapter, in registration order\n * (which is also the order agents are listed in). Register a new harness here.\n */\nexport function createBuiltinAdapters(): AgentAdapter[] {\n return [\n new ClaudeCodeAdapter(),\n new CodexAdapter(),\n new CopilotAdapter(),\n new GeminiCliAdapter(),\n new GrokCliAdapter(),\n new KiroAdapter(),\n new AntigravityCliAdapter(),\n new OpenCodeAdapter(),\n new PiAdapter(),\n ];\n}\n"],"names":["AntigravityCliAdapter","ClaudeCodeAdapter","CodexAdapter","CopilotAdapter","GeminiCliAdapter","GrokCliAdapter","KiroAdapter","OpenCodeAdapter","PiAdapter","createBuiltinAdapters"],"mappings":"AACA,SAASA,qBAAqB,QAAQ,yCAAyC;AAC/E,SAASC,iBAAiB,QAAQ,gCAAgC;AAClE,SAASC,YAAY,QAAQ,0BAA0B;AACvD,SAASC,cAAc,QAAQ,8BAA8B;AAC7D,SAASC,gBAAgB,QAAQ,+BAA+B;AAChE,SAASC,cAAc,QAAQ,2BAA2B;AAC1D,SAASC,WAAW,QAAQ,wBAAwB;AACpD,SAASC,eAAe,QAAQ,gCAAgC;AAChE,SAASC,SAAS,QAAQ,oBAAoB;AAE9C;;;CAGC,GACD,OAAO,SAASC;IACd,OAAO;QACL,IAAIR;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIC;QACJ,IAAIN;QACJ,IAAIO;QACJ,IAAIC;KACL;AACH"}
@@ -0,0 +1,31 @@
1
+ import type { AgentAdapter, AgentInfo, ProcessInfo, ConversationMessage, ConversationOptions, SessionSummary, ListSessionsOptions, AgentDetectionContext } from "../../adapters/AgentAdapter.js";
2
+ /**
3
+ * Kiro Adapter
4
+ *
5
+ * Detects running Kiro agents by matching the PID in each
6
+ * ~/.kiro/sessions/cli/<session-id>.lock to a running Kiro process (walking up
7
+ * from helper processes such as `kiro-cli-chat acp`), then reading the sibling
8
+ * <session-id>.json metadata and <session-id>.jsonl transcript.
9
+ */
10
+ export declare class KiroAdapter implements AgentAdapter {
11
+ readonly type: "kiro";
12
+ /**
13
+ * Also collects the helpers between a lock holder and its kiro-cli, such as
14
+ * the bundled `bun … tui.js`; `canHandle` still decides which are agents.
15
+ */
16
+ readonly processNames: readonly ["kiro-cli", "kiro", "kiro-cli-chat", "node", "bun"];
17
+ private parser;
18
+ private mapper;
19
+ private locator;
20
+ constructor();
21
+ canHandle(processInfo: ProcessInfo): boolean;
22
+ detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]>;
23
+ private detectRunningAgents;
24
+ getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[];
25
+ listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]>;
26
+ findSessionsById(sessionId: string): Promise<SessionSummary[]>;
27
+ private toSessionSummary;
28
+ /** `kiro-cli` / `kiro`, directly or as a script run by node or bun. */
29
+ private isKiroExecutable;
30
+ }
31
+ //# sourceMappingURL=KiroAdapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KiroAdapter.d.ts","sourceRoot":"","sources":["../../../src/harnesses/kiro/KiroAdapter.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,YAAY,EACZ,SAAS,EACT,WAAW,EACX,mBAAmB,EACnB,mBAAmB,EACnB,cAAc,EACd,mBAAmB,EACnB,qBAAqB,EACtB,MAAM,gCAAgC,CAAC;AAUxC;;;;;;;GAOG;AACH,qBAAa,WAAY,YAAW,YAAY;IAC9C,QAAQ,CAAC,IAAI,EAAG,MAAM,CAAU;IAChC;;;OAGG;IACH,QAAQ,CAAC,YAAY,gEAAiE;IAEtF,OAAO,CAAC,MAAM,CAAoB;IAClC,OAAO,CAAC,MAAM,CAAkB;IAChC,OAAO,CAAC,OAAO,CAAqB;;IAQpC,SAAS,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO;IAItC,YAAY,CAAC,OAAO,CAAC,EAAE,qBAAqB,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC;YAS3D,mBAAmB;IAwBjC,eAAe,CAAC,eAAe,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,mBAAmB,GAAG,mBAAmB,EAAE;IAIxF,YAAY,CAAC,IAAI,CAAC,EAAE,mBAAmB,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAYnE,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAOpE,OAAO,CAAC,gBAAgB;IAYxB,uEAAuE;IACvE,OAAO,CAAC,gBAAgB;CAgBzB"}
@@ -0,0 +1,125 @@
1
+ import * as path from "path";
2
+ import { executablePath } from "../../utils/process.js";
3
+ import { findHarnessProcesses } from "../shared.js";
4
+ import { KiroAgentMapper } from "./KiroAgentMapper.js";
5
+ import { KiroSessionLocator } from "./KiroSessionLocator.js";
6
+ import { KiroSessionParser } from "./KiroSessionParser.js";
7
+ const KIRO_BASENAMES = new Set([
8
+ "kiro-cli",
9
+ "kiro"
10
+ ]);
11
+ const SCRIPT_RUNTIMES = new Set([
12
+ "node",
13
+ "bun"
14
+ ]);
15
+ /**
16
+ * Kiro Adapter
17
+ *
18
+ * Detects running Kiro agents by matching the PID in each
19
+ * ~/.kiro/sessions/cli/<session-id>.lock to a running Kiro process (walking up
20
+ * from helper processes such as `kiro-cli-chat acp`), then reading the sibling
21
+ * <session-id>.json metadata and <session-id>.jsonl transcript.
22
+ */ export class KiroAdapter {
23
+ type = "kiro";
24
+ /**
25
+ * Also collects the helpers between a lock holder and its kiro-cli, such as
26
+ * the bundled `bun … tui.js`; `canHandle` still decides which are agents.
27
+ */ processNames = [
28
+ "kiro-cli",
29
+ "kiro",
30
+ "kiro-cli-chat",
31
+ "node",
32
+ "bun"
33
+ ];
34
+ parser;
35
+ mapper;
36
+ locator;
37
+ constructor(){
38
+ this.parser = new KiroSessionParser();
39
+ this.mapper = new KiroAgentMapper(this.parser);
40
+ this.locator = new KiroSessionLocator();
41
+ }
42
+ canHandle(processInfo) {
43
+ return this.isKiroExecutable(processInfo.command);
44
+ }
45
+ async detectAgents(context) {
46
+ try {
47
+ return await this.detectRunningAgents(context);
48
+ } finally{
49
+ // Drop cached summaries for sessions that were not part of this refresh
50
+ this.parser.pruneSessionCache();
51
+ }
52
+ }
53
+ async detectRunningAgents(context) {
54
+ const { relevant, processes } = await findHarnessProcesses(this, context);
55
+ if (processes.length === 0) return [];
56
+ const agents = [];
57
+ const matchedPids = new Set();
58
+ for (const match of this.locator.matchRunningProcesses(relevant, processes, (process)=>this.canHandle(process))){
59
+ const session = this.parser.readSessionIncremental(match.session, match.process.cwd);
60
+ if (!session) continue;
61
+ agents.push(this.mapper.mapSessionToAgent({
62
+ session,
63
+ processInfo: match.process
64
+ }));
65
+ matchedPids.add(match.process.pid);
66
+ }
67
+ for (const proc of processes){
68
+ if (!matchedPids.has(proc.pid)) {
69
+ agents.push(this.mapper.mapProcessOnlyAgent(proc));
70
+ }
71
+ }
72
+ return agents;
73
+ }
74
+ getConversation(sessionFilePath, options) {
75
+ return this.parser.getConversation(sessionFilePath, options);
76
+ }
77
+ async listSessions(opts) {
78
+ const summaries = [];
79
+ for (const paths of this.locator.listSessions()){
80
+ const session = this.parser.readSession(paths);
81
+ if (!session) continue;
82
+ if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;
83
+ summaries.push(this.toSessionSummary(session));
84
+ }
85
+ return summaries;
86
+ }
87
+ async findSessionsById(sessionId) {
88
+ const paths = this.locator.findSession(sessionId);
89
+ const session = paths ? this.parser.readSession(paths) : null;
90
+ // listSessions reports the metadata's id, so only an exact match counts.
91
+ return session?.sessionId === sessionId ? [
92
+ this.toSessionSummary(session)
93
+ ] : [];
94
+ }
95
+ toSessionSummary(session) {
96
+ return {
97
+ type: this.type,
98
+ sessionId: session.sessionId,
99
+ cwd: session.projectPath,
100
+ firstUserMessage: session.firstUserMessage,
101
+ lastActive: session.lastActive,
102
+ startedAt: session.sessionStart,
103
+ sessionFilePath: session.sessionFilePath
104
+ };
105
+ }
106
+ /** `kiro-cli` / `kiro`, directly or as a script run by node or bun. */ isKiroExecutable(command) {
107
+ const trimmed = command.trim();
108
+ const executable = executablePath(trimmed);
109
+ if (!executable) return false;
110
+ const executableName = kiroBasename(executable);
111
+ if (KIRO_BASENAMES.has(executableName)) return true;
112
+ if (!SCRIPT_RUNTIMES.has(executableName)) return false;
113
+ const args = trimmed.slice(executable.length).trim().split(/\s+/);
114
+ const scriptIndex = args.findIndex((token)=>token !== "" && !token.startsWith("-"));
115
+ if (scriptIndex === -1) return false;
116
+ // The script path may also contain spaces; resolve it like argv[0].
117
+ const script = executablePath(args.slice(scriptIndex).join(" "));
118
+ return KIRO_BASENAMES.has(kiroBasename(script));
119
+ }
120
+ }
121
+ function kiroBasename(executable) {
122
+ return path.basename(executable.replace(/\\/g, "/")).toLowerCase().replace(/\.(exe|js)$/, "");
123
+ }
124
+
125
+ //# sourceMappingURL=KiroAdapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/kiro/KiroAdapter.ts"],"sourcesContent":["import * as path from \"path\";\nimport type {\n AgentAdapter,\n AgentInfo,\n ProcessInfo,\n ConversationMessage,\n ConversationOptions,\n SessionSummary,\n ListSessionsOptions,\n AgentDetectionContext,\n} from \"../../adapters/AgentAdapter.js\";\nimport { executablePath } from \"../../utils/process.js\";\nimport { findHarnessProcesses } from \"../shared.js\";\nimport { KiroAgentMapper } from \"./KiroAgentMapper.js\";\nimport { KiroSessionLocator } from \"./KiroSessionLocator.js\";\nimport { KiroSessionParser, type KiroSession } from \"./KiroSessionParser.js\";\n\nconst KIRO_BASENAMES = new Set([\"kiro-cli\", \"kiro\"]);\nconst SCRIPT_RUNTIMES = new Set([\"node\", \"bun\"]);\n\n/**\n * Kiro Adapter\n *\n * Detects running Kiro agents by matching the PID in each\n * ~/.kiro/sessions/cli/<session-id>.lock to a running Kiro process (walking up\n * from helper processes such as `kiro-cli-chat acp`), then reading the sibling\n * <session-id>.json metadata and <session-id>.jsonl transcript.\n */\nexport class KiroAdapter implements AgentAdapter {\n readonly type = \"kiro\" as const;\n /**\n * Also collects the helpers between a lock holder and its kiro-cli, such as\n * the bundled `bun … tui.js`; `canHandle` still decides which are agents.\n */\n readonly processNames = [\"kiro-cli\", \"kiro\", \"kiro-cli-chat\", \"node\", \"bun\"] as const;\n\n private parser: KiroSessionParser;\n private mapper: KiroAgentMapper;\n private locator: KiroSessionLocator;\n\n constructor() {\n this.parser = new KiroSessionParser();\n this.mapper = new KiroAgentMapper(this.parser);\n this.locator = new KiroSessionLocator();\n }\n\n canHandle(processInfo: ProcessInfo): boolean {\n return this.isKiroExecutable(processInfo.command);\n }\n\n async detectAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n try {\n return await this.detectRunningAgents(context);\n } finally {\n // Drop cached summaries for sessions that were not part of this refresh\n this.parser.pruneSessionCache();\n }\n }\n\n private async detectRunningAgents(context?: AgentDetectionContext): Promise<AgentInfo[]> {\n const { relevant, processes } = await findHarnessProcesses(this, context);\n if (processes.length === 0) return [];\n\n const agents: AgentInfo[] = [];\n const matchedPids = new Set<number>();\n for (const match of this.locator.matchRunningProcesses(relevant, processes, (process) =>\n this.canHandle(process),\n )) {\n const session = this.parser.readSessionIncremental(match.session, match.process.cwd);\n if (!session) continue;\n\n agents.push(this.mapper.mapSessionToAgent({ session, processInfo: match.process }));\n matchedPids.add(match.process.pid);\n }\n\n for (const proc of processes) {\n if (!matchedPids.has(proc.pid)) {\n agents.push(this.mapper.mapProcessOnlyAgent(proc));\n }\n }\n return agents;\n }\n\n getConversation(sessionFilePath: string, options?: ConversationOptions): ConversationMessage[] {\n return this.parser.getConversation(sessionFilePath, options);\n }\n\n async listSessions(opts?: ListSessionsOptions): Promise<SessionSummary[]> {\n const summaries: SessionSummary[] = [];\n for (const paths of this.locator.listSessions()) {\n const session = this.parser.readSession(paths);\n if (!session) continue;\n if (opts?.cwd !== undefined && session.projectPath !== opts.cwd) continue;\n\n summaries.push(this.toSessionSummary(session));\n }\n return summaries;\n }\n\n async findSessionsById(sessionId: string): Promise<SessionSummary[]> {\n const paths = this.locator.findSession(sessionId);\n const session = paths ? this.parser.readSession(paths) : null;\n // listSessions reports the metadata's id, so only an exact match counts.\n return session?.sessionId === sessionId ? [this.toSessionSummary(session)] : [];\n }\n\n private toSessionSummary(session: KiroSession): SessionSummary {\n return {\n type: this.type,\n sessionId: session.sessionId,\n cwd: session.projectPath,\n firstUserMessage: session.firstUserMessage,\n lastActive: session.lastActive,\n startedAt: session.sessionStart,\n sessionFilePath: session.sessionFilePath,\n };\n }\n\n /** `kiro-cli` / `kiro`, directly or as a script run by node or bun. */\n private isKiroExecutable(command: string): boolean {\n const trimmed = command.trim();\n const executable = executablePath(trimmed);\n if (!executable) return false;\n\n const executableName = kiroBasename(executable);\n if (KIRO_BASENAMES.has(executableName)) return true;\n if (!SCRIPT_RUNTIMES.has(executableName)) return false;\n\n const args = trimmed.slice(executable.length).trim().split(/\\s+/);\n const scriptIndex = args.findIndex((token) => token !== \"\" && !token.startsWith(\"-\"));\n if (scriptIndex === -1) return false;\n // The script path may also contain spaces; resolve it like argv[0].\n const script = executablePath(args.slice(scriptIndex).join(\" \"));\n return KIRO_BASENAMES.has(kiroBasename(script));\n }\n}\n\nfunction kiroBasename(executable: string): string {\n return path\n .basename(executable.replace(/\\\\/g, \"/\"))\n .toLowerCase()\n .replace(/\\.(exe|js)$/, \"\");\n}\n"],"names":["path","executablePath","findHarnessProcesses","KiroAgentMapper","KiroSessionLocator","KiroSessionParser","KIRO_BASENAMES","Set","SCRIPT_RUNTIMES","KiroAdapter","type","processNames","parser","mapper","locator","canHandle","processInfo","isKiroExecutable","command","detectAgents","context","detectRunningAgents","pruneSessionCache","relevant","processes","length","agents","matchedPids","match","matchRunningProcesses","process","session","readSessionIncremental","cwd","push","mapSessionToAgent","add","pid","proc","has","mapProcessOnlyAgent","getConversation","sessionFilePath","options","listSessions","opts","summaries","paths","readSession","undefined","projectPath","toSessionSummary","findSessionsById","sessionId","findSession","firstUserMessage","lastActive","startedAt","sessionStart","trimmed","trim","executable","executableName","kiroBasename","args","slice","split","scriptIndex","findIndex","token","startsWith","script","join","basename","replace","toLowerCase"],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { AgentInfo, ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { KiroSessionParser, type KiroSession } from "./KiroSessionParser.js";
3
+ export interface KiroSessionAgentInput {
4
+ session: KiroSession;
5
+ processInfo: ProcessInfo;
6
+ }
7
+ export declare class KiroAgentMapper {
8
+ private readonly parser;
9
+ constructor(parser?: KiroSessionParser);
10
+ mapSessionToAgent({ session, processInfo }: KiroSessionAgentInput): AgentInfo;
11
+ mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo;
12
+ }
13
+ //# sourceMappingURL=KiroAgentMapper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"KiroAgentMapper.d.ts","sourceRoot":"","sources":["../../../src/harnesses/kiro/KiroAgentMapper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAC;AAG7E,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,MAAM,wBAAwB,CAAC;AAE7E,MAAM,WAAW,qBAAqB;IACpC,OAAO,EAAE,WAAW,CAAC;IACrB,WAAW,EAAE,WAAW,CAAC;CAC1B;AAED,qBAAa,eAAe;IACd,OAAO,CAAC,QAAQ,CAAC,MAAM;gBAAN,MAAM,GAAE,iBAA2C;IAEhF,iBAAiB,CAAC,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,qBAAqB,GAAG,SAAS;IAiB7E,mBAAmB,CAAC,WAAW,EAAE,WAAW,GAAG,SAAS;CAGzD"}
@@ -0,0 +1,29 @@
1
+ import { generateAgentName } from "../../utils/matching.js";
2
+ import { processOnlyAgent, SUMMARY_MAX_LENGTH, truncate } from "../shared.js";
3
+ import { KiroSessionParser } from "./KiroSessionParser.js";
4
+ export class KiroAgentMapper {
5
+ parser;
6
+ constructor(parser = new KiroSessionParser()){
7
+ this.parser = parser;
8
+ }
9
+ mapSessionToAgent({ session, processInfo }) {
10
+ return {
11
+ name: generateAgentName(session.projectPath, processInfo.pid),
12
+ type: "kiro",
13
+ status: this.parser.determineStatus(session),
14
+ summary: truncate(session.lastUserMessage || session.title || "Kiro session active", SUMMARY_MAX_LENGTH),
15
+ pid: processInfo.pid,
16
+ projectPath: session.projectPath,
17
+ sessionId: session.sessionId,
18
+ lastActive: session.lastActive,
19
+ sessionFilePath: session.sessionFilePath
20
+ };
21
+ }
22
+ mapProcessOnlyAgent(processInfo) {
23
+ return processOnlyAgent("kiro", processInfo, {
24
+ summary: "Kiro process running"
25
+ });
26
+ }
27
+ }
28
+
29
+ //# sourceMappingURL=KiroAgentMapper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/harnesses/kiro/KiroAgentMapper.ts"],"sourcesContent":["import type { AgentInfo, ProcessInfo } from \"../../adapters/AgentAdapter.js\";\nimport { generateAgentName } from \"../../utils/matching.js\";\nimport { processOnlyAgent, SUMMARY_MAX_LENGTH, truncate } from \"../shared.js\";\nimport { KiroSessionParser, type KiroSession } from \"./KiroSessionParser.js\";\n\nexport interface KiroSessionAgentInput {\n session: KiroSession;\n processInfo: ProcessInfo;\n}\n\nexport class KiroAgentMapper {\n constructor(private readonly parser: KiroSessionParser = new KiroSessionParser()) {}\n\n mapSessionToAgent({ session, processInfo }: KiroSessionAgentInput): AgentInfo {\n return {\n name: generateAgentName(session.projectPath, processInfo.pid),\n type: \"kiro\",\n status: this.parser.determineStatus(session),\n summary: truncate(\n session.lastUserMessage || session.title || \"Kiro session active\",\n SUMMARY_MAX_LENGTH,\n ),\n pid: processInfo.pid,\n projectPath: session.projectPath,\n sessionId: session.sessionId,\n lastActive: session.lastActive,\n sessionFilePath: session.sessionFilePath,\n };\n }\n\n mapProcessOnlyAgent(processInfo: ProcessInfo): AgentInfo {\n return processOnlyAgent(\"kiro\", processInfo, { summary: \"Kiro process running\" });\n }\n}\n"],"names":["generateAgentName","processOnlyAgent","SUMMARY_MAX_LENGTH","truncate","KiroSessionParser","KiroAgentMapper","parser","mapSessionToAgent","session","processInfo","name","projectPath","pid","type","status","determineStatus","summary","lastUserMessage","title","sessionId","lastActive","sessionFilePath","mapProcessOnlyAgent"],"mappings":"AACA,SAASA,iBAAiB,QAAQ,0BAA0B;AAC5D,SAASC,gBAAgB,EAAEC,kBAAkB,EAAEC,QAAQ,QAAQ,eAAe;AAC9E,SAASC,iBAAiB,QAA0B,yBAAyB;AAO7E,OAAO,MAAMC;;IACX,YAAY,AAAiBC,SAA4B,IAAIF,mBAAmB,CAAE;aAArDE,SAAAA;IAAsD;IAEnFC,kBAAkB,EAAEC,OAAO,EAAEC,WAAW,EAAyB,EAAa;QAC5E,OAAO;YACLC,MAAMV,kBAAkBQ,QAAQG,WAAW,EAAEF,YAAYG,GAAG;YAC5DC,MAAM;YACNC,QAAQ,IAAI,CAACR,MAAM,CAACS,eAAe,CAACP;YACpCQ,SAASb,SACPK,QAAQS,eAAe,IAAIT,QAAQU,KAAK,IAAI,uBAC5ChB;YAEFU,KAAKH,YAAYG,GAAG;YACpBD,aAAaH,QAAQG,WAAW;YAChCQ,WAAWX,QAAQW,SAAS;YAC5BC,YAAYZ,QAAQY,UAAU;YAC9BC,iBAAiBb,QAAQa,eAAe;QAC1C;IACF;IAEAC,oBAAoBb,WAAwB,EAAa;QACvD,OAAOR,iBAAiB,QAAQQ,aAAa;YAAEO,SAAS;QAAuB;IACjF;AACF"}
@@ -0,0 +1,38 @@
1
+ import type { ProcessInfo } from "../../adapters/AgentAdapter.js";
2
+ import { type KiroSessionPaths } from "./KiroSessionParser.js";
3
+ /** A live Kiro process and the session whose lock it holds. */
4
+ export interface KiroProcessMatch {
5
+ process: ProcessInfo;
6
+ session: KiroSessionPaths;
7
+ }
8
+ export interface KiroSessionLocatorOptions {
9
+ /** Overrides ~/.kiro/sessions/cli. */
10
+ sessionsDir?: string;
11
+ }
12
+ export declare class KiroSessionLocator {
13
+ private readonly sessionsDir;
14
+ constructor(options?: KiroSessionLocatorOptions);
15
+ /**
16
+ * Pair `<session-id>.lock` files with running Kiro processes.
17
+ *
18
+ * @param snapshot every process collected for Kiro's process names, used to
19
+ * walk up from the lock's PID (often a `kiro-cli-chat acp` helper)
20
+ * @param kiroProcesses the top-level Kiro processes that become agents
21
+ * @param isKiro whether a process is a top-level Kiro process
22
+ */
23
+ matchRunningProcesses(snapshot: readonly ProcessInfo[], kiroProcesses: readonly ProcessInfo[], isKiro: (process: ProcessInfo) => boolean): KiroProcessMatch[];
24
+ /** Every session with a transcript under the sessions dir. */
25
+ listSessions(): KiroSessionPaths[];
26
+ /** The session stored as `<sessionId>.jsonl`, if it exists. */
27
+ findSession(sessionId: string): KiroSessionPaths | null;
28
+ private sessionPaths;
29
+ private discoverActiveLocks;
30
+ /** The outermost Kiro process on the lock PID's parent chain, if collected. */
31
+ private findKiroAncestor;
32
+ /**
33
+ * Fallback when the chain is broken (an uncollected intermediate process):
34
+ * attach to the only Kiro process on the lock holder's terminal.
35
+ */
36
+ private matchSoleProcessOnTty;
37
+ }
38
+ //# sourceMappingURL=KiroSessionLocator.d.ts.map